eidos-ui 3.7.0 → 3.8.1
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 +10 -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-COQfx2Ru.d.ts → Chip.types-BM-UZOCv.d.ts} +10 -1
- package/dist/{Chip.types-B6y3Wifa.d.cts → Chip.types-_1bhyKz4.d.cts} +10 -1
- 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 +3 -3
- package/dist/chip/index.d.ts +3 -3
- 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-L7I5NEGI.js → chunk-2IXCEKLI.js} +2 -2
- 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-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-HEXAY6DE.cjs → chunk-GZDT2AHJ.cjs} +24 -24
- package/dist/chunk-GZDT2AHJ.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-LGDODZHI.js → chunk-IC2PIK3E.js} +19 -19
- package/dist/chunk-IC2PIK3E.js.map +1 -0
- 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-PCTHJZRO.cjs → chunk-LWCFT5SP.cjs} +3 -3
- package/dist/{chunk-PCTHJZRO.cjs.map → chunk-LWCFT5SP.cjs.map} +1 -1
- 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-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 +56 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +48 -14
- package/dist/index.d.cts +14 -13
- package/dist/index.d.ts +14 -13
- package/dist/index.js +60 -47
- 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 +8 -5
- package/dist/split-chip/index.cjs.map +1 -1
- package/dist/split-chip/index.d.cts +2 -2
- package/dist/split-chip/index.d.ts +2 -2
- package/dist/split-chip/index.js +7 -4
- 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-HEXAY6DE.cjs.map +0 -1
- package/dist/chunk-LGDODZHI.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-L7I5NEGI.js.map → chunk-2IXCEKLI.js.map} +0 -0
- /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-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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-RJVHR45I.cjs","../src/components/ThemeProvider/ThemeProvider.component.tsx","../src/components/ThemeProvider/ThemeProvider.context.tsx","../src/components/ThemeProvider/ThemeProvider.color.ts","../src/components/ThemeProvider/ThemeProvider.tokens.ts","../src/components/ThemeProvider/ThemeProvider.fonts.ts"],"names":["value"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-RJVHR45I.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { devWarn } from '../../utils';\nimport { ThemeContext } from './ThemeProvider.context';\nimport { buildTokens, diffFromDefault, resolveTheme, themeToCss } from './ThemeProvider.tokens';\nimport type { ThemeConfig, ThemeContextValue, ThemeProviderProps } from './ThemeProvider.types';\n\nconst EMPTY_THEME: ThemeConfig = {};\n\n/**\n * Number of providers currently mounted.\n *\n * Because tokens are written to `document.documentElement` (see the component\n * comment for why), providers do not compose: two of them target the same\n * element, so whichever applied a given token last wins for the entire page -\n * including for the subtree of the other one. That looks like a broken theme\n * rather than a misuse, so it is worth saying out loud.\n */\nlet mountedProviders = 0;\n\n/** Merges `patch` over `base` one level into `colors`/`typography`. */\nconst mergeTheme = (base: ThemeConfig, patch: ThemeConfig): ThemeConfig => ({\n colors: { ...base.colors, ...patch.colors },\n typography: { ...base.typography, ...patch.typography },\n});\n\n/**\n * Applies a theme by writing CSS custom properties to `document.documentElement`.\n *\n * Two deliberate choices worth knowing:\n *\n * **The target is `documentElement`, not a wrapper element.** Every overlay in\n * this library (`Dropdown`, `Modal`, `Drawer`, `Snackbar`, `Tooltip`, …) portals\n * to `document.body`, so tokens scoped to a wrapper `<div>` would leave every\n * popup rendering the preset instead.\n *\n * **Properties are set through the CSSOM** (`style.setProperty`), which no CSP\n * directive gates - `style-src` and `style-src-attr` only cover the `style`\n * HTML attribute and stylesheet loads. Nothing here needs a nonce, and no\n * `<style>` element is ever created. See `ContentSecurityPolicy.mdx`.\n *\n * Under SSR the server sends the preset from `dist/index.css` and the theme is\n * applied on hydration; use `toCss()` if you need a themed first paint.\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n theme: controlledTheme,\n defaultTheme: initialTheme,\n onThemeChange,\n}) => {\n const isControlled = controlledTheme !== undefined;\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeConfig>(\n initialTheme ?? EMPTY_THEME,\n );\n const theme = isControlled ? controlledTheme : uncontrolledTheme;\n\n useEffect(() => {\n mountedProviders += 1;\n if (mountedProviders > 1) {\n devWarn(\n 'theme-multiple-providers',\n `ThemeProvider: ${mountedProviders} providers are mounted at once. They all write to document.documentElement, so the last one to apply each token wins for the whole page - nested or sibling providers cannot theme separate subtrees. Use a single provider at your app root.`,\n );\n }\n return () => {\n mountedProviders -= 1;\n };\n }, []);\n\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme]);\n const tokens = useMemo(() => diffFromDefault(buildTokens(resolvedTheme)), [resolvedTheme]);\n\n // Names written on the previous pass, so properties dropped from the theme\n // are removed rather than left behind at their last value.\n const appliedRef = useRef<string[]>([]);\n\n useLayoutEffect(() => {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n\n for (const name of appliedRef.current) {\n if (!(name in tokens)) root.style.removeProperty(name);\n }\n for (const [name, value] of Object.entries(tokens)) {\n root.style.setProperty(name, value);\n }\n appliedRef.current = Object.keys(tokens);\n\n return () => {\n for (const name of appliedRef.current) {\n root.style.removeProperty(name);\n }\n appliedRef.current = [];\n };\n }, [tokens]);\n\n const commit = useCallback(\n (next: ThemeConfig) => {\n if (!isControlled) setUncontrolledTheme(next);\n onThemeChange?.(next);\n },\n [isControlled, onThemeChange],\n );\n\n const setTheme = useCallback((next: ThemeConfig) => commit(next), [commit]);\n\n const updateTheme = useCallback(\n (patch: ThemeConfig) => commit(mergeTheme(theme, patch)),\n [commit, theme],\n );\n\n const resetTheme = useCallback(() => commit(EMPTY_THEME), [commit]);\n\n const toCss = useCallback(() => themeToCss(resolvedTheme), [resolvedTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n resolvedTheme,\n setTheme,\n updateTheme,\n resetTheme,\n isDefault: Object.keys(tokens).length === 0,\n toCss,\n }),\n [theme, resolvedTheme, setTheme, updateTheme, resetTheme, tokens, toCss],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n};\n\nThemeProvider.displayName = 'ThemeProvider';\n","import { createContext, useContext } from 'react';\nimport type { ThemeContextValue } from './ThemeProvider.types';\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n/**\n * Reads the active theme. Throws outside a `ThemeProvider`, matching\n * `useSnackbarContext` - a silent fallback would make a missing provider look\n * like a theme that simply is not applying.\n */\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n","/**\n * Colour maths for the theme system.\n *\n * All conversions are done in JS and emitted as `#rrggbb`, so browser support\n * for `oklch()` is irrelevant here - nothing in the generated CSS uses a modern\n * colour function.\n *\n * OKLab is used rather than HSL for every interpolation. HSL lightness\n * interpolation is ~40 lines shorter but produces muddy, desaturated ramps for\n * exactly the saturated brand hues this feature exists to support, because its\n * \"lightness\" is not perceptual.\n */\n\n// ============================================================================\n// sRGB <-> OKLab\n// ============================================================================\n\nexport interface Oklch {\n /** Perceptual lightness, 0-1. */\n l: number;\n /** Chroma (colourfulness), 0 to ~0.4 in sRGB. */\n c: number;\n /** Hue angle in radians. */\n h: number;\n}\n\nconst srgbToLinear = (v: number): number =>\n v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n\nconst linearToSrgb = (v: number): number =>\n v <= 0.0031308 ? 12.92 * v : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;\n\nconst clamp01 = (v: number): number => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Parses `#rgb` / `#rrggbb` into 0-1 sRGB channels. Returns null if unparseable. */\nexport const parseHex = (hex: string): [number, number, number] | null => {\n if (typeof hex !== 'string') return null;\n const raw = hex.trim().replace(/^#/, '');\n const full =\n raw.length === 3\n ? raw\n .split('')\n .map((c) => c + c)\n .join('')\n : raw;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) return null;\n const n = parseInt(full, 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n};\n\nexport const isValidHex = (hex: string): boolean => parseHex(hex) !== null;\n\nconst toHex = ([r, g, b]: [number, number, number]): string =>\n '#' +\n [r, g, b]\n .map((v) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('');\n\n/** `#rrggbb` -> the comma-separated triple the `--x-rgb` tokens use. */\nexport const hexToRgbTriple = (hex: string): string => {\n const rgb = parseHex(hex);\n if (!rgb) return '0, 0, 0';\n return rgb.map((v) => Math.round(v * 255)).join(', ');\n};\n\nconst linearToOklab = ([r, g, b]: [number, number, number]): [number, number, number] => {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n};\n\nconst oklabToLinear = ([L, A, B]: [number, number, number]): [number, number, number] => {\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n};\n\nexport const hexToOklch = (hex: string): Oklch => {\n const rgb = parseHex(hex) ?? [0, 0, 0];\n const [l, a, b] = linearToOklab(rgb.map(srgbToLinear) as [number, number, number]);\n return { l, c: Math.hypot(a, b), h: Math.atan2(b, a) };\n};\n\nconst inGamut = ([r, g, b]: [number, number, number]): boolean =>\n [r, g, b].every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/**\n * Largest chroma that still fits in sRGB at this lightness and hue.\n *\n * Needed because OKLab is a much larger space than sRGB: naively keeping a\n * colour's chroma while changing its lightness frequently lands outside the\n * gamut, where channels clip and the hue visibly shifts.\n */\nconst maxChroma = (l: number, h: number): number => {\n let lo = 0;\n let hi = 0.45;\n for (let i = 0; i < 24; i++) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklabToLinear([l, mid * Math.cos(h), mid * Math.sin(h)]))) lo = mid;\n else hi = mid;\n }\n return lo;\n};\n\nexport const oklchToHex = ({ l, c, h }: Oklch): string => {\n const lc = clamp01(l);\n const cc = Math.min(Math.max(c, 0), maxChroma(lc, h));\n return toHex(\n oklabToLinear([lc, cc * Math.cos(h), cc * Math.sin(h)]).map(linearToSrgb) as [\n number,\n number,\n number,\n ],\n );\n};\n\n// ============================================================================\n// WCAG 2.1 contrast\n// ============================================================================\n\n/**\n * WCAG 2.1 is used rather than APCA. APCA models perception better but is\n * still a draft (targeted at WCAG 3), while WCAG 2 is what consumers are\n * actually audited against. Its known weakness - mis-ranking some mid-tone\n * blues and greens - is accepted for that reason.\n */\nexport const relativeLuminance = (hex: string): number => {\n const [r, g, b] = (parseHex(hex) ?? [0, 0, 0]).map(srgbToLinear);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** Contrast ratio between two colours, 1 (identical) to 21 (black on white). */\nexport const contrastRatio = (a: string, b: string): number => {\n const [x, y] = [relativeLuminance(a), relativeLuminance(b)];\n return (Math.max(x, y) + 0.05) / (Math.min(x, y) + 0.05);\n};\n\n/** The two foreground candidates, matching `--white` and `--gray-900`. */\nexport const CONTRAST_LIGHT = '#ffffff';\nexport const CONTRAST_DARK = '#0f172a';\n\n/**\n * Foreground to place on `fill`.\n *\n * White wins unless it drops below 3:1, at which point the better of the two\n * candidates is used. The threshold is deliberately 3:1 rather than \"whichever\n * scores higher\": on mid-tone reds the dark candidate often scores marginally\n * better while looking plainly wrong, and every preset base clears 4.5:1\n * against white anyway.\n */\nexport const pickContrast = (fill: string): string => {\n const onLight = contrastRatio(fill, CONTRAST_LIGHT);\n if (onLight >= 3) return CONTRAST_LIGHT;\n return onLight >= contrastRatio(fill, CONTRAST_DARK) ? CONTRAST_LIGHT : CONTRAST_DARK;\n};\n\n// ============================================================================\n// Ramp generation\n// ============================================================================\n\n/** The ramp steps, in the order `--x-50` … `--x-900` are declared. */\nexport const RAMP_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\n\nexport type RampStep = (typeof RAMP_STEPS)[number];\n\n/** The step the supplied base colour occupies; the ramp is built around it. */\nconst BASE_STEP = 500;\n\n/**\n * Target lightness per step, and how much of the base's chroma to keep.\n *\n * Measured from the preset indigo ramp, so feeding the preset primary through\n * `buildRamp` lands close to the shipped `--primary-*` values rather than\n * something arbitrary. It is deliberately not an exact reproduction - see the\n * note on `buildRamp`.\n */\nconst RAMP_CURVE: Record<RampStep, { l: number; chroma: number }> = {\n 50: { l: 0.962, chroma: 0.09 },\n 100: { l: 0.93, chroma: 0.16 },\n 200: { l: 0.87, chroma: 0.3 },\n 300: { l: 0.785, chroma: 0.51 },\n 400: { l: 0.68, chroma: 0.77 },\n 500: { l: 0.558, chroma: 1.0 },\n 600: { l: 0.511, chroma: 1.12 },\n 700: { l: 0.457, chroma: 1.05 },\n 800: { l: 0.398, chroma: 0.87 },\n 900: { l: 0.359, chroma: 0.66 },\n};\n\n/** Ceiling/floor the generated ends aim for, leaving the base itself untouched. */\nconst LIGHT_CEILING = 0.985;\nconst DARK_FLOOR = 0.22;\n\n/** Minimum lightness gap between adjacent steps, so none can collapse together. */\nconst MIN_STEP_DELTA = 0.012;\n\n/**\n * Generates a 50-900 ramp around `base`, which is placed at the 500 step.\n *\n * The base's own hue is always preserved, and `--x-500` is returned as the base\n * hex verbatim, so the colour a consumer picked is never silently replaced.\n *\n * The curve above is *rescaled* to whatever lightness headroom the base leaves,\n * rather than being applied absolutely or simply shifted:\n *\n * - Applying it absolutely would reassign the base - pick a pale yellow and\n * `--x-500` would come back a mid-olive, contradicting `--x-color`.\n * - Shifting it so 500 sits at the base's lightness pushes the light end past\n * `l = 1`, where it clips and 50/100/200/300 all come out pure white.\n *\n * The ends are **absolute**, not relative to the base: step 50 lands near-white\n * and step 900 near-dark whatever lightness the base has, with the remaining\n * steps interpolated between the base and those anchors. Only a base that is\n * already past an anchor compresses that side into what headroom is left.\n *\n * Getting this wrong is subtle. An earlier version offset every step *from the\n * base* by the curve's own distances, capped so the preset reproduced exactly.\n * That looks right - and reproduces the preset ramp perfectly - but it makes the\n * tints relative: a dark navy base (`#1a1a2e`) returned `--primary-50: #8a8a8c`,\n * a mid grey rather than a tint, because 50 sits only 0.404 lightness above 500\n * on the curve. Every consumer of the tint end broke visibly - `Navigation`'s\n * active item paints `--primary-50` and turned into a charcoal pill.\n *\n * Two inputs are genuinely degenerate and are handled rather than solved: a\n * base at or above `LIGHT_CEILING` has no room for tints, and one with zero\n * chroma (pure white, black, any gray) has no saturation to separate them with\n * either. For those the light end converges, and `isRampViable` reports it so\n * the caller can warn. Realistic light picks are fine - `#fde047` still yields\n * five distinct tints.\n */\nexport const buildRamp = (base: string): Record<RampStep, string> => {\n const { l: baseL, c: baseC, h } = hexToOklch(base);\n const anchor = RAMP_CURVE[BASE_STEP].l;\n\n // Where the ends of the scale sit, independent of the base. A base already\n // lighter than the curve's own 50 (or darker than its 900) has nowhere left\n // to go, so that side compresses into the remaining headroom instead.\n const curveLight = RAMP_CURVE[50].l;\n const curveDark = RAMP_CURVE[900].l;\n const lightTarget = baseL >= curveLight ? Math.min(LIGHT_CEILING, baseL + 0.02) : curveLight;\n const darkTarget = baseL <= curveDark ? Math.max(DARK_FLOOR * 0.2, baseL - 0.02) : curveDark;\n\n const lightSpan = curveLight - anchor;\n const darkSpan = anchor - curveDark;\n\n const out = {} as Record<RampStep, string>;\n for (const step of RAMP_STEPS) {\n if (step === BASE_STEP) {\n out[step] = base;\n continue;\n }\n const { l: curveL, chroma } = RAMP_CURVE[step];\n const offset = curveL - anchor;\n // How far along its half of the curve this step sits: 0 at the base, 1 at\n // the end. Interpolating that fraction between the base and the target\n // keeps the curve's shape while pinning where it ends up.\n const t = offset > 0 ? offset / lightSpan : -offset / darkSpan;\n const l = offset > 0 ? baseL + t * (lightTarget - baseL) : baseL - t * (baseL - darkTarget);\n out[step] = oklchToHex({ l, c: baseC * chroma, h });\n }\n\n return enforceSeparation(out, h, baseC);\n};\n\n/**\n * Walks outward from the base step, pushing any step that ended up too close to\n * its neighbour further away. Only bites for extreme inputs (near-white,\n * near-black, zero-chroma), where the rescale above has almost no room left.\n */\nconst enforceSeparation = (\n ramp: Record<RampStep, string>,\n h: number,\n baseC: number,\n): Record<RampStep, string> => {\n const baseIndex = RAMP_STEPS.indexOf(BASE_STEP);\n const lightness = RAMP_STEPS.map((s) => hexToOklch(ramp[s]).l);\n\n // Lighter steps: walk from the base toward 50, each must be lighter.\n for (let i = baseIndex - 1; i >= 0; i--) {\n const limit = lightness[i + 1] + MIN_STEP_DELTA;\n if (lightness[i] < limit) lightness[i] = Math.min(1, limit);\n }\n // Darker steps: walk from the base toward 900, each must be darker.\n for (let i = baseIndex + 1; i < RAMP_STEPS.length; i++) {\n const limit = lightness[i - 1] - MIN_STEP_DELTA;\n if (lightness[i] > limit) lightness[i] = Math.max(0, limit);\n }\n\n const out = {} as Record<RampStep, string>;\n RAMP_STEPS.forEach((step, i) => {\n if (step === BASE_STEP) {\n out[step] = ramp[step];\n return;\n }\n out[step] = oklchToHex({\n l: lightness[i],\n c: baseC * RAMP_CURVE[step].chroma,\n h,\n });\n });\n return out;\n};\n\n/** How far `--x-dark` / `--x-light` sit from the base, in OKLab lightness. */\nconst DARK_DELTA = 0.086;\nconst LIGHT_DELTA = 0.169;\n\n/** Below this lightness there is no room left to darken, so the hover lightens. */\nconst HOVER_INVERT_BELOW = DARK_DELTA * 1.5;\n\n/**\n * The hover/active colour. Must differ *visibly* from the base and stay legible\n * as text on white, since `--x-dark` is used both as a fill (Button, Chip\n * hovers) and as text (Snackbar, link hover in `global.scss`).\n *\n * A fixed ramp step is not good enough: for a near-white base the 600 step\n * lands barely darker than the base and the hover reads as no change at all.\n * Hence a guaranteed delta.\n *\n * For a base that is already near-black the delta is applied *upwards* instead.\n * Clamping to a floor would return a colour lighter than the base while still\n * being named \"dark\", and returning the base unchanged would leave the control\n * with no hover affordance at all; lightening is what dark-surface design\n * systems do anyway.\n */\nexport const deriveDark = (base: string): string => {\n const { l, c, h } = hexToOklch(base);\n const target = l < HOVER_INVERT_BELOW ? l + DARK_DELTA : l - DARK_DELTA;\n return oklchToHex({ l: target, c, h });\n};\n\n/**\n * The light companion. Lightening has a hard ceiling, so for an already-pale\n * base this lands very close to it - acceptable, as `--x-light` is a public\n * token that nothing inside the library currently consumes.\n */\nexport const deriveLight = (base: string): string => {\n const { l, c, h } = hexToOklch(base);\n return oklchToHex({ l: Math.min(LIGHT_CEILING, l + LIGHT_DELTA), c, h });\n};\n\n/**\n * Whether `base` leaves enough lightness headroom to generate a usable 50-900\n * ramp. False only for near-white and near-black, where the tint or shade end\n * necessarily converges - the caller surfaces that as a developer warning\n * rather than silently shipping identical tokens.\n *\n * Deliberately does not test chroma: an unsaturated gray separates perfectly\n * well by lightness alone, and a saturated light colour like `#fde047` still\n * produces five distinct tints. Only the extremes genuinely fail.\n */\nexport const isRampViable = (base: string): boolean => {\n const { l } = hexToOklch(base);\n return l < 0.95 && l > 0.12;\n};\n","import { devWarn } from '../../utils';\nimport {\n RAMP_STEPS,\n buildRamp,\n deriveDark,\n deriveLight,\n hexToRgbTriple,\n isValidHex,\n isRampViable,\n pickContrast,\n} from './ThemeProvider.color';\nimport type {\n ResolvedTheme,\n ThemeColorKey,\n ThemeColorValue,\n ThemeConfig,\n} from './ThemeProvider.types';\n\nexport const THEME_COLOR_KEYS: readonly ThemeColorKey[] = [\n 'primary',\n 'secondary',\n 'success',\n 'danger',\n 'warning',\n 'info',\n 'hyperlink',\n] as const;\n\n/**\n * `hyperlink` is link text on a surface, never a fill, so it has no\n * `--hyperlink-contrast` token - nothing in the library would read it.\n */\nconst FILL_COLOR_KEYS: readonly ThemeColorKey[] = [\n 'primary',\n 'secondary',\n 'success',\n 'danger',\n 'warning',\n 'info',\n] as const;\n\n/** Only `primary` has a 50-900 ramp in `variables.scss`. */\nconst RAMP_COLOR_KEY: ThemeColorKey = 'primary';\n\n/** The eight preset `--font-size-*` values, in declaration order. */\nconst FONT_SIZE_STEPS: readonly [string, number][] = [\n ['xs', 0.75],\n ['sm', 0.875],\n ['base', 1],\n ['md', 1.1],\n ['lg', 1.125],\n ['xl', 1.25],\n ['2xl', 1.5],\n ['3xl', 1.875],\n] as const;\n\n/**\n * The shipped values from `src/styles/variables.scss`.\n *\n * This is a literal copy, not something derived: the ramp is hand-tuned and no\n * generator reproduces it byte for byte. Keeping it literal means a theme equal\n * to the preset writes no CSS properties at all, so default rendering is\n * identical to `dist/index.css`.\n *\n * Must be kept in sync with `variables.scss` by hand. The bases are all chosen\n * to clear WCAG AA against white text; see the comment at the top of that file.\n */\nexport const defaultTheme: Required<ThemeConfig> = {\n colors: {\n primary: '#5c5de8',\n secondary: '#617087',\n success: '#007f57',\n danger: '#d6272f',\n warning: '#9c6300',\n info: '#007a90',\n hyperlink: '#007b84',\n },\n typography: {\n fontFamily:\n \"'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n monoFamily:\n \"'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Source Code Pro', monospace\",\n fontScale: 1,\n },\n};\n\n/** The preset `--primary-*` ramp, needed so an unthemed primary emits nothing. */\nconst DEFAULT_PRIMARY_RAMP: Record<number, string> = {\n 50: '#eef2ff',\n 100: '#e0e7ff',\n 200: '#c7d2fe',\n 300: '#a5b4fc',\n 400: '#818cf8',\n 500: '#5c5de8',\n 600: '#4f46e5',\n 700: '#4338ca',\n 800: '#3730a3',\n 900: '#312e81',\n};\n\nexport const FONT_SCALE_MIN = 0.875;\nexport const FONT_SCALE_MAX = 1.25;\n\nconst normalizeColor = (value: ThemeColorValue): { base: string; contrast?: string } =>\n typeof value === 'string' ? { base: value } : value;\n\n/** Fills every absent field from the preset. */\nexport const resolveTheme = (theme: ThemeConfig): ResolvedTheme => {\n const colors = {} as ResolvedTheme['colors'];\n\n for (const key of THEME_COLOR_KEYS) {\n const supplied = theme.colors?.[key];\n const fallback = normalizeColor(defaultTheme.colors[key]!);\n if (supplied === undefined) {\n colors[key] = fallback;\n continue;\n }\n const { base, contrast } = normalizeColor(supplied);\n if (!isValidHex(base)) {\n devWarn(\n `theme-color-${key}`,\n `ThemeProvider: colors.${key} is not a valid hex colour (received ${JSON.stringify(base)}). Falling back to the preset.`,\n );\n colors[key] = fallback;\n continue;\n }\n if (contrast !== undefined && !isValidHex(contrast)) {\n devWarn(\n `theme-contrast-${key}`,\n `ThemeProvider: colors.${key}.contrast is not a valid hex colour (received ${JSON.stringify(contrast)}). It will be computed instead.`,\n );\n colors[key] = { base };\n continue;\n }\n colors[key] = contrast === undefined ? { base } : { base, contrast };\n }\n\n const scale = theme.typography?.fontScale;\n let fontScale = defaultTheme.typography.fontScale!;\n if (scale !== undefined) {\n if (!Number.isFinite(scale) || scale < FONT_SCALE_MIN || scale > FONT_SCALE_MAX) {\n devWarn(\n 'theme-font-scale',\n `ThemeProvider: typography.fontScale must be between ${FONT_SCALE_MIN} and ${FONT_SCALE_MAX} (received ${String(scale)}). Falling back to ${fontScale}.`,\n );\n } else {\n fontScale = scale;\n }\n }\n\n return {\n colors,\n typography: {\n fontFamily: theme.typography?.fontFamily || defaultTheme.typography.fontFamily!,\n monoFamily: theme.typography?.monoFamily || defaultTheme.typography.monoFamily!,\n fontScale,\n },\n };\n};\n\n/**\n * Expands a resolved theme into the flat `--token: value` map to apply.\n *\n * Every family contributes `--x-color`, `--x-rgb`, `--x-dark` and `--x-light`;\n * the six fill families also get `--x-contrast`, and `primary` additionally\n * gets the full `--primary-50…900` ramp.\n */\nexport const buildTokens = (resolved: ResolvedTheme): Record<string, string> => {\n const tokens: Record<string, string> = {};\n\n for (const key of THEME_COLOR_KEYS) {\n const { base, contrast } = resolved.colors[key];\n tokens[`--${key}-color`] = base;\n tokens[`--${key}-rgb`] = hexToRgbTriple(base);\n tokens[`--${key}-dark`] = deriveDark(base);\n tokens[`--${key}-light`] = deriveLight(base);\n\n if (FILL_COLOR_KEYS.includes(key)) {\n tokens[`--${key}-contrast`] = contrast ?? pickContrast(base);\n }\n\n if (key === RAMP_COLOR_KEY) {\n const isPreset = base === normalizeColor(defaultTheme.colors[key]!).base;\n // The preset ramp is hand-tuned, so reuse it verbatim rather than\n // regenerating a near-identical one.\n const ramp = isPreset ? DEFAULT_PRIMARY_RAMP : buildRamp(base);\n if (!isPreset && !isRampViable(base)) {\n devWarn(\n `theme-ramp-${key}`,\n `ThemeProvider: colors.${key} (${base}) is too light or too dark to generate a usable --${key}-50…900 scale; several steps will be identical. Pick a colour with more headroom.`,\n );\n }\n for (const step of RAMP_STEPS) {\n tokens[`--${key}-${step}`] = ramp[step];\n }\n }\n }\n\n const { fontFamily, monoFamily, fontScale } = resolved.typography;\n tokens['--font-family-primary'] = fontFamily;\n tokens['--font-family-mono'] = monoFamily;\n for (const [name, rem] of FONT_SIZE_STEPS) {\n // Trailing zeros trimmed so 1 * 0.75 reads as `0.75rem`, not `0.750rem`.\n tokens[`--font-size-${name}`] = `${parseFloat((rem * fontScale).toFixed(4))}rem`;\n }\n\n return tokens;\n};\n\n/** Tokens for the preset, used to tell which of them are actually overrides. */\nconst DEFAULT_TOKENS = buildTokens(resolveTheme(defaultTheme));\n\n/**\n * Only the tokens that differ from the preset.\n *\n * This is what makes an unthemed `ThemeProvider` a no-op: it writes nothing, so\n * `dist/index.css` stays authoritative and there is no inline-style churn on\n * `documentElement` for values that already match.\n */\nexport const diffFromDefault = (tokens: Record<string, string>): Record<string, string> => {\n const diff: Record<string, string> = {};\n for (const [name, value] of Object.entries(tokens)) {\n if (DEFAULT_TOKENS[name] !== value) diff[name] = value;\n }\n return diff;\n};\n\n/**\n * The resolved theme as a `:root { … }` block.\n *\n * Paste the output into your own stylesheet to bake a theme in at build time -\n * that avoids the brief flash of the preset that any runtime theme has when the\n * value arrives after first paint, and needs no JavaScript at all.\n */\nexport const themeToCss = (resolved: ResolvedTheme): string => {\n const tokens = buildTokens(resolved);\n const body = Object.entries(tokens)\n .map(([name, value]) => ` ${name}: ${value};`)\n .join('\\n');\n return `:root {\\n${body}\\n}`;\n};\n","/**\n * Runtime font registration for the theme system.\n *\n * `--font-family-primary` only *names* families - it cannot make a font\n * available. Selecting \"Plus Jakarta Sans\" on a machine that doesn't have it\n * installed silently falls through to the next stack entry, which is why a\n * theme needs a way to supply the font data itself.\n *\n * ## Why this is CSP-safe\n *\n * Fonts are registered with the CSS Font Loading API from an `ArrayBuffer`:\n *\n * ```ts\n * document.fonts.add(new FontFace(family, buffer));\n * ```\n *\n * CSP's `font-src` directive governs *fetching* a font resource by URL - it is\n * what gates `@font-face { src: url(...) }` and the string form of the\n * `FontFace` constructor. The binary form performs no fetch at all, so there is\n * no request for `font-src` to check and no allowance to configure. Notably\n * this also avoids `blob:` URLs, which *would* require `font-src blob:`.\n *\n * No `<style>` element is created either, so nothing here needs a nonce - the\n * same position as the rest of the theme system.\n */\n\n/** A font registered at runtime, as listed by the editor. */\nexport interface RegisteredFont {\n /** The family name to reference in a font stack. */\n family: string;\n /** Where it came from, so the UI can distinguish uploads from built-ins. */\n source: 'upload';\n}\n\n/**\n * Turns a filename into a usable CSS family name.\n *\n * Deliberately conservative: the real family name lives in the font's internal\n * `name` table, and parsing SFNT tables to read it would be a disproportionate\n * amount of binary handling for a label. The filename is what the user\n * recognises anyway.\n */\nexport const familyNameFromFile = (filename: string): string => {\n const base = filename.replace(/\\.[^.]+$/, '');\n const cleaned = base\n // Strip the weight/style suffixes font vendors append.\n .replace(/[-_](regular|normal|book|roman)$/i, '')\n .replace(/[-_]+/g, ' ')\n // A quoted family name may contain spaces but not quotes or control chars.\n .replace(/[\"'\\\\]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return cleaned || 'Custom Font';\n};\n\n/** Wraps a family name for use in a CSS font stack if it needs quoting. */\nexport const quoteFamily = (family: string): string =>\n /^[a-zA-Z][a-zA-Z0-9-]*$/.test(family) ? family : `'${family}'`;\n\n/**\n * Builds a full stack from a custom family, keeping sensible fallbacks so the\n * page stays readable if the font is ever unavailable.\n */\nexport const toFontStack = (family: string, mono = false): string =>\n mono\n ? `${quoteFamily(family)}, 'SF Mono', Monaco, monospace`\n : `${quoteFamily(family)}, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif`;\n\n/** Font formats accepted for upload, as an `accept` attribute value. */\nexport const FONT_ACCEPT = '.woff2,.woff,.ttf,.otf';\n\nconst SUPPORTED_EXTENSIONS = /\\.(woff2|woff|ttf|otf)$/i;\n\nexport const isSupportedFontFile = (filename: string): boolean =>\n SUPPORTED_EXTENSIONS.test(filename);\n\n/**\n * Registers font data with the document so a theme can reference its family.\n *\n * Resolves with the family name actually registered. Rejects if the data is not\n * a font the browser can parse, or if the Font Loading API is unavailable\n * (notably during SSR, where there is no `document` to register against).\n */\nexport const registerFontFace = async (family: string, data: ArrayBuffer): Promise<string> => {\n if (typeof document === 'undefined' || !document.fonts) {\n throw new Error('registerFontFace requires a document with the CSS Font Loading API.');\n }\n\n // ArrayBuffer source - no URL is fetched, so CSP's font-src never applies.\n const face = new FontFace(family, data);\n await face.load();\n document.fonts.add(face);\n // No cache invalidation needed: only positive results are cached, and this\n // family could not have been cached positive while it was still unavailable.\n // `document.fonts.add` also fires `loadingdone`, which wakes subscribers.\n return family;\n};\n\n/** Reads a File and registers it, returning the family name it was given. */\nexport const registerFontFile = async (file: File, family?: string): Promise<string> => {\n if (!isSupportedFontFile(file.name)) {\n throw new Error(`Unsupported font format: ${file.name}. Use ${FONT_ACCEPT}.`);\n }\n const buffer = await file.arrayBuffer();\n return registerFontFace(family ?? familyNameFromFile(file.name), buffer);\n};\n\n/**\n * CSS generic families, which always resolve and must never be reported\n * missing. They also cannot be probed by the method below, since asking for\n * `monospace, monospace` measures identically to `monospace` alone.\n */\nconst GENERIC_FAMILIES = new Set([\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n 'inherit',\n 'initial',\n 'unset',\n]);\n\n/**\n * Mixed-width glyphs, so a real font is very unlikely to measure identically\n * to a fallback by coincidence.\n */\nconst PROBE_TEXT = 'mmmmmmmmmmlliI0OWw@';\n\n/** Two structurally different fallbacks - a font need only differ from one. */\nconst PROBE_FALLBACKS = ['monospace', 'serif'] as const;\n\n/**\n * Cached per family - **positive results only**.\n *\n * A negative answer is not stable: web fonts load asynchronously (always, with\n * `font-display: swap`), so a family probed during the first render is\n * legitimately unavailable and becomes available moments later. Caching that\n * `false` pinned the answer forever, which showed a permanent \"not installed\"\n * warning for fonts that had in fact loaded.\n *\n * A positive answer cannot go stale the same way - a loaded font is not\n * unloaded - so those are worth keeping. Re-probing the misses costs one canvas\n * measurement each.\n */\nconst availabilityCache = new Map<string, true>();\n\n/**\n * Notifies when the set of usable fonts changes, so a caller rendering an\n * availability state can re-check.\n *\n * Both signals are needed: `loadingdone` covers fonts that begin loading after\n * subscription, while `ready` covers those already in flight when the listener\n * was attached - which is the common case for a stylesheet's `@font-face`\n * rules, since they start loading before any component mounts.\n */\nexport const subscribeToFontLoads = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined' || !document.fonts) return () => {};\n\n let active = true;\n const handler = () => {\n if (active) onChange();\n };\n\n document.fonts.addEventListener('loadingdone', handler);\n void document.fonts.ready.then(handler);\n\n return () => {\n active = false;\n document.fonts.removeEventListener('loadingdone', handler);\n };\n};\n\n/**\n * Whether a font family will actually render, rather than silently falling\n * through to the next entry in the stack.\n *\n * **`document.fonts.check` cannot answer this.** Per spec it reports whether\n * the faces *in the FontFaceSet* matching the query are loaded, so with no\n * matching face it returns `true` vacuously. Verified in a real browser: it\n * answers `true` for `'Totally Not A Real Font 12345'`, and therefore for every\n * uninstalled system font too. Using it here produced a check that could never\n * fail.\n *\n * Instead the family is measured on a canvas against two fallbacks. If it\n * resolves to anything real, the text measures differently from at least one\n * fallback alone; if it does not resolve, the browser renders that fallback and\n * the widths match exactly.\n */\nexport const isFontAvailable = (family: string): boolean => {\n const name = family.trim().replace(/^['\"]|['\"]$/g, '');\n if (!name) return true;\n if (GENERIC_FAMILIES.has(name.toLowerCase())) return true;\n if (typeof document === 'undefined') return true;\n\n if (availabilityCache.get(name)) return true;\n\n try {\n const context = document.createElement('canvas').getContext('2d');\n if (!context) return true;\n\n const available = PROBE_FALLBACKS.some((fallback) => {\n context.font = `100px ${fallback}`;\n const baseline = context.measureText(PROBE_TEXT).width;\n context.font = `100px ${quoteFamily(name)}, ${fallback}`;\n // An invalid font shorthand leaves `font` untouched, which measures as\n // the baseline and correctly reports the family as unavailable.\n return Math.abs(context.measureText(PROBE_TEXT).width - baseline) > 0.5;\n });\n\n if (available) availabilityCache.set(name, true);\n return available;\n } catch {\n // Never report a font missing because probing itself failed - and don't\n // cache a failure, so a later call can still get a real answer.\n return true;\n }\n};\n\n/** Whether the first family in a stack will render. */\nexport const isFontStackAvailable = (stack: string): boolean =>\n isFontAvailable(stack.split(',')[0] ?? '');\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-H46ZLPNJ.cjs","../src/components/ThemeProvider/ThemeProvider.component.tsx","../src/components/ThemeProvider/ThemeProvider.context.tsx","../src/components/ThemeProvider/ThemeProvider.color.ts","../src/components/ThemeProvider/ThemeProvider.tokens.ts","../src/components/ThemeProvider/ThemeProvider.fonts.ts"],"names":["value"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-H46ZLPNJ.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { devWarn } from '../../utils';\nimport { ThemeContext } from './ThemeProvider.context';\nimport { buildTokens, diffFromDefault, resolveTheme, themeToCss } from './ThemeProvider.tokens';\nimport type { ThemeConfig, ThemeContextValue, ThemeProviderProps } from './ThemeProvider.types';\n\nconst EMPTY_THEME: ThemeConfig = {};\n\n/**\n * Number of providers currently mounted.\n *\n * Because tokens are written to `document.documentElement` (see the component\n * comment for why), providers do not compose: two of them target the same\n * element, so whichever applied a given token last wins for the entire page -\n * including for the subtree of the other one. That looks like a broken theme\n * rather than a misuse, so it is worth saying out loud.\n */\nlet mountedProviders = 0;\n\n/** Merges `patch` over `base` one level into `colors`/`typography`. */\nconst mergeTheme = (base: ThemeConfig, patch: ThemeConfig): ThemeConfig => ({\n colors: { ...base.colors, ...patch.colors },\n typography: { ...base.typography, ...patch.typography },\n});\n\n/**\n * Applies a theme by writing CSS custom properties to `document.documentElement`.\n *\n * Two deliberate choices worth knowing:\n *\n * **The target is `documentElement`, not a wrapper element.** Every overlay in\n * this library (`Dropdown`, `Modal`, `Drawer`, `Snackbar`, `Tooltip`, …) portals\n * to `document.body`, so tokens scoped to a wrapper `<div>` would leave every\n * popup rendering the preset instead.\n *\n * **Properties are set through the CSSOM** (`style.setProperty`), which no CSP\n * directive gates - `style-src` and `style-src-attr` only cover the `style`\n * HTML attribute and stylesheet loads. Nothing here needs a nonce, and no\n * `<style>` element is ever created. See `ContentSecurityPolicy.mdx`.\n *\n * Under SSR the server sends the preset from `dist/index.css` and the theme is\n * applied on hydration; use `toCss()` if you need a themed first paint.\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n theme: controlledTheme,\n defaultTheme: initialTheme,\n onThemeChange,\n}) => {\n const isControlled = controlledTheme !== undefined;\n const [uncontrolledTheme, setUncontrolledTheme] = useState<ThemeConfig>(\n initialTheme ?? EMPTY_THEME,\n );\n const theme = isControlled ? controlledTheme : uncontrolledTheme;\n\n useEffect(() => {\n mountedProviders += 1;\n if (mountedProviders > 1) {\n devWarn(\n 'theme-multiple-providers',\n `ThemeProvider: ${mountedProviders} providers are mounted at once. They all write to document.documentElement, so the last one to apply each token wins for the whole page - nested or sibling providers cannot theme separate subtrees. Use a single provider at your app root.`,\n );\n }\n return () => {\n mountedProviders -= 1;\n };\n }, []);\n\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme]);\n const tokens = useMemo(() => diffFromDefault(buildTokens(resolvedTheme)), [resolvedTheme]);\n\n // Names written on the previous pass, so properties dropped from the theme\n // are removed rather than left behind at their last value.\n const appliedRef = useRef<string[]>([]);\n\n useLayoutEffect(() => {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n\n for (const name of appliedRef.current) {\n if (!(name in tokens)) root.style.removeProperty(name);\n }\n for (const [name, value] of Object.entries(tokens)) {\n root.style.setProperty(name, value);\n }\n appliedRef.current = Object.keys(tokens);\n\n return () => {\n for (const name of appliedRef.current) {\n root.style.removeProperty(name);\n }\n appliedRef.current = [];\n };\n }, [tokens]);\n\n const commit = useCallback(\n (next: ThemeConfig) => {\n if (!isControlled) setUncontrolledTheme(next);\n onThemeChange?.(next);\n },\n [isControlled, onThemeChange],\n );\n\n const setTheme = useCallback((next: ThemeConfig) => commit(next), [commit]);\n\n const updateTheme = useCallback(\n (patch: ThemeConfig) => commit(mergeTheme(theme, patch)),\n [commit, theme],\n );\n\n const resetTheme = useCallback(() => commit(EMPTY_THEME), [commit]);\n\n const toCss = useCallback(() => themeToCss(resolvedTheme), [resolvedTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n resolvedTheme,\n setTheme,\n updateTheme,\n resetTheme,\n isDefault: Object.keys(tokens).length === 0,\n toCss,\n }),\n [theme, resolvedTheme, setTheme, updateTheme, resetTheme, tokens, toCss],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n};\n\nThemeProvider.displayName = 'ThemeProvider';\n","import { createContext, useContext } from 'react';\nimport type { ThemeContextValue } from './ThemeProvider.types';\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n/**\n * Reads the active theme. Throws outside a `ThemeProvider`, matching\n * `useSnackbarContext` - a silent fallback would make a missing provider look\n * like a theme that simply is not applying.\n */\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n","/**\n * Colour maths for the theme system.\n *\n * All conversions are done in JS and emitted as `#rrggbb`, so browser support\n * for `oklch()` is irrelevant here - nothing in the generated CSS uses a modern\n * colour function.\n *\n * OKLab is used rather than HSL for every interpolation. HSL lightness\n * interpolation is ~40 lines shorter but produces muddy, desaturated ramps for\n * exactly the saturated brand hues this feature exists to support, because its\n * \"lightness\" is not perceptual.\n */\n\n// ============================================================================\n// sRGB <-> OKLab\n// ============================================================================\n\nexport interface Oklch {\n /** Perceptual lightness, 0-1. */\n l: number;\n /** Chroma (colourfulness), 0 to ~0.4 in sRGB. */\n c: number;\n /** Hue angle in radians. */\n h: number;\n}\n\nconst srgbToLinear = (v: number): number =>\n v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n\nconst linearToSrgb = (v: number): number =>\n v <= 0.0031308 ? 12.92 * v : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;\n\nconst clamp01 = (v: number): number => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Parses `#rgb` / `#rrggbb` into 0-1 sRGB channels. Returns null if unparseable. */\nexport const parseHex = (hex: string): [number, number, number] | null => {\n if (typeof hex !== 'string') return null;\n const raw = hex.trim().replace(/^#/, '');\n const full =\n raw.length === 3\n ? raw\n .split('')\n .map((c) => c + c)\n .join('')\n : raw;\n if (!/^[0-9a-fA-F]{6}$/.test(full)) return null;\n const n = parseInt(full, 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n};\n\nexport const isValidHex = (hex: string): boolean => parseHex(hex) !== null;\n\nconst toHex = ([r, g, b]: [number, number, number]): string =>\n '#' +\n [r, g, b]\n .map((v) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, '0'),\n )\n .join('');\n\n/** `#rrggbb` -> the comma-separated triple the `--x-rgb` tokens use. */\nexport const hexToRgbTriple = (hex: string): string => {\n const rgb = parseHex(hex);\n if (!rgb) return '0, 0, 0';\n return rgb.map((v) => Math.round(v * 255)).join(', ');\n};\n\nconst linearToOklab = ([r, g, b]: [number, number, number]): [number, number, number] => {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n};\n\nconst oklabToLinear = ([L, A, B]: [number, number, number]): [number, number, number] => {\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n};\n\nexport const hexToOklch = (hex: string): Oklch => {\n const rgb = parseHex(hex) ?? [0, 0, 0];\n const [l, a, b] = linearToOklab(rgb.map(srgbToLinear) as [number, number, number]);\n return { l, c: Math.hypot(a, b), h: Math.atan2(b, a) };\n};\n\nconst inGamut = ([r, g, b]: [number, number, number]): boolean =>\n [r, g, b].every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/**\n * Largest chroma that still fits in sRGB at this lightness and hue.\n *\n * Needed because OKLab is a much larger space than sRGB: naively keeping a\n * colour's chroma while changing its lightness frequently lands outside the\n * gamut, where channels clip and the hue visibly shifts.\n */\nconst maxChroma = (l: number, h: number): number => {\n let lo = 0;\n let hi = 0.45;\n for (let i = 0; i < 24; i++) {\n const mid = (lo + hi) / 2;\n if (inGamut(oklabToLinear([l, mid * Math.cos(h), mid * Math.sin(h)]))) lo = mid;\n else hi = mid;\n }\n return lo;\n};\n\nexport const oklchToHex = ({ l, c, h }: Oklch): string => {\n const lc = clamp01(l);\n const cc = Math.min(Math.max(c, 0), maxChroma(lc, h));\n return toHex(\n oklabToLinear([lc, cc * Math.cos(h), cc * Math.sin(h)]).map(linearToSrgb) as [\n number,\n number,\n number,\n ],\n );\n};\n\n// ============================================================================\n// WCAG 2.1 contrast\n// ============================================================================\n\n/**\n * WCAG 2.1 is used rather than APCA. APCA models perception better but is\n * still a draft (targeted at WCAG 3), while WCAG 2 is what consumers are\n * actually audited against. Its known weakness - mis-ranking some mid-tone\n * blues and greens - is accepted for that reason.\n */\nexport const relativeLuminance = (hex: string): number => {\n const [r, g, b] = (parseHex(hex) ?? [0, 0, 0]).map(srgbToLinear);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** Contrast ratio between two colours, 1 (identical) to 21 (black on white). */\nexport const contrastRatio = (a: string, b: string): number => {\n const [x, y] = [relativeLuminance(a), relativeLuminance(b)];\n return (Math.max(x, y) + 0.05) / (Math.min(x, y) + 0.05);\n};\n\n/** The two foreground candidates, matching `--white` and `--gray-900`. */\nexport const CONTRAST_LIGHT = '#ffffff';\nexport const CONTRAST_DARK = '#0f172a';\n\n/**\n * Foreground to place on `fill`.\n *\n * White wins unless it drops below 3:1, at which point the better of the two\n * candidates is used. The threshold is deliberately 3:1 rather than \"whichever\n * scores higher\": on mid-tone reds the dark candidate often scores marginally\n * better while looking plainly wrong, and every preset base clears 4.5:1\n * against white anyway.\n */\nexport const pickContrast = (fill: string): string => {\n const onLight = contrastRatio(fill, CONTRAST_LIGHT);\n if (onLight >= 3) return CONTRAST_LIGHT;\n return onLight >= contrastRatio(fill, CONTRAST_DARK) ? CONTRAST_LIGHT : CONTRAST_DARK;\n};\n\n// ============================================================================\n// Ramp generation\n// ============================================================================\n\n/** The ramp steps, in the order `--x-50` … `--x-900` are declared. */\nexport const RAMP_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\n\nexport type RampStep = (typeof RAMP_STEPS)[number];\n\n/** The step the supplied base colour occupies; the ramp is built around it. */\nconst BASE_STEP = 500;\n\n/**\n * Target lightness per step, and how much of the base's chroma to keep.\n *\n * Measured from the preset indigo ramp, so feeding the preset primary through\n * `buildRamp` lands close to the shipped `--primary-*` values rather than\n * something arbitrary. It is deliberately not an exact reproduction - see the\n * note on `buildRamp`.\n */\nconst RAMP_CURVE: Record<RampStep, { l: number; chroma: number }> = {\n 50: { l: 0.962, chroma: 0.09 },\n 100: { l: 0.93, chroma: 0.16 },\n 200: { l: 0.87, chroma: 0.3 },\n 300: { l: 0.785, chroma: 0.51 },\n 400: { l: 0.68, chroma: 0.77 },\n 500: { l: 0.558, chroma: 1.0 },\n 600: { l: 0.511, chroma: 1.12 },\n 700: { l: 0.457, chroma: 1.05 },\n 800: { l: 0.398, chroma: 0.87 },\n 900: { l: 0.359, chroma: 0.66 },\n};\n\n/** Ceiling/floor the generated ends aim for, leaving the base itself untouched. */\nconst LIGHT_CEILING = 0.985;\nconst DARK_FLOOR = 0.22;\n\n/** Minimum lightness gap between adjacent steps, so none can collapse together. */\nconst MIN_STEP_DELTA = 0.012;\n\n/**\n * Generates a 50-900 ramp around `base`, which is placed at the 500 step.\n *\n * The base's own hue is always preserved, and `--x-500` is returned as the base\n * hex verbatim, so the colour a consumer picked is never silently replaced.\n *\n * The curve above is *rescaled* to whatever lightness headroom the base leaves,\n * rather than being applied absolutely or simply shifted:\n *\n * - Applying it absolutely would reassign the base - pick a pale yellow and\n * `--x-500` would come back a mid-olive, contradicting `--x-color`.\n * - Shifting it so 500 sits at the base's lightness pushes the light end past\n * `l = 1`, where it clips and 50/100/200/300 all come out pure white.\n *\n * The ends are **absolute**, not relative to the base: step 50 lands near-white\n * and step 900 near-dark whatever lightness the base has, with the remaining\n * steps interpolated between the base and those anchors. Only a base that is\n * already past an anchor compresses that side into what headroom is left.\n *\n * Getting this wrong is subtle. An earlier version offset every step *from the\n * base* by the curve's own distances, capped so the preset reproduced exactly.\n * That looks right - and reproduces the preset ramp perfectly - but it makes the\n * tints relative: a dark navy base (`#1a1a2e`) returned `--primary-50: #8a8a8c`,\n * a mid grey rather than a tint, because 50 sits only 0.404 lightness above 500\n * on the curve. Every consumer of the tint end broke visibly - `Navigation`'s\n * active item paints `--primary-50` and turned into a charcoal pill.\n *\n * Two inputs are genuinely degenerate and are handled rather than solved: a\n * base at or above `LIGHT_CEILING` has no room for tints, and one with zero\n * chroma (pure white, black, any gray) has no saturation to separate them with\n * either. For those the light end converges, and `isRampViable` reports it so\n * the caller can warn. Realistic light picks are fine - `#fde047` still yields\n * five distinct tints.\n */\nexport const buildRamp = (base: string): Record<RampStep, string> => {\n const { l: baseL, c: baseC, h } = hexToOklch(base);\n const anchor = RAMP_CURVE[BASE_STEP].l;\n\n // Where the ends of the scale sit, independent of the base. A base already\n // lighter than the curve's own 50 (or darker than its 900) has nowhere left\n // to go, so that side compresses into the remaining headroom instead.\n const curveLight = RAMP_CURVE[50].l;\n const curveDark = RAMP_CURVE[900].l;\n const lightTarget = baseL >= curveLight ? Math.min(LIGHT_CEILING, baseL + 0.02) : curveLight;\n const darkTarget = baseL <= curveDark ? Math.max(DARK_FLOOR * 0.2, baseL - 0.02) : curveDark;\n\n const lightSpan = curveLight - anchor;\n const darkSpan = anchor - curveDark;\n\n const out = {} as Record<RampStep, string>;\n for (const step of RAMP_STEPS) {\n if (step === BASE_STEP) {\n out[step] = base;\n continue;\n }\n const { l: curveL, chroma } = RAMP_CURVE[step];\n const offset = curveL - anchor;\n // How far along its half of the curve this step sits: 0 at the base, 1 at\n // the end. Interpolating that fraction between the base and the target\n // keeps the curve's shape while pinning where it ends up.\n const t = offset > 0 ? offset / lightSpan : -offset / darkSpan;\n const l = offset > 0 ? baseL + t * (lightTarget - baseL) : baseL - t * (baseL - darkTarget);\n out[step] = oklchToHex({ l, c: baseC * chroma, h });\n }\n\n return enforceSeparation(out, h, baseC);\n};\n\n/**\n * Walks outward from the base step, pushing any step that ended up too close to\n * its neighbour further away. Only bites for extreme inputs (near-white,\n * near-black, zero-chroma), where the rescale above has almost no room left.\n */\nconst enforceSeparation = (\n ramp: Record<RampStep, string>,\n h: number,\n baseC: number,\n): Record<RampStep, string> => {\n const baseIndex = RAMP_STEPS.indexOf(BASE_STEP);\n const lightness = RAMP_STEPS.map((s) => hexToOklch(ramp[s]).l);\n\n // Lighter steps: walk from the base toward 50, each must be lighter.\n for (let i = baseIndex - 1; i >= 0; i--) {\n const limit = lightness[i + 1] + MIN_STEP_DELTA;\n if (lightness[i] < limit) lightness[i] = Math.min(1, limit);\n }\n // Darker steps: walk from the base toward 900, each must be darker.\n for (let i = baseIndex + 1; i < RAMP_STEPS.length; i++) {\n const limit = lightness[i - 1] - MIN_STEP_DELTA;\n if (lightness[i] > limit) lightness[i] = Math.max(0, limit);\n }\n\n const out = {} as Record<RampStep, string>;\n RAMP_STEPS.forEach((step, i) => {\n if (step === BASE_STEP) {\n out[step] = ramp[step];\n return;\n }\n out[step] = oklchToHex({\n l: lightness[i],\n c: baseC * RAMP_CURVE[step].chroma,\n h,\n });\n });\n return out;\n};\n\n/** How far `--x-dark` / `--x-light` sit from the base, in OKLab lightness. */\nconst DARK_DELTA = 0.086;\nconst LIGHT_DELTA = 0.169;\n\n/** Below this lightness there is no room left to darken, so the hover lightens. */\nconst HOVER_INVERT_BELOW = DARK_DELTA * 1.5;\n\n/**\n * The hover/active colour. Must differ *visibly* from the base and stay legible\n * as text on white, since `--x-dark` is used both as a fill (Button, Chip\n * hovers) and as text (Snackbar, link hover in `global.scss`).\n *\n * A fixed ramp step is not good enough: for a near-white base the 600 step\n * lands barely darker than the base and the hover reads as no change at all.\n * Hence a guaranteed delta.\n *\n * For a base that is already near-black the delta is applied *upwards* instead.\n * Clamping to a floor would return a colour lighter than the base while still\n * being named \"dark\", and returning the base unchanged would leave the control\n * with no hover affordance at all; lightening is what dark-surface design\n * systems do anyway.\n */\nexport const deriveDark = (base: string): string => {\n const { l, c, h } = hexToOklch(base);\n const target = l < HOVER_INVERT_BELOW ? l + DARK_DELTA : l - DARK_DELTA;\n return oklchToHex({ l: target, c, h });\n};\n\n/**\n * The light companion. Lightening has a hard ceiling, so for an already-pale\n * base this lands very close to it - acceptable, as `--x-light` is a public\n * token that nothing inside the library currently consumes.\n */\nexport const deriveLight = (base: string): string => {\n const { l, c, h } = hexToOklch(base);\n return oklchToHex({ l: Math.min(LIGHT_CEILING, l + LIGHT_DELTA), c, h });\n};\n\n/**\n * Whether `base` leaves enough lightness headroom to generate a usable 50-900\n * ramp. False only for near-white and near-black, where the tint or shade end\n * necessarily converges - the caller surfaces that as a developer warning\n * rather than silently shipping identical tokens.\n *\n * Deliberately does not test chroma: an unsaturated gray separates perfectly\n * well by lightness alone, and a saturated light colour like `#fde047` still\n * produces five distinct tints. Only the extremes genuinely fail.\n */\nexport const isRampViable = (base: string): boolean => {\n const { l } = hexToOklch(base);\n return l < 0.95 && l > 0.12;\n};\n","import { devWarn } from '../../utils';\nimport {\n RAMP_STEPS,\n buildRamp,\n deriveDark,\n deriveLight,\n hexToRgbTriple,\n isValidHex,\n isRampViable,\n pickContrast,\n} from './ThemeProvider.color';\nimport type {\n ResolvedTheme,\n ThemeColorKey,\n ThemeColorValue,\n ThemeConfig,\n} from './ThemeProvider.types';\n\nexport const THEME_COLOR_KEYS: readonly ThemeColorKey[] = [\n 'primary',\n 'secondary',\n 'success',\n 'danger',\n 'warning',\n 'info',\n 'hyperlink',\n] as const;\n\n/**\n * `hyperlink` is link text on a surface, never a fill, so it has no\n * `--hyperlink-contrast` token - nothing in the library would read it.\n */\nconst FILL_COLOR_KEYS: readonly ThemeColorKey[] = [\n 'primary',\n 'secondary',\n 'success',\n 'danger',\n 'warning',\n 'info',\n] as const;\n\n/** Only `primary` has a 50-900 ramp in `variables.scss`. */\nconst RAMP_COLOR_KEY: ThemeColorKey = 'primary';\n\n/** The eight preset `--font-size-*` values, in declaration order. */\nconst FONT_SIZE_STEPS: readonly [string, number][] = [\n ['xs', 0.75],\n ['sm', 0.875],\n ['base', 1],\n ['md', 1.1],\n ['lg', 1.125],\n ['xl', 1.25],\n ['2xl', 1.5],\n ['3xl', 1.875],\n] as const;\n\n/**\n * The shipped values from `src/styles/variables.scss`.\n *\n * This is a literal copy, not something derived: the ramp is hand-tuned and no\n * generator reproduces it byte for byte. Keeping it literal means a theme equal\n * to the preset writes no CSS properties at all, so default rendering is\n * identical to `dist/index.css`.\n *\n * Must be kept in sync with `variables.scss` by hand. The bases are all chosen\n * to clear WCAG AA against white text; see the comment at the top of that file.\n */\nexport const defaultTheme: Required<ThemeConfig> = {\n colors: {\n primary: '#5c5de8',\n secondary: '#617087',\n success: '#007f57',\n danger: '#d6272f',\n warning: '#9c6300',\n info: '#007a90',\n hyperlink: '#007b84',\n },\n typography: {\n fontFamily:\n \"'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n monoFamily:\n \"'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Source Code Pro', monospace\",\n fontScale: 1,\n },\n};\n\n/** The preset `--primary-*` ramp, needed so an unthemed primary emits nothing. */\nconst DEFAULT_PRIMARY_RAMP: Record<number, string> = {\n 50: '#eef2ff',\n 100: '#e0e7ff',\n 200: '#c7d2fe',\n 300: '#a5b4fc',\n 400: '#818cf8',\n 500: '#5c5de8',\n 600: '#4f46e5',\n 700: '#4338ca',\n 800: '#3730a3',\n 900: '#312e81',\n};\n\nexport const FONT_SCALE_MIN = 0.875;\nexport const FONT_SCALE_MAX = 1.25;\n\nconst normalizeColor = (value: ThemeColorValue): { base: string; contrast?: string } =>\n typeof value === 'string' ? { base: value } : value;\n\n/** Fills every absent field from the preset. */\nexport const resolveTheme = (theme: ThemeConfig): ResolvedTheme => {\n const colors = {} as ResolvedTheme['colors'];\n\n for (const key of THEME_COLOR_KEYS) {\n const supplied = theme.colors?.[key];\n const fallback = normalizeColor(defaultTheme.colors[key]!);\n if (supplied === undefined) {\n colors[key] = fallback;\n continue;\n }\n const { base, contrast } = normalizeColor(supplied);\n if (!isValidHex(base)) {\n devWarn(\n `theme-color-${key}`,\n `ThemeProvider: colors.${key} is not a valid hex colour (received ${JSON.stringify(base)}). Falling back to the preset.`,\n );\n colors[key] = fallback;\n continue;\n }\n if (contrast !== undefined && !isValidHex(contrast)) {\n devWarn(\n `theme-contrast-${key}`,\n `ThemeProvider: colors.${key}.contrast is not a valid hex colour (received ${JSON.stringify(contrast)}). It will be computed instead.`,\n );\n colors[key] = { base };\n continue;\n }\n colors[key] = contrast === undefined ? { base } : { base, contrast };\n }\n\n const scale = theme.typography?.fontScale;\n let fontScale = defaultTheme.typography.fontScale!;\n if (scale !== undefined) {\n if (!Number.isFinite(scale) || scale < FONT_SCALE_MIN || scale > FONT_SCALE_MAX) {\n devWarn(\n 'theme-font-scale',\n `ThemeProvider: typography.fontScale must be between ${FONT_SCALE_MIN} and ${FONT_SCALE_MAX} (received ${String(scale)}). Falling back to ${fontScale}.`,\n );\n } else {\n fontScale = scale;\n }\n }\n\n return {\n colors,\n typography: {\n fontFamily: theme.typography?.fontFamily || defaultTheme.typography.fontFamily!,\n monoFamily: theme.typography?.monoFamily || defaultTheme.typography.monoFamily!,\n fontScale,\n },\n };\n};\n\n/**\n * Expands a resolved theme into the flat `--token: value` map to apply.\n *\n * Every family contributes `--x-color`, `--x-rgb`, `--x-dark` and `--x-light`;\n * the six fill families also get `--x-contrast`, and `primary` additionally\n * gets the full `--primary-50…900` ramp.\n */\nexport const buildTokens = (resolved: ResolvedTheme): Record<string, string> => {\n const tokens: Record<string, string> = {};\n\n for (const key of THEME_COLOR_KEYS) {\n const { base, contrast } = resolved.colors[key];\n tokens[`--${key}-color`] = base;\n tokens[`--${key}-rgb`] = hexToRgbTriple(base);\n tokens[`--${key}-dark`] = deriveDark(base);\n tokens[`--${key}-light`] = deriveLight(base);\n\n if (FILL_COLOR_KEYS.includes(key)) {\n tokens[`--${key}-contrast`] = contrast ?? pickContrast(base);\n }\n\n if (key === RAMP_COLOR_KEY) {\n const isPreset = base === normalizeColor(defaultTheme.colors[key]!).base;\n // The preset ramp is hand-tuned, so reuse it verbatim rather than\n // regenerating a near-identical one.\n const ramp = isPreset ? DEFAULT_PRIMARY_RAMP : buildRamp(base);\n if (!isPreset && !isRampViable(base)) {\n devWarn(\n `theme-ramp-${key}`,\n `ThemeProvider: colors.${key} (${base}) is too light or too dark to generate a usable --${key}-50…900 scale; several steps will be identical. Pick a colour with more headroom.`,\n );\n }\n for (const step of RAMP_STEPS) {\n tokens[`--${key}-${step}`] = ramp[step];\n }\n }\n }\n\n const { fontFamily, monoFamily, fontScale } = resolved.typography;\n tokens['--font-family-primary'] = fontFamily;\n tokens['--font-family-mono'] = monoFamily;\n for (const [name, rem] of FONT_SIZE_STEPS) {\n // Trailing zeros trimmed so 1 * 0.75 reads as `0.75rem`, not `0.750rem`.\n tokens[`--font-size-${name}`] = `${parseFloat((rem * fontScale).toFixed(4))}rem`;\n }\n\n return tokens;\n};\n\n/** Tokens for the preset, used to tell which of them are actually overrides. */\nconst DEFAULT_TOKENS = buildTokens(resolveTheme(defaultTheme));\n\n/**\n * Only the tokens that differ from the preset.\n *\n * This is what makes an unthemed `ThemeProvider` a no-op: it writes nothing, so\n * `dist/index.css` stays authoritative and there is no inline-style churn on\n * `documentElement` for values that already match.\n */\nexport const diffFromDefault = (tokens: Record<string, string>): Record<string, string> => {\n const diff: Record<string, string> = {};\n for (const [name, value] of Object.entries(tokens)) {\n if (DEFAULT_TOKENS[name] !== value) diff[name] = value;\n }\n return diff;\n};\n\n/**\n * The resolved theme as a `:root { … }` block.\n *\n * Paste the output into your own stylesheet to bake a theme in at build time -\n * that avoids the brief flash of the preset that any runtime theme has when the\n * value arrives after first paint, and needs no JavaScript at all.\n */\nexport const themeToCss = (resolved: ResolvedTheme): string => {\n const tokens = buildTokens(resolved);\n const body = Object.entries(tokens)\n .map(([name, value]) => ` ${name}: ${value};`)\n .join('\\n');\n return `:root {\\n${body}\\n}`;\n};\n","/**\n * Runtime font registration for the theme system.\n *\n * `--font-family-primary` only *names* families - it cannot make a font\n * available. Selecting \"Plus Jakarta Sans\" on a machine that doesn't have it\n * installed silently falls through to the next stack entry, which is why a\n * theme needs a way to supply the font data itself.\n *\n * ## Why this is CSP-safe\n *\n * Fonts are registered with the CSS Font Loading API from an `ArrayBuffer`:\n *\n * ```ts\n * document.fonts.add(new FontFace(family, buffer));\n * ```\n *\n * CSP's `font-src` directive governs *fetching* a font resource by URL - it is\n * what gates `@font-face { src: url(...) }` and the string form of the\n * `FontFace` constructor. The binary form performs no fetch at all, so there is\n * no request for `font-src` to check and no allowance to configure. Notably\n * this also avoids `blob:` URLs, which *would* require `font-src blob:`.\n *\n * No `<style>` element is created either, so nothing here needs a nonce - the\n * same position as the rest of the theme system.\n */\n\n/** A font registered at runtime, as listed by the editor. */\nexport interface RegisteredFont {\n /** The family name to reference in a font stack. */\n family: string;\n /** Where it came from, so the UI can distinguish uploads from built-ins. */\n source: 'upload';\n}\n\n/**\n * Turns a filename into a usable CSS family name.\n *\n * Deliberately conservative: the real family name lives in the font's internal\n * `name` table, and parsing SFNT tables to read it would be a disproportionate\n * amount of binary handling for a label. The filename is what the user\n * recognises anyway.\n */\nexport const familyNameFromFile = (filename: string): string => {\n const base = filename.replace(/\\.[^.]+$/, '');\n const cleaned = base\n // Strip the weight/style suffixes font vendors append.\n .replace(/[-_](regular|normal|book|roman)$/i, '')\n .replace(/[-_]+/g, ' ')\n // A quoted family name may contain spaces but not quotes or control chars.\n .replace(/[\"'\\\\]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return cleaned || 'Custom Font';\n};\n\n/** Wraps a family name for use in a CSS font stack if it needs quoting. */\nexport const quoteFamily = (family: string): string =>\n /^[a-zA-Z][a-zA-Z0-9-]*$/.test(family) ? family : `'${family}'`;\n\n/**\n * Builds a full stack from a custom family, keeping sensible fallbacks so the\n * page stays readable if the font is ever unavailable.\n */\nexport const toFontStack = (family: string, mono = false): string =>\n mono\n ? `${quoteFamily(family)}, 'SF Mono', Monaco, monospace`\n : `${quoteFamily(family)}, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif`;\n\n/** Font formats accepted for upload, as an `accept` attribute value. */\nexport const FONT_ACCEPT = '.woff2,.woff,.ttf,.otf';\n\nconst SUPPORTED_EXTENSIONS = /\\.(woff2|woff|ttf|otf)$/i;\n\nexport const isSupportedFontFile = (filename: string): boolean =>\n SUPPORTED_EXTENSIONS.test(filename);\n\n/**\n * Registers font data with the document so a theme can reference its family.\n *\n * Resolves with the family name actually registered. Rejects if the data is not\n * a font the browser can parse, or if the Font Loading API is unavailable\n * (notably during SSR, where there is no `document` to register against).\n */\nexport const registerFontFace = async (family: string, data: ArrayBuffer): Promise<string> => {\n if (typeof document === 'undefined' || !document.fonts) {\n throw new Error('registerFontFace requires a document with the CSS Font Loading API.');\n }\n\n // ArrayBuffer source - no URL is fetched, so CSP's font-src never applies.\n const face = new FontFace(family, data);\n await face.load();\n document.fonts.add(face);\n // No cache invalidation needed: only positive results are cached, and this\n // family could not have been cached positive while it was still unavailable.\n // `document.fonts.add` also fires `loadingdone`, which wakes subscribers.\n return family;\n};\n\n/** Reads a File and registers it, returning the family name it was given. */\nexport const registerFontFile = async (file: File, family?: string): Promise<string> => {\n if (!isSupportedFontFile(file.name)) {\n throw new Error(`Unsupported font format: ${file.name}. Use ${FONT_ACCEPT}.`);\n }\n const buffer = await file.arrayBuffer();\n return registerFontFace(family ?? familyNameFromFile(file.name), buffer);\n};\n\n/**\n * CSS generic families, which always resolve and must never be reported\n * missing. They also cannot be probed by the method below, since asking for\n * `monospace, monospace` measures identically to `monospace` alone.\n */\nconst GENERIC_FAMILIES = new Set([\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'math',\n 'emoji',\n 'fangsong',\n 'inherit',\n 'initial',\n 'unset',\n]);\n\n/**\n * Mixed-width glyphs, so a real font is very unlikely to measure identically\n * to a fallback by coincidence.\n */\nconst PROBE_TEXT = 'mmmmmmmmmmlliI0OWw@';\n\n/** Two structurally different fallbacks - a font need only differ from one. */\nconst PROBE_FALLBACKS = ['monospace', 'serif'] as const;\n\n/**\n * Cached per family - **positive results only**.\n *\n * A negative answer is not stable: web fonts load asynchronously (always, with\n * `font-display: swap`), so a family probed during the first render is\n * legitimately unavailable and becomes available moments later. Caching that\n * `false` pinned the answer forever, which showed a permanent \"not installed\"\n * warning for fonts that had in fact loaded.\n *\n * A positive answer cannot go stale the same way - a loaded font is not\n * unloaded - so those are worth keeping. Re-probing the misses costs one canvas\n * measurement each.\n */\nconst availabilityCache = new Map<string, true>();\n\n/**\n * Notifies when the set of usable fonts changes, so a caller rendering an\n * availability state can re-check.\n *\n * Both signals are needed: `loadingdone` covers fonts that begin loading after\n * subscription, while `ready` covers those already in flight when the listener\n * was attached - which is the common case for a stylesheet's `@font-face`\n * rules, since they start loading before any component mounts.\n */\nexport const subscribeToFontLoads = (onChange: () => void): (() => void) => {\n if (typeof document === 'undefined' || !document.fonts) return () => {};\n\n let active = true;\n const handler = () => {\n if (active) onChange();\n };\n\n document.fonts.addEventListener('loadingdone', handler);\n void document.fonts.ready.then(handler);\n\n return () => {\n active = false;\n document.fonts.removeEventListener('loadingdone', handler);\n };\n};\n\n/**\n * Whether a font family will actually render, rather than silently falling\n * through to the next entry in the stack.\n *\n * **`document.fonts.check` cannot answer this.** Per spec it reports whether\n * the faces *in the FontFaceSet* matching the query are loaded, so with no\n * matching face it returns `true` vacuously. Verified in a real browser: it\n * answers `true` for `'Totally Not A Real Font 12345'`, and therefore for every\n * uninstalled system font too. Using it here produced a check that could never\n * fail.\n *\n * Instead the family is measured on a canvas against two fallbacks. If it\n * resolves to anything real, the text measures differently from at least one\n * fallback alone; if it does not resolve, the browser renders that fallback and\n * the widths match exactly.\n */\nexport const isFontAvailable = (family: string): boolean => {\n const name = family.trim().replace(/^['\"]|['\"]$/g, '');\n if (!name) return true;\n if (GENERIC_FAMILIES.has(name.toLowerCase())) return true;\n if (typeof document === 'undefined') return true;\n\n if (availabilityCache.get(name)) return true;\n\n try {\n const context = document.createElement('canvas').getContext('2d');\n if (!context) return true;\n\n const available = PROBE_FALLBACKS.some((fallback) => {\n context.font = `100px ${fallback}`;\n const baseline = context.measureText(PROBE_TEXT).width;\n context.font = `100px ${quoteFamily(name)}, ${fallback}`;\n // An invalid font shorthand leaves `font` untouched, which measures as\n // the baseline and correctly reports the family as unavailable.\n return Math.abs(context.measureText(PROBE_TEXT).width - baseline) > 0.5;\n });\n\n if (available) availabilityCache.set(name, true);\n return available;\n } catch {\n // Never report a font missing because probing itself failed - and don't\n // cache a failure, so a later call can still get a real answer.\n return true;\n }\n};\n\n/** Whether the first family in a stack will render. */\nexport const isFontStackAvailable = (stack: string): boolean =>\n isFontAvailable(stack.split(',')[0] ?? '');\n"]}
|
|
@@ -11,28 +11,28 @@
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _chunk544RAXWOcjs = require('./chunk-544RAXWO.cjs');
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
var
|
|
17
|
+
var _chunkJFV56ISScjs = require('./chunk-JFV56ISS.cjs');
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _chunk7FV2X62Wcjs = require('./chunk-7FV2X62W.cjs');
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
23
|
+
var _chunk6IB27I5Kcjs = require('./chunk-6IB27I5K.cjs');
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
var
|
|
26
|
+
var _chunkB2OHBIALcjs = require('./chunk-B2OHBIAL.cjs');
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
var _chunkYJNQLH2Lcjs = require('./chunk-YJNQLH2L.cjs');
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
var
|
|
32
|
+
var _chunkSLHIVEFWcjs = require('./chunk-SLHIVEFW.cjs');
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
var
|
|
35
|
+
var _chunk4HZIXRAJcjs = require('./chunk-4HZIXRAJ.cjs');
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
var _chunkTROYIUDHcjs = require('./chunk-TROYIUDH.cjs');
|
|
@@ -41,17 +41,17 @@ var _chunkTROYIUDHcjs = require('./chunk-TROYIUDH.cjs');
|
|
|
41
41
|
var _chunkKV3V2CPHcjs = require('./chunk-KV3V2CPH.cjs');
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
var
|
|
44
|
+
var _chunkN5NXKVFJcjs = require('./chunk-N5NXKVFJ.cjs');
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
var
|
|
47
|
+
var _chunkVXC7Z7XBcjs = require('./chunk-VXC7Z7XB.cjs');
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
var
|
|
50
|
+
var _chunkXPG56DLQcjs = require('./chunk-XPG56DLQ.cjs');
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
var
|
|
54
|
+
var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
|
|
55
55
|
|
|
56
56
|
// src/components/DataGrid/DataGrid.component.tsx
|
|
57
57
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
@@ -91,7 +91,7 @@ function SortableTableRow({
|
|
|
91
91
|
className,
|
|
92
92
|
children
|
|
93
93
|
}) {
|
|
94
|
-
const { attributes, listeners, setNodeRef, transform, transition, isDragging } =
|
|
94
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = _chunk544RAXWOcjs.useSortable.call(void 0, {
|
|
95
95
|
id,
|
|
96
96
|
disabled
|
|
97
97
|
});
|
|
@@ -101,7 +101,7 @@ function SortableTableRow({
|
|
|
101
101
|
ref: setNodeRef,
|
|
102
102
|
className: [className, isDragging ? "eidos-datagrid-row--dragging" : ""].filter(Boolean).join(" "),
|
|
103
103
|
style: {
|
|
104
|
-
transform:
|
|
104
|
+
transform: _chunk544RAXWOcjs.CSS.Transform.toString(transform),
|
|
105
105
|
transition: _nullishCoalesce(transition, () => ( void 0)),
|
|
106
106
|
opacity: isDragging ? 0.4 : 1
|
|
107
107
|
},
|
|
@@ -457,7 +457,7 @@ function DataGridInner({
|
|
|
457
457
|
_react.useEffect.call(void 0, () => {
|
|
458
458
|
if (!selectable || selectAllScope !== "all") return;
|
|
459
459
|
if (totalItemCount <= localData.length) return;
|
|
460
|
-
|
|
460
|
+
_chunkENMDOQQOcjs.devWarn.call(void 0,
|
|
461
461
|
`datagrid-select-all-scope:${localData.length}/${totalItemCount}`,
|
|
462
462
|
`DataGrid: selectAllScope="all" can only select the ${localData.length} row(s) currently loaded, but there are ${totalItemCount} in total. The keys of rows the grid has never received cannot be known here - use selectAllScope="page" to make the scope explicit, or resolve the full key set yourself and pass it as \`selectedRows\`.`
|
|
463
463
|
);
|
|
@@ -723,7 +723,7 @@ function DataGridInner({
|
|
|
723
723
|
try {
|
|
724
724
|
commitSelection(await onSelectAllMatching());
|
|
725
725
|
} catch (error) {
|
|
726
|
-
|
|
726
|
+
_chunkENMDOQQOcjs.devWarn.call(void 0,
|
|
727
727
|
"datagrid-select-all-matching-failed",
|
|
728
728
|
`DataGrid: onSelectAllMatching() rejected, so the selection was left untouched. ${String(error)}`
|
|
729
729
|
);
|
|
@@ -817,9 +817,9 @@ function DataGridInner({
|
|
|
817
817
|
},
|
|
818
818
|
[onPageChange]
|
|
819
819
|
);
|
|
820
|
-
const sensors =
|
|
821
|
-
|
|
822
|
-
|
|
820
|
+
const sensors = _chunk544RAXWOcjs.useSensors.call(void 0,
|
|
821
|
+
_chunk544RAXWOcjs.useSensor.call(void 0, _chunk544RAXWOcjs.PointerSensor, { activationConstraint: { distance: 5 } }),
|
|
822
|
+
_chunk544RAXWOcjs.useSensor.call(void 0, _chunk544RAXWOcjs.KeyboardSensor)
|
|
823
823
|
);
|
|
824
824
|
const handleRowDragEnd = _react.useCallback.call(void 0,
|
|
825
825
|
(event) => {
|
|
@@ -833,7 +833,7 @@ function DataGridInner({
|
|
|
833
833
|
(row, i) => String(_nullishCoalesce(cellOf(row, rowKeyField), () => ( i))) === String(over.id)
|
|
834
834
|
);
|
|
835
835
|
if (oldIndex === -1 || newIndex === -1) return;
|
|
836
|
-
const newData =
|
|
836
|
+
const newData = _chunk544RAXWOcjs.arrayMove.call(void 0, localDataRef.current, oldIndex, newIndex);
|
|
837
837
|
setLocalData(newData);
|
|
838
838
|
_optionalChain([onChange, 'optionalCall', _23 => _23(newData)]);
|
|
839
839
|
_optionalChain([onRowReorder, 'optionalCall', _24 => _24(newData)]);
|
|
@@ -875,7 +875,7 @@ function DataGridInner({
|
|
|
875
875
|
switch (col.type) {
|
|
876
876
|
case "number":
|
|
877
877
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
878
|
-
|
|
878
|
+
_chunk4HZIXRAJcjs.Input,
|
|
879
879
|
{
|
|
880
880
|
type: "number",
|
|
881
881
|
variant,
|
|
@@ -890,7 +890,7 @@ function DataGridInner({
|
|
|
890
890
|
);
|
|
891
891
|
case "date":
|
|
892
892
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
893
|
-
|
|
893
|
+
_chunk4HZIXRAJcjs.Input,
|
|
894
894
|
{
|
|
895
895
|
type: "date",
|
|
896
896
|
variant,
|
|
@@ -910,7 +910,7 @@ function DataGridInner({
|
|
|
910
910
|
label: o.label
|
|
911
911
|
}));
|
|
912
912
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
913
|
-
|
|
913
|
+
_chunkB2OHBIALcjs.Select,
|
|
914
914
|
{
|
|
915
915
|
options: selectOptions,
|
|
916
916
|
value: String(_nullishCoalesce(value, () => ( ""))),
|
|
@@ -932,7 +932,7 @@ function DataGridInner({
|
|
|
932
932
|
}
|
|
933
933
|
default:
|
|
934
934
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
935
|
-
|
|
935
|
+
_chunk4HZIXRAJcjs.Input,
|
|
936
936
|
{
|
|
937
937
|
type: "text",
|
|
938
938
|
variant,
|
|
@@ -1006,9 +1006,9 @@ function DataGridInner({
|
|
|
1006
1006
|
});
|
|
1007
1007
|
if (!items.length) return null;
|
|
1008
1008
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1009
|
-
|
|
1009
|
+
_chunkN5NXKVFJcjs.Menu,
|
|
1010
1010
|
{
|
|
1011
|
-
trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { type: "button", className: "eidos-datagrid-actions-trigger", "aria-label": "Row actions", children: actionsColumn.actionsIcon ?
|
|
1011
|
+
trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { type: "button", className: "eidos-datagrid-actions-trigger", "aria-label": "Row actions", children: actionsColumn.actionsIcon ? _chunkENMDOQQOcjs.renderIcon.call(void 0, actionsColumn.actionsIcon, "eidos-datagrid-actions-trigger-icon") : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.MoreVertical, { size: 16 }) }),
|
|
1012
1012
|
items
|
|
1013
1013
|
}
|
|
1014
1014
|
);
|
|
@@ -1039,7 +1039,7 @@ function DataGridInner({
|
|
|
1039
1039
|
switch (quickFilter.type) {
|
|
1040
1040
|
case "segmented":
|
|
1041
1041
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1042
|
-
|
|
1042
|
+
_chunkJFV56ISScjs.SegmentedControl,
|
|
1043
1043
|
{
|
|
1044
1044
|
size: "sm",
|
|
1045
1045
|
color: quickFilter.color,
|
|
@@ -1055,7 +1055,7 @@ function DataGridInner({
|
|
|
1055
1055
|
);
|
|
1056
1056
|
case "combobox":
|
|
1057
1057
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1058
|
-
|
|
1058
|
+
_chunkSLHIVEFWcjs.Combobox,
|
|
1059
1059
|
{
|
|
1060
1060
|
size: "sm",
|
|
1061
1061
|
fullWidth: true,
|
|
@@ -1077,7 +1077,7 @@ function DataGridInner({
|
|
|
1077
1077
|
case "select":
|
|
1078
1078
|
default:
|
|
1079
1079
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1080
|
-
|
|
1080
|
+
_chunkB2OHBIALcjs.Select,
|
|
1081
1081
|
{
|
|
1082
1082
|
fullWidth: true,
|
|
1083
1083
|
inputProps: { size: "sm", "aria-label": label },
|
|
@@ -1171,7 +1171,7 @@ function DataGridInner({
|
|
|
1171
1171
|
" selected"
|
|
1172
1172
|
] }),
|
|
1173
1173
|
canSelectAllMatching && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1174
|
-
|
|
1174
|
+
_chunkXPG56DLQcjs.Button,
|
|
1175
1175
|
{
|
|
1176
1176
|
variant: "text",
|
|
1177
1177
|
size: "sm",
|
|
@@ -1180,12 +1180,12 @@ function DataGridInner({
|
|
|
1180
1180
|
children: `Select all ${totalItemCount}`
|
|
1181
1181
|
}
|
|
1182
1182
|
),
|
|
1183
|
-
hasSelectedAllMatching && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1183
|
+
hasSelectedAllMatching && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXPG56DLQcjs.Button, { variant: "text", size: "sm", color: "secondary", onClick: clearSelection, children: "Clear selection" }),
|
|
1184
1184
|
bulkActions && bulkActions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-datagrid-bulk-actions", children: bulkActions.map((action) => {
|
|
1185
1185
|
const isDisabled = typeof action.disabled === "function" ? action.disabled(selectedItems) : _nullishCoalesce(action.disabled, () => ( false));
|
|
1186
1186
|
if (action.type === "split-button") {
|
|
1187
1187
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1188
|
-
|
|
1188
|
+
_chunk7FV2X62Wcjs.SplitButton,
|
|
1189
1189
|
{
|
|
1190
1190
|
size: "sm",
|
|
1191
1191
|
variant: _nullishCoalesce(action.variant, () => ( "outlined")),
|
|
@@ -1206,7 +1206,7 @@ function DataGridInner({
|
|
|
1206
1206
|
);
|
|
1207
1207
|
}
|
|
1208
1208
|
return action.label ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1209
|
-
|
|
1209
|
+
_chunkXPG56DLQcjs.Button,
|
|
1210
1210
|
{
|
|
1211
1211
|
size: "sm",
|
|
1212
1212
|
variant: _nullishCoalesce(action.variant, () => ( "outlined")),
|
|
@@ -1219,7 +1219,7 @@ function DataGridInner({
|
|
|
1219
1219
|
},
|
|
1220
1220
|
action.id
|
|
1221
1221
|
) : action.icon ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1222
|
-
|
|
1222
|
+
_chunkXPG56DLQcjs.Button,
|
|
1223
1223
|
{
|
|
1224
1224
|
size: "sm",
|
|
1225
1225
|
variant: _nullishCoalesce(action.variant, () => ( "outlined")),
|
|
@@ -1235,12 +1235,12 @@ function DataGridInner({
|
|
|
1235
1235
|
] }),
|
|
1236
1236
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-datagrid-toolbar-right", children: [
|
|
1237
1237
|
showDensity && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1238
|
-
|
|
1238
|
+
_chunkVXC7Z7XBcjs.Dropdown,
|
|
1239
1239
|
{
|
|
1240
1240
|
placement: "bottom",
|
|
1241
1241
|
align: "end",
|
|
1242
1242
|
autoWidth: false,
|
|
1243
|
-
trigger: isCompactToolbar ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1243
|
+
trigger: isCompactToolbar ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXPG56DLQcjs.Button, { variant: "text", size: "sm", icon: _lucidereact.AlignJustify, tooltip: "Density" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXPG56DLQcjs.Button, { variant: "text", size: "sm", preIcon: _lucidereact.AlignJustify, children: "Density" }),
|
|
1244
1244
|
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-table-menu-panel", children: [
|
|
1245
1245
|
{ value: "compact", label: "Compact" },
|
|
1246
1246
|
{ value: "comfortable", label: "Comfortable" },
|
|
@@ -1263,7 +1263,7 @@ function DataGridInner({
|
|
|
1263
1263
|
}
|
|
1264
1264
|
),
|
|
1265
1265
|
showFilters && filterDropdownColumns.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1266
|
-
|
|
1266
|
+
_chunk544RAXWOcjs.TableFiltersDropdown,
|
|
1267
1267
|
{
|
|
1268
1268
|
columns: filterDropdownColumns,
|
|
1269
1269
|
filters: dropdownFilters,
|
|
@@ -1271,7 +1271,7 @@ function DataGridInner({
|
|
|
1271
1271
|
}
|
|
1272
1272
|
),
|
|
1273
1273
|
onRowAdd && (isCompactToolbar ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1274
|
-
|
|
1274
|
+
_chunkXPG56DLQcjs.Button,
|
|
1275
1275
|
{
|
|
1276
1276
|
variant: "outlined",
|
|
1277
1277
|
size: "sm",
|
|
@@ -1279,7 +1279,7 @@ function DataGridInner({
|
|
|
1279
1279
|
tooltip: "Add row",
|
|
1280
1280
|
onClick: handleRowAdd
|
|
1281
1281
|
}
|
|
1282
|
-
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1282
|
+
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXPG56DLQcjs.Button, { variant: "outlined", size: "sm", preIcon: _lucidereact.Plus, onClick: handleRowAdd, children: "Add row" }))
|
|
1283
1283
|
] })
|
|
1284
1284
|
] }),
|
|
1285
1285
|
isCardView ? (
|
|
@@ -1374,7 +1374,7 @@ function DataGridInner({
|
|
|
1374
1374
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SearchX, {}),
|
|
1375
1375
|
title: "No results found",
|
|
1376
1376
|
description: "Try adjusting your filters or search terms.",
|
|
1377
|
-
action: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1377
|
+
action: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXPG56DLQcjs.Button, { size: "sm", variant: "outlined", color: "primary", onClick: clearAllFilters, children: "Clear filters" }),
|
|
1378
1378
|
size: "sm"
|
|
1379
1379
|
}
|
|
1380
1380
|
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
@@ -1389,10 +1389,10 @@ function DataGridInner({
|
|
|
1389
1389
|
}
|
|
1390
1390
|
)
|
|
1391
1391
|
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1392
|
-
|
|
1392
|
+
_chunk544RAXWOcjs.DndContext,
|
|
1393
1393
|
{
|
|
1394
1394
|
sensors,
|
|
1395
|
-
collisionDetection:
|
|
1395
|
+
collisionDetection: _chunk544RAXWOcjs.closestCenter,
|
|
1396
1396
|
onDragEnd: handleRowDragEnd,
|
|
1397
1397
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-data-grid-scroll", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "table", { className: ["eidos-data-grid", densityClass].filter(Boolean).join(" "), children: [
|
|
1398
1398
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "thead", { ref: theadRef, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "tr", { children: [
|
|
@@ -1499,7 +1499,7 @@ function DataGridInner({
|
|
|
1499
1499
|
}
|
|
1500
1500
|
)
|
|
1501
1501
|
] }) }),
|
|
1502
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "tbody", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1502
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "tbody", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk544RAXWOcjs.SortableContext, { items: rowIds, strategy: _chunk544RAXWOcjs.verticalListSortingStrategy, children: displayData.length > 0 ? displayData.map((row, displayIndex) => {
|
|
1503
1503
|
const localIndex = localData.indexOf(row);
|
|
1504
1504
|
const rowKeyValue = String(_nullishCoalesce(cellOf(row, rowKeyField), () => ( displayIndex)));
|
|
1505
1505
|
const isRowSelected = selectable && selectedSet.has(rowKeyValue);
|
|
@@ -1668,7 +1668,7 @@ function DataGridInner({
|
|
|
1668
1668
|
title: "No results found",
|
|
1669
1669
|
description: "Try adjusting your filters or search terms.",
|
|
1670
1670
|
action: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1671
|
-
|
|
1671
|
+
_chunkXPG56DLQcjs.Button,
|
|
1672
1672
|
{
|
|
1673
1673
|
size: "sm",
|
|
1674
1674
|
variant: "outlined",
|
|
@@ -1694,7 +1694,7 @@ function DataGridInner({
|
|
|
1694
1694
|
}
|
|
1695
1695
|
) }),
|
|
1696
1696
|
showPagination && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-datagrid-footer", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1697
|
-
|
|
1697
|
+
_chunk6IB27I5Kcjs.Pagination,
|
|
1698
1698
|
{
|
|
1699
1699
|
page: currentPage,
|
|
1700
1700
|
totalPages,
|
|
@@ -1725,4 +1725,4 @@ var DataGrid = Object.assign(DataGridInner, { displayName: "DataGrid" });
|
|
|
1725
1725
|
|
|
1726
1726
|
|
|
1727
1727
|
exports.DataGrid = DataGrid;
|
|
1728
|
-
//# sourceMappingURL=chunk-
|
|
1728
|
+
//# sourceMappingURL=chunk-HLI4SOH3.cjs.map
|