diff --git a/package.json b/package.json index 7a0ea3e9..514478b1 100644 --- a/package.json +++ b/package.json @@ -18,49 +18,52 @@ "**/*.{ts, tsx, css, md, html, json}": "prettier --cache --write" }, "dependencies": { + "@dnd-kit/core": "^6.0.8", "@getalby/sdk": "^2.4.0", - "@nostr-dev-kit/ndk": "^1.2.1", + "@nostr-dev-kit/ndk": "^1.3.0", "@nostr-fetch/adapter-ndk": "^0.12.2", - "@radix-ui/react-alert-dialog": "^1.0.4", + "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-dialog": "^1.0.4", - "@radix-ui/react-dropdown-menu": "^2.0.5", - "@radix-ui/react-popover": "^1.0.6", - "@radix-ui/react-tooltip": "^1.0.6", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-hover-card": "^1.0.7", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-tooltip": "^1.0.7", "@tanstack/react-query": "^4.35.3", - "@tanstack/react-virtual": "3.0.0-beta.54", "@tauri-apps/api": "^1.4.0", - "@tiptap/extension-image": "^2.1.10", - "@tiptap/extension-mention": "^2.1.10", - "@tiptap/extension-placeholder": "^2.1.10", - "@tiptap/pm": "^2.1.10", - "@tiptap/react": "^2.1.10", - "@tiptap/starter-kit": "^2.1.10", - "@tiptap/suggestion": "^2.1.10", + "@tiptap/extension-image": "^2.1.11", + "@tiptap/extension-mention": "^2.1.11", + "@tiptap/extension-placeholder": "^2.1.11", + "@tiptap/pm": "^2.1.11", + "@tiptap/react": "^2.1.11", + "@tiptap/starter-kit": "^2.1.11", + "@tiptap/suggestion": "^2.1.11", "dayjs": "^1.11.10", "destr": "^2.0.1", - "get-urls": "^12.1.0", "html-to-text": "^9.0.5", "light-bolt11-decoder": "^3.0.0", "lru-cache": "^10.0.1", "minidenticons": "^4.2.0", "nostr-fetch": "^0.13.0", - "nostr-tools": "^1.15.0", + "nostr-tools": "^1.16.0", "qrcode.react": "^3.1.0", + "re-resizable": "^6.9.11", "react": "^18.2.0", "react-currency-input-field": "^3.6.11", "react-dom": "^18.2.0", - "react-hook-form": "^7.46.1", + "react-hook-form": "^7.46.2", "react-markdown": "^8.0.7", "react-player": "^2.13.0", "react-router-dom": "^6.16.0", "react-textarea-autosize": "^8.5.3", - "react-virtuoso": "^4.6.0", + "reactflow": "^11.9.2", "remark-gfm": "^3.0.1", "tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql#v1", "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1", "tauri-plugin-stronghold-api": "github:tauri-apps/tauri-plugin-stronghold#v1", "tauri-plugin-upload-api": "github:tauri-apps/tauri-plugin-upload#v1", + "tippy.js": "^6.3.7", + "virtua": "^0.9.1", "zustand": "^4.4.1" }, "devDependencies": { @@ -68,19 +71,19 @@ "@tauri-apps/cli": "^1.4.0", "@trivago/prettier-plugin-sort-imports": "^4.2.0", "@types/html-to-text": "^9.0.2", - "@types/node": "^20.6.2", - "@types/react": "^18.2.22", - "@types/react-dom": "^18.2.7", - "@types/youtube-player": "^5.5.7", - "@typescript-eslint/eslint-plugin": "^6.7.2", - "@typescript-eslint/parser": "^6.7.2", - "@vitejs/plugin-react-swc": "^3.3.2", - "autoprefixer": "^10.4.15", + "@types/node": "^20.7.1", + "@types/react": "^18.2.23", + "@types/react-dom": "^18.2.8", + "@types/youtube-player": "^5.5.8", + "@typescript-eslint/eslint-plugin": "^6.7.3", + "@typescript-eslint/parser": "^6.7.3", + "@vitejs/plugin-react-swc": "^3.4.0", + "autoprefixer": "^10.4.16", "clsx": "^2.0.0", "cross-env": "^7.0.3", "csstype": "^3.1.2", "encoding": "^0.1.13", - "eslint": "^8.49.0", + "eslint": "^8.50.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.33.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc164463..1ac27a70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,72 +5,72 @@ settings: excludeLinksFromLockfile: false dependencies: + '@dnd-kit/core': + specifier: ^6.0.8 + version: 6.0.8(react-dom@18.2.0)(react@18.2.0) '@getalby/sdk': specifier: ^2.4.0 version: 2.4.0 '@nostr-dev-kit/ndk': - specifier: ^1.2.1 - version: 1.2.1(typescript@5.2.2) + specifier: ^1.3.0 + version: 1.3.0(typescript@5.2.2) '@nostr-fetch/adapter-ndk': specifier: ^0.12.2 - version: 0.12.2(@nostr-dev-kit/ndk@1.2.1)(nostr-fetch@0.13.0) + version: 0.12.2(@nostr-dev-kit/ndk@1.3.0)(nostr-fetch@0.13.0) '@radix-ui/react-alert-dialog': - specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.5 + version: 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collapsible': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(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.22)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.5 + version: 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': - specifier: ^2.0.5 - version: 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.0.6 + version: 2.0.6(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-hover-card': + specifier: ^1.0.7 + version: 1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(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.22)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.7 + version: 1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(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.22)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.0.7 + version: 1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': specifier: ^4.35.3 version: 4.35.3(react-dom@18.2.0)(react@18.2.0) - '@tanstack/react-virtual': - specifier: 3.0.0-beta.54 - version: 3.0.0-beta.54(react@18.2.0) '@tauri-apps/api': specifier: ^1.4.0 version: 1.4.0 '@tiptap/extension-image': - specifier: ^2.1.10 - version: 2.1.10(@tiptap/core@2.1.10) + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) '@tiptap/extension-mention': - specifier: ^2.1.10 - version: 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10)(@tiptap/suggestion@2.1.10) + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(@tiptap/suggestion@2.1.11) '@tiptap/extension-placeholder': - specifier: ^2.1.10 - version: 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) '@tiptap/pm': - specifier: ^2.1.10 - version: 2.1.10 + specifier: ^2.1.11 + version: 2.1.11 '@tiptap/react': - specifier: ^2.1.10 - version: 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(react-dom@18.2.0)(react@18.2.0) '@tiptap/starter-kit': - specifier: ^2.1.10 - version: 2.1.10(@tiptap/pm@2.1.10) + specifier: ^2.1.11 + version: 2.1.11(@tiptap/pm@2.1.11) '@tiptap/suggestion': - specifier: ^2.1.10 - version: 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) dayjs: specifier: ^1.11.10 version: 1.11.10 destr: specifier: ^2.0.1 version: 2.0.1 - get-urls: - specifier: ^12.1.0 - version: 12.1.0 html-to-text: specifier: ^9.0.5 version: 9.0.5 @@ -87,11 +87,14 @@ dependencies: specifier: ^0.13.0 version: 0.13.0 nostr-tools: - specifier: ^1.15.0 - version: 1.15.0(typescript@5.2.2) + specifier: ^1.16.0 + version: 1.16.0(typescript@5.2.2) qrcode.react: specifier: ^3.1.0 version: 3.1.0(react@18.2.0) + re-resizable: + specifier: ^6.9.11 + version: 6.9.11(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -102,11 +105,11 @@ dependencies: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: - specifier: ^7.46.1 - version: 7.46.1(react@18.2.0) + specifier: ^7.46.2 + version: 7.46.2(react@18.2.0) react-markdown: specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.22)(react@18.2.0) + version: 8.0.7(@types/react@18.2.23)(react@18.2.0) react-player: specifier: ^2.13.0 version: 2.13.0(react@18.2.0) @@ -115,28 +118,34 @@ dependencies: version: 6.16.0(react-dom@18.2.0)(react@18.2.0) react-textarea-autosize: specifier: ^8.5.3 - version: 8.5.3(@types/react@18.2.22)(react@18.2.0) - react-virtuoso: - specifier: ^4.6.0 - version: 4.6.0(react-dom@18.2.0)(react@18.2.0) + version: 8.5.3(@types/react@18.2.23)(react@18.2.0) + reactflow: + specifier: ^11.9.2 + version: 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) remark-gfm: specifier: ^3.0.1 version: 3.0.1 tauri-plugin-sql-api: specifier: github:tauri-apps/tauri-plugin-sql#v1 - version: github.com/tauri-apps/tauri-plugin-sql/b8fd19dac907cc8c3d78681cd4803a326b8b861e + version: github.com/tauri-apps/tauri-plugin-sql/533198dd3b6cfca36d876918d22efcdaac43065a tauri-plugin-store-api: specifier: github:tauri-apps/tauri-plugin-store#v1 - version: github.com/tauri-apps/tauri-plugin-store/a65ce9bfb168a9a3cd7ed4102b9f22770cc3abfa + version: github.com/tauri-apps/tauri-plugin-store/66e06b7830037fdae0b42b5499e23334eaf4e017 tauri-plugin-stronghold-api: specifier: github:tauri-apps/tauri-plugin-stronghold#v1 - version: github.com/tauri-apps/tauri-plugin-stronghold/96dd2cc891915e6fdfb78868b0bef6c5648335a2 + version: github.com/tauri-apps/tauri-plugin-stronghold/4684fed1f5e7eb01885e40114accdcecb61962ed tauri-plugin-upload-api: specifier: github:tauri-apps/tauri-plugin-upload#v1 - version: github.com/tauri-apps/tauri-plugin-upload/b53ebc6c2e716d95fd94b64d3b4b87cd57ae4feb + version: github.com/tauri-apps/tauri-plugin-upload/40c0bc302a9dd8304762951e450ee84d53c2037b + tippy.js: + specifier: ^6.3.7 + version: 6.3.7 + virtua: + specifier: ^0.9.1 + version: 0.9.1(react-dom@18.2.0)(react@18.2.0) zustand: specifier: ^4.4.1 - version: 4.4.1(@types/react@18.2.22)(react@18.2.0) + version: 4.4.1(@types/react@18.2.23)(react@18.2.0) devDependencies: '@tailwindcss/typography': @@ -152,29 +161,29 @@ devDependencies: specifier: ^9.0.2 version: 9.0.2 '@types/node': - specifier: ^20.6.2 - version: 20.6.2 + specifier: ^20.7.1 + version: 20.7.1 '@types/react': - specifier: ^18.2.22 - version: 18.2.22 + specifier: ^18.2.23 + version: 18.2.23 '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.7 + specifier: ^18.2.8 + version: 18.2.8 '@types/youtube-player': - specifier: ^5.5.7 - version: 5.5.7 + specifier: ^5.5.8 + version: 5.5.8 '@typescript-eslint/eslint-plugin': - specifier: ^6.7.2 - version: 6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.49.0)(typescript@5.2.2) + specifier: ^6.7.3 + version: 6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^6.7.2 - version: 6.7.2(eslint@8.49.0)(typescript@5.2.2) + specifier: ^6.7.3 + version: 6.7.3(eslint@8.50.0)(typescript@5.2.2) '@vitejs/plugin-react-swc': - specifier: ^3.3.2 - version: 3.3.2(vite@4.4.9) + specifier: ^3.4.0 + version: 3.4.0(vite@4.4.9) autoprefixer: - specifier: ^10.4.15 - version: 10.4.15(postcss@8.4.30) + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.30) clsx: specifier: ^2.0.0 version: 2.0.0 @@ -188,20 +197,20 @@ devDependencies: specifier: ^0.1.13 version: 0.1.13 eslint: - specifier: ^8.49.0 - version: 8.49.0 + specifier: ^8.50.0 + version: 8.50.0 eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.49.0) + version: 9.0.0(eslint@8.50.0) eslint-plugin-jsx-a11y: specifier: ^6.7.1 - version: 6.7.1(eslint@8.49.0) + version: 6.7.1(eslint@8.50.0) eslint-plugin-react: specifier: ^7.33.2 - version: 7.33.2(eslint@8.49.0) + version: 7.33.2(eslint@8.50.0) eslint-plugin-simple-import-sort: specifier: ^10.0.0 - version: 10.0.0(eslint@8.49.0) + version: 10.0.0(eslint@8.50.0) husky: specifier: ^8.0.3 version: 8.0.3 @@ -231,7 +240,7 @@ devDependencies: version: 5.2.2 vite: specifier: ^4.4.9 - version: 4.4.9(@types/node@20.6.2) + version: 4.4.9(@types/node@20.7.1) vite-tsconfig-paths: specifier: ^4.2.1 version: 4.2.1(typescript@5.2.2)(vite@4.4.9) @@ -270,26 +279,26 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 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.19 + '@babel/types': 7.23.0 dev: true /@babel/helper-string-parser@7.22.5: @@ -311,16 +320,16 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.22.16: - resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.17.0 dev: true - /@babel/runtime@7.22.15: - resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} + /@babel/runtime@7.23.1: + resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -330,8 +339,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true /@babel/traverse@7.17.3: @@ -341,10 +350,10 @@ packages: '@babel/code-frame': 7.22.13 '@babel/generator': 7.17.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@babel/types': 7.17.0 debug: 4.3.4 globals: 11.12.0 @@ -360,8 +369,8 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types@7.22.19: - resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 @@ -369,6 +378,37 @@ packages: to-fast-properties: 2.0.0 dev: true + /@dnd-kit/accessibility@3.0.1(react@18.2.0): + resolution: {integrity: sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/core@6.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.0.1(react@18.2.0) + '@dnd-kit/utilities': 3.2.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@dnd-kit/utilities@3.2.1(react@18.2.0): + resolution: {integrity: sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -567,18 +607,18 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.49.0 + eslint: 8.50.0 eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.8.1: - resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==} + /@eslint-community/regexpp@4.9.0: + resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -589,7 +629,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.21.0 + globals: 13.22.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -599,8 +639,8 @@ packages: - supports-color dev: true - /@eslint/js@8.49.0: - resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==} + /@eslint/js@8.50.0: + resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -742,8 +782,8 @@ packages: fastq: 1.15.0 dev: true - /@nostr-dev-kit/ndk@1.2.1(typescript@5.2.2): - resolution: {integrity: sha512-Rn3/Z9G/nWTnxKCfXIRgW4CrWqJTgiwQ+5c/MMpM8WntojWQ959iYbpjmUCh0LK0AvBxKKjaz6kU1pxWY2Wp/A==} + /@nostr-dev-kit/ndk@1.3.0(typescript@5.2.2): + resolution: {integrity: sha512-ZRne/TF1IRqy35ZwLq3452YD+AUux0r5A+mZgHuGNRv7GJzr2gUl1QNRjs+Db+emXdaHn82LKTRn6cFrni1oPA==} dependencies: '@noble/hashes': 1.3.2 '@noble/secp256k1': 2.0.0 @@ -752,7 +792,7 @@ packages: eventemitter3: 5.0.1 light-bolt11-decoder: 3.0.0 node-fetch: 3.3.2 - nostr-tools: 1.15.0(typescript@5.2.2) + nostr-tools: 1.16.0(typescript@5.2.2) typescript-lru-cache: 2.0.0 utf8-buffer: 1.0.0 websocket-polyfill: 0.0.3 @@ -761,13 +801,13 @@ packages: - typescript dev: false - /@nostr-fetch/adapter-ndk@0.12.2(@nostr-dev-kit/ndk@1.2.1)(nostr-fetch@0.13.0): + /@nostr-fetch/adapter-ndk@0.12.2(@nostr-dev-kit/ndk@1.3.0)(nostr-fetch@0.13.0): resolution: {integrity: sha512-+7EVuxS5DDZvNo6qbfFp7xRHwIyjyi36hYkiQFDjbQ4gX5LKo9RIPB1P+1XGkOSDFshypTbovZCaFunscJ/zhQ==} peerDependencies: '@nostr-dev-kit/ndk': ^0.7.5 nostr-fetch: ^0.12.2 dependencies: - '@nostr-dev-kit/ndk': 1.2.1(typescript@5.2.2) + '@nostr-dev-kit/ndk': 1.3.0(typescript@5.2.2) '@nostr-fetch/kernel': 0.12.2 nostr-fetch: 0.13.0 dev: false @@ -793,11 +833,11 @@ packages: /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 dev: false - /@radix-ui/react-alert-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-jbfBCRlKYlhbitueOAv7z74PXYeIQmWpKwm3jllsdkw7fGWNkxqP3v0nY9WmOzcPqpQuoorNtvViBgL46n5gVg==} + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -809,20 +849,20 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -835,15 +875,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -856,22 +896,22 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -884,18 +924,18 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -904,12 +944,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -918,13 +958,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -936,28 +976,28 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.23)(react@18.2.0) dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -966,13 +1006,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -984,20 +1024,20 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1009,21 +1049,21 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -1032,13 +1072,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1050,17 +1090,46 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0): + /@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 + 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.23)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -1069,14 +1138,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1088,33 +1157,33 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(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.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.23)(react@18.2.0) dev: false - /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1126,30 +1195,30 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(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.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.23)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1161,25 +1230,25 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@floating-ui/react-dom': 2.0.2(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.22)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.23)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1191,15 +1260,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -1212,16 +1281,16 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -1234,15 +1303,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -1255,23 +1324,23 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -1280,14 +1349,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1299,26 +1368,26 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.22)(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.22)(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.22)(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.22)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 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.22)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -1327,12 +1396,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -1341,13 +1410,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -1356,13 +1425,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -1371,12 +1440,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -1385,13 +1454,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.22)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1400,13 +1469,13 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.22)(react@18.2.0) - '@types/react': 18.2.22 + '@babel/runtime': 7.23.1 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.23)(react@18.2.0) + '@types/react': 18.2.23 react: 18.2.0 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1419,10 +1488,10 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.15 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.22 - '@types/react-dom': 18.2.7 + '@babel/runtime': 7.23.1 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.8)(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.23 + '@types/react-dom': 18.2.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1430,7 +1499,115 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 + dev: false + + /@reactflow/background@11.3.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KOy24lz9HpaBlx5KGcpQRsbMRWWkZdFyRxFq5RfPy6BnxDx0GFZ2o2igKKVutuo2bgCQdhaqzipcOUHlEAvnbQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.23)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/controls@11.2.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VuDxm9l0B4esXzRpzKRqH7Sc1Szj+KBV1bsswaOQWDbLlGKRtIZMXjdQ9BwBf+PMJD4ANrmnGEdHxFTL6NUpbg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.23)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/core@11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/tiE8sPShzeWFnshvi8hc1lbp1C5PLgAFl94JQdBstq94uOBTpdoI//1MN4a+fGp1xwAUP7P0IcLuWqIDZgrZg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@types/d3': 7.4.1 + '@types/d3-drag': 3.0.4 + '@types/d3-selection': 3.0.7 + '@types/d3-zoom': 3.0.5 + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.23)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/minimap@11.7.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GqhJ0AoNhYf/GXI7JlWOR4THvi1nEcyo6sL6pGupJu8Ve1b8rpcTKNh4mXIerl8x0oRF8ajGvpIvh4R6rEtLoQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@types/d3-selection': 3.0.7 + '@types/d3-zoom': 3.0.5 + classcat: 5.0.4 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.23)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-resizer@2.2.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p8fqfEtMdXVAEdAT74GVpMeIm2v2t92LObKPFvIbOaA11vmcp+jSt45y2mPD6CxP6snzEVHXigYmGZNiujDtlQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.23)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-toolbar@1.3.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s8gP07HClKDidsBSrcljoK600cdVLLBK1gNK0bSVpCk3hBVKUkEGESwMf7VwpZ1oxhM3859R3pz++7lUrbmF3w==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.23)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer dev: false /@remirror/core-constants@2.0.2: @@ -1496,8 +1673,8 @@ packages: selderee: 0.11.0 dev: false - /@swc/core-darwin-arm64@1.3.86: - resolution: {integrity: sha512-hMvSDms0sJJHNtRa3Vhmr9StWN1vmikbf5VE0IZUYGnF1/JZTkXU1h6CdNUY4Hr6i7uCZjH6BEhxFHX1JtKV4w==} + /@swc/core-darwin-arm64@1.3.90: + resolution: {integrity: sha512-he0w74HvcoufE6CZrB/U/VGVbc7021IQvYrn1geMACnq/OqMBqjdczNtdNfJAy87LZ4AOUjHDKEIjsZZu7o8nQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -1505,8 +1682,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.86: - resolution: {integrity: sha512-Jro6HVH4uSOBM7tTDaQNKLNc8BJV7n+SO+Ft2HAZINyeKJS/8MfEYneG7Vmqg18gv00c6dz9AOCcyz+BR7BFkQ==} + /@swc/core-darwin-x64@1.3.90: + resolution: {integrity: sha512-hKNM0Ix0qMlAamPe0HUfaAhQVbZEL5uK6Iw8v9ew0FtVB4v7EifQ9n41wh+yCj0CjcHBPEBbQU0P6mNTxJu/RQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -1514,8 +1691,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.86: - resolution: {integrity: sha512-wYB9m0pzXJVSzedXSl4JwS3gKtvcPinpe9MbkddezpqL7OjyDP6pHHW9qIucsfgCrtMtbPC2nqulXLPtAAyIjw==} + /@swc/core-linux-arm-gnueabihf@1.3.90: + resolution: {integrity: sha512-HumvtrqTWE8rlFuKt7If0ZL7145H/jVc4AeziVjcd+/ajpqub7IyfrLCYd5PmKMtfeSVDMsxjG0BJ0HLRxrTJA==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -1523,8 +1700,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.86: - resolution: {integrity: sha512-fR44IyK5cdCaO8cC++IEH0Jn03tWnunJnjzA99LxlE5TRInSIOvFm+g5OSUQZDAvEXmQ38sd31LO2HOoDS1Edw==} + /@swc/core-linux-arm64-gnu@1.3.90: + resolution: {integrity: sha512-tA7DqCS7YCwngwXZQeqQhhMm8BbydpaABw8Z/EDQ7KPK1iZ1rNjZw+aWvSpmNmEGmH1RmQ9QDS9mGRDp0faAeg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -1532,8 +1709,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.86: - resolution: {integrity: sha512-EUPfdbK4dUk/nkX3Vmv/47XH+DqHOa9JI0CTthvJ8/ZXei1MKDUsUc+tI1zMQX2uCuSkSWsEIEpCmA0tMwFhtw==} + /@swc/core-linux-arm64-musl@1.3.90: + resolution: {integrity: sha512-p2Vtid5BZA36fJkNUwk5HP+HJlKgTru+Ghna7pRe45ghKkkRIUk3fhkgudEvfKfhT+3AvP+GTVQ+T9k0gc9S8w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -1541,8 +1718,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.86: - resolution: {integrity: sha512-snVZZWv8XgNVaKrTxtO3rUN+BbbB6I8Fqwe8zM/DWGJ096J13r89doQ48x5ZyO+bW4D48eZIWP5pdfSW7oBE3w==} + /@swc/core-linux-x64-gnu@1.3.90: + resolution: {integrity: sha512-J6pDtWaulYGXuANERuvv4CqmUbZOQrRZBCRQGZQJ6a86RWpesZqckBelnYx48wYmkgvMkF95Y3xbI3WTfoSHzw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -1550,8 +1727,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.86: - resolution: {integrity: sha512-PnnksUJymEJkdnbV2orOSOSB441UqsxYbJge9zbr5UTRXUfWO3eFRV0iTBegjTlOQGbW6yN+YRSDkenTbmCI6g==} + /@swc/core-linux-x64-musl@1.3.90: + resolution: {integrity: sha512-3Gh6EA3+0K+l3MqnRON7h5bZ32xLmfcVM6QiHHJ9dBttq7YOEeEoMOCdIPMaQxJmK1VfLgZCsPYRd66MhvUSkw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -1559,8 +1736,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.86: - resolution: {integrity: sha512-XlGEGyHwLndm08VvgeAPGj40L+Hx575MQC+2fsyB1uSNUN+uf7fvke+wc7k50a92CaQe/8foLyIR5faayozEJA==} + /@swc/core-win32-arm64-msvc@1.3.90: + resolution: {integrity: sha512-BNaw/iJloDyaNOFV23Sr53ULlnbmzSoerTJ10v0TjSZOEIpsS0Rw6xOK1iI0voDJnRXeZeWRSxEC9DhefNtN/g==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -1568,8 +1745,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.86: - resolution: {integrity: sha512-U1BhZa1x9yn+wZGTQmt1cYR79a0FzW/wL6Jas1Pn0bykKLxdRU4mCeZt2P+T3buLm8jr8LpPWiCrbvr658PzwA==} + /@swc/core-win32-ia32-msvc@1.3.90: + resolution: {integrity: sha512-SiyTethWAheE/JbxXCukAAciU//PLcmVZ2ME92MRuLMLmOhrwksjbaa7ukj9WEF3LWrherhSqTXnpj3VC1l/qw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -1577,8 +1754,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.86: - resolution: {integrity: sha512-wRoQUajqpE3wITHhZVj/6BPu/QwHriFHLHuJA+9y6PeGtUtTmntL42aBKXIFhfL767dYFtohyNg1uZ9eqbGyGQ==} + /@swc/core-win32-x64-msvc@1.3.90: + resolution: {integrity: sha512-OpWAW5ljKcPJ3SQ0pUuKqYfwXv7ssIhVgrH9XP9ONtdgXKWZRL9hqJQkcL55FARw/gDjKanoCM47wsTNQL+ZZA==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -1586,8 +1763,8 @@ packages: dev: true optional: true - /@swc/core@1.3.86: - resolution: {integrity: sha512-bEXUtm37bcmJ3q+geG7Zy4rJNUzpxalXQUrrqX1ZoGj3HRtzdeVZ0L/um3fG2j16qe61t8TX/OIZ2G6j6dkG/w==} + /@swc/core@1.3.90: + resolution: {integrity: sha512-wptBxP4PldOnhmyDVj8qUcn++GRqyw1qc9wOTGtPNHz8cpuTfdfIgYGlhI4La0UYqecuaaIfLfokyuNePOMHPg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -1596,18 +1773,23 @@ packages: '@swc/helpers': optional: true dependencies: + '@swc/counter': 0.1.1 '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.86 - '@swc/core-darwin-x64': 1.3.86 - '@swc/core-linux-arm-gnueabihf': 1.3.86 - '@swc/core-linux-arm64-gnu': 1.3.86 - '@swc/core-linux-arm64-musl': 1.3.86 - '@swc/core-linux-x64-gnu': 1.3.86 - '@swc/core-linux-x64-musl': 1.3.86 - '@swc/core-win32-arm64-msvc': 1.3.86 - '@swc/core-win32-ia32-msvc': 1.3.86 - '@swc/core-win32-x64-msvc': 1.3.86 + '@swc/core-darwin-arm64': 1.3.90 + '@swc/core-darwin-x64': 1.3.90 + '@swc/core-linux-arm-gnueabihf': 1.3.90 + '@swc/core-linux-arm64-gnu': 1.3.90 + '@swc/core-linux-arm64-musl': 1.3.90 + '@swc/core-linux-x64-gnu': 1.3.90 + '@swc/core-linux-x64-musl': 1.3.90 + '@swc/core-win32-arm64-msvc': 1.3.90 + '@swc/core-win32-ia32-msvc': 1.3.90 + '@swc/core-win32-x64-msvc': 1.3.90 + dev: true + + /@swc/counter@0.1.1: + resolution: {integrity: sha512-xVRaR4u9hcYjFvcSg71Lz5Bo4//CyjAAfMxa7UsaDSYxAshflUkVJWiyVWrfxC59z2kP1IzI4/1BEpnhI9o3Mw==} dev: true /@swc/types@0.1.5: @@ -1648,19 +1830,6 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@tanstack/react-virtual@3.0.0-beta.54(react@18.2.0): - resolution: {integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@tanstack/virtual-core': 3.0.0-beta.54 - react: 18.2.0 - dev: false - - /@tanstack/virtual-core@3.0.0-beta.54: - resolution: {integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==} - dev: false - /@tauri-apps/api@1.4.0: resolution: {integrity: sha512-Jd6HPoTM1PZSFIzq7FB8VmMu3qSSyo/3lSwLpoapW+lQ41CL5Dow2KryLg+gyazA/58DRWI9vu/XpEeHK4uMdw==} engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} @@ -1773,222 +1942,222 @@ packages: '@tauri-apps/cli-win32-x64-msvc': 1.4.0 dev: true - /@tiptap/core@2.1.10(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-yhUKsac6nlqbPQfwQnp+4Jb110EqmzocXKoZacLwzHpM7JVsr2+LXMDu9kahtrvHNJErJljhnQvDHRsrrYeJkQ==} + /@tiptap/core@2.1.11(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-1W2DdjpPwfphHgQ3Qm4s5wzCnEjiXm1TeZ+6/zBl89yKURXgv8Mw1JGdj/NcImQjtDcsNn97MscACK3GKbEJBA==} peerDependencies: '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/pm': 2.1.10 + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-blockquote@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-lpBF/a+qgv4Bdf7HYisTkMFdFdGfn2SqspsydvG8UI7N9B/PfnCCrtoMaC3bqTaT6u8ZVxyM3Y3vnq2AxXJvBw==} + /@tiptap/extension-blockquote@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-IEVe3goA0rgp1G8Wm733BSRJiy71Vh2fmTCyZKWmc2A6GREVSy1X3fCvAo6pMENRObhjIoaBQUCE3p4iJYOxqg==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-bold@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-I43WCwc7pyz5vtKGj24Rjv7HN0EK5S4PlADQPBuhC1qQvfCTFvjrBB6ZmsekUMGmllW0qMOFVLSjtffpckqshA==} + /@tiptap/extension-bold@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-vhdkBtvd029ufOYt2ug49Gz+RLKSczO/CCqKYBqBmpIpsifyK7M6jkgamvAQg3c/vYk0LNcKiL2dp0Jp7L+5Gw==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-bubble-menu@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-XxgJajXkfAj/fChXkIwKBs7/3pd7OxV1uGc6Opx1qW/nSRYx/rr97654Sx/sg6auwIlbpRoqTmyqjbykGX1/yA==} + /@tiptap/extension-bubble-menu@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-WFJJpZvl9DP94Y5RQZB/THDxvDbrTo8tuhjT7yWlhseJ6zyhWmRXdutt39wfSZNFxitv/As+s7cO9aYLML/TVg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 tippy.js: 6.3.7 dev: false - /@tiptap/extension-bullet-list@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-e6aFr29OSOmXsjFZB2zt3p8aeCWOx0C9Ayrpdf4QBUCOUJtt6FQPxxiYc+XZcdrYbLGLznA7QJlulCK9SGv2Fw==} + /@tiptap/extension-bullet-list@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-SOOVH2aSmdMtjWL7TTLbN72xbAFz2G5jifT4UCXb7Qx6LsyhNCyDCu0ukOW8rSosGoSdmBXxAsD9sBJ1jEOmZw==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-code-block@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-M+s89V9mP3tOoS6p/X2Dzw/Z7Fcg9EF0ZXlsMNifdlpwJlhAIYxI7vjPBmkMAFXTDB5eMZblXyNQaZ7v6V2Yeg==} + /@tiptap/extension-code-block@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-QhmhCCWqg/5qLXpZ3sl2A0rqJqV8zMOegcxUFaqcJMOqNbsuHcRgc9C+1hWSVLbCmstB7M6sgF02QpTBOkYHxg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-code@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-1yy/kR0FAeMkDdAt1LW/FH6vlyZLqLZqY6BM+wBCiGrr+XeA5FTXih9iT/4gbTRuIzG0EPqx18nvroG7hUsWBg==} + /@tiptap/extension-code@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-G0UEbMFunujy/F86yHN0/dumPLbwTis9C+6IQv1XRPNsV28U0MgxBhlPcJUgyO5lwuleePDxiBVcRv2XrysgKw==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-document@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-jNlNGQIGg471DvzhADaEoRINa3LNghowrBbKK9d5wGVnbKRykNEPwjCf8zNl+m5NBmCZl3lsdznlwBk5zyh5Bg==} + /@tiptap/extension-document@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-L/iLuqxvJep33ycCFNrnUhdR0VtcZyeNnqB+ZvVHzEwLoRud+LBy44lpEdBrAFsvRm3DG14m/FGYL+TfaD0vxA==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-dropcursor@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-GhsWsCq6wLb8HJ32BeAm7ndv4lPyu1F7FFwmnARzEF5q54FV20kWSv2zC+Dv0dTvynXR3quXybdUM92xeNDovw==} + /@tiptap/extension-dropcursor@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-MiJepRpHlu93aInOMW8NeRCvm9VE5rL0MA9TONY/IspJFGFIqonc/01J6t33JQa3Xh/x3xAfis4nKa/UazeVJw==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-floating-menu@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-uChrDrY3usnF9wSegqq+YGaqd229p9gmaB5xyOyMERDs972hKj4Ul95rXzBBiMKAWUMw9eM09i7+ijTzz4KDUw==} + /@tiptap/extension-floating-menu@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-ExeoOQ6nT0CY0eWx6WjbG+osurXLXa7XrqIdhCAcTmzBAlGiKt8khX9qaZ+QF+BRK1r1lja2KX+5/fpLK7Dt1g==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 tippy.js: 6.3.7 dev: false - /@tiptap/extension-gapcursor@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-WSBT9X7dzg0HyMoMP/Yyxl28QwIJO90YzobI9z5mav86BQv7C5wU0fQSpbpAbsN3s7lxKhPwNrXkwkpnXT4ZCA==} + /@tiptap/extension-gapcursor@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-P/xjyhSOVyop5XXbNtRPgrooQrSlpYblwR67ClI9FAC7uQliuOwi5VcndmEItjWWSe85kJa2IHjOS7mLYvJe8A==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-hard-break@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-sYrzpPoV5jQri+duGb50nDTs+hOBQDxXTKlJuZNFfZMwgx6epwxb8xICcGAUJFShuuW8UAWCNcB4jG9tMqgvyw==} + /@tiptap/extension-hard-break@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-qhiPe6FA0b6PPb/ITlgSnY0l9tEVmXZ9e7eSjvks12ORfqL/dofSCLtChHWvhZxugzo92xejG2hXLi6lyOLbkg==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-heading@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-1OgmrRPMcY52WI7I4799xd4eIsEX/bI813B8mZvNYXLzZI75pLW1hmz1mUvBYyMwlcek74zVTGYgPy11o+2JEg==} + /@tiptap/extension-heading@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-QBtl0S1aDFB+F1wvTrS5iGdNUEeXp+WuTddj+L2f5EP4KqG2x7sj7e7ENMy20g/l8tbKwzd3AZZydvClH4Ybbw==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-history@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-tApuN8MIJMzc0dxvkYJPt3t5cea9NuZBGNiuVedJwMMUF6hbFpMZAt20GW2qwjBaZ76rQwbLp1s3KnImFsPe5A==} + /@tiptap/extension-history@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-88dovV2O9icmBn0IvaArFFeS6X5ts6BxZPu5VbGML8KBL8iAu+Og7RXEPdOy5e13K0K4V21fDpO3n7KdvNOAYQ==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-horizontal-rule@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-91lGpK2d6WMPhrMDPBURS8z8pEg1CUBYy7GmBenKvvgh+JzVhG+U6MtykfWNfm2R4iRXOl1xLbyUOCiOSUXodQ==} + /@tiptap/extension-horizontal-rule@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-uvHPa2YCKnDhtSBSZB3lk5U4H3wRKP0DNvVx4Y2F7MdQianVzcyOd1pZYO9BQs+lUB1aZots6doE69Zqz3mU2Q==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-image@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-d7+d4J2TJ99+phFbVTpsFhi208jAgcrfbdwUDkkwjdF+PQhax5pounSt/8eZPWdyCXj+EWYjCjx0znwsD6+SCA==} + /@tiptap/extension-image@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-dFFRvzl9F4fEcG95nyka72TeV127C1UVaMm816GHoFlVEFGV4yJ8NKgzT3UEDgFcs6OPwPlt8tuHuDeYm7EVOQ==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-italic@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-ebw5m+rWx6K5UoBVXSkz3fpvDJh/wScfYmwl6pkbjc2jNbZiln2LSiLHYc2eIYJ2aTsVxcw/n0Azfk5Lb19InA==} + /@tiptap/extension-italic@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-QmDsHtnBBit/1KtQpBPxjSPjDC1mVKtoNTgsEwMWK6YAkCKOKPj7oPEqqjaNZIRMKPPzE5XCsfBoS3jtVmo+6A==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-list-item@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-rRRyB14vOcSjTMAh8Y+50TRC/jO469CelGwFjOLrK1ZSEag5wmLDaqpWOOb52BFYnvCHuIm1HqZtdL5bTI/J1w==} + /@tiptap/extension-list-item@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-YhwHaPGhffsFsg/zjCu1G24//j/BTRDRZbZXmMwp77m1yEqPULcWyoWrI+gUzetQxJRD/ruAucqjLtoLLfICmQ==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-mention@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10)(@tiptap/suggestion@2.1.10): - resolution: {integrity: sha512-OYt4etiv3N2rj+eQUZimuFHM8AK0DP90WknUFLBF++FKB7l50WOkVv7ZEK7i78JBzNkIN4vAI7K6NhY0HCvQzg==} + /@tiptap/extension-mention@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(@tiptap/suggestion@2.1.11): + resolution: {integrity: sha512-QMHmAkhiDQEgAdUHdKRfVna0AINcbSbQCrpgwKLIHGWcpbi1zJbAPpm+xngbl0I9ZNxaMzbP4utTAzeQ92pJkw==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 '@tiptap/suggestion': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 - '@tiptap/suggestion': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + '@tiptap/suggestion': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-ordered-list@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-jouo3RHUMxU4dPzZcfZdUzmsLVp1KHrLIAD2YAxBuqArACrBNfJpIhtkTKuGLlaFhKqGr+EmNdNQnK8JOBhLtQ==} + /@tiptap/extension-ordered-list@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-/tghfEJ5U7WFbF8xyOqRJks8KxP/lRjnroMXMglaushSMx8PYPo1dZDB/dJZw7ksy47MAaKJfKlx3gyN2CPXBQ==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-paragraph@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-kzuHbrxcxpWkha5P+JFzCKT54pNqb4IBKMU5qT9YGhZSdNTtU63ncdCHM+Ad1ukLuvXAv95zh1IQC5j+Z1Qk4A==} + /@tiptap/extension-paragraph@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-gXMgJ2CU3X4yh1wKnb8RdbDmhITB76pH6DX0uWprmEgvzNMN3Qw+h5uBD9lgxg1WVghbCmkG9mY9J4PPbPTLxw==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-placeholder@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-lwtNmMZpxvQBGP72/zrdPFOmn/3QNZAKpkrfrK95Ri4TU6LPeDDwPsP81s9mkAFZPuDQ1i8SPakl+RivWa6qtA==} + /@tiptap/extension-placeholder@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-laHYRFxJWj6m72Yf1v6Q5nF2nvwWpQlKUj6Yu/yluOOoVE92HpLqCAvA8RamqLtPiw5VxR3v3oCY0WNeQRvyIg==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false - /@tiptap/extension-strike@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-KW63lZLPFIir5AIeh2I7UK6Tx1O3jetD7JIPUzEqp1I1BfJlHGHVQxV8VXAmJl0hTOzjQBsHW42PmBxSC97NUg==} + /@tiptap/extension-strike@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-UnjeSVgu3bDuyjjUdWsUErRCoQKAHCzH/pAiqTEPEEdFYgZFQPBpcJICRVdlYjRmI2ZKh6d0TMUS55m7ckmwmQ==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/extension-text@2.1.10(@tiptap/core@2.1.10): - resolution: {integrity: sha512-ubU/WQwNB0MVKyMAHr8ka3Nu3jCR03HARGKUwNRzppZYtRXWyXHNlAaJdplNb1NMGb8hd0ElBJmwFlVqmh8haQ==} + /@tiptap/extension-text@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-Iey0EXYv9079+lbHMvZtLc6XcYfKrq++msEXuFFNHxvL0i/XzndhGf+qlDhLROLgEtDiiTqzOBBwFCGlFjbDow==} peerDependencies: '@tiptap/core': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) dev: false - /@tiptap/pm@2.1.10: - resolution: {integrity: sha512-Y+AqizKnjQpx4pSaA6m/cCD5QHQRPtALhO4ZO4YFZV1idYmsJA3/S5lgJI3ZL5eAHKHcGk6Vv3/8Y+eej5YIPw==} + /@tiptap/pm@2.1.11: + resolution: {integrity: sha512-vBIAic+H8fjHfT8r2qJkAOxdx1Iiss9+qMyujAoIdPkiyjEc4+sXcM0qSYgIr6KL5icITyuK8J7x/V62VfB7Uw==} dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 @@ -2005,61 +2174,61 @@ packages: prosemirror-schema-list: 1.3.0 prosemirror-state: 1.4.3 prosemirror-tables: 1.3.4 - prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.31.8) + prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0) prosemirror-transform: 1.7.5 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 dev: false - /@tiptap/react@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kzCWzbV2dnD5NmHjN8GiS+k0GOmoEhKnMuMzuuU6FjtOALhJzPTrIXITzWDpU3jL+r/4eeXYhAt64Wp7PVwscg==} + /@tiptap/react@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OLU4uqMeCE/LKz/GY2P1JRykUgHJDoPROHUa1IOnVpj/1FbbBHDyurT3eomwsVzScTULbrKGwrS3ada6QAmTTA==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/extension-bubble-menu': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/extension-floating-menu': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/extension-bubble-menu': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-floating-menu': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@tiptap/starter-kit@2.1.10(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-h5mH1qv7SDFXWZPbOWC8zpGZ62EnDizRNtM45Gani0HYWJXcbPFpgN1qJmESP/jP+v+0hxtnVEkgfpiy3LRm6A==} + /@tiptap/starter-kit@2.1.11(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-kZXwuo9yxrs1ASxluRKjXThjdcy90d7owJxnJWD7SyEwXaXYc4h+Ar1M9rP3jieCDBuRTtCgvAOKbVbhnRJ2jg==} dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/extension-blockquote': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-bold': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-bullet-list': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-code': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-code-block': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/extension-document': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-dropcursor': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/extension-gapcursor': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/extension-hard-break': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-heading': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-history': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/extension-horizontal-rule': 2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10) - '@tiptap/extension-italic': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-list-item': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-ordered-list': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-paragraph': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-strike': 2.1.10(@tiptap/core@2.1.10) - '@tiptap/extension-text': 2.1.10(@tiptap/core@2.1.10) + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/extension-blockquote': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-bold': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-bullet-list': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-code': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-code-block': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-document': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-dropcursor': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-gapcursor': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-hard-break': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-heading': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-history': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-horizontal-rule': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-italic': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-list-item': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-ordered-list': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-paragraph': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-strike': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-text': 2.1.11(@tiptap/core@2.1.11) transitivePeerDependencies: - '@tiptap/pm' dev: false - /@tiptap/suggestion@2.1.10(@tiptap/core@2.1.10)(@tiptap/pm@2.1.10): - resolution: {integrity: sha512-k9WTTWT81UkHaxZksjp+wE31E85QL0jyLd0ZEKAs+btW148Pon1KwBeLnODNHILcdQaRPxRvb28a47cRHEKTiw==} + /@tiptap/suggestion@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-AVMB4x1X3eU7QCO1A8URQK0W7ps5dsVzveIP7+c//Z/GYe8lFSGIUnEbLJdr6bwgPkRL56m7c9+oZqVST5wfjQ==} peerDependencies: '@tiptap/core': ^2.0.0 '@tiptap/pm': ^2.0.0 dependencies: - '@tiptap/core': 2.1.10(@tiptap/pm@2.1.10) - '@tiptap/pm': 2.1.10 + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 dev: false /@trivago/prettier-plugin-sort-imports@4.2.0(prettier@3.0.3): @@ -2072,7 +2241,7 @@ packages: optional: true dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@babel/traverse': 7.17.3 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -2082,10 +2251,193 @@ packages: - supports-color dev: true - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + /@types/d3-array@3.0.8: + resolution: {integrity: sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ==} + dev: false + + /@types/d3-axis@3.0.4: + resolution: {integrity: sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA==} dependencies: - '@types/ms': 0.7.31 + '@types/d3-selection': 3.0.7 + dev: false + + /@types/d3-brush@3.0.4: + resolution: {integrity: sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q==} + dependencies: + '@types/d3-selection': 3.0.7 + dev: false + + /@types/d3-chord@3.0.4: + resolution: {integrity: sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg==} + dev: false + + /@types/d3-color@3.1.1: + resolution: {integrity: sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg==} + dev: false + + /@types/d3-contour@3.0.4: + resolution: {integrity: sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA==} + dependencies: + '@types/d3-array': 3.0.8 + '@types/geojson': 7946.0.11 + dev: false + + /@types/d3-delaunay@6.0.2: + resolution: {integrity: sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A==} + dev: false + + /@types/d3-dispatch@3.0.4: + resolution: {integrity: sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw==} + dev: false + + /@types/d3-drag@3.0.4: + resolution: {integrity: sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g==} + dependencies: + '@types/d3-selection': 3.0.7 + dev: false + + /@types/d3-dsv@3.0.4: + resolution: {integrity: sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA==} + dev: false + + /@types/d3-ease@3.0.0: + resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} + dev: false + + /@types/d3-fetch@3.0.4: + resolution: {integrity: sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q==} + dependencies: + '@types/d3-dsv': 3.0.4 + dev: false + + /@types/d3-force@3.0.6: + resolution: {integrity: sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw==} + dev: false + + /@types/d3-format@3.0.2: + resolution: {integrity: sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA==} + dev: false + + /@types/d3-geo@3.0.5: + resolution: {integrity: sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ==} + dependencies: + '@types/geojson': 7946.0.11 + dev: false + + /@types/d3-hierarchy@3.1.4: + resolution: {integrity: sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ==} + dev: false + + /@types/d3-interpolate@3.0.2: + resolution: {integrity: sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow==} + dependencies: + '@types/d3-color': 3.1.1 + dev: false + + /@types/d3-path@3.0.0: + resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + dev: false + + /@types/d3-polygon@3.0.0: + resolution: {integrity: sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==} + dev: false + + /@types/d3-quadtree@3.0.3: + resolution: {integrity: sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg==} + dev: false + + /@types/d3-random@3.0.1: + resolution: {integrity: sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==} + dev: false + + /@types/d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} + dev: false + + /@types/d3-scale@4.0.5: + resolution: {integrity: sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==} + dependencies: + '@types/d3-time': 3.0.1 + dev: false + + /@types/d3-selection@3.0.7: + resolution: {integrity: sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg==} + dev: false + + /@types/d3-shape@3.1.3: + resolution: {integrity: sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw==} + dependencies: + '@types/d3-path': 3.0.0 + dev: false + + /@types/d3-time-format@4.0.1: + resolution: {integrity: sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q==} + dev: false + + /@types/d3-time@3.0.1: + resolution: {integrity: sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==} + dev: false + + /@types/d3-timer@3.0.0: + resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} + dev: false + + /@types/d3-transition@3.0.5: + resolution: {integrity: sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg==} + dependencies: + '@types/d3-selection': 3.0.7 + dev: false + + /@types/d3-zoom@3.0.5: + resolution: {integrity: sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ==} + dependencies: + '@types/d3-interpolate': 3.0.2 + '@types/d3-selection': 3.0.7 + dev: false + + /@types/d3@7.4.1: + resolution: {integrity: sha512-lBpYmbHTCtFKO1DB1R7E9dXp9/g1F3JXSGOF7iKPZ+wRmYg/Q6tCRHODGOc5Qk25fJRe2PI60EDRf2HLPUncMA==} + dependencies: + '@types/d3-array': 3.0.8 + '@types/d3-axis': 3.0.4 + '@types/d3-brush': 3.0.4 + '@types/d3-chord': 3.0.4 + '@types/d3-color': 3.1.1 + '@types/d3-contour': 3.0.4 + '@types/d3-delaunay': 6.0.2 + '@types/d3-dispatch': 3.0.4 + '@types/d3-drag': 3.0.4 + '@types/d3-dsv': 3.0.4 + '@types/d3-ease': 3.0.0 + '@types/d3-fetch': 3.0.4 + '@types/d3-force': 3.0.6 + '@types/d3-format': 3.0.2 + '@types/d3-geo': 3.0.5 + '@types/d3-hierarchy': 3.1.4 + '@types/d3-interpolate': 3.0.2 + '@types/d3-path': 3.0.0 + '@types/d3-polygon': 3.0.0 + '@types/d3-quadtree': 3.0.3 + '@types/d3-random': 3.0.1 + '@types/d3-scale': 4.0.5 + '@types/d3-scale-chromatic': 3.0.0 + '@types/d3-selection': 3.0.7 + '@types/d3-shape': 3.1.3 + '@types/d3-time': 3.0.1 + '@types/d3-time-format': 4.0.1 + '@types/d3-timer': 3.0.0 + '@types/d3-transition': 3.0.5 + '@types/d3-zoom': 3.0.5 + dev: false + + /@types/debug@4.1.9: + resolution: {integrity: sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==} + dependencies: + '@types/ms': 0.7.32 + dev: false + + /@types/geojson@7946.0.11: + resolution: {integrity: sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==} dev: false /@types/hast@2.3.6: @@ -2102,18 +2454,18 @@ packages: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + /@types/mdast@3.0.13: + resolution: {integrity: sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==} dependencies: '@types/unist': 2.0.8 dev: false - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + /@types/ms@0.7.32: + resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==} dev: false - /@types/node@20.6.2: - resolution: {integrity: sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==} + /@types/node@20.7.1: + resolution: {integrity: sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==} dev: true /@types/object.omit@3.0.1: @@ -2124,26 +2476,26 @@ packages: resolution: {integrity: sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==} dev: false - /@types/prop-types@15.7.6: - resolution: {integrity: sha512-RK/kBbYOQQHLYj9Z95eh7S6t7gq4Ojt/NT8HTk8bWVhA5DaF+5SMnxHKkP4gPNN3wAZkKP+VjAf0ebtYzf+fxg==} + /@types/prop-types@15.7.7: + resolution: {integrity: sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==} - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + /@types/react-dom@18.2.8: + resolution: {integrity: sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==} dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 - /@types/react@18.2.22: - resolution: {integrity: sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==} + /@types/react@18.2.23: + resolution: {integrity: sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA==} dependencies: - '@types/prop-types': 15.7.6 - '@types/scheduler': 0.16.3 + '@types/prop-types': 15.7.7 + '@types/scheduler': 0.16.4 csstype: 3.1.2 - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + /@types/scheduler@0.16.4: + resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==} - /@types/semver@7.5.2: - resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} + /@types/semver@7.5.3: + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} dev: true /@types/throttle-debounce@2.1.0: @@ -2154,12 +2506,12 @@ packages: resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} dev: false - /@types/youtube-player@5.5.7: - resolution: {integrity: sha512-W8F4eoTIvzXeNrT3JroQPimZLXnlJA8smYygHZUKFPVoYwgs/OhJkA1VBhL3iSs57OQkuINqHlY4SmMT5wtnJg==} + /@types/youtube-player@5.5.8: + resolution: {integrity: sha512-WU6l9UyIp1TKEK3xN8K5Y1nZpP4FTnrz4ArAPjQknReNNkN9UeLbmAuFu2F69YthLkLkOAMWi9O3a6kJCIWH5g==} dev: true - /@typescript-eslint/eslint-plugin@6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==} + /@typescript-eslint/eslint-plugin@6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2169,14 +2521,14 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.8.1 - '@typescript-eslint/parser': 6.7.2(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.7.2 - '@typescript-eslint/type-utils': 6.7.2(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.2(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.2 + '@eslint-community/regexpp': 4.9.0 + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/type-utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.3 debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -2187,8 +2539,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.7.2(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==} + /@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2197,27 +2549,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.7.2 - '@typescript-eslint/types': 6.7.2 - '@typescript-eslint/typescript-estree': 6.7.2(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.2 + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.3 debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.50.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.7.2: - resolution: {integrity: sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==} + /@typescript-eslint/scope-manager@6.7.3: + resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.2 - '@typescript-eslint/visitor-keys': 6.7.2 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/visitor-keys': 6.7.3 dev: true - /@typescript-eslint/type-utils@6.7.2(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==} + /@typescript-eslint/type-utils@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2226,23 +2578,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.7.2(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.2(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.50.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.7.2: - resolution: {integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==} + /@typescript-eslint/types@6.7.3: + resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.7.2(typescript@5.2.2): - resolution: {integrity: sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==} + /@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2): + resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2250,8 +2602,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.7.2 - '@typescript-eslint/visitor-keys': 6.7.2 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/visitor-keys': 6.7.3 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2262,40 +2614,40 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.7.2(eslint@8.49.0)(typescript@5.2.2): - resolution: {integrity: sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==} + /@typescript-eslint/utils@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@types/json-schema': 7.0.13 - '@types/semver': 7.5.2 - '@typescript-eslint/scope-manager': 6.7.2 - '@typescript-eslint/types': 6.7.2 - '@typescript-eslint/typescript-estree': 6.7.2(typescript@5.2.2) - eslint: 8.49.0 + '@types/semver': 7.5.3 + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + eslint: 8.50.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.7.2: - resolution: {integrity: sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==} + /@typescript-eslint/visitor-keys@6.7.3: + resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.2 + '@typescript-eslint/types': 6.7.3 eslint-visitor-keys: 3.4.3 dev: true - /@vitejs/plugin-react-swc@3.3.2(vite@4.4.9): - resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==} + /@vitejs/plugin-react-swc@3.4.0(vite@4.4.9): + resolution: {integrity: sha512-m7UaA4Uvz82N/0EOVpZL4XsFIakRqrFKeSNxa1FBLSXGvWrWRBwmZb4qxk+ZIVAZcW3c3dn5YosomDgx62XWcQ==} peerDependencies: vite: ^4 dependencies: - '@swc/core': 1.3.86 - vite: 4.4.9(@types/node@20.6.2) + '@swc/core': 1.3.90 + vite: 4.4.9(@types/node@20.7.1) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -2467,15 +2819,15 @@ packages: has-symbols: 1.0.3 dev: true - /autoprefixer@10.4.15(postcss@8.4.30): - resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} + /autoprefixer@10.4.16(postcss@8.4.30): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001538 + browserslist: 4.22.0 + caniuse-lite: 1.0.30001540 fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -2488,8 +2840,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /axe-core@4.8.1: - resolution: {integrity: sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==} + /axe-core@4.8.2: + resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==} engines: {node: '>=4'} dev: true @@ -2526,15 +2878,15 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + /browserslist@4.22.0: + resolution: {integrity: sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001538 - electron-to-chromium: 1.4.525 + caniuse-lite: 1.0.30001540 + electron-to-chromium: 1.4.532 node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) + update-browserslist-db: 1.0.13(browserslist@4.22.0) dev: true /bufferutil@4.0.7: @@ -2562,8 +2914,8 @@ packages: engines: {node: '>= 6'} dev: true - /caniuse-lite@1.0.30001538: - resolution: {integrity: sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==} + /caniuse-lite@1.0.30001540: + resolution: {integrity: sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw==} dev: true /case-anything@2.1.13: @@ -2616,6 +2968,10 @@ packages: fsevents: 2.3.3 dev: true + /classcat@5.0.4: + resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} + dev: false + /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2631,13 +2987,6 @@ packages: string-width: 5.1.2 dev: true - /clone-regexp@3.0.0: - resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} - engines: {node: '>=12'} - dependencies: - is-regexp: 3.1.0 - dev: false - /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -2686,11 +3035,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-hrtime@5.0.0: - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} - engines: {node: '>=12'} - dev: false - /crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} dev: false @@ -2725,6 +3069,71 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -2881,8 +3290,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.525: - resolution: {integrity: sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA==} + /electron-to-chromium@1.4.532: + resolution: {integrity: sha512-piIR0QFdIGKmOJTSNg5AwxZRNWQSXlRYycqDB9Srstx4lip8KpcmRxVP6zuFWExWziHYZpJ0acX7TxqX95KBpg==} dev: true /emoji-regex@9.2.2: @@ -3067,31 +3476,31 @@ packages: engines: {node: '>=12'} dev: false - /eslint-config-prettier@9.0.0(eslint@8.49.0): + /eslint-config-prettier@9.0.0(eslint@8.50.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.49.0 + eslint: 8.50.0 dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.49.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.50.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.7 - axe-core: 4.8.1 + axe-core: 4.8.2 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.49.0 + eslint: 8.50.0 has: 1.0.3 jsx-ast-utils: 3.3.5 language-tags: 1.0.5 @@ -3101,7 +3510,7 @@ packages: semver: 6.3.1 dev: true - /eslint-plugin-react@7.33.2(eslint@8.49.0): + /eslint-plugin-react@7.33.2(eslint@8.50.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -3112,7 +3521,7 @@ packages: array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 es-iterator-helpers: 1.0.15 - eslint: 8.49.0 + eslint: 8.50.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -3126,12 +3535,12 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-simple-import-sort@10.0.0(eslint@8.49.0): + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.50.0): resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} peerDependencies: eslint: '>=5.0.0' dependencies: - eslint: 8.49.0 + eslint: 8.50.0 dev: true /eslint-scope@7.2.2: @@ -3147,15 +3556,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.49.0: - resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==} + /eslint@8.50.0: + resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - '@eslint-community/regexpp': 4.8.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/regexpp': 4.9.0 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.49.0 + '@eslint/js': 8.50.0 '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -3174,7 +3583,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.22.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -3363,11 +3772,6 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function-timeout@0.1.1: - resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} - engines: {node: '>=14.16'} - dev: false - /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} @@ -3409,17 +3813,6 @@ packages: get-intrinsic: 1.2.1 dev: true - /get-urls@12.1.0: - resolution: {integrity: sha512-qHO+QmPiI1bEw0Y/m+WMAAx/UoEEXLZwEx0DVaKMtlHNrKbMeV960LryIpd+E2Ykb9XkVHmVtpbCsmul3GhR0g==} - engines: {node: '>=16'} - dependencies: - normalize-url: 8.0.0 - super-regex: 0.2.0 - url-regex-safe: 4.0.0 - transitivePeerDependencies: - - re2 - dev: false - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3461,8 +3854,8 @@ packages: engines: {node: '>=4'} dev: true - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + /globals@13.22.0: + resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -3635,11 +4028,6 @@ packages: loose-envify: 1.4.0 dev: false - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - dev: false - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3782,11 +4170,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - dev: false - /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true @@ -4069,8 +4452,8 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: false - /markdown-it@13.0.1: - resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + /markdown-it@13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} hasBin: true dependencies: argparse: 2.0.1 @@ -4087,7 +4470,7 @@ packages: /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 '@types/unist': 2.0.8 unist-util-visit: 4.1.2 dev: false @@ -4095,7 +4478,7 @@ packages: /mdast-util-find-and-replace@2.2.2: resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 @@ -4104,7 +4487,7 @@ packages: /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 '@types/unist': 2.0.8 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 @@ -4123,7 +4506,7 @@ packages: /mdast-util-gfm-autolink-literal@1.0.3: resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.2.0 @@ -4132,7 +4515,7 @@ packages: /mdast-util-gfm-footnote@1.0.2: resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 dev: false @@ -4140,14 +4523,14 @@ packages: /mdast-util-gfm-strikethrough@1.0.3: resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-to-markdown: 1.5.0 dev: false /mdast-util-gfm-table@1.0.7: resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 markdown-table: 3.0.3 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 @@ -4158,7 +4541,7 @@ packages: /mdast-util-gfm-task-list-item@1.0.2: resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-to-markdown: 1.5.0 dev: false @@ -4179,7 +4562,7 @@ packages: /mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 unist-util-is: 5.2.1 dev: false @@ -4187,7 +4570,7 @@ packages: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: '@types/hast': 2.3.6 - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-definitions: 5.1.2 micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 @@ -4199,7 +4582,7 @@ packages: /mdast-util-to-markdown@1.5.0: resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 '@types/unist': 2.0.8 longest-streak: 3.1.0 mdast-util-phrasing: 3.0.1 @@ -4212,7 +4595,7 @@ packages: /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 dev: false /mdurl@1.0.1: @@ -4458,7 +4841,7 @@ packages: /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: - '@types/debug': 4.1.8 + '@types/debug': 4.1.9 debug: 4.3.4 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 @@ -4575,11 +4958,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} - engines: {node: '>=14.16'} - dev: false - /nostr-fetch@0.13.0: resolution: {integrity: sha512-0lIBkDjF5W0OBtkoMPax6ArKlzMGQDfc6cSyZ+XFvAoY2TJEiUXkI7Piwf0TQBEvJtahHaZnaTaFD13T69mgmQ==} dependencies: @@ -4596,8 +4974,8 @@ packages: '@scure/bip39': 1.2.1 dev: false - /nostr-tools@1.15.0(typescript@5.2.2): - resolution: {integrity: sha512-Dh7LVAUqaSiSs61QddsWluLVWpMwyMGaVlbhDYEy03ZwnBBzm10pz+mQZSdVV88/B3a5843gHZ4dIBUeS5upoA==} + /nostr-tools@1.16.0(typescript@5.2.2): + resolution: {integrity: sha512-sx/aOl0gmkeHVoIVbyOhEQhzF88NsrBXMC8bsjhPASqA6oZ8uSOAyEGgRLMfC3SKgzQD5Gr6KvDoAahaD6xKcg==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -4999,7 +5377,7 @@ packages: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.7.5 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 dev: false /prosemirror-gapcursor@1.3.2: @@ -5008,7 +5386,7 @@ packages: prosemirror-keymap: 1.2.2 prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 dev: false /prosemirror-history@1.3.2: @@ -5016,7 +5394,7 @@ packages: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.7.5 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 rope-sequence: 1.3.4 dev: false @@ -5037,7 +5415,7 @@ packages: /prosemirror-markdown@1.11.2: resolution: {integrity: sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ==} dependencies: - markdown-it: 13.0.1 + markdown-it: 13.0.2 prosemirror-model: 1.19.3 dev: false @@ -5075,7 +5453,7 @@ packages: dependencies: prosemirror-model: 1.19.3 prosemirror-transform: 1.7.5 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 dev: false /prosemirror-tables@1.3.4: @@ -5085,10 +5463,10 @@ packages: prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 prosemirror-transform: 1.7.5 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 dev: false - /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.31.8): + /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0): resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==} peerDependencies: prosemirror-model: ^1.19.0 @@ -5100,7 +5478,7 @@ packages: escape-string-regexp: 4.0.0 prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.31.8 + prosemirror-view: 1.32.0 dev: false /prosemirror-transform@1.7.5: @@ -5109,8 +5487,8 @@ packages: prosemirror-model: 1.19.3 dev: false - /prosemirror-view@1.31.8: - resolution: {integrity: sha512-VQrEIdiPJ4YV65Ifj2kWISwaiqocMHy7cpUKVQYt19C/87FepoqnwVW3kMKRpeY/nQzED8L+vyOaYDBn0WqT7w==} + /prosemirror-view@1.32.0: + resolution: {integrity: sha512-HwW7IWgca6ehiW2PA48H/8yl0TakA0Ms5LgN5Krc97oar7GfjIKE/NocUsLe74Jq4mwyWKUNoBljE8WkXKZwng==} dependencies: prosemirror-model: 1.19.3 prosemirror-state: 1.4.3 @@ -5134,6 +5512,16 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /re-resizable@6.9.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-currency-input-field@3.6.11(react@18.2.0): resolution: {integrity: sha512-M9vOx1eaioSaYWirm7W2WSBi4bpLg+LK4Gf7C1kNhy6MvoSoOzd0mYZPxA78OC9UBIQ2nM080Wu9D1CwTY6n3w==} peerDependencies: @@ -5156,8 +5544,8 @@ packages: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} dev: false - /react-hook-form@7.46.1(react@18.2.0): - resolution: {integrity: sha512-0GfI31LRTBd5tqbXMGXT1Rdsv3rnvy0FjEk8Gn9/4tp6+s77T7DPZuGEpBRXOauL+NhyGT5iaXzdIM2R6F/E+w==} + /react-hook-form@7.46.2(react@18.2.0): + resolution: {integrity: sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -5172,15 +5560,15 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: false - /react-markdown@8.0.7(@types/react@18.2.22)(react@18.2.0): + /react-markdown@8.0.7(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: '@types/react': '>=16' react: '>=16' dependencies: '@types/hast': 2.3.6 - '@types/prop-types': 15.7.6 - '@types/react': 18.2.22 + '@types/prop-types': 15.7.7 + '@types/react': 18.2.23 '@types/unist': 2.0.8 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 @@ -5212,7 +5600,7 @@ packages: react-fast-compare: 3.2.2 dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.22)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -5222,13 +5610,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.22)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.23)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.22)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -5238,13 +5626,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.22)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.22)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.23)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.23)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.22)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.22)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.23)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.23)(react@18.2.0) dev: false /react-router-dom@6.16.0(react-dom@18.2.0)(react@18.2.0): @@ -5270,7 +5658,7 @@ packages: react: 18.2.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.2.22)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -5280,38 +5668,27 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 dev: false - /react-textarea-autosize@8.5.3(@types/react@18.2.22)(react@18.2.0): + /react-textarea-autosize@8.5.3(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.22.15 + '@babel/runtime': 7.23.1 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.22)(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.23)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /react-virtuoso@4.6.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-paQbkLA8U6dRe9srltWgPeoFCtNKqUYIcOpUR01JyznzaXWVzgZQE0M9KGi9vMoq8vHvHkGzuxJ6jDCS6uzePg==} - engines: {node: '>=10'} - peerDependencies: - react: '>=16 || >=17 || >= 18' - react-dom: '>=16 || >=17 || >= 18' - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -5319,6 +5696,25 @@ packages: loose-envify: 1.4.0 dev: false + /reactflow@11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hARhGVX9rcZhtRWsjBszDpF0EefsYhCzrRCk12CsB2oqWJZPLQD4OYh5eQygr9Yi3M/i+3+rcNyPs9IsFzU5iQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/background': 11.3.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.2.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.9.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.7.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.2.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.3.2(@types/react@18.2.23)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: @@ -5359,7 +5755,7 @@ packages: /remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-gfm: 2.0.2 micromark-extension-gfm: 2.0.3 unified: 10.1.2 @@ -5370,7 +5766,7 @@ packages: /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: @@ -5381,7 +5777,7 @@ packages: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: '@types/hast': 2.3.6 - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.13 mdast-util-to-hast: 12.3.0 unified: 10.1.2 dev: false @@ -5433,8 +5829,8 @@ packages: glob: 7.2.3 dev: true - /rollup@3.29.2: - resolution: {integrity: sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==} + /rollup@3.29.3: + resolution: {integrity: sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -5662,15 +6058,6 @@ packages: ts-interface-checker: 0.1.13 dev: true - /super-regex@0.2.0: - resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} - engines: {node: '>=14.16'} - dependencies: - clone-regexp: 3.0.0 - function-timeout: 0.1.1 - time-span: 5.1.0 - dev: false - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5747,24 +6134,12 @@ packages: engines: {node: '>=10'} dev: false - /time-span@5.1.0: - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} - engines: {node: '>=12'} - dependencies: - convert-hrtime: 5.0.0 - dev: false - /tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} dependencies: '@popperjs/core': 2.11.8 dev: false - /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'} @@ -5964,13 +6339,13 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.13(browserslist@4.22.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.10 + browserslist: 4.22.0 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -5981,20 +6356,7 @@ packages: punycode: 2.3.0 dev: true - /url-regex-safe@4.0.0: - resolution: {integrity: sha512-BrnFCWKNFrFnRzKD66NtJqQepfJrUHNPvPxE5y5NSAhXBb4OlobQjt7907Jm4ItPiXaeX+dDWMkcnOd4jR9N8A==} - engines: {node: '>= 14'} - peerDependencies: - re2: ^1.20.1 - peerDependenciesMeta: - re2: - optional: true - dependencies: - ip-regex: 4.3.0 - tlds: 1.242.0 - dev: false - - /use-callback-ref@1.3.0(@types/react@18.2.22)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -6004,7 +6366,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 tslib: 2.6.2 dev: false @@ -6017,7 +6379,7 @@ packages: react: 18.2.0 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.22)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -6026,11 +6388,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 dev: false - /use-latest@1.2.1(@types/react@18.2.22)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -6039,12 +6401,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.22)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.23)(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.22)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -6054,7 +6416,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -6112,6 +6474,16 @@ packages: vfile-message: 3.1.4 dev: false + /virtua@0.9.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uaFvh+5zCDEenQDgxfIs67kpci7d/3XjdnWP/TdDYLcoXdWKr5ddwiP1g+wybHpXmLqbfJ0X0njmlAvP7GwMdw==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /vite-tsconfig-paths@4.2.1(typescript@5.2.2)(vite@4.4.9): resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==} peerDependencies: @@ -6123,13 +6495,13 @@ packages: debug: 4.3.4 globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.2.2) - vite: 4.4.9(@types/node@20.6.2) + vite: 4.4.9(@types/node@20.7.1) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.4.9(@types/node@20.6.2): + /vite@4.4.9(@types/node@20.7.1): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -6157,10 +6529,10 @@ packages: terser: optional: true dependencies: - '@types/node': 20.6.2 + '@types/node': 20.7.1 esbuild: 0.18.20 postcss: 8.4.30 - rollup: 3.29.2 + rollup: 3.29.3 optionalDependencies: fsevents: 2.3.3 dev: true @@ -6290,7 +6662,7 @@ packages: engines: {node: '>=10'} dev: true - /zustand@4.4.1(@types/react@18.2.22)(react@18.2.0): + /zustand@4.4.1(@types/react@18.2.23)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -6305,7 +6677,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.22 + '@types/react': 18.2.23 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false @@ -6314,32 +6686,32 @@ packages: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false - github.com/tauri-apps/tauri-plugin-sql/b8fd19dac907cc8c3d78681cd4803a326b8b861e: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/b8fd19dac907cc8c3d78681cd4803a326b8b861e} + github.com/tauri-apps/tauri-plugin-sql/533198dd3b6cfca36d876918d22efcdaac43065a: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-sql/tar.gz/533198dd3b6cfca36d876918d22efcdaac43065a} name: tauri-plugin-sql-api version: 0.0.0 dependencies: '@tauri-apps/api': 1.4.0 dev: false - github.com/tauri-apps/tauri-plugin-store/a65ce9bfb168a9a3cd7ed4102b9f22770cc3abfa: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/a65ce9bfb168a9a3cd7ed4102b9f22770cc3abfa} + github.com/tauri-apps/tauri-plugin-store/66e06b7830037fdae0b42b5499e23334eaf4e017: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/66e06b7830037fdae0b42b5499e23334eaf4e017} name: tauri-plugin-store-api version: 0.0.0 dependencies: '@tauri-apps/api': 1.4.0 dev: false - github.com/tauri-apps/tauri-plugin-stronghold/96dd2cc891915e6fdfb78868b0bef6c5648335a2: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-stronghold/tar.gz/96dd2cc891915e6fdfb78868b0bef6c5648335a2} + github.com/tauri-apps/tauri-plugin-stronghold/4684fed1f5e7eb01885e40114accdcecb61962ed: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-stronghold/tar.gz/4684fed1f5e7eb01885e40114accdcecb61962ed} name: tauri-plugin-stronghold-api version: 0.0.0 dependencies: '@tauri-apps/api': 1.4.0 dev: false - github.com/tauri-apps/tauri-plugin-upload/b53ebc6c2e716d95fd94b64d3b4b87cd57ae4feb: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/b53ebc6c2e716d95fd94b64d3b4b87cd57ae4feb} + github.com/tauri-apps/tauri-plugin-upload/40c0bc302a9dd8304762951e450ee84d53c2037b: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/40c0bc302a9dd8304762951e450ee84d53c2037b} name: tauri-plugin-upload-api version: 0.0.0 dependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index c6427455..f9c28f30 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -77,9 +77,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2135563fb5c609d2b2b87c1e8ce7bc41b0b45430fa9661f457981503dd5bf0" +checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" dependencies = [ "memchr", ] @@ -192,7 +192,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" dependencies = [ - "event-listener", + "event-listener 2.5.3", "futures-core", ] @@ -203,20 +203,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", "futures-core", ] [[package]] name = "async-executor" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +checksum = "78f2db9467baa66a700abce2a18c5ad793f6f83310aca1284796fc3921d113fd" dependencies = [ "async-lock", "async-task", "concurrent-queue", - "fastrand 1.9.0", + "fastrand 2.0.1", "futures-lite", "slab", ] @@ -259,24 +259,23 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", ] [[package]] name = "async-process" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +checksum = "bf012553ce51eb7aa6dc2143804cc8252bd1cb681a1c5cb7fa94ca88682dee1d" dependencies = [ "async-io", "async-lock", - "autocfg", + "async-signal", "blocking", "cfg-if", - "event-listener", + "event-listener 3.0.0", "futures-lite", - "rustix 0.37.23", - "signal-hook", + "rustix 0.38.14", "windows-sys 0.48.0", ] @@ -292,10 +291,29 @@ dependencies = [ ] [[package]] -name = "async-task" -version = "4.4.0" +name = "async-signal" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "4af361a844928cb7d36590d406709473a1b574f443094422ef166daa3b493208" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "concurrent-queue", + "futures-core", + "futures-io", + "libc", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-task" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9441c6b2fe128a7c2bf680a44c34d0df31ce09e5b7e401fcca3faa483dbc921" [[package]] name = "async-trait" @@ -343,15 +361,15 @@ dependencies = [ [[package]] name = "atomic-waker" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto-launch" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5904a4d734f0235edf29aab320a14899f3e090446e594ff96508a6215f76f89c" +checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" dependencies = [ "dirs", "thiserror", @@ -481,17 +499,18 @@ dependencies = [ [[package]] name = "blocking" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "94c4ef1f913d78636d78d538eec1f18de81e481f44b1be0a81060090530846e1" dependencies = [ "async-channel", "async-lock", "async-task", - "atomic-waker", - "fastrand 1.9.0", + "fastrand 2.0.1", + "futures-io", "futures-lite", - "log", + "piper", + "tracing", ] [[package]] @@ -717,9 +736,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.4" +version = "4.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d7b8d5ec32af0fadc644bf1fd509a688c2103b185644bb1e29d164e0703136" +checksum = "824956d0dca8334758a5b7f7e50518d66ea319330cbceedcf76905c2f6ab30e3" dependencies = [ "clap_builder", "clap_derive", @@ -727,9 +746,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.4" +version = "4.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5179bb514e4d7c2051749d8fcefa2ed6d06a9f4e6d69faf3805f5d80b8cf8d56" +checksum = "122ec64120a49b4563ccaedcbea7818d069ed8e9aa6d829b82d8a4128936b2ab" dependencies = [ "anstream", "anstyle", @@ -800,15 +819,14 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", - "foreign-types 0.3.2", "libc", "objc", ] @@ -837,9 +855,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" dependencies = [ "crossbeam-utils", ] @@ -1431,6 +1449,17 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e56284f00d94c1bc7fd3c77027b4623c88c1f53d8d2394c6199f2921dea325" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "1.9.0" @@ -1442,9 +1471,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fd-lock" @@ -1453,7 +1482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" dependencies = [ "cfg-if", - "rustix 0.38.13", + "rustix 0.38.14", "windows-sys 0.48.0", ] @@ -2317,9 +2346,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "ad227c3af19d4914570ad36d30409928b75967c298feb9ea1969db3a610bb14e" dependencies = [ "equivalent", "hashbrown 0.14.0", @@ -2375,7 +2404,7 @@ dependencies = [ "hmac", "pbkdf2", "serde", - "sha2 0.10.7", + "sha2 0.10.8", "unicode-normalization", "x25519-dalek", "zeroize", @@ -2623,6 +2652,8 @@ dependencies = [ name = "lume" version = "1.2.5" dependencies = [ + "cocoa 0.25.0", + "objc", "rust-argon2", "serde", "serde_json", @@ -2724,10 +2755,11 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest 0.10.7", ] @@ -3202,9 +3234,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "e52c774a4c39359c1d1c52e43f73dd91a75a614652c825408eec30c95a9b2067" [[package]] name = "parking_lot" @@ -3405,6 +3437,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -3694,9 +3737,9 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -3704,14 +3747,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -3955,9 +3996,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.13" +version = "0.38.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f" dependencies = [ "bitflags 2.4.0", "errno", @@ -3988,9 +4029,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.5" +version = "0.101.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" dependencies = [ "ring", "untrusted", @@ -4123,9 +4164,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" dependencies = [ "serde", ] @@ -4203,7 +4244,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.0", + "indexmap 2.0.1", "serde", "serde_json", "serde_with_macros", @@ -4256,9 +4297,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -4280,9 +4321,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -4291,23 +4332,13 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "c1b21f559e07218024e7e9f90f96f601825397de0e25420135f7f952453fed0b" dependencies = [ "lazy_static", ] -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -4350,9 +4381,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" @@ -4491,7 +4522,7 @@ dependencies = [ "crossbeam-queue", "dotenvy", "either", - "event-listener", + "event-listener 2.5.3", "futures-channel", "futures-core", "futures-intrusive", @@ -4499,7 +4530,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.0.0", + "indexmap 2.0.1", "log", "memchr", "once_cell", @@ -4509,7 +4540,7 @@ dependencies = [ "rustls-pemfile", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "sqlformat", "thiserror", @@ -4549,7 +4580,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -4593,7 +4624,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", @@ -4633,7 +4664,7 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2 0.10.7", + "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", @@ -5024,7 +5055,7 @@ dependencies = [ "semver", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "tauri-utils", "thiserror", "time", @@ -5049,7 +5080,7 @@ dependencies = [ [[package]] name = "tauri-plugin-autostart" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#3d279094d44be78cdc5d1de3938f1414e13db6b0" dependencies = [ "auto-launch", "log", @@ -5062,7 +5093,7 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#3d279094d44be78cdc5d1de3938f1414e13db6b0" dependencies = [ "log", "serde", @@ -5076,7 +5107,7 @@ dependencies = [ [[package]] name = "tauri-plugin-sql" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#3d279094d44be78cdc5d1de3938f1414e13db6b0" dependencies = [ "futures-core", "log", @@ -5092,7 +5123,7 @@ dependencies = [ [[package]] name = "tauri-plugin-store" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#3d279094d44be78cdc5d1de3938f1414e13db6b0" dependencies = [ "log", "serde", @@ -5104,7 +5135,7 @@ dependencies = [ [[package]] name = "tauri-plugin-stronghold" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#3d279094d44be78cdc5d1de3938f1414e13db6b0" dependencies = [ "hex", "iota-crypto 0.23.0", @@ -5123,7 +5154,7 @@ dependencies = [ [[package]] name = "tauri-plugin-upload" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#3d279094d44be78cdc5d1de3938f1414e13db6b0" dependencies = [ "futures-util", "log", @@ -5234,9 +5265,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", - "fastrand 2.0.0", + "fastrand 2.0.1", "redox_syscall 0.3.5", - "rustix 0.38.13", + "rustix 0.38.14", "windows-sys 0.48.0", ] @@ -5259,18 +5290,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2", "quote", @@ -5289,9 +5320,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" +checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" dependencies = [ "deranged", "itoa 1.0.9", @@ -5302,15 +5333,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -5381,9 +5412,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", @@ -5429,7 +5460,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.0.1", "serde", "serde_spanned", "toml_datetime", @@ -5685,9 +5716,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" @@ -5940,9 +5971,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -6346,7 +6377,7 @@ dependencies = [ "once_cell", "serde", "serde_json", - "sha2 0.10.7", + "sha2 0.10.8", "soup2", "tao", "thiserror", @@ -6439,7 +6470,7 @@ dependencies = [ "byteorder", "derivative", "enumflags2", - "event-listener", + "event-listener 2.5.3", "futures-core", "futures-sink", "futures-util", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 41e22308..096a0f38 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -16,11 +16,10 @@ tauri-build = { version = "1.4", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.4", features = [ +tauri = { version = "1.4", features = [ "macos-private-api", "window-close", "window-print", "window-create", - "macos-private-api", "fs-read-dir", "fs-read-file", "window-start-dragging", @@ -55,6 +54,10 @@ sqlx-cli = { version = "0.7.0", default-features = false, features = [ rust-argon2 = "1.0" webpage = { version = "1.6.0", features = ["serde"] } +[target.'cfg(any(target_os = "macos"))'.dependencies] +cocoa = "0.25.0" +objc = "0.2.7" + [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/migrations/20230921085234_add_metadata_table.sql b/src-tauri/migrations/20230921085234_add_metadata_table.sql new file mode 100644 index 00000000..93c9ece9 --- /dev/null +++ b/src-tauri/migrations/20230921085234_add_metadata_table.sql @@ -0,0 +1,9 @@ +-- Add migration script here +CREATE TABLE + metadata ( + id TEXT NOT NULL PRIMARY KEY, + event TEXT NOT NULL, + author TEXT NOT NULL, + kind NUMBER NOT NULL DEFAULt 0, + created_at INTEGER NOT NULL + ); \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 901ab4b7..4b20956b 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -3,15 +3,25 @@ windows_subsystem = "windows" )] -use tauri::Manager; +#[cfg(target_os = "macos")] +#[macro_use] +extern crate objc; + +use std::time::Duration; +use tauri::{Manager, WindowEvent}; use tauri_plugin_autostart::MacosLauncher; use tauri_plugin_sql::{Migration, MigrationKind}; use webpage::{Webpage, WebpageOptions}; -use std::time::Duration; #[cfg(target_os = "macos")] use window_vibrancy::{apply_vibrancy, NSVisualEffectMaterial}; +#[cfg(target_os = "macos")] +use traffic_light::TrafficLight; + +#[cfg(target_os = "macos")] +mod traffic_light; + #[derive(Clone, serde::Serialize)] struct Payload { args: Vec, @@ -102,8 +112,20 @@ fn main() { apply_vibrancy(&window, NSVisualEffectMaterial::HudWindow, None, None) .expect("Unsupported platform! 'apply_vibrancy' is only supported on macOS"); + #[cfg(target_os = "macos")] + window.set_transparent_titlebar(true); + #[cfg(target_os = "macos")] + window.position_traffic_lights(16.0, 25.0); + Ok(()) }) + .on_window_event(|e| { + #[cfg(target_os = "macos")] + if let WindowEvent::Resized(..) = e.event() { + let window = e.window(); + window.position_traffic_lights(16.0, 25.0); + } + }) .plugin( tauri_plugin_sql::Builder::default() .add_migrations( @@ -217,6 +239,12 @@ fn main() { sql: include_str!("../migrations/20230918235335_add_uniq_to_relay.sql"), kind: MigrationKind::Up, }, + Migration { + version: 20230921085234, + description: "add metadata", + sql: include_str!("../migrations/20230921085234_add_metadata_table.sql"), + kind: MigrationKind::Up, + }, ], ) .build(), diff --git a/src-tauri/src/traffic_light.rs b/src-tauri/src/traffic_light.rs new file mode 100644 index 00000000..fddee2d4 --- /dev/null +++ b/src-tauri/src/traffic_light.rs @@ -0,0 +1,60 @@ +use tauri::{Runtime, Window}; + +pub trait TrafficLight { + #[cfg(target_os = "macos")] + fn set_transparent_titlebar(&self, transparent: bool); + fn position_traffic_lights(&self, x: f64, y: f64); +} + +impl TrafficLight for Window { + #[cfg(target_os = "macos")] + fn set_transparent_titlebar(&self, transparent: bool) { + use cocoa::appkit::{NSWindow, NSWindowTitleVisibility}; + + let window = self.ns_window().unwrap() as cocoa::base::id; + + unsafe { + window.setTitleVisibility_(NSWindowTitleVisibility::NSWindowTitleHidden); + + if transparent { + window.setTitlebarAppearsTransparent_(cocoa::base::YES); + } else { + window.setTitlebarAppearsTransparent_(cocoa::base::NO); + } + } + } + + #[cfg(target_os = "macos")] + fn position_traffic_lights(&self, x: f64, y: f64) { + use cocoa::appkit::{NSView, NSWindow, NSWindowButton}; + use cocoa::foundation::NSRect; + + let window = self.ns_window().unwrap() as cocoa::base::id; + + unsafe { + let close = window.standardWindowButton_(NSWindowButton::NSWindowCloseButton); + let miniaturize = window.standardWindowButton_(NSWindowButton::NSWindowMiniaturizeButton); + let zoom = window.standardWindowButton_(NSWindowButton::NSWindowZoomButton); + + let title_bar_container_view = close.superview().superview(); + + let close_rect: NSRect = msg_send![close, frame]; + let button_height = close_rect.size.height; + + let title_bar_frame_height = button_height + y; + let mut title_bar_rect = NSView::frame(title_bar_container_view); + title_bar_rect.size.height = title_bar_frame_height; + title_bar_rect.origin.y = NSView::frame(window).size.height - title_bar_frame_height; + let _: () = msg_send![title_bar_container_view, setFrame: title_bar_rect]; + + let window_buttons = vec![close, miniaturize, zoom]; + let space_between = NSView::frame(miniaturize).origin.x - NSView::frame(close).origin.x; + + for (i, button) in window_buttons.into_iter().enumerate() { + let mut rect: NSRect = NSView::frame(button); + rect.origin.x = x + (i as f64 * space_between); + button.setFrameOrigin(rect.origin); + } + } + } +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 32ab8d23..b4299e4b 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -136,7 +136,6 @@ "enableTauriAPI": true } ] - }, - "macOSPrivateApi": true + } } } diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 443a00c7..1386b524 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -1,6 +1,7 @@ { "$schema": "../node_modules/@tauri-apps/cli/schema.json", "tauri": { + "macOSPrivateApi": true, "windows": [ { "width": 400, diff --git a/src/app.tsx b/src/app.tsx index cd9c8897..81cf7faa 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -1,11 +1,15 @@ import { message } from '@tauri-apps/api/dialog'; import { RouterProvider, createBrowserRouter, redirect } from 'react-router-dom'; +import 'reactflow/dist/style.css'; import { AuthCreateScreen } from '@app/auth/create'; import { AuthImportScreen } from '@app/auth/import'; import { OnboardingScreen } from '@app/auth/onboarding'; +import { BrowseScreen } from '@app/browse'; import { ErrorScreen } from '@app/error'; +import { useStorage } from '@libs/storage/provider'; + import { Frame } from '@shared/frame'; import { LoaderIcon } from '@shared/icons'; import { AppLayout } from '@shared/layouts/app'; @@ -13,254 +17,279 @@ import { AuthLayout } from '@shared/layouts/auth'; import { NoteLayout } from '@shared/layouts/note'; import { SettingsLayout } from '@shared/layouts/settings'; -import { checkActiveAccount } from '@utils/checkActiveAccount'; - import './index.css'; -async function Loader() { - try { - const account = await checkActiveAccount(); - - 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 (!account) { - return redirect('/auth/welcome'); - } else { - if (step) { - return redirect(step); - } - - if (!privkey) { - return redirect('/auth/unlock'); - } - } - - return null; - } catch (e) { - await message(e, { title: 'An unexpected error has occurred', type: 'error' }); - } -} - -const router = createBrowserRouter([ - { - path: '/', - element: , - errorElement: , - loader: Loader, - children: [ - { - path: '', - async lazy() { - const { SpaceScreen } = await import('@app/space'); - return { Component: SpaceScreen }; - }, - }, - { - path: 'users/:pubkey', - async lazy() { - const { UserScreen } = await import('@app/users'); - return { Component: UserScreen }; - }, - }, - { - path: 'chats/:pubkey', - async lazy() { - const { ChatScreen } = await import('@app/chats'); - return { Component: ChatScreen }; - }, - }, - { - path: 'notifications', - async lazy() { - const { NotificationScreen } = await import('@app/notifications'); - return { Component: NotificationScreen }; - }, - }, - { - path: 'nwc', - async lazy() { - const { NWCScreen } = await import('@app/nwc'); - return { Component: NWCScreen }; - }, - }, - ], - }, - { - path: '/notes', - element: , - errorElement: , - children: [ - { - path: 'text/:id', - async lazy() { - const { TextNoteScreen } = await import('@app/notes/text'); - return { Component: TextNoteScreen }; - }, - }, - { - path: 'article/:id', - async lazy() { - const { ArticleNoteScreen } = await import('@app/notes/article'); - return { Component: ArticleNoteScreen }; - }, - }, - ], - }, - { - path: '/splashscreen', - errorElement: , - async lazy() { - const { SplashScreen } = await import('@app/splash'); - return { Component: SplashScreen }; - }, - }, - { - path: '/auth', - element: , - errorElement: , - children: [ - { - path: 'welcome', - async lazy() { - const { WelcomeScreen } = await import('@app/auth/welcome'); - return { Component: WelcomeScreen }; - }, - }, - { - path: 'import', - element: , - errorElement: , - children: [ - { - path: '', - async lazy() { - const { ImportStep1Screen } = await import('@app/auth/import/step-1'); - return { Component: ImportStep1Screen }; - }, - }, - { - path: 'step-2', - async lazy() { - const { ImportStep2Screen } = await import('@app/auth/import/step-2'); - return { Component: ImportStep2Screen }; - }, - }, - { - path: 'step-3', - async lazy() { - const { ImportStep3Screen } = await import('@app/auth/import/step-3'); - return { Component: ImportStep3Screen }; - }, - }, - ], - }, - { - path: 'create', - element: , - errorElement: , - children: [ - { - path: '', - async lazy() { - const { CreateStep1Screen } = await import('@app/auth/create/step-1'); - return { Component: CreateStep1Screen }; - }, - }, - { - path: 'step-2', - async lazy() { - const { CreateStep2Screen } = await import('@app/auth/create/step-2'); - return { Component: CreateStep2Screen }; - }, - }, - { - path: 'step-3', - async lazy() { - const { CreateStep3Screen } = await import('@app/auth/create/step-3'); - return { Component: CreateStep3Screen }; - }, - }, - ], - }, - { - path: 'onboarding', - element: , - errorElement: , - children: [ - { - path: '', - async lazy() { - const { OnboardStep1Screen } = await import('@app/auth/onboarding/step-1'); - return { Component: OnboardStep1Screen }; - }, - }, - { - path: 'step-2', - async lazy() { - const { OnboardStep2Screen } = await import('@app/auth/onboarding/step-2'); - return { Component: OnboardStep2Screen }; - }, - }, - ], - }, - { - path: 'complete', - async lazy() { - const { CompleteScreen } = await import('@app/auth/complete'); - return { Component: CompleteScreen }; - }, - }, - { - path: 'unlock', - async lazy() { - const { UnlockScreen } = await import('@app/auth/unlock'); - return { Component: UnlockScreen }; - }, - }, - { - path: 'migrate', - async lazy() { - const { MigrateScreen } = await import('@app/auth/migrate'); - return { Component: MigrateScreen }; - }, - }, - { - path: 'reset', - async lazy() { - const { ResetScreen } = await import('@app/auth/reset'); - return { Component: ResetScreen }; - }, - }, - ], - }, - { - path: '/settings', - element: , - errorElement: , - children: [ - { - path: '', - async lazy() { - const { GeneralSettingsScreen } = await import('@app/settings/general'); - return { Component: GeneralSettingsScreen }; - }, - }, - { - path: 'backup', - async lazy() { - const { AccountSettingsScreen } = await import('@app/settings/account'); - return { Component: AccountSettingsScreen }; - }, - }, - ], - }, -]); - export default function App() { + const { db } = useStorage(); + + const accountLoader = async () => { + try { + const account = await db.checkAccount(); + + 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 (!account) { + return redirect('/auth/welcome'); + } else { + if (step) { + return redirect(step); + } + + if (!privkey) { + return redirect('/auth/unlock'); + } + } + + return null; + } catch (e) { + await message(e, { title: 'An unexpected error has occurred', type: 'error' }); + } + }; + + const router = createBrowserRouter([ + { + path: '/', + element: , + errorElement: , + loader: accountLoader, + children: [ + { + path: '', + async lazy() { + const { SpaceScreen } = await import('@app/space'); + return { Component: SpaceScreen }; + }, + }, + { + path: 'browse', + element: , + errorElement: , + children: [ + { + path: '', + async lazy() { + const { BrowseUsersScreen } = await import('@app/browse/users'); + return { Component: BrowseUsersScreen }; + }, + }, + { + path: 'relays', + async lazy() { + const { BrowseRelaysScreen } = await import('@app/browse/relays'); + return { Component: BrowseRelaysScreen }; + }, + }, + ], + }, + { + path: 'users/:pubkey', + async lazy() { + const { UserScreen } = await import('@app/users'); + return { Component: UserScreen }; + }, + }, + { + path: 'chats/:pubkey', + async lazy() { + const { ChatScreen } = await import('@app/chats'); + return { Component: ChatScreen }; + }, + }, + { + path: 'notifications', + async lazy() { + const { NotificationScreen } = await import('@app/notifications'); + return { Component: NotificationScreen }; + }, + }, + { + path: 'nwc', + async lazy() { + const { NWCScreen } = await import('@app/nwc'); + return { Component: NWCScreen }; + }, + }, + ], + }, + { + path: '/notes', + element: , + errorElement: , + children: [ + { + path: 'text/:id', + async lazy() { + const { TextNoteScreen } = await import('@app/notes/text'); + return { Component: TextNoteScreen }; + }, + }, + { + path: 'article/:id', + async lazy() { + const { ArticleNoteScreen } = await import('@app/notes/article'); + return { Component: ArticleNoteScreen }; + }, + }, + ], + }, + { + path: '/splashscreen', + errorElement: , + async lazy() { + const { SplashScreen } = await import('@app/splash'); + return { Component: SplashScreen }; + }, + }, + { + path: '/auth', + element: , + errorElement: , + children: [ + { + path: 'welcome', + async lazy() { + const { WelcomeScreen } = await import('@app/auth/welcome'); + return { Component: WelcomeScreen }; + }, + }, + { + path: 'import', + element: , + errorElement: , + children: [ + { + path: '', + async lazy() { + const { ImportStep1Screen } = await import('@app/auth/import/step-1'); + return { Component: ImportStep1Screen }; + }, + }, + { + path: 'step-2', + async lazy() { + const { ImportStep2Screen } = await import('@app/auth/import/step-2'); + return { Component: ImportStep2Screen }; + }, + }, + { + path: 'step-3', + async lazy() { + const { ImportStep3Screen } = await import('@app/auth/import/step-3'); + return { Component: ImportStep3Screen }; + }, + }, + ], + }, + { + path: 'create', + element: , + errorElement: , + children: [ + { + path: '', + async lazy() { + const { CreateStep1Screen } = await import('@app/auth/create/step-1'); + return { Component: CreateStep1Screen }; + }, + }, + { + path: 'step-2', + async lazy() { + const { CreateStep2Screen } = await import('@app/auth/create/step-2'); + return { Component: CreateStep2Screen }; + }, + }, + { + path: 'step-3', + async lazy() { + const { CreateStep3Screen } = await import('@app/auth/create/step-3'); + return { Component: CreateStep3Screen }; + }, + }, + ], + }, + { + path: 'onboarding', + element: , + errorElement: , + children: [ + { + path: '', + async lazy() { + const { OnboardStep1Screen } = await import( + '@app/auth/onboarding/step-1' + ); + return { Component: OnboardStep1Screen }; + }, + }, + { + path: 'step-2', + async lazy() { + const { OnboardStep2Screen } = await import( + '@app/auth/onboarding/step-2' + ); + return { Component: OnboardStep2Screen }; + }, + }, + ], + }, + { + path: 'complete', + async lazy() { + const { CompleteScreen } = await import('@app/auth/complete'); + return { Component: CompleteScreen }; + }, + }, + { + path: 'unlock', + async lazy() { + const { UnlockScreen } = await import('@app/auth/unlock'); + return { Component: UnlockScreen }; + }, + }, + { + path: 'migrate', + async lazy() { + const { MigrateScreen } = await import('@app/auth/migrate'); + return { Component: MigrateScreen }; + }, + }, + { + path: 'reset', + async lazy() { + const { ResetScreen } = await import('@app/auth/reset'); + return { Component: ResetScreen }; + }, + }, + ], + }, + { + path: '/settings', + element: , + errorElement: , + children: [ + { + path: '', + async lazy() { + const { GeneralSettingsScreen } = await import('@app/settings/general'); + return { Component: GeneralSettingsScreen }; + }, + }, + { + path: 'backup', + async lazy() { + const { AccountSettingsScreen } = await import('@app/settings/account'); + return { Component: AccountSettingsScreen }; + }, + }, + ], + }, + ]); + return ( } + future={{ v7_startTransition: true }} /> ); } diff --git a/src/app/auth/import/step-3.tsx b/src/app/auth/import/step-3.tsx index 66f9f6dc..0f100cfe 100644 --- a/src/app/auth/import/step-3.tsx +++ b/src/app/auth/import/step-3.tsx @@ -16,7 +16,7 @@ export function ImportStep3Screen() { const setStep = useOnboarding((state) => state.setStep); const { db } = useStorage(); - const { fetchUserData, prefetchEvents } = useNostr(); + const { fetchUserData } = useNostr(); const [loading, setLoading] = useState(false); @@ -27,16 +27,14 @@ export function ImportStep3Screen() { // prefetch data const user = await fetchUserData(); - const data = await prefetchEvents(); // create default widget await db.createWidget(WidgetKinds.other.learnNostr, 'Learn Nostr', ''); // redirect to next step - if (user.status === 'ok' && data.status === 'ok') { + if (user.status === 'ok') { navigate('/auth/onboarding/step-2', { replace: true }); } else { - console.log('error: ', data.message); setLoading(false); } } catch (e) { @@ -83,7 +81,7 @@ export function ImportStep3Screen() { By clicking 'Continue', Lume will download your old relay list and - all events from the last 24 hours. It may take a bit + metadata. It may take a bit diff --git a/src/app/auth/onboarding/step-1.tsx b/src/app/auth/onboarding/step-1.tsx index 1f9d2dd0..08b4bc06 100644 --- a/src/app/auth/onboarding/step-1.tsx +++ b/src/app/auth/onboarding/step-1.tsx @@ -16,7 +16,7 @@ export function OnboardStep1Screen() { const navigate = useNavigate(); const setStep = useOnboarding((state) => state.setStep); - const { publish, fetchUserData, prefetchEvents } = useNostr(); + const { publish, fetchUserData } = useNostr(); const { db } = useStorage(); const { status, data } = useQuery(['trending-profiles-widget'], async () => { const res = await fetch('https://api.nostr.band/v0/trending/profiles'); @@ -46,14 +46,12 @@ export function OnboardStep1Screen() { // prefetch data const user = await fetchUserData(follows); - const data = await prefetchEvents(); // redirect to next step - if (event && user.status === 'ok' && data.status === 'ok') { + if (event && user.status === 'ok') { navigate('/auth/onboarding/step-2', { replace: true }); } else { setLoading(false); - console.log('error: ', data.message); } } catch (e) { setLoading(false); @@ -70,7 +68,7 @@ export function OnboardStep1Screen() {

- {loading ? 'Prefetching data...' : 'Enrich your network'} + {loading ? 'Loading...' : 'Enrich your network'}

Choose the account you want to follow. These accounts are trending in the last @@ -127,19 +125,12 @@ export function OnboardStep1Screen() { )} - {!loading ? ( - - Skip, you can add later - - ) : ( - - By clicking 'Continue', Lume will download all events related to - your follows from the last 24 hours. It may take a bit - - )} + + Skip, you can add later +

diff --git a/src/app/auth/unlock.tsx b/src/app/auth/unlock.tsx index f8f18177..4a8c2e4d 100644 --- a/src/app/auth/unlock.tsx +++ b/src/app/auth/unlock.tsx @@ -70,6 +70,13 @@ export function UnlockScreen() { } }; + const logout = async () => { + // remove account + db.accountLogout(); + // redirect to welcome screen + navigate('/auth/welcome'); + }; + return (
@@ -126,12 +133,30 @@ export function UnlockScreen() { )} - - Reset password - +
+
+
+

+ Forgot password? +

+
+
+
+ + Reset password if you still have private key + + +
+
diff --git a/src/app/auth/welcome.tsx b/src/app/auth/welcome.tsx index c8e3ca05..375ae582 100644 --- a/src/app/auth/welcome.tsx +++ b/src/app/auth/welcome.tsx @@ -1,34 +1,10 @@ -import { LogicalSize, getCurrent } from '@tauri-apps/api/window'; -import { useEffect } from 'react'; import { Link } from 'react-router-dom'; import { ArrowRightCircleIcon } from '@shared/icons/arrowRightCircle'; export function WelcomeScreen() { - const appWindow = getCurrent(); - - async function setWindow() { - await appWindow.setSize(new LogicalSize(400, 500)); - await appWindow.setResizable(false); - await appWindow.center(); - } - - async function resetWindow() { - await appWindow.setSize(new LogicalSize(1080, 800)); - await appWindow.setResizable(false); - await appWindow.center(); - } - - useEffect(() => { - setWindow(); - - return () => { - resetWindow(); - }; - }, []); - return ( -
+

Welcome to Lume

@@ -54,8 +30,8 @@ export function WelcomeScreen() {
-
- lume +
+ lume
); diff --git a/src/app/browse/components/edge.tsx b/src/app/browse/components/edge.tsx new file mode 100644 index 00000000..296996b1 --- /dev/null +++ b/src/app/browse/components/edge.tsx @@ -0,0 +1,29 @@ +import { BaseEdge, EdgeProps, getBezierPath } from 'reactflow'; + +export function Edge({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + style = {}, + markerEnd, +}: EdgeProps) { + const [edgePath] = getBezierPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + }); + + return ( + + ); +} diff --git a/src/app/browse/components/groupTitle.tsx b/src/app/browse/components/groupTitle.tsx new file mode 100644 index 00000000..a01cd075 --- /dev/null +++ b/src/app/browse/components/groupTitle.tsx @@ -0,0 +1,17 @@ +import { memo } from 'react'; + +import { useProfile } from '@utils/hooks/useProfile'; + +export const GroupTitle = memo(function GroupTitle({ pubkey }: { pubkey: string }) { + const { status, user } = useProfile(pubkey); + + if (status === 'loading') { + return
; + } + + return ( +

{`${ + user.name || user.display_name + }'s network`}

+ ); +}); diff --git a/src/app/browse/components/line.tsx b/src/app/browse/components/line.tsx new file mode 100644 index 00000000..993667c7 --- /dev/null +++ b/src/app/browse/components/line.tsx @@ -0,0 +1,14 @@ +export function Line({ fromX, fromY, toX, toY }) { + return ( + + + + + ); +} diff --git a/src/app/browse/components/userGroupNode.tsx b/src/app/browse/components/userGroupNode.tsx new file mode 100644 index 00000000..7fe58277 --- /dev/null +++ b/src/app/browse/components/userGroupNode.tsx @@ -0,0 +1,34 @@ +import { Handle, Position } from 'reactflow'; + +import { UserWithDrawer } from '@app/browse/components/userWithDrawer'; + +import { GroupTitle } from './groupTitle'; + +export function UserGroupNode({ data }) { + return ( + <> + +
+ {data.title ? ( +

{data.title}

+ ) : ( + + )} +
+ {data.list.map((user: string) => ( + + ))} +
+
+ + + ); +} diff --git a/src/app/browse/components/userLatestPosts.tsx b/src/app/browse/components/userLatestPosts.tsx new file mode 100644 index 00000000..ac54220d --- /dev/null +++ b/src/app/browse/components/userLatestPosts.tsx @@ -0,0 +1,80 @@ +import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; +import { useQuery } from '@tanstack/react-query'; +import { useCallback } from 'react'; + +import { LoaderIcon } from '@shared/icons'; +import { + ArticleNote, + FileNote, + NoteWrapper, + Repost, + TextNote, + UnknownNote, +} from '@shared/notes'; + +import { useNostr } from '@utils/hooks/useNostr'; + +export function UserLatestPosts({ pubkey }: { pubkey: string }) { + const { getEventsByPubkey } = useNostr(); + const { status, data } = useQuery(['user-posts', pubkey], async () => { + return await getEventsByPubkey(pubkey); + }); + + const renderItem = useCallback( + (event: NDKEvent) => { + switch (event.kind) { + case NDKKind.Text: + return ( + + + + ); + case NDKKind.Repost: + return ; + case 1063: + return ( + + + + ); + case NDKKind.Article: + return ( + + + + ); + default: + return ( + + + + ); + } + }, + [data] + ); + + return ( +
+

Latest post

+
+ {status === 'loading' ? ( +
+
+ + Loading latest posts... +
+
+ ) : data.length < 1 ? ( +
+
+ No posts from 24 hours ago +
+
+ ) : ( + data.map((event) => renderItem(event)) + )} +
+
+ ); +} diff --git a/src/app/browse/components/userNode.tsx b/src/app/browse/components/userNode.tsx new file mode 100644 index 00000000..0f5af72e --- /dev/null +++ b/src/app/browse/components/userNode.tsx @@ -0,0 +1,21 @@ +import { Handle, Position } from 'reactflow'; + +import { User } from '@shared/user'; + +export function UserNode({ data }) { + return ( + <> +
+ +
+ +
+
+ + + ); +} diff --git a/src/app/browse/components/userWithDrawer.tsx b/src/app/browse/components/userWithDrawer.tsx new file mode 100644 index 00000000..4d0e5d17 --- /dev/null +++ b/src/app/browse/components/userWithDrawer.tsx @@ -0,0 +1,130 @@ +import * as Dialog from '@radix-ui/react-dialog'; +import { memo, useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; + +import { useStorage } from '@libs/storage/provider'; + +import { Image } from '@shared/image'; +import { NIP05 } from '@shared/nip05'; +import { TextNote } from '@shared/notes'; +import { User } from '@shared/user'; + +import { useNostr } from '@utils/hooks/useNostr'; +import { useProfile } from '@utils/hooks/useProfile'; +import { displayNpub } from '@utils/shortenKey'; + +import { UserLatestPosts } from './userLatestPosts'; + +export const UserWithDrawer = memo(function UserWithDrawer({ + pubkey, +}: { + pubkey: string; +}) { + const { addContact, removeContact } = useNostr(); + const { db } = useStorage(); + const { status, user } = useProfile(pubkey); + + const [followed, setFollowed] = useState(false); + + const followUser = (pubkey: string) => { + try { + addContact(pubkey); + // update state + setFollowed(true); + } catch (error) { + console.log(error); + } + }; + + const unfollowUser = (pubkey: string) => { + try { + removeContact(pubkey); + // update state + setFollowed(false); + } catch (error) { + console.log(error); + } + }; + + useEffect(() => { + if (db.account.follows.includes(pubkey)) { + setFollowed(true); + } + }, []); + + return ( + + + + + + +
+ {status === 'loading' ? ( +
+

Loading...

+
+ ) : ( + <> +
+ {pubkey} +
+
+
+ {user?.displayName || user?.name || 'No name'} +
+ {user?.nip05 ? ( + + ) : ( + + {displayNpub(pubkey, 16)} + + )} + {user?.about ? : null} +
+
+ {followed ? ( + + ) : ( + + )} + + Message + +
+
+
+ + + )} +
+
+
+
+ ); +}); diff --git a/src/app/browse/index.tsx b/src/app/browse/index.tsx new file mode 100644 index 00000000..cb538e5e --- /dev/null +++ b/src/app/browse/index.tsx @@ -0,0 +1,43 @@ +import { NavLink, Outlet } from 'react-router-dom'; +import { ReactFlowProvider } from 'reactflow'; +import { twMerge } from 'tailwind-merge'; + +export function BrowseScreen() { + return ( + +
+
+
+
+ + twMerge( + 'inline-flex h-7 w-20 items-center justify-center rounded-full text-sm font-semibold', + isActive ? 'bg-white/10 hover:bg-white/20' : ' hover:bg-white/5' + ) + } + > + Users + + + twMerge( + 'inline-flex h-7 w-20 items-center justify-center rounded-full text-sm font-semibold', + isActive ? 'bg-white/10 hover:bg-white/20' : ' hover:bg-white/5' + ) + } + > + Relays + +
+
+
+
+ +
+
+ + ); +} diff --git a/src/app/browse/relays.tsx b/src/app/browse/relays.tsx new file mode 100644 index 00000000..6047990b --- /dev/null +++ b/src/app/browse/relays.tsx @@ -0,0 +1,12 @@ +export function BrowseRelaysScreen() { + return ( +
+
+

Content

+
+
+

Your relays

+
+
+ ); +} diff --git a/src/app/browse/users.tsx b/src/app/browse/users.tsx new file mode 100644 index 00000000..c638c546 --- /dev/null +++ b/src/app/browse/users.tsx @@ -0,0 +1,116 @@ +import { useCallback, useMemo, useRef } from 'react'; +import ReactFlow, { + Background, + ConnectionMode, + addEdge, + useEdgesState, + useNodesState, + useReactFlow, +} from 'reactflow'; + +import { Edge } from '@app/browse//components/edge'; +import { UserGroupNode } from '@app/browse//components/userGroupNode'; +import { Line } from '@app/browse/components/line'; +import { UserNode } from '@app/browse/components/userNode'; + +import { useStorage } from '@libs/storage/provider'; + +import { useNostr } from '@utils/hooks/useNostr'; +import { getMultipleRandom } from '@utils/transform'; + +let id = 2; +const getId = () => `${id++}`; +const nodeTypes = { user: UserNode, userGroup: UserGroupNode }; +const edgeTypes = { buttonedge: Edge }; + +export function BrowseUsersScreen() { + const { db } = useStorage(); + const { getContactsByPubkey } = useNostr(); + const { project } = useReactFlow(); + + const defaultContacts = useMemo(() => getMultipleRandom(db.account.follows, 10), []); + const reactFlowWrapper = useRef(null); + const connectingNodeId = useRef(null); + + const initialNodes = [ + { + id: '0', + type: 'user', + position: { x: 141, y: 0 }, + data: { list: [], title: '', pubkey: db.account.pubkey }, + }, + { + id: '1', + type: 'userGroup', + position: { x: 0, y: 200 }, + data: { list: defaultContacts, title: 'Starting Point', pubkey: '' }, + }, + ]; + const initialEdges = [{ id: 'e0-1', type: 'buttonedge', source: '0', target: '1' }]; + + const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes); + const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); + + const onConnect = useCallback((params) => setEdges((eds) => addEdge(params, eds)), []); + + const onConnectStart = useCallback((_, { nodeId }) => { + connectingNodeId.current = nodeId; + }, []); + + const onConnectEnd = useCallback( + async (event) => { + const targetIsPane = event.target.classList.contains('react-flow__pane'); + + if (targetIsPane) { + const { top, left } = reactFlowWrapper.current.getBoundingClientRect(); + + const id = getId(); + const prevData = nodes.slice(-1)[0]; + const randomPubkey = getMultipleRandom(prevData.data.list, 1)[0]; + + const newContactList = await getContactsByPubkey(randomPubkey); + const newNode = { + id, + type: 'userGroup', + position: project({ x: event.clientX - left, y: event.clientY - top }), + data: { list: newContactList, title: null, pubkey: randomPubkey }, + }; + + setNodes((nds) => nds.concat(newNode)); + setEdges((eds) => + eds.concat({ + id, + type: 'buttonedge', + source: connectingNodeId.current, + target: id, + }) + ); + } + }, + [project] + ); + + return ( +
+ + + +
+ ); +} diff --git a/src/app/chats/components/item.tsx b/src/app/chats/components/item.tsx index 6ec9bc91..d692fdbe 100644 --- a/src/app/chats/components/item.tsx +++ b/src/app/chats/components/item.tsx @@ -11,7 +11,7 @@ export function ChatsListItem({ pubkey }: { pubkey: string }) { if (status === 'loading') { return ( -
+
@@ -24,7 +24,7 @@ export function ChatsListItem({ pubkey }: { pubkey: string }) { preventScrollReset={true} className={({ isActive }) => twMerge( - 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-2', + 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-3', isActive ? 'border-fuchsia-500 bg-white/5 text-white' : 'border-transparent text-white/70' @@ -38,7 +38,10 @@ export function ChatsListItem({ pubkey }: { pubkey: string }) { />
- {user?.name || user?.display_name || displayNpub(pubkey, 16)} + {user?.name || + user?.display_name || + user?.displayName || + displayNpub(pubkey, 16)}
diff --git a/src/app/chats/components/list.tsx b/src/app/chats/components/list.tsx index d4960fc2..8335b7b5 100644 --- a/src/app/chats/components/list.tsx +++ b/src/app/chats/components/list.tsx @@ -7,6 +7,8 @@ import { UnknownsModal } from '@app/chats/components/unknowns'; import { useStorage } from '@libs/storage/provider'; +import { LoaderIcon } from '@shared/icons'; + import { useNostr } from '@utils/hooks/useNostr'; export function ChatsList() { @@ -33,8 +35,10 @@ export function ChatsList() { return (
-
-
+
+ +
+
Loading messages...
); @@ -42,8 +46,8 @@ export function ChatsList() { return (
- {chats.follows.map((item) => renderItem(item))} - {chats.unknowns.length > 0 && } + {chats?.follows?.map((item) => renderItem(item))} + {chats?.unknowns?.length > 0 && }
); diff --git a/src/app/chats/components/messages/item.tsx b/src/app/chats/components/messages/item.tsx index 0455e511..94abb01f 100644 --- a/src/app/chats/components/messages/item.tsx +++ b/src/app/chats/components/messages/item.tsx @@ -2,6 +2,7 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useDecryptMessage } from '@app/chats/hooks/useDecryptMessage'; +import { TextNote } from '@shared/notes'; import { User } from '@shared/user'; export function ChatMessageItem({ @@ -20,13 +21,12 @@ export function ChatMessageItem({ } return ( -
+
-
-

- {message.content} -

+
+
+
diff --git a/src/app/chats/components/modal.tsx b/src/app/chats/components/modal.tsx index 5a2adce7..53aa5e71 100644 --- a/src/app/chats/components/modal.tsx +++ b/src/app/chats/components/modal.tsx @@ -23,7 +23,7 @@ export function NewMessageModal() {
+ ) : data.length === 0 ? ( +
+

🙌

+

+ You two didn't talk yet, let's send first message +

+
) : ( - Empty, - }} - /> + + {data.map((message) => renderItem(message))} + )}
@@ -120,12 +110,3 @@ export function ChatScreen() {
); } - -const Empty = ( -
-

🙌

-

- You two didn't talk yet, let's send first message -

-
-); diff --git a/src/app/notifications/components/user.tsx b/src/app/notifications/components/user.tsx index b115f44a..8d4f70d9 100644 --- a/src/app/notifications/components/user.tsx +++ b/src/app/notifications/components/user.tsx @@ -25,7 +25,7 @@ export function NotiUser({ pubkey }: { pubkey: string }) { className="h-8 w-8 shrink-0 rounded-md object-cover" /> - {user?.name || user?.display_name || displayNpub(pubkey, 16)} + {user?.name || user?.display_name || user?.displayName || displayNpub(pubkey, 16)}
); diff --git a/src/app/nwc/index.tsx b/src/app/nwc/index.tsx index 10f1b133..1fed435e 100644 --- a/src/app/nwc/index.tsx +++ b/src/app/nwc/index.tsx @@ -21,7 +21,7 @@ export function NWCScreen() { }; return ( -
+

diff --git a/src/app/space/index.tsx b/src/app/space/index.tsx index d77bcc39..9a5a6533 100644 --- a/src/app/space/index.tsx +++ b/src/app/space/index.tsx @@ -65,9 +65,9 @@ export function SpaceScreen() { case WidgetKinds.nostrBand.trendingNotes: return ; case WidgetKinds.tmp.xfeed: - return ; - case WidgetKinds.tmp.xhashtag: return ; + case WidgetKinds.tmp.xhashtag: + return ; case WidgetKinds.tmp.list: return ; case WidgetKinds.other.learnNostr: diff --git a/src/app/splash.tsx b/src/app/splash.tsx index 30019d04..d984041a 100644 --- a/src/app/splash.tsx +++ b/src/app/splash.tsx @@ -12,7 +12,7 @@ import { useNostr } from '@utils/hooks/useNostr'; export function SplashScreen() { const { db } = useStorage(); const { ndk } = useNDK(); - const { fetchUserData, prefetchEvents } = useNostr(); + const { fetchUserData } = useNostr(); const [isLoading, setIsLoading] = useState(true); @@ -20,27 +20,8 @@ export function SplashScreen() { await invoke('close_splashscreen'); }; - const prefetch = async () => { - try { - const [user, events] = await Promise.all([fetchUserData(), prefetchEvents()]); - - if (user.status === 'ok' && events.status === 'ok') { - // update last login = current time - await db.updateLastLogin(); - // close splash screen and open main app screen - await invoke('close_splashscreen'); - } - } catch (e) { - setIsLoading(false); - await message(e, { - title: 'An unexpected error has occurred', - type: 'error', - }); - } - }; - useEffect(() => { - async function initial() { + async function syncUserData() { if (!db.account) { await invoke('close_splashscreen'); } else { @@ -50,31 +31,47 @@ export function SplashScreen() { if (step) { await invoke('close_splashscreen'); } else { - console.log('prefetching...'); - prefetch(); + try { + const userData = await fetchUserData(); + if (userData.status === 'ok') { + // update last login = current time + await db.updateLastLogin(); + // close splash screen and open main app screen + await invoke('close_splashscreen'); + } + } catch (e) { + setIsLoading(false); + await message(e, { + title: 'An unexpected error has occurred', + type: 'error', + }); + } } } } if (ndk) { - initial(); + syncUserData(); } }, [ndk, db.account]); return (
-
+
{isLoading ? ( -
+

- {!ndk ? 'Connecting to relay...' : 'Fetching events from the last login.'} + {!ndk ? 'Connecting to relay...' : 'Syncing user data...'}

-

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

+ {ndk ? ( +

+ Ensure all your data is sync across all Nostr clients, it may take a few + seconds, please don't close app. +

+ ) : null}
) : (
diff --git a/src/app/users/components/profile.tsx b/src/app/users/components/profile.tsx index c134e2ef..30944e1a 100644 --- a/src/app/users/components/profile.tsx +++ b/src/app/users/components/profile.tsx @@ -71,7 +71,7 @@ export function UserProfile({ pubkey }: { pubkey: string }) {
- {user.display_name || user.displayName || user.name || 'No name'} + {user.name || user.display_name || user.displayName || 'No name'}
{user.nip05 ? ( parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); - // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (event: NDKEvent) => { switch (event.kind) { case NDKKind.Text: return ( -
- - - -
+ + + ); case NDKKind.Repost: - return ( -
- -
- ); + return ; case 1063: return ( -
- - - -
+ + + ); case NDKKind.Article: return ( -
- - - -
+ + + ); default: return ( -
- - - -
+ + + ); } }, @@ -112,10 +68,7 @@ export function UserScreen() { ); return ( -
+
@@ -129,7 +82,7 @@ export function UserScreen() {
- ) : items.length === 0 ? ( + ) : data.length === 0 ? (
@@ -140,22 +93,10 @@ export function UserScreen() {
) : ( -
-
- {items.map((item) => renderItem(item.index))} -
-
+ + {data.map((item) => renderItem(item))} +
+ )}
diff --git a/src/index.css b/src/index.css index 1fa57e42..645cad4a 100644 --- a/src/index.css +++ b/src/index.css @@ -2,6 +2,10 @@ @tailwind components; @tailwind utilities; +.border { + background-clip: padding-box; +} + .scrollbar-hide::-webkit-scrollbar { display: none; } diff --git a/src/libs/ndk/instance.ts b/src/libs/ndk/instance.ts index 57211b13..4bfbaef9 100644 --- a/src/libs/ndk/instance.ts +++ b/src/libs/ndk/instance.ts @@ -1,50 +1,55 @@ -// 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 { message } from '@tauri-apps/api/dialog'; import { fetch } from '@tauri-apps/api/http'; +import { NostrFetcher } from 'nostr-fetch'; import { useEffect, useMemo, useState } from 'react'; import TauriAdapter from '@libs/ndk/cache'; import { useStorage } from '@libs/storage/provider'; export const NDKInstance = () => { + const { db } = useStorage(); + const [ndk, setNDK] = useState(undefined); const [relayUrls, setRelayUrls] = useState([]); - const { db } = useStorage(); - const cacheAdapter = useMemo(() => new TauriAdapter(), [ndk]); + const cacheAdapter = useMemo(() => new TauriAdapter(), []); + const fetcher = useMemo( + () => (ndk ? NostrFetcher.withCustomPool(ndkAdapter(ndk)) : null), + [ndk] + ); // TODO: fully support NIP-11 async function getExplicitRelays() { try { // get relays const relays = await db.getExplicitRelayUrls(); - const requests = relays.map((relay) => { + const onlineRelays = new Set(relays); + + for (const relay of relays) { const url = new URL(relay); - return fetch(`https://${url.hostname + url.pathname}`, { - method: 'GET', - timeout: 10, - headers: { - Accept: 'application/nostr+json', - }, - }); - }); + try { + const res = await fetch(`https://${url.hostname}`, { + method: 'GET', + timeout: { secs: 5, nanos: 0 }, + headers: { + Accept: 'application/nostr+json', + }, + }); - const responses = await Promise.all(requests); - const successes = responses.filter((res) => res.ok); - - const verifiedRelays: string[] = successes.map((res) => { - // TODO: support payment - // @ts-expect-error, not have type yet - if (!res.data.limitation?.payment_required) { - const url = new URL(res.url); - if (url.protocol === 'http:') return `ws://${url.hostname + url.pathname}`; - if (url.protocol === 'https:') return `wss://${url.hostname + url.pathname}`; + if (!res.ok) { + console.info(`${relay} is not working, skipping...`); + onlineRelays.delete(relay); + } + } catch { + console.warn(`${relay} is not working, skipping...`); + onlineRelays.delete(relay); } - }); + } - // return all validated relays - return verifiedRelays; + // return all online relays + return [...onlineRelays]; } catch (e) { console.error(e); } @@ -81,5 +86,6 @@ export const NDKInstance = () => { return { ndk, relayUrls, + fetcher, }; }; diff --git a/src/libs/ndk/provider.tsx b/src/libs/ndk/provider.tsx index 76e54034..44a5a04e 100644 --- a/src/libs/ndk/provider.tsx +++ b/src/libs/ndk/provider.tsx @@ -1,5 +1,6 @@ // source: https://github.com/nostr-dev-kit/ndk-react/ import NDK from '@nostr-dev-kit/ndk'; +import { NostrFetcher } from 'nostr-fetch'; import { PropsWithChildren, createContext, useContext } from 'react'; import { NDKInstance } from '@libs/ndk/instance'; @@ -7,21 +8,24 @@ import { NDKInstance } from '@libs/ndk/instance'; interface NDKContext { ndk: undefined | NDK; relayUrls: string[]; + fetcher: NostrFetcher; } const NDKContext = createContext({ ndk: undefined, relayUrls: [], + fetcher: undefined, }); const NDKProvider = ({ children }: PropsWithChildren) => { - const { ndk, relayUrls } = NDKInstance(); + const { ndk, relayUrls, fetcher } = NDKInstance(); return ( {children} diff --git a/src/libs/storage/instance.ts b/src/libs/storage/instance.ts index 6fa39fab..d68c1f9c 100644 --- a/src/libs/storage/instance.ts +++ b/src/libs/storage/instance.ts @@ -1,4 +1,4 @@ -import { NDKEvent } from '@nostr-dev-kit/ndk'; +import { NDKEvent, NDKUserProfile } from '@nostr-dev-kit/ndk'; import { BaseDirectory, removeFile } from '@tauri-apps/api/fs'; import { Platform } from '@tauri-apps/api/os'; import Database from 'tauri-plugin-sql-api'; @@ -6,19 +6,20 @@ import { Stronghold } from 'tauri-plugin-stronghold-api'; import { FULL_RELAYS } from '@stores/constants'; +import { toRawEvent } from '@utils/rawEvent'; import { Account, DBEvent, Relays, Widget } from '@utils/types'; export class LumeStorage { public db: Database; - public platform: Platform; public secureDB: Stronghold; - public account: Account | null = null; + public account: Account | null; + public platform: Platform | null; - constructor(sqlite: Database, platform: Platform, stronghold?: Stronghold) { + constructor(sqlite: Database, platform?: Platform, stronghold?: Stronghold) { this.db = sqlite; - this.platform = platform ?? undefined; this.secureDB = stronghold ?? undefined; this.account = null; + this.platform = platform ?? undefined; } private async getSecureClient(key?: string) { @@ -58,6 +59,13 @@ export class LumeStorage { return await removeFile('lume.stronghold', { dir: BaseDirectory.AppConfig }); } + public async checkAccount() { + const result: Array = await this.db.select( + 'SELECT * FROM accounts WHERE is_active = 1;' + ); + return result.length > 0; + } + public async getActiveAccount() { const results: Array = await this.db.select( 'SELECT * FROM accounts WHERE is_active = "1" ORDER BY id DESC LIMIT 1;' @@ -282,6 +290,38 @@ export class LumeStorage { return results.length < 1; } + public async createMetadata(event: NDKEvent) { + const rawEvent = toRawEvent(event); + + return await this.db.execute( + 'INSERT OR IGNORE INTO metadata (id, event, author, kind, created_at) VALUES ($1, $2, $3, $4, $5);', + [ + rawEvent.id, + JSON.stringify(rawEvent), + rawEvent.pubkey, + rawEvent.kind, + rawEvent.created_at, + ] + ); + } + + public async createProfile(pubkey: string, profile: NDKUserProfile) { + return await this.db.execute( + 'INSERT OR REPLACE INTO metadata (id, event, author, kind, created_at) VALUES ($1, $2, $3, $4, $5);', + [pubkey, JSON.stringify(profile), pubkey, 0, Math.round(Date.now() / 1000)] + ); + } + + public async getMetadataByPubkey(pubkey: string) { + const results: DBEvent[] = await this.db.select( + 'SELECT * FROM metadata WHERE author = $1 AND kind = "0" LIMIT 1;', + [pubkey] + ); + + if (results.length < 1) return null; + return JSON.parse(results[0].event as string) as NDKEvent; + } + public async getExplicitRelayUrls() { if (!this.account) return FULL_RELAYS; @@ -311,6 +351,10 @@ export class LumeStorage { } public async accountLogout() { + // delete all events + await this.db.execute('DELETE FROM events WHERE account_id = $1;', [this.account.id]); + + // update current account status await this.db.execute("UPDATE accounts SET is_active = '0' WHERE id = $1;", [ this.account.id, ]); diff --git a/src/libs/storage/provider.tsx b/src/libs/storage/provider.tsx index 73d02183..718a1a9f 100644 --- a/src/libs/storage/provider.tsx +++ b/src/libs/storage/provider.tsx @@ -1,6 +1,5 @@ import { message } from '@tauri-apps/api/dialog'; import { platform } from '@tauri-apps/api/os'; -import { appConfigDir } from '@tauri-apps/api/path'; import { PropsWithChildren, createContext, useContext, useEffect, useState } from 'react'; import Database from 'tauri-plugin-sql-api'; @@ -17,15 +16,12 @@ const StorageContext = createContext({ const StorageProvider = ({ children }: PropsWithChildren) => { const [db, setDB] = useState(undefined); - async function initLumeStorage() { + const initLumeStorage = async () => { try { - const dir = await appConfigDir(); const sqlite = await Database.load('sqlite:lume.db'); const platformName = await platform(); const lumeStorage = new LumeStorage(sqlite, platformName); - console.log('App config dir: ', dir); - if (!lumeStorage.account) await lumeStorage.getActiveAccount(); setDB(lumeStorage); } catch (e) { @@ -34,7 +30,7 @@ const StorageProvider = ({ children }: PropsWithChildren) => { type: 'error', }); } - } + }; useEffect(() => { if (!db) initLumeStorage(); diff --git a/src/shared/accounts/active.tsx b/src/shared/accounts/active.tsx index 7a610c54..0f0c8249 100644 --- a/src/shared/accounts/active.tsx +++ b/src/shared/accounts/active.tsx @@ -1,10 +1,12 @@ import { NDKFilter, NDKKind } from '@nostr-dev-kit/ndk'; import { useEffect } from 'react'; +import { Link } from 'react-router-dom'; import { useStorage } from '@libs/storage/provider'; -import { AccountMoreActions } from '@shared/accounts/more'; +import { SettingsIcon } from '@shared/icons'; import { Image } from '@shared/image'; +import { Logout } from '@shared/logout'; import { useActivities } from '@stores/activities'; @@ -23,34 +25,31 @@ export function ActiveAccount() { useEffect(() => { const filter: NDKFilter = { '#p': [db.account.pubkey], - kinds: [ - NDKKind.Text, - NDKKind.Contacts, - NDKKind.Repost, - NDKKind.Reaction, - NDKKind.Zap, - ], + kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Reaction, NDKKind.Zap], since: Math.floor(Date.now() / 1000), }; - sub(filter, async (event) => { - addActivity(event); + sub( + filter, + async (event) => { + console.log('new notify: ', event); + addActivity(event); - switch (event.kind) { - case NDKKind.Text: - return await sendNativeNotification('Mention'); - case NDKKind.Contacts: - return await sendNativeNotification("You've a new follower"); - case NDKKind.Repost: - return await sendNativeNotification('Repost'); - case NDKKind.Reaction: - return await sendNativeNotification('Reaction'); - case NDKKind.Zap: - return await sendNativeNotification('Zap'); - default: - break; - } - }); + switch (event.kind) { + case NDKKind.Text: + return await sendNativeNotification('Mention'); + case NDKKind.Repost: + return await sendNativeNotification('Repost'); + case NDKKind.Reaction: + return await sendNativeNotification('Reaction'); + case NDKKind.Zap: + return await sendNativeNotification('Zap'); + default: + break; + } + }, + false + ); }, []); if (status === 'loading') { @@ -63,23 +62,31 @@ export function ActiveAccount() { } return ( -
-
+
+ {db.account.npub} -
-

- {user?.name || user?.display_name} +

+

+ {user?.name || user?.display_name || user?.displayName}

- - {displayNpub(db.account.pubkey, 16)} + + {user?.nip05 || displayNpub(db.account.pubkey, 12)}
+ +
+ + + +
-
); } diff --git a/src/shared/composer/index.ts b/src/shared/composer/index.ts index e987947d..a04ac892 100644 --- a/src/shared/composer/index.ts +++ b/src/shared/composer/index.ts @@ -3,4 +3,6 @@ export * from './modal'; export * from './composer'; export * from './mention/item'; export * from './mention/popup'; +export * from './mention/suggestion'; +export * from './mention/inlineList'; export * from './mediaUploader'; diff --git a/src/shared/composer/mention/inlineList.tsx b/src/shared/composer/mention/inlineList.tsx new file mode 100644 index 00000000..18f34179 --- /dev/null +++ b/src/shared/composer/mention/inlineList.tsx @@ -0,0 +1,83 @@ +import { type SuggestionProps } from '@tiptap/suggestion'; +import { + ForwardedRef, + forwardRef, + useEffect, + useImperativeHandle, + useState, +} from 'react'; +import { twMerge } from 'tailwind-merge'; + +import { MentionItem } from '@shared/composer'; + +export const MentionInlineList = forwardRef( + (props: SuggestionProps, ref: ForwardedRef) => { + const [selectedIndex, setSelectedIndex] = useState(0); + + const selectItem = (index) => { + const item = props.items[index]; + + if (item) { + props.command({ id: item }); + } + }; + + const upHandler = () => { + setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length); + }; + + const downHandler = () => { + setSelectedIndex((selectedIndex + 1) % props.items.length); + }; + + const enterHandler = () => { + selectItem(selectedIndex); + }; + + useEffect(() => setSelectedIndex(0), [props.items]); + + useImperativeHandle(ref, () => ({ + onKeyDown: ({ event }) => { + if (event.key === 'ArrowUp') { + upHandler(); + return true; + } + + if (event.key === 'ArrowDown') { + downHandler(); + return true; + } + + if (event.key === 'Enter') { + enterHandler(); + return true; + } + + return false; + }, + })); + + return ( +
+ {props.items.length ? ( + props.items.map((item: string, index: number) => ( + + )) + ) : ( +
No result
+ )} +
+ ); + } +); + +MentionInlineList.displayName = 'MentionList'; diff --git a/src/shared/composer/mention/item.tsx b/src/shared/composer/mention/item.tsx index 2964d937..16e66594 100644 --- a/src/shared/composer/mention/item.tsx +++ b/src/shared/composer/mention/item.tsx @@ -3,12 +3,12 @@ import { Image } from '@shared/image'; import { useProfile } from '@utils/hooks/useProfile'; import { displayNpub } from '@utils/shortenKey'; -export function MentionItem({ pubkey }: { pubkey: string }) { - const { status, user } = useProfile(pubkey); +export function MentionItem({ pubkey, embed }: { pubkey: string; embed?: string }) { + const { status, user } = useProfile(pubkey, embed); if (status === 'loading') { return ( -
+
diff --git a/src/shared/composer/mention/suggestion.tsx b/src/shared/composer/mention/suggestion.tsx new file mode 100644 index 00000000..1d55ccb7 --- /dev/null +++ b/src/shared/composer/mention/suggestion.tsx @@ -0,0 +1,68 @@ +import { ReactRenderer } from '@tiptap/react'; +import tippy from 'tippy.js'; + +import { MentionInlineList } from '@shared/composer'; + +export const Suggestion = { + items: async ({ query }) => { + const users = []; + return users + .filter((item) => item.ident.toLowerCase().startsWith(query.toLowerCase())) + .slice(0, 5); + }, + + render: () => { + let component; + let popup; + + return { + onStart: (props) => { + component = new ReactRenderer(MentionInlineList, { + props, + editor: props.editor, + }); + + if (!props.clientRect) { + return; + } + + popup = tippy('body', { + getReferenceClientRect: props.clientRect, + appendTo: () => document.body, + content: component.element, + showOnCreate: true, + interactive: true, + trigger: 'manual', + placement: 'bottom-start', + }); + }, + + onUpdate(props) { + component.updateProps(props); + + if (!props.clientRect) { + return; + } + + popup[0].setProps({ + getReferenceClientRect: props.clientRect, + }); + }, + + onKeyDown(props) { + if (props.event.key === 'Escape') { + popup[0].hide(); + + return true; + } + + return component.ref?.onKeyDown(props); + }, + + onExit() { + popup[0].destroy(); + component.destroy(); + }, + }; + }, +}; diff --git a/src/shared/composer/modal.tsx b/src/shared/composer/modal.tsx index 0169d0be..a002c99a 100644 --- a/src/shared/composer/modal.tsx +++ b/src/shared/composer/modal.tsx @@ -28,12 +28,10 @@ export function ComposerModal() { diff --git a/src/shared/composer/user.tsx b/src/shared/composer/user.tsx index 772a8714..83c37597 100644 --- a/src/shared/composer/user.tsx +++ b/src/shared/composer/user.tsx @@ -14,7 +14,7 @@ export function ComposerUser({ pubkey }: { pubkey: string }) { className="h-10 w-10 shrink-0 rounded-lg" />
- {user?.name || user?.display_name || displayNpub(pubkey, 16)} + {user?.name || user?.display_name || user?.displayName || displayNpub(pubkey, 16)}
); diff --git a/src/shared/icons/dots.tsx b/src/shared/icons/dots.tsx new file mode 100644 index 00000000..2b49a257 --- /dev/null +++ b/src/shared/icons/dots.tsx @@ -0,0 +1,20 @@ +import { SVGProps } from 'react'; + +export function DotsPattern(props: JSX.IntrinsicAttributes & SVGProps) { + return ( + + + + + + + ); +} diff --git a/src/shared/icons/index.ts b/src/shared/icons/index.ts index 2c14749b..24e62684 100644 --- a/src/shared/icons/index.ts +++ b/src/shared/icons/index.ts @@ -64,3 +64,5 @@ export * from './follows'; export * from './alby'; export * from './stars'; export * from './nwc'; +export * from './timeline'; +export * from './dots'; diff --git a/src/shared/icons/timeline.tsx b/src/shared/icons/timeline.tsx new file mode 100644 index 00000000..52ff870e --- /dev/null +++ b/src/shared/icons/timeline.tsx @@ -0,0 +1,22 @@ +import { SVGProps } from 'react'; + +export function TimeLineIcon(props: JSX.IntrinsicAttributes & SVGProps) { + return ( + + + + ); +} diff --git a/src/shared/logout.tsx b/src/shared/logout.tsx index d5399bf4..ad0f5586 100644 --- a/src/shared/logout.tsx +++ b/src/shared/logout.tsx @@ -3,6 +3,8 @@ import { useNavigate } from 'react-router-dom'; import { useStorage } from '@libs/storage/provider'; +import { LogoutIcon } from '@shared/icons'; + import { useStronghold } from '@stores/stronghold'; export function Logout() { @@ -25,12 +27,12 @@ export function Logout() { - +
diff --git a/src/shared/navigation.tsx b/src/shared/navigation.tsx index a20ca992..321509dd 100644 --- a/src/shared/navigation.tsx +++ b/src/shared/navigation.tsx @@ -4,12 +4,10 @@ import { twMerge } from 'tailwind-merge'; import { ChatsList } from '@app/chats/components/list'; -import { useStorage } from '@libs/storage/provider'; - import { ActiveAccount } from '@shared/accounts/active'; import { ComposerModal } from '@shared/composer'; import { Frame } from '@shared/frame'; -import { BellIcon, NavArrowDownIcon, NwcIcon, SpaceIcon } from '@shared/icons'; +import { BellIcon, NavArrowDownIcon, NwcIcon, SpaceIcon, WorldIcon } from '@shared/icons'; import { useActivities } from '@stores/activities'; import { useSidebar } from '@stores/sidebar'; @@ -17,9 +15,8 @@ import { useSidebar } from '@stores/sidebar'; import { compactNumber } from '@utils/number'; export function Navigation() { - const { db } = useStorage(); + const totalNewActivities = useActivities((state) => state.totalNewActivities); - const [totalNewActivities] = useActivities((state) => [state.totalNewActivities]); const [chats, toggleChats] = useSidebar((state) => [state.chats, state.toggleChats]); const [integrations, toggleIntegrations] = useSidebar((state) => [ state.integrations, @@ -27,19 +24,27 @@ export function Navigation() { ]); return ( - - {db.platform === 'darwin' ? ( -
- ) : null} -
-
- + +
+ +
+
+
twMerge( - 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-2', + 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-3', isActive ? 'border-fuchsia-500 bg-white/5 text-white' : 'border-transparent text-white/70' @@ -49,14 +54,31 @@ export function Navigation() { - Space + Home + + + twMerge( + 'flex h-10 items-center gap-2.5 rounded-r-lg border-l-2 pl-4 pr-3', + isActive + ? 'border-fuchsia-500 bg-white/5 text-white' + : 'border-transparent text-white/70' + ) + } + > + + + + Browse twMerge( - 'flex h-10 items-center justify-between rounded-r-lg border-l-2 pl-4 pr-2', + 'flex h-10 items-center justify-between rounded-r-lg border-l-2 pl-4 pr-3', isActive ? 'border-fuchsia-500 bg-white/5 text-white' : 'border-transparent text-white/70' @@ -81,7 +103,7 @@ export function Navigation() {
-
+
diff --git a/src/shared/notes/actions/more.tsx b/src/shared/notes/actions/more.tsx index 2f2f05e3..d636c49e 100644 --- a/src/shared/notes/actions/more.tsx +++ b/src/shared/notes/actions/more.tsx @@ -30,9 +30,9 @@ export function MoreActions({ id, pubkey }: { id: string; pubkey: string }) { diff --git a/src/shared/notes/actions/reaction.tsx b/src/shared/notes/actions/reaction.tsx index 17ba08e7..9548e5af 100644 --- a/src/shared/notes/actions/reaction.tsx +++ b/src/shared/notes/actions/reaction.tsx @@ -62,12 +62,12 @@ export function NoteReaction({ id, pubkey }: { id: string; pubkey: string }) { diff --git a/src/shared/notes/actions/reply.tsx b/src/shared/notes/actions/reply.tsx index d5bf9c33..fb2df6dd 100644 --- a/src/shared/notes/actions/reply.tsx +++ b/src/shared/notes/actions/reply.tsx @@ -21,9 +21,9 @@ export function NoteReply({ diff --git a/src/shared/notes/actions/repost.tsx b/src/shared/notes/actions/repost.tsx index 7946588b..2fd29237 100644 --- a/src/shared/notes/actions/repost.tsx +++ b/src/shared/notes/actions/repost.tsx @@ -44,12 +44,12 @@ export function NoteRepost({ id, pubkey }: { id: string; pubkey: string }) { diff --git a/src/shared/notes/actions/zap.tsx b/src/shared/notes/actions/zap.tsx index dff857f4..c4c219b7 100644 --- a/src/shared/notes/actions/zap.tsx +++ b/src/shared/notes/actions/zap.tsx @@ -60,7 +60,7 @@ export function NoteZap({ id, pubkey }: { id: string; pubkey: string }) { if (send) { await sendNativeNotification( `You've tipped ${compactNumber.format(send.amount)} sats to ${ - user?.display_name || user?.name + user?.name || user?.display_name || user?.displayName }` ); @@ -94,9 +94,9 @@ export function NoteZap({ id, pubkey }: { id: string; pubkey: string }) { @@ -106,7 +106,7 @@ export function NoteZap({ id, pubkey }: { id: string; pubkey: string }) {
- Send tip to {user?.display_name || user?.name} + Send tip to {user?.name || user?.display_name || user?.displayName} diff --git a/src/shared/notes/child.tsx b/src/shared/notes/child.tsx index 64094616..2a6725be 100644 --- a/src/shared/notes/child.tsx +++ b/src/shared/notes/child.tsx @@ -56,8 +56,8 @@ export function ChildNote({ id, root }: { id: string; root?: string }) { Lume (System)
-
-
+
+
@@ -78,11 +78,11 @@ export function ChildNote({ id, root }: { id: string; root?: string }) { return ( <> -
-
+
+
-
-
+
+
{renderKind(data)} diff --git a/src/shared/notes/index.ts b/src/shared/notes/index.ts index 9c30f1f7..15002a58 100644 --- a/src/shared/notes/index.ts +++ b/src/shared/notes/index.ts @@ -22,5 +22,6 @@ export * from './child'; export * from './skeleton'; export * from './actions'; export * from './mentions/hashtag'; +export * from './mentions/boost'; export * from './stats'; export * from './wrapper'; diff --git a/src/shared/notes/kinds/article.tsx b/src/shared/notes/kinds/article.tsx index db181cd9..66bb0441 100644 --- a/src/shared/notes/kinds/article.tsx +++ b/src/shared/notes/kinds/article.tsx @@ -4,19 +4,19 @@ import { Link } from 'react-router-dom'; import { Image } from '@shared/image'; -export function ArticleNote({ event }: { event: NDKEvent }) { +export function ArticleNote(props: { event?: NDKEvent }) { const metadata = useMemo(() => { - const title = event.tags.find((tag) => tag[0] === 'title')?.[1]; - const image = event.tags.find((tag) => tag[0] === 'image')?.[1]; - const summary = event.tags.find((tag) => tag[0] === 'summary')?.[1]; + const title = props.event.tags.find((tag) => tag[0] === 'title')?.[1]; + const image = props.event.tags.find((tag) => tag[0] === 'image')?.[1]; + const summary = props.event.tags.find((tag) => tag[0] === 'summary')?.[1]; - let publishedAt: Date | string | number = event.tags.find( + let publishedAt: Date | string | number = props.event.tags.find( (tag) => tag[0] === 'published_at' )?.[1]; if (publishedAt) { publishedAt = new Date(parseInt(publishedAt)).toLocaleDateString('en-US'); } else { - publishedAt = new Date(event.created_at * 1000).toLocaleDateString('en-US'); + publishedAt = new Date(props.event.created_at * 1000).toLocaleDateString('en-US'); } return { @@ -25,15 +25,11 @@ export function ArticleNote({ event }: { event: NDKEvent }) { publishedAt, summary, }; - }, [event.id]); + }, [props.event.id]); return ( - -
+ +
{metadata.image && ( el[0] === 'url')[1]; +export function FileNote(props: { event?: NDKEvent }) { + const url = props.event.tags.find((el) => el[0] === 'url')[1]; const type = fileType(url); if (type === 'image') { @@ -15,7 +15,7 @@ export function FileNote({ event }: { event: NDKEvent }) {
{event.content}
diff --git a/src/shared/notes/kinds/repost.tsx b/src/shared/notes/kinds/repost.tsx index 63bf684d..fbeb7dab 100644 --- a/src/shared/notes/kinds/repost.tsx +++ b/src/shared/notes/kinds/repost.tsx @@ -3,6 +3,7 @@ import { useQuery } from '@tanstack/react-query'; import { nip19 } from 'nostr-tools'; import { useCallback } from 'react'; import { Link } from 'react-router-dom'; +import { twMerge } from 'tailwind-merge'; import { useNDK } from '@libs/ndk/provider'; @@ -17,7 +18,13 @@ import { } from '@shared/notes'; import { User } from '@shared/user'; -export function Repost({ event }: { event: NDKEvent }) { +export function Repost({ + event, + lighter = false, +}: { + event: NDKEvent; + lighter?: boolean; +}) { const embedEvent: null | NDKEvent = event.content.length > 0 ? JSON.parse(event.content) : null; @@ -55,12 +62,17 @@ export function Repost({ event }: { event: NDKEvent }) { if (embedEvent) { return (
-
+
-
-
+
+
{renderKind(embedEvent)} @@ -89,7 +101,12 @@ export function Repost({ event }: { event: NDKEvent }) { return (
-
+
@@ -122,12 +139,17 @@ export function Repost({ event }: { event: NDKEvent }) { return (
-
+
-
-
+
+
{renderKind(data)} diff --git a/src/shared/notes/kinds/text.tsx b/src/shared/notes/kinds/text.tsx index 6064f073..748e1693 100644 --- a/src/shared/notes/kinds/text.tsx +++ b/src/shared/notes/kinds/text.tsx @@ -3,6 +3,7 @@ import { Link } from 'react-router-dom'; import remarkGfm from 'remark-gfm'; import { + Boost, Hashtag, ImagePreview, LinkPreview, @@ -13,8 +14,8 @@ import { import { parser } from '@utils/parser'; -export function TextNote({ content }: { content: string }) { - const richContent = parser(content) ?? null; +export function TextNote(props: { content?: string }) { + const richContent = parser(props.content) ?? null; if (!richContent) { return ( @@ -26,7 +27,7 @@ export function TextNote({ content }: { content: string }) { unwrapDisallowed={true} linkTarget={'_blank'} > - {content} + {props.content}
); @@ -56,6 +57,9 @@ export function TextNote({ content }: { content: string }) { if (key.startsWith('tag')) { return ; } + if (key.startsWith('boost')) { + return ; + } }, }} disallowedElements={['h1', 'h2', 'h3', 'h4', 'h5', 'h6']} diff --git a/src/shared/notes/kinds/unknown.tsx b/src/shared/notes/kinds/unknown.tsx index 243e244d..0be00b35 100644 --- a/src/shared/notes/kinds/unknown.tsx +++ b/src/shared/notes/kinds/unknown.tsx @@ -1,18 +1,18 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; -export function UnknownNote({ event }: { event: NDKEvent }) { +export function UnknownNote(props: { event?: NDKEvent }) { return (
- Unknown kind: {event.kind} + Unknown kind: {props.event.kind}

Lume isn't fully support this kind

-

{event.content.toString()}

+

{props.event.content.toString()}

); diff --git a/src/shared/notes/mentions/boost.tsx b/src/shared/notes/mentions/boost.tsx new file mode 100644 index 00000000..12820306 --- /dev/null +++ b/src/shared/notes/mentions/boost.tsx @@ -0,0 +1,5 @@ +export function Boost({ boost }: { boost: string }) { + return ( + {boost} + ); +} diff --git a/src/shared/notes/mentions/user.tsx b/src/shared/notes/mentions/user.tsx index 028b35c3..2bf3e6ed 100644 --- a/src/shared/notes/mentions/user.tsx +++ b/src/shared/notes/mentions/user.tsx @@ -1,11 +1,12 @@ +import { memo } from 'react'; + import { useStorage } from '@libs/storage/provider'; import { WidgetKinds, useWidgets } from '@stores/widgets'; import { useProfile } from '@utils/hooks/useProfile'; -import { displayNpub } from '@utils/shortenKey'; -export function MentionUser({ pubkey }: { pubkey: string }) { +export const MentionUser = memo(function MentionUser({ pubkey }: { pubkey: string }) { const { db } = useStorage(); const { user } = useProfile(pubkey); @@ -18,20 +19,25 @@ export function MentionUser({ pubkey }: { pubkey: string }) { onClick={() => setWidget(db, { kind: WidgetKinds.local.user, - title: user?.name || user?.display_name, + title: user?.name || user?.display_name || user?.displayName, content: pubkey, }) } onKeyDown={() => setWidget(db, { kind: WidgetKinds.local.user, - title: user?.name || user?.display_name, + title: user?.name || user?.display_name || user?.displayName, content: pubkey, }) } className="break-words text-fuchsia-400 hover:text-fuchsia-500" > - {user?.name || user?.display_name || user?.username || displayNpub(pubkey, 16)} + {'@' + + (user?.name || + user?.display_name || + user?.displayName || + user?.username || + 'unknown')} ); -} +}); diff --git a/src/shared/notes/preview/video.tsx b/src/shared/notes/preview/video.tsx index c161fd74..183fa407 100644 --- a/src/shared/notes/preview/video.tsx +++ b/src/shared/notes/preview/video.tsx @@ -16,7 +16,7 @@ export function VideoPreview({ urls }: { urls: string[] }) { {url} } /> diff --git a/src/shared/notes/replies/sub.tsx b/src/shared/notes/replies/sub.tsx index 004aa474..e98b88f3 100644 --- a/src/shared/notes/replies/sub.tsx +++ b/src/shared/notes/replies/sub.tsx @@ -10,7 +10,7 @@ export function SubReply({ event }: { event: NDKEvent }) {
- +
diff --git a/src/shared/notes/wrapper.tsx b/src/shared/notes/wrapper.tsx index 4fc8b8c2..5fb5b38f 100644 --- a/src/shared/notes/wrapper.tsx +++ b/src/shared/notes/wrapper.tsx @@ -1,5 +1,6 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; -import { ReactNode } from 'react'; +import { ReactElement, cloneElement } from 'react'; +import { twMerge } from 'tailwind-merge'; import { ChildNote, NoteActions } from '@shared/notes'; import { User } from '@shared/user'; @@ -9,24 +10,34 @@ export function NoteWrapper({ children, root, reply, + lighter = false, }: { event: NDKEvent; - children: ReactNode; + children: ReactElement; repost?: boolean; root?: string; reply?: string; + lighter?: boolean; }) { return (
-
+
{root && }
{reply && }
-
-
+
+
- {children} + {cloneElement( + children, + event.kind === 1 ? { content: event.content } : { event: event } + )}
diff --git a/src/shared/user.tsx b/src/shared/user.tsx index 7bfe00a4..2783e457 100644 --- a/src/shared/user.tsx +++ b/src/shared/user.tsx @@ -1,10 +1,10 @@ -import * as Popover from '@radix-ui/react-popover'; +import * as HoverCard from '@radix-ui/react-hover-card'; import { memo } from 'react'; import ReactMarkdown from 'react-markdown'; import { Link } from 'react-router-dom'; import remarkGfm from 'remark-gfm'; -import { WorldIcon } from '@shared/icons'; +import { RepostIcon, WorldIcon } from '@shared/icons'; import { Image } from '@shared/image'; import { NIP05 } from '@shared/nip05'; @@ -20,13 +20,27 @@ export const User = memo(function User({ }: { pubkey: string; time?: number; - variant?: 'default' | 'simple' | 'mention' | 'repost' | 'chat' | 'large' | 'thread'; + variant?: + | 'default' + | 'simple' + | 'mention' + | 'repost' + | 'chat' + | 'large' + | 'thread' + | 'avatar'; embedProfile?: string; }) { const { status, user } = useProfile(pubkey, embedProfile); const createdAt = time ? formatCreatedAt(time, variant === 'chat') : 0; if (status === 'loading') { + if (variant === 'avatar') { + return ( +
+ ); + } + if (variant === 'mention') { return (
@@ -38,7 +52,7 @@ export const User = memo(function User({ return (
-
+
); @@ -56,7 +70,10 @@ export const User = memo(function User({
- {user?.display_name || user?.name || displayNpub(pubkey, 16)} + {user?.name || + user?.display_name || + user?.displayName || + displayNpub(pubkey, 16)}
· {createdAt} @@ -76,7 +93,7 @@ export const User = memo(function User({

- {user?.name || user?.display_name} + {user?.name || user?.display_name || user?.displayName}

-

{user.website}

+

{user?.website}

) : null}
@@ -113,11 +130,11 @@ export const User = memo(function User({ alt={pubkey} className="h-12 w-12 shrink-0 rounded-lg object-cover" /> -
+

- {user?.name || user?.display_name} + {user?.name || user?.display_name || user?.displayName}

-

+

{user?.nip05 || user?.username || displayNpub(pubkey, 16)}

@@ -125,26 +142,39 @@ export const User = memo(function User({ ); } + if (variant === 'avatar') { + return ( + {pubkey} + ); + } + if (variant === 'repost') { return ( - <> -
+
+
+ +
+
{pubkey}
-
- {user?.display_name || user?.name || displayNpub(pubkey, 16)} +
+ {user?.name || + user?.display_name || + user?.displayName || + displayNpub(pubkey, 16)}
- reposted - · - {createdAt} + reposted
-
- +
); } @@ -154,11 +184,11 @@ export const User = memo(function User({ {pubkey}
- {user?.display_name || user?.name} + {user?.name || user?.display_name || user?.displayName}
{createdAt} @@ -171,48 +201,54 @@ export const User = memo(function User({ } return ( - +
- + - +
- {user?.display_name || user?.name || displayNpub(pubkey, 16)} + {user?.name || + user?.display_name || + user?.displayName || + displayNpub(pubkey, 16)}
· {createdAt}
- - +
{pubkey}
- {user?.display_name || user?.name || user?.username} + {user?.name || + user?.display_name || + user?.displayName || + user?.username}
- {user.nip05 ? ( + {user?.nip05 ? ( ) : ( @@ -242,8 +278,8 @@ export const User = memo(function User({ Message
- - - + + + ); }); diff --git a/src/shared/widgets/eventLoader.tsx b/src/shared/widgets/eventLoader.tsx new file mode 100644 index 00000000..d2bfcb44 --- /dev/null +++ b/src/shared/widgets/eventLoader.tsx @@ -0,0 +1,74 @@ +import { useQueryClient } from '@tanstack/react-query'; +import { useEffect, useState } from 'react'; + +import { useStorage } from '@libs/storage/provider'; + +import { useStronghold } from '@stores/stronghold'; + +import { useNostr } from '@utils/hooks/useNostr'; + +export function EventLoader({ firstTime }: { firstTime: boolean }) { + const { db } = useStorage(); + const { getAllEventsSinceLastLogin } = useNostr(); + + const setIsFetched = useStronghold((state) => state.setIsFetched); + const queryClient = useQueryClient(); + + const [progress, setProgress] = useState(0); + + useEffect(() => { + async function getEvents() { + const events = await getAllEventsSinceLastLogin(); + const promises = await Promise.all( + events.data.map(async (event) => await db.createEvent(event)) + ); + + if (promises) { + setProgress(100); + setIsFetched(); + // invalidate queries + queryClient.invalidateQueries(['local-network-widget']); + } + } + + // only start download if progress === 0 + if (progress === 0) getEvents(); + + // auto increase progress after 2 secs + setInterval(() => setProgress((prev) => (prev += 5)), 2000); + }, []); + + return ( +
+
+
+ {firstTime ? ( +
+ 👋 +

+ Hello, this is the first time you're using Lume +

+

+ Lume is downloading all events since the last 24 hours. It will auto + refresh when it done, please be patient +

+
+ ) : ( +
+

+ Downloading all events from your last login... +

+
+ )} +
+
+
+
+
+
+ ); +} diff --git a/src/shared/widgets/global/articles.tsx b/src/shared/widgets/global/articles.tsx index c12f530e..a303e818 100644 --- a/src/shared/widgets/global/articles.tsx +++ b/src/shared/widgets/global/articles.tsx @@ -1,12 +1,13 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useRef } from 'react'; +import { useCallback } from 'react'; +import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; import { ArticleNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { Widget } from '@utils/types'; @@ -24,71 +25,49 @@ export function GlobalArticlesWidget({ params }: { params: Widget }) { { refetchOnWindowFocus: false } ); - const parentRef = useRef(null); - const virtualizer = useVirtualizer({ - count: data ? data.length : 0, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); - // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (event: NDKEvent) => { return ( -
- - - -
+ + + ); }, [data] ); return ( -
+ -
+
{status === 'loading' ? (
- ) : items.length === 0 ? ( -
-
-
-

- There have been no new articles in the last 24 hours. + ) : data.length === 0 ? ( +

+
+ empty feeds +
+

+ Your newsfeed is empty +

+

+ Connect more people to explore more content

) : ( -
-
- {items.map((item) => renderItem(item.index))} -
-
+ + {data.map((item) => renderItem(item))} +
+ )}
-
+ ); } diff --git a/src/shared/widgets/global/files.tsx b/src/shared/widgets/global/files.tsx index d82857b7..f6ce8c91 100644 --- a/src/shared/widgets/global/files.tsx +++ b/src/shared/widgets/global/files.tsx @@ -1,12 +1,13 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useRef } from 'react'; +import { useCallback } from 'react'; +import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; import { FileNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { Widget } from '@utils/types'; @@ -25,71 +26,49 @@ export function GlobalFilesWidget({ params }: { params: Widget }) { { refetchOnWindowFocus: false } ); - const parentRef = useRef(null); - const virtualizer = useVirtualizer({ - count: data ? data.length : 0, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); - // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (event: NDKEvent) => { return ( -
- - - -
+ + + ); }, [data] ); return ( -
+ -
+
{status === 'loading' ? (
- ) : items.length === 0 ? ( -
-
-
-

- There have been no new files in the last 24 hours. + ) : data.length === 0 ? ( +

+
+ empty feeds +
+

+ Your newsfeed is empty +

+

+ Connect more people to explore more content

) : ( -
-
- {items.map((item) => renderItem(item.index))} -
-
+ + {data.map((item) => renderItem(item))} +
+ )}
-
+ ); } diff --git a/src/shared/widgets/global/hashtag.tsx b/src/shared/widgets/global/hashtag.tsx index 7833c377..60e828de 100644 --- a/src/shared/widgets/global/hashtag.tsx +++ b/src/shared/widgets/global/hashtag.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useRef } from 'react'; +import { useCallback } from 'react'; +import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; @@ -15,6 +15,7 @@ import { UnknownNote, } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { nHoursAgo } from '@utils/date'; import { Widget } from '@utils/types'; @@ -34,79 +35,35 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) { { refetchOnWindowFocus: false } ); - const parentRef = useRef(null); - const virtualizer = useVirtualizer({ - count: data ? data.length : 0, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); - // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (event: NDKEvent) => { switch (event.kind) { case NDKKind.Text: return ( -
- - - -
+ + + ); case NDKKind.Repost: - return ( -
- -
- ); + return ; case 1063: return ( -
- - - -
+ + + ); case NDKKind.Article: return ( -
- - - -
+ + + ); default: return ( -
- - - -
+ + + ); } }, @@ -114,44 +71,37 @@ export function GlobalHashtagWidget({ params }: { params: Widget }) { ); return ( -
+ -
+
{status === 'loading' ? (
- ) : items.length === 0 ? ( -
-
-
-

- There have been no new posts with this hashtag in the last 24 hours. + ) : data.length === 0 ? ( +

+
+ empty feeds +
+

+ Your newsfeed is empty +

+

+ Connect more people to explore more content

) : ( -
-
- {items.map((item) => renderItem(item.index))} -
-
+ + {data.map((item) => renderItem(item))} + +
+ )}
-
+ ); } diff --git a/src/shared/widgets/index.ts b/src/shared/widgets/index.ts index 7b29f9d0..3dd176af 100644 --- a/src/shared/widgets/index.ts +++ b/src/shared/widgets/index.ts @@ -1,3 +1,4 @@ +export * from './wrapper'; export * from './local/feeds'; export * from './local/network'; export * from './local/user'; @@ -13,3 +14,4 @@ export * from './nostrBand/trendingAccounts'; export * from './tmp/feeds'; export * from './tmp/hashtag'; export * from './other/learnNostr'; +export * from './eventLoader'; diff --git a/src/shared/widgets/local/articles.tsx b/src/shared/widgets/local/articles.tsx index 11fecff0..035112bc 100644 --- a/src/shared/widgets/local/articles.tsx +++ b/src/shared/widgets/local/articles.tsx @@ -1,13 +1,14 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useMemo, useRef } from 'react'; +import { useCallback, useMemo } from 'react'; +import { VList } from 'virtua'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { FileNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -26,105 +27,77 @@ export function LocalArticlesWidget({ params }: { params: Widget }) { () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); - const parentRef = useRef(); - const virtualizer = useVirtualizer({ - count: hasNextPage ? dbEvents.length : dbEvents.length, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (dbEvent: DBEvent) => { + const event: NDKEvent = JSON.parse(dbEvent.event as string); return ( -
- - - -
+ + + ); }, [data] ); return ( -
+ -
+
{status === 'loading' ? (
- ) : items.length === 0 ? ( -
-
-
-

- There have been no new posts. + ) : dbEvents.length === 0 ? ( +

+
+ empty feeds +
+

+ Your newsfeed is empty +

+

+ Connect more people to explore more content

) : ( -
-
- {items.map((item) => renderItem(item.index))} + + {dbEvents.map((item) => renderItem(item))} +
+ {dbEvents.length > 0 ? ( + + ) : null}
-
+
+ )} - {isFetchingNextPage && ( -
-
- -
-
- )} -
- -
-
+ ); } diff --git a/src/shared/widgets/local/feeds.tsx b/src/shared/widgets/local/feeds.tsx index ac1dc890..5f0afa2e 100644 --- a/src/shared/widgets/local/feeds.tsx +++ b/src/shared/widgets/local/feeds.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useMemo, useRef } from 'react'; +import { useCallback, useMemo } from 'react'; +import { VList } from 'virtua'; import { useStorage } from '@libs/storage/provider'; @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -35,80 +36,42 @@ export function LocalFeedsWidget({ params }: { params: Widget }) { () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); - const parentRef = useRef(); - const virtualizer = useVirtualizer({ - count: hasNextPage ? dbEvents.length : dbEvents.length, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const dbEvent: DBEvent = dbEvents[index]; - if (!dbEvent) return; - + (dbEvent: DBEvent) => { const event: NDKEvent = JSON.parse(dbEvent.event as string); switch (event.kind) { case NDKKind.Text: return ( -
- - - -
+ + ); case NDKKind.Repost: - return ( -
- -
- ); + return ; case 1063: return ( -
- - - -
+ + + ); case NDKKind.Article: return ( -
- - - -
+ + + ); default: return ( -
- - - -
+ + + ); } }, @@ -116,78 +79,62 @@ export function LocalFeedsWidget({ params }: { params: Widget }) { ); return ( -
+ -
+
{status === 'loading' ? (
- ) : items.length === 0 ? ( -
-
-
-

- There have been no new posts. + ) : dbEvents.length === 0 ? ( +

+
+ empty feeds +
+

+ Your newsfeed is empty +

+

+ Connect more people to explore more content

) : ( -
-
- {items.map((item) => renderItem(item.index))} + + {dbEvents.map((item) => renderItem(item))} +
+ {dbEvents.length > 0 ? ( + + ) : null}
-
+
+ )} - {isFetchingNextPage && ( -
-
- -
-
- )} -
- -
-
+ ); } diff --git a/src/shared/widgets/local/files.tsx b/src/shared/widgets/local/files.tsx index ec5f3ced..3282e753 100644 --- a/src/shared/widgets/local/files.tsx +++ b/src/shared/widgets/local/files.tsx @@ -1,13 +1,14 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useMemo, useRef } from 'react'; +import { useCallback, useMemo } from 'react'; +import { VList } from 'virtua'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, LoaderIcon } from '@shared/icons'; import { FileNote, NoteSkeleton, NoteWrapper } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -26,105 +27,77 @@ export function LocalFilesWidget({ params }: { params: Widget }) { () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); - const parentRef = useRef(); - const virtualizer = useVirtualizer({ - count: hasNextPage ? dbEvents.length : dbEvents.length, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (dbEvent: DBEvent) => { + const event: NDKEvent = JSON.parse(dbEvent.event as string); return ( -
- - - -
+ + + ); }, [data] ); return ( -
+ -
+
{status === 'loading' ? (
- ) : items.length === 0 ? ( -
-
-
-

- There have been no new posts. + ) : dbEvents.length === 0 ? ( +

+
+ empty feeds +
+

+ Your newsfeed is empty +

+

+ Connect more people to explore more content

) : ( -
-
- {items.map((item) => renderItem(item.index))} + + {dbEvents.map((item) => renderItem(item))} +
+ {dbEvents.length > 0 ? ( + + ) : null}
-
+
+ )} - {isFetchingNextPage && ( -
-
- -
-
- )} -
- -
-
+ ); } diff --git a/src/shared/widgets/local/follows.tsx b/src/shared/widgets/local/follows.tsx index 73810d4e..4f56762e 100644 --- a/src/shared/widgets/local/follows.tsx +++ b/src/shared/widgets/local/follows.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useMemo, useRef } from 'react'; +import { useCallback, useMemo } from 'react'; +import { VList } from 'virtua'; import { useStorage } from '@libs/storage/provider'; @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { DBEvent, Widget } from '@utils/types'; @@ -34,80 +35,42 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); - const parentRef = useRef(); - const virtualizer = useVirtualizer({ - count: hasNextPage ? dbEvents.length : dbEvents.length, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const dbEvent: DBEvent = dbEvents[index]; - if (!dbEvent) return; - + (dbEvent: DBEvent) => { const event: NDKEvent = JSON.parse(dbEvent.event as string); switch (event.kind) { case NDKKind.Text: return ( -
- - - -
+ + ); case NDKKind.Repost: - return ( -
- -
- ); + return ; case 1063: return ( -
- - - -
+ + + ); case NDKKind.Article: return ( -
- - - -
+ + + ); default: return ( -
- - - -
+ + + ); } }, @@ -115,9 +78,9 @@ export function LocalFollowsWidget({ params }: { params: Widget }) { ); return ( -
+ -
+
{status === 'loading' ? (
@@ -139,60 +102,38 @@ export function LocalFollowsWidget({ params }: { params: Widget }) {
) : ( -
-
- {items.map((item) => renderItem(item.index))} + + {dbEvents.map((item) => renderItem(item))} +
+ {dbEvents.length > 0 ? ( + + ) : null}
-
+
+ )} - {isFetchingNextPage && ( -
-
- -
-
- )} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
+ ); } diff --git a/src/shared/widgets/local/network.tsx b/src/shared/widgets/local/network.tsx index 68aa833e..b26fb12a 100644 --- a/src/shared/widgets/local/network.tsx +++ b/src/shared/widgets/local/network.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKFilter, NDKKind } from '@nostr-dev-kit/ndk'; import { useInfiniteQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useEffect, useMemo, useRef } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; +import { VList } from 'virtua'; import { useStorage } from '@libs/storage/provider'; @@ -16,6 +16,9 @@ import { } from '@shared/notes'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { EventLoader, WidgetWrapper } from '@shared/widgets'; + +import { useStronghold } from '@stores/stronghold'; import { useNostr } from '@utils/hooks/useNostr'; import { toRawEvent } from '@utils/rawEvent'; @@ -33,84 +36,47 @@ export function LocalNetworkWidget() { getNextPageParam: (lastPage) => lastPage.nextCursor, }); + const isFetched = useStronghold((state) => state.isFetched); const dbEvents = useMemo( () => (data ? data.pages.flatMap((d: { data: DBEvent[] }) => d.data) : []), [data] ); - const parentRef = useRef(); - const virtualizer = useVirtualizer({ - count: hasNextPage ? dbEvents.length : dbEvents.length, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const dbEvent: DBEvent = dbEvents[index]; - if (!dbEvent) return; - + (dbEvent: DBEvent) => { const event: NDKEvent = JSON.parse(dbEvent.event as string); switch (event.kind) { case NDKKind.Text: return ( -
- - - -
+ + ); case NDKKind.Repost: - return ( -
- -
- ); + return ; case 1063: return ( -
- - - -
+ + + ); case NDKKind.Article: return ( -
- - - -
+ + + ); default: return ( -
- - - -
+ + + ); } }, @@ -120,28 +86,24 @@ export function LocalNetworkWidget() { // subscribe for new event // sub will be managed by lru-cache useEffect(() => { - if (db.account && db.account.network) { + if (db.account && db.account.network && dbEvents.length > 0) { const filter: NDKFilter = { kinds: [NDKKind.Text, NDKKind.Repost], authors: db.account.network, - since: db.account.last_login_at ?? Math.floor(Date.now() / 1000), + since: Math.floor(Date.now() / 1000), }; - sub( - filter, - async (event) => { - const rawEvent = toRawEvent(event); - await db.createEvent(rawEvent); - }, - false // don't close sub on eose - ); + sub(filter, async (event) => { + const rawEvent = toRawEvent(event); + await db.createEvent(rawEvent); + }); } - }, []); + }, [data]); return ( -
- -
+ + +
{status === 'loading' ? (
@@ -149,74 +111,41 @@ export function LocalNetworkWidget() {
) : dbEvents.length === 0 ? ( -
-
- empty feeds -
-

- Your newsfeed is empty -

-

- Connect more people to explore more content -

-
-
-
+ ) : ( -
-
- {items.map((item) => renderItem(item.index))} + + {!isFetched ? : null} + {dbEvents.map((item) => renderItem(item))} +
+ {dbEvents.length > 0 ? ( + + ) : null}
-
+
+ )} - {isFetchingNextPage && ( -
-
- -
-
- )} -
- {dbEvents.length > 0 ? ( - - ) : null} -
-
+ ); } diff --git a/src/shared/widgets/local/thread.tsx b/src/shared/widgets/local/thread.tsx index 1d754610..a6c959d7 100644 --- a/src/shared/widgets/local/thread.tsx +++ b/src/shared/widgets/local/thread.tsx @@ -16,6 +16,7 @@ import { RepliesList } from '@shared/notes/replies/list'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; import { User } from '@shared/user'; +import { WidgetWrapper } from '@shared/widgets'; import { useEvent } from '@utils/hooks/useEvent'; import { Widget } from '@utils/types'; @@ -41,9 +42,9 @@ export function LocalThreadWidget({ params }: { params: Widget }) { ); return ( -
+ -
+
{status === 'loading' ? (
@@ -69,6 +70,6 @@ export function LocalThreadWidget({ params }: { params: Widget }) {
-
+ ); } diff --git a/src/shared/widgets/local/user.tsx b/src/shared/widgets/local/user.tsx index 4266d76c..682339be 100644 --- a/src/shared/widgets/local/user.tsx +++ b/src/shared/widgets/local/user.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useCallback, useRef } from 'react'; +import { useCallback } from 'react'; +import { VList } from 'virtua'; import { useNDK } from '@libs/ndk/provider'; @@ -16,6 +16,7 @@ import { } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; import { UserProfile } from '@shared/userProfile'; +import { WidgetWrapper } from '@shared/widgets'; import { nHoursAgo } from '@utils/date'; import { Widget } from '@utils/types'; @@ -40,79 +41,35 @@ export function LocalUserWidget({ params }: { params: Widget }) { } ); - const parentRef = useRef(null); - const virtualizer = useVirtualizer({ - count: data ? data.length : 0, - getScrollElement: () => parentRef.current, - estimateSize: () => 650, - overscan: 4, - }); - const items = virtualizer.getVirtualItems(); - // render event match event kind const renderItem = useCallback( - (index: string | number) => { - const event: NDKEvent = data[index]; - if (!event) return; - + (event: NDKEvent) => { switch (event.kind) { case NDKKind.Text: return ( -
- - - -
+ + + ); case NDKKind.Repost: - return ( -
- -
- ); + return ; case 1063: return ( -
- - - -
+ + + ); case NDKKind.Article: return ( -
- - - -
+ + + ); default: return ( -
- - - -
+ + + ); } }, @@ -120,9 +77,9 @@ export function LocalUserWidget({ params }: { params: Widget }) { ); return ( -
+ -
+
@@ -135,7 +92,7 @@ export function LocalUserWidget({ params }: { params: Widget }) {
- ) : items.length === 0 ? ( + ) : data.length === 0 ? (
@@ -146,26 +103,14 @@ export function LocalUserWidget({ params }: { params: Widget }) {
) : ( -
-
- {items.map((item) => renderItem(item.index))} -
-
+ + {data.map((item) => renderItem(item))} +
+ )}
-
+
); } diff --git a/src/shared/widgets/nostrBand/trendingAccounts.tsx b/src/shared/widgets/nostrBand/trendingAccounts.tsx index c8e3286d..6dfa8358 100644 --- a/src/shared/widgets/nostrBand/trendingAccounts.tsx +++ b/src/shared/widgets/nostrBand/trendingAccounts.tsx @@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { NoteSkeleton } from '@shared/notes/skeleton'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { NostrBandUserProfile, type Profile } from '@shared/widgets/nostrBandUserProfile'; import { Widget } from '@utils/types'; @@ -31,7 +32,7 @@ export function TrendingAccountsWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -56,6 +57,6 @@ export function TrendingAccountsWidget({ params }: { params: Widget }) {
)}
-
+ ); } diff --git a/src/shared/widgets/nostrBand/trendingNotes.tsx b/src/shared/widgets/nostrBand/trendingNotes.tsx index 321b2b88..5056e9e9 100644 --- a/src/shared/widgets/nostrBand/trendingNotes.tsx +++ b/src/shared/widgets/nostrBand/trendingNotes.tsx @@ -3,6 +3,7 @@ import { useQuery } from '@tanstack/react-query'; import { NoteSkeleton, NoteWrapper, TextNote } from '@shared/notes'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { Widget } from '@utils/types'; @@ -31,7 +32,7 @@ export function TrendingNotesWidget({ params }: { params: Widget }) { ); return ( -
+
{status === 'loading' ? ( @@ -58,6 +59,6 @@ export function TrendingNotesWidget({ params }: { params: Widget }) {
)}
-
+
); } diff --git a/src/shared/widgets/other/learnNostr.tsx b/src/shared/widgets/other/learnNostr.tsx index aee20b27..b48de3d6 100644 --- a/src/shared/widgets/other/learnNostr.tsx +++ b/src/shared/widgets/other/learnNostr.tsx @@ -2,6 +2,7 @@ import { useNavigate } from 'react-router-dom'; import { ArrowRightIcon } from '@shared/icons'; import { TitleBar } from '@shared/titleBar'; +import { WidgetWrapper } from '@shared/widgets'; import { useResources } from '@stores/resources'; @@ -21,7 +22,7 @@ export function LearnNostrWidget({ params }: { params: Widget }) { }; return ( -
+
{resources.map((resource, index) => ( @@ -58,6 +59,6 @@ export function LearnNostrWidget({ params }: { params: Widget }) {
))}
-
+ ); } diff --git a/src/shared/widgets/wrapper.tsx b/src/shared/widgets/wrapper.tsx new file mode 100644 index 00000000..0a3ce978 --- /dev/null +++ b/src/shared/widgets/wrapper.tsx @@ -0,0 +1,32 @@ +import { Resizable } from 're-resizable'; +import { ReactNode, useState } from 'react'; +import { twMerge } from 'tailwind-merge'; + +export function WidgetWrapper({ + children, + className, +}: { + children: ReactNode; + className?: string; +}) { + const [width, setWidth] = useState(420); + + return ( + e.preventDefault()} + onResizeStop={(_e, _direction, _ref, d) => { + setWidth((prevWidth) => prevWidth + d.width); + }} + minWidth={420} + minHeight={'100vh'} + className={twMerge( + 'relative shrink-0 grow-0 bg-white/10 backdrop-blur-xl', + className + )} + enable={{ right: true }} + > + {children} + + ); +} diff --git a/src/stores/browse.ts b/src/stores/browse.ts new file mode 100644 index 00000000..197e87b9 --- /dev/null +++ b/src/stores/browse.ts @@ -0,0 +1,22 @@ +import { create } from 'zustand'; +import { createJSONStorage, persist } from 'zustand/middleware'; + +interface BrowseState { + data: Array<{ title: string; data: string[] }>; + setData: ({ title, data }: { title: string; data: string[] }) => void; +} + +export const useBrowse = create()( + persist( + (set) => ({ + data: [], + setData: (data) => { + set((state) => ({ data: [...state.data, data] })); + }, + }), + { + name: 'browseUsers', + storage: createJSONStorage(() => localStorage), + } + ) +); diff --git a/src/stores/sidebar.ts b/src/stores/sidebar.ts index 0bfeb0b0..58ed7056 100644 --- a/src/stores/sidebar.ts +++ b/src/stores/sidebar.ts @@ -14,7 +14,7 @@ export const useSidebar = create()( persist( (set) => ({ feeds: true, - chats: true, + chats: false, integrations: true, toggleFeeds: () => set((state) => ({ feeds: !state.feeds })), toggleChats: () => set((state) => ({ chats: !state.chats })), diff --git a/src/stores/stronghold.ts b/src/stores/stronghold.ts index b319c0ec..c1454051 100644 --- a/src/stores/stronghold.ts +++ b/src/stores/stronghold.ts @@ -4,9 +4,11 @@ import { createJSONStorage, persist } from 'zustand/middleware'; interface StrongholdState { privkey: null | string; walletConnectURL: null | string; + isFetched: null | boolean; setPrivkey: (privkey: string) => void; setWalletConnectURL: (uri: string) => void; clearPrivkey: () => void; + setIsFetched: () => void; } export const useStronghold = create()( @@ -14,6 +16,7 @@ export const useStronghold = create()( (set) => ({ privkey: null, walletConnectURL: null, + isFetched: false, setPrivkey: (privkey: string) => { set({ privkey: privkey }); }, @@ -23,6 +26,9 @@ export const useStronghold = create()( clearPrivkey: () => { set({ privkey: null }); }, + setIsFetched: () => { + set({ isFetched: true }); + }, }), { name: 'stronghold', diff --git a/src/stores/widgets.ts b/src/stores/widgets.ts index d1805eef..60f6745d 100644 --- a/src/stores/widgets.ts +++ b/src/stores/widgets.ts @@ -10,6 +10,7 @@ interface WidgetState { fetchWidgets: (db: LumeStorage) => void; setWidget: (db: LumeStorage, { kind, title, content }: Widget) => void; removeWidget: (db: LumeStorage, id: string) => void; + reorderWidget: (id: string, position: number) => void; } export const WidgetKinds = { @@ -141,6 +142,18 @@ export const useWidgets = create()( await db.removeWidget(id); set((state) => ({ widgets: state.widgets.filter((widget) => widget.id !== id) })); }, + reorderWidget: (id: string, position: number) => + set((state) => { + const widgets = [...state.widgets]; + const widget = widgets.find((widget) => widget.id === id); + if (!widget) return { widgets }; + + const idx = widgets.indexOf(widget); + widgets.splice(idx, 1); + widgets.splice(position, 0, widget); + + return { widgets }; + }), }), { name: 'widgets', diff --git a/src/utils/checkActiveAccount.ts b/src/utils/checkActiveAccount.ts deleted file mode 100644 index f7ff0bbb..00000000 --- a/src/utils/checkActiveAccount.ts +++ /dev/null @@ -1,28 +0,0 @@ -import Database from 'tauri-plugin-sql-api'; - -import { Account } from '@utils/types'; - -async function connect(): Promise { - let db: null | Database = null; - - if (db) { - return db; - } - - try { - db = await Database.load('sqlite:lume.db'); - } catch (e) { - throw new Error('Failed to connect to database, error: ', e); - } - - return db; -} - -export async function checkActiveAccount() { - const db = await connect(); - const result: Array = await db.select( - 'SELECT * FROM accounts WHERE is_active = 1;' - ); - - return result.length > 0; -} diff --git a/src/utils/hooks/useNostr.ts b/src/utils/hooks/useNostr.ts index d0da3ee0..75f517fb 100644 --- a/src/utils/hooks/useNostr.ts +++ b/src/utils/hooks/useNostr.ts @@ -6,11 +6,10 @@ import { NDKSubscription, NDKUser, } from '@nostr-dev-kit/ndk'; -import { ndkAdapter } from '@nostr-fetch/adapter-ndk'; import { message, open } from '@tauri-apps/api/dialog'; import { Body, fetch } from '@tauri-apps/api/http'; import { LRUCache } from 'lru-cache'; -import { NostrFetcher } from 'nostr-fetch'; +import { NostrEventExt } from 'nostr-fetch'; import { nip19 } from 'nostr-tools'; import { useMemo } from 'react'; @@ -21,11 +20,12 @@ import { useStronghold } from '@stores/stronghold'; import { createBlobFromFile } from '@utils/createBlobFromFile'; import { nHoursAgo } from '@utils/date'; +import { getMultipleRandom } from '@utils/transform'; import { NDKEventWithReplies, NostrBuildResponse } from '@utils/types'; export function useNostr() { - const { ndk, relayUrls } = useNDK(); const { db } = useStorage(); + const { ndk, relayUrls, fetcher } = useNDK(); const privkey = useStronghold((state) => state.privkey); const subManager = useMemo( @@ -37,15 +37,24 @@ export function useNostr() { [] ); - const sub = async (filter: NDKFilter, callback: (event: NDKEvent) => void) => { + const sub = async ( + filter: NDKFilter, + callback: (event: NDKEvent) => void, + groupable?: boolean + ) => { if (!ndk) throw new Error('NDK instance not found'); - const subEvent = ndk.subscribe(filter, { closeOnEose: false }); - subManager.set(JSON.stringify(filter), subEvent); + const subEvent = ndk.subscribe(filter, { + closeOnEose: false, + groupable: groupable ?? true, + }); subEvent.addListener('event', (event: NDKEvent) => { callback(event); }); + + subManager.set(JSON.stringify(filter), subEvent); + console.log('current active sub: ', subManager.size); }; const fetchUserData = async (preFollows?: string[]) => { @@ -135,45 +144,8 @@ export function useNostr() { publish({ content: '', kind: NDKKind.Contacts, tags: tags }); }; - const prefetchEvents = async () => { - try { - const fetcher = NostrFetcher.withCustomPool(ndkAdapter(ndk)); - const dbEventsEmpty = await db.isEventsEmpty(); - - let since: number; - if (dbEventsEmpty || db.account.last_login_at === 0) { - since = db.account.network.length > 400 ? nHoursAgo(12) : nHoursAgo(24); - } else { - since = db.account.last_login_at; - } - - console.log("prefetching events with user's network: ", db.account.network.length); - console.log('prefetching events since: ', since); - - const events = (await fetcher.fetchAllEvents( - relayUrls, - { - kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], - authors: db.account.network, - }, - { since: since } - )) as unknown as NDKEvent[]; - - // save all events to database - const promises = await Promise.all( - events.map(async (event) => await db.createEvent(event)) - ); - - if (promises) return { status: 'ok', message: 'prefetch completed' }; - } catch (e) { - console.error('prefetch events failed, error: ', e); - return { status: 'failed', message: e }; - } - }; - const fetchActivities = async () => { try { - const fetcher = NostrFetcher.withCustomPool(ndkAdapter(ndk)); const events = await fetcher.fetchAllEvents( relayUrls, { @@ -197,7 +169,6 @@ export function useNostr() { }; const fetchNIP04Chats = async () => { - const fetcher = NostrFetcher.withCustomPool(ndkAdapter(ndk)); const events = await fetcher.fetchAllEvents( relayUrls, { @@ -215,17 +186,19 @@ export function useNostr() { }; const fetchNIP04Messages = async (sender: string) => { - const fetcher = NostrFetcher.withCustomPool(ndkAdapter(ndk)); + let senderMessages: NostrEventExt[] = []; - const senderMessages = await fetcher.fetchAllEvents( - relayUrls, - { - kinds: [NDKKind.EncryptedDirectMessage], - authors: [sender], - '#p': [db.account.pubkey], - }, - { since: 0 } - ); + if (sender !== db.account.pubkey) { + senderMessages = await fetcher.fetchAllEvents( + relayUrls, + { + kinds: [NDKKind.EncryptedDirectMessage], + authors: [sender], + '#p': [db.account.pubkey], + }, + { since: 0 } + ); + } const userMessages = await fetcher.fetchAllEvents( relayUrls, @@ -246,7 +219,6 @@ export function useNostr() { const fetchAllReplies = async (id: string, data?: NDKEventWithReplies[]) => { let events = data || null; - const fetcher = NostrFetcher.withCustomPool(ndkAdapter(ndk)); if (!data) { events = (await fetcher.fetchAllEvents( @@ -286,6 +258,53 @@ export function useNostr() { return events; }; + const getAllEventsSinceLastLogin = async (customSince?: number) => { + try { + let since: number; + const dbEventsEmpty = await db.isEventsEmpty(); + + if (!customSince) { + if (dbEventsEmpty || db.account.last_login_at === 0) { + since = db.account.network.length > 400 ? nHoursAgo(12) : nHoursAgo(24); + } else { + since = db.account.last_login_at; + } + } else { + since = customSince; + } + + const events = (await fetcher.fetchAllEvents( + relayUrls, + { + kinds: [NDKKind.Text, NDKKind.Repost, 1063, NDKKind.Article], + authors: db.account.network, + }, + { since: since } + )) as unknown as NDKEvent[]; + + return { status: 'ok', message: 'fetch completed', data: events }; + } catch (e) { + console.error('prefetch events failed, error: ', e); + return { status: 'failed', message: e }; + } + }; + + const getContactsByPubkey = async (pubkey: string) => { + const user = ndk.getUser({ hexpubkey: pubkey }); + const follows = [...(await user.follows())].map((user) => user.hexpubkey); + return getMultipleRandom([...follows], 10); + }; + + const getEventsByPubkey = async (pubkey: string) => { + const events = await fetcher.fetchAllEvents( + relayUrls, + { authors: [pubkey], kinds: [NDKKind.Text, NDKKind.Repost, NDKKind.Article] }, + { since: nHoursAgo(24) }, + { sort: true } + ); + return events as unknown as NDKEvent[]; + }; + const publish = async ({ content, kind, @@ -421,7 +440,7 @@ export function useNostr() { fetchUserData, addContact, removeContact, - prefetchEvents, + getAllEventsSinceLastLogin, fetchActivities, fetchNIP04Chats, fetchNIP04Messages, @@ -429,5 +448,7 @@ export function useNostr() { publish, createZap, upload, + getContactsByPubkey, + getEventsByPubkey, }; } diff --git a/src/utils/hooks/useProfile.ts b/src/utils/hooks/useProfile.ts index 62f511c7..6306c51a 100644 --- a/src/utils/hooks/useProfile.ts +++ b/src/utils/hooks/useProfile.ts @@ -2,8 +2,10 @@ import { NDKUserProfile } from '@nostr-dev-kit/ndk'; import { useQuery } from '@tanstack/react-query'; import { useNDK } from '@libs/ndk/provider'; +import { useStorage } from '@libs/storage/provider'; export function useProfile(pubkey: string, embed?: string) { + const { db } = useStorage(); const { ndk } = useNDK(); const { status, @@ -12,20 +14,20 @@ export function useProfile(pubkey: string, embed?: string) { } = useQuery( ['user', pubkey], async () => { - if (!embed) { - const cleanPubkey = pubkey.replace('-', ''); - const user = ndk.getUser({ hexpubkey: cleanPubkey }); - await user.fetchProfile(); - if (user.profile) { - user.profile.display_name = user.profile.displayName; - return user.profile; - } else { - throw new Error(`User not found: ${pubkey}`); - } - } else { + if (embed) { const profile: NDKUserProfile = JSON.parse(embed); return profile; } + + const cleanPubkey = pubkey.replace('-', ''); + const user = ndk.getUser({ hexpubkey: cleanPubkey }); + + const profile = await user.fetchProfile({ closeOnEose: true }); + if (!user.profile) return Promise.reject(new Error('profile not found')); + + await db.createProfile(cleanPubkey, profile); + + return user.profile; }, { enabled: !!ndk, diff --git a/src/utils/parser.ts b/src/utils/parser.ts index 9ded8551..cfe0ed78 100644 --- a/src/utils/parser.ts +++ b/src/utils/parser.ts @@ -57,6 +57,11 @@ export function parser(eventContent: string) { return word.replace(word, `~tag-${word}~`); } + // boost + if (word.startsWith('$') && word.length > 1) { + return word.replace(word, `~boost-${word}~`); + } + // nostr account references if (word.startsWith('nostr:npub1') || word.startsWith('npub1')) { const npub = word.replace('nostr:', '').replace(/[^a-zA-Z0-9 ]/g, ''); diff --git a/src/utils/transform.ts b/src/utils/transform.ts index 74441dd9..704f97c9 100644 --- a/src/utils/transform.ts +++ b/src/utils/transform.ts @@ -24,3 +24,9 @@ export function getRepostID(tags: NDKTag[]) { return quoteID; } + +// get random n elements from array +export function getMultipleRandom(arr: string[], num: number) { + const shuffled = [...arr].sort(() => 0.5 - Math.random()); + return shuffled.slice(0, num); +}