diff --git a/dashboard/index.html b/dashboard/index.html
@@ -7,7 +7,7 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
- href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap"
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap"
rel="stylesheet">
<title>Marzneshin</title>
</head>
diff --git a/dashboard/package.json b/dashboard/package.json
@@ -13,21 +13,27 @@
"test:coverage": "vitest run --coverage"
},
"dependencies": {
+ "@codemirror/language": "^6.10.1",
"@heroicons/react": "^2.1.1",
"@hookform/resolvers": "^3.3.4",
"@kodingdotninja/use-tailwind-breakpoint": "^0.0.5",
+ "@monaco-editor/react": "^4.6.0",
"@radix-ui/react-alert-dialog": "^1.0.5",
"@radix-ui/react-aspect-ratio": "^1.0.3",
"@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-popover": "^1.0.7",
"@radix-ui/react-radio-group": "^1.1.3",
+ "@radix-ui/react-scroll-area": "^1.0.5",
+ "@radix-ui/react-select": "^2.0.0",
"@radix-ui/react-separator": "^1.0.3",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-switch": "^1.0.3",
+ "@radix-ui/react-tabs": "^1.0.4",
"@radix-ui/react-toggle": "^1.0.3",
"@radix-ui/react-tooltip": "^1.0.7",
"@react-hook/media-query": "^1.1.1",
@@ -35,21 +41,27 @@
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.10",
+ "@tanstack/react-query": "^5.28.6",
"@tanstack/react-router": "^1.20.1",
+ "@tanstack/react-table": "^8.14.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"dayjs": "^1.11.10",
"i18next": "^23.10.1",
"i18next-browser-languagedetector": "^7.2.0",
"i18next-http-backend": "^2.5.0",
+ "lodash": "^4.17.21",
"lucide-react": "^0.359.0",
"next-themes": "^0.3.0",
"ofetch": "^1.3.3",
"react": "^18.2.0",
+ "react-copy-to-clipboard": "^5.1.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.51.1",
"react-i18next": "^14.1.0",
"react-resizable-panels": "^2.0.13",
+ "react-use-websocket": "^4.8.1",
+ "remirror": "^2.0.39",
"sonner": "^1.4.3",
"tailwind-merge": "^2.2.2",
"tailwindcss-animate": "^1.0.7",
@@ -63,6 +75,7 @@
"@tanstack/router-vite-plugin": "^1.20.2",
"@types/node": "^20.11.29",
"@types/react": "^18.2.64",
+ "@types/react-copy-to-clipboard": "^5.0.7",
"@types/react-dom": "^18.2.21",
"@typescript-eslint/eslint-plugin": "^7.1.1",
"@typescript-eslint/parser": "^7.1.1",
diff --git a/dashboard/pnpm-lock.yaml b/dashboard/pnpm-lock.yaml
@@ -5,6 +5,9 @@ settings:
excludeLinksFromLockfile: false
dependencies:
+ '@codemirror/language':
+ specifier: ^6.10.1
+ version: 6.10.1
'@heroicons/react':
specifier: ^2.1.1
version: 2.1.1(react@18.2.0)
@@ -14,6 +17,9 @@ dependencies:
'@kodingdotninja/use-tailwind-breakpoint':
specifier: ^0.0.5
version: 0.0.5(react@18.2.0)
+ '@monaco-editor/react':
+ specifier: ^4.6.0
+ version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-alert-dialog':
specifier: ^1.0.5
version: 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
@@ -32,6 +38,9 @@ dependencies:
'@radix-ui/react-dropdown-menu':
specifier: ^2.0.6
version: 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-icons':
+ specifier: ^1.3.0
+ version: 1.3.0(react@18.2.0)
'@radix-ui/react-label':
specifier: ^2.0.2
version: 2.0.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
@@ -41,6 +50,12 @@ dependencies:
'@radix-ui/react-radio-group':
specifier: ^1.1.3
version: 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-scroll-area':
+ specifier: ^1.0.5
+ version: 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-select':
+ specifier: ^2.0.0
+ version: 2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-separator':
specifier: ^1.0.3
version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
@@ -50,6 +65,9 @@ dependencies:
'@radix-ui/react-switch':
specifier: ^1.0.3
version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-tabs':
+ specifier: ^1.0.4
+ version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-toggle':
specifier: ^1.0.3
version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
@@ -71,9 +89,15 @@ dependencies:
'@tailwindcss/typography':
specifier: ^0.5.10
version: 0.5.10(tailwindcss@3.4.1)
+ '@tanstack/react-query':
+ specifier: ^5.28.6
+ version: 5.28.6(react@18.2.0)
'@tanstack/react-router':
specifier: ^1.20.1
version: 1.20.1(react-dom@18.2.0)(react@18.2.0)
+ '@tanstack/react-table':
+ specifier: ^8.14.0
+ version: 8.14.0(react-dom@18.2.0)(react@18.2.0)
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
@@ -92,6 +116,9 @@ dependencies:
i18next-http-backend:
specifier: ^2.5.0
version: 2.5.0
+ lodash:
+ specifier: ^4.17.21
+ version: 4.17.21
lucide-react:
specifier: ^0.359.0
version: 0.359.0(react@18.2.0)
@@ -104,6 +131,9 @@ dependencies:
react:
specifier: ^18.2.0
version: 18.2.0
+ react-copy-to-clipboard:
+ specifier: ^5.1.0
+ version: 5.1.0(react@18.2.0)
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
@@ -116,6 +146,12 @@ dependencies:
react-resizable-panels:
specifier: ^2.0.13
version: 2.0.13(react-dom@18.2.0)(react@18.2.0)
+ react-use-websocket:
+ specifier: ^4.8.1
+ version: 4.8.1(react-dom@18.2.0)(react@18.2.0)
+ remirror:
+ specifier: ^2.0.39
+ version: 2.0.39(@remirror/pm@2.0.8)(@types/node@20.11.29)
sonner:
specifier: ^1.4.3
version: 1.4.3(react-dom@18.2.0)(react@18.2.0)
@@ -151,6 +187,9 @@ devDependencies:
'@types/react':
specifier: ^18.2.64
version: 18.2.64
+ '@types/react-copy-to-clipboard':
+ specifier: ^5.0.7
+ version: 5.0.7
'@types/react-dom':
specifier: ^18.2.21
version: 18.2.21
@@ -208,12 +247,282 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
+ /@ampproject/remapping@2.3.0:
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ dev: false
+
+ /@babel/code-frame@7.24.2:
+ resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.24.2
+ picocolors: 1.0.0
+ dev: false
+
+ /@babel/compat-data@7.24.1:
+ resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/core@7.24.3:
+ resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.1
+ '@babel/helper-compilation-targets': 7.23.6
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/helpers': 7.24.1
+ '@babel/parser': 7.24.1
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ convert-source-map: 2.0.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/generator@7.24.1:
+ resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+ dev: false
+
+ /@babel/helper-compilation-targets@7.23.6:
+ resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.24.1
+ '@babel/helper-validator-option': 7.23.5
+ browserslist: 4.23.0
+ lru-cache: 5.1.1
+ semver: 6.3.1
+ dev: false
+
+ /@babel/helper-environment-visitor@7.22.20:
+ resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-function-name@7.23.0:
+ resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/helper-hoist-variables@7.22.5:
+ resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/helper-module-imports@7.24.3:
+ resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3):
+ resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.24.3
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+ dev: false
+
+ /@babel/helper-plugin-utils@7.24.0:
+ resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-simple-access@7.22.5:
+ resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/helper-split-export-declaration@7.22.6:
+ resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/helper-string-parser@7.24.1:
+ resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-validator-identifier@7.22.20:
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-validator-option@7.23.5:
+ resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helpers@7.24.1:
+ resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/highlight@7.24.2:
+ resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.0.0
+ dev: false
+
+ /@babel/parser@7.24.1:
+ resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.24.3):
+ resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
+ engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-plugin-utils': 7.24.0
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3)
+ dev: false
+
+ /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3):
+ resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: false
+
+ /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3):
+ resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: false
+
+ /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3):
+ resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/helper-plugin-utils': 7.24.0
+ '@babel/helper-simple-access': 7.22.5
+ dev: false
+
/@babel/runtime@7.24.0:
resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.1
+ /@babel/template@7.24.0:
+ resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/parser': 7.24.1
+ '@babel/types': 7.24.0
+ dev: false
+
+ /@babel/traverse@7.24.1:
+ resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.1
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.24.1
+ '@babel/types': 7.24.0
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/types@7.24.0:
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.24.1
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+ dev: false
+
+ /@codemirror/language@6.10.1:
+ resolution: {integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==}
+ dependencies:
+ '@codemirror/state': 6.4.1
+ '@codemirror/view': 6.26.0
+ '@lezer/common': 1.2.1
+ '@lezer/highlight': 1.2.0
+ '@lezer/lr': 1.4.0
+ style-mod: 4.1.2
+ dev: false
+
+ /@codemirror/state@6.4.1:
+ resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==}
+ dev: false
+
+ /@codemirror/view@6.26.0:
+ resolution: {integrity: sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==}
+ dependencies:
+ '@codemirror/state': 6.4.1
+ style-mod: 4.1.2
+ w3c-keyname: 2.2.8
+ dev: false
+
/@esbuild/aix-ppc64@0.19.12:
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
engines: {node: '>=12'}
@@ -576,6 +885,124 @@ packages:
react: 18.2.0
dev: false
+ /@lezer/common@1.2.1:
+ resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==}
+ dev: false
+
+ /@lezer/highlight@1.2.0:
+ resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==}
+ dependencies:
+ '@lezer/common': 1.2.1
+ dev: false
+
+ /@lezer/lr@1.4.0:
+ resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==}
+ dependencies:
+ '@lezer/common': 1.2.1
+ dev: false
+
+ /@linaria/core@4.2.10:
+ resolution: {integrity: sha512-S1W01W7L4SQnGpWzp8awyCpPIYUOEJ+OLjjXqKpIXOU+ozPwBt86Mjjdas9aZccVhNBWDja74cMCUAVp8yUpDQ==}
+ engines: {node: ^12.16.0 || >=13.7.0}
+ dependencies:
+ '@linaria/logger': 4.5.0
+ '@linaria/tags': 4.5.4
+ '@linaria/utils': 4.5.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@linaria/logger@4.5.0:
+ resolution: {integrity: sha512-XdQLk242Cpcsc9a3Cz1ktOE5ysTo2TpxdeFQEPwMm8Z/+F/S6ZxBDdHYJL09srXWz3hkJr3oS2FPuMZNH1HIxw==}
+ engines: {node: ^12.16.0 || >=13.7.0}
+ dependencies:
+ debug: 4.3.4
+ picocolors: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@linaria/tags@4.5.4:
+ resolution: {integrity: sha512-HPxLB6HlJWLi6o8+8lTLegOmDnbMbuzEE+zzunaPZEGSoIIYx8HAv5VbY/sG/zNyxDElk6laiAwEVWN8h5/zxg==}
+ engines: {node: ^12.16.0 || >=13.7.0}
+ dependencies:
+ '@babel/generator': 7.24.1
+ '@linaria/logger': 4.5.0
+ '@linaria/utils': 4.5.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@linaria/utils@4.5.3:
+ resolution: {integrity: sha512-tSpxA3Zn0DKJ2n/YBnYAgiDY+MNvkmzAHrD8R9PKrpGaZ+wz1jQEmE1vGn1cqh8dJyWK0NzPAA8sf1cqa+RmAg==}
+ engines: {node: ^12.16.0 || >=13.7.0}
+ dependencies:
+ '@babel/core': 7.24.3
+ '@babel/generator': 7.24.1
+ '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.24.3)
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3)
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ '@linaria/logger': 4.5.0
+ babel-merge: 3.0.0(@babel/core@7.24.3)
+ find-up: 5.0.0
+ minimatch: 9.0.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@lingui/core@4.7.1:
+ resolution: {integrity: sha512-Ign2qnyy1WNY7hPzkYTPYaja+5ucs3oDy+rgxs8ChGsqGFf4RjchU4W+CxqliKJ19f/hy4gaDK1DWA9h47kGvw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@lingui/message-utils': 4.7.1
+ unraw: 3.0.0
+ dev: false
+
+ /@lingui/detect-locale@4.7.1:
+ resolution: {integrity: sha512-rx0NyPIHhzu9+wTURflBL3Vvpg5j+aCkjI1Cn1ErVHVc/TvRnLNDmHohMNyaeCYy5XJqcLgDHW/FRXW3H1OUmA==}
+ engines: {node: '>=16.0.0'}
+ dev: false
+
+ /@lingui/message-utils@4.7.1:
+ resolution: {integrity: sha512-c4D9Qg575LHvJHNyDDJfw+lAfyVv+3L+j4ZkaG8elNjc06ITx6sBWETFlj9FwoE8krF/r4yyXuCdnhBgUMrvJg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@messageformat/parser': 5.1.0
+ js-sha256: 0.10.1
+ dev: false
+
+ /@messageformat/parser@5.1.0:
+ resolution: {integrity: sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==}
+ dependencies:
+ moo: 0.5.2
+ dev: false
+
+ /@monaco-editor/loader@1.4.0(monaco-editor@0.47.0):
+ resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==}
+ peerDependencies:
+ monaco-editor: '>= 0.21.0 < 1'
+ dependencies:
+ monaco-editor: 0.47.0
+ state-local: 1.0.7
+ dev: false
+
+ /@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==}
+ peerDependencies:
+ monaco-editor: '>= 0.25.0 < 1'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@monaco-editor/loader': 1.4.0(monaco-editor@0.47.0)
+ monaco-editor: 0.47.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -594,6 +1021,12 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
+ /@ocavue/svgmoji-cjs@0.1.1:
+ resolution: {integrity: sha512-tCP6ggbtgIL4hPM5goVFSjL51jH/BLl/yBLy98wAV9a2L/Sn9iS3abfprPeQw6/nan5lLaz4Vz8ZP37LKh+xfQ==}
+ dependencies:
+ svgmoji: 3.2.0
+ dev: false
+
/@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -604,6 +1037,12 @@ packages:
resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
dev: true
+ /@radix-ui/number@1.0.1:
+ resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ dev: false
+
/@radix-ui/primitive@1.0.1:
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
dependencies:
@@ -923,6 +1362,14 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-icons@1.3.0(react@18.2.0):
+ resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==}
+ peerDependencies:
+ react: ^16.x || ^17.x || ^18.x
+ dependencies:
+ react: 18.2.0
+ dev: false
+
/@radix-ui/react-id@1.0.1(@types/react@18.2.64)(react@18.2.0):
resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
peerDependencies:
@@ -1185,8 +1632,8 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==}
+ /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -1199,30 +1646,23 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.24.0
+ '@radix-ui/number': 1.0.1
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@types/react': 18.2.64
'@types/react-dom': 18.2.21
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.64)(react@18.2.0):
- resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- dependencies:
- '@babel/runtime': 7.24.0
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0)
- '@types/react': 18.2.64
- react: 18.2.0
- dev: false
-
- /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==}
+ /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -1235,21 +1675,35 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.24.0
+ '@radix-ui/number': 1.0.1
'@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0)
- '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.2.64
'@types/react-dom': 18.2.21
+ 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.64)(react@18.2.0)
dev: false
- /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==}
+ /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -1262,30 +1716,121 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.24.0
- '@radix-ui/primitive': 1.0.1
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@types/react': 18.2.64
'@types/react-dom': 18.2.21
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==}
+ /@radix-ui/react-slot@1.0.2(@types/react@18.2.64)(react@18.2.0):
+ resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
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.24.0
- '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@types/react': 18.2.64
+ react: 18.2.0
+ dev: false
+
+ /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==}
+ 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.24.0
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@types/react': 18.2.64
+ '@types/react-dom': 18.2.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==}
+ 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.24.0
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@types/react': 18.2.64
+ '@types/react-dom': 18.2.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==}
+ 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.24.0
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@types/react': 18.2.64
+ '@types/react-dom': 18.2.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==}
+ 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.24.0
+ '@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
@@ -1378,66 +1923,1131 @@ packages:
/@radix-ui/react-use-rect@1.0.1(@types/react@18.2.64)(react@18.2.0):
resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@radix-ui/rect': 1.0.1
+ '@types/react': 18.2.64
+ react: 18.2.0
+ dev: false
+
+ /@radix-ui/react-use-size@1.0.1(@types/react@18.2.64)(react@18.2.0):
+ resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0)
+ '@types/react': 18.2.64
+ react: 18.2.0
+ dev: false
+
+ /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
+ 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.24.0
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.64
+ '@types/react-dom': 18.2.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@radix-ui/rect@1.0.1:
+ resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ dev: false
+
+ /@react-hook/media-query@1.1.1(react@18.2.0):
+ resolution: {integrity: sha512-VM14wDOX5CW5Dn6b2lTiMd79BFMTut9AZj2+vIRT3LCKgMCYmdqruTtzDPSnIVDQdtxdPgtOzvU9oK20LopuOw==}
+ peerDependencies:
+ react: '>=16.8'
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /@remirror/core-constants@2.0.2:
+ resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==}
+ dev: false
+
+ /@remirror/core-helpers@3.0.0:
+ resolution: {integrity: sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==}
+ dependencies:
+ '@remirror/core-constants': 2.0.2
+ '@remirror/types': 1.0.1
+ '@types/object.omit': 3.0.3
+ '@types/object.pick': 1.3.4
+ '@types/throttle-debounce': 2.1.0
+ case-anything: 2.1.13
+ dash-get: 1.0.2
+ deepmerge: 4.3.1
+ fast-deep-equal: 3.1.3
+ make-error: 1.3.6
+ object.omit: 3.0.0
+ object.pick: 1.3.0
+ throttle-debounce: 3.0.1
+ dev: false
+
+ /@remirror/core-types@2.0.5(@remirror/pm@2.0.8):
+ resolution: {integrity: sha512-K4pd23sQnBGjdzow7qvdkDfTM8klUxBgdOvo2qBOmd0XsjrtIy7t41CcBR3B5lQM9GsCA2J+XeMUN2bxyJFyEg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@remirror/core-constants': 2.0.2
+ '@remirror/pm': 2.0.8
+ '@remirror/types': 1.0.1
+ dev: false
+
+ /@remirror/core-utils@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-5UggNc6Z2d7M8SVkstsVitID8DAHSKPrqet7Hfn4/dY+p4iMCOdwf9cLqcHMg3467k5/5/RvJPMTr9GQOEx7Hg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.7
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core-constants': 2.0.2
+ '@remirror/core-helpers': 3.0.0
+ '@remirror/core-types': 2.0.5(@remirror/pm@2.0.8)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@types/min-document': 2.19.2
+ '@types/node': 20.11.29
+ css-in-js-utils: 3.1.0
+ get-dom-document: 0.1.3
+ min-document: 2.19.0
+ parenthesis: 3.1.8
+ transitivePeerDependencies:
+ - jsdom
+ dev: false
+
+ /@remirror/core@2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-TGvDPUdKYqOiDQmt3+58GNBi4PX6QhBhII1qk9btZ/uFvG2/LLHEe+KN/BfBdvykGAu8CK9codLzg8NZd2fDEg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.7
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@linaria/core': 4.2.10
+ '@remirror/core-constants': 2.0.2
+ '@remirror/core-helpers': 3.0.0
+ '@remirror/core-types': 2.0.5(@remirror/pm@2.0.8)
+ '@remirror/core-utils': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/i18n': 2.0.5
+ '@remirror/icons': 2.0.3
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ nanoevents: 5.1.13
+ tiny-warning: 1.0.3
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/dom@2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-DxjEFgQc24O93WN/YL7nHUanER/a1FIGQGRgsFoN9Px2t+Op39i2PZ0hm1ZE7ivp9/gE7obaMbgsXnjEJ8RX+A==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/pm': 2.0.8
+ '@remirror/preset-core': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-annotation@2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-jtLfWaNWQFfsE3lguQbYds4W3HJGLM0Ezrsc1q1w17EQxr5aJnjA2tNMjZL+6IdFzqEjuxd7Y9aRln3rU4WbnA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-bidi@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-tM0Ov4UpwIAs665T6kcsqb8sCZ2OwDcesGTHbBNI+NAxf9gpr/IALFA/xhzzQbpSj44yli1EYzVjQgcbKYfsKA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@types/direction': 1.0.0
+ direction: 1.0.4
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-blockquote@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-jWko6/spZ49OvZVZVFUSPhOIZR8VY9aUFiMKJQfclkL3fESJPSPshkm6rANrnY24sk7VKfpXgpwCSqmJVJ8EiA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-bold@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-b4yaQcU0m/tXxUVAlDSHcm3Z4dVnWKXfUmlpP8QDjISQ0F0vloRWSK2U9yvcldhmnTNJ/il0kn9PmJeoRbqkeA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-callout@2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-qn7o1JCy7k0rsybh57EtC8qRoZyEDkncxAtr4Rq1Z2PH/axuOJwwdIgeDadEGITpviRsqrh2L4ddogpDVWVImg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-code-block@2.0.18(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-Qu51glo0xQMUlSYiFR20HmYEnOJF1OcbZYLTcF32oa8Uq1JWStv1DacQaACUQEhZ6DKgxFZxFBWbPLonzZ1bmw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.8
+ '@types/prettier': ^2.7.2
+ prettier: ^2.8.8
+ peerDependenciesMeta:
+ '@types/prettier':
+ optional: true
+ '@types/refractor':
+ optional: true
+ prettier:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ '@types/refractor': 3.4.1
+ refractor: 3.6.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-code@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-uf4mkIHcw5RIscw1YcOMwikMMu+x5cqUkFdo5jjA3cssirh/87xDQJAeXLB4weN/ZNexbaJ2tSslWpMFrNBW8A==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-codemirror5@2.0.13(@remirror/pm@2.0.8)(@types/codemirror@5.60.15)(@types/node@20.11.29)(codemirror@5.65.16):
+ resolution: {integrity: sha512-9p9kYtBJLIC7kIQJOCa+xIg3IdaH2gb9OBDRo1AmjDAN68f8x2Ta8VAJD/h+wYhdSS96Q+4LMUBzxgZwssRDpw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ '@types/codemirror': '*'
+ codemirror: ^5.65.12
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@types/codemirror': 5.60.15
+ codemirror: 5.65.16
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-collaboration@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-sqkUjsPYQnuBIbyMW/FsSkQSyQ9GbQcawrigcCOxwlQp3f1snzKzfEcGRMPrUAG06UfDRedoGv/HVb+K4uIiIw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-columns@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-0WROpbsdCsuoHFTJB5daAIwjO4tGy9hVWx5kQk4P6bkLOW/qo5hSN6iQLi2mQsAG8pi7tn/NZtMNc1awWrRWhQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-diff@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-6IxewTYkiFTOqEB7W3uZHBCS6pTw76qJVceWziFnSzwlf0JPqs80C4y6BLOdC6rIa3nB9USSlDkf8y1HDubVZw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-doc@2.1.5(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-LwXEVWytMUKldjniQ9Xet1kQ97aIubmh8ECK0I3mp7wwxx8Uotg1oYHRruWZHDBK9zH/H2yLaRWrQPF/FOYjmw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-drop-cursor@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-To6YtaBZ4v4XWaoD1oMd/EGsKMw2plLizZHrH70q7voP5rJjjzQ1O0Z8N/qgeM6Ai7ZM1O8PAozUW1OpqQQJJA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-embed@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-O0UzrmMWBNWZvaWPpc9ZafhJx4QgzpPqJ3p+7jDgEbtaB5VArTuKsYReSpyyGU8a0PcPOx7s9aFFbh+i7IkL7A==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.8
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@types/querystringify': 2.0.2
+ prosemirror-resizable-view: 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ querystringify: 2.2.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-emoji@2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-JFAx2/xDf0Pg7lUn4/HneU/Rq3alXa5uwdVXcAiCF7jqiryO/qdgH0qQ7DIiL9lvBvfpBvJYXTeuScnofvDkvw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@ocavue/svgmoji-cjs': 0.1.1
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ emojibase: 6.1.0
+ emojibase-data: 6.2.0(emojibase@6.1.0)
+ emojibase-regex: 6.0.1
+ escape-string-regexp: 4.0.0
+ svgmoji: 3.2.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-entity-reference@2.2.6(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-rhmGchMv5jxaaLAvj3gPRjPxzAP8b0QzKToxGDBxQJkNRpLzik3h5Z3JDg3EdMa3fg75X1/+9UFdS1g/LDlJhQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-epic-mode@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-KDHF0Uyr0RevWtp1ca4VOL+4iD6SXlPpEbRKz7Mlg5Fnl9IGTEsraHwg9OthoTN1Kc8fzYMzOxv6qwyTsvMuVw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-events@2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-vIBV5tQYgQ8hkYXWPrgQwjmBxTe55FynKS4aDSpde1pfSf6MUUaTWNlMGQzmTWBukhw1tGppNiJkKuYpOL/YxQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.7
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-font-family@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-sGq1ChvxlwlfKnrYlKtlynG8/vbQhYznf3FlrMHycpzZTn4DW16SOlJMZlYD/bPbCFIY/5T6ZSOdUVeDOv6zoQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-font-size@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-j7wXaOrIVdj4PapC7g4yqpPVULUqCIiUOqt2lwKVXFbET/sXMD2RujR8zSng+VFTLFQyem53jHOkJmD+B5QJKw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ round: 2.0.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-gap-cursor@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-oaLrh/6cRhAdEksDNmrEcqnVixRjzARDr+cq2jJfPdVG0316xgNi7CkTnWJJCWSqQ4D6lrriMY5pQO3Qwlv5Kg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-hard-break@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-86T5bWl7O6feaXYIUylAuzq6lbpWhF6cM7CY7IW5c9+l8qpUMSktylfgAVAajjAtIfIB+g83m0D2AjL5VXksvg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-heading@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-jBBQhLSbEvR/IbSyzBLPN6P69zGoYrW/lxclMPccBxiqr/Rzc1ynJqrbXPQOzj3P43bRLdjXBKiy2VJWzqqO8Q==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-history@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-LjW60KVpniRawttyhrWxM6ieE8sTYprqpCdMRbc7RuxBhdHaxlcQJGAjJvnBM7078qV/55S616P620YGYaBU4w==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-horizontal-rule@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-CV1lIWZ0n8btANKIP4xiUzTFbWRhOiBfdncePZvoRSYTa4UwfAQ6KapUVkcUHEL20UtDkDX8fGpF6kjtEGRCCQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-image@2.1.10(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-x2Sa/cXVcavOks6k5CkTrGGj0lDnDrc7PhRBbOqQCIzKXB36idRZWGBIzBkjvZrifqfxY2UUZ73BuABc0HHg6Q==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.8
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ prosemirror-resizable-view: 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-italic@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-DZ7BoIxQqwTWoTYgc7GpK+SCBKfDoJjh4xKQIrC/45tcK+WdPaaxNRhdtGUzwOhHL2psYT6HtDOyN/DpO5hjWQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-link@2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-LZguN6F/3DyXqPdtCZn/WPXErhe5jWLoMNEsNDttKpX9kZRgqHYFuGBjOdIWP/lRa5Fh0tMk9c34+6RsWH1zdg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ extract-domain: 2.2.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-list@2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-nqRvlQotHubZxpWxwdt+3FyV6AmEifx5aytKtz0i/jub9cM8AUKHqkRrsQchvw1Y5jaSAjHJr3J7I2sLBiH78w==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-markdown@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-tv8h2KyAF6dvawqslW8FG/qftpfNzseQujaVc0o/KmV9iE8kQnIdTcDPClL0GWwk9fOqlLL8C2zkKnvLMKk4Cw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@types/marked': 4.3.2
+ '@types/turndown': 5.0.4
+ marked: 4.3.0
+ turndown: 7.1.3
+ turndown-plugin-gfm: 1.0.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-mention-atom@2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-RTHmhCrz8YVcMaifpKH8NB1aNxtgLRBG6ETyZgaPN2l9xcaRvtN5YHUb5myZsw0U4rUBXePI57/91j7QkxXw0Q==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-mention@2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-6w+859yva48+Kg6ELIoj9+MHKljdKuXdSKU3X7USZNNiH+qb2zxdL3AHw0ifMC9ltzC3zg/ePYM5mE9SYPBt3w==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ escape-string-regexp: 4.0.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-node-formatting@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-yL1Jk1Qjs2VmruGltV++D4QenmpDdAiOa4KQvRx0cgTvIuQ/rxQBV19IXkAj+rTzYfZmtI6W1DdScVY9bqCZ9w==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-paragraph@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-/iEYz6Sn/RLqTefa/vjjyfhMQAGcpNQY7hdW0rSox+IiwDKeeY+uR2TCi3hs/D9IMzNERZXMKD5Wk8ver1kYCg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-placeholder@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-YyrDs1Plyrpy5N6ehG3QOZNxpsQpDdI34yFQst+g2t/amnY6ScCnAJJ4GE666P4xnPF2V9gY0478Re09JmJ1KQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-positioner@2.1.8(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-7svqCFayauNSFCXejvitFqkTUhxk74FCCoWNI2S4p8m0y80TzJDVrASjc2m8/kZALjVeIE4Byg1gE58zj3r9SA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ nanoevents: 5.1.13
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-search@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-PZrf20bqr8n+E1kgeb6uQJG5ZeD8nHTzzICZRe01ltwmO4vqnWMXr7Tm5Z6Byh+ZqwLbMWkIeUzoaV7RdBQ94Q==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ escape-string-regexp: 4.0.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-shortcuts@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-LHHn7lnbicL9CQet9w9Aayw25SqsA5s9ysGWO9R9DbrYKJWWL1EijvZ3rz+N6nlb9/ItFWA6eNSSUSausnv+iA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-strike@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-42aEM12xux3RoxTZHJ6OBPpHux96btiMC7btPz7lJ/mqcAtVvIP3RHb8D01esU7KEpqIaI6H6n2WKc/JmvCdMQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-sub@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-eeEdHBWynyoU6YXc6Xt+n93nK2JJ0ry2TGqr8nzomssm2gddASPJKXFoPELuwME/iqzz64SxU/RcI7BRc/lbdw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-sup@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-8Pz+K8aSlxVCeqk9ZSX+JiSBNeCau8EbGkfTg1wAatq1jCrNhFHOHoazYOqA+nJjYP7/c5hiCoPYLpyXweIX3w==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-tables@2.4.1(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-8qcNNAQzUqbP1jDDuPRQE+/Nv99oDijnkS87anTVtZhjfHGsNHjLloFb/OsUxAb/RaW9I/+2Jh+Am1abyWwMlw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.7
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-text-case@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-sC0VoHUf2DHKAznn6+19eJTc2z8H6diz49MGodOtnGU9eCYbkKa1aoVB1ZMQndLAIQJ6kR9ElEOMvk4bpu++UA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-text-color@2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-BCcJ2zyt+pu7WGru9D9SfnodtPz0zxRibVqZOsRvNGJQN29Bvxs89e5tV+xTlAoXUz9gwxJrM6cn03umu18mbA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/i18n': 2.0.5
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ color2k: 2.0.3
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-text-highlight@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-stZ58DDD9jJYHUbSVeJ/r61Ywp7Zt7OtdJFeeD6fjWE6gs/SwQ7MCpIMD9GpFuwOgXsRu6FlOUPllzocpsga6Q==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-color': 2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-text@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-0lGw8zz3OZzRY5zGrI1gXJIfuv23Yf3IdK3507oqE0oVAnP61vPB5WMaYv3EtGez9g3RoXO8S0bIJJ3syzdILg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-trailing-node@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-DCeovi8yJ8HzTHZ/8bIxalm7aSjngN2B+DazGb5b6iLPFiEi00zucsw81bnVkHMa8DKDeH7WVbe13wZI+tn+KA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-underline@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-wrNDSqNvwqtZBiz0nOEQaWOEthxOtBVwkuTku83Sh7ftK6rNWJXtHKNKGUAFW6A9FXxvvqrnr8+n0DSgYdIAMA==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-whitespace@2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-daRoiH2/xZWrz8tzV14rfG8Catd0ThPJdWgoQ0en3QxcwYsTOP1+DXE1ZwUdP/uukuHg6DMAvgMvsWwJMtVx9A==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/extension-yjs@3.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)(yjs@13.6.14):
+ resolution: {integrity: sha512-XLKWueyyXsdmv5KSitW86kwAYUrKKE5dAazv+WlHZMtKWjWhfhxMMWgct8R1Gp1sOfVHZhbGf+KxgOfxxMDsRg==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.8
+ yjs: ^13.6.1
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/messages': 2.0.6
+ '@remirror/pm': 2.0.8
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.33.3
+ y-prosemirror: 1.2.3(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3)(y-protocols@1.0.6)(yjs@13.6.14)
+ y-protocols: 1.0.6(yjs@13.6.14)
+ yjs: 13.6.14
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /@remirror/i18n@2.0.5:
+ resolution: {integrity: sha512-oZ2umZav60iu+lBoVZxr7i11yUNRYpczVUXCsClNiHN55PDPMyYwNQ9CaEJdyQCvt0lb5WCmBNpnw1mbLaj7lQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@lingui/core': 4.7.1
+ '@lingui/detect-locale': 4.7.1
+ '@remirror/core-helpers': 3.0.0
+ make-plural: 6.2.2
+ dev: false
+
+ /@remirror/icons@2.0.3:
+ resolution: {integrity: sha512-ruOGU4FT6WJdXsdVwfNOurSaQvnk2Uo4AkMxxyLYkBPowxmR9Xe0lOn7d7UARai0wxmwFgX6IYaMSUVLIaaMCQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core-helpers': 3.0.0
+ dev: false
+
+ /@remirror/messages@2.0.6:
+ resolution: {integrity: sha512-JVnfuzuul4tcvnjiSM7Jj6iKDOP4hfaw79SciZ7t+cc2+iWyAcDYSrFMDV4Q50T+2IfWTYlWtKGpIhG6sfZaWw==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@lingui/core': 4.7.1
+ '@remirror/core-helpers': 3.0.0
+ dev: false
+
+ /@remirror/pm@2.0.8:
+ resolution: {integrity: sha512-aHJQKcPkv0dUCcpM61JpKqRhPUA0YBlGJGF1p9zrc2a7fxmwt31UOGFVk4qSdZ2UIMczCuSEy/D6Trp/fl8x2g==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core-constants': 2.0.2
+ '@remirror/core-helpers': 3.0.0
+ prosemirror-collab: 1.3.1
+ prosemirror-commands: 1.5.2
+ prosemirror-dropcursor: 1.8.1
+ prosemirror-gapcursor: 1.3.2
+ prosemirror-history: 1.4.0
+ prosemirror-inputrules: 1.4.0
+ prosemirror-keymap: 1.2.2
+ prosemirror-model: 1.19.4
+ prosemirror-paste-rules: 2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3)
+ prosemirror-schema-list: 1.3.0
+ prosemirror-state: 1.4.3
+ prosemirror-suggest: 2.0.6(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3)
+ prosemirror-tables: 1.3.7
+ prosemirror-trailing-node: 2.0.8(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3)
+ prosemirror-transform: 1.8.0
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /@remirror/preset-core@2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-Qg5kDJIoSqSCtqwuT/+xq1pXf5XHonnqE4oRL5Z7Tu9RRmQ6evMhdc6CqehP5xwI+52g7q9CCRQYyNAtAhS3LQ==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.5
dependencies:
'@babel/runtime': 7.24.0
- '@radix-ui/rect': 1.0.1
- '@types/react': 18.2.64
- react: 18.2.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-doc': 2.1.5(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-gap-cursor': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-history': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-paragraph': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
dev: false
- /@radix-ui/react-use-size@1.0.1(@types/react@18.2.64)(react@18.2.0):
- resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
+ /@remirror/preset-formatting@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-Dn8AITrTycEsO3kmR3kiWE8tCjWQUmK4vvyE/aGTyvHQHsDt1KhK6X42os7D+ePxeRf4OkhaZJhdpVmujmCCUw==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@remirror/pm': ^2.0.5
dependencies:
'@babel/runtime': 7.24.0
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0)
- '@types/react': 18.2.64
- react: 18.2.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-bold': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-columns': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-font-size': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-heading': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-italic': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-node-formatting': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-strike': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-sub': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-sup': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-case': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-color': 2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-highlight': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-underline': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-whitespace': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/pm': 2.0.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
dev: false
- /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
+ /@remirror/preset-wysiwyg@2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-yYDfHy3WJzBmYkTd1R8WgY0xND4ZhSOQSmWWxYcCb9QJOWqeX/LREk6Ac+FV2Ygc+aoRGx5HI2R6POehe1fb5g==}
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
+ '@remirror/pm': ^2.0.5
dependencies:
'@babel/runtime': 7.24.0
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0)(react@18.2.0)
- '@types/react': 18.2.64
- '@types/react-dom': 18.2.21
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-bidi': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-blockquote': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-bold': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-code': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-code-block': 2.0.18(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-drop-cursor': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-embed': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-gap-cursor': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-hard-break': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-heading': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-horizontal-rule': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-image': 2.1.10(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-italic': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-link': 2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-list': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-search': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-shortcuts': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-strike': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-trailing-node': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-underline': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/pm': 2.0.8
+ '@remirror/preset-core': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ transitivePeerDependencies:
+ - '@types/node'
+ - '@types/prettier'
+ - jsdom
+ - prettier
+ - supports-color
dev: false
- /@radix-ui/rect@1.0.1:
- resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
+ /@remirror/theme@2.0.9(@remirror/pm@2.0.8):
+ resolution: {integrity: sha512-MI6j7C9KImVyfSBh9GR/WQCuLQKXRKQkE0HsS8Sc/BC8a/0n4QTt7dAg5/a/+MbakyymNaGlibCdts8URgGStg==}
dependencies:
'@babel/runtime': 7.24.0
+ '@linaria/core': 4.2.10
+ '@remirror/core-types': 2.0.5(@remirror/pm@2.0.8)
+ color2k: 2.0.3
+ csstype: 3.1.3
+ transitivePeerDependencies:
+ - '@remirror/pm'
+ - supports-color
dev: false
- /@react-hook/media-query@1.1.1(react@18.2.0):
- resolution: {integrity: sha512-VM14wDOX5CW5Dn6b2lTiMd79BFMTut9AZj2+vIRT3LCKgMCYmdqruTtzDPSnIVDQdtxdPgtOzvU9oK20LopuOw==}
- peerDependencies:
- react: '>=16.8'
+ /@remirror/types@1.0.1:
+ resolution: {integrity: sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==}
dependencies:
- react: 18.2.0
+ type-fest: 2.19.0
dev: false
/@remix-run/router@1.15.3:
@@ -1553,6 +3163,45 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: true
+ /@svgmoji/blob@3.2.0:
+ resolution: {integrity: sha512-N96WOrH9GxPSPZ/FuvZl6T9Rh54stAEuUcBppIRFh9/WwkU7Hczrjabw4uunwxFLX5TgR+rHlKJl3/jaTnXJrQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@svgmoji/core': 3.2.0
+ dev: false
+
+ /@svgmoji/core@3.2.0:
+ resolution: {integrity: sha512-QsD78Op3S/5kUVsa5ierr4Wu/xwAdYuMI3Zmc/Y2ekYBEMGEUY8QxilXQRSAQ4ku4PnNV4xlB9e7xhD5hy113A==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ emojibase: 5.2.0
+ emojibase-regex: 5.1.3
+ idb-keyval: 5.1.5
+ match-sorter: 6.3.4
+ type-fest: 1.4.0
+ dev: false
+
+ /@svgmoji/noto@3.2.0:
+ resolution: {integrity: sha512-JgtNciB06hMDI1Pb1N2IgLh44XRMZUUNwBANzjY5jXTPqOCu1A1VA35ENvUsRhEUZOm8I+hbdAEHkwMVqxLeIQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@svgmoji/core': 3.2.0
+ dev: false
+
+ /@svgmoji/openmoji@3.2.0:
+ resolution: {integrity: sha512-USHbG+O80HfmdoNAHbOnlO+2gppXJfHFWKSRFj53Th4aimWEx4/9MB3cFbC3KZ1NOqXaLBq9jDaw4vFuGDVTUQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@svgmoji/core': 3.2.0
+ dev: false
+
+ /@svgmoji/twemoji@3.2.0:
+ resolution: {integrity: sha512-6xqZgh9viFDKf5wvrxw56ImCR3Ni84IqwK45lxojOe1Gc1Mni1GpPfr4gb7WHDKjumfx+K7BHSvX0KXt3Nr3CQ==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@svgmoji/core': 3.2.0
+ dev: false
+
/@swc/core-darwin-arm64@1.4.8:
resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==}
engines: {node: '>=10'}
@@ -1711,6 +3360,19 @@ packages:
resolution: {integrity: sha512-ToaeMtK5S4YaxCywAlYexc7KPFN0esjyTZ4vXzJhXEWAkro9iHgh7m/4ozPJb7oTo65WkHWX0W9GjcZbInSD8w==}
engines: {node: '>=12'}
+ /@tanstack/query-core@5.28.6:
+ resolution: {integrity: sha512-hnhotV+DnQtvtR3jPvbQMPNMW4KEK0J4k7c609zJ8muiNknm+yoDyMHmxTWM5ZnlZpsz0zOxYFr+mzRJNHWJsA==}
+ dev: false
+
+ /@tanstack/react-query@5.28.6(react@18.2.0):
+ resolution: {integrity: sha512-/DdYuDBSsA21Qbcder1R8Cr/3Nx0ZnA2lgtqKsLMvov8wL4+g0HBz/gWYZPlIsof7iyfQafyhg4wUVUsS3vWZw==}
+ peerDependencies:
+ react: ^18.0.0
+ dependencies:
+ '@tanstack/query-core': 5.28.6
+ react: 18.2.0
+ dev: false
+
/@tanstack/react-router@1.20.1(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-WpWZ4rYC+L3DHCB4+lo9HPVoNkUy4yN9QL+1Z8QSYeUKG0ZAydrqUnL48YBKdSh3bp8FRh09R+74DTP0/lvxAw==}
engines: {node: '>=12'}
@@ -1736,6 +3398,18 @@ packages:
react-dom: 18.2.0(react@18.2.0)
use-sync-external-store: 1.2.0(react@18.2.0)
+ /@tanstack/react-table@8.14.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-l9iwO99oz/azy5RT5VkVRsHHuy7o//fiXgLxzl3fad8qf7Bj+9ihsfmE6Q+BNjH4wHbxZkahwxtb3ngGq9FQxA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+ dependencies:
+ '@tanstack/table-core': 8.14.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@tanstack/router-cli@1.20.0:
resolution: {integrity: sha512-4XK2yIikDzFcJMgiSvgk8ONLSOg3T6Jdv/obuLdiignfTPf3VcaJH7U+wGq8AZCyw9ZaGdL/BpwNWG38BNcTaA==}
engines: {node: '>=12'}
@@ -1781,23 +3455,72 @@ packages:
/@tanstack/store@0.1.3:
resolution: {integrity: sha512-GnolmC8Fr4mvsHE1fGQmR3Nm0eBO3KnZjDU0a+P3TeQNM/dDscFGxtA7p31NplQNW3KwBw4t1RVFmz0VeKLxcw==}
+ /@tanstack/table-core@8.14.0:
+ resolution: {integrity: sha512-wDhpKJahGHWhmRt4RxtV3pES63CoeadljGWS/xeS9OJr1HBl2NB+OO44ht3sxDH5j5TRDAbQzC0NvSlsUfn7lQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /@types/codemirror@5.60.15:
+ resolution: {integrity: sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==}
+ dependencies:
+ '@types/tern': 0.23.9
+ dev: false
+
+ /@types/direction@1.0.0:
+ resolution: {integrity: sha512-et1wmqXm/5smJ8lTJfBnwD12/2Y7eVJLKbuaRT0h2xaKAoo1h8Dz2Io22GObDLFwxY1ddXRTLH3Gq5v44Fl/2w==}
+ dev: false
+
/@types/estree@1.0.5:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
- dev: true
+
+ /@types/hast@2.3.10:
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+ dependencies:
+ '@types/unist': 2.0.10
+ dev: false
/@types/json-schema@7.0.15:
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
dev: true
+ /@types/marked@4.3.2:
+ resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==}
+ dev: false
+
+ /@types/min-document@2.19.2:
+ resolution: {integrity: sha512-nsNPWMSTapqOMR6/fSka9W77q5JdxaWkx3bSmzvQv2dvEI/VIWYrVmcoFY3j1YTPQK7buYdY6LqsUrQlsAGmaw==}
+ dev: false
+
/@types/node@20.11.29:
resolution: {integrity: sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==}
dependencies:
undici-types: 5.26.5
- dev: true
+
+ /@types/object.omit@3.0.3:
+ resolution: {integrity: sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew==}
+ dev: false
+
+ /@types/object.pick@1.3.4:
+ resolution: {integrity: sha512-5PjwB0uP2XDp3nt5u5NJAG2DORHIRClPzWT/TTZhJ2Ekwe8M5bA9tvPdi9NO/n2uvu2/ictat8kgqvLfcIE1SA==}
+ dev: false
+
+ /@types/prismjs@1.26.3:
+ resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==}
+ dev: false
/@types/prop-types@15.7.11:
resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
+ /@types/querystringify@2.0.2:
+ resolution: {integrity: sha512-7d6OQK6pJ//zE32XLK3vI6GHYhBDcYooaRco9cKFGNu59GVatL5+u7rkiAViq44DxDTd/7QQNBWSDHfJGBz/Pw==}
+ dev: false
+
+ /@types/react-copy-to-clipboard@5.0.7:
+ resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==}
+ dependencies:
+ '@types/react': 18.2.64
+ dev: true
+
/@types/react-dom@18.2.21:
resolution: {integrity: sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==}
dependencies:
@@ -1810,6 +3533,12 @@ packages:
'@types/scheduler': 0.16.8
csstype: 3.1.3
+ /@types/refractor@3.4.1:
+ resolution: {integrity: sha512-wYuorIiCTSuvRT9srwt+taF6mH/ww+SyN2psM0sjef2qW+sS8GmshgDGTEDgWB1sTVGgYVE6EK7dBA2MxQxibg==}
+ dependencies:
+ '@types/prismjs': 1.26.3
+ dev: false
+
/@types/scheduler@0.16.8:
resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
@@ -1817,6 +3546,24 @@ packages:
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
dev: true
+ /@types/tern@0.23.9:
+ resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==}
+ dependencies:
+ '@types/estree': 1.0.5
+ dev: false
+
+ /@types/throttle-debounce@2.1.0:
+ resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==}
+ dev: false
+
+ /@types/turndown@5.0.4:
+ resolution: {integrity: sha512-28GI33lCCkU4SGH1GvjDhFgOVr+Tym4PXGBIU1buJUa6xQolniPArtUT+kv42RR2N9MsMLInkr904Aq+ESHBJg==}
+ dev: false
+
+ /@types/unist@2.0.10:
+ resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
+ dev: false
+
/@typescript-eslint/eslint-plugin@7.1.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.2.2):
resolution: {integrity: sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==}
engines: {node: ^16.0.0 || >=18.0.0}
@@ -2054,6 +3801,13 @@ packages:
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
engines: {node: '>=12'}
+ /ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: false
+
/ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -2118,6 +3872,17 @@ packages:
postcss-value-parser: 4.2.0
dev: true
+ /babel-merge@3.0.0(@babel/core@7.24.3):
+ resolution: {integrity: sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.24.3
+ deepmerge: 2.2.1
+ object.omit: 3.0.0
+ dev: false
+
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -2152,7 +3917,6 @@ packages:
electron-to-chromium: 1.4.709
node-releases: 2.0.14
update-browserslist-db: 1.0.13(browserslist@4.23.0)
- dev: true
/cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
@@ -2170,7 +3934,11 @@ packages:
/caniuse-lite@1.0.30001599:
resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==}
- dev: true
+
+ /case-anything@2.1.13:
+ resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==}
+ engines: {node: '>=12.13'}
+ dev: false
/chai@4.4.1:
resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
@@ -2185,6 +3953,15 @@ packages:
type-detect: 4.0.8
dev: true
+ /chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: false
+
/chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -2193,6 +3970,18 @@ packages:
supports-color: 7.2.0
dev: true
+ /character-entities-legacy@1.1.4:
+ resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+ dev: false
+
+ /character-entities@1.2.4:
+ resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+ dev: false
+
+ /character-reference-invalid@1.1.4:
+ resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+ dev: false
+
/check-error@1.0.3:
resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
dependencies:
@@ -2237,15 +4026,37 @@ packages:
resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
engines: {node: '>=6'}
+ /codemirror@5.65.16:
+ resolution: {integrity: sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==}
+ dev: false
+
+ /color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: false
+
/color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
dependencies:
color-name: 1.1.4
+ /color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: false
+
/color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ /color2k@2.0.3:
+ resolution: {integrity: sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==}
+ dev: false
+
+ /comma-separated-tokens@1.0.8:
+ resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
+ dev: false
+
/commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
@@ -2254,6 +4065,16 @@ packages:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ dev: false
+
+ /copy-to-clipboard@3.3.3:
+ resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+ dependencies:
+ toggle-selection: 1.0.6
+ dev: false
+
/cross-fetch@4.0.0:
resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
dependencies:
@@ -2270,6 +4091,12 @@ packages:
shebang-command: 2.0.0
which: 2.0.2
+ /css-in-js-utils@3.1.0:
+ resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+ dependencies:
+ hyphenate-style-name: 1.0.4
+ dev: false
+
/cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
@@ -2278,6 +4105,10 @@ packages:
/csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ /dash-get@1.0.2:
+ resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==}
+ dev: false
+
/date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -2299,7 +4130,6 @@ packages:
optional: true
dependencies:
ms: 2.1.2
- dev: true
/deep-eql@4.1.3:
resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
@@ -2312,6 +4142,16 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
+ /deepmerge@2.2.1:
+ resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/destr@2.0.3:
resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
dev: false
@@ -2335,6 +4175,11 @@ packages:
path-type: 4.0.0
dev: true
+ /direction@1.0.4:
+ resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==}
+ hasBin: true
+ dev: false
+
/dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
@@ -2345,12 +4190,19 @@ packages:
esutils: 2.0.3
dev: true
+ /dom-walk@0.1.2:
+ resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
+ dev: false
+
+ /domino@2.1.6:
+ resolution: {integrity: sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==}
+ dev: false
+
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
/electron-to-chromium@1.4.709:
resolution: {integrity: sha512-ixj1cyHrKqmdXF5CeHDSLbO0KRuOE1BHdCYKbcRA04dPLaKu8Vi7JDK5KLnGrfD6WxKcSEGm9gtHR4MqBq8gmg==}
- dev: true
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -2358,6 +4210,30 @@ packages:
/emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ /emojibase-data@6.2.0(emojibase@6.1.0):
+ resolution: {integrity: sha512-SWKaXD2QeQs06IE7qfJftsI5924Dqzp+V9xaa5RzZIEWhmlrG6Jt2iKwfgOPHu+5S8MEtOI7GdpKsXj46chXOw==}
+ peerDependencies:
+ emojibase: '*'
+ dependencies:
+ emojibase: 6.1.0
+ dev: false
+
+ /emojibase-regex@5.1.3:
+ resolution: {integrity: sha512-gT8T9LxLA8VJdI+8KQtyykB9qKzd7WuUL3M2yw6y9tplFeufOUANg3UKVaKUvkMcRNvZsSElWhxcJrx8WPE12g==}
+ dev: false
+
+ /emojibase-regex@6.0.1:
+ resolution: {integrity: sha512-Mj1UT6IIk4j91yMFE0QetpUYcmsr5ZDkkOIMSGafhIgC086mBMaCh2Keaykx8YEllmV7hmx5zdANDzCYBYAVDw==}
+ dev: false
+
+ /emojibase@5.2.0:
+ resolution: {integrity: sha512-5T02oTJaWpScAtYbukKVc8vQ1367MyfVtFHUMoOVZ9/r1kFcbYqjSktD56TICBAeyW9uc1t+7qQuXEtntM6p5A==}
+ dev: false
+
+ /emojibase@6.1.0:
+ resolution: {integrity: sha512-1GkKJPXP6tVkYJHOBSJHoGOr/6uaDxZ9xJ6H7m6PfdGXTmQgbALHLWaVRY4Gi/qf5x/gT/NUXLPuSHYLqtLtrQ==}
+ dev: false
+
/esbuild@0.19.12:
resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
engines: {node: '>=12'}
@@ -2392,12 +4268,15 @@ packages:
/escalade@3.1.2:
resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'}
- dev: true
+
+ /escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: false
/escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- dev: true
/eslint-plugin-react-hooks@4.6.0(eslint@8.57.0):
resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
@@ -2530,9 +4409,12 @@ packages:
strip-final-newline: 3.0.0
dev: true
+ /extract-domain@2.2.1:
+ resolution: {integrity: sha512-lOq1adCJha0tFFBci4quxC4XLa6+Rs2WgAwTo9qbO9OsElvJmGgCvOzmHo/yg5CiqeP4+sHjkXYGkrCcIEprMg==}
+ dev: false
+
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- dev: true
/fast-glob@3.3.2:
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
@@ -2580,7 +4462,6 @@ packages:
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
- dev: true
/flat-cache@3.2.0:
resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
@@ -2620,11 +4501,25 @@ packages:
/function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
/get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
dev: true
+ /get-dom-document@0.1.3:
+ resolution: {integrity: sha512-bZ0O00gSQgMo+wz7gU6kbbWCPh4dfDsL9ZOmVhA8TOXszl5GV56TpTuW1/Qq/QctgpjK56yyvB1vBO+wzz8Szw==}
+ peerDependencies:
+ jsdom: '*'
+ peerDependenciesMeta:
+ jsdom:
+ optional: true
+ dev: false
+
/get-func-name@2.0.2:
resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
dev: true
@@ -2673,6 +4568,11 @@ packages:
path-is-absolute: 1.0.1
dev: true
+ /globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+ dev: false
+
/globals@13.24.0:
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'}
@@ -2708,6 +4608,11 @@ packages:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
dev: true
+ /has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: false
+
/has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -2719,6 +4624,20 @@ packages:
dependencies:
function-bind: 1.1.2
+ /hast-util-parse-selector@2.2.5:
+ resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
+ dev: false
+
+ /hastscript@6.0.0:
+ resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 1.0.8
+ hast-util-parse-selector: 2.2.5
+ property-information: 5.6.0
+ space-separated-tokens: 1.1.5
+ dev: false
+
/html-parse-stringify@3.0.1:
resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
dependencies:
@@ -2730,6 +4649,10 @@ packages:
engines: {node: '>=16.17.0'}
dev: true
+ /hyphenate-style-name@1.0.4:
+ resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==}
+ dev: false
+
/i18next-browser-languagedetector@7.2.0:
resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==}
dependencies:
@@ -2750,6 +4673,12 @@ packages:
'@babel/runtime': 7.24.0
dev: false
+ /idb-keyval@5.1.5:
+ resolution: {integrity: sha512-J1utxYWQokYjy01LvDQ7WmiAtZCGUSkVi9EIBfUSyLOr/BesnMIxNGASTh9A1LzeISSjSqEPsfFdTss7EE7ofQ==}
+ dependencies:
+ safari-14-idb-fix: 1.0.6
+ dev: false
+
/ignore@5.3.1:
resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
engines: {node: '>= 4'}
@@ -2785,6 +4714,17 @@ packages:
loose-envify: 1.4.0
dev: false
+ /is-alphabetical@1.0.4:
+ resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+ dev: false
+
+ /is-alphanumerical@1.0.4:
+ resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+ dependencies:
+ is-alphabetical: 1.0.4
+ is-decimal: 1.0.4
+ dev: false
+
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
@@ -2796,10 +4736,28 @@ packages:
dependencies:
hasown: 2.0.2
+ /is-decimal@1.0.4:
+ resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+ dev: false
+
+ /is-extendable@1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ dev: false
+
/is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
+ /is-finite@1.0.2:
+ resolution: {integrity: sha512-e+gU0KGrlbqjEcV80SAqg4g7PQYOm3/IrdwAJ+kPwHqGhLKhtuTJGGxGtrsc8RXlHt2A8Vlnv+79Vq2B1GQasg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ number-is-nan: 1.0.1
+ dev: false
+
/is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -2808,7 +4766,17 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
dependencies:
- is-extglob: 2.1.1
+ is-extglob: 2.1.1
+
+ /is-hexadecimal@1.0.4:
+ resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
+ dev: false
+
+ /is-integer@1.0.7:
+ resolution: {integrity: sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==}
+ dependencies:
+ is-finite: 1.0.2
+ dev: false
/is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
@@ -2819,6 +4787,13 @@ packages:
engines: {node: '>=8'}
dev: true
+ /is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: false
+
/is-stream@3.0.0:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -2827,6 +4802,15 @@ packages:
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ /isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /isomorphic.js@0.2.5:
+ resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==}
+ dev: false
+
/jackspeak@2.3.6:
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
engines: {node: '>=14'}
@@ -2839,6 +4823,10 @@ packages:
resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
hasBin: true
+ /js-sha256@0.10.1:
+ resolution: {integrity: sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==}
+ dev: false
+
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -2853,6 +4841,12 @@ packages:
argparse: 2.0.1
dev: true
+ /jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
dev: true
@@ -2865,6 +4859,12 @@ packages:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
dev: true
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: false
+
/jsonc-parser@3.2.1:
resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
dev: true
@@ -2883,6 +4883,14 @@ packages:
type-check: 0.4.0
dev: true
+ /lib0@0.2.93:
+ resolution: {integrity: sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ isomorphic.js: 0.2.5
+ dev: false
+
/lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
@@ -2907,7 +4915,6 @@ packages:
engines: {node: '>=10'}
dependencies:
p-locate: 5.0.0
- dev: true
/lodash.castarray@4.4.0:
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
@@ -2920,6 +4927,10 @@ packages:
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ dev: false
+
/loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
@@ -2936,6 +4947,12 @@ packages:
resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
engines: {node: 14 || >=16.14}
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ dependencies:
+ yallist: 3.1.1
+ dev: false
+
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
@@ -2958,6 +4975,27 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
+ /make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: false
+
+ /make-plural@6.2.2:
+ resolution: {integrity: sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==}
+ dev: false
+
+ /marked@4.3.0:
+ resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
+ engines: {node: '>= 12'}
+ hasBin: true
+ dev: false
+
+ /match-sorter@6.3.4:
+ resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ remove-accents: 0.5.0
+ dev: false
+
/merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
dev: true
@@ -2978,6 +5016,12 @@ packages:
engines: {node: '>=12'}
dev: true
+ /min-document@2.19.0:
+ resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
+ dependencies:
+ dom-walk: 0.1.2
+ dev: false
+
/mini-svg-data-uri@1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
hasBin: true
@@ -3008,6 +5052,14 @@ packages:
ufo: 1.5.2
dev: true
+ /monaco-editor@0.47.0:
+ resolution: {integrity: sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==}
+ dev: false
+
+ /moo@0.5.2:
+ resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
+ dev: false
+
/mrmime@2.0.0:
resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
engines: {node: '>=10'}
@@ -3015,7 +5067,6 @@ packages:
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
- dev: true
/mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
@@ -3024,6 +5075,11 @@ packages:
object-assign: 4.1.1
thenify-all: 1.6.0
+ /nanoevents@5.1.13:
+ resolution: {integrity: sha512-JFAeG9fp0QZnRoESHjkbVFbZ9BkOXkkagUVwZVo/pkSX+Fq1VKlY+5og/8X9CYc6C7vje/CV+bwJ5M2X0+IY9Q==}
+ engines: {node: '>=6.0.0'}
+ dev: false
+
/nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -3061,7 +5117,6 @@ packages:
/node-releases@2.0.14:
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
- dev: true
/normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -3079,6 +5134,11 @@ packages:
path-key: 4.0.0
dev: true
+ /number-is-nan@1.0.1:
+ resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -3087,6 +5147,20 @@ packages:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
+ /object.omit@3.0.0:
+ resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 1.0.1
+ dev: false
+
+ /object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: false
+
/ofetch@1.3.3:
resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==}
dependencies:
@@ -3120,12 +5194,15 @@ packages:
type-check: 0.4.0
dev: true
+ /orderedmap@2.1.1:
+ resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==}
+ dev: false
+
/p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
dependencies:
yocto-queue: 0.1.0
- dev: true
/p-limit@5.0.0:
resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
@@ -3139,7 +5216,6 @@ packages:
engines: {node: '>=10'}
dependencies:
p-limit: 3.1.0
- dev: true
/parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
@@ -3148,10 +5224,29 @@ packages:
callsites: 3.1.0
dev: true
+ /parenthesis@3.1.8:
+ resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==}
+ dev: false
+
+ /parse-entities@2.0.0:
+ resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+ dependencies:
+ character-entities: 1.2.4
+ character-entities-legacy: 1.1.4
+ character-reference-invalid: 1.1.4
+ is-alphanumerical: 1.0.4
+ is-decimal: 1.0.4
+ is-hexadecimal: 1.0.4
+ dev: false
+
+ /parse-exponential@1.0.1:
+ resolution: {integrity: sha512-QUa7PaOc7O6ei3hb0NmADJGrDYLbPBdcSKFUBGfwlMdHsrg8LOsliPEkpP0qHSKQOyzyyxCB00fxJKcP75Gl7w==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
- dev: true
/path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
@@ -3284,6 +5379,14 @@ packages:
picocolors: 1.0.0
source-map-js: 1.1.0
+ /precision@1.0.1:
+ resolution: {integrity: sha512-cBMxnM2nzEF1xx75NhhOaKjsDNt92WUZv17t/p3wrvCfA+2RL0twbgfvXvgDbxxsfUUb5C5he5tla8Xa2ny1Ew==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-finite: 1.0.2
+ parse-exponential: 1.0.1
+ dev: false
+
/prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -3304,14 +5407,208 @@ packages:
react-is: 18.2.0
dev: true
+ /prismjs@1.27.0:
+ resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+ dev: false
+
+ /property-information@5.6.0:
+ resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
+ dependencies:
+ xtend: 4.0.2
+ dev: false
+
+ /prosemirror-collab@1.3.1:
+ resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==}
+ dependencies:
+ prosemirror-state: 1.4.3
+ dev: false
+
+ /prosemirror-commands@1.5.2:
+ resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==}
+ dependencies:
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ dev: false
+
+ /prosemirror-dropcursor@1.8.1:
+ resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==}
+ dependencies:
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-gapcursor@1.3.2:
+ resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==}
+ dependencies:
+ prosemirror-keymap: 1.2.2
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-history@1.4.0:
+ resolution: {integrity: sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==}
+ dependencies:
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ prosemirror-view: 1.33.3
+ rope-sequence: 1.3.4
+ dev: false
+
+ /prosemirror-inputrules@1.4.0:
+ resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==}
+ dependencies:
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ dev: false
+
+ /prosemirror-keymap@1.2.2:
+ resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==}
+ dependencies:
+ prosemirror-state: 1.4.3
+ w3c-keyname: 2.2.8
+ dev: false
+
+ /prosemirror-model@1.19.4:
+ resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==}
+ dependencies:
+ orderedmap: 2.1.1
+ dev: false
+
+ /prosemirror-paste-rules@2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3):
+ resolution: {integrity: sha512-0vQ+S8wksW1c9W88pzNEg3T4XHihl1QJy+i8fuF2HpCEkNkKM44P8x71XKh8QBdANuGQynDVKCVJRCvJfB5F4g==}
+ peerDependencies:
+ prosemirror-model: ^1.19.0
+ prosemirror-state: ^1.4.2
+ prosemirror-view: ^1.31.2
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core-constants': 2.0.2
+ '@remirror/core-helpers': 3.0.0
+ escape-string-regexp: 4.0.0
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-resizable-view@2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-TgCaOWaMdR/R34AYsxHtHuQlC9rtHTuSBEgcmD5V9ldVe1+Ul72xz9G73xo9wLhVpTwt3YxzpenTcRWPZIofow==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core-helpers': 3.0.0
+ '@remirror/core-utils': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ prosemirror-model: 1.19.4
+ prosemirror-view: 1.33.3
+ transitivePeerDependencies:
+ - '@remirror/pm'
+ - '@types/node'
+ - jsdom
+ dev: false
+
+ /prosemirror-schema-list@1.3.0:
+ resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==}
+ dependencies:
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ dev: false
+
+ /prosemirror-state@1.4.3:
+ resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==}
+ dependencies:
+ prosemirror-model: 1.19.4
+ prosemirror-transform: 1.8.0
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-suggest@2.0.6(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3):
+ resolution: {integrity: sha512-plcfFPyLFQ/egCn6DR+Ml3ONFhO+tR3Wt3yO5aJo6dnhoyudKiRQsf0rgQDPoWBPc8L7l9opUfDWFXHrDQYvkg==}
+ peerDependencies:
+ prosemirror-model: ^1.19.0
+ prosemirror-state: ^1.4.2
+ prosemirror-view: ^1.31.2
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core-constants': 2.0.2
+ '@remirror/core-helpers': 3.0.0
+ '@remirror/types': 1.0.1
+ escape-string-regexp: 4.0.0
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-tables@1.3.7:
+ resolution: {integrity: sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA==}
+ dependencies:
+ prosemirror-keymap: 1.2.2
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-trailing-node@2.0.8(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3):
+ resolution: {integrity: sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA==}
+ peerDependencies:
+ prosemirror-model: ^1.19.0
+ prosemirror-state: ^1.4.2
+ prosemirror-view: ^1.31.2
+ dependencies:
+ '@remirror/core-constants': 2.0.2
+ escape-string-regexp: 4.0.0
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.33.3
+ dev: false
+
+ /prosemirror-transform@1.8.0:
+ resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==}
+ dependencies:
+ prosemirror-model: 1.19.4
+ dev: false
+
+ /prosemirror-view@1.33.3:
+ resolution: {integrity: sha512-P4Ao/bc4OrU/2yLIf8dL4lJaEtjLR3QjIvQHgJYp2jUS7kYM4bSR6okbBjkqzOs/FwUon6UGjTLdKMnPL1MZqw==}
+ dependencies:
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-transform: 1.8.0
+ dev: false
+
/punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
dev: true
+ /querystringify@2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+ dev: false
+
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ /react-copy-to-clipboard@5.1.0(react@18.2.0):
+ resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==}
+ peerDependencies:
+ react: ^15.3.0 || 16 || 17 || 18
+ dependencies:
+ copy-to-clipboard: 3.3.3
+ prop-types: 15.8.1
+ react: 18.2.0
+ dev: false
+
/react-dom@18.2.0(react@18.2.0):
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies:
@@ -3350,6 +5647,10 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ dev: false
+
/react-is@18.2.0:
resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
dev: true
@@ -3416,6 +5717,16 @@ packages:
tslib: 2.6.2
dev: false
+ /react-use-websocket@4.8.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-FTXuG5O+LFozmu1BRfrzl7UIQngECvGJmL7BHsK4TYXuVt+mCizVA8lT0hGSIF0Z0TedF7bOo1nRzOUdginhDw==}
+ peerDependencies:
+ react: '>= 18.0.0'
+ react-dom: '>= 18.0.0'
+ 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'}
@@ -3433,9 +5744,107 @@ packages:
dependencies:
picomatch: 2.3.1
+ /refractor@3.6.0:
+ resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
+ dependencies:
+ hastscript: 6.0.0
+ parse-entities: 2.0.0
+ prismjs: 1.27.0
+ dev: false
+
/regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+ /remirror@2.0.39(@remirror/pm@2.0.8)(@types/node@20.11.29):
+ resolution: {integrity: sha512-H3hHIPVKrWINR/1ITNAFYAD74gGt6Dni7soEHcaCH/gnBWvCkruJk0sAt1gI/l+kpmZdScqz9TJnS1x5A8u5aw==}
+ peerDependencies:
+ '@remirror/pm': ^2.0.8
+ '@types/prettier': ^2.7.2
+ prettier: ^2.8.8
+ peerDependenciesMeta:
+ '@types/prettier':
+ optional: true
+ prettier:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/core-constants': 2.0.2
+ '@remirror/core-helpers': 3.0.0
+ '@remirror/core-types': 2.0.5(@remirror/pm@2.0.8)
+ '@remirror/core-utils': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/dom': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-annotation': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-bidi': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-blockquote': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-bold': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-callout': 2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-code': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-code-block': 2.0.18(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-codemirror5': 2.0.13(@remirror/pm@2.0.8)(@types/codemirror@5.60.15)(@types/node@20.11.29)(codemirror@5.65.16)
+ '@remirror/extension-collaboration': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-columns': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-diff': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-doc': 2.1.5(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-drop-cursor': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-embed': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-emoji': 2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-entity-reference': 2.2.6(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-epic-mode': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-events': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-font-family': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-font-size': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-gap-cursor': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-hard-break': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-heading': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-history': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-horizontal-rule': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-image': 2.1.10(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-italic': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-link': 2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-list': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-markdown': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-mention': 2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-mention-atom': 2.0.17(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-node-formatting': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-paragraph': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-placeholder': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-search': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-shortcuts': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-strike': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-sub': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-sup': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-tables': 2.4.1(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-case': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-color': 2.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-text-highlight': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-trailing-node': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-underline': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-whitespace': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/extension-yjs': 3.0.15(@remirror/pm@2.0.8)(@types/node@20.11.29)(yjs@13.6.14)
+ '@remirror/icons': 2.0.3
+ '@remirror/pm': 2.0.8
+ '@remirror/preset-core': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/preset-formatting': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/preset-wysiwyg': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.11.29)
+ '@remirror/theme': 2.0.9(@remirror/pm@2.0.8)
+ '@types/codemirror': 5.60.15
+ '@types/refractor': 3.4.1
+ codemirror: 5.65.16
+ refractor: 3.6.0
+ yjs: 13.6.14
+ transitivePeerDependencies:
+ - '@types/node'
+ - jsdom
+ - supports-color
+ dev: false
+
+ /remove-accents@0.5.0:
+ resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
+ dev: false
+
/require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
@@ -3488,16 +5897,44 @@ packages:
fsevents: 2.3.3
dev: true
+ /rope-sequence@1.3.4:
+ resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==}
+ dev: false
+
+ /round-precision@1.0.0:
+ resolution: {integrity: sha512-L2a0XDSNeaaBTEGmzuENMK4T8c0HqKYeS3pCDurW4MRPo8O6LeCLqVPWUt5+xW9rrEcG9QaYrAFcApEFXKziyw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-finite: 1.0.2
+ is-integer: 1.0.7
+ dev: false
+
+ /round@2.0.1:
+ resolution: {integrity: sha512-wzT6PF3wNEd2PCLTBQxteheeSwViBrD89E1XZjl4sj505C4LwTpqOQSNXLEROHDQw35NoylYbMxoUhgf2hb4qw==}
+ dependencies:
+ precision: 1.0.1
+ round-precision: 1.0.0
+ dev: false
+
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
queue-microtask: 1.2.3
+ /safari-14-idb-fix@1.0.6:
+ resolution: {integrity: sha512-oTEQOdMwRX+uCtWCKT1nx2gAeSdpr8elg/2gcaKUH00SJU2xWESfkx11nmXwTRHy7xfQoj1o4TTQvdmuBosTnA==}
+ dev: false
+
/scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
loose-envify: 1.4.0
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+ dev: false
+
/semver@7.6.0:
resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
engines: {node: '>=10'}
@@ -3552,10 +5989,18 @@ packages:
resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==}
engines: {node: '>=0.10.0'}
+ /space-separated-tokens@1.1.5:
+ resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
+ dev: false
+
/stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
dev: true
+ /state-local@1.0.7:
+ resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+ dev: false
+
/std-env@3.7.0:
resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
dev: true
@@ -3604,6 +6049,10 @@ packages:
js-tokens: 8.0.3
dev: true
+ /style-mod@4.1.2:
+ resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
+ dev: false
+
/sucrase@3.35.0:
resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -3617,6 +6066,13 @@ packages:
pirates: 4.0.6
ts-interface-checker: 0.1.13
+ /supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: false
+
/supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3628,6 +6084,17 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
+ /svgmoji@3.2.0:
+ resolution: {integrity: sha512-tjmdQhIju2ZQ81FLBlPngg1aWMOhQjP9ErXb2ROikM0aBGA/hqI0/DN/5J0sDsXzJPHmODpSFhWfiSsUieU3bA==}
+ dependencies:
+ '@babel/runtime': 7.24.0
+ '@svgmoji/blob': 3.2.0
+ '@svgmoji/core': 3.2.0
+ '@svgmoji/noto': 3.2.0
+ '@svgmoji/openmoji': 3.2.0
+ '@svgmoji/twemoji': 3.2.0
+ dev: false
+
/tailwind-merge@2.2.2:
resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==}
dependencies:
@@ -3687,6 +6154,11 @@ packages:
dependencies:
any-promise: 1.3.0
+ /throttle-debounce@3.0.1:
+ resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
+ engines: {node: '>=10'}
+ dev: false
+
/tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
@@ -3707,12 +6179,21 @@ packages:
engines: {node: '>=14.0.0'}
dev: true
+ /to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+ dev: false
+
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
+ /toggle-selection@1.0.6:
+ resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+ dev: false
+
/totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
@@ -3751,6 +6232,16 @@ packages:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
dev: false
+ /turndown-plugin-gfm@1.0.2:
+ resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==}
+ dev: false
+
+ /turndown@7.1.3:
+ resolution: {integrity: sha512-Z3/iJ6IWh8VBiACWQJaA5ulPQE5E1QwvBHj00uGzdQxdRnd8fh1DPqNOJqzQDu6DkOstORrtXzf/9adB+vMtEA==}
+ dependencies:
+ domino: 2.1.6
+ dev: false
+
/type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@@ -3768,6 +6259,16 @@ packages:
engines: {node: '>=10'}
dev: true
+ /type-fest@1.4.0:
+ resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: false
+
/typescript@5.2.2:
resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
engines: {node: '>=14.17'}
@@ -3779,7 +6280,10 @@ packages:
/undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
- dev: true
+
+ /unraw@3.0.0:
+ resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==}
+ dev: false
/update-browserslist-db@1.0.13(browserslist@4.23.0):
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
@@ -3790,7 +6294,6 @@ packages:
browserslist: 4.23.0
escalade: 3.1.2
picocolors: 1.0.0
- dev: true
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -3989,6 +6492,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
+ /w3c-keyname@2.2.8:
+ resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+ dev: false
+
/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false
@@ -4036,11 +6543,48 @@ packages:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
dev: true
+ /xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+ dev: false
+
+ /y-prosemirror@1.2.3(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.3)(y-protocols@1.0.6)(yjs@13.6.14):
+ resolution: {integrity: sha512-0e9QB78hcAT3l+ml26x+f7K9xmP1tqHGzbKTfe+JuPpKFBLpr2NUwH7D+J7uKhtMAmOhHUMFtd7Zd2mNKyP2+A==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ peerDependencies:
+ prosemirror-model: ^1.7.1
+ prosemirror-state: ^1.2.3
+ prosemirror-view: ^1.9.10
+ y-protocols: ^1.0.1
+ yjs: ^13.5.38
+ dependencies:
+ lib0: 0.2.93
+ prosemirror-model: 1.19.4
+ prosemirror-state: 1.4.3
+ prosemirror-view: 1.33.3
+ y-protocols: 1.0.6(yjs@13.6.14)
+ yjs: 13.6.14
+ dev: false
+
+ /y-protocols@1.0.6(yjs@13.6.14):
+ resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ peerDependencies:
+ yjs: ^13.0.0
+ dependencies:
+ lib0: 0.2.93
+ yjs: 13.6.14
+ dev: false
+
/y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
dev: true
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ dev: false
+
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
@@ -4068,10 +6612,16 @@ packages:
yargs-parser: 21.1.1
dev: true
+ /yjs@13.6.14:
+ resolution: {integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==}
+ engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+ dependencies:
+ lib0: 0.2.93
+ dev: false
+
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- dev: true
/yocto-queue@1.0.0:
resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
diff --git a/dashboard/public/locales/en.json b/dashboard/public/locales/en.json
@@ -1,5 +1,7 @@
{
"name": "Name",
+ "status": "Status",
+ "address": "Address",
"users": "Users",
"nodes": "Nodes",
"services": "Services",
@@ -8,7 +10,23 @@
"password": "Password",
"submit": "Submit",
"login": "Login",
+ "edit": "Edit",
+ "actions": "Actions",
+ "settings": "Settings",
+ "logs": "Logs",
+ "config": "Config",
+ "open": "Open",
+ "delete": "Delete",
+ "port": "Port",
+ "create": "Create",
"page": {
+ "settings": {
+ "certificate": {
+ "copy": "Copy Certificate",
+ "error": "Certificate Unavailable",
+ "copied": "Certificate Copied"
+ }
+ },
"login": {
"username": {
"error": {
@@ -20,6 +38,67 @@
"is-required": "Password is required"
}
}
+ },
+ "nodes": {
+ "settings": {
+ "title": "Nodes Settings",
+ "detail": "Details",
+ "log-container": {
+ "title": "Marznode Xray config logs"
+ }
+ },
+ "dialogs": {
+ "creation": {
+ "title": "Nodes Creation"
+ },
+ "deletion": {
+ "title": "Nodes Deletion"
+ },
+ "edition": {
+ "title": "Nodes Edition"
+ }
+ },
+ "usage_coefficient": "Usage Coefficient",
+ "add_as_new_host": "Add as new hosts",
+ "events": {
+ "delete": {
+ "error": "Failed to delete {{name}}",
+ "success": {
+ "title": "{{name}} is successfuly deleted",
+ "desc": ""
+ }
+ },
+ "create": {
+ "error": "Failed to create {{name}}",
+ "success": {
+ "title": "{{name}} is successfuly created",
+ "desc": ""
+ }
+ },
+ "update": {
+ "error": "Failed to update {{name}}",
+ "success": {
+ "title": "{{name}} is successfuly updated",
+ "desc": ""
+ }
+ }
+ },
+ "certificate-alert": {
+ "title": "Nodes Certificate Configuration",
+ "desc": "If you aim to configure your nodes certificate, checkout settings page.",
+ "click": "Click Here"
+ }
}
+ },
+ "delete-confirmation": {
+ "title": "Are you sure of this?",
+ "desc": "This action cannot be undone. This will permanently delete your account and remove your data from our servers."
+ },
+ "table": {
+ "row-per-page": "Rows per page",
+ "no-result": "No results",
+ "selected": "Selected",
+ "toggle-column": "Toggle columns",
+ "filter-placeholder": "Filter {{name}}"
}
}
diff --git a/dashboard/src/components/data-table/actions-cell.tsx b/dashboard/src/components/data-table/actions-cell.tsx
@@ -0,0 +1,54 @@
+import {
+ OpenInNewWindowIcon,
+} from "@radix-ui/react-icons"
+import { Row } from "@tanstack/react-table"
+
+import {
+ Button,
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@marzneshin/components"
+import { MoreHorizontal, PencilIcon, TrashIcon } from "lucide-react"
+import { useTranslation } from "react-i18next"
+
+interface DataTableActionsCellProps<TData>
+ extends React.HTMLAttributes<HTMLDivElement> {
+ row: Row<TData>,
+ onDelete: (object: TData) => void,
+ onEdit: (object: TData) => void,
+ onOpen: (object: TData) => void,
+}
+
+export function DataTableActionsCell<TData>({
+ row, onDelete, onEdit, onOpen
+}: DataTableActionsCellProps<TData>) {
+ const { t } = useTranslation();
+
+ return (
+ <DropdownMenu>
+ <DropdownMenuTrigger asChild>
+ <Button variant="ghost" className="p-0 w-8 h-8">
+ <span className="sr-only">Open menu</span>
+ <MoreHorizontal className="w-4 h-4" />
+ </Button>
+ </DropdownMenuTrigger>
+ <DropdownMenuContent align="end">
+ <DropdownMenuLabel>{t('actions')}</DropdownMenuLabel>
+ <DropdownMenuItem onClick={() => onOpen(row.original)}>
+ <OpenInNewWindowIcon className="mr-1 w-4 h-4" /> {t('open')}
+ </DropdownMenuItem>
+ <DropdownMenuSeparator />
+ <DropdownMenuItem onClick={() => onEdit(row.original)}>
+ <PencilIcon className="mr-1 w-4 h-4" /> {t('edit')}
+ </DropdownMenuItem>
+ <DropdownMenuItem onClick={() => onDelete(row.original)} className="text-destructive">
+ <TrashIcon className="mr-1 w-4 h-4" />{t('delete')}
+ </DropdownMenuItem>
+ </DropdownMenuContent>
+ </DropdownMenu>
+ )
+}
diff --git a/dashboard/src/components/data-table/column-header.tsx b/dashboard/src/components/data-table/column-header.tsx
@@ -0,0 +1,72 @@
+
+import {
+ ArrowDownIcon,
+ ArrowUpIcon,
+ CaretSortIcon,
+ EyeNoneIcon,
+} from "@radix-ui/react-icons"
+import { Column } from "@tanstack/react-table"
+
+import {
+ Button,
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@marzneshin/components"
+import { cn } from "@marzneshin/utils"
+
+interface DataTableColumnHeaderProps<TData, TValue>
+ extends React.HTMLAttributes<HTMLDivElement> {
+ column: Column<TData, TValue>
+ title: string
+}
+
+export function DataTableColumnHeader<TData, TValue>({
+ column,
+ title,
+ className,
+}: DataTableColumnHeaderProps<TData, TValue>) {
+ if (!column.getCanSort()) {
+ return <div className={cn(className)}>{title}</div>
+ }
+
+ return (
+ <div className={cn("flex items-center space-x-2", className)}>
+ <DropdownMenu>
+ <DropdownMenuTrigger asChild>
+ <Button
+ variant="ghost"
+ size="sm"
+ className="-ml-3 h-8 data-[state=open]:bg-accent"
+ >
+ <span>{title}</span>
+ {column.getIsSorted() === "desc" ? (
+ <ArrowDownIcon className="ml-2 w-4 h-4" />
+ ) : column.getIsSorted() === "asc" ? (
+ <ArrowUpIcon className="ml-2 w-4 h-4" />
+ ) : (
+ <CaretSortIcon className="ml-2 w-4 h-4" />
+ )}
+ </Button>
+ </DropdownMenuTrigger>
+ <DropdownMenuContent align="start">
+ <DropdownMenuItem onClick={() => column.toggleSorting(false)}>
+ <ArrowUpIcon className="mr-2 w-3.5 h-3.5 text-muted-foreground/70" />
+ Asc
+ </DropdownMenuItem>
+ <DropdownMenuItem onClick={() => column.toggleSorting(true)}>
+ <ArrowDownIcon className="mr-2 w-3.5 h-3.5 text-muted-foreground/70" />
+ Desc
+ </DropdownMenuItem>
+ <DropdownMenuSeparator />
+ <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
+ <EyeNoneIcon className="mr-2 w-3.5 h-3.5 text-muted-foreground/70" />
+ Hide
+ </DropdownMenuItem>
+ </DropdownMenuContent>
+ </DropdownMenu>
+ </div>
+ )
+}
diff --git a/dashboard/src/components/data-table/index.ts b/dashboard/src/components/data-table/index.ts
@@ -0,0 +1,5 @@
+export * from './table'
+export * from './pagination'
+export * from './column-header'
+export * from './table-view-option'
+export * from './actions-cell'
diff --git a/dashboard/src/components/data-table/pagination.tsx b/dashboard/src/components/data-table/pagination.tsx
@@ -0,0 +1,99 @@
+import {
+ ChevronLeftIcon,
+ ChevronRightIcon,
+ DoubleArrowLeftIcon,
+ DoubleArrowRightIcon,
+} from "@radix-ui/react-icons"
+import { Table } from "@tanstack/react-table"
+
+import {
+ Button,
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@marzneshin/components"
+import { useTranslation } from "react-i18next"
+
+interface DataTablePaginationProps<TData> {
+ table: Table<TData>
+}
+
+export function DataTablePagination<TData>({
+ table,
+}: DataTablePaginationProps<TData>) {
+ const { t } = useTranslation();
+ return (
+ <div className="flex justify-between items-center p-2">
+ <div className="flex-1 text-sm text-muted-foreground">
+ {table.getFilteredSelectedRowModel().rows.length} {"/"}
+ {table.getFilteredRowModel().rows.length} {t('table.selected')}
+ </div>
+ <div className="flex items-center space-x-6 lg:space-x-8">
+ <div className="flex items-center space-x-2">
+ <p className="text-sm font-medium">{t('table.row-per-page')}</p>
+ <Select
+ value={`${table.getState().pagination.pageSize}`}
+ onValueChange={(value) => {
+ table.setPageSize(Number(value))
+ }}
+ >
+ <SelectTrigger className="h-8 w-[70px]">
+ <SelectValue placeholder={table.getState().pagination.pageSize} />
+ </SelectTrigger>
+ <SelectContent side="top">
+ {[10, 20, 30, 40, 50].map((pageSize) => (
+ <SelectItem key={pageSize} value={`${pageSize}`}>
+ {pageSize}
+ </SelectItem>
+ ))}
+ </SelectContent>
+ </Select>
+ </div>
+ <div className="flex justify-center items-center text-sm font-medium w-[100px]">
+ Page {table.getState().pagination.pageIndex + 1} of{" "}
+ {table.getPageCount()}
+ </div>
+ <div className="flex items-center space-x-2">
+ <Button
+ variant="outline"
+ className="hidden p-0 w-8 h-8 lg:flex"
+ onClick={() => table.setPageIndex(0)}
+ disabled={!table.getCanPreviousPage()}
+ >
+ <span className="sr-only">Go to first page</span>
+ <DoubleArrowLeftIcon className="w-4 h-4" />
+ </Button>
+ <Button
+ variant="outline"
+ className="p-0 w-8 h-8"
+ onClick={() => table.previousPage()}
+ disabled={!table.getCanPreviousPage()}
+ >
+ <span className="sr-only">Go to previous page</span>
+ <ChevronLeftIcon className="w-4 h-4" />
+ </Button>
+ <Button
+ variant="outline"
+ className="p-0 w-8 h-8"
+ onClick={() => table.nextPage()}
+ disabled={!table.getCanNextPage()}
+ >
+ <span className="sr-only">Go to next page</span>
+ <ChevronRightIcon className="w-4 h-4" />
+ </Button>
+ <Button
+ variant="outline"
+ className="hidden p-0 w-8 h-8 lg:flex"
+ onClick={() => table.setPageIndex(table.getPageCount() - 1)}
+ disabled={!table.getCanNextPage()}
+ >
+ <span className="sr-only">Go to last page</span>
+ <DoubleArrowRightIcon className="w-4 h-4" />
+ </Button>
+ </div>
+ </div>
+ </div>
+ )
+}
diff --git a/dashboard/src/components/data-table/table-view-option.tsx b/dashboard/src/components/data-table/table-view-option.tsx
@@ -0,0 +1,58 @@
+import { DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"
+import { MixerHorizontalIcon } from "@radix-ui/react-icons"
+import { Table } from "@tanstack/react-table"
+
+import {
+ Button,
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+} from "@marzneshin/components"
+import { useTranslation } from "react-i18next"
+
+interface DataTableViewOptionsProps<TData> {
+ table: Table<TData>
+}
+
+export function DataTableViewOptions<TData>({
+ table,
+}: DataTableViewOptionsProps<TData>) {
+ const { t } = useTranslation();
+ return (
+ <DropdownMenu>
+ <DropdownMenuTrigger asChild>
+ <Button
+ variant="outline"
+ className="ml-auto mr-2 lg:flex"
+ >
+ <MixerHorizontalIcon className="mr-2 w-4 h-4" />
+ View
+ </Button>
+ </DropdownMenuTrigger>
+ <DropdownMenuContent align="end" className="w-[150px]">
+ <DropdownMenuLabel>{t('table.toggle-column')}</DropdownMenuLabel>
+ <DropdownMenuSeparator />
+ {table
+ .getAllColumns()
+ .filter(
+ (column) =>
+ typeof column.accessorFn !== "undefined" && column.getCanHide()
+ )
+ .map((column) => {
+ return (
+ <DropdownMenuCheckboxItem
+ key={column.id}
+ className="capitalize"
+ checked={column.getIsVisible()}
+ onCheckedChange={(value) => column.toggleVisibility(!!value)}
+ >
+ {column.id.replace('_', ' ')}
+ </DropdownMenuCheckboxItem>
+ )
+ })}
+ </DropdownMenuContent>
+ </DropdownMenu>
+ )
+}
diff --git a/dashboard/src/components/data-table/table.tsx b/dashboard/src/components/data-table/table.tsx
@@ -0,0 +1,132 @@
+import {
+ ColumnDef,
+ ColumnFiltersState,
+ SortingState,
+ VisibilityState,
+ flexRender,
+ getCoreRowModel,
+ getFilteredRowModel,
+ getPaginationRowModel,
+ getSortedRowModel,
+ useReactTable,
+} from "@tanstack/react-table"
+
+import {
+ Button,
+ Input,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@marzneshin/components"
+import { useTranslation } from "react-i18next"
+import { DataTablePagination } from "./pagination"
+import { useState } from "react"
+import { DataTableViewOptions } from "./table-view-option"
+
+interface DataTableProps<TData, TValue> {
+ columns: ColumnDef<TData, TValue>[]
+ data: TData[]
+ filteredColumn: string
+ onCreate?: () => void
+ onOpen?: (object: TData) => void
+}
+
+export function DataTable<TData, TValue>({
+ columns,
+ data,
+ onCreate,
+ onOpen,
+ filteredColumn
+}: DataTableProps<TData, TValue>) {
+ const [sorting, setSorting] = useState<SortingState>([])
+ const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
+ []
+ )
+ const [columnVisibility, setColumnVisibility] =
+ useState<VisibilityState>({})
+ const [rowSelection, setRowSelection] = useState({})
+ const table = useReactTable({
+ data,
+ columns,
+ onSortingChange: setSorting,
+ onColumnFiltersChange: setColumnFilters,
+ getCoreRowModel: getCoreRowModel(),
+ getPaginationRowModel: getPaginationRowModel(),
+ getSortedRowModel: getSortedRowModel(),
+ getFilteredRowModel: getFilteredRowModel(),
+ onColumnVisibilityChange: setColumnVisibility,
+ onRowSelectionChange: setRowSelection,
+ state: {
+ sorting,
+ columnFilters,
+ columnVisibility,
+ rowSelection,
+ },
+ })
+ const { t } = useTranslation();
+ return (
+ <div>
+ <div className="flex items-center py-4">
+ <Input
+ placeholder={t('table.filter-placeholder', { name: filteredColumn })}
+ value={(table.getColumn(filteredColumn)?.getFilterValue() as string) ?? ""}
+ onChange={(event) =>
+ table.getColumn(filteredColumn)?.setFilterValue(event.target.value)
+ }
+ className="max-w-sm"
+ />
+ <DataTableViewOptions table={table} />
+ {onCreate && (<Button onClick={onCreate}>{t('create')}</Button>)}
+ </div>
+ <div className="rounded-md border">
+ <Table>
+ <TableHeader>
+ {table.getHeaderGroups().map((headerGroup) => (
+ <TableRow key={headerGroup.id}>
+ {headerGroup.headers.map((header) => {
+ return (
+ <TableHead key={header.id}>
+ {header.isPlaceholder
+ ? null
+ : flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+ </TableHead>
+ )
+ })}
+ </TableRow>
+ ))}
+ </TableHeader>
+ <TableBody>
+ {table.getRowModel().rows?.length ? (
+ table.getRowModel().rows.map((row) => (
+ <TableRow
+ key={row.id}
+ data-state={row.getIsSelected() && "selected"}
+ onClick={() => onOpen !== undefined && onOpen(row.original)}
+ >
+ {row.getVisibleCells().map((cell) => (
+ <TableCell key={cell.id}>
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
+ </TableCell>
+ ))}
+ </TableRow>
+ ))
+ ) : (
+ <TableRow>
+ <TableCell colSpan={columns.length} className="h-24 text-center">
+ {t('table.no-result')}
+ </TableCell>
+ </TableRow>
+ )}
+ </TableBody>
+ </Table>
+ <DataTablePagination table={table} />
+ </div>
+ </div>
+ )
+}
diff --git a/dashboard/src/components/delete-confirmation-dialog/index.tsx b/dashboard/src/components/delete-confirmation-dialog/index.tsx
@@ -0,0 +1,43 @@
+
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+} from "@marzneshin/components"
+import { ExclamationTriangleIcon } from "@radix-ui/react-icons"
+import { FC } from "react"
+import { useTranslation } from "react-i18next"
+
+interface DeleteConfirmationProps {
+ action: () => void
+ onOpenChange: (open: boolean) => void
+ open: boolean
+}
+
+export const DeleteConfirmation: FC<DeleteConfirmationProps> = ({ action, open, onOpenChange }) => {
+ const { t } = useTranslation();
+ return (
+ <AlertDialog open={open} onOpenChange={onOpenChange}>
+ <AlertDialogContent>
+ <AlertDialogHeader >
+ <AlertDialogTitle className="flex flex-row gap-3 items-center text-destructive">
+ <ExclamationTriangleIcon className="p-2 w-10 h-10 bg-red-200 rounded-md border-2 border-destructive" />
+ {t('delete-confirmation.title')}
+ </AlertDialogTitle>
+ <AlertDialogDescription>
+ {t('delete-confirmation.desc')}
+ </AlertDialogDescription>
+ </AlertDialogHeader>
+ <AlertDialogFooter>
+ <AlertDialogCancel>{t('cancel')}</AlertDialogCancel>
+ <AlertDialogAction onClick={action} className="bg-destructive">{t('delete')}</AlertDialogAction>
+ </AlertDialogFooter>
+ </AlertDialogContent>
+ </AlertDialog>
+ )
+}
diff --git a/dashboard/src/components/header/index.tsx b/dashboard/src/components/header/index.tsx
@@ -4,10 +4,10 @@ import { FC, PropsWithChildren } from "react"
export const Header: FC<PropsWithChildren> = ({ children }) => {
return (
- <div className="flex flex-row justify-between items-center p-1 px-4 w-full h-full bg-secondary text-primary-foreground dark:bg-primary-foreground">
+ <div className="flex flex-row justify-between items-center p-1 px-4 w-full h-full bg-primary text-primary-foreground dark:bg-primary-foreground">
<div className="flex flex-row gap-4 justify-center items-center">
<Link to="/">
- <div className="flex flex-col justify-center items-center p-2 h-10 text-2xl font-bold rounded-lg font-header bg-accent text-primary border-accent">
+ <div className="flex flex-col justify-center items-center p-2 h-10 text-2xl font-bold bg-gray-800 rounded-lg font-header text-secondary border-accent dark:text-secondary-foreground">
M
</div>
</Link>
diff --git a/dashboard/src/components/index.ts b/dashboard/src/components/index.ts
@@ -1,3 +1,5 @@
export * from './ui'
export * from './header'
export * from './sidebar'
+export * from './data-table'
+export * from './delete-confirmation-dialog'
diff --git a/dashboard/src/components/nav-dir/index.tsx b/dashboard/src/components/nav-dir/index.tsx
@@ -24,7 +24,7 @@ import {
Button,
SidebarObject,
} from "@marzneshin/components"
-import { useBreakpoint } from "@marzneshin/hooks/use-screen-breakpoint";
+import { useScreenBreakpoint } from "@marzneshin/hooks/use-screen-breakpoint";
import { AppRouterPaths } from "@marzneshin/types";
import i18n from "@marzneshin/features/i18n";
@@ -60,7 +60,7 @@ export const NavigationDirectory: FC<NavigationDirectoryProps> = ({ sidebar }) =
const [open, setOpen] = React.useState(false)
const currentPath = useRouterState().location.pathname;
const items = getPathDirs(currentPath, sidebar);
- const isDesktop = !useBreakpoint("sm");
+ const isDesktop = !useScreenBreakpoint("sm");
return (
<Breadcrumb>
<BreadcrumbList>
@@ -125,11 +125,11 @@ export const NavigationDirectory: FC<NavigationDirectoryProps> = ({ sidebar }) =
<>
<BreadcrumbLink
asChild
- className="md:max-w-none max-w-20 truncate"
+ className="md:max-w-none max-w-20 truncate text-accent hover:text-primary-foreground"
>
<Link to={item.href}>{item.label}</Link>
</BreadcrumbLink>
- <BreadcrumbSeparator />
+ {index !== items.slice(-ITEMS_TO_DISPLAY + 1).length - 1 && <BreadcrumbSeparator />}
</>
) : (
<BreadcrumbPage className="md:max-w-none max-w-20 truncate">
diff --git a/dashboard/src/components/sidebar/sidebar-body.tsx b/dashboard/src/components/sidebar/sidebar-body.tsx
@@ -1,13 +1,13 @@
+import { cn } from "@marzneshin/utils"
import { FC, PropsWithChildren } from "react"
export interface SidebarBodyProps
- extends PropsWithChildren {
+ extends PropsWithChildren,
+ React.HTMLAttributes<HTMLUListElement> { }
-}
-
-export const SidebarBody: FC<SidebarBodyProps> = ({ children }) => {
+export const SidebarBody: FC<SidebarBodyProps> = ({ children, className }) => {
return (
- <ul className="flex flex-col justify-center items-start w-full divide-y-[3px] divide-accent">
+ <ul className={cn(className, "flex flex-col justify-center items-start w-full")}>
{children}
</ul>
)
diff --git a/dashboard/src/components/ui/form.tsx b/dashboard/src/components/ui/form.tsx
@@ -93,7 +93,7 @@ const FormLabel = React.forwardRef<
return (
<Label
ref={ref}
- className={cn(error && "text-destructive", className)}
+ className={cn(error && "text-destructive", "font-semibold", className)}
htmlFor={formItemId}
{...props}
/>
diff --git a/dashboard/src/components/ui/index.ts b/dashboard/src/components/ui/index.ts
@@ -22,3 +22,7 @@ export * from "./table"
export * from "./toggle"
export * from "./tooltip"
export * from "./aspect-ratio"
+export * from "./select"
+export * from "./sheet"
+export * from "./tabs"
+export * from "./scroll-area"
diff --git a/dashboard/src/components/ui/scroll-area.tsx b/dashboard/src/components/ui/scroll-area.tsx
@@ -0,0 +1,46 @@
+import * as React from "react"
+import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
+
+import { cn } from "@marzneshin/utils"
+
+const ScrollArea = React.forwardRef<
+ React.ElementRef<typeof ScrollAreaPrimitive.Root>,
+ React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
+>(({ className, children, ...props }, ref) => (
+ <ScrollAreaPrimitive.Root
+ ref={ref}
+ className={cn("relative overflow-hidden", className)}
+ {...props}
+ >
+ <ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
+ {children}
+ </ScrollAreaPrimitive.Viewport>
+ <ScrollBar />
+ <ScrollAreaPrimitive.Corner />
+ </ScrollAreaPrimitive.Root>
+))
+ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
+
+const ScrollBar = React.forwardRef<
+ React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
+ React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
+>(({ className, orientation = "vertical", ...props }, ref) => (
+ <ScrollAreaPrimitive.ScrollAreaScrollbar
+ ref={ref}
+ orientation={orientation}
+ className={cn(
+ "flex touch-none select-none transition-colors",
+ orientation === "vertical" &&
+ "h-full w-2.5 border-l border-l-transparent p-[1px]",
+ orientation === "horizontal" &&
+ "h-2.5 flex-col border-t border-t-transparent p-[1px]",
+ className
+ )}
+ {...props}
+ >
+ <ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
+ </ScrollAreaPrimitive.ScrollAreaScrollbar>
+))
+ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
+
+export { ScrollArea, ScrollBar }
diff --git a/dashboard/src/components/ui/select.tsx b/dashboard/src/components/ui/select.tsx
@@ -0,0 +1,158 @@
+import * as React from "react"
+import * as SelectPrimitive from "@radix-ui/react-select"
+import { Check, ChevronDown, ChevronUp } from "lucide-react"
+
+import { cn } from "@marzneshin/utils"
+
+const Select = SelectPrimitive.Root
+
+const SelectGroup = SelectPrimitive.Group
+
+const SelectValue = SelectPrimitive.Value
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.Trigger>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
+>(({ className, children, ...props }, ref) => (
+ <SelectPrimitive.Trigger
+ ref={ref}
+ className={cn(
+ "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
+ className
+ )}
+ {...props}
+ >
+ {children}
+ <SelectPrimitive.Icon asChild>
+ <ChevronDown className="h-4 w-4 opacity-50" />
+ </SelectPrimitive.Icon>
+ </SelectPrimitive.Trigger>
+))
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
+>(({ className, ...props }, ref) => (
+ <SelectPrimitive.ScrollUpButton
+ ref={ref}
+ className={cn(
+ "flex cursor-default items-center justify-center py-1",
+ className
+ )}
+ {...props}
+ >
+ <ChevronUp className="h-4 w-4" />
+ </SelectPrimitive.ScrollUpButton>
+))
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
+>(({ className, ...props }, ref) => (
+ <SelectPrimitive.ScrollDownButton
+ ref={ref}
+ className={cn(
+ "flex cursor-default items-center justify-center py-1",
+ className
+ )}
+ {...props}
+ >
+ <ChevronDown className="h-4 w-4" />
+ </SelectPrimitive.ScrollDownButton>
+))
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName
+
+const SelectContent = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.Content>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
+>(({ className, children, position = "popper", ...props }, ref) => (
+ <SelectPrimitive.Portal>
+ <SelectPrimitive.Content
+ ref={ref}
+ className={cn(
+ "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+ position === "popper" &&
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
+ className
+ )}
+ position={position}
+ {...props}
+ >
+ <SelectScrollUpButton />
+ <SelectPrimitive.Viewport
+ className={cn(
+ "p-1",
+ position === "popper" &&
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
+ )}
+ >
+ {children}
+ </SelectPrimitive.Viewport>
+ <SelectScrollDownButton />
+ </SelectPrimitive.Content>
+ </SelectPrimitive.Portal>
+))
+SelectContent.displayName = SelectPrimitive.Content.displayName
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.Label>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
+>(({ className, ...props }, ref) => (
+ <SelectPrimitive.Label
+ ref={ref}
+ className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)}
+ {...props}
+ />
+))
+SelectLabel.displayName = SelectPrimitive.Label.displayName
+
+const SelectItem = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.Item>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
+>(({ className, children, ...props }, ref) => (
+ <SelectPrimitive.Item
+ ref={ref}
+ className={cn(
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
+ className
+ )}
+ {...props}
+ >
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+ <SelectPrimitive.ItemIndicator>
+ <Check className="h-4 w-4" />
+ </SelectPrimitive.ItemIndicator>
+ </span>
+
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
+ </SelectPrimitive.Item>
+))
+SelectItem.displayName = SelectPrimitive.Item.displayName
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef<typeof SelectPrimitive.Separator>,
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
+>(({ className, ...props }, ref) => (
+ <SelectPrimitive.Separator
+ ref={ref}
+ className={cn("-mx-1 my-1 h-px bg-muted", className)}
+ {...props}
+ />
+))
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton,
+}
diff --git a/dashboard/src/components/ui/sheet.tsx b/dashboard/src/components/ui/sheet.tsx
@@ -0,0 +1,138 @@
+import * as React from "react"
+import * as SheetPrimitive from "@radix-ui/react-dialog"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@marzneshin/utils"
+
+const Sheet = SheetPrimitive.Root
+
+const SheetTrigger = SheetPrimitive.Trigger
+
+const SheetClose = SheetPrimitive.Close
+
+const SheetPortal = SheetPrimitive.Portal
+
+const SheetOverlay = React.forwardRef<
+ React.ElementRef<typeof SheetPrimitive.Overlay>,
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
+>(({ className, ...props }, ref) => (
+ <SheetPrimitive.Overlay
+ className={cn(
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
+ className
+ )}
+ {...props}
+ ref={ref}
+ />
+))
+SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
+
+const sheetVariants = cva(
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
+ {
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+ bottom:
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+ right:
+ "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+ },
+ },
+ defaultVariants: {
+ side: "right",
+ },
+ }
+)
+
+interface SheetContentProps
+ extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
+ VariantProps<typeof sheetVariants> {}
+
+const SheetContent = React.forwardRef<
+ React.ElementRef<typeof SheetPrimitive.Content>,
+ SheetContentProps
+>(({ side = "right", className, children, ...props }, ref) => (
+ <SheetPortal>
+ <SheetOverlay />
+ <SheetPrimitive.Content
+ ref={ref}
+ className={cn(sheetVariants({ side }), className)}
+ {...props}
+ >
+ {children}
+ <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
+ <X className="h-4 w-4" />
+ <span className="sr-only">Close</span>
+ </SheetPrimitive.Close>
+ </SheetPrimitive.Content>
+ </SheetPortal>
+))
+SheetContent.displayName = SheetPrimitive.Content.displayName
+
+const SheetHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes<HTMLDivElement>) => (
+ <div
+ className={cn(
+ "flex flex-col space-y-2 text-center sm:text-left",
+ className
+ )}
+ {...props}
+ />
+)
+SheetHeader.displayName = "SheetHeader"
+
+const SheetFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes<HTMLDivElement>) => (
+ <div
+ className={cn(
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
+ className
+ )}
+ {...props}
+ />
+)
+SheetFooter.displayName = "SheetFooter"
+
+const SheetTitle = React.forwardRef<
+ React.ElementRef<typeof SheetPrimitive.Title>,
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
+>(({ className, ...props }, ref) => (
+ <SheetPrimitive.Title
+ ref={ref}
+ className={cn("text-lg font-semibold text-foreground", className)}
+ {...props}
+ />
+))
+SheetTitle.displayName = SheetPrimitive.Title.displayName
+
+const SheetDescription = React.forwardRef<
+ React.ElementRef<typeof SheetPrimitive.Description>,
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
+>(({ className, ...props }, ref) => (
+ <SheetPrimitive.Description
+ ref={ref}
+ className={cn("text-sm text-muted-foreground", className)}
+ {...props}
+ />
+))
+SheetDescription.displayName = SheetPrimitive.Description.displayName
+
+export {
+ Sheet,
+ SheetPortal,
+ SheetOverlay,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+}
diff --git a/dashboard/src/components/ui/tabs.tsx b/dashboard/src/components/ui/tabs.tsx
@@ -0,0 +1,53 @@
+import * as React from "react"
+import * as TabsPrimitive from "@radix-ui/react-tabs"
+
+import { cn } from "@marzneshin/utils"
+
+const Tabs = TabsPrimitive.Root
+
+const TabsList = React.forwardRef<
+ React.ElementRef<typeof TabsPrimitive.List>,
+ React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
+>(({ className, ...props }, ref) => (
+ <TabsPrimitive.List
+ ref={ref}
+ className={cn(
+ "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",
+ className
+ )}
+ {...props}
+ />
+))
+TabsList.displayName = TabsPrimitive.List.displayName
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef<typeof TabsPrimitive.Trigger>,
+ React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
+>(({ className, ...props }, ref) => (
+ <TabsPrimitive.Trigger
+ ref={ref}
+ className={cn(
+ "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
+ className
+ )}
+ {...props}
+ />
+))
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName
+
+const TabsContent = React.forwardRef<
+ React.ElementRef<typeof TabsPrimitive.Content>,
+ React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
+>(({ className, ...props }, ref) => (
+ <TabsPrimitive.Content
+ ref={ref}
+ className={cn(
+ "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
+ className
+ )}
+ {...props}
+ />
+))
+TabsContent.displayName = TabsPrimitive.Content.displayName
+
+export { Tabs, TabsList, TabsTrigger, TabsContent }
diff --git a/dashboard/src/features/nodes/dialogs/delete-confirmation.dialog.tsx b/dashboard/src/features/nodes/dialogs/delete-confirmation.dialog.tsx
@@ -0,0 +1,23 @@
+
+import { DeleteConfirmation } from '@marzneshin/components'
+import { FC } from 'react'
+import { NodeType, useNodesDeletionMutation } from '@marzneshin/features/nodes'
+
+interface NodesDeleteConfirmationDialogProps {
+ onOpenChange: (state: boolean) => void
+ open: boolean
+ node: NodeType | null
+}
+
+export const NodesDeleteConfirmationDialog: FC<NodesDeleteConfirmationDialogProps> = ({ onOpenChange, open, node }) => {
+ const deleteMutation = useNodesDeletionMutation();
+ if (node !== null) {
+ return (
+ <DeleteConfirmation
+ open={open}
+ onOpenChange={onOpenChange}
+ action={() => deleteMutation.mutate(node)}
+ />
+ )
+ }
+}
diff --git a/dashboard/src/features/nodes/dialogs/index.ts b/dashboard/src/features/nodes/dialogs/index.ts
@@ -0,0 +1,3 @@
+export * from './mutation.dialog'
+export * from './delete-confirmation.dialog'
+export * from './settings.dialog'
diff --git a/dashboard/src/features/nodes/dialogs/mutation.dialog.tsx b/dashboard/src/features/nodes/dialogs/mutation.dialog.tsx
@@ -0,0 +1,155 @@
+
+import {
+ DialogTitle,
+ DialogContent,
+ Dialog,
+ DialogHeader,
+ Form,
+ FormItem,
+ FormControl,
+ FormMessage,
+ FormLabel,
+ Input,
+ FormField,
+ Checkbox,
+ Button
+} from '@marzneshin/components'
+import { FC, useEffect } from 'react'
+import { NodeSchema, NodeType, useNodesCreationMutation, useNodesUpdateMutation } from '..'
+import { useForm } from 'react-hook-form'
+import { zodResolver } from '@hookform/resolvers/zod'
+import { useTranslation } from 'react-i18next'
+
+interface MutationDialogProps {
+ node: NodeType | null
+ open: boolean
+ onOpenChange: (state: boolean) => void
+}
+
+const getDefaultValues = (): NodeType => ({
+ name: '',
+ address: '',
+ port: 62050,
+ status: 'none',
+ usage_coefficient: 1,
+ add_as_new_host: true,
+})
+
+export const MutationDialog: FC<MutationDialogProps> = ({ node, open, onOpenChange }) => {
+ const updateMutation = useNodesUpdateMutation();
+ const createMutation = useNodesCreationMutation();
+ const form = useForm({
+ defaultValues: node ? node : getDefaultValues(),
+ resolver: zodResolver(NodeSchema)
+ })
+ const { t } = useTranslation();
+
+ const submit = (values: NodeType) => {
+ if (node) {
+ updateMutation.mutate(values)
+ } else {
+ createMutation.mutate(values)
+ }
+ onOpenChange(false);
+ }
+
+ useEffect(() => {
+ if (node)
+ form.reset(node);
+ else
+ form.reset(getDefaultValues())
+ }, [node, form])
+
+ return (
+ <Dialog open={open} onOpenChange={onOpenChange} defaultOpen={true}>
+ <DialogContent>
+ <DialogHeader>
+ <DialogTitle className="text-primary">
+ {node ?
+ t('page.nodes.dialogs.edition.title') :
+ t('page.nodes.dialogs.creation.title')}
+ </DialogTitle>
+ </DialogHeader>
+ <Form {...form} >
+ <form onSubmit={form.handleSubmit(submit)} >
+ <FormField
+ control={form.control}
+ name="name"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>{t('name')}</FormLabel>
+ <FormControl>
+ <Input {...field} />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+ <div className="flex flex-row gap-3 my-1">
+ <FormField
+ control={form.control}
+ name="address"
+ render={({ field }) => (
+ <FormItem className="w-2/4">
+ <FormLabel>{t('address')}</FormLabel>
+ <FormControl>
+ <Input {...field} />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+ <FormField
+ control={form.control}
+ name="port"
+ render={({ field }) => (
+ <FormItem className="w-1/4">
+ <FormLabel>{t('port')}</FormLabel>
+ <FormControl>
+ <Input type="number" {...field} />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+
+ <FormField
+ control={form.control}
+ name="usage_coefficient"
+ render={({ field }) => (
+ <FormItem className="w-1/4">
+ <FormLabel>{t('page.nodes.usage_coefficient')}</FormLabel>
+ <FormControl>
+ <Input type="number" {...field} />
+ </FormControl>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+ </div>
+
+ <FormField
+ control={form.control}
+ name="add_as_new_host"
+ render={({ field }) => (
+ <FormItem className="flex flex-row gap-1 items-center">
+ <FormControl>
+ <Checkbox
+ checked={field.value}
+ onCheckedChange={field.onChange}
+ />
+ </FormControl>
+ <FormLabel>{t('page.nodes.add_as_new_host')}</FormLabel>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+ <Button className="mt-3 w-full font-semibold" type="submit">
+ {t('submit')}
+ </Button>
+ </form>
+ </Form>
+ </DialogContent>
+ </Dialog>
+ )
+}
diff --git a/dashboard/src/features/nodes/dialogs/settings.dialog.tsx b/dashboard/src/features/nodes/dialogs/settings.dialog.tsx
@@ -0,0 +1,88 @@
+import {
+ Button,
+ Card,
+ CardContent,
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+ Tabs,
+ TabsContent,
+ TabsList,
+ TabsTrigger,
+} from "@marzneshin/components"
+import { FC, useState } from "react"
+import { useTranslation } from "react-i18next"
+import { NodeType, useNodesSettingsMutation } from ".."
+import { useNodesSettingsQuery } from "../services/settings.query";
+import { LogContainer } from "../log";
+import { NodesDetailTable } from "../tables/detail-table";
+import Editor from '@monaco-editor/react';
+import { useTheme } from "@marzneshin/features/theme-switch";
+
+interface NodesSettingsDialogProps {
+ onOpenChange: (state: boolean) => void
+ open: boolean
+ node: NodeType | null
+}
+
+export const NodesSettingsDialog: FC<NodesSettingsDialogProps> = ({ onOpenChange, open, node }) => {
+
+ const { t } = useTranslation();
+ const { data } = useNodesSettingsQuery(node);
+ const [config, setConfig] = useState<any>(data)
+ const mutate = useNodesSettingsMutation();
+ const { theme } = useTheme()
+
+ const handleConfigChange = (newConfig: string | undefined) => {
+ if (newConfig) {
+ try {
+ const parsedConfig = JSON.parse(newConfig);
+ setConfig(parsedConfig);
+ } catch (error) {
+ throw null;
+ }
+ }
+ };
+
+ if (node) {
+ return (
+ <Sheet open={open} onOpenChange={onOpenChange}>
+ <SheetContent className="sm:min-w-full md:min-w-[600px]" >
+ <SheetHeader>
+ <SheetTitle>
+ {t('page.nodes.settings.title')}
+ </SheetTitle>
+ </SheetHeader>
+ <div className="my-4">
+ <h1 className="font-medium font-header">{t('page.nodes.settings.detail')}</h1>
+ <NodesDetailTable node={node} />
+ </div>
+ <Tabs className="my-3 w-full h-full" defaultValue="logs">
+ <TabsList className="w-full">
+ <TabsTrigger className="w-full" value="logs">{t('logs')}</TabsTrigger>
+ <TabsTrigger className="w-full" value="config">{t('config')}</TabsTrigger>
+ </TabsList>
+ <TabsContent value="logs" className="h-full">
+ <LogContainer node={node} />
+ </TabsContent>
+ <TabsContent value="config" className="h-full z-51">
+ <Card>
+ <CardContent className="p-2 h-1/2">
+ <Editor
+ height="50vh"
+ defaultLanguage="json"
+ theme={theme === "dark" ? "vs-dark" : "github"}
+ defaultValue={JSON.stringify(data)}
+ onChange={handleConfigChange}
+ />
+ <Button onClick={() => mutate.mutate(config)}>{t('save')}</Button>
+ </CardContent>
+ </Card>
+ </TabsContent>
+ </Tabs>
+ </SheetContent>
+ </Sheet>
+ )
+ }
+}
diff --git a/dashboard/src/features/nodes/index.ts b/dashboard/src/features/nodes/index.ts
@@ -0,0 +1,4 @@
+export * from './types';
+export * from './tables';
+export * from './services';
+export * from './dialogs';
diff --git a/dashboard/src/features/nodes/log/container.tsx b/dashboard/src/features/nodes/log/container.tsx
@@ -0,0 +1,32 @@
+import { Badge, Card, CardContent, CardHeader, ScrollArea } from "@marzneshin/components"
+import { NodeType, useNodesLog } from ".."
+import { FC } from "react"
+import { useTranslation } from "react-i18next"
+
+interface LogContainerProps {
+ node: NodeType
+}
+
+export const LogContainer: FC<LogContainerProps> = ({ node }) => {
+ const { logs, status, logsDiv } = useNodesLog(node)
+ const { t } = useTranslation()
+ return (
+ <Card className="h-1/2">
+ <CardContent className="flex flex-col p-1 h-full" >
+ <CardHeader className="flex flex-row justify-between items-center p-2">
+ <p className="capitalize font-header">{t('page.nodes.settings.log-container.title')}</p>
+ <div className="flex flex-row gap-2 justify-center items-center">
+ <Badge variant={status === "closed" ? "destructive" : "default"} className="flex justify-center items-center w-full h-6 capitalize">
+ {status}
+ </Badge>
+ </div>
+ </CardHeader>
+ <ScrollArea className="flex p-2 m-1 h-full rounded-b-md divide-dashed divide-accent bg-secondary text-primary" ref={logsDiv}>
+ {logs.map((log: string, i) => {
+ return <p key={i} className="font-mono text-[0.7rem] text-primary">{log}</p>
+ })}
+ </ScrollArea>
+ </CardContent>
+ </Card>
+ )
+}
diff --git a/dashboard/src/features/nodes/log/index.ts b/dashboard/src/features/nodes/log/index.ts
@@ -0,0 +1 @@
+export * from './container'
diff --git a/dashboard/src/features/nodes/services/create-node.mutate.ts b/dashboard/src/features/nodes/services/create-node.mutate.ts
@@ -0,0 +1,40 @@
+import { NodeType, NodesQueryFetchKey } from "@marzneshin/features/nodes";
+import { useMutation } from "@tanstack/react-query";
+import { fetch, queryClient } from "@marzneshin/utils";
+import { toast } from "sonner";
+import i18n from "@marzneshin/features/i18n";
+
+export async function fetchCreateNode(node: NodeType): Promise<NodeType> {
+ return fetch('/nodes', { method: 'post', body: node }).then((node) => {
+ return node;
+ });
+}
+
+const handleError = (error: Error, value: NodeType) => {
+ toast.error(
+ i18n.t('page.nodes.events.create.error', { name: value.name }),
+ {
+ description: error.message
+ })
+}
+
+const handleSuccess = (value: NodeType) => {
+ toast.success(
+ i18n.t('page.nodes.events.create.success.title', { name: value.name }),
+ {
+ description: i18n.t('page.nodes.events.create.success.desc')
+ })
+ queryClient.invalidateQueries({ queryKey: [NodesQueryFetchKey] })
+}
+
+
+const NodesCreateFetchKey = "nodes-create-fetch-key";
+
+export const useNodesCreationMutation = () => {
+ return useMutation({
+ mutationKey: [NodesCreateFetchKey],
+ mutationFn: fetchCreateNode,
+ onError: handleError,
+ onSuccess: handleSuccess,
+ })
+}
diff --git a/dashboard/src/features/nodes/services/delete-node.mutate.ts b/dashboard/src/features/nodes/services/delete-node.mutate.ts
@@ -0,0 +1,41 @@
+
+import { NodeType, NodesQueryFetchKey } from "@marzneshin/features/nodes";
+import { useMutation } from "@tanstack/react-query";
+import { fetch, queryClient } from "@marzneshin/utils";
+import { toast } from "sonner";
+import i18n from "@marzneshin/features/i18n";
+
+export async function fetchDeleteNode(node: NodeType): Promise<NodeType> {
+ return fetch(`/nodes/${node.id}`, { method: 'delete' }).then((node) => {
+ return node;
+ });
+}
+
+const NodesDeleteFetchKey = "nodes-delete-fetch-key";
+
+
+const handleError = (error: Error, value: NodeType) => {
+ toast.error(
+ i18n.t('page.nodes.events.delete.error', { name: value.name }),
+ {
+ description: error.message
+ })
+}
+
+const handleSuccess = (value: NodeType) => {
+ toast.success(
+ i18n.t('page.nodes.events.delete.success.title', { name: value.name }),
+ {
+ description: i18n.t('page.nodes.events.delete.success.desc')
+ })
+ queryClient.invalidateQueries({ queryKey: [NodesQueryFetchKey] })
+}
+
+export const useNodesDeletionMutation = () => {
+ return useMutation({
+ mutationKey: [NodesDeleteFetchKey,],
+ mutationFn: fetchDeleteNode,
+ onError: handleError,
+ onSuccess: handleSuccess,
+ })
+}
diff --git a/dashboard/src/features/nodes/services/index.ts b/dashboard/src/features/nodes/services/index.ts
@@ -0,0 +1,7 @@
+export * from './nodes.query'
+export * from './logs.socket'
+export * from './settings.query'
+export * from './settings.mutate'
+export * from './update-node.mutate'
+export * from './create-node.mutate'
+export * from './delete-node.mutate'
diff --git a/dashboard/src/features/nodes/services/logs.socket.ts b/dashboard/src/features/nodes/services/logs.socket.ts
@@ -0,0 +1,78 @@
+import { NodeType } from "@marzneshin/features/nodes";
+import useWebSocket, { ReadyState } from "react-use-websocket";
+import { useAuth } from "@marzneshin/features/auth";
+import { joinPaths } from "@tanstack/react-router";
+import { useCallback, useEffect, useRef, useState } from "react";
+
+export const MAX_NUMBER_OF_LOGS = 500
+
+export const getStatus = (status: string) => {
+ return {
+ [ReadyState.CONNECTING]: 'connecting',
+ [ReadyState.OPEN]: 'connected',
+ [ReadyState.CLOSING]: 'closed',
+ [ReadyState.CLOSED]: 'closed',
+ [ReadyState.UNINSTANTIATED]: 'closed',
+ }[status];
+};
+
+export const getWebsocketUrl = (nodeId: number) => {
+ try {
+ const baseURL = new URL(
+ import.meta.env.VITE_BASE_API.startsWith('/')
+ ? window.location.origin + import.meta.env.VITE_BASE_API
+ : import.meta.env.VITE_BASE_API
+ );
+
+ return (
+ (baseURL.protocol === 'https:' ? 'wss://' : 'ws://') +
+ joinPaths([baseURL.host + baseURL.pathname, `/nodes/${nodeId}/logs`]) +
+ '?interval=1&token=' +
+ useAuth.getState().getAuthToken()
+ );
+ } catch (e) {
+ console.error('Unable to generate websocket url');
+ console.error(e);
+ return null;
+ }
+};
+
+
+export const useNodesLog = (node: NodeType) => {
+ const [logs, setLogs] = useState<string[]>([]);
+ const logsDiv = useRef<HTMLDivElement | null>(null);
+ const scrollShouldStayOnEnd = useRef(true);
+
+ const updateLogs = useCallback((callback: (prevLogs: string[]) => string[]) => {
+ setLogs(prevLogs => {
+ const newLogs = callback(prevLogs);
+ return newLogs.length > MAX_NUMBER_OF_LOGS ? newLogs.slice(-MAX_NUMBER_OF_LOGS) : newLogs;
+ });
+ }, []);
+
+ const { readyState } = useWebSocket(node?.id ? getWebsocketUrl(node.id) : '', {
+ onMessage: (e: any) => {
+ updateLogs(prevLogs => [...prevLogs, e.data]);
+ },
+ shouldReconnect: () => true,
+ reconnectAttempts: 10,
+ reconnectInterval: 1000,
+ });
+
+ useEffect(() => {
+ if (logsDiv.current && scrollShouldStayOnEnd.current) {
+ logsDiv.current.scrollTop = logsDiv.current.scrollHeight;
+ }
+ }, [logs]);
+
+ useEffect(() => {
+ return () => {
+ // Cleanup
+ setLogs([]);
+ };
+ }, []);
+
+ const status = getStatus(readyState.toString());
+
+ return { status, readyState, logs, logsDiv };
+};
diff --git a/dashboard/src/features/nodes/services/nodes.query.ts b/dashboard/src/features/nodes/services/nodes.query.ts
@@ -0,0 +1,19 @@
+import { NodeType } from "@marzneshin/features/nodes";
+import { useQuery } from "@tanstack/react-query";
+import { fetch } from "@marzneshin/utils";
+
+export async function fetchNodes(): Promise<NodeType[]> {
+ return fetch('/nodes').then((result) => {
+ return result.items;
+ });
+}
+
+export const NodesQueryFetchKey = "nodes";
+
+export const useNodesQuery = () => {
+ return useQuery({
+ queryKey: [NodesQueryFetchKey],
+ queryFn: fetchNodes,
+ initialData: []
+ })
+}
diff --git a/dashboard/src/features/nodes/services/settings.mutate.ts b/dashboard/src/features/nodes/services/settings.mutate.ts
@@ -0,0 +1,41 @@
+import { NodeType } from "@marzneshin/features/nodes";
+import { useMutation } from "@tanstack/react-query";
+import { fetch, queryClient } from "@marzneshin/utils";
+import { toast } from "sonner";
+import i18n from "@marzneshin/features/i18n";
+import { NodesSettingsQueryFetchKey } from "./settings.query";
+
+export async function fetchUpdateNodesSettings(node: NodeType): Promise<NodeType> {
+ return fetch(`/nodes/${node.id}/xray_config`, { method: 'put', body: node }).then((node) => {
+ return node;
+ });
+}
+
+const handleError = (error: Error, value: NodeType) => {
+ toast.error(
+ i18n.t('page.nodes.settings.events.update.error', { name: value.name }),
+ {
+ description: error.message
+ })
+}
+
+const handleSuccess = (value: NodeType) => {
+ toast.success(
+ i18n.t('page.nodes.settings.events.update.success.title', { name: value.name }),
+ {
+ description: i18n.t('page.nodes.settings.events.update.success.desc')
+ })
+ queryClient.invalidateQueries({ queryKey: [NodesSettingsQueryFetchKey] })
+}
+
+
+const NodesSettingsUpdateFetchKey = ["nodes", "xray_config"];
+
+export const useNodesSettingsMutation = () => {
+ return useMutation({
+ mutationKey: NodesSettingsUpdateFetchKey,
+ mutationFn: fetchUpdateNodesSettings,
+ onError: handleError,
+ onSuccess: handleSuccess,
+ })
+}
diff --git a/dashboard/src/features/nodes/services/settings.query.ts b/dashboard/src/features/nodes/services/settings.query.ts
@@ -0,0 +1,29 @@
+import { NodeType } from "@marzneshin/features/nodes";
+import { useQuery } from "@tanstack/react-query";
+import { fetch } from "@marzneshin/utils";
+
+type NodesSettingsQueryKey = [string, number | null, string]
+
+export async function fetchNodesSettings({ queryKey }: { queryKey: NodesSettingsQueryKey }): Promise<NodeType[]> {
+ return fetch(`/nodes/${Number(queryKey[1])}/xray_config`).then((config) => {
+ return config;
+ });
+}
+
+export const NodesSettingsQueryFetchKey = "nodes";
+
+export const useNodesSettingsQuery = (node: NodeType | null) => {
+ const nodeId: number | null = node?.id ?? null
+ const queryKey: NodesSettingsQueryKey =
+ [NodesSettingsQueryFetchKey, nodeId, "xray_config"];
+
+ const queryFn = nodeId !== null
+ ? ({ queryKey }: { queryKey: [string, number | null, string] }) => fetchNodesSettings({ queryKey })
+ : () => Promise.resolve<NodeType[]>([]);
+
+ return useQuery({
+ queryKey,
+ queryFn,
+ initialData: [],
+ });
+};
diff --git a/dashboard/src/features/nodes/services/update-node.mutate.ts b/dashboard/src/features/nodes/services/update-node.mutate.ts
@@ -0,0 +1,41 @@
+import { NodeType } from "@marzneshin/features/nodes";
+import { useMutation } from "@tanstack/react-query";
+import { fetch, queryClient } from "@marzneshin/utils";
+import { toast } from "sonner";
+import i18n from "@marzneshin/features/i18n";
+import { NodesQueryFetchKey } from "./nodes.query";
+
+export async function fetchUpdateNode(node: NodeType): Promise<NodeType> {
+ return fetch(`/nodes/${node.id}`, { method: 'put', body: node }).then((node) => {
+ return node;
+ });
+}
+
+const handleError = (error: Error, value: NodeType) => {
+ toast.error(
+ i18n.t('page.nodes.events.update.error', { name: value.name }),
+ {
+ description: error.message
+ })
+}
+
+const handleSuccess = (value: NodeType) => {
+ toast.success(
+ i18n.t('page.nodes.events.update.success.title', { name: value.name }),
+ {
+ description: i18n.t('page.nodes.events.update.success.desc')
+ })
+ queryClient.invalidateQueries({ queryKey: [NodesQueryFetchKey] })
+}
+
+
+const NodesUpdateFetchKey = "nodes-create-fetch-key";
+
+export const useNodesUpdateMutation = () => {
+ return useMutation({
+ mutationKey: [NodesUpdateFetchKey],
+ mutationFn: fetchUpdateNode,
+ onError: handleError,
+ onSuccess: handleSuccess,
+ })
+}
diff --git a/dashboard/src/features/nodes/tables/columns.tsx b/dashboard/src/features/nodes/tables/columns.tsx
@@ -0,0 +1,37 @@
+import { ColumnDef } from "@tanstack/react-table"
+import { NodesStatusBadge, NodeType, NodesStatus } from "@marzneshin/features/nodes"
+import { DataTableColumnHeader } from "@marzneshin/components/data-table/column-header"
+import i18n from "@marzneshin/features/i18n"
+import { DataTableActionsCell } from "@marzneshin/components"
+
+interface ColumnAction {
+ onDelete: (node: NodeType) => void;
+ onOpen: (node: NodeType) => void;
+ onEdit: (node: NodeType) => void;
+}
+
+
+export const columns = (actions: ColumnAction): ColumnDef<NodeType>[] => ([
+ {
+ accessorKey: "name",
+ header: ({ column }) => <DataTableColumnHeader title={i18n.t('name')} column={column} />,
+ },
+ {
+ accessorKey: "status",
+ header: ({ column }) => <DataTableColumnHeader title={i18n.t('status')} column={column} />,
+ cell: ({ row }) => <NodesStatusBadge status={NodesStatus[row.original.status]} />,
+ },
+ {
+ accessorKey: "address",
+ header: ({ column }) => <DataTableColumnHeader title={i18n.t('address')} column={column} />,
+ cell: ({ row }) => `${row.original.address}:${row.original.port}`
+ },
+ {
+ accessorKey: "usage_coefficient",
+ header: ({ column }) => <DataTableColumnHeader title={i18n.t('page.nodes.usage_coefficient')} column={column} />,
+ },
+ {
+ id: "actions",
+ cell: ({ row }) => <DataTableActionsCell {...actions} row={row} />
+ },
+]);
diff --git a/dashboard/src/features/nodes/tables/detail-table/index.tsx b/dashboard/src/features/nodes/tables/detail-table/index.tsx
@@ -0,0 +1,53 @@
+
+import { FC } from 'react'
+import { NodeType, NodesStatus, NodesStatusBadge } from '../..'
+import { Table, TableBody, TableCell, TableHead, TableRow } from '@marzneshin/components'
+import { useTranslation } from 'react-i18next'
+
+
+interface NodesDetailTableProps {
+ node: NodeType
+}
+
+
+export const NodesDetailTable: FC<NodesDetailTableProps> = ({ node }) => {
+ const { t } = useTranslation()
+ return (
+ <Table>
+ <TableBody>
+ <TableRow >
+ <TableHead >
+ {t('name')}
+ </TableHead>
+ <TableCell >
+ {node.name}
+ </TableCell>
+ </TableRow>
+ <TableRow>
+ <TableHead >
+ {t('Address')}
+ </TableHead>
+ <TableCell >
+ {node.address}:{node.port}
+ </TableCell>
+ </TableRow>
+ <TableRow>
+ <TableHead className="p-5">
+ {t('page.nodes.usage_coefficient')}
+ </TableHead>
+ <TableCell >
+ {node.usage_coefficient}
+ </TableCell>
+ </TableRow>
+ <TableRow>
+ <TableHead>
+ {t('status')}
+ </TableHead>
+ <TableCell>
+ <NodesStatusBadge status={NodesStatus[node.status]} />
+ </TableCell>
+ </TableRow>
+ </TableBody>
+ </Table>
+ )
+}
diff --git a/dashboard/src/features/nodes/tables/index.ts b/dashboard/src/features/nodes/tables/index.ts
@@ -0,0 +1,3 @@
+export * from "./columns"
+export * from "./nodes-status-badge"
+export * from "./table"
diff --git a/dashboard/src/features/nodes/tables/nodes-status-badge.tsx b/dashboard/src/features/nodes/tables/nodes-status-badge.tsx
@@ -0,0 +1,34 @@
+import { FC } from 'react';
+import { Badge, Label } from '@marzneshin/components';
+import { NodesStatus, NodesStatusType } from '..';
+
+interface NodesStatusBadgeProps {
+ status: NodesStatusType;
+}
+
+export const NodesStatusBadge: FC<NodesStatusBadgeProps> = ({ status }) => {
+ const { label, icon: Icon } = status;
+
+ let badgeVariant: 'outline' | 'destructive' | undefined | null;
+ switch (label) {
+ case NodesStatus.healthy.label:
+ badgeVariant = undefined;
+ break;
+ case NodesStatus.unhealthy.label:
+ badgeVariant = "destructive";
+ break;
+ case NodesStatus.disabled.label:
+ badgeVariant = "outline";
+ break;
+ case "none":
+ return null;
+ }
+
+ return (
+ <Badge variant={badgeVariant} className="h-6">
+ {Icon && <Icon className="mr-1 w-5 h-4" />} <Label className="capitalize">{label}</Label>
+ </Badge>
+ );
+};
+
+export default NodesStatusBadge;
diff --git a/dashboard/src/features/nodes/tables/table.tsx b/dashboard/src/features/nodes/tables/table.tsx
@@ -0,0 +1,65 @@
+import { FC, useState } from "react";
+import {
+ useNodesQuery,
+ columns,
+ NodeType,
+ NodesSettingsDialog
+} from '@marzneshin/features/nodes';
+import { DataTable } from "@marzneshin/components";
+import { MutationDialog } from "../dialogs/mutation.dialog";
+import { NodesDeleteConfirmationDialog } from "../dialogs/delete-confirmation.dialog";
+
+export const NodesTable: FC = () => {
+ const { data } = useNodesQuery();
+ const [mutationDialogOpen, setMutationDialogOpen] = useState<boolean>(false);
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState<boolean>(false);
+ const [settingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);
+ const [selectedNode, selectNode] = useState<NodeType | null>(null);
+
+ const onEdit = (node: NodeType) => {
+ selectNode(node);
+ setMutationDialogOpen(true);
+ }
+
+ const onDelete = (node: NodeType) => {
+ selectNode(node);
+ setDeleteDialogOpen(true);
+ }
+
+ const onCreate = () => {
+ selectNode(null);
+ setMutationDialogOpen(true);
+ }
+
+ const onOpen = (node: NodeType) => {
+ selectNode(node);
+ setSettingsDialogOpen(true);
+ }
+
+ return (
+ <div>
+ <NodesSettingsDialog
+ open={settingsDialogOpen}
+ onOpenChange={setSettingsDialogOpen}
+ node={selectedNode}
+ />
+ <NodesDeleteConfirmationDialog
+ open={deleteDialogOpen}
+ onOpenChange={setDeleteDialogOpen}
+ node={selectedNode}
+ />
+ <MutationDialog
+ node={selectedNode}
+ open={mutationDialogOpen}
+ onOpenChange={setMutationDialogOpen}
+ />
+ <DataTable
+ columns={columns({ onEdit, onDelete, onOpen })}
+ data={data}
+ filteredColumn='name'
+ onCreate={onCreate}
+ onOpen={onOpen}
+ />
+ </div>
+ )
+}
diff --git a/dashboard/src/features/nodes/types/index.ts b/dashboard/src/features/nodes/types/index.ts
@@ -0,0 +1,42 @@
+import { LucideIcon, PowerOff, Zap, ZapOff } from "lucide-react";
+import { z } from "zod";
+
+export interface NodesStatusType {
+ label: string;
+ icon: LucideIcon | null;
+}
+
+export const NodesStatus = {
+ healthy: {
+ label: 'healthy',
+ icon: Zap,
+ },
+ unhealthy: {
+ label: 'unhealthy',
+ icon: ZapOff,
+ },
+ disabled: {
+ label: 'disabled',
+ icon: PowerOff,
+ },
+ none: {
+ label: 'none',
+ icon: null,
+ }
+} as Record<string, NodesStatusType>;
+
+export const NodeSchema = z.object({
+ name: z.string().min(1),
+ address: z.string().min(1),
+ port: z
+ .number()
+ .min(1)
+ .or(z.string().transform((v) => parseFloat(v))),
+ id: z.number().nullable().optional(),
+ status: z
+ .enum([NodesStatus.healthy.label, NodesStatus.unhealthy.label, 'none', NodesStatus.disabled.label]),
+ usage_coefficient: z.number().default(1),
+ add_as_new_host: z.boolean().optional(),
+});
+
+export type NodeType = z.infer<typeof NodeSchema>;
diff --git a/dashboard/src/features/settings/certificate-button/index.tsx b/dashboard/src/features/settings/certificate-button/index.tsx
@@ -0,0 +1,77 @@
+
+import { Button } from '@marzneshin/components'
+import CopyToClipboard from 'react-copy-to-clipboard'
+import { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next';
+import { useCertificateQuery } from '../services';
+import { ClipboardCopy, CopyCheck, CopyX, LucideIcon } from 'lucide-react';
+import { toast } from 'sonner';
+
+interface ICopyAt<T> {
+ copied: T
+ copy: T
+ noCopy: T
+ healthyState: boolean
+ copiedState: boolean
+}
+
+function copyAt<T>(
+ { copied, copy, noCopy, healthyState, copiedState }: ICopyAt<T>
+): T {
+ if (healthyState) {
+ return copiedState ? copied : copy
+ }
+ else {
+ return noCopy
+ }
+}
+
+export const CertificateButton = () => {
+ const { t } = useTranslation();
+ const [copied, setCopied] = useState([-1, false]);
+ const [healthy, setHealthy] = useState<boolean>(false);
+ const [Icon, setIcon] = useState<LucideIcon>(ClipboardCopy);
+ const [title, setTitle] = useState<string>('page.settings.certificate.copy');
+ const { data: certificate } = useCertificateQuery()
+
+ useEffect(() => {
+ if (copied[1]) {
+ toast.success(t('page.settings.certificate.copied'));
+ setTimeout(() => {
+ setCopied([-1, false]);
+ }, 1000);
+ }
+ }, [copied, t]);
+
+ useEffect(() => {
+ setHealthy(certificate !== '')
+ }, [certificate])
+
+ useEffect(() => {
+ setIcon(copyAt({
+ copied: CopyCheck,
+ copy: ClipboardCopy,
+ noCopy: CopyX,
+ healthyState: healthy,
+ copiedState: copied[1] as boolean
+ }))
+
+ setTitle(copyAt({
+ copied: 'page.settings.certificate.copied',
+ copy: 'page.settings.certificate.copy',
+ noCopy: 'page.settings.certificate.error',
+ healthyState: healthy,
+ copiedState: copied[1] as boolean
+ }));
+ }, [copied, healthy]);
+
+
+ return (
+ <CopyToClipboard text={certificate}>
+ <Button className="p-2" disabled={!healthy} onClick={() => setCopied([0, true])}>
+ <Icon />
+ {t(title)}
+ </Button>
+ </CopyToClipboard>
+ )
+}
diff --git a/dashboard/src/features/settings/index.ts b/dashboard/src/features/settings/index.ts
@@ -0,0 +1,2 @@
+export * from './certificate-button'
+export * from './services'
diff --git a/dashboard/src/features/settings/services/certificate.query.ts b/dashboard/src/features/settings/services/certificate.query.ts
@@ -0,0 +1,19 @@
+import { useQuery } from "@tanstack/react-query";
+import { fetch } from "@marzneshin/utils";
+import { NodesQueryFetchKey } from "@marzneshin/features/nodes";
+
+export async function fetchCertificate(): Promise<string> {
+ return fetch('/nodes/settings').then((settings) => {
+ return settings.certificate;
+ });
+}
+
+export const CertificateQueryFetchKey = "settings";
+
+export const useCertificateQuery = () => {
+ return useQuery({
+ queryKey: [NodesQueryFetchKey, CertificateQueryFetchKey],
+ queryFn: fetchCertificate,
+ initialData: ''
+ })
+}
diff --git a/dashboard/src/features/settings/services/index.ts b/dashboard/src/features/settings/services/index.ts
@@ -0,0 +1 @@
+export * from './certificate.query'
diff --git a/dashboard/src/features/sidebar/items.tsx b/dashboard/src/features/sidebar/items.tsx
@@ -1,5 +1,5 @@
import { SidebarObject } from '@marzneshin/components';
-import { Box, Home, Server, ServerCog, UsersIcon } from 'lucide-react';
+import { Box, Home, Server, ServerCog, Settings, UsersIcon } from 'lucide-react';
export const sidebarItems: SidebarObject = {
Dashboard: [
@@ -35,5 +35,13 @@ export const sidebarItems: SidebarObject = {
icon: <ServerCog />,
isParent: false,
},
+ ],
+ System: [
+ {
+ title: 'Settings',
+ to: '/settings',
+ icon: <Settings />,
+ isParent: false,
+ },
]
};
diff --git a/dashboard/src/features/sidebar/sidebar.tsx b/dashboard/src/features/sidebar/sidebar.tsx
@@ -1,7 +1,7 @@
import { Sidebar, SidebarItem } from "@marzneshin/components";
import { useRouterState } from "@tanstack/react-router";
import { FC, useEffect } from "react";
-import { sidebarItems as sidebar } from ".";
+import { sidebarItems } from ".";
interface DashboardSidebarProps {
@@ -19,18 +19,17 @@ export const DashboardSidebar: FC<DashboardSidebarProps> = ({ collapsed, setColl
<aside>
<nav className="w-full">
<Sidebar
- sidebar={sidebar}
+ sidebar={sidebarItems}
collapsed={collapsed}
setCollapsed={setCollapsed}
>
<div className="flex flex-col p-4 w-full h-full">
- <Sidebar.Body>
-
- {Object.keys(sidebar).map((key) =>
+ <Sidebar.Body className="my-3">
+ {Object.keys(sidebarItems).map((key) =>
(
<div className="my-2 w-full" key={key}>
<Sidebar.Group>{key}</Sidebar.Group>
- {sidebar[key].map((item: SidebarItem, i) => (
+ {sidebarItems[key].map((item: SidebarItem, i) => (
<Sidebar.Item
variant={currentActivePath === item.to ? "active" : "default"}
className="my-2"
diff --git a/dashboard/src/features/sidebar/toggle.tsx b/dashboard/src/features/sidebar/toggle.tsx
@@ -16,7 +16,7 @@ export const ToggleButton: FC<ToggleButtonProps> = ({ isDesktop, collapsed, open
(open ? PanelBottomClose : PanelBottomOpen);
return (
- <Button className="p-2 bg-muted-foreground text-primary-foreground" onClick={onToggle}>
+ <Button className="p-2 bg-secondary-foreground border-2 text-primary-foreground dark:bg-secondary dark:text-primary" onClick={onToggle}>
<Icon className="w-full h-full" />
</Button>
);
diff --git a/dashboard/src/features/theme-switch/theme-toggle/index.tsx b/dashboard/src/features/theme-switch/theme-toggle/index.tsx
@@ -15,7 +15,7 @@ export function ThemeToggle() {
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
- <Button variant="outline" className="bg-primary-foreground text-primary" size="icon">
+ <Button variant="outline" className="bg-secondary-foreground text-primary-foreground" size="icon">
<Sun className="transition-all scale-100 rotate-0 dark:scale-0 dark:-rotate-90 h-[1rem] w-[1rem]" />
<Moon className="absolute transition-all scale-0 rotate-90 dark:scale-100 dark:rotate-0 h-[1rem] w-[1rem]" />
<span className="sr-only">Toggle theme</span>
diff --git a/dashboard/src/hooks/index.ts b/dashboard/src/hooks/index.ts
@@ -0,0 +1 @@
+export * from './use-screen-breakpoint'
diff --git a/dashboard/src/hooks/use-screen-breakpoint.ts b/dashboard/src/hooks/use-screen-breakpoint.ts
@@ -1,14 +1,23 @@
-//@ts-expect-error
-import create from "@kodingdotninja/use-tailwind-breakpoint";
import resolveConfig from "tailwindcss/resolveConfig";
//@ts-expect-error
import tailwindConfig from "@marzneshin/../tailwind.config.js";
+import { useEffect, useState } from 'react';
-const config = resolveConfig(tailwindConfig);
+const fullConfig = resolveConfig(tailwindConfig);
+const {
+ theme: { screens },
+} = fullConfig;
-export const {
- useBreakpoint,
- useBreakpointEffect,
- useBreakpointValue
-} = create(config.theme.screens);
+export const useScreenBreakpoint = (query: keyof typeof screens): boolean => {
+ const mediaQuery = `(min-width: ${screens[query]})`;
+ const matchQueryList = window.matchMedia(mediaQuery);
+ const [isMatch, setMatch] = useState<boolean>(false);
+ const onChange = (e: MediaQueryListEvent) => setMatch(e.matches);
+ useEffect(() => {
+ setMatch(matchQueryList.matches);
+ matchQueryList.addEventListener("change", onChange);
+ return () => matchQueryList.removeEventListener("change", onChange);
+ }, [query, matchQueryList]);
+ return isMatch;
+}
diff --git a/dashboard/src/routeTree.gen.ts b/dashboard/src/routeTree.gen.ts
@@ -15,6 +15,7 @@ import { Route as DashboardImport } from './routes/_dashboard'
import { Route as AuthImport } from './routes/_auth'
import { Route as DashboardIndexImport } from './routes/_dashboard/index'
import { Route as DashboardUsersImport } from './routes/_dashboard/users'
+import { Route as DashboardSettingsImport } from './routes/_dashboard/settings'
import { Route as DashboardServicesImport } from './routes/_dashboard/services'
import { Route as DashboardNodesImport } from './routes/_dashboard/nodes'
import { Route as DashboardHostsImport } from './routes/_dashboard/hosts'
@@ -42,6 +43,11 @@ const DashboardUsersRoute = DashboardUsersImport.update({
getParentRoute: () => DashboardRoute,
} as any)
+const DashboardSettingsRoute = DashboardSettingsImport.update({
+ path: '/settings',
+ getParentRoute: () => DashboardRoute,
+} as any)
+
const DashboardServicesRoute = DashboardServicesImport.update({
path: '/services',
getParentRoute: () => DashboardRoute,
@@ -90,6 +96,10 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof DashboardServicesImport
parentRoute: typeof DashboardImport
}
+ '/_dashboard/settings': {
+ preLoaderRoute: typeof DashboardSettingsImport
+ parentRoute: typeof DashboardImport
+ }
'/_dashboard/users': {
preLoaderRoute: typeof DashboardUsersImport
parentRoute: typeof DashboardImport
@@ -109,6 +119,7 @@ export const routeTree = rootRoute.addChildren([
DashboardHostsRoute,
DashboardNodesRoute,
DashboardServicesRoute,
+ DashboardSettingsRoute,
DashboardUsersRoute,
DashboardIndexRoute,
]),
diff --git a/dashboard/src/routes/__root.tsx b/dashboard/src/routes/__root.tsx
@@ -1,4 +1,6 @@
import { ThemeProvider } from '@marzneshin/features/theme-switch'
+import { queryClient } from '@marzneshin/utils';
+import { QueryClientProvider } from '@tanstack/react-query';
import { createRootRoute, Outlet } from '@tanstack/react-router'
import React, { Suspense } from 'react'
@@ -13,13 +15,13 @@ const TanStackRouterDevtools =
export const Route = createRootRoute({
component: () => (
- <>
+ <QueryClientProvider client={queryClient}>
<ThemeProvider defaultTheme="light" storageKey="ui-theme">
<Suspense>
<Outlet />
<TanStackRouterDevtools />
</Suspense>
</ThemeProvider>
- </>
+ </QueryClientProvider>
),
})
diff --git a/dashboard/src/routes/_dashboard.tsx b/dashboard/src/routes/_dashboard.tsx
@@ -4,18 +4,19 @@ import {
Header,
ResizableHandle,
ResizablePanel,
- ResizablePanelGroup
+ ResizablePanelGroup,
+ Toaster
} from '@marzneshin/components'
import { NavigationDirectory } from '@marzneshin/components/nav-dir';
import { useAuth } from '@marzneshin/features/auth'
import { DashboardSidebar, ToggleButton, sidebarItems } from '@marzneshin/features/sidebar';
import { usePanelToggle } from '@marzneshin/features/sidebar/use-panel-toggle';
-import { useBreakpoint } from '@marzneshin/hooks/use-screen-breakpoint';
+import { useScreenBreakpoint } from '@marzneshin/hooks/use-screen-breakpoint';
import { cn } from '@marzneshin/utils';
import { Outlet, createFileRoute, redirect } from '@tanstack/react-router'
export const DashboardLayout = () => {
- const isDesktop = useBreakpoint("sm");
+ const isDesktop = useScreenBreakpoint("sm");
const { collapsed, panelRef, open, setCollapsed, setOpen, toggleCollapse, toggleOpen } = usePanelToggle(isDesktop);
return (
@@ -64,6 +65,7 @@ export const DashboardLayout = () => {
</aside>
<main className="sm:block">
<Outlet />
+ <Toaster position="top-center" />
</main>
</div>
)}
diff --git a/dashboard/src/routes/_dashboard/nodes.tsx b/dashboard/src/routes/_dashboard/nodes.tsx
@@ -1,5 +1,35 @@
-import { createFileRoute } from '@tanstack/react-router'
+import { Alert, AlertDescription, AlertTitle, Card, CardContent, CardFooter, CardHeader, CardTitle } from '@marzneshin/components';
+import { NodesTable } from '@marzneshin/features/nodes';
+import { Link, createFileRoute } from '@tanstack/react-router'
+import { Info } from 'lucide-react';
+import { FC } from 'react';
+import { useTranslation } from 'react-i18next';
+
+export const NodesPage: FC = () => {
+ const { t } = useTranslation();
+ return (
+ <Card className="m-3">
+ <CardHeader>
+ <CardTitle>
+ {t('nodes')}
+ </CardTitle>
+ </CardHeader>
+ <CardContent>
+ <NodesTable />
+ </CardContent>
+ <CardFooter>
+ <Alert>
+ <Info className="mr-2" />
+ <AlertTitle className="font-semibold text-primary">{t('page.nodes.certificate-alert.title')}</AlertTitle>
+ <AlertDescription>
+ {t('page.nodes.certificate-alert.desc')}
+ <Link className="m-1 font-semibold text-secondary-foreground" to="/settings">{t('page.nodes.certificate-alert.click')}</Link>
+ </AlertDescription>
+ </Alert>
+ </CardFooter>
+ </Card >)
+};
export const Route = createFileRoute('/_dashboard/nodes')({
- component: () => <div>Hello /_dashboard/nodes!</div>
-})
\ No newline at end of file
+ component: () => <NodesPage />
+})
diff --git a/dashboard/src/routes/_dashboard/settings.tsx b/dashboard/src/routes/_dashboard/settings.tsx
@@ -0,0 +1,25 @@
+
+import { Card, CardContent, CardHeader, CardTitle } from '@marzneshin/components'
+import { CertificateButton } from '@marzneshin/features/settings'
+import { createFileRoute } from '@tanstack/react-router'
+import { useTranslation } from 'react-i18next'
+
+export const Settings = () => {
+ const { t } = useTranslation()
+ return (
+ <Card className="m-3">
+ <CardContent>
+ <CardHeader>
+ <CardTitle>
+ {t('settings')}
+ </CardTitle>
+ </CardHeader>
+ <CertificateButton />
+ </CardContent>
+ </Card>
+ )
+}
+
+export const Route = createFileRoute('/_dashboard/settings')({
+ component: () => <Settings />
+})
diff --git a/dashboard/src/utils/index.ts b/dashboard/src/utils/index.ts
@@ -1,2 +1,4 @@
export * from './cn'
export * from './fetch'
+export * from './cn'
+export * from './query-client'
diff --git a/dashboard/src/utils/query-client.ts b/dashboard/src/utils/query-client.ts
@@ -0,0 +1,3 @@
+import { QueryClient } from '@tanstack/react-query';
+
+export const queryClient = new QueryClient();