diff --git a/app/package.json b/app/package.json index 594c8ee..028ee9d 100644 --- a/app/package.json +++ b/app/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "axios": "^1.4.0", + "md-editor-v3": "^4.2.2", "vue": "^3.2.45", "vue-router": "^4.2.4" }, diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index cb93d81..cb543bf 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: axios: specifier: ^1.4.0 version: 1.4.0 + md-editor-v3: + specifier: ^4.2.2 + version: 4.2.2(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3)(vue@3.2.45) vue: specifier: ^3.2.45 version: 3.2.45 @@ -54,6 +57,280 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3): + resolution: {integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==} + 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.8.0 + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + '@lezer/common': 1.0.3 + dev: false + + /@codemirror/commands@6.2.4: + resolution: {integrity: sha512-42lmDqVH0ttfilLShReLXsDfASKLXzfyC36bzwcqzox9PlHulMcsUOfHXNo2X2aFMVNUoQ7j+d4q5bnfseYoOA==} + dependencies: + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + '@lezer/common': 1.0.3 + dev: false + + /@codemirror/lang-angular@0.1.2: + resolution: {integrity: sha512-Nq7lmx9SU+JyoaRcs6SaJs7uAmW2W06HpgJVQYeZptVGNWDzDvzhjwVb/ZuG1rwTlOocY4Y9GwNOBuKCeJbKtw==} + dependencies: + '@codemirror/lang-html': 6.4.5 + '@codemirror/lang-javascript': 6.1.9 + '@codemirror/language': 6.8.0 + '@lezer/common': 1.0.3 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@codemirror/lang-cpp@6.0.2: + resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==} + dependencies: + '@codemirror/language': 6.8.0 + '@lezer/cpp': 1.1.1 + dev: false + + /@codemirror/lang-css@6.2.0(@codemirror/view@6.15.3): + resolution: {integrity: sha512-oyIdJM29AyRPM3+PPq1I2oIk8NpUfEN3kAM05XWDDs6o3gSneIKaVJifT2P+fqONLou2uIgXynFyMUDQvo/szA==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@lezer/common': 1.0.3 + '@lezer/css': 1.1.3 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-html@6.4.5: + resolution: {integrity: sha512-dUCSxkIw2G+chaUfw3Gfu5kkN83vJQN8gfQDp9iEHsIZluMJA0YJveT12zg/28BJx+uPsbQ6VimKCgx3oJrZxA==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/lang-css': 6.2.0(@codemirror/view@6.15.3) + '@codemirror/lang-javascript': 6.1.9 + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + '@lezer/common': 1.0.3 + '@lezer/css': 1.1.3 + '@lezer/html': 1.3.6 + dev: false + + /@codemirror/lang-java@6.0.1: + resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} + dependencies: + '@codemirror/language': 6.8.0 + '@lezer/java': 1.0.4 + dev: false + + /@codemirror/lang-javascript@6.1.9: + resolution: {integrity: sha512-z3jdkcqOEBT2txn2a87A0jSy6Te3679wg/U8QzMeftFt+4KA6QooMwfdFzJiuC3L6fXKfTXZcDocoaxMYfGz0w==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 + '@codemirror/lint': 6.4.0 + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + '@lezer/common': 1.0.3 + '@lezer/javascript': 1.4.4 + dev: false + + /@codemirror/lang-json@6.0.1: + resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + dependencies: + '@codemirror/language': 6.8.0 + '@lezer/json': 1.0.1 + dev: false + + /@codemirror/lang-less@6.0.1(@codemirror/view@6.15.3): + resolution: {integrity: sha512-ABcsKBjLbyPZwPR5gePpc8jEKCQrFF4pby2WlMVdmJOOr7OWwwyz8DZonPx/cKDE00hfoSLc8F7yAcn/d6+rTQ==} + dependencies: + '@codemirror/lang-css': 6.2.0(@codemirror/view@6.15.3) + '@codemirror/language': 6.8.0 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-markdown@6.2.0: + resolution: {integrity: sha512-deKegEQVzfBAcLPqsJEa+IxotqPVwWZi90UOEvQbfa01NTAw8jNinrykuYPTULGUj+gha0ZG2HBsn4s5d64Qrg==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/lang-html': 6.4.5 + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + '@lezer/common': 1.0.3 + '@lezer/markdown': 1.0.5 + dev: false + + /@codemirror/lang-php@6.0.1: + resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} + dependencies: + '@codemirror/lang-html': 6.4.5 + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@lezer/common': 1.0.3 + '@lezer/php': 1.0.1 + dev: false + + /@codemirror/lang-python@6.1.3(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3): + resolution: {integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 + '@lezer/python': 1.1.8 + 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.8.0 + '@lezer/rust': 1.0.1 + dev: false + + /@codemirror/lang-sass@6.0.2(@codemirror/view@6.15.3): + resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} + dependencies: + '@codemirror/lang-css': 6.2.0(@codemirror/view@6.15.3) + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@lezer/common': 1.0.3 + '@lezer/sass': 1.0.3 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-sql@6.5.2(@codemirror/view@6.15.3)(@lezer/common@1.0.3): + resolution: {integrity: sha512-VYiCbApDDRUVx3k0jtZ+b5h2hMkMKZpPR9tx+VgVA3Euuf2MVjVsjx/S2+4AlJjKjS5J6z9+4bEvtponK96e4A==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + 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.5 + '@codemirror/lang-javascript': 6.1.9 + '@codemirror/language': 6.8.0 + '@lezer/common': 1.0.3 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@codemirror/lang-wast@6.0.1: + resolution: {integrity: sha512-sQLsqhRjl2MWG3rxZysX+2XAyed48KhLBHLgq9xcKxIJu3npH/G+BIXW5NM5mHeDUjG0jcGh9BcjP0NfMStuzA==} + dependencies: + '@codemirror/language': 6.8.0 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.15.3): + resolution: {integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/language': 6.8.0 + '@codemirror/state': 6.2.1 + '@lezer/common': 1.0.3 + '@lezer/xml': 1.0.2 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/language-data@6.3.1(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3): + 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.0(@codemirror/view@6.15.3) + '@codemirror/lang-html': 6.4.5 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.1.9 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-less': 6.0.1(@codemirror/view@6.15.3) + '@codemirror/lang-markdown': 6.2.0 + '@codemirror/lang-php': 6.0.1 + '@codemirror/lang-python': 6.1.3(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/lang-rust': 6.0.1 + '@codemirror/lang-sass': 6.0.2(@codemirror/view@6.15.3) + '@codemirror/lang-sql': 6.5.2(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/lang-vue': 0.1.2 + '@codemirror/lang-wast': 6.0.1 + '@codemirror/lang-xml': 6.0.2(@codemirror/view@6.15.3) + '@codemirror/language': 6.8.0 + '@codemirror/legacy-modes': 6.3.2 + transitivePeerDependencies: + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + dev: false + + /@codemirror/language@6.8.0: + resolution: {integrity: sha512-r1paAyWOZkfY0RaYEZj3Kul+MiQTEbDvYqf8gPGaRvNneHXCmfSaAVFjwRUPlgxS8yflMxw2CTu6uCMp8R8A2g==} + dependencies: + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + '@lezer/common': 1.0.3 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + style-mod: 4.0.3 + dev: false + + /@codemirror/legacy-modes@6.3.2: + resolution: {integrity: sha512-ki5sqNKWzKi5AKvpVE6Cna4Q+SgxYuYVLAZFSsMjGBWx5qSVa+D+xipix65GS3f2syTfAD9pXKMX4i4p49eneQ==} + dependencies: + '@codemirror/language': 6.8.0 + dev: false + + /@codemirror/lint@6.4.0: + resolution: {integrity: sha512-6VZ44Ysh/Zn07xrGkdtNfmHCbGSHZzFBdzWi0pbd7chAQ/iUcpLGX99NYRZTa7Ugqg4kEHCqiHhcZnH0gLIgSg==} + dependencies: + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.5.0: + resolution: {integrity: sha512-64/M40YeJPToKvGO6p3fijo2vwUEj4nACEAXElCaYQ50HrXSvRaK+NHEhSh73WFBGdvIdhrV+lL9PdJy2RfCYA==} + dependencies: + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.2.1: + resolution: {integrity: sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==} + dev: false + + /@codemirror/view@6.15.3: + resolution: {integrity: sha512-chNgR8H7Ipx7AZUt0+Kknk7BCow/ron3mHd1VZdM7hQXiI79+UlWqcxpCiexTxZQ+iSkqndk3HHAclJOcjSuog==} + dependencies: + '@codemirror/state': 6.2.1 + style-mod: 4.0.3 + w3c-keyname: 2.2.8 + dev: false + /@esbuild/android-arm64@0.16.17: resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} @@ -256,6 +533,126 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@lezer/common@1.0.3: + resolution: {integrity: sha512-JH4wAXCgUOcCGNekQPLhVeUtIqjH0yPBs7vvUdSjyQama9618IOKFJwkv2kcqdhF0my8hQEgCTEJU0GIgnahvA==} + dev: false + + /@lezer/cpp@1.1.1: + resolution: {integrity: sha512-eS1M3L3U2mDowoFVPG7tEp01SWu9/68Nx3HEBgLJVn3N9ku7g5S7WdFv0jzmcTipAyONYfZJ+7x4WRkfdB2Ung==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/css@1.1.3: + resolution: {integrity: sha512-SjSM4pkQnQdJDVc80LYzEaMiNy9txsFbI7HsMgeVF28NdLaAdHNtQ+kB/QqDUzRBV/75NTXjJ/R5IdC8QQGxMg==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/highlight@1.1.6: + resolution: {integrity: sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==} + dependencies: + '@lezer/common': 1.0.3 + dev: false + + /@lezer/html@1.3.6: + resolution: {integrity: sha512-Kk9HJARZTc0bAnMQUqbtuhFVsB4AnteR2BFUWfZV7L/x1H0aAKz6YabrfJ2gk/BEgjh9L3hg5O4y2IDZRBdzuQ==} + dependencies: + '@lezer/common': 1.0.3 + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/java@1.0.4: + resolution: {integrity: sha512-POc53LHf2AuNeRXjqZbXNu88GKj0KZTjjSx0L7tYeXlrEHF+3NAQx+dEwKVuCbkl0ZMtpRy2VsDYOV7KKV0oyg==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/javascript@1.4.4: + resolution: {integrity: sha512-0BiBjpEcrt2IXrIzEAsdTLylrVhGHRqVQL3baTBx1sf4qewjIvhG1/pTUumu7W/7YR0AASjLQOQxFmo5EvNmzQ==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/json@1.0.1: + resolution: {integrity: sha512-nkVC27qiEZEjySbi6gQRuMwa2sDu2PtfjSgz0A4QF81QyRGm3kb2YRzLcOPcTEtmcwvrX/cej7mlhbwViA4WJw==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/lr@1.3.9: + resolution: {integrity: sha512-XPz6dzuTHlnsbA5M2DZgjflNQ+9Hi5Swhic0RULdp3oOs3rh6bqGZolosVqN/fQIT8uNiepzINJDnS39oweTHQ==} + dependencies: + '@lezer/common': 1.0.3 + dev: false + + /@lezer/markdown@1.0.5: + resolution: {integrity: sha512-J0LRA0l21Ec6ZroaOxjxsWWm+swCOFHcnOU85Z7aH9nj3eJx5ORmtzVkWzs9e21SZrdvyIzM1gt+YF/HnqbvnA==} + dependencies: + '@lezer/common': 1.0.3 + '@lezer/highlight': 1.1.6 + dev: false + + /@lezer/php@1.0.1: + resolution: {integrity: sha512-aqdCQJOXJ66De22vzdwnuC502hIaG9EnPK2rSi+ebXyUd+j7GAX1mRjWZOVOmf3GST1YUfUCu6WXDiEgDGOVwA==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/python@1.1.8: + resolution: {integrity: sha512-1T/XsmeF57ijrjpC0Zmrf9YeO5mn2zC1XeSNrOnc0KB+6PgxJ5m7kWKt0CnwyS74oHQXbJxUUL+QDQJR26c1Gw==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/rust@1.0.1: + resolution: {integrity: sha512-j+ToFKM6Wpglv3OQ4ebHYdYIMT2dh0ziCCV0rTf47AWiHOVhR0WjaKrBq+yuvDQNEhr5sxPxVI7+naJIgpqcsQ==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/sass@1.0.3: + resolution: {integrity: sha512-n4l2nVOB7gWiGU/Cg2IVxpt2Ic9Hgfgy/7gk+p/XJibAsPXs0lSbsfGwQgwsAw9B/euYo3oS6lEFr9WytoqcZg==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@lezer/xml@1.0.2: + resolution: {integrity: sha512-dlngsWceOtQBMuBPw5wtHpaxdPJ71aVntqjbpGkFtWsp4WtQmCnuTjQGocviymydN6M18fhj6UQX3oiEtSuY7w==} + dependencies: + '@lezer/highlight': 1.1.6 + '@lezer/lr': 1.3.9 + dev: false + + /@types/linkify-it@3.0.2: + resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} + dev: false + + /@types/markdown-it@12.2.3: + resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + dependencies: + '@types/linkify-it': 3.0.2 + '@types/mdurl': 1.0.2 + dev: false + + /@types/mdurl@1.0.2: + resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + dev: false + + /@vavt/util@1.1.1: + resolution: {integrity: sha512-0x+Acegd8k6lFJc7SN4kVhO669fBiMtBjq/WqX2C8Uz5mSgS+nRvfXs0BK2aiV67T0rauBoAmEkQfURQjI2+4Q==} + dev: false + /@vitejs/plugin-vue@4.0.0(vite@4.1.0-beta.0)(vue@3.2.45): resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -441,6 +838,10 @@ packages: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -465,6 +866,20 @@ packages: balanced-match: 1.0.2 dev: true + /codemirror@6.0.1(@lezer/common@1.0.3): + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + dependencies: + '@codemirror/autocomplete': 6.9.0(@codemirror/language@6.8.0)(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@codemirror/commands': 6.2.4 + '@codemirror/language': 6.8.0 + '@codemirror/lint': 6.4.0 + '@codemirror/search': 6.5.0 + '@codemirror/state': 6.2.1 + '@codemirror/view': 6.15.3 + transitivePeerDependencies: + - '@lezer/common' + dev: false + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -472,6 +887,16 @@ packages: delayed-stream: 1.0.0 dev: false + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + /csstype@2.6.21: resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} @@ -484,6 +909,11 @@ packages: engines: {node: '>=0.4.0'} dev: false + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: false + /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} @@ -566,6 +996,17 @@ packages: has: 1.0.3 dev: true + /linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + dependencies: + uc.micro: 1.0.6 + dev: false + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + dev: false + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -578,6 +1019,62 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /markdown-it-image-figures@2.1.1(markdown-it@13.0.1): + resolution: {integrity: sha512-mwXSQ2nPeVUzCMIE3HlLvjRioopiqyJLNph0pyx38yf9mpqFDhNGnMpAXF9/A2Xv0oiF2cVyg9xwfF0HNAz05g==} + engines: {node: '>=12.0.0'} + peerDependencies: + markdown-it: '*' + dependencies: + markdown-it: 13.0.1 + dev: false + + /markdown-it-task-lists@2.1.1: + resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} + dev: false + + /markdown-it@13.0.1: + resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: false + + /md-editor-v3@4.2.2(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3)(vue@3.2.45): + resolution: {integrity: sha512-aVfbYCDHt74sVFJbYxY0YPBtkQwOBW2uF1+tOUuQc6JBR5DNvGmHwmTJN6/zCIFoeDCA2nPtaq++ZYcVmCc2qw==} + peerDependencies: + vue: ^3.2.47 + dependencies: + '@codemirror/lang-markdown': 6.2.0 + '@codemirror/language-data': 6.3.1(@codemirror/state@6.2.1)(@codemirror/view@6.15.3)(@lezer/common@1.0.3) + '@types/markdown-it': 12.2.3 + '@vavt/util': 1.1.1 + codemirror: 6.0.1(@lezer/common@1.0.3) + copy-to-clipboard: 3.3.3 + lru-cache: 8.0.5 + markdown-it: 13.0.1 + markdown-it-image-figures: 2.1.1(markdown-it@13.0.1) + markdown-it-task-lists: 2.1.1 + medium-zoom: 1.0.8 + punycode: 2.3.0 + vue: 3.2.45 + transitivePeerDependencies: + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + dev: false + + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: false + + /medium-zoom@1.0.8: + resolution: {integrity: sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==} + dev: false + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -625,6 +1122,11 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: false + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true @@ -654,6 +1156,10 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + /style-mod@4.0.3: + resolution: {integrity: sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==} + dev: false + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -663,12 +1169,20 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + /typescript@4.9.3: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} hasBin: true dev: true + /uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: false + /vite@4.1.0-beta.0: resolution: {integrity: sha512-8ckl5OzA82YcZjAmnUzmLzK9FHluq7hMNrxeb8sMLE8znvBF9lcyR9A8s0q33Ebc+ZqgXcWSESUyycJhMZtgGw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -737,3 +1251,7 @@ packages: '@vue/runtime-dom': 3.2.45 '@vue/server-renderer': 3.2.45(vue@3.2.45) '@vue/shared': 3.2.45 + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false diff --git a/app/src/assets/script/conversation.ts b/app/src/assets/script/conversation.ts index ef7fabb..b0b9b50 100644 --- a/app/src/assets/script/conversation.ts +++ b/app/src/assets/script/conversation.ts @@ -1,4 +1,4 @@ -import { reactive, ref } from "vue"; +import {nextTick, reactive, ref} from "vue"; import type { Ref } from "vue"; import axios from "axios"; @@ -13,12 +13,14 @@ export class Conversation { messages: Message[]; len: Ref; state: Ref; + refresh: () => void; - public constructor(id: number) { + public constructor(id: number, refresh: () => void) { this.id = id; this.messages = reactive([]); this.state = ref(false); this.len = ref(0); + this.refresh = refresh; } public async send(content: string): Promise { @@ -48,14 +50,30 @@ export class Conversation { role: "user", timestamp: new Date().toLocaleTimeString(), }) + nextTick(() => { + this.refresh(); + }).then(r => 0); } public addMessageFromAI(content: string): void { this.addMessage({ - content: content, + content: "", role: "bot", timestamp: new Date().toLocaleTimeString(), }) + this.typingEffect(this.len.value - 1, content); + } + + public typingEffect(index: number, content: string): void { + let cursor = 0; + const interval = setInterval(() => { + this.messages[index].content = content.substring(0, cursor); + cursor++; + this.refresh(); + if (cursor > content.length) { + clearInterval(interval); + } + }, 35); } public getMessages(): Message[] { diff --git a/app/src/assets/style/base.css b/app/src/assets/style/base.css index c06c084..dee5958 100644 --- a/app/src/assets/style/base.css +++ b/app/src/assets/style/base.css @@ -64,6 +64,18 @@ button:focus-visible { outline: 4px auto -webkit-focus-ring-color; } +.md-editor.md-editor-previewOnly { + --md-bk-color: none !important; +} + +.md-editor-dark { + --md-color: #eee !important; +} + +.md-editor-preview-wrapper { + padding: 0 !important; +} + @media (prefers-color-scheme: light) { } diff --git a/app/src/views/HomeView.vue b/app/src/views/HomeView.vue index c3394ef..dc47435 100644 --- a/app/src/views/HomeView.vue +++ b/app/src/views/HomeView.vue @@ -1,10 +1,12 @@