diff --git a/package.json b/package.json index f5d6967c..fe86f03b 100644 --- a/package.json +++ b/package.json @@ -59,13 +59,11 @@ "cheerio": "1.0.0-rc.12", "dayjs": "^1.11.9", "destr": "^1.2.2", - "framer-motion": "^10.15.1", "get-urls": "^11.0.0", "html-to-text": "^9.0.5", "immer": "^10.0.2", "light-bolt11-decoder": "^3.0.0", "lru-cache": "^10.0.0", - "million": "2.5.4-beta.2", "nostr-fetch": "^0.12.2", "nostr-tools": "^1.14.0", "qrcode.react": "^3.1.0", @@ -77,9 +75,8 @@ "react-player": "^2.12.0", "react-router-dom": "^6.14.2", "react-string-replace": "^1.1.1", - "react-virtuoso": "^4.4.2", + "react-virtuoso": "^4.5.0", "remark-gfm": "^3.0.1", - "tauri-controls": "^0.0.5", "tippy.js": "^6.3.7", "zustand": "^4.4.1" }, @@ -89,7 +86,7 @@ "@trivago/prettier-plugin-sort-imports": "^4.2.0", "@types/html-to-text": "^9.0.1", "@types/node": "^18.17.4", - "@types/react": "^18.2.19", + "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "^5.62.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 413e2248..2705876d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,16 +24,16 @@ dependencies: version: 0.11.0(@nostr-dev-kit/ndk@0.8.7)(nostr-fetch@0.12.2) '@radix-ui/react-collapsible': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dialog': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-popover': specifier: ^1.0.6 - version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tooltip': specifier: ^1.0.6 - version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@scure/base': specifier: ^1.1.1 version: 1.1.1 @@ -127,9 +127,6 @@ dependencies: destr: specifier: ^1.2.2 version: 1.2.2 - framer-motion: - specifier: ^10.15.1 - version: 10.15.1(react-dom@18.2.0)(react@18.2.0) get-urls: specifier: ^11.0.0 version: 11.0.0 @@ -145,9 +142,6 @@ dependencies: lru-cache: specifier: ^10.0.0 version: 10.0.0 - million: - specifier: 2.5.4-beta.2 - version: 2.5.4-beta.2 nostr-fetch: specifier: ^0.12.2 version: 0.12.2 @@ -171,7 +165,7 @@ dependencies: version: 4.4.1(react-dom@18.2.0)(react@18.2.0) react-markdown: specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.19)(react@18.2.0) + version: 8.0.7(@types/react@18.2.20)(react@18.2.0) react-player: specifier: ^2.12.0 version: 2.12.0(react@18.2.0) @@ -182,20 +176,17 @@ dependencies: specifier: ^1.1.1 version: 1.1.1 react-virtuoso: - specifier: ^4.4.2 - version: 4.4.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.5.0 + version: 4.5.0(react-dom@18.2.0)(react@18.2.0) remark-gfm: specifier: ^3.0.1 version: 3.0.1 - tauri-controls: - specifier: ^0.0.5 - version: 0.0.5(@tauri-apps/plugin-os@2.0.0-alpha.0)(@tauri-apps/plugin-window@2.0.0-alpha.0)(clsx@2.0.0)(react-dom@18.2.0)(react@18.2.0)(tailwind-merge@1.14.0) tippy.js: specifier: ^6.3.7 version: 6.3.7 zustand: specifier: ^4.4.1 - version: 4.4.1(@types/react@18.2.19)(immer@10.0.2)(react@18.2.0) + version: 4.4.1(@types/react@18.2.20)(immer@10.0.2)(react@18.2.0) devDependencies: '@tailwindcss/typography': @@ -214,8 +205,8 @@ devDependencies: specifier: ^18.17.4 version: 18.17.4 '@types/react': - specifier: ^18.2.19 - version: 18.2.19 + specifier: ^18.2.20 + version: 18.2.20 '@types/react-dom': specifier: ^18.2.7 version: 18.2.7 @@ -309,14 +300,6 @@ packages: engines: {node: '>=10'} dev: true - /@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.10: resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} @@ -324,34 +307,6 @@ packages: '@babel/highlight': 7.22.10 chalk: 2.4.2 - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/core@7.22.10: - resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helpers': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 - convert-source-map: 1.9.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==} engines: {node: '>=6.9.0'} @@ -361,30 +316,10 @@ packages: source-map: 0.5.7 dev: true - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - dev: false - - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false - /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} @@ -392,76 +327,31 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.10 + dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 - dev: false - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - 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.22.10 - dev: false + dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 + 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.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helpers@7.22.10: - resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} @@ -476,34 +366,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.17.0 - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/polyfill@7.12.1: - resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} - deprecated: 🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information. - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.13.11 - dev: false + dev: true /@babel/runtime@7.22.10: resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} @@ -518,6 +381,7 @@ packages: '@babel/code-frame': 7.22.10 '@babel/parser': 7.22.10 '@babel/types': 7.22.10 + dev: true /@babel/traverse@7.17.3: resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} @@ -537,30 +401,13 @@ packages: - supports-color dev: true - /@babel/traverse@7.22.10: - resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 - 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.5 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.22.10: resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} @@ -569,6 +416,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + dev: true /@ctrl/magnet-link@3.1.2: resolution: {integrity: sha512-XtOAThYlGGp3atqy/pfXDXN9OawHWUFg+Dg8t8vD7ITAk76O3Ev/wJlA+jx33gaifLZEL78+saffHB+Qv9aWRw==} @@ -582,19 +430,6 @@ packages: engines: {node: '>=14.16'} dev: false - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true - dependencies: - '@emotion/memoize': 0.7.4 - dev: false - optional: true - - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - dev: false - optional: true - /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -1107,23 +942,28 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 + dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@noble/ciphers@0.2.0: resolution: {integrity: sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==} @@ -1244,7 +1084,7 @@ packages: '@babel/runtime': 7.22.10 dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -1258,14 +1098,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -1280,20 +1120,20 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -1303,11 +1143,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -1317,11 +1157,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} peerDependencies: '@types/react': '*' @@ -1336,26 +1176,26 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.19)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.20)(react@18.2.0) dev: false - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: '@types/react': '*' @@ -1370,17 +1210,17 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -1390,11 +1230,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: '@types/react': '*' @@ -1408,16 +1248,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -1427,12 +1267,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} peerDependencies: '@types/react': '*' @@ -1447,27 +1287,27 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.19)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.20)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -1482,22 +1322,22 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.19)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.19 + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -1511,14 +1351,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -1532,15 +1372,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -1554,14 +1394,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -1571,12 +1411,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} peerDependencies: '@types/react': '*' @@ -1591,24 +1431,24 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -1618,11 +1458,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -1632,12 +1472,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -1647,12 +1487,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -1662,11 +1502,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -1677,11 +1517,11 @@ packages: dependencies: '@babel/runtime': 7.22.10 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.19)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1691,12 +1531,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.19)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) + '@types/react': 18.2.20 react: 18.2.0 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1710,8 +1550,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.19)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.19 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.20 '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2491,10 +2331,10 @@ packages: /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 - /@types/react@18.2.19: - resolution: {integrity: sha512-e2S8wmY1ePfM517PqCG80CcE48Xs5k0pwJzuDZsfE8IZRRBfOMCF+XqnFxu6mWtyivum1MQm4aco+WIt6Coimw==} + /@types/react@18.2.20: + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -2749,6 +2589,7 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: true /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -2897,16 +2738,6 @@ packages: dequal: 2.0.3 dev: true - /babel-plugin-transform-react-createelement-to-jsx@1.1.0(@babel/core@7.22.10): - resolution: {integrity: sha512-43xMHy06ARCmF8UKte/9OJ+gp5bh51UoUe5SYTSBh3zFtcjxzCTzwKyGv8uOWGQNYrrPAl6iyynxARSXDCXoNA==} - engines: {node: '>=0.12'} - dependencies: - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/polyfill': 7.12.1 - transitivePeerDependencies: - - '@babel/core' - dev: false - /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false @@ -2917,6 +2748,7 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + dev: true /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2946,9 +2778,10 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001519 - electron-to-chromium: 1.4.488 + electron-to-chromium: 1.4.490 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true /bufferutil@4.0.7: resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} @@ -3007,6 +2840,7 @@ packages: /caniuse-lite@1.0.30001519: resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + dev: true /case-anything@2.1.13: resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} @@ -3078,6 +2912,7 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 + dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -3118,6 +2953,7 @@ packages: /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} + dev: true /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -3166,10 +3002,6 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - /copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} @@ -3177,12 +3009,6 @@ packages: is-what: 4.1.15 dev: false - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false - /create-esm-loader@0.2.3: resolution: {integrity: sha512-cllzD6IU/mzXBs5OdQVWL3+ne5Elpu3Wdm7h5OldMbGXk76yr9XzHlQXWJ4zfs0ZAibe26rkbs4KvMAJm7fIZA==} engines: {node: '>=14.x'} @@ -3418,8 +3244,9 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /electron-to-chromium@1.4.488: - resolution: {integrity: sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ==} + /electron-to-chromium@1.4.490: + resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3614,6 +3441,7 @@ 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==} @@ -4016,24 +3844,6 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true - /framer-motion@10.15.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-6avJj/Uftblw0fMmo6jDHkKRH4TBdkMX/FiyR3G/hFe3hQHE4BUNJCqlMPKg9EzfI5jyqDOwO5oDnU+bW5y0eg==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.1 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - dev: false - /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -4056,6 +3866,7 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true optional: true /function-bind@1.1.1: @@ -4087,11 +3898,6 @@ packages: wide-align: 1.1.5 dev: false - /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: @@ -4146,7 +3952,7 @@ packages: hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.2 + jackspeak: 2.2.3 minimatch: 9.0.3 minipass: 5.0.0 path-scurry: 1.10.1 @@ -4176,6 +3982,7 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} @@ -4434,6 +4241,7 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 + dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -4592,8 +4400,8 @@ packages: engines: {node: '>=0.10.0'} dev: false - /jackspeak@2.2.2: - resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} + /jackspeak@2.2.3: + resolution: {integrity: sha512-pF0kfjmg8DJLxDrizHoCZGUFz4P4czQ3HyfW4BU0ffebYkzAVlBywp5zaxW/TM+r0sGbmrQdi8EQQVTJFxnGsQ==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -4638,6 +4446,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: true /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -4660,12 +4469,6 @@ packages: minimist: 1.2.8 dev: false - /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'} @@ -4844,12 +4647,6 @@ 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'} @@ -5337,21 +5134,6 @@ packages: braces: 3.0.2 picomatch: 2.3.1 - /million@2.5.4-beta.2: - resolution: {integrity: sha512-w9oZb83k+Zha8K/NJjOuEyBPUAeJaf9E8UFtwO5KIRoNHjhlHXcY0Rh9yaQD4wwARxcVy9/H2IvYRU1/PZm7aw==} - dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) - '@babel/types': 7.22.10 - babel-plugin-transform-react-createelement-to-jsx: 1.1.0(@babel/core@7.22.10) - kleur: 4.1.5 - unplugin: 1.4.0 - transitivePeerDependencies: - - supports-color - dev: false - /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -5551,6 +5333,7 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} @@ -5582,6 +5365,7 @@ packages: /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + dev: true /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} @@ -5893,6 +5677,7 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -6318,7 +6103,7 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: false - /react-markdown@8.0.7(@types/react@18.2.19)(react@18.2.0): + /react-markdown@8.0.7(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: '@types/react': '>=16' @@ -6326,7 +6111,7 @@ packages: dependencies: '@types/hast': 2.3.5 '@types/prop-types': 15.7.5 - '@types/react': 18.2.19 + '@types/react': 18.2.20 '@types/unist': 2.0.7 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 @@ -6358,7 +6143,7 @@ packages: react-fast-compare: 3.2.2 dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.19)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -6368,13 +6153,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.19)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.20)(react@18.2.0) tslib: 2.6.1 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.19)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -6384,13 +6169,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.19)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.19)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.20)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.20)(react@18.2.0) tslib: 2.6.1 - use-callback-ref: 1.3.0(@types/react@18.2.19)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.19)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.20)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.20)(react@18.2.0) dev: false /react-router-dom@6.14.2(react-dom@18.2.0)(react@18.2.0): @@ -6421,7 +6206,7 @@ packages: engines: {node: '>=0.12.0'} dev: false - /react-style-singleton@2.2.1(@types/react@18.2.19)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -6431,15 +6216,15 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.1 dev: false - /react-virtuoso@4.4.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9uChSRSK5bTbKTxzuta4RqhfrlZSVHI/v8fHwmv3jmImS8FjdZ4Mzgqz9JKUp/yQo3dIHkR2QwidQeqxgYzPhQ==} + /react-virtuoso@4.5.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OMP6XrzJMMos1vbJZC16RxGW7utAxUMP7i5PNPi6epBNVH7nz+CF/DlmecNBep5wyjLud51dQ5epjb2A0w9W/Q==} engines: {node: '>=10'} peerDependencies: react: '>=16 || >=17 || >= 18' @@ -6504,6 +6289,7 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: true /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -6513,10 +6299,6 @@ packages: strip-indent: 3.0.0 dev: false - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false - /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} @@ -6610,8 +6392,8 @@ packages: dependencies: glob: 7.2.3 - /rollup@3.27.2: - resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==} + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -6994,6 +6776,7 @@ packages: /tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + dev: true /tailwindcss@3.3.3: resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} @@ -7038,25 +6821,6 @@ packages: yallist: 4.0.0 dev: false - /tauri-controls@0.0.5(@tauri-apps/plugin-os@2.0.0-alpha.0)(@tauri-apps/plugin-window@2.0.0-alpha.0)(clsx@2.0.0)(react-dom@18.2.0)(react@18.2.0)(tailwind-merge@1.14.0): - resolution: {integrity: sha512-q/7UdIn0PSunaRuqsjWlLKNsWLYRaF8jLylDdKEK7Q+5E/galN/ZoK2YBd4frjLfbMfT9vI5kxq3wyo7Z4UGWA==} - peerDependencies: - '@tauri-apps/plugin-os': 2.0.0-alpha.0 - '@tauri-apps/plugin-window': 2.0.0-alpha.0 - clsx: ^2.0.0 - react: '>=17.x' - react-dom: '>=17.x' - tailwind-merge: ^1.14.0 - dependencies: - '@tauri-apps/api': 2.0.0-alpha.5 - '@tauri-apps/plugin-os': github.com/tauri-apps/tauri-plugin-os/a63d34fddb1bd97d6a634a1881e5cc26910e115f - '@tauri-apps/plugin-window': 2.0.0-alpha.0 - clsx: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tailwind-merge: 1.14.0 - dev: false - /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -7088,14 +6852,15 @@ packages: '@popperjs/core': 2.11.8 dev: false - /tlds@1.240.0: - resolution: {integrity: sha512-1OYJQenswGZSOdRw7Bql5Qu7uf75b+F3HFBXbqnG/ifHa0fev1XcG+3pJf3pA/KC6RtHQzfKgIf1vkMlMG7mtQ==} + /tlds@1.242.0: + resolution: {integrity: sha512-aP3dXawgmbfU94mA32CJGHmJUE1E58HCB1KmlKRhBNtqBL27mSQcAEmcaMaQ1Za9kIVvOdbxJD3U5ycDy7nJ3w==} hasBin: true dev: false /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==} @@ -7343,15 +7108,6 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /unplugin@1.4.0: - resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} - 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.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true @@ -7361,6 +7117,7 @@ packages: browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 + dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -7378,10 +7135,10 @@ packages: dependencies: ip-regex: 4.3.0 re2: 1.20.1 - tlds: 1.240.0 + tlds: 1.242.0 dev: false - /use-callback-ref@1.3.0(@types/react@18.2.19)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -7391,12 +7148,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 react: 18.2.0 tslib: 2.6.1 dev: false - /use-sidecar@1.1.2(@types/react@18.2.19)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -7406,7 +7163,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.1 @@ -7537,7 +7294,7 @@ packages: '@types/node': 18.17.4 esbuild: 0.18.20 postcss: 8.4.27 - rollup: 3.27.2 + rollup: 3.28.0 optionalDependencies: fsevents: 2.3.2 dev: true @@ -7551,15 +7308,6 @@ 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: @@ -7656,10 +7404,6 @@ 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==} @@ -7677,7 +7421,7 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zustand@4.4.1(@types/react@18.2.19)(immer@10.0.2)(react@18.2.0): + /zustand@4.4.1(@types/react@18.2.20)(immer@10.0.2)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -7692,7 +7436,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.19 + '@types/react': 18.2.20 immer: 10.0.2 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 91347247..b94caab6 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -281,7 +281,7 @@ dependencies = [ "polling", "rustix 0.37.23", "slab", - "socket2", + "socket2 0.4.9", "waker-fn", ] @@ -2211,7 +2211,7 @@ dependencies = [ "httpdate", "itoa 1.0.9", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -2269,9 +2269,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" dependencies = [ "bytemuck", "byteorder", @@ -2677,8 +2677,6 @@ dependencies = [ name = "lume" version = "1.2.0" dependencies = [ - "cocoa 0.24.1", - "objc", "rand 0.8.5", "rust-argon2", "serde", @@ -2703,7 +2701,6 @@ dependencies = [ "tauri-plugin-updater", "tauri-plugin-upload", "tauri-plugin-window", - "window-shadows", "window-vibrancy", ] @@ -3388,9 +3385,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c516611246607d0c04186886dbb3a754368ef82c79e9827a802c6d836dd111c" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -4332,6 +4329,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "soup3" version = "0.3.2" @@ -5401,9 +5408,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" dependencies = [ "flate2", "jpeg-decoder", @@ -5455,18 +5462,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "2d3ce25f50619af8b0aec2eb23deebe84249e19e2ddd393a6e16e3300a6dadfd" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", "mio", "num_cpus", "pin-project-lite", - "socket2", + "socket2 0.5.3", "tokio-macros", "windows-sys 0.48.0", ] @@ -6042,17 +6048,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "window-shadows" -version = "0.2.1" -source = "git+https://github.com/tauri-apps/window-shadows?branch=dev#dd8ca283fa50b1484043e686fa0b1e45ba5a969d" -dependencies = [ - "cocoa 0.25.0", - "objc", - "raw-window-handle", - "windows-sys 0.48.0", -] - [[package]] name = "window-vibrancy" version = "0.4.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index b776fee1..8adb9bfa 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -36,7 +36,6 @@ tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", bra tauri-plugin-window = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -window-shadows = { git = "https://github.com/tauri-apps/window-shadows", branch = "dev" } window-vibrancy = { git = "https://github.com/tauri-apps/window-vibrancy", branch = "dev" } sqlx-cli = { version = "0.7.0", default-features = false, features = [ "sqlite", @@ -49,10 +48,6 @@ git = "https://github.com/tauri-apps/plugins-workspace" branch = "v2" features = ["sqlite"] -[target.'cfg(target_os = "macos")'.dependencies] -objc = "0.2.7" -cocoa = "0.24.1" - [features] # by default Tauri runs in production mode # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 8f595610..500fc652 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,7 +7,6 @@ use tauri::Manager; use tauri_plugin_autostart::MacosLauncher; use tauri_plugin_sql::{Migration, MigrationKind}; -use window_shadows::set_shadow; use window_vibrancy::{apply_mica, apply_vibrancy, NSVisualEffectMaterial}; #[derive(Clone, serde::Serialize)] @@ -164,9 +163,6 @@ fn main() { .setup(|app| { let window = app.get_window("main").unwrap(); - // native shadow - set_shadow(&window, true).expect("Unsupported platform!"); - #[cfg(target_os = "macos")] apply_vibrancy(&window, NSVisualEffectMaterial::HudWindow, None, None) .expect("Unsupported platform! 'apply_vibrancy' is only supported on macOS"); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e674efea..87cedc1a 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -111,7 +111,7 @@ { "width": 400, "height": 500, - "decorations": true, + "decorations": false, "hiddenTitle": true, "center": true, "resizable": false, diff --git a/src/app.tsx b/src/app.tsx index 04d62d74..a3ba0c3c 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -40,6 +40,12 @@ const appLoader = async () => { const account = await getActiveAccount(); const stronghold = sessionStorage.getItem('stronghold'); const privkey = JSON.parse(stronghold).state.privkey || null; + const onboarding = localStorage.getItem('onboarding'); + const step = JSON.parse(onboarding).state.step || null; + + if (step) { + return redirect(step); + } if (!account) { return redirect('/auth/welcome'); diff --git a/src/app/auth/create/index.tsx b/src/app/auth/create/index.tsx index 15be94d7..503f1643 100644 --- a/src/app/auth/create/index.tsx +++ b/src/app/auth/create/index.tsx @@ -1,6 +1,19 @@ +import { useEffect } from 'react'; import { Outlet } from 'react-router-dom'; +import { useOnboarding } from '@stores/onboarding'; +import { useStronghold } from '@stores/stronghold'; + export function AuthCreateScreen() { + const [step, tmpPrivkey] = useOnboarding((state) => [state.step, state.tempPrivkey]); + const setPrivkey = useStronghold((state) => state.setPrivkey); + + useEffect(() => { + if (step) { + setPrivkey(tmpPrivkey); + } + }, [tmpPrivkey]); + return (
diff --git a/src/app/auth/create/step-1.tsx b/src/app/auth/create/step-1.tsx index bbbc1c62..78578d6f 100644 --- a/src/app/auth/create/step-1.tsx +++ b/src/app/auth/create/step-1.tsx @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { BaseDirectory, writeTextFile } from '@tauri-apps/plugin-fs'; import { generatePrivateKey, getPublicKey, nip19 } from 'nostr-tools'; -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { createAccount } from '@libs/storage'; @@ -17,7 +17,9 @@ export function CreateStep1Screen() { const queryClient = useQueryClient(); const navigate = useNavigate(); const setPrivkey = useStronghold((state) => state.setPrivkey); + const setTempPrivkey = useOnboarding((state) => state.setTempPrivkey); const setPubkey = useOnboarding((state) => state.setPubkey); + const setStep = useOnboarding((state) => state.setStep); const [privkeyInput, setPrivkeyInput] = useState('password'); const [loading, setLoading] = useState(false); @@ -61,8 +63,9 @@ export function CreateStep1Screen() { const submit = () => { setLoading(true); - setPubkey(pubkey); setPrivkey(privkey); + setTempPrivkey(privkey); // only use if user close app and reopen it + setPubkey(pubkey); account.mutate({ npub, @@ -75,6 +78,11 @@ export function CreateStep1Screen() { setTimeout(() => navigate('/auth/create/step-2', { replace: true }), 1200); }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/create/step-1'); + }, []); + return (
diff --git a/src/app/auth/create/step-2.tsx b/src/app/auth/create/step-2.tsx index f1221b26..9a7dde4a 100644 --- a/src/app/auth/create/step-2.tsx +++ b/src/app/auth/create/step-2.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Resolver, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; @@ -30,13 +30,13 @@ const resolver: Resolver = async (values) => { export function CreateStep2Screen() { const navigate = useNavigate(); + const setStep = useOnboarding((state) => state.setStep); + const pubkey = useOnboarding((state) => state.pubkey); + const privkey = useStronghold((state) => state.privkey); const [passwordInput, setPasswordInput] = useState('password'); const [loading, setLoading] = useState(false); - const privkey = useStronghold((state) => state.privkey); - const pubkey = useOnboarding((state) => state.pubkey); - const { save } = useSecureStorage(); // toggle private key @@ -72,6 +72,11 @@ export function CreateStep2Screen() { } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/create/step-2'); + }, []); + return (
diff --git a/src/app/auth/create/step-3.tsx b/src/app/auth/create/step-3.tsx index fbc90e6d..64c91921 100644 --- a/src/app/auth/create/step-3.tsx +++ b/src/app/auth/create/step-3.tsx @@ -1,5 +1,5 @@ import { useQueryClient } from '@tanstack/react-query'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; @@ -10,19 +10,20 @@ import { ArrowRightCircleIcon } from '@shared/icons/arrowRightCircle'; import { Image } from '@shared/image'; import { DEFAULT_AVATAR } from '@stores/constants'; +import { useOnboarding } from '@stores/onboarding'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function CreateStep3Screen() { - const { publish } = usePublish(); - const navigate = useNavigate(); + const setStep = useOnboarding((state) => state.setStep); const queryClient = useQueryClient(); const [loading, setLoading] = useState(false); const [picture, setPicture] = useState(DEFAULT_AVATAR); const [banner, setBanner] = useState(''); + const { publish } = useNostr(); const { register, handleSubmit, @@ -57,6 +58,11 @@ export function CreateStep3Screen() { } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/create/step-3'); + }, []); + return (
diff --git a/src/app/auth/import/index.tsx b/src/app/auth/import/index.tsx index bf8983ff..37aebf6b 100644 --- a/src/app/auth/import/index.tsx +++ b/src/app/auth/import/index.tsx @@ -1,6 +1,19 @@ +import { useEffect } from 'react'; import { Outlet } from 'react-router-dom'; +import { useOnboarding } from '@stores/onboarding'; +import { useStronghold } from '@stores/stronghold'; + export function AuthImportScreen() { + const [step, tmpPrivkey] = useOnboarding((state) => [state.step, state.tempPrivkey]); + const setPrivkey = useStronghold((state) => state.setPrivkey); + + useEffect(() => { + if (step) { + setPrivkey(tmpPrivkey); + } + }, [tmpPrivkey]); + return (
diff --git a/src/app/auth/import/step-1.tsx b/src/app/auth/import/step-1.tsx index 929ff38c..33565e4e 100644 --- a/src/app/auth/import/step-1.tsx +++ b/src/app/auth/import/step-1.tsx @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { getPublicKey, nip19 } from 'nostr-tools'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Resolver, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; @@ -34,7 +34,9 @@ export function ImportStep1Screen() { const queryClient = useQueryClient(); const navigate = useNavigate(); const setPrivkey = useStronghold((state) => state.setPrivkey); + const setTempPubkey = useOnboarding((state) => state.setTempPrivkey); const setPubkey = useOnboarding((state) => state.setPubkey); + const setStep = useOnboarding((state) => state.setStep); const [loading, setLoading] = useState(false); @@ -72,10 +74,9 @@ export function ImportStep1Screen() { const pubkey = getPublicKey(privkey); const npub = nip19.npubEncode(pubkey); - // use for onboarding process only - setPubkey(pubkey); - // add stronghold state setPrivkey(privkey); + setTempPubkey(privkey); // only use if user close app and reopen it + setPubkey(pubkey); // add account to local database account.mutate({ @@ -91,11 +92,16 @@ export function ImportStep1Screen() { } catch (error) { setError('privkey', { type: 'custom', - message: 'Private Key is invalid, please check again', + message: 'Private key is invalid, please check again', }); } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/import/step-1'); + }, []); + return (
diff --git a/src/app/auth/import/step-2.tsx b/src/app/auth/import/step-2.tsx index ea84b955..ee00aa0b 100644 --- a/src/app/auth/import/step-2.tsx +++ b/src/app/auth/import/step-2.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Resolver, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; @@ -30,13 +30,13 @@ const resolver: Resolver = async (values) => { export function ImportStep2Screen() { const navigate = useNavigate(); + const setStep = useOnboarding((state) => state.setStep); + const pubkey = useOnboarding((state) => state.pubkey); + const privkey = useStronghold((state) => state.privkey); const [passwordInput, setPasswordInput] = useState('password'); const [loading, setLoading] = useState(false); - const privkey = useStronghold((state) => state.privkey); - const pubkey = useOnboarding((state) => state.pubkey); - const { save } = useSecureStorage(); // toggle private key @@ -72,6 +72,11 @@ export function ImportStep2Screen() { } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/import/step-2'); + }, []); + return (
diff --git a/src/app/auth/import/step-3.tsx b/src/app/auth/import/step-3.tsx index d3a034fc..93513a58 100644 --- a/src/app/auth/import/step-3.tsx +++ b/src/app/auth/import/step-3.tsx @@ -1,5 +1,5 @@ import { useQueryClient } from '@tanstack/react-query'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { User } from '@app/auth/components/user'; @@ -8,12 +8,15 @@ import { updateLastLogin } from '@libs/storage'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; +import { useOnboarding } from '@stores/onboarding'; + import { useAccount } from '@utils/hooks/useAccount'; import { useNostr } from '@utils/hooks/useNostr'; export function ImportStep3Screen() { - const navigate = useNavigate(); const queryClient = useQueryClient(); + const navigate = useNavigate(); + const setStep = useOnboarding((state) => state.setStep); const [loading, setLoading] = useState(false); @@ -39,6 +42,11 @@ export function ImportStep3Screen() { } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/import/step-3'); + }, []); + return (
diff --git a/src/app/auth/onboarding/index.tsx b/src/app/auth/onboarding/index.tsx index 8a9358a7..ddf8d4b8 100644 --- a/src/app/auth/onboarding/index.tsx +++ b/src/app/auth/onboarding/index.tsx @@ -1,6 +1,19 @@ +import { useEffect } from 'react'; import { Outlet } from 'react-router-dom'; +import { useOnboarding } from '@stores/onboarding'; +import { useStronghold } from '@stores/stronghold'; + export function OnboardingScreen() { + const [step, tmpPrivkey] = useOnboarding((state) => [state.step, state.tempPrivkey]); + const setPrivkey = useStronghold((state) => state.setPrivkey); + + useEffect(() => { + if (step) { + setPrivkey(tmpPrivkey); + } + }, [tmpPrivkey]); + return (
diff --git a/src/app/auth/onboarding/step-1.tsx b/src/app/auth/onboarding/step-1.tsx index 38682d40..79e64a00 100644 --- a/src/app/auth/onboarding/step-1.tsx +++ b/src/app/auth/onboarding/step-1.tsx @@ -1,5 +1,5 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { User } from '@app/auth/components/user'; @@ -8,17 +8,18 @@ import { updateAccount } from '@libs/storage'; import { ArrowRightCircleIcon, CheckCircleIcon, LoaderIcon } from '@shared/icons'; +import { useOnboarding } from '@stores/onboarding'; + import { useAccount } from '@utils/hooks/useAccount'; import { useNostr } from '@utils/hooks/useNostr'; -import { usePublish } from '@utils/hooks/usePublish'; import { arrayToNIP02 } from '@utils/transform'; export function OnboardStep1Screen() { const queryClient = useQueryClient(); const navigate = useNavigate(); + const setStep = useOnboarding((state) => state.setStep); - const { publish } = usePublish(); - const { fetchNotes } = useNostr(); + const { publish, fetchNotes } = useNostr(); const { account } = useAccount(); const { status, data } = useQuery(['trending-profiles'], async () => { const res = await fetch('https://api.nostr.band/v0/trending/profiles'); @@ -62,6 +63,11 @@ export function OnboardStep1Screen() { } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/onboarding'); + }, []); + return (
diff --git a/src/app/auth/onboarding/step-2.tsx b/src/app/auth/onboarding/step-2.tsx index d0c2e395..aed63ea2 100644 --- a/src/app/auth/onboarding/step-2.tsx +++ b/src/app/auth/onboarding/step-2.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { createBlock } from '@libs/storage'; @@ -6,6 +6,7 @@ import { createBlock } from '@libs/storage'; import { ArrowRightCircleIcon, CheckCircleIcon, LoaderIcon } from '@shared/icons'; import { BLOCK_KINDS } from '@stores/constants'; +import { useOnboarding } from '@stores/onboarding'; const data = [ { hashtag: '#bitcoin' }, @@ -27,6 +28,7 @@ const data = [ export function OnboardStep2Screen() { const navigate = useNavigate(); + const setStep = useOnboarding((state) => state.setStep); const [loading, setLoading] = useState(false); const [tags, setTags] = useState(new Set()); @@ -57,6 +59,11 @@ export function OnboardStep2Screen() { } }; + useEffect(() => { + // save current step, if user close app and reopen it + setStep('/auth/onboarding/step-2'); + }, []); + return (
diff --git a/src/app/auth/onboarding/step-3.tsx b/src/app/auth/onboarding/step-3.tsx index a52c5011..76836f88 100644 --- a/src/app/auth/onboarding/step-3.tsx +++ b/src/app/auth/onboarding/step-3.tsx @@ -10,17 +10,19 @@ import { createRelay } from '@libs/storage'; import { ArrowRightCircleIcon, CheckCircleIcon, LoaderIcon } from '@shared/icons'; import { FULL_RELAYS } from '@stores/constants'; +import { useOnboarding } from '@stores/onboarding'; import { useAccount } from '@utils/hooks/useAccount'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function OnboardStep3Screen() { const navigate = useNavigate(); + const [setStep, clearStep] = useOnboarding((state) => [state.setStep, state.clearStep]); const [loading, setLoading] = useState(false); const [relays, setRelays] = useState(new Set()); - const { publish } = usePublish(); + const { publish } = useNostr(); const { account } = useAccount(); const { fetcher, relayUrls } = useNDK(); const { status, data } = useQuery( @@ -48,6 +50,9 @@ export function OnboardStep3Screen() { } ); + // save current step, if user close app and reopen it + setStep('/auth/onboarding/step-3'); + const toggleRelay = (relay: string) => { if (relays.has(relay)) { setRelays((prev) => { @@ -76,6 +81,7 @@ export function OnboardStep3Screen() { } setTimeout(() => { + clearStep(); navigate('/', { replace: true }); }, 1000); } catch (e) { diff --git a/src/app/auth/welcome.tsx b/src/app/auth/welcome.tsx index 5403df14..f741251e 100644 --- a/src/app/auth/welcome.tsx +++ b/src/app/auth/welcome.tsx @@ -9,7 +9,9 @@ export function WelcomeScreen() { async function setWindow() { await appWindow.setSize(new LogicalSize(400, 500)); await appWindow.setResizable(false); + await appWindow.center(); } + setWindow(); return () => { diff --git a/src/app/chats/components/messages/form.tsx b/src/app/chats/components/messages/form.tsx index 88f7b9b3..182f9446 100644 --- a/src/app/chats/components/messages/form.tsx +++ b/src/app/chats/components/messages/form.tsx @@ -4,7 +4,7 @@ import { useCallback, useState } from 'react'; import { EnterIcon } from '@shared/icons'; import { MediaUploader } from '@shared/mediaUploader'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function ChatMessageForm({ receiverPubkey, @@ -14,7 +14,7 @@ export function ChatMessageForm({ userPubkey: string; userPrivkey: string; }) { - const { publish } = usePublish(); + const { publish } = useNostr(); const [value, setValue] = useState(''); const encryptMessage = useCallback(async () => { diff --git a/src/app/space/components/modals/image.tsx b/src/app/space/components/modals/image.tsx index 487d9692..55f93653 100644 --- a/src/app/space/components/modals/image.tsx +++ b/src/app/space/components/modals/image.tsx @@ -12,14 +12,14 @@ import { Image } from '@shared/image'; import { BLOCK_KINDS, DEFAULT_AVATAR } from '@stores/constants'; import { ADD_IMAGEBLOCK_SHORTCUT } from '@stores/shortcuts'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; import { useImageUploader } from '@utils/hooks/useUploader'; export function ImageModal() { const queryClient = useQueryClient(); const upload = useImageUploader(); - const { publish } = usePublish(); + const { publish } = useNostr(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); diff --git a/src/app/space/hooks/useNewsfeed.tsx b/src/app/space/hooks/useNewsfeed.tsx index a3dc24ec..d8e37a23 100644 --- a/src/app/space/hooks/useNewsfeed.tsx +++ b/src/app/space/hooks/useNewsfeed.tsx @@ -4,8 +4,6 @@ import { useEffect, useRef } from 'react'; import { useNDK } from '@libs/ndk/provider'; import { createNote } from '@libs/storage'; -import { useNote } from '@stores/note'; - import { useAccount } from '@utils/hooks/useAccount'; export function useNewsfeed() { @@ -15,8 +13,6 @@ export function useNewsfeed() { const { ndk } = useNDK(); const { status, account } = useAccount(); - const toggleHasNewNote = useNote((state) => state.toggleHasNewNote); - useEffect(() => { if (status === 'success' && account) { const filter: NDKFilter = { @@ -37,8 +33,6 @@ export function useNewsfeed() { event.content, event.created_at ); - // notify user about created note - toggleHasNewNote(true); }); } diff --git a/src/app/splash.tsx b/src/app/splash.tsx index eec1a4c5..8a9ebf08 100644 --- a/src/app/splash.tsx +++ b/src/app/splash.tsx @@ -1,7 +1,5 @@ import { invoke } from '@tauri-apps/api/tauri'; -import { platform } from '@tauri-apps/plugin-os'; -import { appWindow } from '@tauri-apps/plugin-window'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { getActiveAccount, updateLastLogin } from '@libs/storage'; @@ -10,47 +8,76 @@ import { LoaderIcon } from '@shared/icons'; import { useNostr } from '@utils/hooks/useNostr'; const account = await getActiveAccount(); -const osPlatform = await platform(); - -if (osPlatform !== 'macos') { - appWindow.setDecorations(false); -} export function SplashScreen() { + const [loading, setLoading] = useState(true); const { fetchChats, fetchNotes } = useNostr(); + if (!account) { + setTimeout(async () => await invoke('close_splashscreen'), 500); + } + + const skip = async () => { + await invoke('close_splashscreen'); + }; + useEffect(() => { async function prefetch() { + const onboarding = localStorage.getItem('onboarding'); + const step = JSON.parse(onboarding).state.step || null; + if (step) await invoke('close_splashscreen'); + const notes = await fetchNotes(); const chats = await fetchChats(); - if (notes && chats) { + + if (notes.status === 'ok' && chats.status === 'ok') { const now = Math.floor(Date.now() / 1000); await updateLastLogin(now); invoke('close_splashscreen'); + } else { + setLoading(false); + console.log('fetch notes failed, error: ', notes.message); + console.log('fetch chats failed, error: ', chats.message); } } - if (account) { + if (account && loading) { prefetch(); } }, []); - if (!account) { - setTimeout(() => invoke('close_splashscreen'), 1000); - } - return (
-
-

Prefetching data

-

- This may take a few seconds, please don't close app. -

-
+ {loading ? ( +
+

+ Prefetching data +

+

+ This may take a few seconds, please don't close app. +

+
+ ) : ( +
+

+ Something wrong! +

+

+ Prefetching process failed, click skip to continue. +

+ +
+ )}
diff --git a/src/libs/ndk/instance.ts b/src/libs/ndk/instance.ts index 9404215c..af30336e 100644 --- a/src/libs/ndk/instance.ts +++ b/src/libs/ndk/instance.ts @@ -1,4 +1,4 @@ -// source: https://github.com/nostr-dev-kit/ndk-react/ +// inspire by: https://github.com/nostr-dev-kit/ndk-react/ import NDK from '@nostr-dev-kit/ndk'; import { ndkAdapter } from '@nostr-fetch/adapter-ndk'; import { NostrFetcher } from 'nostr-fetch'; @@ -10,21 +10,16 @@ import { getExplicitRelayUrls } from '@libs/storage'; import { FULL_RELAYS } from '@stores/constants'; export const NDKInstance = () => { - const cacheAdapter = useMemo(() => new TauriAdapter(), []); - const [ndk, setNDK] = useState(undefined); const [relayUrls, setRelayUrls] = useState([]); - const [fetcher, setFetcher] = useState(undefined); - useEffect(() => { - if (!ndk) loadNdk(); + const cacheAdapter = useMemo(() => new TauriAdapter(), []); + const fetcher = useMemo( + () => NostrFetcher.withCustomPool(ndkAdapter(ndk)), + [ndk] + ); - return () => { - cacheAdapter.save(); - }; - }, []); - - async function loadNdk() { + async function initNDK() { let explicitRelayUrls: string[]; const explicitRelayUrlsFromDB = await getExplicitRelayUrls(); @@ -34,23 +29,29 @@ export const NDKInstance = () => { explicitRelayUrls = FULL_RELAYS; } - const ndkInstance = new NDK({ explicitRelayUrls, cacheAdapter }); + const instance = new NDK({ explicitRelayUrls, cacheAdapter }); try { - await ndkInstance.connect(); + await instance.connect(); } catch (error) { - console.error('ERROR loading NDK NDKInstance', error); + console.error('NDK instance init failed: ', error); } - setNDK(ndkInstance); + setNDK(instance); setRelayUrls(explicitRelayUrls); - setFetcher(NostrFetcher.withCustomPool(ndkAdapter(ndkInstance))); } + useEffect(() => { + if (!ndk) initNDK(); + + return () => { + cacheAdapter.save(); + }; + }, []); + return { ndk, relayUrls, fetcher, - loadNdk, }; }; diff --git a/src/libs/ndk/provider.tsx b/src/libs/ndk/provider.tsx index b089e722..cf29d896 100644 --- a/src/libs/ndk/provider.tsx +++ b/src/libs/ndk/provider.tsx @@ -9,18 +9,16 @@ interface NDKContext { ndk: NDK; relayUrls: string[]; fetcher: NostrFetcher; - loadNdk: () => void; } const NDKContext = createContext({ ndk: new NDK({}), relayUrls: [], fetcher: undefined, - loadNdk: undefined, }); const NDKProvider = ({ children }: PropsWithChildren) => { - const { ndk, relayUrls, fetcher, loadNdk } = NDKInstance(); + const { ndk, relayUrls, fetcher } = NDKInstance(); if (ndk) return ( @@ -29,7 +27,6 @@ const NDKProvider = ({ children }: PropsWithChildren) => { ndk, relayUrls, fetcher, - loadNdk, }} > {children} diff --git a/src/shared/composer/composer.tsx b/src/shared/composer/composer.tsx index 7a88d361..bc69659f 100644 --- a/src/shared/composer/composer.tsx +++ b/src/shared/composer/composer.tsx @@ -15,12 +15,12 @@ import { MentionNote } from '@shared/notes'; import { useComposer } from '@stores/composer'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; import { useImageUploader } from '@utils/hooks/useUploader'; import { sendNativeNotification } from '@utils/notification'; export function Composer() { - const { publish } = usePublish(); + const { publish } = useNostr(); const [status, setStatus] = useState(null); const [reply, clearReply] = useComposer((state) => [state.reply, state.clearReply]); diff --git a/src/shared/editProfileModal.tsx b/src/shared/editProfileModal.tsx index bf1aac2d..adf33cc1 100644 --- a/src/shared/editProfileModal.tsx +++ b/src/shared/editProfileModal.tsx @@ -13,7 +13,7 @@ import { Image } from '@shared/image'; import { DEFAULT_AVATAR } from '@stores/constants'; import { useAccount } from '@utils/hooks/useAccount'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function EditProfileModal() { const queryClient = useQueryClient(); @@ -24,7 +24,7 @@ export function EditProfileModal() { const [banner, setBanner] = useState(''); const [nip05, setNIP05] = useState({ verified: false, text: '' }); - const { publish } = usePublish(); + const { publish } = useNostr(); const { account } = useAccount(); const { register, @@ -65,7 +65,6 @@ export function EditProfileModal() { const res: any = await fetch(verifyURL, { method: 'GET', - timeout: 30, headers: { 'Content-Type': 'application/json; charset=utf-8', }, diff --git a/src/shared/notes/actions/reaction.tsx b/src/shared/notes/actions/reaction.tsx index 70f1a150..a854ddcc 100644 --- a/src/shared/notes/actions/reaction.tsx +++ b/src/shared/notes/actions/reaction.tsx @@ -3,7 +3,7 @@ import { useState } from 'react'; import { ReactionIcon } from '@shared/icons'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; const REACTIONS = [ { @@ -32,7 +32,7 @@ export function NoteReaction({ id, pubkey }: { id: string; pubkey: string }) { const [open, setOpen] = useState(false); const [reaction, setReaction] = useState(null); - const { publish } = usePublish(); + const { publish } = useNostr(); const getReactionImage = (content: string) => { const reaction: { img: string } = REACTIONS.find((el) => el.content === content); diff --git a/src/shared/notes/actions/repost.tsx b/src/shared/notes/actions/repost.tsx index 96d42440..69f515c3 100644 --- a/src/shared/notes/actions/repost.tsx +++ b/src/shared/notes/actions/repost.tsx @@ -2,16 +2,14 @@ import * as Tooltip from '@radix-ui/react-tooltip'; import { RepostIcon } from '@shared/icons'; -import { FULL_RELAYS } from '@stores/constants'; - -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function NoteRepost({ id, pubkey }: { id: string; pubkey: string }) { - const { publish } = usePublish(); + const { publish } = useNostr(); const submit = async () => { const tags = [ - ['e', id, FULL_RELAYS[0], 'root'], + ['e', id, 'wss://relayable.org', 'root'], ['p', pubkey], ]; await publish({ content: '', kind: 6, tags: tags }); diff --git a/src/shared/notes/actions/zap.tsx b/src/shared/notes/actions/zap.tsx index 512bed6e..937df8a0 100644 --- a/src/shared/notes/actions/zap.tsx +++ b/src/shared/notes/actions/zap.tsx @@ -8,10 +8,10 @@ import { Button } from '@shared/button'; import { CancelIcon, ZapIcon } from '@shared/icons'; import { useEvent } from '@utils/hooks/useEvent'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function NoteZap({ id }: { id: string }) { - const { createZap } = usePublish(); + const { createZap } = useNostr(); const { data: event } = useEvent(id); const [amount, setAmount] = useState(null); @@ -23,6 +23,7 @@ export function NoteZap({ id }: { id: string }) { }; const createZapRequest = async () => { + // @ts-expect-error, todo: fix this const res = await createZap(event as unknown as NostrEvent, amount); if (res) setInvoice(res); }; diff --git a/src/shared/notes/replies/form.tsx b/src/shared/notes/replies/form.tsx index 98072dd2..136ee887 100644 --- a/src/shared/notes/replies/form.tsx +++ b/src/shared/notes/replies/form.tsx @@ -5,12 +5,12 @@ import { Image } from '@shared/image'; import { DEFAULT_AVATAR, FULL_RELAYS } from '@stores/constants'; +import { useNostr } from '@utils/hooks/useNostr'; import { useProfile } from '@utils/hooks/useProfile'; -import { usePublish } from '@utils/hooks/usePublish'; import { displayNpub } from '@utils/shortenKey'; export function NoteReplyForm({ id, pubkey }: { id: string; pubkey: string }) { - const { publish } = usePublish(); + const { publish } = useNostr(); const { status, user } = useProfile(pubkey); const [value, setValue] = useState(''); diff --git a/src/stores/note.tsx b/src/stores/note.tsx deleted file mode 100644 index eff3288f..00000000 --- a/src/stores/note.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { create } from 'zustand'; - -interface NoteState { - hasNewNote: boolean; - toggleHasNewNote: (status: boolean) => void; -} - -export const useNote = create((set) => ({ - hasNewNote: false, - toggleHasNewNote: (status: boolean) => { - set({ hasNewNote: status }); - }, -})); diff --git a/src/stores/onboarding.tsx b/src/stores/onboarding.tsx index cd8644cf..b6049853 100644 --- a/src/stores/onboarding.tsx +++ b/src/stores/onboarding.tsx @@ -1,20 +1,38 @@ import { create } from 'zustand'; +import { createJSONStorage, persist } from 'zustand/middleware'; interface OnboardingState { - profile: { [x: string]: string }; - pubkey: string; - createProfile: (data: { [x: string]: string }) => void; + step: null | string; + pubkey: null | string; + tempPrivkey: null | string; setPubkey: (pubkey: string) => void; + setTempPrivkey: (privkey: string) => void; + setStep: (url: string) => void; + clearStep: () => void; } -export const useOnboarding = create((set) => ({ - profile: {}, - pubkey: '', - privkey: '', - createProfile: (data: { [x: string]: string }) => { - set({ profile: data }); - }, - setPubkey: (pubkey: string) => { - set({ pubkey: pubkey }); - }, -})); +export const useOnboarding = create()( + persist( + (set) => ({ + step: null, + pubkey: null, + tempPrivkey: null, + setPubkey: (pubkey: string) => { + set({ pubkey }); + }, + setTempPrivkey: (privkey: string) => { + set({ tempPrivkey: privkey }); + }, + setStep: (url: string) => { + set({ step: url }); + }, + clearStep: () => { + set({ step: null, pubkey: null, tempPrivkey: null }); + }, + }), + { + name: 'onboarding', + storage: createJSONStorage(() => localStorage), + } + ) +); diff --git a/src/utils/hooks/useNostr.tsx b/src/utils/hooks/useNostr.tsx index faef06b0..bdf6c266 100644 --- a/src/utils/hooks/useNostr.tsx +++ b/src/utils/hooks/useNostr.tsx @@ -1,4 +1,5 @@ -import { NDKUser } from '@nostr-dev-kit/ndk'; +import { NDKEvent, NDKKind, NDKPrivateKeySigner, NDKUser } from '@nostr-dev-kit/ndk'; +import destr from 'destr'; import { LRUCache } from 'lru-cache'; import { NostrEvent } from 'nostr-fetch'; import { nip19 } from 'nostr-tools'; @@ -8,18 +9,22 @@ import { countTotalNotes, createChat, createNote, - getActiveAccount, getLastLogin, updateAccount, } from '@libs/storage'; +import { useStronghold } from '@stores/stronghold'; + import { nHoursAgo } from '@utils/date'; +import { useAccount } from '@utils/hooks/useAccount'; export function useNostr() { + const privkey = useStronghold((state) => state.privkey); + const { ndk, relayUrls, fetcher } = useNDK(); + const { account } = useAccount(); async function fetchNetwork(prevFollow?: string[]) { - const account = await getActiveAccount(); const follows = new Set(prevFollow || []); const lruNetwork = new LRUCache({ max: 300 }); @@ -27,6 +32,7 @@ export function useNostr() { // fetch user's follows if (!prevFollow) { + console.log("fetching user's follow..."); const user = ndk.getUser({ hexpubkey: account.pubkey }); const list = await user.follows(); list.forEach((item: NDKUser) => { @@ -36,7 +42,7 @@ export function useNostr() { // fetch network if (!account.network) { - console.log('fetching network...', follows.size); + console.log("fetching user's network..."); const events = await fetcher.fetchAllEvents( relayUrls, { kinds: [3], authors: [...follows] }, @@ -62,14 +68,15 @@ export function useNostr() { return [...new Set([...follows, ...network])]; } - const fetchNotes = async (prevFollow?: string[]) => { + async function fetchNotes(prevFollow?: string[]) { try { - const network = (await fetchNetwork(prevFollow)) as string[]; - + const network = await fetchNetwork(prevFollow); const totalNotes = await countTotalNotes(); const lastLogin = await getLastLogin(); if (network.length > 0) { + console.log('fetching notes...'); + let since: number; if (totalNotes === 0 || lastLogin === 0) { since = nHoursAgo(24); @@ -96,15 +103,15 @@ export function useNostr() { } } - return true; + return { status: 'ok' }; } catch (e) { - console.log('error: ', e); + console.error('failed fetch notes, error: ', e); + return { status: 'failed', message: e }; } - }; + } - const fetchChats = async () => { + async function fetchChats() { try { - const account = await getActiveAccount(); const lastLogin = await getLastLogin(); const incomingMessages = await fetcher.fetchAllEvents( relayUrls, @@ -128,11 +135,60 @@ export function useNostr() { ); } - return true; + return { status: 'ok' }; } catch (e) { - console.log('error: ', e); + console.error('failed fetch incoming messages, error: ', e); + return { status: 'failed', message: e }; } + } + + const publish = async ({ + content, + kind, + tags, + }: { + content: string; + kind: NDKKind | number; + tags: string[][]; + }): Promise => { + if (!privkey) throw new Error('Private key not found'); + + const event = new NDKEvent(ndk); + const signer = new NDKPrivateKeySigner(privkey); + + event.content = content; + event.kind = kind; + event.created_at = Math.floor(Date.now() / 1000); + event.pubkey = account.pubkey; + event.tags = tags; + + await event.sign(signer); + await event.publish(); + + return event; }; - return { fetchNotes, fetchChats }; + const createZap = async (event: NostrEvent, amount: number, message?: string) => { + // @ts-expect-error, LumeEvent to NostrEvent + event.id = event.event_id; + + // @ts-expect-error, LumeEvent to NostrEvent + if (typeof event.content !== 'string') event.content = event.content.original; + + if (typeof event.tags === 'string') event.tags = destr(event.tags); + + if (!privkey) throw new Error('Private key not found'); + + if (!ndk.signer) { + const signer = new NDKPrivateKeySigner(privkey); + ndk.signer = signer; + } + + const ndkEvent = new NDKEvent(ndk, event); + const res = await ndkEvent.zap(amount, message ?? 'zap from lume'); + + return res; + }; + + return { fetchNotes, fetchChats, publish, createZap }; } diff --git a/src/utils/hooks/usePublish.tsx b/src/utils/hooks/usePublish.tsx deleted file mode 100644 index 7a758c18..00000000 --- a/src/utils/hooks/usePublish.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { NDKEvent, NDKKind, NDKPrivateKeySigner, NostrEvent } from '@nostr-dev-kit/ndk'; -import destr from 'destr'; - -import { useNDK } from '@libs/ndk/provider'; - -import { useStronghold } from '@stores/stronghold'; - -import { useAccount } from '@utils/hooks/useAccount'; - -export function usePublish() { - const { ndk } = useNDK(); - const { account } = useAccount(); - - const privkey = useStronghold((state) => state.privkey); - - const publish = async ({ - content, - kind, - tags, - }: { - content: string; - kind: NDKKind | number; - tags: string[][]; - }): Promise => { - if (!privkey) throw new Error('Private key not found'); - - const event = new NDKEvent(ndk); - const signer = new NDKPrivateKeySigner(privkey); - - event.content = content; - event.kind = kind; - event.created_at = Math.floor(Date.now() / 1000); - event.pubkey = account.pubkey; - event.tags = tags; - - await event.sign(signer); - await event.publish(); - - return event; - }; - - const createZap = async (event: NostrEvent, amount: number, message?: string) => { - // @ts-expect-error, lumeevent to nostrevent - event.id = event.event_id; - // @ts-expect-error, lumeevent to nostrevent - if (typeof event.content !== 'string') event.content = event.content.original; - if (typeof event.tags === 'string') event.tags = destr(event.tags); - if (!privkey) throw new Error('Private key not found'); - if (!ndk.signer) { - const signer = new NDKPrivateKeySigner(privkey); - ndk.signer = signer; - } - - const ndkEvent = new NDKEvent(ndk, event); - const res = await ndkEvent.zap(amount, message ?? 'test zap from lume'); - return res; - }; - - return { publish, createZap }; -} diff --git a/src/utils/hooks/useSocial.tsx b/src/utils/hooks/useSocial.tsx index 4a35fb3e..6b706a3e 100644 --- a/src/utils/hooks/useSocial.tsx +++ b/src/utils/hooks/useSocial.tsx @@ -5,13 +5,14 @@ import { createNote } from '@libs/storage'; import { nHoursAgo } from '@utils/date'; import { useAccount } from '@utils/hooks/useAccount'; -import { usePublish } from '@utils/hooks/usePublish'; import { nip02ToArray } from '@utils/transform'; +import { useNostr } from './useNostr'; + export function useSocial() { const queryClient = useQueryClient(); - const { publish } = usePublish(); + const { publish } = useNostr(); const { fetcher, relayUrls } = useNDK(); const { account } = useAccount(); const { status, data: userFollows } = useQuery( diff --git a/src/utils/hooks/useUploader.tsx b/src/utils/hooks/useUploader.tsx index d7fb3761..0dad8014 100644 --- a/src/utils/hooks/useUploader.tsx +++ b/src/utils/hooks/useUploader.tsx @@ -3,10 +3,10 @@ import { open } from '@tauri-apps/plugin-dialog'; import { VoidApi } from '@void-cat/api'; import { createBlobFromFile } from '@utils/createBlobFromFile'; -import { usePublish } from '@utils/hooks/usePublish'; +import { useNostr } from '@utils/hooks/useNostr'; export function useImageUploader() { - const { publish } = usePublish(); + const { publish } = useNostr(); const upload = async (file: null | string, nip94?: boolean) => { const voidcat = new VoidApi('https://void.cat');