feat(master): 3.0.0 done, todo add experience to backend

This commit is contained in:
2025-07-17 15:39:59 -06:00
parent a371e21366
commit d5d9883aea
7 changed files with 422 additions and 800 deletions

440
package-lock.json generated
View File

@ -1,29 +1,29 @@
{
"name": "ssg-sveltekit-template",
"version": "0.0.1",
"name": "darkicewolf50",
"version": "3.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ssg-sveltekit-template",
"version": "0.0.1",
"name": "darkicewolf50",
"version": "3.0.0",
"devDependencies": {
"@eslint/compat": "^1.2.5",
"@eslint/js": "^9.18.0",
"@eslint/js": "^9.31.0",
"@sveltejs/adapter-auto": "^6.0.0",
"@sveltejs/adapter-cloudflare": "^7.0.4",
"@sveltejs/kit": "^2.16.0",
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"eslint": "^9.18.0",
"@sveltejs/adapter-cloudflare": "^7.1.0",
"@sveltejs/kit": "^2.25.0",
"@sveltejs/vite-plugin-svelte": "^6.1.0",
"eslint": "^9.31.0",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^3.0.0",
"eslint-plugin-svelte": "^3.11.0",
"globals": "^16.0.0",
"prettier": "^3.4.2",
"prettier-plugin-svelte": "^3.3.3",
"svelte": "^5.0.0",
"vite": "^6.2.6",
"vite-plugin-devtools-json": "^0.2.0",
"wrangler": "^4.23.0"
"svelte": "^5.36.7",
"vite": "^7.0.5",
"vite-plugin-devtools-json": "^0.3.0",
"wrangler": "^4.25.0"
}
},
"node_modules/@ampproject/remapping": {
@ -70,9 +70,9 @@
}
},
"node_modules/@cloudflare/workerd-darwin-64": {
"version": "1.20250617.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250617.0.tgz",
"integrity": "sha512-toG8JUKVLIks4oOJLe9FeuixE84pDpMZ32ip7mCpE7JaFc5BqGFvevk0YC/db3T71AQlialjRwioH3jS/dzItA==",
"version": "1.20250712.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250712.0.tgz",
"integrity": "sha512-M6S6a/LQ0Jb0R+g0XhlYi1adGifvYmxA5mD/i9TuZZgjs2bIm5ELuka/n3SCnI98ltvlx3HahRaHagAtOilsFg==",
"cpu": [
"x64"
],
@ -87,9 +87,9 @@
}
},
"node_modules/@cloudflare/workerd-darwin-arm64": {
"version": "1.20250617.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250617.0.tgz",
"integrity": "sha512-JTX0exbC9/ZtMmQQA8tDZEZFMXZrxOpTUj2hHnsUkErWYkr5SSZH04RBhPg6dU4VL8bXuB5/eJAh7+P9cZAp7g==",
"version": "1.20250712.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250712.0.tgz",
"integrity": "sha512-7sFzn6rvAcnLy7MktFL42dYtzL0Idw/kiUmNf2P3TvsBRoShhLK5ZKhbw+NAhvU8e4pXWm5lkE0XmpieA0zNjw==",
"cpu": [
"arm64"
],
@ -104,9 +104,9 @@
}
},
"node_modules/@cloudflare/workerd-linux-64": {
"version": "1.20250617.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250617.0.tgz",
"integrity": "sha512-8jkSoVRJ+1bOx3tuWlZCGaGCV2ew7/jFMl6V3CPXOoEtERUHsZBQLVkQIGKcmC/LKSj7f/mpyBUeu2EPTo2HEg==",
"version": "1.20250712.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250712.0.tgz",
"integrity": "sha512-EFRrGe/bqK7NHtht7vNlbrDpfvH3eRvtJOgsTpEQEysDjVmlK6pVJxSnLy9Hg1zlLY15IfhfGC+K2qisseHGJQ==",
"cpu": [
"x64"
],
@ -121,9 +121,9 @@
}
},
"node_modules/@cloudflare/workerd-linux-arm64": {
"version": "1.20250617.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250617.0.tgz",
"integrity": "sha512-YAzcOyu897z5dQKFzme1oujGWMGEJCR7/Wrrm1nSP6dqutxFPTubRADM8BHn2CV3ij//vaPnAeLmZE3jVwOwig==",
"version": "1.20250712.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250712.0.tgz",
"integrity": "sha512-rG8JUleddhUHQVwpXOYv0VbL0S9kOtR9PNKecgVhFpxEhC8aTeg2HNBBjo8st7IfcUvY8WaW3pD3qdAMZ05UwQ==",
"cpu": [
"arm64"
],
@ -138,9 +138,9 @@
}
},
"node_modules/@cloudflare/workerd-windows-64": {
"version": "1.20250617.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250617.0.tgz",
"integrity": "sha512-XWM/6sagDrO0CYDKhXhPjM23qusvIN1ju9ZEml6gOQs8tNOFnq6Cn6X9FAmnyapRFCGUSEC3HZYJAm7zwVKaMA==",
"version": "1.20250712.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250712.0.tgz",
"integrity": "sha512-qS8H5RCYwE21Om9wo5/F807ClBJIfknhuLBj16eYxvJcj9JqgAKWi12BGgjyGxHuJJjeoQ63lr4wHAdbFntDDg==",
"cpu": [
"x64"
],
@ -155,9 +155,9 @@
}
},
"node_modules/@cloudflare/workers-types": {
"version": "4.20250703.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250703.0.tgz",
"integrity": "sha512-6ITY5VL2eDkwFVWtF4OSsLIalyuwAE8/eH76fFn1KNGsH5V8JdjYriFTa/3YaJ+mzt4n4X6Hv06zrg00IKBTIA==",
"version": "4.20250715.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250715.0.tgz",
"integrity": "sha512-uMp+ClvvhNlk3ojIgWuIB5Zteq4YVmZcyX16hpJ8eCeCX3izagfEZwXe/vETlv4cc5vtM3xAOMdV//0BD0E98g==",
"dev": true,
"license": "MIT OR Apache-2.0"
},
@ -186,9 +186,9 @@
}
},
"node_modules/@emnapi/runtime": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
"integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz",
"integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==",
"dev": true,
"license": "MIT",
"optional": true,
@ -707,9 +707,9 @@
}
},
"node_modules/@eslint/core": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
"integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
"version": "0.15.1",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
"integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@ -757,9 +757,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.30.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz",
"integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==",
"version": "9.31.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz",
"integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==",
"dev": true,
"license": "MIT",
"engines": {
@ -793,29 +793,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
"version": "0.15.1",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
"integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@ -1308,6 +1285,48 @@
"dev": true,
"license": "MIT"
},
"node_modules/@poppinss/colors": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.5.tgz",
"integrity": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==",
"dev": true,
"license": "MIT",
"dependencies": {
"kleur": "^4.1.5"
}
},
"node_modules/@poppinss/dumper": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.4.tgz",
"integrity": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@poppinss/colors": "^4.1.5",
"@sindresorhus/is": "^7.0.2",
"supports-color": "^10.0.0"
}
},
"node_modules/@poppinss/dumper/node_modules/supports-color": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz",
"integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/@poppinss/exception": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.2.tgz",
"integrity": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==",
"dev": true,
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.44.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz",
@ -1588,6 +1607,26 @@
"win32"
]
},
"node_modules/@sindresorhus/is": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz",
"integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
"node_modules/@speed-highlight/core": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.7.tgz",
"integrity": "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==",
"dev": true,
"license": "CC0-1.0"
},
"node_modules/@sveltejs/acorn-typescript": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz",
@ -1609,9 +1648,9 @@
}
},
"node_modules/@sveltejs/adapter-cloudflare": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-cloudflare/-/adapter-cloudflare-7.0.4.tgz",
"integrity": "sha512-pYJDICmhatM9lofkjLR+nhAJ4prEPjmwmx+J7hBuMSfrrNEVk+THfAahuWNizcxae4mO1MQKjIRMLpVnKyNE5g==",
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-cloudflare/-/adapter-cloudflare-7.1.0.tgz",
"integrity": "sha512-ogQHLrjZFQXUGlj8vXR/FgJlk2FW5iRB07Z9G3N3FcrU9oMRGL2pymFDWbaj5yfZNcrX/LA4EmtaeiVTjdYKeg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -1624,9 +1663,9 @@
}
},
"node_modules/@sveltejs/kit": {
"version": "2.22.2",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.22.2.tgz",
"integrity": "sha512-2MvEpSYabUrsJAoq5qCOBGAlkICjfjunrnLcx3YAk2XV7TvAIhomlKsAgR4H/4uns5rAfYmj7Wet5KRtc8dPIg==",
"version": "2.25.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.25.0.tgz",
"integrity": "sha512-Yc/WUMqYjYIZp2JsFUajw+cx7hIIqL1Z4uuhVl/yess65bGITbmG1aRIVOrlHg4oxmZqMluUJaVTLMLZZ9sNlg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -1641,8 +1680,7 @@
"mrmime": "^2.0.0",
"sade": "^1.8.1",
"set-cookie-parser": "^2.6.0",
"sirv": "^3.0.0",
"vitefu": "^1.0.6"
"sirv": "^3.0.0"
},
"bin": {
"svelte-kit": "svelte-kit.js"
@ -1657,43 +1695,43 @@
}
},
"node_modules/@sveltejs/vite-plugin-svelte": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.0.tgz",
"integrity": "sha512-wojIS/7GYnJDYIg1higWj2ROA6sSRWvcR1PO/bqEyFr/5UZah26c8Cz4u0NaqjPeVltzsVpt2Tm8d2io0V+4Tw==",
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.1.0.tgz",
"integrity": "sha512-+U6lz1wvGEG/BvQyL4z/flyNdQ9xDNv5vrh+vWBWTHaebqT0c9RNggpZTo/XSPoHsSCWBlYaTlRX8pZ9GATXCw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sveltejs/vite-plugin-svelte-inspector": "^4.0.1",
"@sveltejs/vite-plugin-svelte-inspector": "^5.0.0-next.1",
"debug": "^4.4.1",
"deepmerge": "^4.3.1",
"kleur": "^4.1.5",
"magic-string": "^0.30.17",
"vitefu": "^1.0.6"
"vitefu": "^1.1.1"
},
"engines": {
"node": "^18.0.0 || ^20.0.0 || >=22"
"node": "^20.19 || ^22.12 || >=24"
},
"peerDependencies": {
"svelte": "^5.0.0",
"vite": "^6.0.0"
"vite": "^6.3.0 || ^7.0.0"
}
},
"node_modules/@sveltejs/vite-plugin-svelte-inspector": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz",
"integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.0.tgz",
"integrity": "sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.7"
"debug": "^4.4.1"
},
"engines": {
"node": "^18.0.0 || ^20.0.0 || >=22"
"node": "^20.19 || ^22.12 || >=24"
},
"peerDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"@sveltejs/vite-plugin-svelte": "^6.0.0-next.0",
"svelte": "^5.0.0",
"vite": "^6.0.0"
"vite": "^6.3.0 || ^7.0.0"
}
},
"node_modules/@types/cookie": {
@ -1800,16 +1838,6 @@
"node": ">= 0.4"
}
},
"node_modules/as-table": {
"version": "1.0.55",
"resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz",
"integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"printable-characters": "^1.0.42"
}
},
"node_modules/axobject-query": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
@ -1972,13 +2000,6 @@
"node": ">=4"
}
},
"node_modules/data-uri-to-buffer": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz",
"integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==",
"dev": true,
"license": "MIT"
},
"node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
@ -2038,6 +2059,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/error-stack-parser-es": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz",
"integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/esbuild": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
@ -2093,9 +2124,9 @@
}
},
"node_modules/eslint": {
"version": "9.30.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz",
"integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==",
"version": "9.31.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz",
"integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -2103,9 +2134,9 @@
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.0",
"@eslint/config-helpers": "^0.3.0",
"@eslint/core": "^0.14.0",
"@eslint/core": "^0.15.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.30.1",
"@eslint/js": "9.31.0",
"@eslint/plugin-kit": "^0.3.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
@ -2170,9 +2201,9 @@
}
},
"node_modules/eslint-plugin-svelte": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.10.1.tgz",
"integrity": "sha512-csCh2x0ge/DugXC7dCANh46Igi7bjMZEy6rHZCdS13AoGVJSu7a90Kru3I8oMYLGEemPRE1hQXadxvRPVMAAXQ==",
"version": "3.11.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.11.0.tgz",
"integrity": "sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -2185,7 +2216,7 @@
"postcss-load-config": "^3.1.4",
"postcss-safe-parser": "^7.0.0",
"semver": "^7.6.3",
"svelte-eslint-parser": "^1.2.0"
"svelte-eslint-parser": "^1.3.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -2436,17 +2467,6 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/get-source": {
"version": "2.0.12",
"resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz",
"integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==",
"dev": true,
"license": "Unlicense",
"dependencies": {
"data-uri-to-buffer": "^2.0.0",
"source-map": "^0.6.1"
}
},
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@ -2713,9 +2733,9 @@
}
},
"node_modules/miniflare": {
"version": "4.20250617.5",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250617.5.tgz",
"integrity": "sha512-Qqn30jR6dCjXaKVizT6vH4KOb+GyLccoxLNOJEfu63yBPn8eoXa7PrdiSGTmjs2RY8/tr7eTO8Wu/Yr14k0xVA==",
"version": "4.20250712.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250712.0.tgz",
"integrity": "sha512-o7zYqG4pMi3gQTjiGhgZ82bQfexNwK+bzAaNlu8f7m3Kra4DcU5LC9nznfq2rfIBnUnMgwtU2VUfMlN1TuI8Og==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -2726,10 +2746,10 @@
"glob-to-regexp": "0.4.1",
"sharp": "^0.33.5",
"stoppable": "1.1.0",
"undici": "^5.28.5",
"workerd": "1.20250617.0",
"undici": "^7.10.0",
"workerd": "1.20250712.0",
"ws": "8.18.0",
"youch": "3.3.4",
"youch": "4.1.0-beta.10",
"zod": "3.22.3"
},
"bin": {
@ -2792,16 +2812,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"dev": true,
"license": "MIT",
"bin": {
"mustache": "bin/mustache"
}
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@ -3126,13 +3136,6 @@
"svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0"
}
},
"node_modules/printable-characters": {
"version": "1.0.42",
"resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz",
"integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==",
"dev": true,
"license": "Unlicense"
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@ -3324,16 +3327,6 @@
"node": ">=18"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@ -3344,17 +3337,6 @@
"node": ">=0.10.0"
}
},
"node_modules/stacktracey": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz",
"integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==",
"dev": true,
"license": "Unlicense",
"dependencies": {
"as-table": "^1.0.36",
"get-source": "^2.0.12"
}
},
"node_modules/stoppable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
@ -3393,9 +3375,9 @@
}
},
"node_modules/svelte": {
"version": "5.35.2",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.35.2.tgz",
"integrity": "sha512-uW/rRXYrhZ7Dh4UQNZ0t+oVGL1dEM+95GavCO8afAk1IY2cPq9BcZv9C3um5aLIya2y8lIeLPxLII9ASGg9Dzw==",
"version": "5.36.7",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.36.7.tgz",
"integrity": "sha512-QsaFAxL1PZvo9hwaN+x7Sq2U8oJARmsEuM8TEZVy98nx5D5IKzRi8FKkPvmOx9NXScSYnItDGLErBBn/ieIn2A==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -3419,9 +3401,9 @@
}
},
"node_modules/svelte-eslint-parser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.2.0.tgz",
"integrity": "sha512-mbPtajIeuiyU80BEyGvwAktBeTX7KCr5/0l+uRGLq1dafwRNrjfM5kHGJScEBlPG3ipu6dJqfW/k0/fujvIEVw==",
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.0.tgz",
"integrity": "sha512-VCgMHKV7UtOGcGLGNFSbmdm6kEKjtzo5nnpGU/mnx4OsFY6bZ7QwRF5DUx+Hokw5Lvdyo8dpk8B1m8mliomrNg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -3503,16 +3485,13 @@
"license": "MIT"
},
"node_modules/undici": {
"version": "5.29.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
"version": "7.11.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz",
"integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
"node": ">=20.18.1"
}
},
"node_modules/unenv": {
@ -3561,24 +3540,24 @@
}
},
"node_modules/vite": {
"version": "6.3.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
"integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz",
"integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
"fdir": "^6.4.6",
"picomatch": "^4.0.2",
"postcss": "^8.5.3",
"rollup": "^4.34.9",
"tinyglobby": "^0.2.13"
"postcss": "^8.5.6",
"rollup": "^4.40.0",
"tinyglobby": "^0.2.14"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
@ -3587,14 +3566,14 @@
"fsevents": "~2.3.3"
},
"peerDependencies": {
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
"@types/node": "^20.19.0 || >=22.12.0",
"jiti": ">=1.21.0",
"less": "*",
"less": "^4.0.0",
"lightningcss": "^1.21.0",
"sass": "*",
"sass-embedded": "*",
"stylus": "*",
"sugarss": "*",
"sass": "^1.70.0",
"sass-embedded": "^1.70.0",
"stylus": ">=0.54.8",
"sugarss": "^5.0.0",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
@ -3636,9 +3615,9 @@
}
},
"node_modules/vite-plugin-devtools-json": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/vite-plugin-devtools-json/-/vite-plugin-devtools-json-0.2.1.tgz",
"integrity": "sha512-5aiNvf/iLTuLR1dUqoI5CLLGgeK2hd6u+tA+RIp7GUZDyAcM6ECaUEWOOtGpidbcxbkKq++KtmSqA3jhMbPwMA==",
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/vite-plugin-devtools-json/-/vite-plugin-devtools-json-0.3.0.tgz",
"integrity": "sha512-y8QdN/uZNV0Jj96H9R3s7G9jtcSuyssk8EwSfWaY+NUAdy7976d7rjtXJzqmeCcgp4CZywcTyUc+k6zpPFHdeg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -3649,9 +3628,9 @@
}
},
"node_modules/vitefu": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.0.tgz",
"integrity": "sha512-AiG/L9DVsEYHWQ9jAEnke0nKiASlPw+JYwDl6Z4l6a6/IqT1tKseEl6R5+rVnKJt/K3jCTWiQvgoIh5MuqBJJQ==",
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz",
"integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==",
"dev": true,
"license": "MIT",
"workspaces": [
@ -3695,9 +3674,9 @@
}
},
"node_modules/workerd": {
"version": "1.20250617.0",
"resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250617.0.tgz",
"integrity": "sha512-Uv6p0PYUHp/W/aWfUPLkZVAoAjapisM27JJlwcX9wCPTfCfnuegGOxFMvvlYpmNaX4YCwEdLCwuNn3xkpSkuZw==",
"version": "1.20250712.0",
"resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250712.0.tgz",
"integrity": "sha512-7h+k1OxREpiZW0849g0uQNexRWMcs5i5gUGhJzCY8nIx6Tv4D/ndlXJ47lEFj7/LQdp165IL9dM2D5uDiedZrg==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
@ -3708,11 +3687,11 @@
"node": ">=16"
},
"optionalDependencies": {
"@cloudflare/workerd-darwin-64": "1.20250617.0",
"@cloudflare/workerd-darwin-arm64": "1.20250617.0",
"@cloudflare/workerd-linux-64": "1.20250617.0",
"@cloudflare/workerd-linux-arm64": "1.20250617.0",
"@cloudflare/workerd-windows-64": "1.20250617.0"
"@cloudflare/workerd-darwin-64": "1.20250712.0",
"@cloudflare/workerd-darwin-arm64": "1.20250712.0",
"@cloudflare/workerd-linux-64": "1.20250712.0",
"@cloudflare/workerd-linux-arm64": "1.20250712.0",
"@cloudflare/workerd-windows-64": "1.20250712.0"
}
},
"node_modules/worktop": {
@ -3730,9 +3709,9 @@
}
},
"node_modules/wrangler": {
"version": "4.23.0",
"resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.23.0.tgz",
"integrity": "sha512-JSeDt3IwA4TEmg/V3tRblImPjdxynBt9PUVO/acQJ83XGlMMSwswDKL1FuwvbFzgX6+JXc3GMHeu7r8AQIxw9w==",
"version": "4.25.0",
"resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.25.0.tgz",
"integrity": "sha512-SepXQbzWkdp0O7qAx3i0go+fw5I0VkDqLV2G3ewbffO5k8kpvuCkhalS23KO+7+o8+Oa3vfC7x+16IL3rj2n4w==",
"dev": true,
"license": "MIT OR Apache-2.0",
"dependencies": {
@ -3740,10 +3719,10 @@
"@cloudflare/unenv-preset": "2.3.3",
"blake3-wasm": "2.1.5",
"esbuild": "0.25.4",
"miniflare": "4.20250617.5",
"miniflare": "4.20250712.0",
"path-to-regexp": "6.3.0",
"unenv": "2.0.0-rc.17",
"workerd": "1.20250617.0"
"workerd": "1.20250712.0"
},
"bin": {
"wrangler": "bin/wrangler.js",
@ -3756,7 +3735,7 @@
"fsevents": "~2.3.2"
},
"peerDependencies": {
"@cloudflare/workers-types": "^4.20250617.0"
"@cloudflare/workers-types": "^4.20250712.0"
},
"peerDependenciesMeta": {
"@cloudflare/workers-types": {
@ -4266,25 +4245,38 @@
}
},
"node_modules/youch": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz",
"integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==",
"version": "4.1.0-beta.10",
"resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz",
"integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"cookie": "^0.7.1",
"mustache": "^4.2.0",
"stacktracey": "^2.1.8"
"@poppinss/colors": "^4.1.5",
"@poppinss/dumper": "^0.6.4",
"@speed-highlight/core": "^1.2.7",
"cookie": "^1.0.2",
"youch-core": "^0.3.3"
}
},
"node_modules/youch-core": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz",
"integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@poppinss/exception": "^1.2.2",
"error-stack-parser-es": "^1.0.5"
}
},
"node_modules/youch/node_modules/cookie": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
"integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
"node": ">=18"
}
},
"node_modules/zimmerframe": {

View File

@ -1,7 +1,7 @@
{
"name": "darkicewolf50",
"private": true,
"version": "0.0.1",
"version": "3.0.0",
"type": "module",
"scripts": {
"start": "vite dev",
@ -15,20 +15,20 @@
},
"devDependencies": {
"@eslint/compat": "^1.2.5",
"@eslint/js": "^9.18.0",
"@eslint/js": "^9.31.0",
"@sveltejs/adapter-auto": "^6.0.0",
"@sveltejs/adapter-cloudflare": "^7.0.4",
"@sveltejs/kit": "^2.16.0",
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"eslint": "^9.18.0",
"@sveltejs/adapter-cloudflare": "^7.1.0",
"@sveltejs/kit": "^2.25.0",
"@sveltejs/vite-plugin-svelte": "^6.1.0",
"eslint": "^9.31.0",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^3.0.0",
"eslint-plugin-svelte": "^3.11.0",
"globals": "^16.0.0",
"prettier": "^3.4.2",
"prettier-plugin-svelte": "^3.3.3",
"svelte": "^5.0.0",
"vite": "^6.2.6",
"vite-plugin-devtools-json": "^0.2.0",
"wrangler": "^4.23.0"
"svelte": "^5.36.7",
"vite": "^7.0.5",
"vite-plugin-devtools-json": "^0.3.0",
"wrangler": "^4.25.0"
}
}

View File

@ -1,26 +1,42 @@
<script>
import ProjectsCard from './projectsCard.svelte';
let { independent_page = true } = $props();
let { independent_page = true, techTablePromise = null } = $props();
let limitProjects = $derived(independent_page ? 0 : 8);
let projectsPromise = $state(null);
let techPromise = $state(null);
$effect(async () => {
try {
const res = await fetch(
`https://darkicewolf50cloud.bajacloud.duckdns.org/projects/${limitProjects}`
);
if (!res.ok) {
projectsPromise = null;
return;
$effect(() => {
projectsPromise = (async () => {
try {
const res = await fetch(
`https://darkicewolf50cloud.bajacloud.duckdns.org/projects/${limitProjects}`
);
if (!res.ok) return null;
return await res.json();
} catch (e) {
console.error('Fetch error:', e);
return -1;
}
const data = await res.json();
projectsPromise = Array.isArray(data) ? data : null;
} catch (e) {
console.error('Fetch error:', e);
projectsPromise = null;
})();
if (independent_page) {
techPromise = (async () => {
try {
const res = await fetch('https://darkicewolf50cloud.bajacloud.duckdns.org/home/skills');
if (!(await res.ok)) return null;
return await res.json();
} catch (e) {
console.error('Fetch error:', e);
return -1;
}
})();
} else {
techPromise = techTablePromise ?? Promise.resolve(-1);
}
});
@ -35,35 +51,65 @@
<p>Top Featured and Recent Projects</p>
</div>
<div class="project-section">
<ProjectsCard
project_name="Portfolio Site Version 3.0.0"
website_link="https://darkicewolf50.pages.dev"
gitea_link="https://gitea.bajacloud.duckdns.org/darkicewolf50/darkicewolf50"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png"
techs_used={['JavaScript', 'CSS', 'SvelteKit', 'Git', 'Gitea']}
project_des="A conversion from Dioxus to Sveltekit is going to be worth it as it is significantly easier to add additional api calls.
{#await Promise.all([projectsPromise, techPromise])}
<p>Loading...</p>
{:then [projects, techTable]}
{#if projects === -1 || techTable === -1}
<p>An Error has occurred</p>
{:else if projects != null && techTable != null}
{#each projects as project, projectIndex}
<ProjectsCard
key={project.project_name + projectIndex}
{techTable}
project_name={project.project_name}
website_link={project.website_link}
github_link={project.github_link}
gitea_link={project.gitea_link}
dockerhub_link={project.dockerhub_link}
techs_used={project.techs_used}
project_des={project.project_des}
project_img={project.project_img}
/>
{/each}
{:else}
<ProjectsCard
project_name="Portfolio Site Version 3.0.0"
website_link="https://darkicewolf50.pages.dev"
gitea_link="https://gitea.bajacloud.duckdns.org/darkicewolf50/darkicewolf50"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png"
techs_used={['JavaScript', 'CSS', 'SvelteKit', 'Git', 'Gitea']}
project_des="A conversion from Dioxus to Sveltekit is going to be worth it as it is significantly easier to add additional api calls.
This is not to mention the benefits of using ssg instead of a client side rendered app.
Overall this was a great way to dive into a great JavaScript framework."
/>
<ProjectsCard
project_name="Personal Backend"
gitea_link="https://gitea.bajacloud.duckdns.org/darkicewolf50/darkicewolf50Cloud"
dockerhub_link="https://hub.docker.com/r/darkicewolf50/darkicewolf50cloud"
project_img="https://actix.rs/img/logo.png"
techs_used={['Rust', 'Actix', 'Github Actions', 'Docker', 'Traefik', 'Gitea', 'Git', 'Github']}
project_des="I find that this is a much better option in compareision to FastAPI as it does not require a post request
/>
<ProjectsCard
project_name="Personal Backend"
gitea_link="https://gitea.bajacloud.duckdns.org/darkicewolf50/darkicewolf50Cloud"
dockerhub_link="https://hub.docker.com/r/darkicewolf50/darkicewolf50cloud"
project_img="https://actix.rs/img/logo.png"
techs_used={[
'Rust',
'Actix',
'Github Actions',
'Docker',
'Traefik',
'Gitea',
'Git',
'Github'
]}
project_des="I find that this is a much better option in compareision to FastAPI as it does not require a post request
to input data instead it give the option for the url to give the parameters it needs. I don't have any complains about using Actix, its mature stable and fairly popular.
This backend application also uses comrak to convert markdown blogs into html docuemnts that are then seen by you the user.
This honestly was a fun challenge getting the blogs previews, ensuring correctness and not allowing for any unknown states,
this will serve as a great basis for any future backend requirements that I may have."
/>
<ProjectsCard
project_name="Portfolio Site Version 2.0.1"
website_link="https://darkicewolf50.pages.dev"
gitea_link="https://gitea.bajacloud.duckdns.org/darkicewolf50/personal_site"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png"
techs_used={['Rust', 'CSS', 'Dioxus', 'Git', 'Gitea']}
project_des="This project was a great test of my newly learned Rust.
/>
<ProjectsCard
project_name="Portfolio Site Version 2.0.1"
website_link="https://darkicewolf50.pages.dev"
gitea_link="https://gitea.bajacloud.duckdns.org/darkicewolf50/personal_site"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png"
techs_used={['Rust', 'CSS', 'Dioxus', 'Git', 'Gitea']}
project_des="This project was a great test of my newly learned Rust.
This major update added functionality for the contact me, the blogs part of the site, as well as many minor
UI consistencies to ensure that all of the buttons and links felt like buttons and links.
I was surprise how easy it was to set up a discord webhook using the 'reqwest' crate.
@ -71,52 +117,54 @@
I think using tools like disocrd webhooks and email notifications are great for users but certainly not great for reading data from.
I was very satisfied with serde, and comrak for converting markdown files into html.
I use this extensively for the blogs search menu and the blog itself to display the blog itself in a consistent way without needing to write a whole library."
/>
<ProjectsCard
project_name="Portfolio Site 1.0.0"
website_link="https://darkicewolf50.github.io"
github_link="https://github.com/darkicewolf50/darkicewolf50.github.io"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png"
techs_used={['Rust', 'CSS', 'Dioxus', 'Git', 'Github']}
project_des="This project was a great test of my newly learned Rust.
/>
<ProjectsCard
project_name="Portfolio Site 1.0.0"
website_link="https://darkicewolf50.github.io"
github_link="https://github.com/darkicewolf50/darkicewolf50.github.io"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png"
techs_used={['Rust', 'CSS', 'Dioxus', 'Git', 'Github']}
project_des="This project was a great test of my newly learned Rust.
It was certainly interesting to go through all of the stages of front end web developement, while the orignal and new found scope is not currently achieved, it will be on a later pass through.
I am very happy with how it turned out in compairison to my origanl site map, and wireframes.
Considering this phase one was accomplished in 3 working days I believe it is an excellent show of my skill."
/>
<ProjectsCard
project_name="UCalgary Baja Backend"
project_img="https://www.svgrepo.com/show/448221/docker.svg"
dockerhub_link="https://hub.docker.com/r/darkicewolf50/uofcbajacloud"
techs_used={['Python', 'FastAPI', 'Github Actions', 'Docker', 'Traefik', 'Git', 'Github']}
project_des="This is going to be extremely cost saving for the non-profit club UCalgary Baja.
/>
<ProjectsCard
project_name="UCalgary Baja Backend"
project_img="https://www.svgrepo.com/show/448221/docker.svg"
dockerhub_link="https://hub.docker.com/r/darkicewolf50/uofcbajacloud"
techs_used={['Python', 'FastAPI', 'Github Actions', 'Docker', 'Traefik', 'Git', 'Github']}
project_des="This is going to be extremely cost saving for the non-profit club UCalgary Baja.
Using automated uploads and linting to check the Python and FastAPI code was excellent for learning how to self-host a web server.
This was then upgraded later with the addition of treafik so that it could be SSL certified, this is also known as supporting HTTPS transmissions.
Ultimately it will serve as a great stepping stone for both myself an anyone else in UCalgary Baja Software subteam.
This will lead into using Actixs in the migration Soon to be."
/>
<ProjectsCard
project_name="UCalgary Baja Website"
website_link="https://uofcbaja.pages.dev"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745633714/ucalgary-baja-site-April.png"
techs_used={[
'HTML5',
'CSS',
'JavaScript',
'Markdown',
'YAML',
'React',
'Git',
'Github',
'Cloudflare'
]}
project_des="The flexibility that we achieved using React,
/>
<ProjectsCard
project_name="UCalgary Baja Website"
website_link="https://uofcbaja.pages.dev"
project_img="https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745633714/ucalgary-baja-site-April.png"
techs_used={[
'HTML5',
'CSS',
'JavaScript',
'Markdown',
'YAML',
'React',
'Git',
'Github',
'Cloudflare'
]}
project_des="The flexibility that we achieved using React,
rather than a locked down platform or framework has allows all the Software members of UCalgary Baja to learn infinitely more.
This isn't to say that it is faster or have additional perks of using 'non-code website builders'.
This is provided massive opportunities to learn teach and save on cost compaired to the website builders.
Overall I would say this will be worth it in the long run and opened my eyes to different website hosting providers,
with their associated perks and costs.
When we change it, it will most likely we re-written in Vue as there is a good non-depreciated way to initalize the framework."
/>
/>
{/if}
{/await}
</div>
<style>

View File

@ -1,14 +1,13 @@
<script>
const tech_table_lookup = (to_lookup) => {
const tech_table_lookup = (to_lookup, techTable) => {
let tech_to_return = {
tech_name: 'Not in table',
tech_logo: '',
project_site: '',
skill_level: 0
};
// let tech_to_return = null; // Default value for tech_to_return
for (let tech of TECH_TABLE) {
for (let tech of techTable) {
if (tech.tech_name === to_lookup) {
tech_to_return = tech;
break; // Optional: stop the loop once the match is found
@ -18,238 +17,6 @@
return tech_to_return;
};
const TECH_TABLE = [
{
tech_name: 'Rust',
tech_logo: 'https://www.svgrepo.com/show/374056/rust.svg',
project_site: 'https://www.rust-lang.org',
skill_level: 60
},
{
tech_name: 'Python',
tech_logo: 'https://www.svgrepo.com/show/452091/python.svg',
project_site: 'https://www.python.org',
skill_level: 50
},
{
tech_name: 'JavaScript',
tech_logo: 'https://www.svgrepo.com/show/303206/javascript-logo.svg',
project_site: 'https://www.python.org',
skill_level: 60
},
{
tech_name: 'YAML',
tech_logo: 'https://yaml.org/favicon.svg',
project_site: 'https://yaml.org',
skill_level: 95
},
{
tech_name: 'Github',
tech_logo: 'https://www.svgrepo.com/show/512317/github-142.svg',
project_site: 'https://github.com/darkicewolf50',
skill_level: 80
},
{
tech_name: 'Email',
tech_logo: 'https://www.svgrepo.com/show/491226/email.svg',
project_site: 'mailto:darkicewolf50@gmail.com',
skill_level: 100
},
{
tech_name: 'LinkedIn',
tech_logo: 'https://www.svgrepo.com/show/521725/linkedin.svg',
project_site: 'https://www.linkedin.com/in/brock-tomlinson/',
skill_level: 40
},
{
tech_name: 'Twitch',
tech_logo: 'https://www.svgrepo.com/show/519925/twitch.svg',
project_site: 'https://www.twitch.tv/darkicewolf50',
skill_level: 60
},
{
tech_name: 'Youtube',
tech_logo: 'https://www.svgrepo.com/show/521936/youtube.svg',
project_site: 'https://www.youtube.com/@darkicewolf50',
skill_level: 40
},
{
tech_name: 'Internet',
tech_logo: 'https://www.svgrepo.com/show/490809/internet.svg',
project_site: 'https://google.com',
skill_level: 99
},
{
tech_name: 'React',
tech_logo: 'https://www.svgrepo.com/show/452092/react.svg',
project_site: 'https://react.dev',
skill_level: 70
},
{
tech_name: 'Docker',
tech_logo: 'https://www.svgrepo.com/show/448221/docker.svg',
project_site: 'https://www.docker.com',
skill_level: 70
},
{
tech_name: 'FastAPI',
tech_logo: 'https://fastapi.tiangolo.com/img/favicon.png',
project_site: 'https://fastapi.tiangolo.com',
skill_level: 80
},
{
tech_name: 'Actix',
tech_logo: 'https://actix.rs/img/logo.png',
project_site: 'https://actix.rs',
skill_level: 20
},
{
tech_name: 'HTML5',
tech_logo: 'https://www.svgrepo.com/show/452228/html-5.svg',
project_site: 'https://google.com',
skill_level: 90
},
{
tech_name: 'CSS',
tech_logo: 'https://www.svgrepo.com/show/452185/css-3.svg',
project_site: 'https://google.com',
skill_level: 65
},
{
tech_name: 'Git',
tech_logo: 'https://www.svgrepo.com/show/452210/git.svg',
project_site: 'https://git-scm.com',
skill_level: 55
},
{
tech_name: 'Github Actions',
tech_logo: 'https://cdn.simpleicons.org/githubactions/2088FF',
project_site: 'https://github.com/',
skill_level: 50
},
{
tech_name: 'Vs Code',
tech_logo: 'https://www.svgrepo.com/show/452129/vs-code.svg',
project_site: 'https://code.visualstudio.com',
skill_level: 60
},
{
tech_name: 'Gitea',
tech_logo: 'https://about.gitea.com/gitea.png',
project_site: 'https://about.gitea.com',
skill_level: 85
},
{
tech_name: 'AWS',
tech_logo: 'https://www.svgrepo.com/show/448266/aws.svg',
project_site: 'https://aws.amazon.com',
skill_level: 30
},
{
tech_name: 'Firefox',
tech_logo: 'https://www.svgrepo.com/show/378808/firefox-developer-edition-57-70.svg',
project_site: 'https://www.mozilla.org/en-CA/firefox/developer/',
skill_level: 80
},
{
tech_name: 'Markdown',
tech_logo: 'https://www.svgrepo.com/show/510065/markdown.svg',
project_site: 'https://www.markdownguide.org',
skill_level: 90
},
{
tech_name: 'Prettier',
tech_logo: 'https://prettier.io/icon.png',
project_site: 'https://prettier.io',
skill_level: 90
},
{
tech_name: 'Cloudflare',
tech_logo:
'https://qualified-production.s3.us-east-1.amazonaws.com/uploads/3b522ef84c409e4457032e4b4e3b984abbc92522c6f100f4ccc55c0ccfd3062b.png',
project_site: 'https://www.cloudflare.com/en-ca/',
skill_level: 65
},
{
tech_name: 'Netlify',
tech_logo:
'https://qualified-production.s3.us-east-1.amazonaws.com/uploads/0f63ae7280d8d193e346973a1915bf99aea8c63e254eb062bad0bde99b43a9b7.png',
project_site: 'https://www.netlify.com',
skill_level: 60
},
{
tech_name: 'Vercel',
tech_logo: 'https://www.svgrepo.com/show/361653/vercel-logo.svg',
project_site: 'https://vercel.com/home',
skill_level: 60
},
{
tech_name: 'Dioxus',
tech_logo: 'https://dioxuslabs.com/assets/smalllogo-b1926fd214dc8427.png',
project_site: 'https://dioxuslabs.com',
skill_level: 70
},
{
tech_name: 'SvelteKit',
tech_logo: 'https://svelte.dev/favicon.png',
project_site: 'https://svelte.dev',
skill_level: 1
},
{
tech_name: 'Mongodb',
tech_logo: 'https://www.svgrepo.com/show/331488/mongodb.svg',
project_site: 'https://www.mongodb.com',
skill_level: 10
},
{
tech_name: 'Sqlite',
tech_logo: 'https://www.svgrepo.com/show/374094/sqlite.svg',
project_site: 'https://www.sqlite.org',
skill_level: 10
},
{
tech_name: 'PostgreSQL',
tech_logo: 'https://www.svgrepo.com/show/303301/postgresql-logo.svg',
project_site: 'https://www.postgresql.org',
skill_level: 10
},
{
tech_name: 'DynamoDB',
tech_logo: 'https://www.svgrepo.com/show/473526/amazondynamodb.svg',
project_site: 'https://aws.amazon.com/dynamodb/',
skill_level: 70
},
{
tech_name: 'Diesel',
tech_logo:
'https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745443276/diesel_logo_ujtvia.png',
project_site: 'https://diesel.rs',
skill_level: 10
},
{
tech_name: 'Kubernetes',
tech_logo: 'https://kubernetes.io/images/kubernetes.png',
project_site: 'https://kubernetes.io',
skill_level: 5
},
{
tech_name: 'Terraform',
tech_logo: 'https://www.svgrepo.com/show/448253/terraform.svg',
project_site: 'https://www.terraform.io',
skill_level: 15
},
{
tech_name: 'Traefik',
tech_logo: 'https://hub.docker.com/api/media/repos_logo/v1/library%2Ftraefik',
project_site: 'https://traefik.io/traefik/',
skill_level: 60
}
];
let {
website_link,
github_link,
@ -258,7 +25,8 @@
project_name,
techs_used,
project_des,
project_img = 'https://picsum.photos/200'
project_img = 'https://picsum.photos/200',
techTable
} = $props();
</script>
@ -271,7 +39,7 @@
<a href={github_link}>
<img
class="lookup"
src={tech_table_lookup('Github').tech_logo}
src={tech_table_lookup('Github', techTable).tech_logo}
alt={{ techs_used } + "'s logo/icon"}
/>
</a>
@ -281,7 +49,7 @@
<a href={gitea_link} class="gitea">
<img
class="lookup"
src={tech_table_lookup('Gitea').tech_logo}
src={tech_table_lookup('Gitea', techTable).tech_logo}
alt={{ techs_used } + "'s logo/icon"}
/>
</a>
@ -290,7 +58,7 @@
<a href={dockerhub_link} class="dockerhub">
<img
class="lookup"
src={tech_table_lookup('Docker').tech_logo}
src={tech_table_lookup('Docker', techTable).tech_logo}
alt={{ techs_used } + "'s logo/icon"}
/>
</a>
@ -299,7 +67,7 @@
<a href={website_link}>
<img
class="lookup"
src={tech_table_lookup('Internet').tech_logo}
src={tech_table_lookup('Internet', techTable).tech_logo}
alt={{ techs_used } + "'s logo/icon"}
/>
</a>
@ -313,7 +81,7 @@
{#each techs_used as tech, index}
<img
key={tech + index}
src={tech_table_lookup(tech).tech_logo}
src={tech_table_lookup(tech, techTable).tech_logo}
alt={{ techs_used } + "'s logo/icon"}
/>
{/each}

View File

@ -1,5 +1,5 @@
<script>
const tech_table_lookup = (to_lookup) => {
const tech_table_lookup = (to_lookup, techTable) => {
let tech_to_return = {
tech_name: 'Not in table',
tech_logo: '',
@ -8,259 +8,28 @@
};
// let tech_to_return = null; // Default value for tech_to_return
for (let tech of TECH_TABLE) {
for (let tech of techTable) {
if (tech.tech_name === to_lookup) {
tech_to_return = tech;
break; // Optional: stop the loop once the match is found
}
}
if (tech_props.tech_name === 'Dioxus') {
console.log(tech_props.tech_logo);
}
return tech_to_return;
};
// https://darkicewolf50cloud.bajacloud.duckdns.org/home/skills
const TECH_TABLE = [
{
tech_name: 'Rust',
tech_logo: 'https://www.svgrepo.com/show/374056/rust.svg',
project_site: 'https://www.rust-lang.org',
skill_level: 60
},
{
tech_name: 'Python',
tech_logo: 'https://www.svgrepo.com/show/452091/python.svg',
project_site: 'https://www.python.org',
skill_level: 50
},
{
tech_name: 'JavaScript',
tech_logo: 'https://www.svgrepo.com/show/303206/javascript-logo.svg',
project_site: 'https://google.com',
skill_level: 60
},
{
tech_name: 'YAML',
tech_logo: 'https://yaml.org/favicon.svg',
project_site: 'https://yaml.org',
skill_level: 95
},
{
tech_name: 'Github',
tech_logo: 'https://www.svgrepo.com/show/512317/github-142.svg',
project_site: 'https://github.com/darkicewolf50',
skill_level: 80
},
{
tech_name: 'Email',
tech_logo: 'https://www.svgrepo.com/show/491226/email.svg',
project_site: 'mailto:darkicewolf50@gmail.com',
skill_level: 100
},
{
tech_name: 'LinkedIn',
tech_logo: 'https://www.svgrepo.com/show/521725/linkedin.svg',
project_site: 'https://www.linkedin.com/in/brock-tomlinson/',
skill_level: 40
},
{
tech_name: 'Twitch',
tech_logo: 'https://www.svgrepo.com/show/519925/twitch.svg',
project_site: 'https://www.twitch.tv/darkicewolf50',
skill_level: 60
},
{
tech_name: 'Youtube',
tech_logo: 'https://www.svgrepo.com/show/521936/youtube.svg',
project_site: 'https://www.youtube.com/@darkicewolf50',
skill_level: 40
},
{
tech_name: 'Internet',
tech_logo: 'https://www.svgrepo.com/show/490809/internet.svg',
project_site: 'https://google.com',
skill_level: 99
},
{
tech_name: 'React',
tech_logo: 'https://www.svgrepo.com/show/452092/react.svg',
project_site: 'https://react.dev',
skill_level: 70
},
{
tech_name: 'Docker',
tech_logo: 'https://www.svgrepo.com/show/448221/docker.svg',
project_site: 'https://www.docker.com',
skill_level: 70
},
{
tech_name: 'FastAPI',
tech_logo: 'https://fastapi.tiangolo.com/img/favicon.png',
project_site: 'https://fastapi.tiangolo.com',
skill_level: 80
},
{
tech_name: 'Actix',
tech_logo: 'https://actix.rs/img/logo.png',
project_site: 'https://actix.rs',
skill_level: 20
},
{
tech_name: 'HTML5',
tech_logo: 'https://www.svgrepo.com/show/452228/html-5.svg',
project_site: 'https://google.com',
skill_level: 90
},
{
tech_name: 'CSS',
tech_logo: 'https://www.svgrepo.com/show/452185/css-3.svg',
project_site: 'https://google.com',
skill_level: 65
},
{
tech_name: 'Git',
tech_logo: 'https://www.svgrepo.com/show/452210/git.svg',
project_site: 'https://git-scm.com',
skill_level: 55
},
{
tech_name: 'Github Actions',
tech_logo: 'https://cdn.simpleicons.org/githubactions/2088FF',
project_site: 'https://github.com/',
skill_level: 50
},
{
tech_name: 'Vs Code',
tech_logo: 'https://www.svgrepo.com/show/452129/vs-code.svg',
project_site: 'https://code.visualstudio.com',
skill_level: 60
},
{
tech_name: 'Gitea',
tech_logo: 'https://about.gitea.com/gitea.png',
project_site: 'https://about.gitea.com',
skill_level: 85
},
{
tech_name: 'AWS',
tech_logo: 'https://www.svgrepo.com/show/448266/aws.svg',
project_site: 'https://aws.amazon.com',
skill_level: 30
},
{
tech_name: 'Firefox',
tech_logo: 'https://www.svgrepo.com/show/378808/firefox-developer-edition-57-70.svg',
project_site: 'https://www.mozilla.org/en-CA/firefox/developer/',
skill_level: 80
},
{
tech_name: 'Markdown',
tech_logo: 'https://www.svgrepo.com/show/510065/markdown.svg',
project_site: 'https://www.markdownguide.org',
skill_level: 90
},
{
tech_name: 'Prettier',
tech_logo: 'https://prettier.io/icon.png',
project_site: 'https://prettier.io',
skill_level: 90
},
{
tech_name: 'Cloudflare',
tech_logo:
'https://qualified-production.s3.us-east-1.amazonaws.com/uploads/3b522ef84c409e4457032e4b4e3b984abbc92522c6f100f4ccc55c0ccfd3062b.png',
project_site: 'https://www.cloudflare.com/en-ca/',
skill_level: 65
},
{
tech_name: 'Netlify',
tech_logo:
'https://qualified-production.s3.us-east-1.amazonaws.com/uploads/0f63ae7280d8d193e346973a1915bf99aea8c63e254eb062bad0bde99b43a9b7.png',
project_site: 'https://www.netlify.com',
skill_level: 60
},
{
tech_name: 'Vercel',
tech_logo: 'https://www.svgrepo.com/show/361653/vercel-logo.svg',
project_site: 'https://vercel.com/home',
skill_level: 60
},
{
tech_name: 'Dioxus',
tech_logo: 'https://dioxuslabs.com/assets/smalllogo-b1926fd214dc8427.png',
project_site: 'https://dioxuslabs.com',
skill_level: 70
},
{
tech_name: 'SvelteKit',
tech_logo: 'https://svelte.dev/favicon.png',
project_site: 'https://svelte.dev',
skill_level: 70
},
{
tech_name: 'Mongodb',
tech_logo: 'https://www.svgrepo.com/show/331488/mongodb.svg',
project_site: 'https://www.mongodb.com',
skill_level: 10
},
{
tech_name: 'Sqlite',
tech_logo: 'https://www.svgrepo.com/show/374094/sqlite.svg',
project_site: 'https://www.sqlite.org',
skill_level: 10
},
{
tech_name: 'PostgreSQL',
tech_logo: 'https://www.svgrepo.com/show/303301/postgresql-logo.svg',
project_site: 'https://www.postgresql.org',
skill_level: 10
},
{
tech_name: 'DynamoDB',
tech_logo: 'https://www.svgrepo.com/show/473526/amazondynamodb.svg',
project_site: 'https://aws.amazon.com/dynamodb/',
skill_level: 70
},
{
tech_name: 'Diesel',
tech_logo:
'https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745443276/diesel_logo_ujtvia.png',
project_site: 'https://diesel.rs',
skill_level: 10
},
{
tech_name: 'Kubernetes',
tech_logo: 'https://kubernetes.io/images/kubernetes.png',
project_site: 'https://kubernetes.io',
skill_level: 5
},
{
tech_name: 'Terraform',
tech_logo: 'https://www.svgrepo.com/show/448253/terraform.svg',
project_site: 'https://www.terraform.io',
skill_level: 15
},
{
tech_name: 'Traefik',
tech_logo: 'https://hub.docker.com/api/media/repos_logo/v1/library%2Ftraefik',
project_site: 'https://traefik.io/traefik/',
skill_level: 60
}
];
let { tech_props } = $props();
let props_tech = $derived(tech_table_lookup(tech_props));
let { tech_props, techTablePromise } = $props();
</script>
<a href={props_tech.project_site} class="tech-card">
<img src={props_tech.tech_logo} alt={tech_props + "'s logo"} />
<h4>{tech_props}</h4>
<progress value={props_tech.skill_level} max="100"></progress>
<a href={tech_props.project_site} class="tech-card">
<img src={tech_props.tech_logo} alt={tech_props.tech_name + "'s logo"} />
<h4>{tech_props.tech_name}</h4>
<progress value={tech_props.skill_level} max="100"></progress>
</a>
<style>

View File

@ -1,15 +1,44 @@
<script>
import TechCard from './techCard.svelte';
let { cat, tech_vec } = $props();
let { cat, tech_vec, techTablePromise } = $props();
const tech_table_lookup = (to_lookup, tableTech) => {
let tech_to_return = {
tech_name: 'Not in table',
tech_logo: '',
project_site: '',
skill_level: 0
};
for (let tech of tableTech) {
if (tech.tech_name === to_lookup) {
tech_to_return = tech;
break; // Optional: stop the loop once the match is found
}
}
return tech_to_return;
};
</script>
<div class="tech-cat">
<h3>{cat}</h3>
<div class="tech-row">
{#each tech_vec as tech}
<TechCard tech_props={tech} />
{/each}
{#await techTablePromise}
<p>Loading...</p>
{:then techTable}
{#if techTable != null}
{#each tech_vec as tech, techIndex}
<TechCard
tech_props={tech_table_lookup(tech, techTable)}
{techTablePromise}
key={tech + techIndex}
/>
{/each}
{:else}
<p>An Error has occurred or loading slowly</p>
{/if}
{/await}
</div>
</div>

View File

@ -20,6 +20,22 @@
'Terraform'
];
let platforms = ['AWS', 'Cloudflare', 'Vercel', 'Netlify', 'Gitea', 'Github'];
let techPromise = $state(null);
$effect(() => {
techPromise = (async () => {
try {
const res = await fetch('https://darkicewolf50cloud.bajacloud.duckdns.org/home/skills');
if (!(await res.ok)) return null;
return await res.json();
} catch (e) {
console.error('Fetch error:', e);
return -1;
}
})();
});
</script>
<title>Brock Tomlinson - Home</title>
@ -57,18 +73,18 @@
<p>Here is what I prefer to use and their self assessed skill</p>
<!-- <p>Here is what I developed skills in.</p> -->
<div class="technologies-cat">
<TechCat cat="Languages" tech_vec={languages} />
<TechCat cat="Backend" , tech_vec={backend} />
<TechCat cat="Frontend" , tech_vec={frontend} />
<TechCat cat="Databases" , tech_vec={databases} />
<TechCat cat="Platforms" , tech_vec={platforms} />
<TechCat cat="Tools" , tech_vec={tools} />
<TechCat cat="Languages" tech_vec={languages} techTablePromise={techPromise} />
<TechCat cat="Backend" , tech_vec={backend} techTablePromise={techPromise} />
<TechCat cat="Frontend" , tech_vec={frontend} techTablePromise={techPromise} />
<TechCat cat="Databases" , tech_vec={databases} techTablePromise={techPromise} />
<TechCat cat="Platforms" , tech_vec={platforms} techTablePromise={techPromise} />
<TechCat cat="Tools" , tech_vec={tools} techTablePromise={techPromise} />
</div>
</div>
<Contact />
<Projects independent_page={false} />
<Projects independent_page={false} techTablePromise={techPromise} />
<div id="experience">
<h2>Experience</h2>