Compare commits

...

8 Commits
redo ... main

15 changed files with 1325 additions and 425 deletions

12
README.md Normal file
View File

@ -0,0 +1,12 @@
# Homepage
This is the repository containing the source code for my homepage on the web.
Within the `app/` directory, you'll find the Vue web-app project source files
and generally the full content of the website.
The old version of my website is still stored for archival purposes in `old/`.
## Deploying
To deploy, simply execute `./upload.sh` from the repository's root directory.
It'll build the web-app, and copy the files to the remote server.

477
app/package-lock.json generated
View File

@ -30,27 +30,27 @@
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.24.8",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
"integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
"integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
"integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.25.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz",
"integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==",
"version": "7.25.8",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz",
"integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==",
"dependencies": {
"@babel/types": "^7.25.4"
"@babel/types": "^7.25.8"
},
"bin": {
"parser": "bin/babel-parser.js"
@ -60,12 +60,12 @@
}
},
"node_modules/@babel/types": {
"version": "7.25.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz",
"integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==",
"version": "7.25.8",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz",
"integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==",
"dependencies": {
"@babel/helper-string-parser": "^7.24.8",
"@babel/helper-validator-identifier": "^7.24.7",
"@babel/helper-string-parser": "^7.25.7",
"@babel/helper-validator-identifier": "^7.25.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
@ -456,9 +456,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
"integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
"version": "4.11.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
"integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@ -510,22 +510,22 @@
}
},
"node_modules/@eslint/js": {
"version": "8.57.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
"deprecated": "Use @eslint/config-array instead",
"dev": true,
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.2",
"@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
@ -628,9 +628,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz",
"integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
"integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
"cpu": [
"arm"
],
@ -641,9 +641,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz",
"integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
"integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
"cpu": [
"arm64"
],
@ -654,9 +654,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz",
"integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
"integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
"cpu": [
"arm64"
],
@ -667,9 +667,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz",
"integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
"integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
"cpu": [
"x64"
],
@ -680,9 +680,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz",
"integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
"integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
"cpu": [
"arm"
],
@ -693,9 +693,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz",
"integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
"integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
"cpu": [
"arm"
],
@ -706,9 +706,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz",
"integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
"integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
"cpu": [
"arm64"
],
@ -719,9 +719,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz",
"integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
"integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
"cpu": [
"arm64"
],
@ -732,9 +732,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz",
"integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
"integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
"cpu": [
"ppc64"
],
@ -745,9 +745,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz",
"integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
"integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
"cpu": [
"riscv64"
],
@ -758,9 +758,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz",
"integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
"integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
"cpu": [
"s390x"
],
@ -771,9 +771,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz",
"integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
"integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
"cpu": [
"x64"
],
@ -784,9 +784,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz",
"integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
"integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
"cpu": [
"x64"
],
@ -797,9 +797,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz",
"integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
"integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
"cpu": [
"arm64"
],
@ -810,9 +810,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz",
"integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
"integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
"cpu": [
"ia32"
],
@ -823,9 +823,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz",
"integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
"integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
"cpu": [
"x64"
],
@ -848,15 +848,15 @@
"dev": true
},
"node_modules/@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true
},
"node_modules/@types/node": {
"version": "20.16.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz",
"integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==",
"version": "20.16.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz",
"integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==",
"dev": true,
"dependencies": {
"undici-types": "~6.19.2"
@ -1054,9 +1054,9 @@
"dev": true
},
"node_modules/@vitejs/plugin-vue": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz",
"integrity": "sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==",
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz",
"integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==",
"dev": true,
"engines": {
"node": "^18.0.0 || >=20.0.0"
@ -1067,75 +1067,75 @@
}
},
"node_modules/@volar/language-core": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0.tgz",
"integrity": "sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==",
"version": "2.4.6",
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.6.tgz",
"integrity": "sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==",
"dev": true,
"dependencies": {
"@volar/source-map": "2.4.0"
"@volar/source-map": "2.4.6"
}
},
"node_modules/@volar/source-map": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0.tgz",
"integrity": "sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==",
"version": "2.4.6",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.6.tgz",
"integrity": "sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==",
"dev": true
},
"node_modules/@volar/typescript": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0.tgz",
"integrity": "sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==",
"version": "2.4.6",
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.6.tgz",
"integrity": "sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==",
"dev": true,
"dependencies": {
"@volar/language-core": "2.4.0",
"@volar/language-core": "2.4.6",
"path-browserify": "^1.0.1",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz",
"integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
"integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
"dependencies": {
"@babel/parser": "^7.24.7",
"@vue/shared": "3.4.38",
"@babel/parser": "^7.25.3",
"@vue/shared": "3.5.12",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz",
"integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
"integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
"dependencies": {
"@vue/compiler-core": "3.4.38",
"@vue/shared": "3.4.38"
"@vue/compiler-core": "3.5.12",
"@vue/shared": "3.5.12"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz",
"integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
"integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
"dependencies": {
"@babel/parser": "^7.24.7",
"@vue/compiler-core": "3.4.38",
"@vue/compiler-dom": "3.4.38",
"@vue/compiler-ssr": "3.4.38",
"@vue/shared": "3.4.38",
"@babel/parser": "^7.25.3",
"@vue/compiler-core": "3.5.12",
"@vue/compiler-dom": "3.5.12",
"@vue/compiler-ssr": "3.5.12",
"@vue/shared": "3.5.12",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.10",
"postcss": "^8.4.40",
"magic-string": "^0.30.11",
"postcss": "^8.4.47",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz",
"integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
"integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
"dependencies": {
"@vue/compiler-dom": "3.4.38",
"@vue/shared": "3.4.38"
"@vue/compiler-dom": "3.5.12",
"@vue/shared": "3.5.12"
}
},
"node_modules/@vue/compiler-vue2": {
@ -1149,9 +1149,9 @@
}
},
"node_modules/@vue/devtools-api": {
"version": "6.6.3",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
"integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw=="
"version": "6.6.4",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
},
"node_modules/@vue/eslint-config-prettier": {
"version": "9.0.0",
@ -1192,12 +1192,12 @@
}
},
"node_modules/@vue/language-core": {
"version": "2.0.29",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz",
"integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==",
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.6.tgz",
"integrity": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==",
"dev": true,
"dependencies": {
"@volar/language-core": "~2.4.0-alpha.18",
"@volar/language-core": "~2.4.1",
"@vue/compiler-dom": "^3.4.0",
"@vue/compiler-vue2": "^2.7.16",
"@vue/shared": "^3.4.0",
@ -1216,49 +1216,49 @@
}
},
"node_modules/@vue/reactivity": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz",
"integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz",
"integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
"dependencies": {
"@vue/shared": "3.4.38"
"@vue/shared": "3.5.12"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz",
"integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
"integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
"dependencies": {
"@vue/reactivity": "3.4.38",
"@vue/shared": "3.4.38"
"@vue/reactivity": "3.5.12",
"@vue/shared": "3.5.12"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz",
"integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
"integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
"dependencies": {
"@vue/reactivity": "3.4.38",
"@vue/runtime-core": "3.4.38",
"@vue/shared": "3.4.38",
"@vue/reactivity": "3.5.12",
"@vue/runtime-core": "3.5.12",
"@vue/shared": "3.5.12",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz",
"integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
"integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
"dependencies": {
"@vue/compiler-ssr": "3.4.38",
"@vue/shared": "3.4.38"
"@vue/compiler-ssr": "3.5.12",
"@vue/shared": "3.5.12"
},
"peerDependencies": {
"vue": "3.4.38"
"vue": "3.5.12"
}
},
"node_modules/@vue/shared": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz",
"integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw=="
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
"integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg=="
},
"node_modules/@vue/tsconfig": {
"version": "0.5.1",
@ -1267,9 +1267,9 @@
"dev": true
},
"node_modules/acorn": {
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"version": "8.13.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz",
"integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@ -1468,12 +1468,12 @@
"dev": true
},
"node_modules/debug": {
"version": "4.3.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
"integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@ -1576,16 +1576,17 @@
}
},
"node_modules/eslint": {
"version": "8.57.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.14",
"@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@ -1673,9 +1674,9 @@
}
},
"node_modules/eslint-plugin-vue": {
"version": "9.27.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
"integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
"version": "9.29.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.29.0.tgz",
"integrity": "sha512-hamyjrBhNH6Li6R1h1VF9KHfshJlKgKEg3ARbGTn72CMNDSMhWbgC7NdkRDEh25AFW+4SDATzyNM+3gWuZii8g==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
@ -1683,7 +1684,7 @@
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
"semver": "^7.6.0",
"semver": "^7.6.3",
"vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
@ -2248,9 +2249,9 @@
"dev": true
},
"node_modules/magic-string": {
"version": "0.30.11",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
"integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
"version": "0.30.12",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
"integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
@ -2274,9 +2275,9 @@
}
},
"node_modules/micromatch": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"dependencies": {
"braces": "^3.0.3",
@ -2302,9 +2303,9 @@
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/muggle-string": {
@ -2346,9 +2347,9 @@
}
},
"node_modules/npm-run-all2": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.2.tgz",
"integrity": "sha512-Q+alQAGIW7ZhKcxLt8GcSi3h3ryheD6xnmXahkMRVM5LYmajcUrSITm8h+OPC9RYWMV2GR0Q1ntTUCfxaNoOJw==",
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.3.tgz",
"integrity": "sha512-5RsxC7jEc/RjxOYBVdEfrJf5FsJ0pHA7jr2/OxrThXknajETCTYjigOCG3iaGjdYIKEQlDuCG0ir0T1HTva8pg==",
"dev": true,
"dependencies": {
"ansi-styles": "^6.2.1",
@ -2505,9 +2506,9 @@
}
},
"node_modules/picocolors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="
},
"node_modules/picomatch": {
"version": "2.3.1",
@ -2534,9 +2535,9 @@
}
},
"node_modules/pinia": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.2.tgz",
"integrity": "sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.4.tgz",
"integrity": "sha512-K7ZhpMY9iJ9ShTC0cR2+PnxdQRuwVIsXDO/WIEV/RnMC/vmSoKDTKW/exNQYPI+4ij10UjXqdNiEHwn47McANQ==",
"dependencies": {
"@vue/devtools-api": "^6.6.3",
"vue-demi": "^0.14.10"
@ -2584,9 +2585,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.41",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
"integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
"version": "8.4.47",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
"funding": [
{
"type": "opencollective",
@ -2603,8 +2604,8 @@
],
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.1",
"source-map-js": "^1.2.0"
"picocolors": "^1.1.0",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
@ -2737,12 +2738,12 @@
}
},
"node_modules/rollup": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz",
"integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==",
"version": "4.24.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
"@types/estree": "1.0.6"
},
"bin": {
"rollup": "dist/bin/rollup"
@ -2752,22 +2753,22 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.21.0",
"@rollup/rollup-android-arm64": "4.21.0",
"@rollup/rollup-darwin-arm64": "4.21.0",
"@rollup/rollup-darwin-x64": "4.21.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.21.0",
"@rollup/rollup-linux-arm-musleabihf": "4.21.0",
"@rollup/rollup-linux-arm64-gnu": "4.21.0",
"@rollup/rollup-linux-arm64-musl": "4.21.0",
"@rollup/rollup-linux-powerpc64le-gnu": "4.21.0",
"@rollup/rollup-linux-riscv64-gnu": "4.21.0",
"@rollup/rollup-linux-s390x-gnu": "4.21.0",
"@rollup/rollup-linux-x64-gnu": "4.21.0",
"@rollup/rollup-linux-x64-musl": "4.21.0",
"@rollup/rollup-win32-arm64-msvc": "4.21.0",
"@rollup/rollup-win32-ia32-msvc": "4.21.0",
"@rollup/rollup-win32-x64-msvc": "4.21.0",
"@rollup/rollup-android-arm-eabi": "4.24.0",
"@rollup/rollup-android-arm64": "4.24.0",
"@rollup/rollup-darwin-arm64": "4.24.0",
"@rollup/rollup-darwin-x64": "4.24.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
"@rollup/rollup-linux-arm-musleabihf": "4.24.0",
"@rollup/rollup-linux-arm64-gnu": "4.24.0",
"@rollup/rollup-linux-arm64-musl": "4.24.0",
"@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
"@rollup/rollup-linux-riscv64-gnu": "4.24.0",
"@rollup/rollup-linux-s390x-gnu": "4.24.0",
"@rollup/rollup-linux-x64-gnu": "4.24.0",
"@rollup/rollup-linux-x64-musl": "4.24.0",
"@rollup/rollup-win32-arm64-msvc": "4.24.0",
"@rollup/rollup-win32-ia32-msvc": "4.24.0",
"@rollup/rollup-win32-x64-msvc": "4.24.0",
"fsevents": "~2.3.2"
}
},
@ -2846,9 +2847,9 @@
}
},
"node_modules/source-map-js": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"engines": {
"node": ">=0.10.0"
}
@ -2890,9 +2891,9 @@
}
},
"node_modules/synckit": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz",
"integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==",
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
"integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
"dev": true,
"dependencies": {
"@pkgr/core": "^0.1.0",
@ -2944,9 +2945,9 @@
}
},
"node_modules/tslib": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
"integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
"dev": true
},
"node_modules/type-check": {
@ -3008,13 +3009,13 @@
"dev": true
},
"node_modules/vite": {
"version": "5.4.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz",
"integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
"version": "5.4.9",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz",
"integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==",
"dev": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.41",
"postcss": "^8.4.43",
"rollup": "^4.20.0"
},
"bin": {
@ -3073,15 +3074,15 @@
"dev": true
},
"node_modules/vue": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz",
"integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==",
"version": "3.5.12",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz",
"integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
"dependencies": {
"@vue/compiler-dom": "3.4.38",
"@vue/compiler-sfc": "3.4.38",
"@vue/runtime-dom": "3.4.38",
"@vue/server-renderer": "3.4.38",
"@vue/shared": "3.4.38"
"@vue/compiler-dom": "3.5.12",
"@vue/compiler-sfc": "3.5.12",
"@vue/runtime-dom": "3.5.12",
"@vue/server-renderer": "3.5.12",
"@vue/shared": "3.5.12"
},
"peerDependencies": {
"typescript": "*"
@ -3117,11 +3118,11 @@
}
},
"node_modules/vue-router": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz",
"integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==",
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz",
"integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
"dependencies": {
"@vue/devtools-api": "^6.6.3"
"@vue/devtools-api": "^6.6.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
@ -3131,13 +3132,13 @@
}
},
"node_modules/vue-tsc": {
"version": "2.0.29",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.29.tgz",
"integrity": "sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==",
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.6.tgz",
"integrity": "sha512-f98dyZp5FOukcYmbFpuSCJ4Z0vHSOSmxGttZJCsFeX0M4w/Rsq0s4uKXjcSRsZqsRgQa6z7SfuO+y0HVICE57Q==",
"dev": true,
"dependencies": {
"@volar/typescript": "~2.4.0-alpha.18",
"@vue/language-core": "2.0.29",
"@volar/typescript": "~2.4.1",
"@vue/language-core": "2.1.6",
"semver": "^7.5.4"
},
"bin": {

View File

@ -1,83 +1,11 @@
<!--
The main app just contains a RouterView that's populated entirely by the
router and the user's currently selected route.
-->
<script setup lang="ts">
import { RouterView } from 'vue-router'
import NavLink from './components/NavLink.vue'
</script>
<template>
<div class="bisection-container">
<header class="page-bisection">
<h1 class="site-header-text">Andrew Lalis</h1>
<nav>
<NavLink path="/">Home</NavLink>
<NavLink path="/about">About</NavLink>
<NavLink path="/software">Software</NavLink>
<NavLink path="/gardening">Gardening</NavLink>
<NavLink path="/logbook">Logbook</NavLink>
<NavLink path="/contact">Contact</NavLink>
</nav>
</header>
<RouterView v-slot="{ Component }">
<Transition name="page">
<Component :is="Component" class="page-bisection content-page" />
</Transition>
</RouterView>
</div>
<RouterView />
</template>
<style>
.bisection-container {
text-align: center;
}
.page-bisection {
width: 50ch;
display: inline-block;
vertical-align: top;
padding-left: 1rem;
padding-right: 1rem;
}
.content-page {
text-align: left;
margin-top: 1rem;
}
.site-header-text {
font-family: Sacramento;
container-type: inline-size;
font-size: calc(min(60px, max(5cqw, 42px)));
text-align: right;
margin-top: 1rem;
margin-bottom: 0;
}
.page-enter-active {
transition: all 0.5s ease;
}
.page-enter-from {
opacity: 0;
transform: translateX(30px);
}
/*
Activates once the left and right half of the page stack due to width constraints.
We remove a lot of the vertical spacing to make things fit better.
*/
@media (width < calc(100ch - 2.5rem)) {
.site-header-text {
margin-top: 0;
}
.content-page {
margin-top: 0;
}
}
/*
Once the device width is smaller than one of the halves, sync the page half to the device width.
*/
@media (width < 50ch) {
.page-bisection {
width: calc(100% - 2rem);
}
}
</style>

View File

@ -6,6 +6,7 @@
--background-color-2: rgb(34, 34, 34);
--code-color: rgb(224, 226, 120);
--success-color: rgb(118, 201, 118);
--error-color: rgb(241, 64, 64);
}
body {

View File

@ -0,0 +1,69 @@
<script setup lang="ts">
defineProps<{
species: any
}>()
</script>
<template>
<div class="garden-species-card">
<div class="garden-species-card-content">
<h3 v-text="species['Common Name']"></h3>
<a
:href="species['Reference']"
v-text="species['Scientific Name']"
class="link-out"
style="font-style: italic"
></a>
<p>
In the
<span
v-text="species['Family']"
style="font-style: italic; color: var(--code-color)"
></span>
family.
</p>
<p>
Flordia native:
<span v-if="species['Florida Native'] === 'Yes'" style="color: var(--success-color)">
Yes
</span>
<span v-if="species['Florida Native'] !== 'Yes'" style="color: var(--error-color)">No</span>
</p>
</div>
<div class="garden-species-card-image">
<img v-if="species['Image Link']" :src="species['Image Link']" />
</div>
</div>
</template>
<style>
.garden-species-card {
background-color: var(--background-color-2);
border-radius: 20px;
padding: 1rem;
margin-top: 1rem;
margin-bottom: 1rem;
}
.garden-species-card > .garden-species-card-content > h3 {
margin-top: 0;
margin-bottom: 0.25rem;
font-family: OpenSans, sans-serif;
}
.garden-species-card > .garden-species-card-content > p {
margin-top: 0.25rem;
margin-bottom: 0.25rem;
}
.garden-species-card-content {
width: 50%;
display: inline-block;
vertical-align: top;
}
.garden-species-card-image {
width: 50%;
display: inline-block;
vertical-align: top;
text-align: right;
}
.garden-species-card-image > img {
max-height: 128px;
max-width: 100%;
}
</style>

View File

@ -0,0 +1,12 @@
<!--
Displays a styled link using the provided link for the href and link text.
-->
<script setup lang="ts">
defineProps<{
link: string
external?: boolean
}>()
</script>
<template>
<a :href="link" v-text="link" :class="external ? 'link-out' : 'link-local'"></a>
</template>

687
app/src/garden_data.ts Normal file
View File

@ -0,0 +1,687 @@
/**
* The following array is derived from my personal "species.ods" spreadsheet
* where I track all species in my garden. I then export it as CSV, then
* convert the CSV to JSON using an online tool.
*/
export const SPECIES = [
{
'Scientific Name': 'Ruellia caroliniensis',
'Common Name': 'Carolina Petunia',
Family: 'Acanthaceae',
Reference: 'https://en.wikipedia.org/wiki/Ruellia_caroliniensis',
'Image Link': 'https://www.fnps.org/assets/images/plants/Ruellia_caroliniana_SD.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: 'Total Species',
'': 58
},
{
'Scientific Name': 'Viburnum obovatum var. Densa',
'Common Name': "Dwarf Walter's Viburnum",
Family: 'Adoxaceae',
Reference:
'https://gardeningsolutions.ifas.ufl.edu/plants/trees-and-shrubs/shrubs/walters-viburnum/',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Viburnum_obovatum_D__0p36y8hAIvHU.jpeg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: 'Total Natives',
'': 40
},
{
'Scientific Name': 'Allium tuberosum',
'Common Name': 'Garlic Chives',
Family: 'Amaryllidaceae',
Reference: 'https://en.wikipedia.org/wiki/Allium_tuberosum',
'Image Link': 'https://hort.extension.wisc.edu/files/2015/12/Allium_tuberosum-ingarden1.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '% Native',
'': '68.97%'
},
{
'Scientific Name': 'Asclepias incarnata',
'Common Name': 'Pink Swamp Milkweed',
Family: 'Apocynaceae',
Reference: 'https://en.wikipedia.org/wiki/Asclepias_incarnata',
'Image Link':
'https://sciotogardens.com/wp-content/uploads/2021/04/Asclepias-incarnata-Swamp-Milkweed-Flower-with-Bee.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: 'Milkweed Species',
'': 4
},
{
'Scientific Name': 'Asclepias perennis',
'Common Name': 'Aquatic Milkweed',
Family: 'Apocynaceae',
Reference: 'https://en.wikipedia.org/wiki/Asclepias_perennis',
'Image Link': 'https://www.fnps.org/assets/images/plants/Asclepias_perennis-Stibolt2.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: 'Current Species',
'': 52
},
{
'Scientific Name': 'Asclepias tuberosa',
'Common Name': 'Butterfly Weed',
Family: 'Apocynaceae',
Reference: 'https://en.wikipedia.org/wiki/Asclepias_tuberosa',
'Image Link':
'https://www.gardenia.net/wp-content/uploads/2023/05/Asclepias-Tuberosa-Butterfly-Weed.webp',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Asclepias verticillata',
'Common Name': 'Whorled Milkweed',
Family: 'Apocynaceae',
Reference: 'https://en.wikipedia.org/wiki/Asclepias_verticillata',
'Image Link':
'https://kb.jniplants.com/wp-content/uploads/2022/01/whorled-milkweed-asclepias-verticillata-ftimg.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Serenoa repens',
'Common Name': 'Saw Palmetto',
Family: 'Arecaceae',
Reference: 'https://plants.ces.ncsu.edu/plants/serenoa-repens/',
'Image Link': 'https://www.fnps.org/assets/images/plants/serenoa_repens_Denton.JPG',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Ageratina jucunda',
'Common Name': 'Hammock Snakeroot',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Ageratina_jucunda',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Hammock_snakeroot_imported_from_iNaturalist_photo_334164824_on_10_September_2024.jpg/1200px-Hammock_snakeroot_imported_from_iNaturalist_photo_334164824_on_10_September_2024.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Coreopsis lanceolata',
'Common Name': 'Lanceleaf Coreopsis',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Coreopsis_lanceolata',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/b/bf/Coreopsis_lanceolata_Sterntaler.JPG',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Coreopsis leavenworthii',
'Common Name': 'Leavenworths Coreopsis',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Coreopsis_leavenworthii',
'Image Link':
'https://www.flawildflowers.org/wp-content/uploads/2017/06/coreopsis_leavenworthii-e1591118903862.jpg',
'Florida Native': 'Yes',
Current: 'No',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Cosmos bipinnatus',
'Common Name': 'Cosmos',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Cosmos_bipinnatus',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/9/9c/Cosmos_bipinnatus_pink%2C_Burdwan%2C_West_Bengal%2C_India_10_01_2013.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Liatris spicata',
'Common Name': 'Dense Blazing Star',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Liatris_spicata',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Liatris_spicata_Hedwig_Storch_ccbysa30.JPG',
'Florida Native': 'Yes',
Current: 'No',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Melanthera nivea',
'Common Name': 'Salt and Pepper Plant',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Melanthera_nivea',
'Image Link': 'https://www.fnps.org/assets/images/plants/Melanthera%20nivea1-Stibolt.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Solidago fistulosa',
'Common Name': 'Pinebarren Goldenrod',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Solidago_fistulosa',
'Image Link': 'https://upload.wikimedia.org/wikipedia/commons/5/56/Solidago_fistulosa01.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Symphyotrichum lateriflorum',
'Common Name': 'Calico Aster',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Symphyotrichum_lateriflorum',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Symphyotrichum-later_vMt4pemBxDbP.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Tithonia rotundifolia',
'Common Name': 'Mexican Sunflower',
Family: 'Asteraceae',
Reference: 'https://en.wikipedia.org/wiki/Tithonia_rotundifolia',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/b/b6/Tithonia_rotundifolia_kz2.jpg',
'Florida Native': 'No',
Current: 'No',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Lonicera sempervirens',
'Common Name': 'Coral Honeysuckle',
Family: 'Caprifoliaceae',
Reference: 'https://en.wikipedia.org/wiki/Lonicera_sempervirens',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Lonicera_sempervirens_2.jpg/1200px-Lonicera_sempervirens_2.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Sambucus nigra ssp. Canadensis',
'Common Name': 'Common Elderberry',
Family: 'Caprifoliaceae',
Reference: 'https://www.wildflower.org/plants/result.php?id_plant=sanic4',
'Image Link':
'https://bluethumb.org/wp-content/uploads/sites/2/2024/03/sambucus_nigra_ssp_canadensis-800x800.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Tradescantia ohiensis',
'Common Name': 'Spiderwort',
Family: 'Commelinoideae',
Reference: 'https://en.wikipedia.org/wiki/Tradescantia_ohiensis',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Tradescantia_ohiensis2.jpg/1200px-Tradescantia_ohiensis2.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Trandescantia zebrina',
'Common Name': 'Inchplant',
Family: 'Commelinoideae',
Reference: 'https://en.wikipedia.org/wiki/Tradescantia_zebrina',
'Image Link': 'https://hort.extension.wisc.edu/files/2015/12/T_zebrina-planting.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Juniperus conferta',
'Common Name': 'Blue Pacific Juniper',
Family: 'Cupressaceae',
Reference: 'https://en.wikipedia.org/wiki/Juniperus_conferta',
'Image Link': 'https://upload.wikimedia.org/wikipedia/commons/9/9b/Juniperus_conferta.JPG',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Cycas revoluta',
'Common Name': 'King Sago Palm',
Family: 'Cycadaceae',
Reference: 'https://en.wikipedia.org/wiki/Cycas_revoluta',
'Image Link': 'https://upload.wikimedia.org/wikipedia/commons/3/3b/Cycas_inflorescence.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Dryopteris ludoviciana',
'Common Name': 'Southern Wood Fern',
Family: 'Dryopteridaceae',
Reference: 'https://en.wikipedia.org/wiki/Dryopteris_ludoviciana',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/d/d2/Southern_Wood_Fern_Dryopteris_ludoviciana_Leaves_3008px.JPG',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Erythrina herbacea',
'Common Name': 'Coral Bean',
Family: 'Fabaceae',
Reference: 'https://en.wikipedia.org/wiki/Erythrina_herbacea',
'Image Link':
'https://warcapps.usgs.gov/PlantID/Image/GivenFile?id=3324&file=Erythrina%20herbacea_0001.JPG&size=w',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Mimosa strigillosa',
'Common Name': 'Sunshine Mimosa',
Family: 'Fabaceae',
Reference: 'https://en.wikipedia.org/wiki/Mimosa_strigillosa',
'Image Link':
'https://www.flawildflowers.org/wp-content/uploads/2015/07/mimosa_strigillosa_ScottZona-CCBY-NC2.0.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Clinopodium brownei',
'Common Name': 'Brownes Savory',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Clinopodium_brownei',
'Image Link':
'https://www.flawildflowers.org/wp-content/uploads/2018/04/clinopodium_brownei-keim2-1-e1602619542587.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Melissa officinalis',
'Common Name': 'Lemon Balm',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Lemon_balm',
'Image Link':
'https://www.gardenia.net/wp-content/uploads/2023/05/melissa-officinalis-780x520.webp',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Nepeta cataria',
'Common Name': 'Catnip',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Catnip',
'Image Link':
'https://i.etsystatic.com/27743352/r/il/77ac53/3780897667/il_fullxfull.3780897667_5dod.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Ocimum basilicum',
'Common Name': 'Basil',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Basil',
'Image Link':
'https://www.gardenia.net/wp-content/uploads/2023/04/Zr6xu4xq1jF7hLENb2aNtO9jsD7DS6GLZMw24RPF-780x520.webp',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Ocimum campenchianum',
'Common Name': 'Wild Sweet Basil',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Ocimum_campechianum',
'Image Link': 'https://chalk.richmond.edu/flora-kaxil-kiuic/o/ocimum_campechianum_04s.JPG',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Origanum vulgare',
'Common Name': 'Oregano',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Oregano',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Origanum-vulgare--Anna--CC-BY.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Salvia azurea',
'Common Name': 'Azure Sage',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Salvia_azurea',
'Image Link': 'https://upload.wikimedia.org/wikipedia/commons/6/63/Salvia_azurea1.jpg',
'Florida Native': 'Yes',
Current: 'No',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Salvia coccinea',
'Common Name': 'Tropical Sage',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Salvia_coccinea',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Salvia-coccinea--Carol-Foll--CC-BY-NC-ND.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Salvia misella',
'Common Name': 'Creeping Sage',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Salvia_misella',
'Image Link': 'https://upload.wikimedia.org/wikipedia/commons/7/77/Salvia_misella.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Salvia officinalis',
'Common Name': 'Garden Sage',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Salvia_officinalis',
'Image Link':
'https://www.gardenia.net/wp-content/uploads/2023/05/salvia-officinalis-780x520.webp',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Salvia rosmarinus',
'Common Name': 'Rosemary',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Rosemary',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Rosmarinus-officinalis-Gil-Costa-CC-BY-NC-2-0.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Teucrium canadense',
'Common Name': 'American Germander',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Teucrium_canadense',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/8/84/American_Germander_%282981720555%29.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Thymus vulgaris',
'Common Name': 'English Thyme',
Family: 'Lamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Thymus_vulgaris',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Thymus-vulgaris-argenteusPressebereich-Dehner-Garten-Center--CC-BY-ND.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Kostelezkya pentacarpos',
'Common Name': 'Saltmarsh Mallow',
Family: 'Malvaceae',
Reference: 'https://en.wikipedia.org/wiki/Kosteletzkya_pentacarpos',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/9/94/Virginia_saltmarsh_mallow_%28Kosteletzkya_virginica%29_%287513257570%29.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Nephrolepis exaltata var. Petticoat',
'Common Name': 'Petticoat Fern',
Family: 'Nephrolepidaceae',
Reference:
'https://garden.org/plants/view/678483/Petticoat-Fern-Nephrolepis-exaltata-Petticoat/',
'Image Link':
'https://sprouthome.com/cdn/shop/products/NephroPetti10detail_sprout_800x.jpg?v=1656886021',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Nephrolepis obliterata',
'Common Name': 'Kimberley Queen Fern',
Family: 'Nephrolepidaceae',
Reference: 'https://en.wikipedia.org/wiki/Nephrolepis_obliterata',
'Image Link': 'https://d2seqvvyy3b8p2.cloudfront.net/3dcdfa0979c349fad87894ff597a80fc.jpg',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Rivina humilis',
'Common Name': 'Rouge Plant / Bloodberry',
Family: 'Petiveriaceae',
Reference: 'https://en.wikipedia.org/wiki/Rivina_humilis',
'Image Link': 'https://www.gardenia.net/wp-content/uploads/2023/05/rivina-humilis.webp',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Aristida stricta',
'Common Name': 'Wiregrass',
Family: 'Poaceae',
Reference: 'https://en.wikipedia.org/wiki/Aristida_stricta',
'Image Link':
'https://lh4.googleusercontent.com/proxy/nRFsygxXYmqmqPAkGwgiZWDKrNwhjl7yCjBWh0kC7HuEpo5kzrXiwfOvyqfS_V0QJ9Q3w-kMXw4lR_D8oNJpsDf9dU9BJF4TWIOBolZt_Q',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Eragrostis spectabilis',
'Common Name': 'Purple Lovegrass',
Family: 'Poaceae',
Reference: 'https://en.wikipedia.org/wiki/Eragrostis_spectabilis',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Eragrostrum_spectabl_QNqsgDI5kmks.jfif',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Tripsacum floridana',
'Common Name': 'Dwarf Fakahatchee Grass',
Family: 'Poaceae',
Reference: 'https://www.fnps.org/plant/tripsacum-floridanum',
'Image Link': 'https://www.fnps.org/assets/images/plants/tripsacum_floridanum_0009Denton.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Hamelia patens',
'Common Name': 'Firebush',
Family: 'Rubiaceae',
Reference: 'https://en.wikipedia.org/wiki/Hamelia_patens',
'Image Link':
'https://www.flawildflowers.org/wp-content/uploads/2014/05/hamelia_patens_keim.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Psychotria nervosa',
'Common Name': 'Dwarf Shiny-Leaf Coffee',
Family: 'Rubiaceae',
Reference: 'https://en.wikipedia.org/wiki/Psychotria_nervosa',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Psychotria_nervosa_Florida.JPG/1200px-Psychotria_nervosa_Florida.JPG',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Capsicum annuum var. Cayenne',
'Common Name': 'Cayenne Pepper',
Family: 'Solanaceae',
Reference: 'https://en.wikipedia.org/wiki/Cayenne_pepper',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Capsicum_annuum_Chil_AyfsPt9WpZrr.jpeg',
'Florida Native': 'No',
Current: 'No',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Capsicum annuum var. glabriusculum',
'Common Name': 'Bird Pepper',
Family: 'Solanaceae',
Reference: 'https://en.wikipedia.org/wiki/Capsicum_annuum_var._glabriusculum',
'Image Link': 'https://www.fnps.org/assets/images/plants/Capsicum_annuum_RH.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Capsicum annuum var. jalapeño',
'Common Name': 'Jalapeño Pepper',
Family: 'Solanaceae',
Reference: 'https://en.wikipedia.org/wiki/Jalape%C3%B1o',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Immature_jalapeno_capsicum_annuum_var_annuum.jpeg/1024px-Immature_jalapeno_capsicum_annuum_var_annuum.jpeg',
'Florida Native': 'No',
Current: 'No',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Strelitzia reginae',
'Common Name': 'Bird of Paradise',
Family: 'Strelitziaceae',
Reference: 'https://en.wikipedia.org/wiki/Strelitzia_reginae',
'Image Link':
'https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Bird_of_Paradise_flower.JPG/1200px-Bird_of_Paradise_flower.JPG',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Lantana camara var. Anne Marie',
'Common Name': 'Anne Marie Lantana',
Family: 'Verbenaceae',
Reference: 'https://garden.org/plants/view/172550/Lantana-Lantana-camara-Anne-Marie/',
'Image Link':
'https://cdn11.bigcommerce.com/s-5ahp77r7un/images/stencil/1280x1280/products/2251/8704/Lantana_Anne_Marie_web__60642.1657546129.jpg?c=2',
'Florida Native': 'No',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Lantana depressa var. Depressa',
'Common Name': 'Pineland Lantana',
Family: 'Verbenaceae',
Reference: 'https://www.wildflower.org/plants/result.php?id_plant=LADED',
'Image Link': 'https://florida.plantatlas.usf.edu/plantimage/Lantana_depressa7.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Lantana depressa var. Floridana',
'Common Name': 'Florida Lantana',
Family: 'Verbenaceae',
Reference:
'https://explorer.natureserve.org/Taxon/ELEMENT_GLOBAL.2.155560/Lantana_depressa_var_floridana',
'Image Link': 'https://fsus.ncbg.unc.edu/img/orig/kb/kb_02227.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Lantana involucrata',
'Common Name': 'Buttonsage Lantana',
Family: 'Verbenaceae',
Reference: 'https://en.wikipedia.org/wiki/Lantana_involucrata',
'Image Link': 'https://upload.wikimedia.org/wikipedia/commons/6/6d/Lantana_involucrata.jpg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Viola sororia',
'Common Name': 'Blue Violet',
Family: 'Violaceae',
Reference: 'https://en.wikipedia.org/wiki/Viola_sororia',
'Image Link':
'https://www.gardenia.net/wp-content/uploads/2023/04/xE7cZkfR0j4qirAl5q7pMR7b3SordMxYVpty5rsV-790x533.webp',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
},
{
'Scientific Name': 'Zamia integrifolia',
'Common Name': 'Coontie Palm',
Family: 'Zamiaceae',
Reference: 'https://en.wikipedia.org/wiki/Zamia_integrifolia',
'Image Link':
'https://s3.amazonaws.com/eit-planttoolbox-prod/media/images/Zamia_integrifolia_a_CPKJilCHmLjh.jpeg',
'Florida Native': 'Yes',
Current: 'Yes',
Statistics: '',
'': ''
}
]

View File

@ -5,35 +5,49 @@ import ContactView from '@/views/ContactView.vue'
import SoftwareView from '@/views/SoftwareView.vue'
import GardeningView from '@/views/GardeningView.vue'
import LogBookView from '@/views/LogBookView.vue'
import MainSite from '@/views/MainSite.vue'
import GardenDetails from '@/views/GardenDetails.vue'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
// Most paths are nested under the MainSite component, which provides the
// common header links and formatting.
{
path: '/',
component: MainSite,
children: [
{
path: '',
component: HomeView
},
{
path: '/about',
path: 'about',
component: AboutView
},
{
path: '/contact',
path: 'contact',
component: ContactView
},
{
path: '/software',
path: 'software',
component: SoftwareView
},
{
path: '/gardening',
path: 'gardening',
component: GardeningView
},
{
path: '/logbook',
path: 'logbook',
component: LogBookView
}
]
},
{
path: '/garden-details',
component: GardenDetails
}
]
})
export default router

View File

@ -1,12 +0,0 @@
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', () => {
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
return { count, doubleCount, increment }
})

View File

@ -25,7 +25,7 @@
Server), and is served through Nginx and various firewalls.
</p>
<p>
If you actually go and view the source code, you'll see a <code>deploy.sh</code> file.
If you actually go and view the source code, you'll see an <code>upload.sh</code> file.
Essentially, all I do is build the site locally, then upload the files. Pretty simple, right?
</p>
</main>

View File

@ -0,0 +1,54 @@
<script setup lang="ts">
import GardenSpeciesCard from '@/components/GardenSpeciesCard.vue';
import { SPECIES } from '@/garden_data';
const sortedSpecies = [...SPECIES].sort((a, b) =>
a['Scientific Name'] > b['Scientific Name'] ? 1 : -1
)
</script>
<template>
<header>
<h1>My Home's Garden</h1>
</header>
<main>
<p>
On this page, you'll find a list of all plants currently (or formerly)
in my garden.
</p>
<p>
I keep a spreadsheet of all the species in my garden (or that have been present in the past).
In total, my garden currently has <strong>52 unique species</strong>, with
<strong>37 native species</strong>.
</p>
<p>
<a href="/gardening" class="link-local">Back to gardening</a>
</p>
<div class="garden-cards-container">
<GardenSpeciesCard v-for="species in sortedSpecies" :key="species['Scientific Name']" :species="species"
style="width: 300px;" />
</div>
</main>
</template>
<style>
h1 {
text-align: center;
}
p {
max-width: 50ch;
margin: 1rem auto;
}
.garden-cards-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
}
/* No margins for the cards when in flex mode. */
.garden-species-card {
margin: 0;
}
</style>

View File

@ -1,5 +1,18 @@
<script setup lang="ts">
</script>
<template>
<main>
<p><em>This page is a work in progress. Please check back later.</em></p>
<p>
I'd like to call myself an avid gardener, with a particular interest in creating native-friendly garden habitats.
</p>
<p>
I work on my own garden that I share with my partner, and I like to help out with others' too. So if you're
thinking about killing your lawn and providing a space for non-invasive and native species to thrive,
I'd be happy to help!
</p>
<p>
<a href="/garden-details" class="link-local">Click here to view my home's garden.</a>
</p>
</main>
</template>

View File

@ -3,7 +3,7 @@
<template>
<main>
<p>
My name's Andrew, and I'm a software engineer, gardener, runner, home cook, and probably many
My name's Andrew, and I'm a software engineer, pilot, gardener, runner, home cook, and probably many
other things too, depending on who you ask. Welcome to my website!
</p>
<p>

View File

@ -0,0 +1,96 @@
<!--
The main scaffold for the website's basic pages, like home, about, contact, etc.
It displays a simple header with links, alongside the selected page content in
the router view component.
See src/router/index.ts to see the nested set of routes that use this component.
-->
<script setup lang="ts">
import { RouterView } from 'vue-router'
import NavLink from '@/components/NavLink.vue';
</script>
<template>
<div class="bisection-container">
<header class="page-bisection">
<h1 class="site-header-text">Andrew Lalis</h1>
<nav>
<NavLink path="/">Home</NavLink>
<NavLink path="/about">About</NavLink>
<NavLink path="/software">Software</NavLink>
<NavLink path="/gardening">Gardening</NavLink>
<NavLink path="/logbook">Logbook</NavLink>
<NavLink path="/contact">Contact</NavLink>
</nav>
</header>
<RouterView v-slot="{ Component }">
<Transition name="page">
<Component :is="Component" class="page-bisection content-page" />
</Transition>
</RouterView>
</div>
</template>
<style>
.bisection-container {
text-align: center;
}
.page-bisection {
width: 50ch;
display: inline-block;
vertical-align: top;
padding-left: 1rem;
padding-right: 1rem;
}
.content-page {
text-align: left;
margin-top: 1rem;
}
.site-header-text {
font-family: Sacramento;
container-type: inline-size;
font-size: calc(min(60px, max(5cqw, 42px)));
text-align: right;
margin-top: 1rem;
margin-bottom: 0;
/* Gradient text color for the header. */
background-image: linear-gradient(90deg, var(--text-color), var(--code-color));
color: transparent;
background-clip: text;
}
.page-enter-active {
transition: all 0.5s ease;
}
.page-enter-from {
opacity: 0;
transform: translateX(30px);
}
/*
Activates once the left and right half of the page stack due to width constraints.
We remove a lot of the vertical spacing to make things fit better.
*/
@media (width < calc(100ch - 2.5rem)) {
.site-header-text {
margin-top: 0;
}
.content-page {
margin-top: 0;
}
}
/*
Once the device width is smaller than one of the halves, sync the page half to the device width.
*/
@media (width < 50ch) {
.page-bisection {
width: calc(100% - 2rem);
}
}
</style>

View File

@ -1,4 +1,5 @@
<script setup lang="ts">
import PlainLink from '@/components/PlainLink.vue'
import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
</script>
@ -15,6 +16,7 @@ import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
it for collaboration and a projects that rely on GitHub's API integration.
</p>
<article>
<SoftwareProjectTile
name="Perfin"
url="https://git.andrewlalis.com/andrew/perfin"
@ -55,8 +57,8 @@ import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
:tags="['Dlang']"
>
<p>
An lightweight and flexible HTTP server implemented in the D programming language. Supports
websockets, file serving, complex URL paths with path variables, and more!
An lightweight and flexible HTTP server implemented in the D programming language.
Supports websockets, file serving, complex URL paths with path variables, and more!
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
@ -67,8 +69,8 @@ import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
<p>
A <em>router</em> implementation for JavaFX desktop applications. Define a singleton
<code>SceneRouter</code>, add some routes to it, and add the router's provided view
component to your scene graph. Now you can navigate to different "pages" programmatically or
with user-interaction.
component to your scene graph. Now you can navigate to different "pages" programmatically
or with user-interaction.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
@ -93,6 +95,29 @@ import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
files, sockets, and more.
</p>
</SoftwareProjectTile>
</article>
<article>
<h3>Active Web Projects</h3>
<p>
While some may have been mentioned above, the following list enumerates all of my active,
publicly available web projects and where to find them.
</p>
<ul>
<li>
<PlainLink link="https://litelist.andrewlalis.com" external />
</li>
<li>
<PlainLink link="https://guerilla-gardening.andrewlalis.com" external />
</li>
<li>
<PlainLink link="https://d-package-search.andrewlalis.com" external />
</li>
<li>
<PlainLink link="https://mc-servers.andrewlalis.com" external />
</li>
</ul>
</article>
</main>
</template>
<style></style>