diff --git a/.env b/.env index 4e6071292..557e9097e 100644 --- a/.env +++ b/.env @@ -3,15 +3,16 @@ VITE_LIGHT_THEME="accent:#FC560E,neutral-950:#FAFAFA,neutral-900:#FAFAFA,neutral VITE_DVM_RELAYS=wss://relay.damus.io,wss://offchain.pub,wss://relay.f7z.io,wss://nos.lol,wss://relay.nostr.net,wss://relay.nostr.band,wss://bucket.coracle.social VITE_SEARCH_RELAYS=wss://relay.nostr.band,wss://nostr.wine,wss://search.nos.today VITE_DEFAULT_RELAYS=wss://relay.damus.io,wss://nos.lol +VITE_SIGNER_RELAYS=wss://relay.nsec.app,wss://bucket.coracle.social VITE_INDEXER_RELAYS=wss://relay.nostr.band,wss://purplepag.es,wss://relay.damus.io -VITE_DEFAULT_FOLLOWS=fe7f6bc6f7338b76bbf80db402ade65953e20b2f23e66e898204b63cc42539a3,f4db5270bd991b17bea1e6d035f45dee392919c29474bbac10342d223c74e0d0,180a6d42c7d64f8c3958d9d10dd5a4117eaaacea8e7f980781e9a53136cf5693,7bdef7be22dd8e59f4600e044aa53a1cf975a9dc7d27df5833bc77db784a5805,676ffea2ec31426a906d7795d7ebae2ba5e61f0b9fa815995b4a299dd085d510,4d5ce768123563bc583697db5e84841fb528f7b708d966f2e546286ce3c72077,eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f,04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9,85080d3bad70ccdcd7f74c29a44f55bb85cbcd3dd0cbb957da1d215bdb931204,74ffc51cc30150cf79b6cb316d3a15cf332ab29a38fec9eb484ab1551d6d1856,93518f91dfa51d8acf39217cdcd3d2ccd178433cb9e72368544aacd7412cb50c,f728d9e6e7048358e70930f5ca64b097770d989ccd86854fe618eda9c8a38106,91c9a5e1a9744114c6fe2d61ae4de82629eaaa0fb52f48288093c7e7e036f832,83e818dfbeccea56b0f551576b3fd39a7a50e1d8159343500368fa085ccd964b,090254801a7e8e5085b02e711622f0dfa1a85503493af246aa42af08f5e4d2df,472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e,7b3f7803750746f455413a221f80965eecb69ef308f2ead1da89cc2c8912e968,330fb1431ff9d8c250706bbcdc016d5495a3f744e047a408173e92ae7ee42dac,c4eabae1be3cf657bc1855ee05e69de9f059cb7a059227168b80b89761cbc4e0,a4cb51f4618cfcd16b2d3171c466179bed8e197c43b8598823b04de266cef110,f9acb0b034c4c1177e985f14639f317ef0fedee7657c060b146ee790024317ec,6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93,e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411,6389be6491e7b693e9f368ece88fcd145f07c068d2c1bbae4247b9b5ef439d32,e1ff3bfdd4e40315959b08b4fcc8245eaa514637e1d4ec2ae166b743341be1af,38dbb9b07d93861d40620ad62d44b1a8e8785df0997eeb4454f12d217048cd5c,064de2497ce621aee2a5b4b926a08b1ca01bce9da85b0c714e883e119375140c,aa5e6ccfc7cb7c3431d12b0ea4b83e5b35427602522080a6a8618950527f811b,97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322,676ffea2ec31426a906d7795d7ebae2ba5e61f0b9fa815995b4a299dd085d510,f783ba3b12b91e375aba6594015b90bd95f7e132b03cc8c4c52ce0a7c36aab52,ffca54e078fd9884a745d70eb0159c0b8a9e7d383a4906a7484b83ebf6101dd5,9a4acdeb978565e27490dca65c83e9f65745eaec1d9a0405a52d198c1489913b,e5177ebf513530c2d0924083b64b7eadd7fb85efcc3e4dfb55c73a924c901ca7,5b0183ab6c3e322bf4d41c6b3aef98562a144847b7499543727c5539a114563e,958b754a1d3de5b5eca0fe31d2d555f451325f8498a83da1997b7fcd5c39e88c,5c508c34f58866ec7341aaf10cc1af52e9232bb9f859c8103ca5ecf2aa93bf78,26bd32c67232bdf16d05e763ec67d883015eb99fd1269025224c20c6cfdb0158,d307643547703537dfdef811c3dea96f1f9e84c8249e200353425924a9908cf8,604e96e099936a104883958b040b47672e0f048c98ac793f37ffe4c720279eb2,90b9bec74789688e515125596ab6350bfe646176ac75742275063922c5fea010,baf27a4cc4da49913e7fdecc951fd3b971c9279959af62b02b761a043c33384c,2edbcea694d164629854a52583458fd6d965b161e3c48b57d3aff01940558884,82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2,66bd8fed3590f2299ef0128f58d67879289e6a99a660e83ead94feab7606fd17,eeb11961b25442b16389fe6c7ebea9adf0ac36dd596816ea7119e521b8821b9e,61066504617ee79387021e18c89fb79d1ddbc3e7bff19cf2298f40466f8715e9,1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411,a9434ee165ed01b286becfc2771ef1705d3537d051b387288898cc00d5c885be,ee6ea13ab9fe5c4a68eaf9b1a34fe014a66b40117c50ee2a614f4cda959b6e74,7bdef7be22dd8e59f4600e044aa53a1cf975a9dc7d27df5833bc77db784a5805,1577e4599dd10c863498fe3c20bd82aafaf829a595ce83c5cf8ac3463531b09b,1739d937dc8c0c7370aa27585938c119e25c41f6c441a5d34c6d38503e3136ef,fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52,cc8d072efdcc676fcbac14f6cd6825edc3576e55eb786a2a975ee034a6a026cb,d91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075,3335d373e6c1b5bc669b4b1220c08728ea8ce622e5a7cfeeb4c0001d91ded1de,0b118e40d6f3dfabb17f21a94a647701f140d8b063a9e84fe6e483644edc09cb,b83a28b7e4e5d20bd960c5faeb6625f95529166b8bdb045d42634a2f35919450,958b754a1d3de5b5eca0fe31d2d555f451325f8498a83da1997b7fcd5c39e88c,a4cb51f4618cfcd16b2d3171c466179bed8e197c43b8598823b04de266cef110,e56e7b4326618f3d626c0e398f5082c3b16732e469e0a048b7ddb544c2be294a,011c1b374c12fbd3633e98957d3c46bed67983abecef50706c73a77c171d0d2c,b9e76546ba06456ed301d9e52bc49fa48e70a6bf2282be7a1ae72947612023dc,b708f7392f588406212c3882e7b3bc0d9b08d62f95fa170d099127ece2770e5e,5c508c34f58866ec7341aaf10cc1af52e9232bb9f859c8103ca5ecf2aa93bf78,baf27a4cc4da49913e7fdecc951fd3b971c9279959af62b02b761a043c33384c,2edbcea694d164629854a52583458fd6d965b161e3c48b57d3aff01940558884,0fecf65daa26faf3f668e8143325a4c199a040b6345ed40a08614d7dd85b1823,1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411,f783ba3b12b91e375aba6594015b90bd95f7e132b03cc8c4c52ce0a7c36aab52,3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24,82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2,3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d,ee11a5dff40c19a555f41fe42b48f00e618c91225622ae37b6c2bb67b76c4e49,eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f,58c741aa630c2da35a56a77c1d05381908bd10504fdd2d8b43f725efa6d23196,84dee6e676e5bb67b4ad4e042cf70cbd8681155db535942fcc6a0533858a7240,33bd77e5394520747faae1394a4af5fa47f404389676375b6dc7be865ed81452,21335073401a310cc9179fe3a77e9666710cfdf630dfd840f972c183a244b1ad,36732cc35fe56185af1b11160a393d6c73a1fe41ddf1184c10394c28ca5d627b,3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d,fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52,32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245,63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed,97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322,00000000827ffaa94bfea288c3dfce4422c794fbb96625b6b31e9049f729d700,3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24,e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411,82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2,e8ed3798c6ffebffa08501ac39e271662bfd160f688f94c45d692d8767dd345a,c5fb6ecc876e0458e3eca9918e370cbcd376901c58460512fe537a46e58c38bb,40b9c85fffeafc1cadf8c30a4e5c88660ff6e4971a0dc723d5ab674b5e61b451,a3eb29554bd27fca7f53f66272e4bb59d066f2f31708cf341540cb4729fbd841,460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c,b154080cb49639bb079a6a53c1d98e7130eeab3c61aa95dd9e38f9e400027cc7,0000005f87f64341c212cc93d6c266c03ae752c02660e78a6da1424f7b05c470,d61f3bc5b3eb4400efdae6169a5c17cabf3246b514361de939ce4a1a0da6ef4a,1739d937dc8c0c7370aa27585938c119e25c41f6c441a5d34c6d38503e3136ef,7adb520c3ac7cb6dc8253508df0ce1d975da49fefda9b5c956744a049d230ace,3335d373e6c1b5bc669b4b1220c08728ea8ce622e5a7cfeeb4c0001d91ded1de,266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5,17717ad4d20e2a425cda0a2195624a0a4a73c4f6975f16b1593fc87fa46f2d58,af9d70407464247d19fd243cf1bee81e6df1e639217dc66366bf37aa42d05d35,ddf03aca85ade039e6742d5bef3df352df199d0d31e22b9858e7eda85cb3bbbe,d36e8083fa7b36daee646cb8b3f99feaa3d89e5a396508741f003e21ac0b6bec,7fa56f5d6962ab1e3cd424e758c3002b8665f7b0d8dcee9fe9e288d7751ac194,cc8d072efdcc676fcbac14f6cd6825edc3576e55eb786a2a975ee034a6a026cb,d91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075,3d842afecd5e293f28b6627933704a3fb8ce153aa91d790ab11f6a752d44a42d,79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6,17538dc2a62769d09443f18c37cbe358fab5bbf981173542aa7c5ff171ed77c4,ff27d01cb1e56fb58580306c7ba76bb037bf211c5b573c56e4e70ca858755af0,8fb140b4e8ddef97ce4b821d247278a1a4353362623f64021484b372f948000c,27797bd4e5ee52db0a197668c92b9a3e7e237e1f9fa73a10c38d731c294cfc9a,7cc328a08ddb2afdf9f9be77beff4c83489ff979721827d628a542f32a247c0e,c35ff8c340449f0d68af1aec4844bb44a9c0b8c1dd4f4d4efbc65e12039a348a,1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411,fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52,3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d,0b118e40d6f3dfabb17f21a94a647701f140d8b063a9e84fe6e483644edc09cb,2edbcea694d164629854a52583458fd6d965b161e3c48b57d3aff01940558884,1739d937dc8c0c7370aa27585938c119e25c41f6c441a5d34c6d38503e3136ef,eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f,dace63b00c42e6e017d00dd190a9328386002ff597b841eb5ef91de4f1ce8491,76c71aae3a491f1d9eec47cba17e229cda4113a0bbb6e6ae1776d7643e29cafa,266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5,d91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075 +VITE_DEFAULT_FOLLOWS=fe7f6bc6f7338b76bbf80db402ade65953e20b2f23e66e898204b63cc42539a3,f4db5270bd991b17bea1e6d035f45dee392919c29474bbac10342d223c74e0d0,180a6d42c7d64f8c3958d9d10dd5a4117eaaacea8e7f980781e9a53136cf5693,7bdef7be22dd8e59f4600e044aa53a1cf975a9dc7d27df5833bc77db784a5805,676ffea2ec31426a906d7795d7ebae2ba5e61f0b9fa815995b4a299dd085d510,4d5ce768123563bc583697db5e84841fb528f7b708d966f2e546286ce3c72077,eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f,04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9,85080d3bad70ccdcd7f74c29a44f55bb85cbcd3dd0cbb957da1d215bdb931204,74ffc51cc30150cf79b6cb316d3a15cf332ab29a38fec9eb484ab1551d6d1856,93518f91dfa51d8acf39217cdcd3d2ccd178433cb9e72368544aacd7412cb50c,f728d9e6e7048358e70930f5ca64b097770d989ccd86854fe618eda9c8a38106,91c9a5e1a9744114c6fe2d61ae4de82629eaaa0fb52f48288093c7e7e036f832,83e818dfbeccea56b0f551576b3fd39a7a50e1d8159343500368fa085ccd964b,090254801a7e8e5085b02e711622f0dfa1a85503493af246aa42af08f5e4d2df,472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e,7b3f7803750746f455413a221f80965eecb69ef308f2ead1da89cc2c8912e968,330fb1431ff9d8c250706bbcdc016d5495a3f744e047a408173e92ae7ee42dac,c4eabae1be3cf657bc1855ee05e69de9f059cb7a059227168b80b89761cbc4e0,a4cb51f4618cfcd16b2d3171c466179bed8e197c43b8598823b04de266cef110,f9acb0b034c4c1177e985f14639f317ef0fedee7657c060b146ee790024317ec,6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93,e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411,6389be6491e7b693e9f368ece88fcd145f07c068d2c1bbae4247b9b5ef439d32,e1ff3bfdd4e40315959b08b4fcc8245eaa514637e1d4ec2ae166b743341be1af,38dbb9b07d93861d40620ad62d44b1a8e8785df0997eeb4454f12d217048cd5c,064de2497ce621aee2a5b4b926a08b1ca01bce9da85b0c714e883e119375140c,aa5e6ccfc7cb7c3431d12b0ea4b83e5b35427602522080a6a8618950527f811b,97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322,676ffea2ec31426a906d7795d7ebae2ba5e61f0b9fa815995b4a299dd085d510,f783ba3b12b91e375aba6594015b90bd95f7e132b03cc8c4c52ce0a7c36aab52,9a4acdeb978565e27490dca65c83e9f65745eaec1d9a0405a52d198c1489913b,e5177ebf513530c2d0924083b64b7eadd7fb85efcc3e4dfb55c73a924c901ca7,5b0183ab6c3e322bf4d41c6b3aef98562a144847b7499543727c5539a114563e,958b754a1d3de5b5eca0fe31d2d555f451325f8498a83da1997b7fcd5c39e88c,5c508c34f58866ec7341aaf10cc1af52e9232bb9f859c8103ca5ecf2aa93bf78,26bd32c67232bdf16d05e763ec67d883015eb99fd1269025224c20c6cfdb0158,d307643547703537dfdef811c3dea96f1f9e84c8249e200353425924a9908cf8,604e96e099936a104883958b040b47672e0f048c98ac793f37ffe4c720279eb2,90b9bec74789688e515125596ab6350bfe646176ac75742275063922c5fea010,baf27a4cc4da49913e7fdecc951fd3b971c9279959af62b02b761a043c33384c,2edbcea694d164629854a52583458fd6d965b161e3c48b57d3aff01940558884,82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2,66bd8fed3590f2299ef0128f58d67879289e6a99a660e83ead94feab7606fd17,eeb11961b25442b16389fe6c7ebea9adf0ac36dd596816ea7119e521b8821b9e,61066504617ee79387021e18c89fb79d1ddbc3e7bff19cf2298f40466f8715e9,1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411,a9434ee165ed01b286becfc2771ef1705d3537d051b387288898cc00d5c885be,ee6ea13ab9fe5c4a68eaf9b1a34fe014a66b40117c50ee2a614f4cda959b6e74,7bdef7be22dd8e59f4600e044aa53a1cf975a9dc7d27df5833bc77db784a5805,1577e4599dd10c863498fe3c20bd82aafaf829a595ce83c5cf8ac3463531b09b,1739d937dc8c0c7370aa27585938c119e25c41f6c441a5d34c6d38503e3136ef,fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52,cc8d072efdcc676fcbac14f6cd6825edc3576e55eb786a2a975ee034a6a026cb,d91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075,3335d373e6c1b5bc669b4b1220c08728ea8ce622e5a7cfeeb4c0001d91ded1de,0b118e40d6f3dfabb17f21a94a647701f140d8b063a9e84fe6e483644edc09cb,b83a28b7e4e5d20bd960c5faeb6625f95529166b8bdb045d42634a2f35919450,958b754a1d3de5b5eca0fe31d2d555f451325f8498a83da1997b7fcd5c39e88c,a4cb51f4618cfcd16b2d3171c466179bed8e197c43b8598823b04de266cef110,e56e7b4326618f3d626c0e398f5082c3b16732e469e0a048b7ddb544c2be294a,011c1b374c12fbd3633e98957d3c46bed67983abecef50706c73a77c171d0d2c,b9e76546ba06456ed301d9e52bc49fa48e70a6bf2282be7a1ae72947612023dc,b708f7392f588406212c3882e7b3bc0d9b08d62f95fa170d099127ece2770e5e,5c508c34f58866ec7341aaf10cc1af52e9232bb9f859c8103ca5ecf2aa93bf78,baf27a4cc4da49913e7fdecc951fd3b971c9279959af62b02b761a043c33384c,2edbcea694d164629854a52583458fd6d965b161e3c48b57d3aff01940558884,0fecf65daa26faf3f668e8143325a4c199a040b6345ed40a08614d7dd85b1823,1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411,f783ba3b12b91e375aba6594015b90bd95f7e132b03cc8c4c52ce0a7c36aab52,3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24,82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2,3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d,ee11a5dff40c19a555f41fe42b48f00e618c91225622ae37b6c2bb67b76c4e49,eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f,58c741aa630c2da35a56a77c1d05381908bd10504fdd2d8b43f725efa6d23196,84dee6e676e5bb67b4ad4e042cf70cbd8681155db535942fcc6a0533858a7240,33bd77e5394520747faae1394a4af5fa47f404389676375b6dc7be865ed81452,21335073401a310cc9179fe3a77e9666710cfdf630dfd840f972c183a244b1ad,36732cc35fe56185af1b11160a393d6c73a1fe41ddf1184c10394c28ca5d627b,3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d,fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52,32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245,63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed,97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322,00000000827ffaa94bfea288c3dfce4422c794fbb96625b6b31e9049f729d700,3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24,e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411,82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2,e8ed3798c6ffebffa08501ac39e271662bfd160f688f94c45d692d8767dd345a,c5fb6ecc876e0458e3eca9918e370cbcd376901c58460512fe537a46e58c38bb,40b9c85fffeafc1cadf8c30a4e5c88660ff6e4971a0dc723d5ab674b5e61b451,a3eb29554bd27fca7f53f66272e4bb59d066f2f31708cf341540cb4729fbd841,460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c,0000005f87f64341c212cc93d6c266c03ae752c02660e78a6da1424f7b05c470,d61f3bc5b3eb4400efdae6169a5c17cabf3246b514361de939ce4a1a0da6ef4a,1739d937dc8c0c7370aa27585938c119e25c41f6c441a5d34c6d38503e3136ef,7adb520c3ac7cb6dc8253508df0ce1d975da49fefda9b5c956744a049d230ace,3335d373e6c1b5bc669b4b1220c08728ea8ce622e5a7cfeeb4c0001d91ded1de,266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5,17717ad4d20e2a425cda0a2195624a0a4a73c4f6975f16b1593fc87fa46f2d58,af9d70407464247d19fd243cf1bee81e6df1e639217dc66366bf37aa42d05d35,ddf03aca85ade039e6742d5bef3df352df199d0d31e22b9858e7eda85cb3bbbe,d36e8083fa7b36daee646cb8b3f99feaa3d89e5a396508741f003e21ac0b6bec,7fa56f5d6962ab1e3cd424e758c3002b8665f7b0d8dcee9fe9e288d7751ac194,cc8d072efdcc676fcbac14f6cd6825edc3576e55eb786a2a975ee034a6a026cb,d91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075,3d842afecd5e293f28b6627933704a3fb8ce153aa91d790ab11f6a752d44a42d,79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6,17538dc2a62769d09443f18c37cbe358fab5bbf981173542aa7c5ff171ed77c4,ff27d01cb1e56fb58580306c7ba76bb037bf211c5b573c56e4e70ca858755af0,8fb140b4e8ddef97ce4b821d247278a1a4353362623f64021484b372f948000c,27797bd4e5ee52db0a197668c92b9a3e7e237e1f9fa73a10c38d731c294cfc9a,7cc328a08ddb2afdf9f9be77beff4c83489ff979721827d628a542f32a247c0e,c35ff8c340449f0d68af1aec4844bb44a9c0b8c1dd4f4d4efbc65e12039a348a,1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411,fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52,3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d,0b118e40d6f3dfabb17f21a94a647701f140d8b063a9e84fe6e483644edc09cb,2edbcea694d164629854a52583458fd6d965b161e3c48b57d3aff01940558884,1739d937dc8c0c7370aa27585938c119e25c41f6c441a5d34c6d38503e3136ef,eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f,dace63b00c42e6e017d00dd190a9328386002ff597b841eb5ef91de4f1ce8491,76c71aae3a491f1d9eec47cba17e229cda4113a0bbb6e6ae1776d7643e29cafa,266815e0c9210dfa324c6cba3573b14bee49da4209a9456f9484e5106cd408a5,d91191e30e00444b942c0e82cad470b32af171764c2275bee0bd99377efd4075,7a3288f5b2a382317ddcbab9c0b6e9a22a999a064dfb9b7284508a0da3fa9114,6a72db8ef3f3b9ee5ecd808ed6d0631d1e4dda5c5dadf07887104d33957eba48 VITE_ONBOARDING_LISTS="30000:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:3121977322800018,30000:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:680038570738458,30000:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:33178290670580934,30000:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:49330924355910266,30000:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:9358486925304412,30000:97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322:3151213286926533" VITE_NIP96_URLS=https://nostr.build,https://nostrcheck.me,https://sove.rent,https://void.cat +VITE_BLOSSOM_URLS=https://cdn.satellite.earth,https://blossom.hzrd149.com,https://blossom.f7z.io,https://void.cat VITE_IMGPROXY_URL=https://imgproxy.coracle.social VITE_DUFFLEPUD_URL=https://dufflepud.onrender.com VITE_PLATFORM_ZAP_SPLIT=0 VITE_PLATFORM_PUBKEY=8ec86ac9e10979998652068ee6b00223b8e3265aabb3fe28fb6b3b6e294adc96 -VITE_FORCE_GROUP= VITE_PLATFORM_RELAYS= VITE_ENABLE_ZAPS=true VITE_APP_NAME=Coracle diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100755 new mode 100644 index 3c39d1f8f..0ad376d97 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - npm run check - diff --git a/CHANGELOG.md b/CHANGELOG.md index 02902785c..c867f8170 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,41 @@ # 0.4.16 -- [x] Switch to self-hosted analytics -- [x] Update profile detail page (@thibaut) +Contributors: @hodlbod, @dtonon, @thibaut + +- [x] Add richer description in wot popover +- [x] Use new nip46 implementation, re-design login experience +- [x] Re-design relay cards +- [x] Fix hud publish status +- [x] Default to dark theme +- [x] Fix loading inbox relay selections +- [x] Re-work onboarding +- [x] Fix timeouts for subscriptions +- [x] Stop storing ephemeral events in local relay +- [x] Limit created_at feed editing to absolute dates +- [x] Fix caching bug, improving performance +- [x] Use custom throttle function, improving performance +- [x] Improve direct message sending UX +- [x] Make follower count reactive +- [x] Improve HUD to include connection stats and searchable notices +- [x] Disable some navigation items for non-users +- [x] Re-design feed selector interface +- [x] Add suggestions for hashtags +- [x] Improve relay feed support +- [x] Add nostr: prefix to entities +- [x] Make inbox relay warnings more prominent +- [x] Use nostr-editor to power note composition dialog +- [x] Add delay-based undo for note creation and replies +- [x] Remove groups, markets, calendars +- [x] Fix missing replies in notifications +- [x] Allow deleting feeds from the feed edit dialog +- [x] Show error on failed zap +- [x] Improve gift-wrap unwrapping +- [x] Remove support for sending nip04 messages +- [x] Improve quote relay selection +- [x] Add blossom support with configurable servers +- [x] Re-write feed loader +- [x] Re-write relay selection logic # 0.4.15 diff --git a/README.md b/README.md index 4c100e789..04dfaacf8 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,6 @@ Coracle is intended to be fully white-labeled by groups of various kinds. The fo - `VITE_DUFFLEPUD_URL` is a [Dufflepud](https://github.com/coracle-social/dufflepud) instance url, which helps Coracle with things like link previews and image uploads. - `VITE_PLATFORM_ZAP_SPLIT` is a decimal between 0 and 1 defining the default zap split percent. - `VITE_PLATFORM_PUBKEY` is the pubkey of the platform owner. This gets zapped when using the platform zap split. -- `VITE_FORCE_GROUP` is an optional `kind:34550` or `kind:35834` address. If provided, the home page of Coracle will be the home page for the group, and most views will be filtered down to the group's scope. For user privacy, `VITE_PLATFORM_RELAYS` should also be set when using `VITE_FORCE_GROUP`. - `VITE_PLATFORM_RELAYS` is an optional comma-separated list of relay urls to use for feeds. If provided, most UI components related to relay selection will be hidden from the user. - `VITE_ENABLE_ZAPS` can be set to `false` to disable zaps. - `VITE_APP_NAME` is the app's name. diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml index c5d5899fd..f42ada656 100644 --- a/android/app/src/main/res/values/ic_launcher_background.xml +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ #FFFFFF - \ No newline at end of file + diff --git a/package-lock.json b/package-lock.json index 10d924085..ed7532589 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,28 +14,36 @@ "@capacitor/cli": "^6.1.2", "@capacitor/core": "^6.1.2", "@capacitor/ios": "^6.1.2", - "@event-calendar/core": "^3.6.2", - "@event-calendar/day-grid": "^3.6.2", - "@event-calendar/interaction": "^3.6.2", "@fortawesome/fontawesome-free": "^6.6.0", - "@getalby/bitcoin-connect": "^3.6.2", + "@getalby/bitcoin-connect": "^3.6.3", "@scure/base": "^1.1.9", "@sentry/browser": "^8.35.0", "@sentry/cli": "^2.38.1", "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@tiptap/extension-code": "^2.9.1", + "@tiptap/extension-code-block": "^2.9.1", + "@tiptap/extension-document": "^2.9.1", + "@tiptap/extension-dropcursor": "^2.9.1", + "@tiptap/extension-gapcursor": "^2.9.1", + "@tiptap/extension-hard-break": "^2.9.1", + "@tiptap/extension-history": "^2.9.1", + "@tiptap/extension-paragraph": "^2.9.1", + "@tiptap/extension-placeholder": "^2.9.1", + "@tiptap/extension-text": "^2.9.1", + "@tiptap/suggestion": "^2.9.1", "@tsconfig/svelte": "^5.0.4", "@types/ramda": "^0.30.2", "@types/throttle-debounce": "^5.0.2", "@vite-pwa/assets-generator": "^0.2.6", - "@welshman/app": "~0.0.19", - "@welshman/content": "~0.0.12", - "@welshman/dvm": "~0.0.10", - "@welshman/feeds": "~0.0.21", - "@welshman/lib": "~0.0.23", - "@welshman/net": "~0.0.29", - "@welshman/signer": "~0.0.9", - "@welshman/store": "~0.0.12", - "@welshman/util": "~0.0.42", + "@welshman/app": "~0.0.33", + "@welshman/content": "~0.0.13", + "@welshman/dvm": "~0.0.11", + "@welshman/feeds": "~0.0.26", + "@welshman/lib": "~0.0.30", + "@welshman/net": "~0.0.41", + "@welshman/signer": "~0.0.16", + "@welshman/store": "~0.0.13", + "@welshman/util": "~0.0.49", "autoprefixer": "^10.4.20", "bowser": "^2.11.0", "classnames": "^2.5.1", @@ -56,6 +64,7 @@ "insane": "^2.6.2", "marked": "^14.1.3", "normalize-url": "^8.0.1", + "nostr-editor": "^0.0.3", "nostr-signer-capacitor-plugin": "^0.0.3", "nostr-tools": "^2.8.1", "npm-run-all": "^4.1.5", @@ -75,6 +84,7 @@ "svelte-preprocess": "^6.0.3", "svelte-range-slider-pips": "^3.1.1", "svelte-switch": "^0.0.5", + "svelte-tiptap": "^1.1.3", "tailwindcss": "^3.4.14", "throttle-debounce": "^5.0.2", "tippy.js": "^6.3.7", @@ -123,9 +133,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", - "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", @@ -137,9 +147,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", - "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -185,12 +195,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", - "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.0", + "@babel/parser": "^7.26.2", "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", @@ -516,9 +526,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.0.tgz", - "integrity": "sha512-aP8x5pIw3xvYr/sXT+SEUwyhrXT8rUJRZltK/qN3Db80dcKpTett8cJxHyjk+xYSVXvNnl2SfcJVjbwxpOSscA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.26.0" @@ -1850,9 +1860,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz", - "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz", + "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==", "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -1870,7 +1880,7 @@ "performance-now": "^2.1.0", "qs": "6.13.0", "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", + "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -2301,16 +2311,19 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -2328,9 +2341,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2401,9 +2414,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", - "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", + "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", "license": "Apache-2.0", "dependencies": { "levn": "^0.4.1" @@ -2412,35 +2425,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@event-calendar/core": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@event-calendar/core/-/core-3.6.2.tgz", - "integrity": "sha512-DUSKtuhc49Uhjadk3sBQnB0ZaR8JeZnxcmA5xAN2Gv7HLNinXcUOPOwuraBeL25nASxGgAQ7kQxDSgv4EOxcmQ==", - "license": "MIT", - "dependencies": { - "svelte": "^4.2.19" - } - }, - "node_modules/@event-calendar/day-grid": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@event-calendar/day-grid/-/day-grid-3.6.2.tgz", - "integrity": "sha512-nDMipE8NhscXUgkE9u5+4cd0VEoJZ3oQOYhEFwp79UyWbqG20JMSWPSfss1Vju3y3lc80PgLTAedM3QbwgWOrg==", - "license": "MIT", - "dependencies": { - "@event-calendar/core": "~3.6.2", - "svelte": "^4.2.19" - } - }, - "node_modules/@event-calendar/interaction": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@event-calendar/interaction/-/interaction-3.6.2.tgz", - "integrity": "sha512-exxzgkAWLnusLfUwOpiqe9LFMIl7scOobEtgVq5fiDI7/NzLnLbGTU6H0eyipcEc2HG6nlAz2j3u0x4VO+wc+g==", - "license": "MIT", - "dependencies": { - "@event-calendar/core": "~3.6.2", - "svelte": "^4.2.19" - } - }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz", @@ -2451,22 +2435,22 @@ } }, "node_modules/@getalby/bitcoin-connect": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@getalby/bitcoin-connect/-/bitcoin-connect-3.6.2.tgz", - "integrity": "sha512-JttIpbKWbkS5WA62S2xHQ2I6Ld5azJi99BLVcgjJoM6szpE4tlSuZi+oASduG8XTFMsiQ1GU57nqfiVXrv9ZyA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@getalby/bitcoin-connect/-/bitcoin-connect-3.6.3.tgz", + "integrity": "sha512-mS3hmKGF8P7RH06DFtawc6T738iwz+wGz28XR46tMDKGfZjPrpcCG7R8Wy7n0w1JBgf7Nec79edQ5cDM1Pbrrw==", "license": "MIT", "dependencies": { - "@getalby/lightning-tools": "^5.0.3", - "@getalby/sdk": "^3.6.1", - "@lightninglabs/lnc-web": "^0.3.1-alpha", + "@getalby/lightning-tools": "^5.1.0", + "@getalby/sdk": "^3.8.0", + "@lightninglabs/lnc-web": "^0.3.2-alpha", "qrcode-generator": "^1.4.4", - "zustand": "^4.5.4" + "zustand": "^4.5.5" } }, "node_modules/@getalby/lightning-tools": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@getalby/lightning-tools/-/lightning-tools-5.1.0.tgz", - "integrity": "sha512-KhLnKu6hboNYxVmmegRi06ufW3J0o/5gZ5vMe4e94tKC1o8glN/fDn1fTL4hRIqgZjfzvDPPmV1A3YUkNtQttA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@getalby/lightning-tools/-/lightning-tools-5.1.1.tgz", + "integrity": "sha512-qiGWY7AMnQXywNlpEUTm/2u7Qx0C0qV0i3vlAV5ip8xV2quo4hkesHuAh6dBg/p3VC7t1fa9YUe9677hvQ3fVA==", "license": "MIT", "engines": { "node": ">=14" @@ -2477,13 +2461,13 @@ } }, "node_modules/@getalby/sdk": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@getalby/sdk/-/sdk-3.7.1.tgz", - "integrity": "sha512-fn/JrnH7NvD4Hu9REXQ8TLQVPN/BYnv0QcCO7L5M6gQg2Clndoj7JHn7CY/fX5BQq7d9jvfujeNrXgBJkEklnw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@getalby/sdk/-/sdk-3.8.1.tgz", + "integrity": "sha512-YjeiD3hId8DxuSm2eU9XPzuSb4ijF4tqmy1v42AWbjTsGXFERIt2NHqiJ4CnxvGPrmu9scxLwmKi3bJw8ln6NA==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.1", - "nostr-tools": "^1.17.0" + "emittery": "^1.0.3", + "nostr-tools": "2.9.4" }, "engines": { "node": ">=14" @@ -2493,77 +2477,22 @@ "url": "lightning:hello@getalby.com" } }, - "node_modules/@getalby/sdk/node_modules/@noble/ciphers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.2.0.tgz", - "integrity": "sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@getalby/sdk/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@getalby/sdk/node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@getalby/sdk/node_modules/nostr-tools": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.17.0.tgz", - "integrity": "sha512-LZmR8GEWKZeElbFV5Xte75dOeE9EFUW/QLI1Ncn3JKn0kFddDKEfBbFN8Mu4TMs+L4HR/WTPha2l+PPuRnJcMw==", - "license": "Unlicense", - "dependencies": { - "@noble/ciphers": "0.2.0", - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/base": "1.1.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@humanfs/core": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", - "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", - "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.0", + "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, "engines": { @@ -3353,18 +3282,18 @@ } }, "node_modules/@lightninglabs/lnc-core": { - "version": "0.3.1-alpha", - "resolved": "https://registry.npmjs.org/@lightninglabs/lnc-core/-/lnc-core-0.3.1-alpha.tgz", - "integrity": "sha512-I/hThdItLWJ6RU8Z27ZIXhpBS2JJuD3+TjtaQXX2CabaUYXlcN4sk+Kx8N/zG/fk8qZvjlRWum4vHu4ZX554Fg==", + "version": "0.3.2-alpha", + "resolved": "https://registry.npmjs.org/@lightninglabs/lnc-core/-/lnc-core-0.3.2-alpha.tgz", + "integrity": "sha512-H6tG+X9txCIdxTR+GPsbImzP2Juo+6Uvq/Ipaijd7xPISzgEU4J4GNE5PEHuIZqbnBo1RmpuXnFG6dmsl3PTzQ==", "license": "MIT" }, "node_modules/@lightninglabs/lnc-web": { - "version": "0.3.1-alpha", - "resolved": "https://registry.npmjs.org/@lightninglabs/lnc-web/-/lnc-web-0.3.1-alpha.tgz", - "integrity": "sha512-yL5SgBkl6kd6ISzJHGlSN7TXbiDoo1pfGvTOIdVWYVyXtEeW8PT+x6YGOmyQXGFT2OOf7fC7PfP9VnskDPuFaA==", + "version": "0.3.2-alpha", + "resolved": "https://registry.npmjs.org/@lightninglabs/lnc-web/-/lnc-web-0.3.2-alpha.tgz", + "integrity": "sha512-3aCBugBf0NzczpJqmHn03Oq2Ju9W5n0+nOdAe+Y/Zhf6YLXdqG1PTJ2J+7TXncpiogfPYDCw95tVQqSi4Zi/ZA==", "license": "MIT", "dependencies": { - "@lightninglabs/lnc-core": "0.3.1-alpha", + "@lightninglabs/lnc-core": "0.3.2-alpha", "crypto-js": "4.2.0" } }, @@ -3478,6 +3407,12 @@ "prettier": ">=2.4.0" } }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "peer": true + }, "node_modules/@rollup/plugin-inject": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", @@ -3593,9 +3528,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", + "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==", "cpu": [ "arm" ], @@ -3606,9 +3541,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz", + "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==", "cpu": [ "arm64" ], @@ -3619,9 +3554,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz", + "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==", "cpu": [ "arm64" ], @@ -3632,9 +3567,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz", + "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==", "cpu": [ "x64" ], @@ -3644,10 +3579,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz", + "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz", + "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz", + "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==", "cpu": [ "arm" ], @@ -3658,9 +3619,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz", + "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==", "cpu": [ "arm" ], @@ -3671,9 +3632,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz", + "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==", "cpu": [ "arm64" ], @@ -3684,9 +3645,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz", + "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==", "cpu": [ "arm64" ], @@ -3697,9 +3658,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz", + "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==", "cpu": [ "ppc64" ], @@ -3710,9 +3671,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz", + "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==", "cpu": [ "riscv64" ], @@ -3723,9 +3684,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz", + "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==", "cpu": [ "s390x" ], @@ -3736,9 +3697,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz", + "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==", "cpu": [ "x64" ], @@ -3749,9 +3710,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz", + "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==", "cpu": [ "x64" ], @@ -3762,9 +3723,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz", + "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==", "cpu": [ "arm64" ], @@ -3775,9 +3736,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz", + "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==", "cpu": [ "ia32" ], @@ -3788,9 +3749,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz", + "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==", "cpu": [ "x64" ], @@ -3852,7 +3813,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.35.0.tgz", "integrity": "sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==", - "license": "MIT", "dependencies": { "@sentry/core": "8.35.0", "@sentry/types": "8.35.0", @@ -3866,7 +3826,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.35.0.tgz", "integrity": "sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==", - "license": "MIT", "dependencies": { "@sentry/core": "8.35.0", "@sentry/types": "8.35.0", @@ -3880,7 +3839,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.35.0.tgz", "integrity": "sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==", - "license": "MIT", "dependencies": { "@sentry-internal/browser-utils": "8.35.0", "@sentry/core": "8.35.0", @@ -3895,7 +3853,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.35.0.tgz", "integrity": "sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==", - "license": "MIT", "dependencies": { "@sentry-internal/replay": "8.35.0", "@sentry/core": "8.35.0", @@ -3910,7 +3867,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.35.0.tgz", "integrity": "sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==", - "license": "MIT", "dependencies": { "@sentry-internal/browser-utils": "8.35.0", "@sentry-internal/feedback": "8.35.0", @@ -4078,7 +4034,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.35.0.tgz", "integrity": "sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==", - "license": "MIT", "dependencies": { "@sentry/types": "8.35.0", "@sentry/utils": "8.35.0" @@ -4091,7 +4046,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.35.0.tgz", "integrity": "sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==", - "license": "MIT", "engines": { "node": ">=14.18" } @@ -4100,7 +4054,6 @@ "version": "8.35.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.35.0.tgz", "integrity": "sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==", - "license": "MIT", "dependencies": { "@sentry/types": "8.35.0" }, @@ -4168,6 +4121,251 @@ "vite": "^5.0.0" } }, + "node_modules/@tiptap/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.8.0.tgz", + "integrity": "sha512-xsqDI4BNzYRWRtBq7+/38ThhqEr7uG9Njip1x+9/wgR3vWPBFnBkYJTz6jSxS35NRE6BSnERm4/B/vrLuY1Hdw==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.9.1.tgz", + "integrity": "sha512-DWUF6NG08/bZDWw0jCeotSTvpkyqZTi4meJPomG9Wzs/Ol7mEwlNCsCViD999g0+IjyXFatBk4DfUq1YDDu++Q==", + "peer": true, + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.9.1.tgz", + "integrity": "sha512-WQqcVGe7i/E+yO3wz5XQteU1ETNZ00euUEl4ylVVmH2NM4Dh0KDjEhbhHlCM0iCfLUo7jhjC7dmS+hMdPUb+Tg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.9.1.tgz", + "integrity": "sha512-A/50wPWDqEUUUPhrwRKILP5gXMO5UlQ0F6uBRGYB9CEVOREam9yIgvONOnZVJtszHqOayjIVMXbH/JMBeq11/g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.9.1.tgz", + "integrity": "sha512-1a+HCoDPnBttjqExfYLwfABq8MYdiowhy/wp8eCxVb6KGFEENO53KapstISvPzqH7eOi+qRjBB1KtVYb/ZXicg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.9.1.tgz", + "integrity": "sha512-wJZspSmJRkDBtPkzFz1g7gvZOEOayk8s93UHsgbJxcV4VWHYleZ5XhT74sZunSjefNDm3qC6v2BSgLp3vNHVKQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.9.1.tgz", + "integrity": "sha512-MxZ7acNNsoNaKpetxfwi3Z11Bgrh0T2EJlCV77v9N1vWK38+st3H1WJanmLbPNtc2ocvhHJrz+DjDz3CWxQ9rQ==", + "peer": true, + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.9.1.tgz", + "integrity": "sha512-jsRBmX01vr+5H02GljiHMo0n5H1vzoMLmFarxe0Yq2d2l9G/WV2VWX2XnGliqZAYWd1bI0phs7uLQIN3mxGQTw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.9.1.tgz", + "integrity": "sha512-fCuaOD/b7nDjm47PZ58oanq7y4ccS2wjPh42Qm0B0yipu/1fmC8eS1SmaXmk28F89BLtuL6uOCtR1spe+lZtlQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.9.1.tgz", + "integrity": "sha512-wp9qR1NM+LpvyLZFmdNaAkDq0d4jDJ7z7Fz7icFQPu31NVxfQYO3IXNmvJDCNu8hFAbImpA5aG8MBuwzRo0H9w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-image": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.8.0.tgz", + "integrity": "sha512-5CReomgHGTUgxaX8P3i6qiC9VRWcWQgVoYtds4ZM52LVx/oGwMxQ4ECyzdVYKaRW+6PrNnAe6ew3Qpd5Wk0cIg==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.8.0.tgz", + "integrity": "sha512-p67hCG/pYCiOK/oCTPZnlkw9Ei7KJ7kCKFaluTcAmr5j8IBdYfDqSMDNCT4vGXBvKFh4X6xD7S7QvOqcH0Gn9A==", + "peer": true, + "dependencies": { + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.9.1.tgz", + "integrity": "sha512-JOmT0xd4gd3lIhLwrsjw8lV+ZFROKZdIxLi0Ia05XSu4RLrrvWj0zdKMSB+V87xOWfSB3Epo95zAvnPox5Q16A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-placeholder": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.9.1.tgz", + "integrity": "sha512-Q/w3OOg/C6jGBf4QKEWKF9k+iaCQCgPoaIg2IDTPx8QmaxRfgoVE5Csd+oTOY/brdmSNXOxykZWEci6OJP+MbA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.9.1.tgz", + "integrity": "sha512-3wo9uCrkLVLQFgbw2eFU37QAa1jq1/7oExa+FF/DVxdtHRS9E2rnUZ8s2hat/IWzvPUHXMwo3Zg2XfhoamQpCA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.8.0.tgz", + "integrity": "sha512-eMGpRooUMvKz/vOpnKKppApMSoNM325HxTdAJvTlVAmuHp5bOY5kyY1kfUlePRiVx1t1UlFcXs3kecFwkkBD3Q==", + "peer": true, + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.0", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.22.3", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.4.0", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.0", + "prosemirror-view": "^1.33.10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/suggestion": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.9.1.tgz", + "integrity": "sha512-MMxwpbtocxUsbmc8qtFY1AQYNTW5i/M4aNSv9zsKKRISaS5hMD7XVrw2eod0x0yEqZU3izLiPDZPmgr8glF+jQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, "node_modules/@trapezedev/gradle-parse": { "version": "7.0.10", "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", @@ -4293,6 +4491,28 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "peer": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "peer": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "peer": true + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -4300,9 +4520,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.0.tgz", - "integrity": "sha512-84rafSBHC/z1i1E3p0cJwKA+CfYDNSXX9WSZBRopjIzLET8oNt6ht2tei4C7izwDeEiLLfdeSVBv1egOH916hg==", + "version": "22.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.4.tgz", + "integrity": "sha512-SpNNxkftTJOPk0oN+y2bIqurEXHTA2AOZ3EJDDKeJ5VzkvvORSvmQXGQarcOzWV1ac7DCaPBEdMDxBsM+d8jWw==", "license": "MIT", "dependencies": { "undici-types": "~6.19.8" @@ -4376,16 +4596,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", - "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz", + "integrity": "sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==", "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/type-utils": "8.11.0", - "@typescript-eslint/utils": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/type-utils": "8.12.2", + "@typescript-eslint/utils": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -4409,15 +4629,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", - "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.12.2.tgz", + "integrity": "sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==", "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/typescript-estree": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/typescript-estree": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", "debug": "^4.3.4" }, "engines": { @@ -4437,13 +4657,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", - "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz", + "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0" + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4454,13 +4674,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", - "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz", + "integrity": "sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.11.0", - "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/typescript-estree": "8.12.2", + "@typescript-eslint/utils": "8.12.2", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -4478,9 +4698,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", - "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz", + "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4491,13 +4711,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", - "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz", + "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==", "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4543,15 +4763,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", - "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz", + "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/typescript-estree": "8.11.0" + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/typescript-estree": "8.12.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4565,12 +4785,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", - "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz", + "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/types": "8.12.2", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -4640,14 +4860,14 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", - "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", + "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -4655,21 +4875,20 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", - "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", + "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", + "@vitest/spy": "2.1.4", "estree-walker": "^3.0.3", - "magic-string": "^0.30.11" + "magic-string": "^0.30.12" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.3", - "msw": "^2.3.5", + "msw": "^2.4.9", "vite": "^5.0.0" }, "peerDependenciesMeta": { @@ -4682,9 +4901,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", - "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", + "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", "license": "MIT", "dependencies": { "tinyrainbow": "^1.2.0" @@ -4694,12 +4913,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", - "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", + "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.3", + "@vitest/utils": "2.1.4", "pathe": "^1.1.2" }, "funding": { @@ -4707,13 +4926,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", - "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", + "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "magic-string": "^0.30.11", + "@vitest/pretty-format": "2.1.4", + "magic-string": "^0.30.12", "pathe": "^1.1.2" }, "funding": { @@ -4721,25 +4940,25 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", - "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", + "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", - "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", + "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "loupe": "^3.1.1", + "@vitest/pretty-format": "2.1.4", + "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -4747,18 +4966,19 @@ } }, "node_modules/@welshman/app": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/@welshman/app/-/app-0.0.19.tgz", - "integrity": "sha512-uv5i6+Z3mm2cjTusbRHPYXy3bndefsBSfSYZ9lnAj8wRkvX7UPj5wgYbGim5IgEX8Y5r0SitnN5fICELCEcaCA==", - "license": "MIT", - "dependencies": { - "@welshman/dvm": "~0.0.10", - "@welshman/feeds": "~0.0.20", - "@welshman/lib": "~0.0.23", - "@welshman/net": "~0.0.29", - "@welshman/signer": "~0.0.9", - "@welshman/store": "~0.0.11", - "@welshman/util": "~0.0.42", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@welshman/app/-/app-0.0.33.tgz", + "integrity": "sha512-TtyeC/eysNV2hLuD1ST3KaSt1h9nes0Px1v+XP10eh4ckTJ1CE0Ee9Sb7JVTScUSfBuqs3SUX6GM7ZvuGmCnFg==", + "license": "MIT", + "dependencies": { + "@types/throttle-debounce": "^5.0.2", + "@welshman/dvm": "~0.0.11", + "@welshman/feeds": "~0.0.26", + "@welshman/lib": "~0.0.29", + "@welshman/net": "~0.0.41", + "@welshman/signer": "~0.0.16", + "@welshman/store": "~0.0.13", + "@welshman/util": "~0.0.48", "fuse.js": "^7.0.0", "idb": "^8.0.0", "svelte": "^4.2.18", @@ -4766,71 +4986,70 @@ } }, "node_modules/@welshman/content": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@welshman/content/-/content-0.0.12.tgz", - "integrity": "sha512-hdrZkHlDKJx8i8FdEJo4NFlBMRJWDkZHBYCBCbx77fcxPN8nJ2yKCl7bmIM51XwEFRrZMOQrmQswvYuOr8h1DQ==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@welshman/content/-/content-0.0.13.tgz", + "integrity": "sha512-03usB7VXE5w5Fm2+MfZOf3P1SiHBU8H4pWcv3xX439xWZ3LZlTS7WX9p4GwsfzX4iLCOLPNzEVNzw21JhLYSzA==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.2", + "@welshman/lib": "~0.0.28", "nostr-tools": "^2.7.2" } }, "node_modules/@welshman/dvm": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@welshman/dvm/-/dvm-0.0.10.tgz", - "integrity": "sha512-9MlwSmsFeczt+tirKWBenOaWRy1QzcXj0V4Ibc4O2ZdpGkybR3AI79uYLwAI+TG/pkEzHqY+1i7OXfjhBXqlyw==", + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@welshman/dvm/-/dvm-0.0.11.tgz", + "integrity": "sha512-V/DPk3wCZhqa1NBWrb2Zcml+kkEKIdW9ORC7s71A2/np1IR+y6Gh1StI5qQUXyEmh/igQocMp+U9tIDect6azg==", "license": "MIT", "dependencies": { - "@welshman/lib": "~0.0.21", - "@welshman/net": "~0.0.25", - "@welshman/util": "~0.0.37", + "@welshman/lib": "~0.0.29", + "@welshman/net": "~0.0.41", + "@welshman/util": "~0.0.48", "nostr-tools": "^2.7.2" } }, "node_modules/@welshman/feeds": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@welshman/feeds/-/feeds-0.0.21.tgz", - "integrity": "sha512-ssxHEQdYkXpSTBXL6NiXr+Cs7tat00K4ZS4YvoVIbV+PJgKW2e5NG6LKwZJUh7NzwVW+TjYUKlmiJQbGocTpFQ==", + "version": "0.0.26", + "resolved": "https://registry.npmjs.org/@welshman/feeds/-/feeds-0.0.26.tgz", + "integrity": "sha512-MuCuczWT8y/DJJxquqETzcCugtVRkbAPprKbN4uzV7he2+R0/kj6beZcM1qAFHY+PQ4cljnza7PJCOShZ163Ig==", "license": "MIT", "dependencies": { - "@welshman/lib": "~0.0.23", - "@welshman/util": "~0.0.42" + "@welshman/lib": "~0.0.27", + "@welshman/util": "~0.0.46" } }, "node_modules/@welshman/lib": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/@welshman/lib/-/lib-0.0.23.tgz", - "integrity": "sha512-BmY14Sc8FpR7ERMl7B6pOXzoo8C1ifYd+YXMKIJSJjd5jh3DasVIX7euioXkOtPR7YiNOwbuEexZVn39k/NQLw==", + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@welshman/lib/-/lib-0.0.30.tgz", + "integrity": "sha512-UeYFh9H3m7NfsokyaOeOCAdp4dg2uv20+XtkDxlaLVMMJDtuePBLJBYQJKuxMavGAJURr4pXt2Xna53hN/R5Lg==", "license": "MIT", "dependencies": { "@scure/base": "^1.1.6", "@types/events": "^3.0.3", - "@types/throttle-debounce": "^5.0.2", - "events": "^3.3.0", - "throttle-debounce": "^5.0.0" + "events": "^3.3.0" } }, "node_modules/@welshman/net": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@welshman/net/-/net-0.0.29.tgz", - "integrity": "sha512-2Gd793da/p+TwXoze0PAF3QFAi6D2UU0vLUnU4tfyLp3HRqJ2mjcxLgxrgZYJhIYxxGGtaYYd4KghekeFmgj3w==", + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/@welshman/net/-/net-0.0.41.tgz", + "integrity": "sha512-0NWF+H03dQNJP9q/2XQRfKDVWQXZxUksJSFm1V4OrlaMjeekg9SOkdmHlYDkiF+otMZYXr3OUkqktslm7I7c8Q==", "license": "MIT", "dependencies": { - "@welshman/lib": "~0.0.23", - "@welshman/util": "~0.0.40", + "@welshman/lib": "~0.0.29", + "@welshman/util": "~0.0.48", "isomorphic-ws": "^5.0.0", "ws": "^8.16.0" } }, "node_modules/@welshman/signer": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@welshman/signer/-/signer-0.0.9.tgz", - "integrity": "sha512-XaID2F+kGWDJRfW4bbW4ZBs+ilBqqdBfT8EYgLzRtA4NyT8cpPuUhm8v0av/DJONtTMfoEJg5ZR5JcxvPPqofA==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@welshman/signer/-/signer-0.0.16.tgz", + "integrity": "sha512-mztQBZotetvDbRGMbkdGJcciw7cPlY2n1YFEvd8hcUqnzD7cysXnuNPZgli1EbpUhtmlDwiGIcBFBVuzYdlTIA==", "license": "MIT", "dependencies": { - "@welshman/lib": "~0.0.22", - "@welshman/net": "~0.0.28", - "@welshman/util": "~0.0.37", + "@welshman/lib": "~0.0.28", + "@welshman/net": "~0.0.39", + "@welshman/util": "~0.0.46", "nostr-tools": "^2.7.2" }, "peerDependencies": { @@ -4838,23 +5057,23 @@ } }, "node_modules/@welshman/store": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@welshman/store/-/store-0.0.12.tgz", - "integrity": "sha512-69ONyeKOIG0Ba1tEoRPW4JnRaag7yargRS2WhXtyYsbfvQErivWBWLgM4wJz9Qovd+RxljssUswJfDHnZ2FCNQ==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@welshman/store/-/store-0.0.13.tgz", + "integrity": "sha512-yWHa9CTgdGzlTeGDOF6vmZ8V9ZUiF7yloxNvxe91NdxRymYdjoSExGIFsbgBxnj2RN6VDMkALdWLRrrTxNArBQ==", "license": "MIT", "dependencies": { - "@welshman/lib": "~0.0.23", - "@welshman/util": "~0.0.42", + "@welshman/lib": "~0.0.29", + "@welshman/util": "~0.0.48", "svelte": "^4.2.18" } }, "node_modules/@welshman/util": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@welshman/util/-/util-0.0.42.tgz", - "integrity": "sha512-pNMHZuORLsIdIsrM3mid5ESSdNgrzNHCrn1mF0XG1/g+ihKgfcAQwSburnoeWtgGiS4z9MqkcUPFkwwZ6LdWZg==", + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/@welshman/util/-/util-0.0.49.tgz", + "integrity": "sha512-KL3ep4vPaQybL2r6y4ee74TYZ5yezcEqcLB9wIqMKdqjMW9FJrP27a4bjC5yvsoWDANNC+DAr5Ism9bB7gVKdQ==", "license": "MIT", "dependencies": { - "@welshman/lib": "~0.0.23", + "@welshman/lib": "~0.0.30", "nostr-tools": "^2.7.2" } }, @@ -4871,15 +5090,16 @@ "version": "0.7.13", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version is no longer supported, please update to at least 0.8.*", "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5849,9 +6069,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001675", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001675.tgz", + "integrity": "sha512-/wV1bQwPrkLiQMjaJF5yUMVM/VdRPOCU8QZ+PmG6uW6DvYSrNY1bpwHI/3mOcUosLaJCzYDi5o91IQB51ft6cg==", "funding": [ { "type": "opencollective", @@ -6544,6 +6764,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "license": "MIT" }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "peer": true + }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -7299,9 +7525,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.45", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz", - "integrity": "sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw==", + "version": "1.5.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz", + "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==", "license": "ISC" }, "node_modules/elementtree": { @@ -7317,9 +7543,9 @@ } }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "license": "MIT", "dependencies": { "bn.js": "^4.11.9", @@ -7337,6 +7563,18 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "license": "MIT" }, + "node_modules/emittery": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.3.tgz", + "integrity": "sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7704,9 +7942,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -7720,9 +7958,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7732,14 +7970,14 @@ } }, "node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.12.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7805,12 +8043,6 @@ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "license": "MIT" }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -7874,6 +8106,15 @@ "node": ">=6" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -9917,6 +10158,25 @@ "node": ">= 0.8.0" } }, + "node_modules/light-bolt11-decoder": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.2.0.tgz", + "integrity": "sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ==", + "dependencies": { + "@scure/base": "1.1.1" + } + }, + "node_modules/light-bolt11-decoder/node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -9932,6 +10192,21 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "peer": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", + "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", + "peer": true + }, "node_modules/listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", @@ -10146,6 +10421,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "peer": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", + "peer": true + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/marked": { "version": "14.1.3", "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.3.tgz", @@ -10175,6 +10485,12 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "license": "CC0-1.0" }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "peer": true + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -10923,6 +11239,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/nostr-editor": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/nostr-editor/-/nostr-editor-0.0.3.tgz", + "integrity": "sha512-ODfwzebBRweaYt8l0pz8EbV4OqbEKZpDAVdoU+j7ubmfjhqIyk1PcQoikEZ8UasqkBcZjEQMAPl776F8nb55fQ==", + "dependencies": { + "light-bolt11-decoder": "^3.1.1" + }, + "engines": { + "node": ">=18.16.1" + }, + "peerDependencies": { + "@tiptap/core": "^2.6.6", + "@tiptap/extension-image": "^2.6.6", + "@tiptap/extension-link": "^2.6.6", + "@tiptap/pm": "^2.6.6", + "linkifyjs": "^4.1.3", + "nostr-tools": "^2.7.2", + "prosemirror-markdown": "^1.13.0", + "prosemirror-model": "^1.22.3", + "prosemirror-state": "^1.4.3", + "tiptap-markdown": "^0.8.10" + } + }, "node_modules/nostr-signer-capacitor-plugin": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/nostr-signer-capacitor-plugin/-/nostr-signer-capacitor-plugin-0.0.3.tgz", @@ -10933,9 +11272,9 @@ } }, "node_modules/nostr-tools": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.9.1.tgz", - "integrity": "sha512-QYK/M2eugK82dEriVGSzZCRn6Sbb88bxICA15wr+ebEULSACysZnDhNoCxdJyqZPva5x+Ql7h4JmEfpc6Ov2fQ==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.9.4.tgz", + "integrity": "sha512-Powumwkp+EWbdK1T8IsEX4daTLQhtWJvitfZ6OP2BdU1jJZvNlUp3SQB541UYw4uc9jgLbxZW6EZSdZoSfIygQ==", "license": "Unlicense", "dependencies": { "@noble/ciphers": "^0.5.1", @@ -11307,6 +11646,12 @@ "node": ">= 0.8.0" } }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "peer": true + }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -12082,18 +12427,207 @@ "node": ">=6" } }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", + "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", + "peer": true, + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.1.tgz", + "integrity": "sha512-tNy4uaGWzvuUYXDke7B28krndIrdQJhSh0OLpubtwtEwFbjItOj/eoAfPvstBJyyV0S2+b5t4G+4XPXdxar6pg==", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", + "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "peer": true, + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", + "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", + "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", + "peer": true, + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.20.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "peer": true, + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.23.0.tgz", + "integrity": "sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==", + "peer": true, + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", + "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.1.tgz", + "integrity": "sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.5.0.tgz", + "integrity": "sha512-VMx4zlYWm7aBlZ5xtfJHpqa3Xgu3b7srV54fXYnXgsAcIGRqKSrhiK3f89omzzgaAgAtDOV4ImXnLKhVfheVNQ==", + "peer": true, + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "peer": true, + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", + "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.34.3.tgz", + "integrity": "sha512-mKZ54PrX19sSaQye+sef+YjBbNu2voNwLS1ivb6aD2IRmxRGW64HU9B644+7OfJStGLyxvOreKqEgfvXa91WIA==", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, "node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", "license": "MIT" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" - }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -12139,6 +12673,15 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -12323,12 +12866,6 @@ "node": ">=0.4.x" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12686,9 +13223,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", - "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.0.2" @@ -12982,12 +13519,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "license": "ISC" }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -13072,9 +13603,9 @@ } }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", + "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -13087,25 +13618,33 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.24.3", + "@rollup/rollup-android-arm64": "4.24.3", + "@rollup/rollup-darwin-arm64": "4.24.3", + "@rollup/rollup-darwin-x64": "4.24.3", + "@rollup/rollup-freebsd-arm64": "4.24.3", + "@rollup/rollup-freebsd-x64": "4.24.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.3", + "@rollup/rollup-linux-arm-musleabihf": "4.24.3", + "@rollup/rollup-linux-arm64-gnu": "4.24.3", + "@rollup/rollup-linux-arm64-musl": "4.24.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3", + "@rollup/rollup-linux-riscv64-gnu": "4.24.3", + "@rollup/rollup-linux-s390x-gnu": "4.24.3", + "@rollup/rollup-linux-x64-gnu": "4.24.3", + "@rollup/rollup-linux-x64-musl": "4.24.3", + "@rollup/rollup-win32-arm64-msvc": "4.24.3", + "@rollup/rollup-win32-ia32-msvc": "4.24.3", + "@rollup/rollup-win32-x64-msvc": "4.24.3", "fsevents": "~2.3.2" } }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "peer": true + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -14314,9 +14853,9 @@ } }, "node_modules/svelte-range-slider-pips": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/svelte-range-slider-pips/-/svelte-range-slider-pips-3.1.1.tgz", - "integrity": "sha512-CaBczr0/egEr3ShYyFo3gDObZiYDEc7YBC35rQr8D2kWvisxCftE/+Znryk8YXva86Fq77tzQ4JeOfB+iUMjrg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/svelte-range-slider-pips/-/svelte-range-slider-pips-3.1.2.tgz", + "integrity": "sha512-pgbYeQ2ULtr01B0BoGL3+Mg0j9zbZab8MaFI0EESeiSP3vsKNwLAk29/14FBFJxryCkkmI69utVqsiOv/B15Nw==", "license": "MPL-2.0", "peerDependencies": { "svelte": "^4.0.0" @@ -14328,6 +14867,24 @@ "integrity": "sha512-nVKSoOlJe1DNiiOyK/oMkZQwEuDgEq1fNmAYd+724Se8eyN/2HRbYiyOvDpNRpw0jJ+lE5vjLHfCruFrhJQFbA==", "license": "MIT" }, + "node_modules/svelte-tiptap": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svelte-tiptap/-/svelte-tiptap-1.1.3.tgz", + "integrity": "sha512-Wx4d57SLC5bgx8/hOmdt28CflW17DbiqQWgv4pUUT1Z3o5u9lInNsY8OMQWx24EYPEUyzJsjxj2OejSEoKafcg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "peerDependencies": { + "@tiptap/core": "^2.0.3", + "@tiptap/extension-bubble-menu": "^2.0.3", + "@tiptap/extension-floating-menu": "^2.0.3", + "@tiptap/pm": "^2.0.3", + "svelte": "^4.0.1" + } + }, "node_modules/tailwindcss": { "version": "3.4.14", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", @@ -14713,6 +15270,64 @@ "@popperjs/core": "^2.9.0" } }, + "node_modules/tiptap-markdown": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/tiptap-markdown/-/tiptap-markdown-0.8.10.tgz", + "integrity": "sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ==", + "peer": true, + "workspaces": [ + "example" + ], + "dependencies": { + "@types/markdown-it": "^13.0.7", + "markdown-it": "^14.1.0", + "markdown-it-task-lists": "^2.1.1", + "prosemirror-markdown": "^1.11.1" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.3" + } + }, + "node_modules/tiptap-markdown/node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "peer": true + }, + "node_modules/tiptap-markdown/node_modules/@types/markdown-it": { + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.9.tgz", + "integrity": "sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw==", + "peer": true, + "dependencies": { + "@types/linkify-it": "^3", + "@types/mdurl": "^1" + } + }, + "node_modules/tiptap-markdown/node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "peer": true + }, + "node_modules/tldts": { + "version": "6.1.57", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.57.tgz", + "integrity": "sha512-Oy7yDXK8meJl8vPMOldzA+MtueAJ5BrH4l4HXwZuj2AtfoQbLjmTJmjNWPUcAo+E/ibHn7QlqMS0BOcXJFJyHQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.57" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.57", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.57.tgz", + "integrity": "sha512-lXnRhuQpx3zU9EONF9F7HfcRLvN1uRYUBIiKL+C/gehC/77XTU+Jye6ui86GA3rU6FjlJ0triD1Tkjt2F/2lEg==", + "license": "MIT" + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -14750,27 +15365,15 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=16" } }, "node_modules/tr46": { @@ -14798,9 +15401,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", "license": "MIT", "engines": { "node": ">=16" @@ -15029,14 +15632,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz", - "integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.12.2.tgz", + "integrity": "sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.11.0", - "@typescript-eslint/parser": "8.11.0", - "@typescript-eslint/utils": "8.11.0" + "@typescript-eslint/eslint-plugin": "8.12.2", + "@typescript-eslint/parser": "8.12.2", + "@typescript-eslint/utils": "8.12.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15051,6 +15654,12 @@ } } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "peer": true + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -15237,16 +15846,6 @@ "node": ">= 0.4" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -15384,13 +15983,13 @@ } }, "node_modules/vite-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", - "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", + "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.6", + "debug": "^4.3.7", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -15941,29 +16540,30 @@ } }, "node_modules/vitest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", - "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.3", - "@vitest/mocker": "2.1.3", - "@vitest/pretty-format": "^2.1.3", - "@vitest/runner": "2.1.3", - "@vitest/snapshot": "2.1.3", - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", - "debug": "^4.3.6", - "magic-string": "^0.30.11", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", + "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.4", + "@vitest/mocker": "2.1.4", + "@vitest/pretty-format": "^2.1.4", + "@vitest/runner": "2.1.4", + "@vitest/snapshot": "2.1.4", + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", "pathe": "^1.1.2", "std-env": "^3.7.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.0", - "tinypool": "^1.0.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.3", + "vite-node": "2.1.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -15978,8 +16578,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.3", - "@vitest/ui": "2.1.3", + "@vitest/browser": "2.1.4", + "@vitest/ui": "2.1.4", "happy-dom": "*", "jsdom": "*" }, @@ -16033,6 +16633,12 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "license": "MIT" }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "peer": true + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -16137,13 +16743,13 @@ "license": "MIT" }, "node_modules/workbox-background-sync": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz", - "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-background-sync/node_modules/idb": { @@ -16153,18 +16759,18 @@ "license": "ISC" }, "node_modules/workbox-broadcast-update": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz", - "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-build": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz", - "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", @@ -16189,21 +16795,21 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "7.1.0", - "workbox-broadcast-update": "7.1.0", - "workbox-cacheable-response": "7.1.0", - "workbox-core": "7.1.0", - "workbox-expiration": "7.1.0", - "workbox-google-analytics": "7.1.0", - "workbox-navigation-preload": "7.1.0", - "workbox-precaching": "7.1.0", - "workbox-range-requests": "7.1.0", - "workbox-recipes": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0", - "workbox-streams": "7.1.0", - "workbox-sw": "7.1.0", - "workbox-window": "7.1.0" + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" }, "engines": { "node": ">=16.0.0" @@ -16442,28 +17048,28 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz", - "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", - "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", "license": "MIT" }, "node_modules/workbox-expiration": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", - "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-expiration/node_modules/idb": { @@ -16473,102 +17079,102 @@ "license": "ISC" }, "node_modules/workbox-google-analytics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz", - "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", "license": "MIT", "dependencies": { - "workbox-background-sync": "7.1.0", - "workbox-core": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0" + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-navigation-preload": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz", - "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-precaching": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", - "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0" + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-range-requests": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz", - "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-recipes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz", - "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", "license": "MIT", "dependencies": { - "workbox-cacheable-response": "7.1.0", - "workbox-core": "7.1.0", - "workbox-expiration": "7.1.0", - "workbox-precaching": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0" + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-routing": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", - "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-strategies": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", - "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-streams": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz", - "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", "license": "MIT", "dependencies": { - "workbox-core": "7.1.0", - "workbox-routing": "7.1.0" + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" } }, "node_modules/workbox-sw": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz", - "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", "license": "MIT" }, "node_modules/workbox-window": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz", - "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "7.1.0" + "workbox-core": "7.3.0" } }, "node_modules/wrap-ansi": { diff --git a/package.json b/package.json index 341f43521..e4ac64c3e 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,12 @@ "release:android": "cap sync && cap build android --androidreleasetype APK --signing-type apksigner", "check:es": "eslint 'src/**/*.{js,ts,svelte}' --quiet", "check:ts": "svelte-check --tsconfig ./tsconfig.json --threshold error", - "check:fmt": "prettier --check $(git diff head --name-only --diff-filter d | grep -E '(js|ts|svelte)$' | xargs)", + "check:fmt": "git diff head --name-only --diff-filter d | grep -E '(js|ts|svelte)$' | xargs -r prettier --check", "check:errors": "run-s check:ts check:es", "check": "run-p check:errors check:fmt", - "format": "prettier --write $(git diff head --name-only --diff-filter d | grep -E '(js|ts|svelte)$' | xargs)", - "watch": "find src -type f | entr -r" + "format": "git diff head --name-only --diff-filter d | grep -E '(js|ts|svelte)$' | xargs -r prettier --write", + "watch": "find src -type f | entr -r", + "prepare": "husky" }, "dependencies": { "@capacitor/android": "^6.1.2", @@ -26,28 +27,36 @@ "@capacitor/cli": "^6.1.2", "@capacitor/core": "^6.1.2", "@capacitor/ios": "^6.1.2", - "@event-calendar/core": "^3.6.2", - "@event-calendar/day-grid": "^3.6.2", - "@event-calendar/interaction": "^3.6.2", "@fortawesome/fontawesome-free": "^6.6.0", - "@getalby/bitcoin-connect": "^3.6.2", + "@getalby/bitcoin-connect": "^3.6.3", "@scure/base": "^1.1.9", "@sentry/browser": "^8.35.0", "@sentry/cli": "^2.38.1", "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@tiptap/extension-code": "^2.9.1", + "@tiptap/extension-code-block": "^2.9.1", + "@tiptap/extension-document": "^2.9.1", + "@tiptap/extension-dropcursor": "^2.9.1", + "@tiptap/extension-gapcursor": "^2.9.1", + "@tiptap/extension-hard-break": "^2.9.1", + "@tiptap/extension-history": "^2.9.1", + "@tiptap/extension-paragraph": "^2.9.1", + "@tiptap/extension-placeholder": "^2.9.1", + "@tiptap/extension-text": "^2.9.1", + "@tiptap/suggestion": "^2.9.1", "@tsconfig/svelte": "^5.0.4", "@types/ramda": "^0.30.2", "@types/throttle-debounce": "^5.0.2", "@vite-pwa/assets-generator": "^0.2.6", - "@welshman/app": "~0.0.19", - "@welshman/content": "~0.0.12", - "@welshman/dvm": "~0.0.10", - "@welshman/feeds": "~0.0.21", - "@welshman/lib": "~0.0.23", - "@welshman/net": "~0.0.29", - "@welshman/signer": "~0.0.9", - "@welshman/store": "~0.0.12", - "@welshman/util": "~0.0.42", + "@welshman/app": "~0.0.33", + "@welshman/content": "~0.0.13", + "@welshman/dvm": "~0.0.11", + "@welshman/feeds": "~0.0.26", + "@welshman/lib": "~0.0.30", + "@welshman/net": "~0.0.41", + "@welshman/signer": "~0.0.16", + "@welshman/store": "~0.0.13", + "@welshman/util": "~0.0.49", "autoprefixer": "^10.4.20", "bowser": "^2.11.0", "classnames": "^2.5.1", @@ -68,6 +77,7 @@ "insane": "^2.6.2", "marked": "^14.1.3", "normalize-url": "^8.0.1", + "nostr-editor": "^0.0.3", "nostr-signer-capacitor-plugin": "^0.0.3", "nostr-tools": "^2.8.1", "npm-run-all": "^4.1.5", @@ -87,6 +97,7 @@ "svelte-preprocess": "^6.0.3", "svelte-range-slider-pips": "^3.1.1", "svelte-switch": "^0.0.5", + "svelte-tiptap": "^1.1.3", "tailwindcss": "^3.4.14", "throttle-debounce": "^5.0.2", "tippy.js": "^6.3.7", diff --git a/src/app.css b/src/app.css index d8d37b3e7..cf176eac5 100644 --- a/src/app.css +++ b/src/app.css @@ -92,6 +92,10 @@ body, -3px -3px 20px rgba(0, 0, 0, 0.1); } +.tippy-content { + padding: 0 !important; +} + .tippy-box[data-theme~="dark"][data-placement^="top"] > .tippy-arrow { bottom: -1px !important; } @@ -236,8 +240,43 @@ body, border: 1px solid var(--neutral-600); } -/* note content */ +/* nostr-editor */ +.tiptap { + outline: none; + min-height: 0; + height: 100%; +} + +.tiptap pre code { + @apply block max-w-full overflow-auto rounded bg-neutral-200 px-1 text-neutral-800 no-underline; +} + +.tiptap p code { + @apply link-content; +} -.note-content > a { +.tiptap, +[tag] { + @apply max-w-full overflow-hidden text-ellipsis whitespace-nowrap rounded px-1 no-underline; +} + +a[data-type="tag"] { text-decoration: underline; } + +.tiptap p.is-editor-empty:first-child::before { + color: #adb5bd; + content: attr(data-placeholder); + float: left; + height: 0; + pointer-events: none; +} + +.link-content, +.tiptap [tag] { + @apply max-w-full overflow-hidden text-ellipsis whitespace-nowrap rounded bg-neutral-200 px-1 text-neutral-800 no-underline; +} + +.link-content.link-content-selected { + @apply bg-neutral-300; +} diff --git a/src/app/App.svelte b/src/app/App.svelte index 2257a49cb..a1ce3966d 100644 --- a/src/app/App.svelte +++ b/src/app/App.svelte @@ -4,8 +4,12 @@ import {nip19} from "nostr-tools" import {get} from "svelte/store" + import {ctx, ago, max, sleep, memoize} from "@welshman/lib" import * as lib from "@welshman/lib" import * as util from "@welshman/util" + import {getRelayQuality, getPubkeyRelays, trackRelayStats, loadRelay} from "@welshman/app" + import * as signer from "@welshman/signer" + import * as net from "@welshman/net" import * as app from "@welshman/app" import logger from "src/util/logger" import * as misc from "src/util/misc" @@ -13,7 +17,7 @@ import {ready} from "src/engine" import * as engine from "src/engine" import * as domain from "src/domain" - import {loadAppData, slowConnections, loadUserData} from "src/app/state" + import {slowConnections, loadUserData} from "src/app/state" import {themeVariables, appName} from "src/partials/state" import Toast from "src/partials/Toast.svelte" import Menu from "src/app/Menu.svelte" @@ -22,25 +26,15 @@ import ForegroundButtons from "src/app/ForegroundButtons.svelte" import About from "src/app/views/About.svelte" import Bech32Entity from "src/app/views/Bech32Entity.svelte" - import Calendar from "src/app/views/Calendar.svelte" import ChannelCreate from "src/app/views/ChannelCreate.svelte" import ChannelsDetail from "src/app/views/ChannelsDetail.svelte" import ChannelsList from "src/app/views/ChannelsList.svelte" import DataExport from "src/app/views/DataExport.svelte" import DataImport from "src/app/views/DataImport.svelte" - import EventDelete from "src/app/views/EventDelete.svelte" - import EventDetail from "src/app/views/EventDetail.svelte" - import EventEdit from "src/app/views/EventEdit.svelte" import FeedCreate from "src/app/views/FeedCreate.svelte" import FeedEdit from "src/app/views/FeedEdit.svelte" import FeedList from "src/app/views/FeedList.svelte" - import GroupCreate from "src/app/views/GroupCreate.svelte" - import GroupDelete from "src/app/views/GroupDelete.svelte" - import GroupDetail from "src/app/views/GroupDetail.svelte" - import GroupEdit from "src/app/views/GroupEdit.svelte" - import GroupInfo from "src/app/views/GroupInfo.svelte" import GroupList from "src/app/views/GroupList.svelte" - import GroupRotate from "src/app/views/GroupRotate.svelte" import Help from "src/app/views/Help.svelte" import Home from "src/app/views/Home.svelte" import InviteAccept from "src/app/views/InviteAccept.svelte" @@ -51,15 +45,10 @@ import ListEdit from "src/app/views/ListEdit.svelte" import ListList from "src/app/views/ListList.svelte" import ListSelect from "src/app/views/ListSelect.svelte" - import ListingDelete from "src/app/views/ListingDelete.svelte" - import ListingEdit from "src/app/views/ListingEdit.svelte" import Login from "src/app/views/Login.svelte" import LoginBunker from "src/app/views/LoginBunker.svelte" import LoginConnect from "src/app/views/LoginConnect.svelte" - import LoginPrivKey from "src/app/views/LoginPrivKey.svelte" - import LoginPubKey from "src/app/views/LoginPubKey.svelte" import Logout from "src/app/views/Logout.svelte" - import Market from "src/app/views/Market.svelte" import MediaDetail from "src/app/views/MediaDetail.svelte" import NoteCreate from "src/app/views/NoteCreate.svelte" import NoteDelete from "src/app/views/NoteDelete.svelte" @@ -108,7 +97,6 @@ router.register("/about", About) router.register("/search", Search) - router.register("/events", Calendar) router.register("/channels", ChannelsList, { requireSigner: true, @@ -126,72 +114,7 @@ }, }) - router.register("/events/:address", EventDetail, { - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/events/:address/edit", EventEdit, { - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/events/:address/delete", EventDelete, { - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/groups", GroupList) - router.register("/groups/new", GroupCreate, { - requireSigner: true, - }) - router.register("/groups/:address/edit", GroupEdit, { - requireSigner: true, - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/groups/:address/delete", GroupDelete, { - requireSigner: true, - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/groups/:address/info", GroupInfo, { - serializers: { - address: asNaddr("address"), - }, - }) - router.register( - "/groups/:address/invite-admin", - import("src/app/views/GroupInviteAdmin.svelte"), - { - serializers: { - address: asNaddr("address"), - }, - }, - ) - router.register("/groups/:address/rotate", GroupRotate, { - requireSigner: true, - serializers: { - address: asNaddr("address"), - addMembers: asCsv("addMembers"), - removeMembers: asCsv("removeMembers"), - }, - }) - router.register("/groups/:address/:activeTab", GroupDetail, { - serializers: { - address: asNaddr("address"), - claim: asString("claim"), - }, - }) - router.register("/groups/:address", GroupDetail, { - serializers: { - address: asNaddr("address"), - claim: asString("claim"), - }, - }) router.register("/help/:topic", Help) @@ -238,27 +161,11 @@ router.register("/login", Login) router.register("/login/bunker", LoginBunker) - router.register("/login/privkey", LoginPrivKey) - router.register("/login/pubkey", LoginPubKey) router.register("/login/connect", LoginConnect, { requireUser: true, }) router.register("/logout", Logout) - router.register("/listings", Market) - router.register("/listings/:address/edit", ListingEdit, { - requireSigner: true, - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/listings/:address/delete", ListingDelete, { - requireSigner: true, - serializers: { - address: asNaddr("address"), - }, - }) - router.register("/media/:url", MediaDetail, { serializers: { url: asUrlComponent("url"), @@ -271,7 +178,6 @@ requireSigner: true, serializers: { pubkey: asPerson, - group: asNaddr("group"), type: asString("type"), }, }) @@ -415,7 +321,9 @@ ...nostr, ...misc, ...lib, + ...signer, ...util, + ...net, ...app, ...domain, ...engine, @@ -456,7 +364,7 @@ onMount(() => { const unsubPage = router.page.subscribe( - lib.memoize($page => { + memoize($page => { if ($page) { logUsage($page.path) } @@ -496,9 +404,9 @@ // pass } - lib.ctx.net.pool.on("init", connection => { - app.loadRelay(connection.url) - app.trackRelayStats(connection) + ctx.net.pool.on("init", connection => { + loadRelay(connection.url) + trackRelayStats(connection) }) // App data boostrap and relay meta fetching @@ -506,26 +414,26 @@ ready.then(async () => { // Our stores are throttled by 300, so wait until they're populated // before loading app data - await lib.sleep(350) - - loadAppData() + await sleep(350) if ($session) { loadUserData() } const interval1 = setInterval(() => { - slowConnections.set( - app.getPubkeyRelays($pubkey).filter(url => app.getRelayQuality(url) < 0.5), - ) + slowConnections.set(getPubkeyRelays($pubkey).filter(url => getRelayQuality(url) < 0.5)) // Prune connections we haven't used in a while - for (const [_, connection] of lib.ctx.net.pool.data.entries()) { - const {lastOpen, lastPublish, lastRequest, lastFault} = connection.meta - const lastActivity = lib.max([lastOpen, lastPublish, lastRequest, lastFault]) - - if (lastActivity < Date.now() - 30_000) { - connection.disconnect() + for (const connection of ctx.net.pool.data.values()) { + const lastActivity = max([ + connection.stats.lastOpen, + connection.stats.lastPublish, + connection.stats.lastRequest, + connection.stats.lastEvent, + ]) + + if (lastActivity && lastActivity < ago(30)) { + ctx.net.pool.remove(connection.url) } } }, 5_000) diff --git a/src/app/MenuDesktop.svelte b/src/app/MenuDesktop.svelte index 233be83bb..ba2acec0b 100644 --- a/src/app/MenuDesktop.svelte +++ b/src/app/MenuDesktop.svelte @@ -1,7 +1,8 @@ diff --git a/src/app/Routes.svelte b/src/app/Routes.svelte index c7374bdef..de2c8ac19 100644 --- a/src/app/Routes.svelte +++ b/src/app/Routes.svelte @@ -76,9 +76,7 @@ {#each reverse($modals).filter(m => !m.virtual) as m, i (router.getKey(m) + i)} {@const {component} = router.getMatch(m.path).route} - - {#key $pubkey} - - {/key} + + {/each} diff --git a/src/app/editor/EditBolt11.svelte b/src/app/editor/EditBolt11.svelte new file mode 100644 index 000000000..c80257e43 --- /dev/null +++ b/src/app/editor/EditBolt11.svelte @@ -0,0 +1,20 @@ + + + + + + {node.attrs.lnbc.slice(0, 16)}... + + diff --git a/src/app/editor/EditEvent.svelte b/src/app/editor/EditEvent.svelte new file mode 100644 index 000000000..e1c635f62 --- /dev/null +++ b/src/app/editor/EditEvent.svelte @@ -0,0 +1,38 @@ + + + + + {displayEvent($event)} + + diff --git a/src/app/editor/EditMedia.svelte b/src/app/editor/EditMedia.svelte new file mode 100644 index 000000000..19f646f00 --- /dev/null +++ b/src/app/editor/EditMedia.svelte @@ -0,0 +1,33 @@ + + + + + + + + {node.attrs.file?.name || node.attrs.src} + + diff --git a/src/app/editor/EditMention.svelte b/src/app/editor/EditMention.svelte new file mode 100644 index 000000000..03caea1fe --- /dev/null +++ b/src/app/editor/EditMention.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/app/editor/FileUpload.ts b/src/app/editor/FileUpload.ts new file mode 100644 index 000000000..61ce88100 --- /dev/null +++ b/src/app/editor/FileUpload.ts @@ -0,0 +1,394 @@ +import type {CommandProps, Editor} from "@tiptap/core" +import {Extension} from "@tiptap/core" +import {now} from "@welshman/lib" +import type {ImageAttributes, VideoAttributes} from "nostr-editor" +import type {EventTemplate, NostrEvent} from "nostr-tools/core" +import {readServerConfig, uploadFile} from "nostr-tools/nip96" +import {getToken} from "nostr-tools/nip98" +import type {Node} from "prosemirror-model" +import {Plugin, PluginKey} from "prosemirror-state" +import {writable} from "svelte/store" + +declare module "@tiptap/core" { + interface Commands { + uploadFile: { + selectFiles: () => ReturnType + uploadFiles: () => ReturnType + getMetaTags: () => string[][] + } + } +} + +export interface FileUploadOptions { + allowedMimeTypes: string[] + expiration: number + immediateUpload: boolean + hash: (file: File) => Promise + sign?: (event: EventTemplate) => Promise | NostrEvent + onDrop: (currentEditor: Editor, file: File, pos: number) => void + onComplete: (currentEditor: Editor) => void +} + +interface UploadTask { + url?: string + sha256?: string + error?: string +} + +function bufferToHex(buffer: ArrayBuffer) { + return Array.from(new Uint8Array(buffer)) + .map(b => b.toString(16).padStart(2, "0")) + .join("") +} + +export const FileUploadExtension = Extension.create({ + name: "fileUpload", + + addStorage() { + return { + loading: writable(false), + tags: [] as string[][], + } + }, + + addOptions() { + return { + allowedMimeTypes: [ + "image/jpeg", + "image/png", + "image/gif", + "video/mp4", + "video/mpeg", + "video/webm", + ], + immediateUpload: true, + expiration: 60000, + async hash(file: File) { + return bufferToHex(await crypto.subtle.digest("SHA-256", await file.arrayBuffer())) + }, + onDrop() {}, + onComplete() {}, + } + }, + + addCommands() { + return { + selectFiles: () => props => { + props.tr.setMeta("selectFiles", true) + return true + }, + uploadFiles: () => (props: CommandProps) => { + props.tr.setMeta("uploadFiles", true) + return true + }, + getMetaTags: () => + ((props: CommandProps) => { + const tags: string[][] = [] + // make sure the file uploaded is still in the editor content + props.editor.state.doc.descendants(node => { + if (!(node.type.name === "image" || node.type.name === "video")) { + return + } + const tag: string[] = props.editor.storage.fileUpload.tags.find(t => + t[1].includes(node.attrs.src), + ) + if (tag) { + tags.push(tag) + } + }) + return tags + }) as any, + } + }, + + addProseMirrorPlugins() { + const uploader = new Uploader(this.editor, this.options) + return [ + new Plugin({ + key: new PluginKey("fileUploadPlugin"), + state: { + init() { + return {} + }, + apply(tr) { + setTimeout(() => { + if (tr.getMeta("selectFiles")) { + uploader.selectFiles() + tr.setMeta("selectFiles", null) + } else if (tr.getMeta("uploadFiles")) { + uploader.uploadFiles() + tr.setMeta("uploadFiles", null) + } + }) + return {} + }, + }, + props: { + handleDrop: (_, event) => { + return uploader.handleDrop(event) + }, + }, + }), + ] + }, +}) + +class Uploader { + constructor( + public editor: Editor, + private options: FileUploadOptions, + ) {} + + get view() { + return this.editor.view + } + + addFile(file: File, pos: number) { + if ( + !this.options.allowedMimeTypes.some(amt => amt.split("*").every(s => file.type.includes(s))) + ) { + return false + } + const {tr} = this.view.state + const [mimetype] = file.type.split("/") + const node = this.view.state.schema.nodes[mimetype].create({ + file, + src: URL.createObjectURL(file), + alt: "", + uploading: false, + uploadError: null, + }) + tr.insert(pos, node) + this.view.dispatch(tr) + + if (this.options.immediateUpload) { + this.editor.storage.fileUpload.loading.set(true) + this.upload(node).then(() => this.editor.storage.fileUpload.loading.set(false)) + } + this.options.onDrop(this.editor, file, pos) + return true + } + + findNodePosition(node: Node) { + let pos = -1 + this.view.state.doc.descendants((n, p) => { + if (n === node) { + pos = p + return false + } + }) + return pos + } + + findNodes(uploading: boolean) { + const nodes = [] as [Node, number][] + this.view.state.doc.descendants((node, pos) => { + if (!(node.type.name === "image" || node.type.name === "video")) { + return + } + if (node.attrs.sha256) { + return + } + if ((node.attrs.uploading || false) !== uploading) { + return + } + nodes.push([node, pos]) + }) + return nodes + } + + updateNodeAttributes(nodeRef: Node, attrs: Record) { + const {tr} = this.editor.view.state + + const pos = this.findNodePosition(nodeRef) + if (pos === -1) return + + Object.entries(attrs).forEach( + ([key, value]) => value !== undefined && tr.setNodeAttribute(pos, key, value), + ) + this.view.dispatch(tr) + } + + onUploadDone(nodeRef: Node, response: UploadTask) { + this.findNodes(true).forEach(([node, pos]) => { + if (node.attrs.src === nodeRef.attrs.src) { + this.updateNodeAttributes(node, { + uploading: false, + src: response.url, + sha256: response.sha256, + uploadError: response.error, + }) + } + }) + } + + async upload(node: Node) { + const {sign, hash, expiration} = this.options + + const { + file, + alt, + uploadType, + uploadUrl: serverUrl, + } = node.attrs as ImageAttributes | VideoAttributes + + this.updateNodeAttributes(node, {uploading: true, uploadError: null}) + + try { + if (uploadType === "nip96") { + const res = await uploadNIP96({file, alt, sign, serverUrl}) + // add the tags as received from nip-96 to the storage + this.editor.storage.fileUpload.tags.push(["imeta", ...res.tags]) + this.onUploadDone(node, res) + } else { + const res = await uploadBlossom({file, serverUrl, hash, sign, expiration}) + this.editor.storage.fileUpload.tags.push([ + "imeta", + `url ${res.url}`, + `size ${res.size}`, + `m ${res.type}`, + `x ${res.sha256}`, + ]) + this.onUploadDone(node, res) + } + } catch (error) { + const msg = error as string + this.onUploadDone(node, {error: msg}) + throw new Error(msg as string) + } + } + + async uploadFiles() { + const tasks = this.findNodes(false).map(([node]) => { + return this.upload(node) + }) + try { + this.editor.storage.fileUpload.loading.set(true) + await Promise.all(tasks) + this.options.onComplete(this.editor) + } finally { + this.editor.storage.fileUpload.loading.set(false) + } + } + + selectFiles() { + const input = document.createElement("input") + input.type = "file" + input.multiple = true + input.accept = this.options.allowedMimeTypes.join(",") + input.onchange = event => { + const files = (event.target as HTMLInputElement).files + if (files) { + Array.from(files).forEach(file => { + if (file) { + const pos = this.view.state.selection.from + 1 + this.addFile(file, pos) + } + }) + } + } + input.click() + } + + handleDrop(event: DragEvent) { + event.preventDefault() + + const pos = this.view.posAtCoords({left: event.clientX, top: event.clientY})?.pos + + if (pos === undefined) return false + + const file = event.dataTransfer?.files?.[0] + if (file) { + this.addFile(file, pos) + } + } +} + +export interface NIP96Options { + file: File + alt?: string + serverUrl: string + expiration?: number + sign: (event: EventTemplate) => Promise | NostrEvent +} + +export async function uploadNIP96(options: NIP96Options) { + try { + const server = await readServerConfig(options.serverUrl) + const authorization = await getToken(server.api_url, "POST", options.sign, true) + const res = await uploadFile(options.file, server.api_url, authorization, { + alt: options.alt || "", + expiration: options.expiration?.toString() || "", + content_type: options.file.type, + }) + if (res.status === "error") { + throw new Error(res.message) + } + const url = res.nip94_event?.tags.find(x => x[0] === "url")?.[1] || "" + const sha256 = res.nip94_event?.tags.find(x => x[0] === "x")?.[1] || "" + return { + url, + sha256, + tags: res.nip94_event?.tags.flatMap(item => item.join(" ")), + } + } catch (error) { + console.warn(error) + } +} + +export interface BlossomOptions { + file: File + serverUrl: string + expiration?: number + hash?: (file: File) => Promise + sign?: (event: EventTemplate) => Promise | NostrEvent +} + +export interface BlossomResponse { + sha256: string + size: number + type: string + uploaded: number + url: string +} + +export interface BlossomResponseError { + message: string +} + +export async function uploadBlossom(options: BlossomOptions) { + if (!options.hash) { + throw new Error("No hash function provided") + } + if (!options.sign) { + throw new Error("No signer provided") + } + const created_at = now() + const hash = await options.hash(options.file) + const event = await options.sign({ + kind: 24242, + content: `Upload ${options.file.name}`, + created_at, + tags: [ + ["t", "upload"], + ["x", hash], + ["size", options.file.size.toString()], + ["expiration", (created_at + (options.expiration || 60000)).toString()], + ], + }) + const data = JSON.stringify(event) + const base64 = btoa(data) + const authorization = `Nostr ${base64}` + const res = await fetch(options.serverUrl + "/upload", { + method: "PUT", + body: options.file, + headers: { + authorization, + }, + }) + const json = await res.json() + if (res.status === 200) { + return json as BlossomResponse + } + throw new Error((json as BlossomResponseError).message) +} diff --git a/src/app/editor/Hashtag.svelte b/src/app/editor/Hashtag.svelte new file mode 100644 index 000000000..f6a598913 --- /dev/null +++ b/src/app/editor/Hashtag.svelte @@ -0,0 +1,7 @@ + + + + {value} + diff --git a/src/app/editor/Hashtag.ts b/src/app/editor/Hashtag.ts new file mode 100644 index 000000000..02ee56e47 --- /dev/null +++ b/src/app/editor/Hashtag.ts @@ -0,0 +1,208 @@ +import {Node, mergeAttributes} from "@tiptap/core" +import Suggestion, {type SuggestionOptions} from "@tiptap/suggestion" +import {topicSearch} from "@welshman/app" +import {PluginKey} from "prosemirror-state" +import type {SvelteComponent} from "svelte" +import tippy, {type Instance} from "tippy.js" +import Suggestions from "src/app/editor/Suggestions.svelte" +import HashtagComponent from "src/app/editor/Hashtag.svelte" + +export type HashtagOptions = { + HTMLAttributes: Record + suggestion: Omit +} + +export const HashtagPluginKey = new PluginKey("hashtag") + +export const Hashtag = Node.create({ + name: "tag", + + addOptions: () => { + return { + HTMLAttributes: {"data-type": "tag"}, + suggestion: { + char: "#", + pluginKey: HashtagPluginKey, + command: ({editor, range, props}) => { + // increase range.to by one when the next node is of type "text" + // and starts with a space character + const nodeAfter = editor.view.state.selection.$to.nodeAfter + const overrideSpace = nodeAfter?.text?.startsWith(" ") + + if (overrideSpace) { + range.to += 1 + } + + editor + .chain() + .focus() + .insertContentAt(range, [ + { + type: "tag", + attrs: props, + }, + { + type: "text", + text: " ", + }, + ]) + .run() + }, + allow: ({editor, range}) => { + return true + }, + render() { + let popover: Instance[] + let suggestions: SvelteComponent + const mapProps = (props: any) => ({ + term: props.query, + search: topicSearch, + component: HashtagComponent, + allowCreate: true, + select: (value: string) => { + props.command({label: value}) + }, + }) + + return { + onStart: props => { + const target = document.createElement("div") + popover = tippy("body", { + getReferenceClientRect: props.clientRect as any, + appendTo: document.querySelector("dialog[open]") || document.body, + content: target, + showOnCreate: true, + interactive: true, + trigger: "manual", + placement: "bottom-start", + }) + if (!props.query) popover[0].hide() + suggestions = new Suggestions({target, props: mapProps(props)}) + }, + onUpdate: props => { + if (props.query) { + popover[0].show() + } else { + popover[0].hide() + } + suggestions.$set(mapProps(props)) + + if (props.clientRect) { + popover[0].setProps({ + getReferenceClientRect: props.clientRect as any, + }) + } + }, + onKeyDown: props => { + if (props.event.key === "Escape") { + popover[0].hide() + + return true + } + return Boolean(suggestions.onKeyDown?.(props.event)) + }, + onExit: () => { + popover[0].destroy() + suggestions.$destroy() + }, + } + }, + }, + } + }, + + group: "inline", + + inline: true, + + selectable: false, + + atom: true, + + addAttributes() { + return { + id: { + default: null, + parseHTML: element => element.getAttribute("data-id"), + renderHTML: attributes => { + if (!attributes.id) { + return {} + } + + return { + "data-id": attributes.id, + } + }, + }, + + label: { + default: null, + parseHTML: element => element.getAttribute("data-label"), + renderHTML: attributes => { + if (!attributes.label) { + return {} + } + + return { + "data-label": attributes.label, + } + }, + }, + } + }, + + renderHTML({node, HTMLAttributes}) { + return [ + "a", + mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), + "#" + node.attrs.label, + ] + }, + + renderText({node}) { + return "#" + node.attrs.label + }, + + parseHTML() { + return [ + { + tag: `a[data-type="${this.name}"]`, + }, + ] + }, + + addKeyboardShortcuts() { + return { + Backspace: () => + this.editor.commands.command(({tr, state}) => { + let isMention = false + const {selection} = state + const {empty, anchor} = selection + + if (!empty) { + return false + } + + state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => { + if (node.type.name === this.name) { + isMention = true + tr.insertText(this.options.suggestion.char || "", pos, pos + node.nodeSize) + + return false + } + }) + + return isMention + }), + } + }, + + addProseMirrorPlugins() { + return [ + Suggestion({ + editor: this.editor, + ...this.options.suggestion, + }), + ] + }, +}) diff --git a/src/app/editor/SuggestionProfile.svelte b/src/app/editor/SuggestionProfile.svelte new file mode 100644 index 000000000..3fdaaadc7 --- /dev/null +++ b/src/app/editor/SuggestionProfile.svelte @@ -0,0 +1,38 @@ + + +
+
+ +
+
+
+
+ {$profileDisplay} +
+ +
+
+ {$handle ? displayHandle($handle) : displayPubkey(pubkey)} +
+
+
diff --git a/src/app/editor/SuggestionString.svelte b/src/app/editor/SuggestionString.svelte new file mode 100644 index 000000000..c19d2614a --- /dev/null +++ b/src/app/editor/SuggestionString.svelte @@ -0,0 +1,5 @@ + + +{value} diff --git a/src/app/editor/Suggestions.svelte b/src/app/editor/Suggestions.svelte new file mode 100644 index 000000000..a71739df5 --- /dev/null +++ b/src/app/editor/Suggestions.svelte @@ -0,0 +1,104 @@ + + + + +{#if term} +
+ {#if term && allowCreate && !items.includes(term)} + + {/if} + {#each items as value, i (value)} + + {/each} +
+ {#if loading} +
+
+ +
+ Loading more options... +
+ {/if} + {#if !items.length && !loading} +
+
+ +
+ No results +
+ {/if} +{/if} diff --git a/src/app/editor/Suggestions.ts b/src/app/editor/Suggestions.ts new file mode 100644 index 000000000..22dab52c5 --- /dev/null +++ b/src/app/editor/Suggestions.ts @@ -0,0 +1,109 @@ +import type {SvelteComponent, ComponentType} from "svelte" +import type {Readable} from "svelte/store" +import tippy, {type Instance} from "tippy.js" +import type {Editor} from "@tiptap/core" +import {PluginKey} from "@tiptap/pm/state" +import Suggestion from "@tiptap/suggestion" +import type {Search} from "@welshman/app" + +export type SuggestionsOptions = { + char: string + name: string + editor: Editor + search: Readable> + select: (value: any, props: any) => void + allowCreate?: boolean + suggestionComponent: ComponentType + suggestionsComponent: ComponentType +} + +export const createSuggestions = (options: SuggestionsOptions) => + Suggestion({ + char: options.char, + editor: options.editor, + pluginKey: new PluginKey(`suggest-${options.name}`), + command: ({editor, range, props}) => { + // increase range.to by one when the next node is of type "text" + // and starts with a space character + const nodeAfter = editor.view.state.selection.$to.nodeAfter + const overrideSpace = nodeAfter?.text?.startsWith(" ") + + if (overrideSpace) { + range.to += 1 + } + + editor + .chain() + .focus() + .insertContentAt(range, [ + {type: options.name, attrs: props}, + {type: "text", text: " "}, + ]) + .run() + + window.getSelection()?.collapseToEnd() + }, + allow: ({state, range}) => { + const $from = state.doc.resolve(range.from) + const type = state.schema.nodes[options.name] + + return !!$from.parent.type.contentMatch.matchType(type) + }, + render: () => { + let popover: Instance[] + let suggestions: SvelteComponent + + const mapProps = (props: any) => ({ + term: props.query, + search: options.search, + allowCreate: options.allowCreate, + component: options.suggestionComponent, + select: (value: string) => options.select(value, props), + }) + + return { + onStart: props => { + const target = document.createElement("div") + + popover = tippy("body", { + getReferenceClientRect: props.clientRect as any, + appendTo: document.querySelector("dialog[open]") || document.body, + content: target, + showOnCreate: true, + interactive: true, + trigger: "manual", + placement: "bottom-start", + }) + if (!props.query) popover[0].hide() + suggestions = new options.suggestionsComponent({target, props: mapProps(props)}) + }, + onUpdate: props => { + if (props.query) { + popover[0].show() + } else { + popover[0].hide() + } + suggestions.$set(mapProps(props)) + + if (props.clientRect) { + popover[0].setProps({ + getReferenceClientRect: props.clientRect as any, + }) + } + }, + onKeyDown: props => { + if (props.event.key === "Escape") { + popover[0].hide() + + return true + } + + return Boolean(suggestions.onKeyDown?.(props.event)) + }, + onExit: () => { + popover[0].destroy() + suggestions.$destroy() + }, + } + }, + }) diff --git a/src/app/editor/index.ts b/src/app/editor/index.ts new file mode 100644 index 000000000..b2ed5093a --- /dev/null +++ b/src/app/editor/index.ts @@ -0,0 +1,158 @@ +import {nprofileEncode} from "nostr-tools/nip19" +import {SvelteNodeViewRenderer} from "svelte-tiptap" +import Code from "@tiptap/extension-code" +import CodeBlock from "@tiptap/extension-code-block" +import Document from "@tiptap/extension-document" +import Dropcursor from "@tiptap/extension-dropcursor" +import Gapcursor from "@tiptap/extension-gapcursor" +import History from "@tiptap/extension-history" +import Placeholder from "@tiptap/extension-placeholder" +import Paragraph from "@tiptap/extension-paragraph" +import Text from "@tiptap/extension-text" +import HardBreakExtension from "@tiptap/extension-hard-break" +import { + Bolt11Extension, + NProfileExtension, + NEventExtension, + NAddrExtension, + ImageExtension, + VideoExtension, +} from "nostr-editor" +import {ctx} from "@welshman/lib" +import type {StampedEvent} from "@welshman/util" +import {toNostrURI} from "@welshman/util" +import {signer, profileSearch, RelayMode} from "@welshman/app" +import {createSuggestions} from "./Suggestions" +import EditMention from "src/app/editor/EditMention.svelte" +import EditEvent from "src/app/editor/EditEvent.svelte" +import EditBolt11 from "src/app/editor/EditBolt11.svelte" +import EditMedia from "src/app/editor/EditMedia.svelte" +import Suggestions from "src/app/editor/Suggestions.svelte" +import SuggestionProfile from "src/app/editor/SuggestionProfile.svelte" +import {asInline} from "src/app/editor/util" +import {WordCount} from "src/app/editor/wordcounts" +import {FileUploadExtension} from "src/app/editor/FileUpload" +import {getSetting} from "src/engine" +import {Hashtag} from "src/app/editor/Hashtag" + +export {createSuggestions, EditMention, EditEvent, EditBolt11, EditMedia, Suggestions} +export * from "./util" + +type EditorOptions = { + submit: () => void + getPubkeyHints?: (pubkey: string) => string[] + element?: HTMLElement + submitOnEnter?: boolean + submitOnModEnter?: boolean + defaultUploadUrl?: string + autofocus?: boolean + content?: string + placeholder?: string + uploadType?: "nip96" | "blossom" +} + +export type EditorImage = { + src: string + sha256: string +} + +export const getEditorOptions = ({ + submit, + getPubkeyHints = (pubkey: string) => ctx.app.router.getRelaysForPubkey(pubkey, RelayMode.Write), + submitOnEnter = true, + submitOnModEnter = false, + element, + defaultUploadUrl = getSetting("upload_type") == "nip96" + ? getSetting("nip96_urls")[0] || "https://nostr.build" + : getSetting("blossom_urls")[0] || "https://cdn.satellite.earth", + uploadType = getSetting("upload_type"), + autofocus = false, + content = "", + placeholder, +}: EditorOptions) => ({ + autofocus, + element, + content, + extensions: [ + Code, + CodeBlock, + Document, + Dropcursor, + Gapcursor, + History, + Paragraph, + Text, + Hashtag, + WordCount, + Placeholder.configure({placeholder}), + HardBreakExtension.extend({ + addKeyboardShortcuts() { + return { + "Shift-Enter": () => this.editor.commands.setHardBreak(), + "Mod-Enter": () => { + if (submitOnModEnter && this.editor.getText().trim()) { + submit() + return true + } + return this.editor.commands.setHardBreak() + }, + Enter: () => { + if (submitOnEnter && this.editor.getText().trim()) { + submit() + return true + } + return false + }, + } + }, + }), + Bolt11Extension.extend(asInline({addNodeView: () => SvelteNodeViewRenderer(EditBolt11)})), + NProfileExtension.extend({ + addNodeView: () => SvelteNodeViewRenderer(EditMention), + renderText: props => toNostrURI(props.node.attrs.nprofile), + addProseMirrorPlugins() { + return [ + createSuggestions({ + char: "@", + name: "nprofile", + editor: this.editor, + search: profileSearch, + select: (pubkey: string, props: any) => { + const relays = getPubkeyHints(pubkey) + const nprofile = nprofileEncode({pubkey, relays}) + + return props.command({pubkey, nprofile, relays}) + }, + suggestionComponent: SuggestionProfile, + suggestionsComponent: Suggestions, + }), + ] + }, + }), + NEventExtension.extend( + asInline({ + addNodeView: () => SvelteNodeViewRenderer(EditEvent), + renderText: props => toNostrURI(props.node.attrs.nevent), + }), + ), + NAddrExtension.extend( + asInline({ + addNodeView: () => SvelteNodeViewRenderer(EditEvent), + renderText: props => toNostrURI(props.node.attrs.naddr), + }), + ), + ImageExtension.extend( + asInline({addNodeView: () => SvelteNodeViewRenderer(EditMedia)}), + ).configure({defaultUploadUrl, defaultUploadType: uploadType}), + VideoExtension.extend( + asInline({addNodeView: () => SvelteNodeViewRenderer(EditMedia)}), + ).configure({defaultUploadUrl, defaultUploadType: uploadType}), + FileUploadExtension.configure({ + immediateUpload: true, + sign: (event: StampedEvent) => { + return signer.get()!.sign(event) + }, + allowedMimeTypes: ["image/*", "video/*"], + }), + ], +}) diff --git a/src/app/editor/util.ts b/src/app/editor/util.ts new file mode 100644 index 000000000..815e533ae --- /dev/null +++ b/src/app/editor/util.ts @@ -0,0 +1,98 @@ +import type {JSONContent, PasteRuleMatch, InputRuleMatch} from "@tiptap/core" +import {Editor} from "@tiptap/core" +import {ctx} from "@welshman/lib" +import {Address} from "@welshman/util" + +export const asInline = (extend: Record) => ({ + inline: true, + group: "inline", + ...extend, +}) + +export const createInputRuleMatch = >( + match: RegExpMatchArray, + data: T, +): InputRuleMatch => ({index: match.index!, text: match[0], match, data}) + +export const createPasteRuleMatch = >( + match: RegExpMatchArray, + data: T, +): PasteRuleMatch => ({index: match.index!, text: match[0], match, data}) + +export const findNodes = (type: string, json: JSONContent) => { + const results: JSONContent[] = [] + + for (const node of json.content || []) { + if (node.type === type) { + results.push(node) + } + + for (const result of findNodes(type, node)) { + results.push(result) + } + } + + return results +} + +export const findMarks = (type: string, json: JSONContent) => { + const results: JSONContent[] = [] + + for (const node of json.content || []) { + for (const mark of node.marks || []) { + if (mark.type === type) { + results.push(mark) + } + } + + for (const result of findMarks(type, node)) { + results.push(result) + } + } + + return results +} + +export const getEditorTags = (editor: Editor) => { + const json = editor.getJSON() + + const topicTags = findMarks("tag", json).map(({attrs}: any) => [ + "t", + attrs.tag.replace(/^#/, "").toLowerCase(), + ]) + + const naddrTags = findNodes("naddr", json).map( + ({attrs: {kind, pubkey, identifier, relays = []}}: any) => { + const address = new Address(kind, pubkey, identifier).toString() + + return ["q", address, ctx.app.router.FromRelays(relays).getUrl(), pubkey] + }, + ) + + const neventTags = findNodes("nevent", json).map(({attrs: {id, author, relays = []}}: any) => [ + "q", + id, + ctx.app.router.FromRelays(relays).getUrl(), + author || "", + ]) + + const mentionTags = findNodes("nprofile", json).map(({attrs: {pubkey, relays = []}}: any) => [ + "p", + pubkey, + ctx.app.router.FromRelays(relays).getUrl(), + "", + ]) + + const imetaTags = findNodes("image", json).map(({attrs: {src, sha256}}: any) => [ + "imeta", + `url ${src}`, + `x ${sha256}`, + `ox ${sha256}`, + ]) + + return [...topicTags, ...naddrTags, ...neventTags, ...mentionTags, ...imetaTags] +} + +export const addFile = (editor: Editor) => editor.chain().selectFiles().run() + +export const uploadFiles = (editor: Editor) => editor.chain().uploadFiles().run() diff --git a/src/app/editor/wordcounts.ts b/src/app/editor/wordcounts.ts new file mode 100644 index 000000000..082088520 --- /dev/null +++ b/src/app/editor/wordcounts.ts @@ -0,0 +1,19 @@ +import {Extension} from "@tiptap/core" +import {writable} from "svelte/store" + +export const WordCount = Extension.create({ + name: "wordCount", + + addStorage() { + return { + words: writable(0), + characters: writable(0), + } + }, + + onUpdate() { + const text = this.editor.state.doc.textContent + this.storage.characters.set(text.length) + this.storage.words.set(text.split(/\s+/).filter(word => word.length > 0).length) + }, +}) diff --git a/src/app/shared/Calendar.svelte b/src/app/shared/Calendar.svelte deleted file mode 100644 index 00bcf2f4b..000000000 --- a/src/app/shared/Calendar.svelte +++ /dev/null @@ -1,100 +0,0 @@ - - -{#if $signer} - -{/if} - -{#key $calendarEvents.length} - -{/key} diff --git a/src/app/shared/Channel.svelte b/src/app/shared/Channel.svelte new file mode 100644 index 000000000..07f6fae29 --- /dev/null +++ b/src/app/shared/Channel.svelte @@ -0,0 +1,242 @@ + + + { + showNewMessages = false + }} /> + +
+
+ +
+
+ {#if !userHasInbox} +
+
+ Your inbox is not configured. +
+ In order to deliver messages, Coracle needs to know where to send them. Please visit your + relay settings page and set + up your inbox relays. +
+ {/if} + {#each groupedMessages as message (message.id)} + + {/each} + {#await loading} + Looking for messages... + {:then} +
End of message history
+ {/await} +
+ {#if $hasNip44} +
+ +
+ + +
+
+ {:else} + +

+ + You are using a login method that doesn't yet support group chats. Please consider upgrading + your signer to access this feature. +

+
+ {/if} + {#if showNewMessages} +
+
New messages found
+
+ {/if} +
+ +{#if confirmIsOpen} + + Missing Inbox Relays + {#if $pubkeysWithoutInbox.length > 0} +

+ {displayList($pubkeysWithoutInbox.map(displayProfileByPubkey))} + {pluralize($pubkeysWithoutInbox.length, "does not have", "do not have")} + inbox relays, which means they may not be able to receive DMs. +

+ {:else if !userHasInbox} +

+ You don't have any inbox relays set up yet, which will make it difficult for you to receive + replies to this conversation. Click here to + set up your inbox relays. +

+ {/if} +
+ Cancel + Send anyway +
+
+{/if} diff --git a/src/app/shared/Compose.svelte b/src/app/shared/Compose.svelte index 8edd2265a..87d8b0f3d 100644 --- a/src/app/shared/Compose.svelte +++ b/src/app/shared/Compose.svelte @@ -1,272 +1,18 @@ -
- +
+ class={cx($$props.class, "relative w-full min-w-0")} />
- - autocomplete({pubkey})} - loading={$loadingPeople}> -
- -
-
diff --git a/src/app/shared/EventActions.svelte b/src/app/shared/EventActions.svelte deleted file mode 100644 index 98db425e5..000000000 --- a/src/app/shared/EventActions.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - -
- -
diff --git a/src/app/shared/EventInfo.svelte b/src/app/shared/EventInfo.svelte index a9b752a70..5e92582ac 100644 --- a/src/app/shared/EventInfo.svelte +++ b/src/app/shared/EventInfo.svelte @@ -1,33 +1,22 @@ -
-
- +
+
+ - - Filters ({feed.definition.length - 1}) - -
-
-
- - {#if $listMenu.enabled} - - - - Your Feeds - - -
- setFeed(followsFeed)}> - Follows - - setFeed(networkFeed)}> - Network - - {#each allFeeds as other} - setFeed(other)}> - {displayFeed(other)} - - {/each} -
- {#if $signer} -
- - Manage feeds - - - Manage lists - -
- {/if} -
-
- {/if} -
+ {#if $signer} + Customize + {/if}
+ {#if $expanded} +
+ +
+

Your Feeds

+ + + +
+
+ {#each allFeeds as other} + setFeed(other)}> + {displayFeed(other)} + + {/each} + + + Add feed + +
+
+
+ Manage lists + Manage feeds +
+ Edit feed +
+
+
+ {/if}
{#if $form.enabled} - setFeedDefinition(feed.definition)} /> + setFeedDefinition(feed.definition)} /> {/if} diff --git a/src/app/shared/FeedForm.svelte b/src/app/shared/FeedForm.svelte index c29527054..397498c2b 100644 --- a/src/app/shared/FeedForm.svelte +++ b/src/app/shared/FeedForm.svelte @@ -1,5 +1,6 @@ @@ -75,8 +79,7 @@ isAuthorFeed(subFeed) || isRelayFeed(subFeed) || isTopicFeed(subFeed) || - isMentionFeed(subFeed) || - isContextFeed(subFeed)} + isMentionFeed(subFeed)} {#if canSave || !isGlobalFeed(subFeed)} @@ -85,15 +88,15 @@ {:else if isRelayFeed(subFeed)} + {:else if isSearchFeed(subFeed)} + {:else if isTopicFeed(subFeed)} {:else if isMentionFeed(subFeed)} - {:else if isContextFeed(subFeed)} - {:else if isKindFeed(subFeed)} - {:else if isCreatedAtFeed(subFeed)} + {:else if isDateFeed(subFeed)} {:else if isListFeed(subFeed)} @@ -120,7 +123,7 @@ {/each} {/key} -{#if !hasTopics || !hasMentions || !hasContext || !hasPeople || !hasRelays || !hasKinds || !hasCreatedAt || !hasDVM || !hasList} +{#if !hasTopics || !hasMentions || !hasPeople || !hasRelays || !hasSearch || !hasKinds || !hasDate || !hasDVM || !hasList}
{#if menuIsOpen} @@ -131,19 +134,19 @@ {#if !hasMentions} addFeed(makeTagFeed("#p"))}>Mentions {/if} - {#if !hasContext} - addFeed(makeTagFeed("#a"))}>Groups - {/if} {#if !hasPeople} addFeed(makeAuthorFeed())}>Authors {/if} {#if !hasRelays} addFeed(makeRelayFeed())}>Relays {/if} + {#if !hasSearch} + addFeed(makeSearchFeed(""))}>Search + {/if} {#if !hasKinds} addFeed(makeKindFeed())}>Kinds {/if} - {#if !hasCreatedAt} + {#if !hasDate} addFeed(makeCreatedAtFeed())}>Date range {/if} {#if !hasList} diff --git a/src/app/shared/FeedFormSaveAsList.svelte b/src/app/shared/FeedFormSaveAsList.svelte index 4495fa9a4..cdfd32e7e 100644 --- a/src/app/shared/FeedFormSaveAsList.svelte +++ b/src/app/shared/FeedFormSaveAsList.svelte @@ -1,18 +1,12 @@ - -Which groups would you like to see? - onChange([FeedType.Tag, "#a", ...addresses])}> - - {#if context === "value"} - - {$groupMetaSearch.displayValue(item)} - - {:else} - - {/if} - - diff --git a/src/app/shared/FeedFormSectionKinds.svelte b/src/app/shared/FeedFormSectionKinds.svelte index b14a86229..6f4285cf4 100644 --- a/src/app/shared/FeedFormSectionKinds.svelte +++ b/src/app/shared/FeedFormSectionKinds.svelte @@ -1,28 +1,90 @@ diff --git a/src/app/shared/FeedFormSectionRelays.svelte b/src/app/shared/FeedFormSectionRelays.svelte index cf39c2335..1c7a82b1a 100644 --- a/src/app/shared/FeedFormSectionRelays.svelte +++ b/src/app/shared/FeedFormSectionRelays.svelte @@ -1,4 +1,5 @@ + +Which would you like to search for? + diff --git a/src/app/shared/GroupAbout.svelte b/src/app/shared/GroupAbout.svelte deleted file mode 100644 index 63b9fdecf..000000000 --- a/src/app/shared/GroupAbout.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -{#key $meta?.about} - -{/key} diff --git a/src/app/shared/GroupActions.svelte b/src/app/shared/GroupActions.svelte deleted file mode 100644 index 56e935c34..000000000 --- a/src/app/shared/GroupActions.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - -{#if address.startsWith("34550:")} - -{/if} - -{#if address.startsWith("35834:")} - -{/if} diff --git a/src/app/shared/GroupActionsClosed.svelte b/src/app/shared/GroupActionsClosed.svelte deleted file mode 100644 index 0a7fad328..000000000 --- a/src/app/shared/GroupActionsClosed.svelte +++ /dev/null @@ -1,133 +0,0 @@ - - - - -{#if showClaim} - - -

If you have an invite code, you can enter it below.

- - - -
- Cancel - Request access -
-
-
-{/if} diff --git a/src/app/shared/GroupActionsOpen.svelte b/src/app/shared/GroupActionsOpen.svelte deleted file mode 100644 index d193e83bc..000000000 --- a/src/app/shared/GroupActionsOpen.svelte +++ /dev/null @@ -1,77 +0,0 @@ - - - diff --git a/src/app/shared/GroupAdmin.svelte b/src/app/shared/GroupAdmin.svelte deleted file mode 100644 index 51018d817..000000000 --- a/src/app/shared/GroupAdmin.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -{#each $requests as request (request.id)} - -{:else} -

No action items found.

-{/each} diff --git a/src/app/shared/GroupAlert.svelte b/src/app/shared/GroupAlert.svelte deleted file mode 100644 index 6b4494c0c..000000000 --- a/src/app/shared/GroupAlert.svelte +++ /dev/null @@ -1,50 +0,0 @@ - - - - -
-

- {#if alert.type === "exit"} - Access revoked - {:else if alert.type === "invite"} - Group invitation - {/if} -

- - {formatTimestamp(alert.created_at)} - -
-

- The admin of - - - - - - - has - {#if alert.type === "exit"} - removed you from the group. - {:else if alert.type === "invite"} - given you access to the group. - {/if} -

- {#if alert.content} -

- "{alert.content}" -

- {/if} -
-
diff --git a/src/app/shared/GroupCalendar.svelte b/src/app/shared/GroupCalendar.svelte deleted file mode 100644 index a87b5ada2..000000000 --- a/src/app/shared/GroupCalendar.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/src/app/shared/GroupCircle.svelte b/src/app/shared/GroupCircle.svelte deleted file mode 100644 index 78740d98f..000000000 --- a/src/app/shared/GroupCircle.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - -{#if $meta?.image} - -{:else} - -{/if} diff --git a/src/app/shared/GroupDetailsForm.svelte b/src/app/shared/GroupDetailsForm.svelte deleted file mode 100644 index 13de3c758..000000000 --- a/src/app/shared/GroupDetailsForm.svelte +++ /dev/null @@ -1,178 +0,0 @@ - - -
- -
- {ucFirst(mode)} Group -

- {#if values.kind === COMMUNITY} - An open forum where anyone can participate. - {:else} - A private place where members can talk. - {/if} -

-
-
- - - - -
The name of the group
-
- - -
A picture for the group
-
- - -
A banner image for the group
-
- -