diff --git a/package.json b/package.json index 58245109..bdd58343 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "html-to-text": "^9.0.5", "light-bolt11-decoder": "^3.0.0", "lru-cache": "^10.0.1", + "million": "^2.6.4", "minidenticons": "^4.2.0", "nostr-fetch": "^0.13.0", "nostr-tools": "^1.16.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6430a38f..ea7e9bb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,6 +134,9 @@ dependencies: lru-cache: specifier: ^10.0.1 version: 10.0.1 + million: + specifier: ^2.6.4 + version: 2.6.4 minidenticons: specifier: ^4.2.0 version: 4.2.0 @@ -301,13 +304,48 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: false + /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.20 chalk: 2.4.2 - dev: true + + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.23.0: + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helpers': 7.23.1 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false /@babel/generator@7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} @@ -318,10 +356,30 @@ packages: source-map: 0.5.7 dev: true + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: false + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -329,31 +387,75 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - dev: true + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.23.1: + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: false /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} @@ -362,7 +464,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} @@ -370,7 +471,26 @@ packages: hasBin: true dependencies: '@babel/types': 7.17.0 - dev: true + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/runtime@7.23.1: resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} @@ -385,7 +505,6 @@ packages: '@babel/code-frame': 7.22.13 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - dev: true /@babel/traverse@7.17.3: resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} @@ -405,13 +524,30 @@ packages: - supports-color dev: true + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/types@7.17.0: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} @@ -420,7 +556,6 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} @@ -2817,7 +2952,6 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2850,7 +2984,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -3033,7 +3166,6 @@ packages: electron-to-chromium: 1.4.546 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true /bufferutil@4.0.7: resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} @@ -3061,7 +3193,6 @@ packages: /caniuse-lite@1.0.30001546: resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==} - dev: true /case-anything@2.1.13: resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} @@ -3079,7 +3210,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -3139,7 +3269,6 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3150,7 +3279,6 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -3176,6 +3304,10 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + /crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} dev: false @@ -3435,7 +3567,6 @@ packages: /electron-to-chromium@1.4.546: resolution: {integrity: sha512-cz9bBM26ZqoEmGHkdHXU3LP7OofVyEzRoMqfALQ9Au9WlB4rogAHzqj/NkNvw2JJjy4xuxS1me+pP2lbCD5Mfw==} - dev: true /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -3603,12 +3734,10 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -3924,6 +4053,11 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -3987,7 +4121,6 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - dev: true /globals@13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} @@ -4036,7 +4169,6 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -4397,7 +4529,6 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -4411,6 +4542,12 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -4559,6 +4696,12 @@ packages: engines: {node: 14 || >=16.14} dev: false + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -4987,6 +5130,22 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /million@2.6.4: + resolution: {integrity: sha512-voUkdd/jHWrG+7NS+mX49Pat+POKdgGW78V7pYMSrTaOjUitR6ySEcAci8hn17Rsx1IMI3+5w41dkADM1J1ZEg==} + hasBin: true + dependencies: + '@babel/core': 7.23.0 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/types': 7.23.0 + kleur: 4.1.5 + rollup: 3.29.4 + unplugin: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -5060,7 +5219,6 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -5902,7 +6060,6 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 - dev: true /rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -5957,7 +6114,6 @@ packages: /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -6127,7 +6283,6 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -6230,7 +6385,6 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -6428,6 +6582,15 @@ packages: unist-util-visit-parents: 5.1.3 dev: false + /unplugin@1.5.0: + resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -6437,7 +6600,6 @@ packages: browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6599,6 +6761,15 @@ packages: engines: {node: '>= 8'} dev: false + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: false + + /webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + dev: false + /websocket-polyfill@0.0.3: resolution: {integrity: sha512-pF3kR8Uaoau78MpUmFfzbIRxXj9PeQrCuPepGE6JIsfsJ/o/iXr07Q2iQNzKSSblQJ0FiGWlS64N4pVSm+O3Dg==} dependencies: @@ -6695,6 +6866,10 @@ packages: engines: {node: '>=0.10.32'} dev: false + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true diff --git a/src/app.css b/src/app.css index 503e330c..b0da9527 100644 --- a/src/app.css +++ b/src/app.css @@ -9,6 +9,12 @@ html { font-size: 14px; + /* Smoothing */ + text-rendering: optimizeLegibility; + -moz-osx-font-smoothing: grayscale; + font-smoothing: antialiased; + -webkit-font-smoothing: antialiased; + text-shadow: rgba(0, 0, 0, .01) 0 0 1px; } a { diff --git a/src/app/relays/relay.tsx b/src/app/relays/relay.tsx index bb295028..d43c20e6 100644 --- a/src/app/relays/relay.tsx +++ b/src/app/relays/relay.tsx @@ -79,7 +79,7 @@ export function RelayScreen() { mailto:{resolvedRelay.contact} @@ -92,7 +92,7 @@ export function RelayScreen() { href={resolvedRelay.software} target="_blank" rel="noreferrer" - className="underline after:content-['_↗'] hover:text-blue-500" + className="underline after:content-['_↗'] hover:text-blue-600" > {getSoftwareName(resolvedRelay.software) + ' - ' + diff --git a/src/app/space/index.tsx b/src/app/space/index.tsx index d21d59ee..0493eefd 100644 --- a/src/app/space/index.tsx +++ b/src/app/space/index.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect } from 'react'; -import { VList } from 'virtua'; +import { VList, WVList } from 'virtua'; import { ToggleWidgetList } from '@app/space/components/toggle'; import { WidgetList } from '@app/space/components/widgetList'; @@ -85,17 +85,15 @@ export function SpaceScreen() { }, [fetchWidgets]); return ( -
- - {!widgets ? ( -
- -
- ) : ( - widgets.map((widget) => renderItem(widget)) - )} - -
-
+ + {!widgets ? ( +
+ +
+ ) : ( + widgets.map((widget) => renderItem(widget)) + )} + +
); } diff --git a/src/shared/accounts/active.tsx b/src/shared/accounts/active.tsx index 74e4082e..188b6be4 100644 --- a/src/shared/accounts/active.tsx +++ b/src/shared/accounts/active.tsx @@ -62,7 +62,7 @@ export function ActiveAccount() { alt={db.account.npub} className="aspect-square h-full w-full rounded-md" /> - +
diff --git a/src/shared/icons/focus.tsx b/src/shared/icons/focus.tsx index 085fa6ff..1394974e 100644 --- a/src/shared/icons/focus.tsx +++ b/src/shared/icons/focus.tsx @@ -11,11 +11,16 @@ export function FocusIcon(props: JSX.IntrinsicAttributes & SVGProps + + ); diff --git a/src/shared/icons/horizontalDots.tsx b/src/shared/icons/horizontalDots.tsx index d7c8adf2..19eecef7 100644 --- a/src/shared/icons/horizontalDots.tsx +++ b/src/shared/icons/horizontalDots.tsx @@ -12,17 +12,13 @@ export function HorizontalDotsIcon( viewBox="0 0 24 24" {...props} > - + strokeWidth="2" + d="M12 13a1 1 0 100-2 1 1 0 000 2zM20 13a1 1 0 100-2 1 1 0 000 2zM4 13a1 1 0 100-2 1 1 0 000 2z" + > ); } diff --git a/src/shared/icons/reaction.tsx b/src/shared/icons/reaction.tsx index b160caac..2d16f037 100644 --- a/src/shared/icons/reaction.tsx +++ b/src/shared/icons/reaction.tsx @@ -12,24 +12,12 @@ export function ReactionIcon(props: JSX.IntrinsicAttributes & SVGProps - - diff --git a/src/shared/icons/reply.tsx b/src/shared/icons/reply.tsx index 86b135dc..a85c623b 100644 --- a/src/shared/icons/reply.tsx +++ b/src/shared/icons/reply.tsx @@ -2,14 +2,28 @@ import { SVGProps } from 'react'; export function ReplyIcon(props: JSX.IntrinsicAttributes & SVGProps) { return ( - + + strokeWidth="2" + d="M12 21a9 9 0 10-9-9c0 1.354.3 2.639.835 3.791.102.219.133.465.076.7l-.778 3.191a1 1 0 001.191 1.213l3.33-.752c.224-.05.458-.02.667.073A8.969 8.969 0 0012 21z" + > + ); } diff --git a/src/shared/icons/repost.tsx b/src/shared/icons/repost.tsx index b3ffb473..e0a93d6d 100644 --- a/src/shared/icons/repost.tsx +++ b/src/shared/icons/repost.tsx @@ -11,10 +11,8 @@ export function RepostIcon(props: JSX.IntrinsicAttributes & SVGProps ); diff --git a/src/shared/icons/thread.tsx b/src/shared/icons/thread.tsx index 406c90c0..22453c73 100644 --- a/src/shared/icons/thread.tsx +++ b/src/shared/icons/thread.tsx @@ -12,7 +12,7 @@ export function ThreadIcon(props: JSX.IntrinsicAttributes & SVGProps ); diff --git a/src/shared/icons/zap.tsx b/src/shared/icons/zap.tsx index 77b601b8..39633453 100644 --- a/src/shared/icons/zap.tsx +++ b/src/shared/icons/zap.tsx @@ -3,20 +3,20 @@ import { SVGProps } from 'react'; export function ZapIcon(props: JSX.IntrinsicAttributes & SVGProps) { return ( + strokeWidth="2" + d="M4.116 12.276l4.5-9A.5.5 0 019.063 3h8.058a.5.5 0 01.429.757l-2.091 3.486a.5.5 0 00.428.757h4.804a.5.5 0 01.332.873L7.381 21.023c-.38.34-.965-.042-.808-.527l2.219-6.842A.5.5 0 008.316 13H4.563a.5.5 0 01-.447-.724z" + > ); } diff --git a/src/shared/notes/actions.tsx b/src/shared/notes/actions.tsx index 0ec13c7f..b46d3404 100644 --- a/src/shared/notes/actions.tsx +++ b/src/shared/notes/actions.tsx @@ -28,33 +28,16 @@ export function NoteActions({ return ( -
-
+
+
{extraButtons && ( - <> -
-
- - - - - - - - - Focus - - - - +
+
- + Open thread - + +
- +
)} -
); diff --git a/src/shared/notes/actions/more.tsx b/src/shared/notes/actions/more.tsx index 7a0b8d9b..5f634112 100644 --- a/src/shared/notes/actions/more.tsx +++ b/src/shared/notes/actions/more.tsx @@ -30,26 +30,35 @@ export function MoreActions({ id, pubkey }: { id: string; pubkey: string }) { - + More - + - + + + + @@ -58,7 +67,7 @@ export function MoreActions({ id, pubkey }: { id: string; pubkey: string }) { @@ -66,7 +75,7 @@ export function MoreActions({ id, pubkey }: { id: string; pubkey: string }) { View profile diff --git a/src/shared/notes/actions/reaction.tsx b/src/shared/notes/actions/reaction.tsx index bb535dff..ae430eb5 100644 --- a/src/shared/notes/actions/reaction.tsx +++ b/src/shared/notes/actions/reaction.tsx @@ -65,15 +65,15 @@ export function NoteReaction({ id, pubkey }: { id: string; pubkey: string }) { className="group inline-flex h-7 w-7 items-center justify-center text-neutral-500 dark:text-neutral-300" > {reaction ? ( - {reaction} + {reaction} ) : ( - + )} @@ -122,7 +122,7 @@ export function NoteReaction({ id, pubkey }: { id: string; pubkey: string }) { Clown Face
- + diff --git a/src/shared/notes/actions/reply.tsx b/src/shared/notes/actions/reply.tsx index 9ef71260..f866eb70 100644 --- a/src/shared/notes/actions/reply.tsx +++ b/src/shared/notes/actions/reply.tsx @@ -23,13 +23,13 @@ export function NoteReply({ onClick={() => setReply(id, pubkey, root)} className="group inline-flex h-7 w-7 items-center justify-center text-neutral-500 dark:text-neutral-300" > - + - + Quick reply - + diff --git a/src/shared/notes/actions/repost.tsx b/src/shared/notes/actions/repost.tsx index 598ecf60..1d6220d5 100644 --- a/src/shared/notes/actions/repost.tsx +++ b/src/shared/notes/actions/repost.tsx @@ -48,7 +48,7 @@ export function NoteRepost({ id, pubkey }: { id: string; pubkey: string }) { > @@ -56,9 +56,9 @@ export function NoteRepost({ id, pubkey }: { id: string; pubkey: string }) { - + Repost - + diff --git a/src/shared/notes/actions/zap.tsx b/src/shared/notes/actions/zap.tsx index 491435b2..261bba18 100644 --- a/src/shared/notes/actions/zap.tsx +++ b/src/shared/notes/actions/zap.tsx @@ -95,7 +95,7 @@ export function NoteZap({ id, pubkey }: { id: string; pubkey: string }) { type="button" className="group inline-flex h-7 w-7 items-center justify-center text-neutral-500 dark:text-neutral-300" > - + diff --git a/src/shared/notes/child.tsx b/src/shared/notes/child.tsx index e53d3a53..b9d1d267 100644 --- a/src/shared/notes/child.tsx +++ b/src/shared/notes/child.tsx @@ -56,7 +56,7 @@ export function ChildNote({ id, root }: { id: string; root?: string }) { Lume (System)
-
+
@@ -81,7 +81,7 @@ export function ChildNote({ id, root }: { id: string; root?: string }) {
-
+
{renderKind(data)} diff --git a/src/shared/notes/kinds/article.tsx b/src/shared/notes/kinds/article.tsx index d720d587..379062cb 100644 --- a/src/shared/notes/kinds/article.tsx +++ b/src/shared/notes/kinds/article.tsx @@ -1,5 +1,5 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { useMemo } from 'react'; +import { memo, useMemo } from 'react'; import { Link } from 'react-router-dom'; import { Image } from '@shared/image'; @@ -54,3 +54,5 @@ export function ArticleNote(props: { event?: NDKEvent }) { ); } + +export const MemoizedArticleNote = memo(ArticleNote); diff --git a/src/shared/notes/kinds/file.tsx b/src/shared/notes/kinds/file.tsx index eae00d5b..928727e7 100644 --- a/src/shared/notes/kinds/file.tsx +++ b/src/shared/notes/kinds/file.tsx @@ -5,6 +5,7 @@ import { DefaultVideoLayout, defaultLayoutIcons, } from '@vidstack/react/player/layouts/default'; +import { memo } from 'react'; import { Link } from 'react-router-dom'; import { Image } from '@shared/image'; @@ -34,13 +35,19 @@ export function FileNote(props: { event?: NDKEvent }) { key={url} src={url} poster={`https://thumbnail.video/api/get?url=${url}&seconds=1`} - load="visible" + load="idle" aspectRatio="16/9" muted={true} crossorigin="" className="player" > - + + + {url}
); } + +export const MemoizedFileNote = memo(FileNote); diff --git a/src/shared/notes/kinds/repost.tsx b/src/shared/notes/kinds/repost.tsx index 2e6ea153..592ee6fd 100644 --- a/src/shared/notes/kinds/repost.tsx +++ b/src/shared/notes/kinds/repost.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; import { nip19 } from 'nostr-tools'; -import { useCallback } from 'react'; +import { memo, useCallback } from 'react'; import { Link } from 'react-router-dom'; import { twMerge } from 'tailwind-merge'; @@ -71,7 +71,7 @@ export function Repost({
-
+
{renderKind(embedEvent)} @@ -116,7 +116,7 @@ export function Repost({ Lume (System)
-
+
@@ -148,7 +148,7 @@ export function Repost({
-
+
{renderKind(data)} @@ -160,3 +160,5 @@ export function Repost({
); } + +export const MemoizedRepost = memo(Repost); diff --git a/src/shared/notes/kinds/text.tsx b/src/shared/notes/kinds/text.tsx index c7007061..2b1adc1b 100644 --- a/src/shared/notes/kinds/text.tsx +++ b/src/shared/notes/kinds/text.tsx @@ -1,3 +1,4 @@ +import { memo } from 'react'; import ReactMarkdown from 'react-markdown'; import { Link } from 'react-router-dom'; import remarkGfm from 'remark-gfm'; @@ -82,3 +83,5 @@ export function TextNote(props: { content?: string }) {
); } + +export const MemoizedTextNote = memo(TextNote); diff --git a/src/shared/notes/kinds/unknown.tsx b/src/shared/notes/kinds/unknown.tsx index 51422958..eaa0e0e1 100644 --- a/src/shared/notes/kinds/unknown.tsx +++ b/src/shared/notes/kinds/unknown.tsx @@ -2,7 +2,7 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; export function UnknownNote(props: { event?: NDKEvent }) { return ( -
+
Kind: {props.event.kind} @@ -11,7 +11,7 @@ export function UnknownNote(props: { event?: NDKEvent }) { Unsupport kind on newsfeed

-
+

{props.event.content.toString()}

diff --git a/src/shared/notes/mentions/boost.tsx b/src/shared/notes/mentions/boost.tsx index 03d0574e..49ada66e 100644 --- a/src/shared/notes/mentions/boost.tsx +++ b/src/shared/notes/mentions/boost.tsx @@ -1,3 +1,3 @@ export function Boost({ boost }: { boost: string }) { - return {boost}; + return {boost}; } diff --git a/src/shared/notes/mentions/hashtag.tsx b/src/shared/notes/mentions/hashtag.tsx index 69af5180..d5e204eb 100644 --- a/src/shared/notes/mentions/hashtag.tsx +++ b/src/shared/notes/mentions/hashtag.tsx @@ -24,7 +24,7 @@ export function Hashtag({ tag }: { tag: string }) { content: tag.replace('#', ''), }) } - className="break-all text-blue-500 hover:text-blue-500" + className="cursor-default break-all text-blue-500 hover:text-blue-600" > {tag} diff --git a/src/shared/notes/mentions/invoice.tsx b/src/shared/notes/mentions/invoice.tsx index a74711d3..f8133d46 100644 --- a/src/shared/notes/mentions/invoice.tsx +++ b/src/shared/notes/mentions/invoice.tsx @@ -1,9 +1,10 @@ import { QRCodeSVG } from 'qrcode.react'; +import { memo } from 'react'; -export function Invoice({ invoice }: { invoice: string }) { +export const Invoice = memo(function Invoice({ invoice }: { invoice: string }) { return ( -
+ -
+ ); -} +}); diff --git a/src/shared/notes/mentions/user.tsx b/src/shared/notes/mentions/user.tsx index 008431c9..80a9679f 100644 --- a/src/shared/notes/mentions/user.tsx +++ b/src/shared/notes/mentions/user.tsx @@ -30,7 +30,7 @@ export const MentionUser = memo(function MentionUser({ pubkey }: { pubkey: strin content: pubkey, }) } - className="break-words text-blue-500 hover:text-blue-500" + className="break-words text-blue-500 hover:text-blue-600" > {'@' + (user?.name || diff --git a/src/shared/notes/preview/image.tsx b/src/shared/notes/preview/image.tsx index 01a7647d..7db4acd0 100644 --- a/src/shared/notes/preview/image.tsx +++ b/src/shared/notes/preview/image.tsx @@ -11,30 +11,25 @@ export function ImagePreview({ urls, truncate }: { urls: string[]; truncate?: bo }; return ( -
-
- {urls.map((url) => ( -
- image - -
- ))} -
+
+ {urls.map((url) => ( +
+ image + +
+ ))}
); } diff --git a/src/shared/notes/preview/link.tsx b/src/shared/notes/preview/link.tsx index 3a3ee9f6..762315d2 100644 --- a/src/shared/notes/preview/link.tsx +++ b/src/shared/notes/preview/link.tsx @@ -7,7 +7,7 @@ export function LinkPreview({ urls }: { urls: string[] }) { const domain = new URL(urls[0]); return ( -
+
{status === 'loading' ? (
diff --git a/src/shared/notes/preview/video.tsx b/src/shared/notes/preview/video.tsx index ee4ed266..863be400 100644 --- a/src/shared/notes/preview/video.tsx +++ b/src/shared/notes/preview/video.tsx @@ -4,21 +4,29 @@ import { DefaultVideoLayout, defaultLayoutIcons, } from '@vidstack/react/player/layouts/default'; +import { memo } from 'react'; -export function VideoPreview({ urls }: { urls: string[] }) { +export const VideoPreview = memo(function VideoPreview({ urls }: { urls: string[] }) { return ( -
+
{urls.map((url) => ( - + + + ); -} +}); diff --git a/src/shared/notes/wrapper.tsx b/src/shared/notes/wrapper.tsx index b3e3cae7..8f6d5b15 100644 --- a/src/shared/notes/wrapper.tsx +++ b/src/shared/notes/wrapper.tsx @@ -31,7 +31,7 @@ export function NoteWrapper({
{reply && }
-
+
{cloneElement( diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 79eaa33d..1f961057 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -229,7 +229,7 @@ export const User = memo(function User({ return (
- +
@@ -308,7 +308,7 @@ export const User = memo(function User({ loading="lazy" decoding="async" style={{ contentVisibility: 'auto' }} - className="h-10 w-10 rounded-lg border border-white/5 object-cover" + className="h-10 w-10 rounded-lg object-cover" />
-
+
{user?.name || user?.display_name || user?.displayName || displayNpub(pubkey, 16)} -
- · - {createdAt} +
+
+ {createdAt} +
diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx index 16bc1290..939993da 100644 --- a/src/shared/widgets/local/follows.tsx +++ b/src/shared/widgets/local/follows.tsx @@ -7,11 +7,11 @@ import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { - ArticleNote, - FileNote, + MemoizedArticleNote, + MemoizedFileNote, + MemoizedRepost, + MemoizedTextNote, NoteWrapper, - Repost, - TextNote, UnknownNote, } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; @@ -48,21 +48,21 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { root={dbEvent.root_id} reply={dbEvent.reply_id} > - + ); case NDKKind.Repost: - return ; + return ; case 1063: return ( - + ); case NDKKind.Article: return ( - + ); default: diff --git a/src/shared/widgets/local/network.tsx b/src/shared/widgets/local/network.tsx index 46c15dcf..0b15e95b 100644 --- a/src/shared/widgets/local/network.tsx +++ b/src/shared/widgets/local/network.tsx @@ -7,11 +7,11 @@ import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { - ArticleNote, - FileNote, + MemoizedArticleNote, + MemoizedFileNote, + MemoizedRepost, + MemoizedTextNote, NoteWrapper, - Repost, - TextNote, UnknownNote, } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; @@ -55,21 +55,21 @@ export function LocalNetworkWidget() { root={dbEvent.root_id} reply={dbEvent.reply_id} > - + ); case NDKKind.Repost: - return ; + return ; case 1063: return ( - + ); case NDKKind.Article: return ( - + ); default: diff --git a/src/shared/widgets/local/thread.tsx b/src/shared/widgets/local/thread.tsx index f95b1556..2e044bea 100644 --- a/src/shared/widgets/local/thread.tsx +++ b/src/shared/widgets/local/thread.tsx @@ -4,12 +4,12 @@ import { useCallback } from 'react'; import { useStorage } from '@libs/storage/provider'; import { - ArticleNote, - FileNote, + MemoizedArticleNote, + MemoizedFileNote, + MemoizedTextNote, NoteActions, NoteReplyForm, NoteStats, - TextNote, UnknownNote, } from '@shared/notes'; import { RepliesList } from '@shared/notes/replies/list'; @@ -29,11 +29,11 @@ export function LocalThreadWidget({ params }: { params: Widget }) { (event: NDKEvent) => { switch (event.kind) { case NDKKind.Text: - return ; + return ; case NDKKind.Article: - return ; + return ; case 1063: - return ; + return ; default: return ; } diff --git a/src/shared/widgets/wrapper.tsx b/src/shared/widgets/wrapper.tsx index f37dacbb..d6f87655 100644 --- a/src/shared/widgets/wrapper.tsx +++ b/src/shared/widgets/wrapper.tsx @@ -13,15 +13,15 @@ export function WidgetWrapper({ return ( e.preventDefault()} onResizeStop={(_e, _direction, _ref, d) => { setWidth((prevWidth) => prevWidth + d.width); }} minWidth={420} - minHeight={'100vh'} + maxWidth={600} className={twMerge( - 'h-full border-r border-neutral-100 pb-10 dark:border-neutral-900', + 'flex flex-col border-r border-neutral-100 dark:border-neutral-900', className )} enable={{ right: true }} diff --git a/vite.config.ts b/vite.config.ts index 94e36316..cb881db5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,10 @@ import react from '@vitejs/plugin-react-swc'; +import million from 'million/compiler'; import { defineConfig } from 'vite'; import viteTsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - plugins: [react(), viteTsconfigPaths()], + plugins: [million.vite({ auto: true }), react(), viteTsconfigPaths()], envPrefix: ['VITE_', 'TAURI_'], build: { target: process.env.TAURI_PLATFORM === 'windows' ? 'chrome105' : 'safari13',