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

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. Server), and is served through Nginx and various firewalls.
</p> </p>
<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? Essentially, all I do is build the site locally, then upload the files. Pretty simple, right?
</p> </p>
</main> </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> <template>
<main> <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> </main>
</template> </template>

View File

@ -3,7 +3,7 @@
<template> <template>
<main> <main>
<p> <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! other things too, depending on who you ask. Welcome to my website!
</p> </p>
<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"> <script setup lang="ts">
import PlainLink from '@/components/PlainLink.vue'
import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue' import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
</script> </script>
@ -15,84 +16,108 @@ import SoftwareProjectTile from '@/components/SoftwareProjectTile.vue'
it for collaboration and a projects that rely on GitHub's API integration. it for collaboration and a projects that rely on GitHub's API integration.
</p> </p>
<SoftwareProjectTile <article>
name="Perfin" <SoftwareProjectTile
url="https://git.andrewlalis.com/andrew/perfin" name="Perfin"
:tags="['Java', 'JavaFX', 'Finance']" url="https://git.andrewlalis.com/andrew/perfin"
> :tags="['Java', 'JavaFX', 'Finance']"
>
<p>
A desktop personal finance application that makes it easy to manage your accounts and
transactions in a secure manner. Record transactions, track brokerage assets, and view
graphs of your spending, total value, and more.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Guerilla Gardening Map"
url="https://guerilla-gardening.andrewlalis.com"
:tags="['Dlang', 'Vue', 'Typescript']"
>
<p>
A website for anonymously tracking and sharing information on
<a href="https://en.wikipedia.org/wiki/Guerrilla_gardening" class="link-out"
>Guerilla-Gardening</a
>
locations around the world.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="LiteList"
url="https://litelist.andrewlalis.com"
:tags="['Dlang', 'Vue', 'Typescript']"
>
<p>
An extremely barebones web application to demonstrate the viability of my own HTTP server.
It's just your average ToDo list app, with basic JWT-based authentication.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Handy-Http"
url="https://github.com/andrewlalis/handy-httpd"
: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!
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="JavaFX Scene Router"
url="https://git.andrewlalis.com/andrew/javafx-scene-router"
:tags="['Java', 'JavaFX']"
>
<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.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Gymboard"
url="https://git.andrewlalis.com/andrew/Gymboard"
:tags="['Java', 'Spring', 'Vue', 'Typescript', 'Dlang']"
>
<p>
Proof-of-concept for a local gym leaderboard web application, where users post videos of
their lifts to climb to the top of various leaderboards. Built using a
<em>modular-monolith</em> software architecture.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Streams"
url="https://github.com/andrewlalis/streams"
:tags="['Dlang']"
>
<p>
A library that defines useful stream primitive types and implementations for IO, which
serves as a convenient wrapper around platform-specific reading and writing operations for
files, sockets, and more.
</p>
</SoftwareProjectTile>
</article>
<article>
<h3>Active Web Projects</h3>
<p> <p>
A desktop personal finance application that makes it easy to manage your accounts and While some may have been mentioned above, the following list enumerates all of my active,
transactions in a secure manner. Record transactions, track brokerage assets, and view publicly available web projects and where to find them.
graphs of your spending, total value, and more.
</p> </p>
</SoftwareProjectTile> <ul>
<SoftwareProjectTile <li>
name="Guerilla Gardening Map" <PlainLink link="https://litelist.andrewlalis.com" external />
url="https://guerilla-gardening.andrewlalis.com" </li>
:tags="['Dlang', 'Vue', 'Typescript']" <li>
> <PlainLink link="https://guerilla-gardening.andrewlalis.com" external />
<p> </li>
A website for anonymously tracking and sharing information on <li>
<a href="https://en.wikipedia.org/wiki/Guerrilla_gardening" class="link-out" <PlainLink link="https://d-package-search.andrewlalis.com" external />
>Guerilla-Gardening</a </li>
> <li>
locations around the world. <PlainLink link="https://mc-servers.andrewlalis.com" external />
</p> </li>
</SoftwareProjectTile> </ul>
<SoftwareProjectTile </article>
name="LiteList"
url="https://litelist.andrewlalis.com"
:tags="['Dlang', 'Vue', 'Typescript']"
>
<p>
An extremely barebones web application to demonstrate the viability of my own HTTP server.
It's just your average ToDo list app, with basic JWT-based authentication.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Handy-Http"
url="https://github.com/andrewlalis/handy-httpd"
: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!
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="JavaFX Scene Router"
url="https://git.andrewlalis.com/andrew/javafx-scene-router"
:tags="['Java', 'JavaFX']"
>
<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.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Gymboard"
url="https://git.andrewlalis.com/andrew/Gymboard"
:tags="['Java', 'Spring', 'Vue', 'Typescript', 'Dlang']"
>
<p>
Proof-of-concept for a local gym leaderboard web application, where users post videos of
their lifts to climb to the top of various leaderboards. Built using a
<em>modular-monolith</em> software architecture.
</p>
</SoftwareProjectTile>
<SoftwareProjectTile
name="Streams"
url="https://github.com/andrewlalis/streams"
:tags="['Dlang']"
>
<p>
A library that defines useful stream primitive types and implementations for IO, which
serves as a convenient wrapper around platform-specific reading and writing operations for
files, sockets, and more.
</p>
</SoftwareProjectTile>
</main> </main>
</template> </template>
<style></style> <style></style>