wip: create project modal

This commit is contained in:
Derock 2023-11-27 21:58:44 -05:00
parent fbc6508846
commit 0cc8515bbd
No known key found for this signature in database
9 changed files with 1144 additions and 3 deletions

View file

@ -17,12 +17,15 @@
},
"dependencies": {
"@mantine/form": "^7.2.1",
"@nicktomlin/codemirror-lang-yaml-lite": "^0.0.3",
"@prisma/migrate": "^5.5.2",
"@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-separator": "^1.0.3",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tabs": "^1.0.4",
"@t3-oss/env-nextjs": "^0.7.1",
"@tanstack/react-query": "^4.36.1",
"@tanstack/react-table": "^8.10.7",
@ -30,6 +33,8 @@
"@trpc/next": "^10.43.1",
"@trpc/react-query": "^10.43.1",
"@trpc/server": "^10.43.1",
"@uiw/codemirror-extensions-langs": "^4.21.21",
"@uiw/react-codemirror": "^4.21.21",
"argon2": "^0.31.2",
"better-sqlite3": "^9.0.0",
"bufferutil": "^4.0.8",
@ -50,6 +55,7 @@
"react": "18.2.0",
"react-dom": "18.2.0",
"react-icons": "^4.11.0",
"react-simple-code-editor": "^0.13.1",
"recharts": "^2.9.3",
"sonner": "^1.2.0",
"superjson": "^2.2.0",

View file

@ -8,9 +8,15 @@ dependencies:
'@mantine/form':
specifier: ^7.2.1
version: 7.2.1(react@18.2.0)
'@nicktomlin/codemirror-lang-yaml-lite':
specifier: ^0.0.3
version: 0.0.3
'@prisma/migrate':
specifier: ^5.5.2
version: 5.5.2(@prisma/generator-helper@5.5.2)(@prisma/internals@5.5.2)
'@radix-ui/react-dialog':
specifier: ^1.0.5
version: 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
specifier: ^2.0.6
version: 2.0.6(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
@ -26,6 +32,9 @@ dependencies:
'@radix-ui/react-slot':
specifier: ^1.0.2
version: 1.0.2(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-tabs':
specifier: ^1.0.4
version: 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@t3-oss/env-nextjs':
specifier: ^0.7.1
version: 0.7.1(typescript@5.2.2)(zod@3.22.4)
@ -47,6 +56,12 @@ dependencies:
'@trpc/server':
specifier: ^10.43.1
version: 10.43.1
'@uiw/codemirror-extensions-langs':
specifier: ^4.21.21
version: 4.21.21(@codemirror/autocomplete@6.11.1)(@codemirror/language-data@6.3.1)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.9)(@lezer/lr@1.3.14)
'@uiw/react-codemirror':
specifier: ^4.21.21
version: 4.21.21(@babel/runtime@7.23.2)(@codemirror/autocomplete@6.11.1)(@codemirror/language@6.9.3)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.5)(@codemirror/state@6.3.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.22.1)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0)
argon2:
specifier: ^0.31.2
version: 0.31.2
@ -107,6 +122,9 @@ dependencies:
react-icons:
specifier: ^4.11.0
version: 4.11.0(react@18.2.0)
react-simple-code-editor:
specifier: ^0.13.1
version: 0.13.1(react-dom@18.2.0)(react@18.2.0)
recharts:
specifier: ^2.9.3
version: 2.9.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0)
@ -448,6 +466,308 @@ packages:
js-yaml: 4.1.0
dev: true
/@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1):
resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
dependencies:
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
dev: false
/@codemirror/commands@6.3.1:
resolution: {integrity: sha512-mgVour3mg9pnZUp53LzWQLPTRIBI3aZcoMJiJu6R0FadsLrydmMFxq/HMcI1zkElWWXcjaIZXemyog5IMKVIIA==}
dependencies:
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
dev: false
/@codemirror/lang-angular@0.1.2:
resolution: {integrity: sha512-Nq7lmx9SU+JyoaRcs6SaJs7uAmW2W06HpgJVQYeZptVGNWDzDvzhjwVb/ZuG1rwTlOocY4Y9GwNOBuKCeJbKtw==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.9.3
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-cpp@6.0.2:
resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/cpp': 1.1.1
dev: false
/@codemirror/lang-css@6.2.1(@codemirror/view@6.22.1):
resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@lezer/common': 1.1.1
'@lezer/css': 1.1.4
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-html@6.4.7:
resolution: {integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1)
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/css': 1.1.4
'@lezer/html': 1.3.7
dev: false
/@codemirror/lang-java@6.0.1:
resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/java': 1.1.0
dev: false
/@codemirror/lang-javascript@6.2.1:
resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@codemirror/lint': 6.4.2
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/javascript': 1.4.9
dev: false
/@codemirror/lang-json@6.0.1:
resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/json': 1.0.1
dev: false
/@codemirror/lang-less@6.0.1(@codemirror/view@6.22.1):
resolution: {integrity: sha512-ABcsKBjLbyPZwPR5gePpc8jEKCQrFF4pby2WlMVdmJOOr7OWwwyz8DZonPx/cKDE00hfoSLc8F7yAcn/d6+rTQ==}
dependencies:
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1)
'@codemirror/language': 6.9.3
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-lezer@6.0.1:
resolution: {integrity: sha512-WHwjI7OqKFBEfkunohweqA5B/jIlxaZso6Nl3weVckz8EafYbPZldQEKSDb4QQ9H9BUkle4PVELP4sftKoA0uQ==}
dependencies:
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@lezer/common': 1.1.1
'@lezer/lezer': 1.1.2
dev: false
/@codemirror/lang-liquid@6.0.1:
resolution: {integrity: sha512-6KTyYIptG4v21gGxki5lIrYk6SF7BAu1FOF5EZUVzjH6z3/TtBRbijK2KXq31ycaF11ohzmuEHWLgMzn8Mnlag==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/language': 6.9.3
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-markdown@6.2.3:
resolution: {integrity: sha512-wCewRLWpdefWi7uVkHIDiE8+45Fe4buvMDZkihqEom5uRUQrl76Zb13emjeK3W+8pcRgRfAmwelURBbxNEKCIg==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-html': 6.4.7
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/markdown': 1.1.1
dev: false
/@codemirror/lang-php@6.0.1:
resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@lezer/common': 1.1.1
'@lezer/php': 1.0.1
dev: false
/@codemirror/lang-python@6.1.3(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1):
resolution: {integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@lezer/python': 1.1.9
transitivePeerDependencies:
- '@codemirror/state'
- '@codemirror/view'
- '@lezer/common'
dev: false
/@codemirror/lang-rust@6.0.1:
resolution: {integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/rust': 1.0.1
dev: false
/@codemirror/lang-sass@6.0.2(@codemirror/view@6.22.1):
resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==}
dependencies:
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@lezer/common': 1.1.1
'@lezer/sass': 1.0.3
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/lang-sql@6.5.4(@codemirror/view@6.22.1)(@lezer/common@1.1.1):
resolution: {integrity: sha512-5Gq7fYtT/5HbNyIG7a8vYaqOYQU3JbgtBe3+derkrFUXRVcjkf8WVgz++PIbMFAQsOFMDdDR+uiNM8ZRRuXH+w==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
transitivePeerDependencies:
- '@codemirror/view'
- '@lezer/common'
dev: false
/@codemirror/lang-vue@0.1.2:
resolution: {integrity: sha512-D4YrefiRBAr+CfEIM4S3yvGSbYW+N69mttIfGMEf7diHpRbmygDxS+R/5xSqjgtkY6VO6qmUrre1GkRcWeZa9A==}
dependencies:
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.9.3
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-wast@6.0.1:
resolution: {integrity: sha512-sQLsqhRjl2MWG3rxZysX+2XAyed48KhLBHLgq9xcKxIJu3npH/G+BIXW5NM5mHeDUjG0jcGh9BcjP0NfMStuzA==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.1):
resolution: {integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@lezer/common': 1.1.1
'@lezer/xml': 1.0.3
transitivePeerDependencies:
- '@codemirror/view'
dev: false
/@codemirror/language-data@6.3.1(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1):
resolution: {integrity: sha512-p6jhJmvhGe1TG1EGNhwH7nFWWFSTJ8NDKnB2fVx5g3t+PpO0+63R7GJNxjS0TmmH3cdMxZbzejsik+rlEh1EyQ==}
dependencies:
'@codemirror/lang-angular': 0.1.2
'@codemirror/lang-cpp': 6.0.2
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1)
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-java': 6.0.1
'@codemirror/lang-javascript': 6.2.1
'@codemirror/lang-json': 6.0.1
'@codemirror/lang-less': 6.0.1(@codemirror/view@6.22.1)
'@codemirror/lang-markdown': 6.2.3
'@codemirror/lang-php': 6.0.1
'@codemirror/lang-python': 6.1.3(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-rust': 6.0.1
'@codemirror/lang-sass': 6.0.2(@codemirror/view@6.22.1)
'@codemirror/lang-sql': 6.5.4(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-vue': 0.1.2
'@codemirror/lang-wast': 6.0.1
'@codemirror/lang-xml': 6.0.2(@codemirror/view@6.22.1)
'@codemirror/language': 6.9.3
'@codemirror/legacy-modes': 6.3.3
transitivePeerDependencies:
- '@codemirror/state'
- '@codemirror/view'
- '@lezer/common'
dev: false
/@codemirror/language@6.9.3:
resolution: {integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==}
dependencies:
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
style-mod: 4.1.0
dev: false
/@codemirror/legacy-modes@6.3.3:
resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==}
dependencies:
'@codemirror/language': 6.9.3
dev: false
/@codemirror/lint@6.4.2:
resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==}
dependencies:
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
crelt: 1.0.6
dev: false
/@codemirror/search@6.5.5:
resolution: {integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==}
dependencies:
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
crelt: 1.0.6
dev: false
/@codemirror/state@6.3.2:
resolution: {integrity: sha512-5jEikOfU0r9y+OTlZn5AEQB15mibu3deLBUp+GnLzVUNezEEuPt/JdSeniQNi+0YviblAvOPO2JQAlgJ3SYYaA==}
dev: false
/@codemirror/theme-one-dark@6.1.2:
resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==}
dependencies:
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/highlight': 1.2.0
dev: false
/@codemirror/view@6.22.1:
resolution: {integrity: sha512-38BRn1nPqZqiHbmWfI8zri23IbRVbmSpSmh1E/Ysvc+lIGGdBC17K8zlK7ZU6fhfy9x4De9Zyj5JQqScPq5DkA==}
dependencies:
'@codemirror/state': 6.3.2
style-mod: 4.1.0
w3c-keyname: 2.2.8
dev: false
/@colors/colors@1.6.0:
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
engines: {node: '>=0.1.90'}
@ -809,6 +1129,126 @@ packages:
resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
dev: true
/@lezer/common@1.1.1:
resolution: {integrity: sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==}
dev: false
/@lezer/cpp@1.1.1:
resolution: {integrity: sha512-eS1M3L3U2mDowoFVPG7tEp01SWu9/68Nx3HEBgLJVn3N9ku7g5S7WdFv0jzmcTipAyONYfZJ+7x4WRkfdB2Ung==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/css@1.1.4:
resolution: {integrity: sha512-CuUwjidrU7FOBokqASRJc72SmJ9g1PsHXDOWMoKg4md6+2u/Zxzwx5YsYrAFxRDsLrjLlsIyEF1rZHK3gFEJbw==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/highlight@1.1.6:
resolution: {integrity: sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==}
dependencies:
'@lezer/common': 1.1.1
dev: false
/@lezer/highlight@1.2.0:
resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==}
dependencies:
'@lezer/common': 1.1.1
dev: false
/@lezer/html@1.3.7:
resolution: {integrity: sha512-Wo+rZ5UjLP0VqUTyXjzgmTYRW5bvTJUFn4Uw0K3HCQjX2/+f+zRo9GLN5BCAojwHQISPvaQk8BWSv2SSKx/UcQ==}
dependencies:
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/java@1.1.0:
resolution: {integrity: sha512-RmBS+P9LJ4P9SU7ZewahMkBUNOEz1zQTMOKLq8OEa7ge8FZxz7mKjoEIGewRSn9kom1z5GKQjtxNE++m6u8SYw==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/javascript@1.4.9:
resolution: {integrity: sha512-7Uv8mBBE6l44spgWEZvEMdDqGV+FIuY7kJ1o5TFm+jxIuxydO3PcKJYiINij09igd1D/9P7l2KDqpkN8c3bM6A==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/json@1.0.1:
resolution: {integrity: sha512-nkVC27qiEZEjySbi6gQRuMwa2sDu2PtfjSgz0A4QF81QyRGm3kb2YRzLcOPcTEtmcwvrX/cej7mlhbwViA4WJw==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/lezer@1.1.2:
resolution: {integrity: sha512-O8yw3CxPhzYHB1hvwbdozjnAslhhR8A5BH7vfEMof0xk3p+/DFDfZkA9Tde6J+88WgtwaHy4Sy6ThZSkaI0Evw==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/lr@1.3.14:
resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==}
dependencies:
'@lezer/common': 1.1.1
dev: false
/@lezer/lr@1.3.9:
resolution: {integrity: sha512-XPz6dzuTHlnsbA5M2DZgjflNQ+9Hi5Swhic0RULdp3oOs3rh6bqGZolosVqN/fQIT8uNiepzINJDnS39oweTHQ==}
dependencies:
'@lezer/common': 1.1.1
dev: false
/@lezer/markdown@1.1.1:
resolution: {integrity: sha512-kmxvLnXCogUx2mexslWwVME1W2GQP76pwUODcFXLsuubuK41TcEJhKRm2FTKugNfEkUIspJNq9+jNo6b7dxVLA==}
dependencies:
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
dev: false
/@lezer/php@1.0.1:
resolution: {integrity: sha512-aqdCQJOXJ66De22vzdwnuC502hIaG9EnPK2rSi+ebXyUd+j7GAX1mRjWZOVOmf3GST1YUfUCu6WXDiEgDGOVwA==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/python@1.1.9:
resolution: {integrity: sha512-8Ua3p8NdICXR6qWvRCnCx5CI1B0DklZGNtRLwOrIS/OHecHIugRHZyr0NsaaQO2H2Nn34EPlRtltXIirLsry5Q==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/rust@1.0.1:
resolution: {integrity: sha512-j+ToFKM6Wpglv3OQ4ebHYdYIMT2dh0ziCCV0rTf47AWiHOVhR0WjaKrBq+yuvDQNEhr5sxPxVI7+naJIgpqcsQ==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/sass@1.0.3:
resolution: {integrity: sha512-n4l2nVOB7gWiGU/Cg2IVxpt2Ic9Hgfgy/7gk+p/XJibAsPXs0lSbsfGwQgwsAw9B/euYo3oS6lEFr9WytoqcZg==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@lezer/xml@1.0.3:
resolution: {integrity: sha512-lYT+0TKiDW4jQyz+R/JXQpbWavjIKqyFMvJ73JklyxFmAUnD6Iford98dk0OeVZG0j4MNnR7JQlmwTMpJGrU6A==}
dependencies:
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@mantine/form@7.2.1(react@18.2.0):
resolution: {integrity: sha512-Klh8QIz+uc2U3AR6d3R4/Eugvul4XbrSGx1+Dq8PtkepttWG7Zxv349aoR1iPBsDq543nLWqhsxhWpHphmD2uA==}
peerDependencies:
@ -944,6 +1384,28 @@ packages:
dev: false
optional: true
/@nextjournal/lang-clojure@1.0.0:
resolution: {integrity: sha512-gOCV71XrYD0DhwGoPMWZmZ0r92/lIHsqQu9QWdpZYYBwiChNwMO4sbVMP7eTuAqffFB2BTtCSC+1skSH9d3bNg==}
dependencies:
'@codemirror/language': 6.9.3
'@nextjournal/lezer-clojure': 1.0.0
dev: false
/@nextjournal/lezer-clojure@1.0.0:
resolution: {integrity: sha512-VZyuGu4zw5mkTOwQBTaGVNWmsOZAPw5ZRxu1/Knk/Xfs7EDBIogwIs5UXTYkuECX5ZQB8eOB+wKA2pc7VyqaZQ==}
dependencies:
'@lezer/lr': 1.3.14
dev: false
/@nicktomlin/codemirror-lang-yaml-lite@0.0.3:
resolution: {integrity: sha512-SazM0IxnovNYJXuNhz4L9M6YCty4ESjU583tZurwwzzgwpp9PwIdcXYFGycis4Z27vL37eN08mRzGbSIX5XBPw==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/common': 1.1.1
'@lezer/highlight': 1.1.6
'@lezer/lr': 1.3.9
dev: false
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -1217,6 +1679,40 @@ packages:
react: 18.2.0
dev: false
/@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.23.2
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@types/react': 18.2.37
'@types/react-dom': 18.2.15
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.37)(react@18.2.0)
dev: false
/@radix-ui/react-direction@1.0.1(@types/react@18.2.37)(react@18.2.0):
resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
peerDependencies:
@ -1561,6 +2057,34 @@ packages:
react: 18.2.0
dev: false
/@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(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.23.2
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-context': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-direction': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-id': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.15)(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.37)(react@18.2.0)
'@types/react': 18.2.37
'@types/react-dom': 18.2.15
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.37)(react@18.2.0):
resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
peerDependencies:
@ -1655,6 +2179,82 @@ packages:
'@babel/runtime': 7.23.2
dev: false
/@replit/codemirror-lang-csharp@6.2.0(@codemirror/autocomplete@6.11.1)(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14):
resolution: {integrity: sha512-6utbaWkoymhoAXj051mkRp+VIJlpwUgCX9Toevz3YatiZsz512fw3OVCedXQx+WcR0wb6zVHjChnuxqfCLtFVQ==}
peerDependencies:
'@codemirror/autocomplete': ^6.0.0
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
'@lezer/highlight': ^1.0.0
'@lezer/lr': ^1.0.0
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.11.1)(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14):
resolution: {integrity: sha512-lvzjoYn9nfJzBD5qdm3Ut6G3+Or2wEacYIDJ49h9+19WSChVnxv4ojf+rNmQ78ncuxIt/bfbMvDLMeMP0xze6g==}
peerDependencies:
'@codemirror/autocomplete': ^6.0.0
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
'@lezer/highlight': ^1.0.0
'@lezer/lr': ^1.0.0
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/@replit/codemirror-lang-solidity@6.0.1(@codemirror/language@6.9.3):
resolution: {integrity: sha512-kDnak0xZelGmvzJwKTpMTl6gYSfFq9hnxrkbLaMV0CARq/MFvDQJmcmYon/k8uZqXy6DfzewKDV8tx9kY2WUZg==}
peerDependencies:
'@codemirror/language': ^6.0.0
dependencies:
'@codemirror/language': 6.9.3
dev: false
/@replit/codemirror-lang-svelte@6.0.0(@codemirror/autocomplete@6.11.1)(@codemirror/lang-css@6.2.1)(@codemirror/lang-html@6.4.7)(@codemirror/lang-javascript@6.2.1)(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.9)(@lezer/lr@1.3.14):
resolution: {integrity: sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==}
peerDependencies:
'@codemirror/autocomplete': ^6.0.0
'@codemirror/lang-css': ^6.0.1
'@codemirror/lang-html': ^6.2.0
'@codemirror/lang-javascript': ^6.1.1
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
'@lezer/highlight': ^1.0.0
'@lezer/javascript': ^1.2.0
'@lezer/lr': ^1.0.0
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1)
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-javascript': 6.2.1
'@codemirror/language': 6.9.3
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
'@lezer/common': 1.1.1
'@lezer/highlight': 1.2.0
'@lezer/javascript': 1.4.9
'@lezer/lr': 1.3.14
dev: false
/@rushstack/eslint-patch@1.5.1:
resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==}
dev: true
@ -2140,6 +2740,97 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
/@uiw/codemirror-extensions-basic-setup@4.21.21(@codemirror/autocomplete@6.11.1)(@codemirror/commands@6.3.1)(@codemirror/language@6.9.3)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.5)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1):
resolution: {integrity: sha512-+0i9dPrRSa8Mf0CvyrMvnAhajnqwsP3IMRRlaHDRgsSGL8igc4z7MhvUPn+7cWFAAqWzQRhMdMSWzo6/TEa3EA==}
peerDependencies:
'@codemirror/autocomplete': '>=6.0.0'
'@codemirror/commands': '>=6.0.0'
'@codemirror/language': '>=6.0.0'
'@codemirror/lint': '>=6.0.0'
'@codemirror/search': '>=6.0.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/commands': 6.3.1
'@codemirror/language': 6.9.3
'@codemirror/lint': 6.4.2
'@codemirror/search': 6.5.5
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
dev: false
/@uiw/codemirror-extensions-langs@4.21.21(@codemirror/autocomplete@6.11.1)(@codemirror/language-data@6.3.1)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.9)(@lezer/lr@1.3.14):
resolution: {integrity: sha512-h08pw2NeGLDgBiY8Ju5GNjfVzq1f6+wc0uPdqN5tkYBaKmByyKI10l5Gds7wBPzFH0uZlevP+Jyf9oSTcula5Q==}
peerDependencies:
'@codemirror/language-data': '>=6.0.0'
'@codemirror/legacy-modes': '>=6.0.0'
dependencies:
'@codemirror/lang-angular': 0.1.2
'@codemirror/lang-cpp': 6.0.2
'@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1)
'@codemirror/lang-html': 6.4.7
'@codemirror/lang-java': 6.0.1
'@codemirror/lang-javascript': 6.2.1
'@codemirror/lang-json': 6.0.1
'@codemirror/lang-less': 6.0.1(@codemirror/view@6.22.1)
'@codemirror/lang-lezer': 6.0.1
'@codemirror/lang-liquid': 6.0.1
'@codemirror/lang-markdown': 6.2.3
'@codemirror/lang-php': 6.0.1
'@codemirror/lang-python': 6.1.3(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-rust': 6.0.1
'@codemirror/lang-sass': 6.0.2(@codemirror/view@6.22.1)
'@codemirror/lang-sql': 6.5.4(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/lang-vue': 0.1.2
'@codemirror/lang-wast': 6.0.1
'@codemirror/lang-xml': 6.0.2(@codemirror/view@6.22.1)
'@codemirror/language-data': 6.3.1(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/legacy-modes': 6.3.3
'@nextjournal/lang-clojure': 1.0.0
'@replit/codemirror-lang-csharp': 6.2.0(@codemirror/autocomplete@6.11.1)(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)
'@replit/codemirror-lang-nix': 6.0.1(@codemirror/autocomplete@6.11.1)(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)
'@replit/codemirror-lang-solidity': 6.0.1(@codemirror/language@6.9.3)
'@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.11.1)(@codemirror/lang-css@6.2.1)(@codemirror/lang-html@6.4.7)(@codemirror/lang-javascript@6.2.1)(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.9)(@lezer/lr@1.3.14)
codemirror-lang-mermaid: 0.5.0
transitivePeerDependencies:
- '@codemirror/autocomplete'
- '@codemirror/language'
- '@codemirror/state'
- '@codemirror/view'
- '@lezer/common'
- '@lezer/highlight'
- '@lezer/javascript'
- '@lezer/lr'
dev: false
/@uiw/react-codemirror@4.21.21(@babel/runtime@7.23.2)(@codemirror/autocomplete@6.11.1)(@codemirror/language@6.9.3)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.5)(@codemirror/state@6.3.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.22.1)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-PaxBMarufMWoR0qc5zuvBSt76rJ9POm9qoOaJbqRmnNL2viaF+d+Paf2blPSlm1JSnqn7hlRjio+40nZJ9TKzw==}
peerDependencies:
'@babel/runtime': '>=7.11.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/theme-one-dark': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
codemirror: '>=6.0.0'
react: '>=16.8.0'
react-dom: '>=16.8.0'
dependencies:
'@babel/runtime': 7.23.2
'@codemirror/commands': 6.3.1
'@codemirror/state': 6.3.2
'@codemirror/theme-one-dark': 6.1.2
'@codemirror/view': 6.22.1
'@uiw/codemirror-extensions-basic-setup': 4.21.21(@codemirror/autocomplete@6.11.1)(@codemirror/commands@6.3.1)(@codemirror/language@6.9.3)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.5)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)
codemirror: 6.0.1(@lezer/common@1.1.1)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
transitivePeerDependencies:
- '@codemirror/autocomplete'
- '@codemirror/language'
- '@codemirror/lint'
- '@codemirror/search'
dev: false
/@ungap/structured-clone@1.2.0:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true
@ -2862,6 +3553,28 @@ packages:
type-is: 1.6.18
dev: false
/codemirror-lang-mermaid@0.5.0:
resolution: {integrity: sha512-Taw/2gPCyNArQJCxIP/HSUif+3zrvD+6Ugt7KJZ2dUKou/8r3ZhcfG8krNTZfV2iu8AuGnymKuo7bLPFyqsh/A==}
dependencies:
'@codemirror/language': 6.9.3
'@lezer/highlight': 1.2.0
'@lezer/lr': 1.3.14
dev: false
/codemirror@6.0.1(@lezer/common@1.1.1):
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
'@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1)
'@codemirror/commands': 6.3.1
'@codemirror/language': 6.9.3
'@codemirror/lint': 6.4.2
'@codemirror/search': 6.5.5
'@codemirror/state': 6.3.2
'@codemirror/view': 6.22.1
transitivePeerDependencies:
- '@lezer/common'
dev: false
/collection-visit@1.0.0:
resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
engines: {node: '>=0.10.0'}
@ -3024,6 +3737,10 @@ packages:
readable-stream: 3.6.2
dev: false
/crelt@1.0.6:
resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
dev: false
/cross-spawn@6.0.5:
resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==}
engines: {node: '>=4.8'}
@ -6781,6 +7498,16 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
/react-simple-code-editor@0.13.1(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-XYeVwRZwgyKtjNIYcAEgg2FaQcCZwhbarnkJIV20U2wkCU9q/CPFBo8nRXrK4GXUz3AvbqZFsZRrpUTkqqEYyQ==}
peerDependencies:
react: '*'
react-dom: '*'
dependencies:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/react-smooth@2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==}
peerDependencies:
@ -7562,6 +8289,10 @@ packages:
engines: {node: '>=8'}
dev: true
/style-mod@4.1.0:
resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==}
dev: false
/styled-jsx@5.1.1(react@18.2.0):
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'}
@ -8240,6 +8971,10 @@ packages:
d3-timer: 3.0.1
dev: false
/w3c-keyname@2.2.8:
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
dev: false
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}

View file

@ -0,0 +1,148 @@
"use client";
import { Button } from "~/components/ui/button";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "~/components/ui/dialog";
import { Input } from "~/components/ui/input";
import { Label } from "~/components/ui/label";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs";
import { useForm } from "@mantine/form";
import { Textarea } from "~/components/ui/textarea";
import React, { Suspense } from "react";
import { useQuery } from "@tanstack/react-query";
import { toast } from "sonner";
// kinda large dependency, but syntax highlighting is nice
const Editor = React.lazy(() => import("./YAMLEditor"));
enum ProjectType {
Template = "template",
Compose = "compose",
Blank = "blank",
}
export function CreateProjectButton() {
const form = useForm({
initialValues: {
name: "",
type: ProjectType.Template,
composeURL: "",
composeFile:
"version: '3.8'\n\nservices:\n# Everything written here will be transformed into a HostForge service.\n# Please note that some options are not supported by Docker Swarm and not all options are supported by HostForge.",
},
validate: {
composeFile: (value, others) => {
if (others.type === ProjectType.Compose && !value) {
return "A Docker Compose file is required";
}
},
},
});
const fetchComposeFile = useQuery(
["fetchComposeFile", form.values.composeURL],
async () => {
const response = await fetch(form.values.composeURL);
return await response.text();
},
{
enabled: false,
cacheTime: 0,
onSuccess(data) {
form.setFieldValue("composeFile", data);
toast.success("Fetched Docker Compose file");
},
},
);
return (
<Dialog>
<DialogTrigger asChild>
<Button variant="outline">Create Project</Button>
</DialogTrigger>
<DialogContent className="m-4 max-w-4xl overflow-scroll [&>*]:max-w-full">
<DialogHeader>
<DialogTitle>Create a Project</DialogTitle>
<DialogDescription>
Each project has it's own private internal network and is isolated
from other projects. You can either create a blank project or choose
from a template.
</DialogDescription>
</DialogHeader>
<form
onSubmit={form.onSubmit(() => {})}
className="max-w-full space-y-4"
>
<div className="space-y-2">
<Label htmlFor="project-name">Project Name</Label>
<Input
id="project-name"
placeholder="My Project"
className="w-full"
/>
</div>
<Tabs defaultValue="templates" className="w-full max-w-full">
<TabsList className="mx-auto">
<TabsTrigger value="templates">From a Template</TabsTrigger>
<TabsTrigger value="compose">
From a Docker Compose file
</TabsTrigger>
<TabsTrigger value="blank">Create Blank Project</TabsTrigger>
</TabsList>
<TabsContent value="templates">
<div className="rounded-md bg-background p-4">
<p>Templates</p>
</div>
</TabsContent>
<TabsContent value="compose" className="space-y-2">
<Label htmlFor="compose-url">Docker Compose URL</Label>
<div className="flex flex-row gap-2">
<Input
id="compose-url"
placeholder="https://example.com/docker-compose.yml"
className="flex-grow"
{...form.getInputProps("composeURL")}
/>
<Button
variant="outline"
onClick={() => fetchComposeFile.refetch()}
isLoading={fetchComposeFile.isFetching}
>
Fetch
</Button>
</div>
<Label htmlFor="compose-file" className="mt-2">
Docker Compose File
</Label>
<Suspense fallback={<div>Loading the editor...</div>}>
<Editor
value={form.values.composeFile}
onChange={(value) => form.setFieldValue("composeFile", value)}
/>
</Suspense>
</TabsContent>
<TabsContent value="blank"></TabsContent>
</Tabs>
</form>
<DialogFooter>
<Button type="submit">Create Project</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}

View file

@ -0,0 +1,44 @@
"use client";
import CodeMirror from "@uiw/react-codemirror";
// import { yaml } from "@nicktomlin/codemirror-lang-yaml-lite";
import { langs } from "@uiw/codemirror-extensions-langs";
import { useTheme } from "next-themes";
export default function YAMLEditor({
value,
onChange,
}: {
value: string;
onChange: (value: string) => void;
}) {
const theme = useTheme();
return (
// <div className="relative w-full max-w-full">
<CodeMirror
value={value}
onChange={onChange}
theme={theme.theme === "dark" ? "dark" : "light"}
extensions={[langs.yaml()]}
data-enable-grammarly="false"
spellCheck={false}
width="100%"
maxHeight="40vh"
maxWidth="100%"
// options={{
// mode: "yaml",
// theme: "material",
// lineNumbers: true,
// lineWrapping: true,
// tabSize: 2,
// indentWithTabs: false,
// extraKeys: {
// Tab: false,
// "Shift-Tab": false,
// },
// }}
/>
// </div>
);
}

View file

@ -2,6 +2,8 @@ import { api } from "~/trpc/server";
import { SystemStatistics } from "./_components/SystemStatistics";
import { Project } from "./_components/Project";
import { Button } from "~/components/ui/button";
import { CreateProjectButton } from "./_components/CreateProject";
import YAMLEditor from "./_components/YAMLEditor";
export default async function DashboardHome() {
const [initialStats, historicalData] = await Promise.all([
@ -24,14 +26,17 @@ export default async function DashboardHome() {
<div className="mt-4 flex flex-row justify-between align-bottom">
<h2 className="mb-0 mt-auto block text-xl font-semibold">Projects</h2>
<Button variant="outline">Create project</Button>
{/* <Button variant="outline">Create project</Button> */}
<CreateProjectButton />
</div>
</div>
<div className="mt-4 grid grid-cols-2 gap-8">
{/* <Project />
<Project />
<Project />
<Project />
<Project /> */}
<YAMLEditor value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />
</div>
</div>
);

View file

@ -0,0 +1,2 @@
# UI Elements
This folder contains shadcn/ui elements.

View file

@ -0,0 +1,122 @@
"use client";
import * as React from "react";
import * as DialogPrimitive from "@radix-ui/react-dialog";
import { Cross2Icon } from "@radix-ui/react-icons";
import { cn } from "~/utils/utils";
const Dialog = DialogPrimitive.Root;
const DialogTrigger = DialogPrimitive.Trigger;
const DialogPortal = DialogPrimitive.Portal;
const DialogClose = DialogPrimitive.Close;
const DialogOverlay = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Overlay
ref={ref}
className={cn(
"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className,
)}
{...props}
/>
));
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
const DialogContent = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<DialogPortal>
<DialogOverlay />
<DialogPrimitive.Content
ref={ref}
className={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
className,
)}
{...props}
>
{children}
<DialogPrimitive.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-accent data-[state=open]:text-muted-foreground">
<Cross2Icon className="h-4 w-4" />
<span className="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPortal>
));
DialogContent.displayName = DialogPrimitive.Content.displayName;
const DialogHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-1.5 text-center sm:text-left",
className,
)}
{...props}
/>
);
DialogHeader.displayName = "DialogHeader";
const DialogFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className,
)}
{...props}
/>
);
DialogFooter.displayName = "DialogFooter";
const DialogTitle = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Title
ref={ref}
className={cn(
"text-lg font-semibold leading-none tracking-tight",
className,
)}
{...props}
/>
));
DialogTitle.displayName = DialogPrimitive.Title.displayName;
const DialogDescription = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
DialogDescription.displayName = DialogPrimitive.Description.displayName;
export {
Dialog,
DialogPortal,
DialogOverlay,
DialogTrigger,
DialogClose,
DialogContent,
DialogHeader,
DialogFooter,
DialogTitle,
DialogDescription,
};

View file

@ -0,0 +1,55 @@
"use client";
import * as React from "react";
import * as TabsPrimitive from "@radix-ui/react-tabs";
import { cn } from "~/utils/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-9 items-center justify-center rounded-lg 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-md px-3 py-1 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",
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 };

View file

@ -0,0 +1,24 @@
import * as React from "react"
import { cn } from "~/utils/utils.ts"
export interface TextareaProps
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
({ className, ...props }, ref) => {
return (
<textarea
className={cn(
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
className
)}
ref={ref}
{...props}
/>
)
}
)
Textarea.displayName = "Textarea"
export { Textarea }