Compare commits

...

3 commits

38 changed files with 469 additions and 484 deletions

3
.gitignore vendored
View file

@ -17,3 +17,6 @@ pnpm-debug.log*
# macOS-specific files # macOS-specific files
.DS_Store .DS_Store
# Astro
.astro/

View file

@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored
View file

@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

View file

@ -1,11 +1,11 @@
import { defineConfig } from 'astro/config'; import { defineConfig } from "astro/config";
import mdx from '@astrojs/mdx'; import mdx from "@astrojs/mdx";
import sitemap from '@astrojs/sitemap'; import sitemap from "@astrojs/sitemap";
import tailwind from "@astrojs/tailwind"; import tailwind from "@astrojs/tailwind";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
site: 'https://andyscott.me', site: "https://andyscott.me",
integrations: [mdx(), sitemap(), tailwind()] integrations: [mdx(), sitemap(), tailwind()],
}); });

162
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "Astro Modern Personal Website", "name": "Astro Modern Personal Website",
"version": "2.1.1", "version": "2.2.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "Astro Modern Personal Website", "name": "Astro Modern Personal Website",
"version": "2.1.1", "version": "2.2.0",
"dependencies": { "dependencies": {
"@astrojs/mdx": "^0.11.1", "@astrojs/mdx": "^0.11.1",
"@astrojs/rss": "^1.0.1", "@astrojs/rss": "^1.0.1",
@ -33,9 +33,9 @@
} }
}, },
"node_modules/@astrojs/compiler": { "node_modules/@astrojs/compiler": {
"version": "1.1.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-1.0.1.tgz",
"integrity": "sha512-C4kTwirys+HafufMqaxCbML2wqkGaXJM+5AekXh/v1IIOnMIdcEON9GBYsG6qa8aAmLhZ58aUZGPhzcA3Dx7Uw==" "integrity": "sha512-77aacobLKcL98NmhK3OBS5EHIrX9gs1ckB/vGSIdkVZuB7u51V4jh05I6W0tSvG7/86tALv6QtHTRZ8rLhFTbQ=="
}, },
"node_modules/@astrojs/language-server": { "node_modules/@astrojs/language-server": {
"version": "0.28.3", "version": "0.28.3",
@ -162,42 +162,6 @@
"tailwindcss": "^3.0.24" "tailwindcss": "^3.0.24"
} }
}, },
"node_modules/@astrojs/tailwind/node_modules/postcss-load-config": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
"integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
"dependencies": {
"lilconfig": "^2.0.5",
"yaml": "^2.1.1"
},
"engines": {
"node": ">= 14"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/@astrojs/tailwind/node_modules/yaml": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz",
"integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==",
"engines": {
"node": ">= 14"
}
},
"node_modules/@astrojs/telemetry": { "node_modules/@astrojs/telemetry": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-2.0.0.tgz",
@ -484,9 +448,9 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.20.15", "version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
"integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
}, },
@ -1435,11 +1399,11 @@
} }
}, },
"node_modules/astro": { "node_modules/astro": {
"version": "2.0.10", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/astro/-/astro-2.0.10.tgz", "resolved": "https://registry.npmjs.org/astro/-/astro-2.0.5.tgz",
"integrity": "sha512-Jg2JYPA6Nlip27So1+O0p9VFL98H+LiDLEt+F65e6536LkWE5oiV0fDSbK8aI8hKeCvOQzLiEZiD21eXbug0XQ==", "integrity": "sha512-ZuTbCOZLOnVOQ/np+82H3apL4TQ9jRUtIMfnAAUr4BG8NthwoY718avm5lfiI25bDqs7QA012Zh6l1h3RpJwtw==",
"dependencies": { "dependencies": {
"@astrojs/compiler": "^1.1.0", "@astrojs/compiler": "^1.0.1",
"@astrojs/language-server": "^0.28.3", "@astrojs/language-server": "^0.28.3",
"@astrojs/markdown-remark": "^2.0.1", "@astrojs/markdown-remark": "^2.0.1",
"@astrojs/telemetry": "^2.0.0", "@astrojs/telemetry": "^2.0.0",
@ -1501,9 +1465,9 @@
} }
}, },
"node_modules/astro/node_modules/es-module-lexer": { "node_modules/astro/node_modules/es-module-lexer": {
"version": "1.1.1", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.1.1.tgz", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.1.0.tgz",
"integrity": "sha512-n3ruqU8Te7I5prBd6d0darM8ajFuVNhLWvgo04hN7goWSaSrxe7ENOZitac7akN0A2o+8fMomBDsNPvW/eE3CQ==" "integrity": "sha512-fJg+1tiyEeS8figV+fPcPpm8WqJEflG3yPU0NOm5xMvrNkuiy7HzX/Ljng4Y0hAoiw4/3hQTCFYw+ub8+a2pRA=="
}, },
"node_modules/astro/node_modules/github-slugger": { "node_modules/astro/node_modules/github-slugger": {
"version": "2.0.0", "version": "2.0.0",
@ -2092,9 +2056,9 @@
} }
}, },
"node_modules/deepmerge-ts": { "node_modules/deepmerge-ts": {
"version": "4.3.0", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.3.0.tgz", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz",
"integrity": "sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==", "integrity": "sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==",
"engines": { "engines": {
"node": ">=12.4.0" "node": ">=12.4.0"
} }
@ -2151,9 +2115,9 @@
} }
}, },
"node_modules/devalue": { "node_modules/devalue": {
"version": "4.3.0", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.2.3.tgz",
"integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==" "integrity": "sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ=="
}, },
"node_modules/didyoumean": { "node_modules/didyoumean": {
"version": "1.2.2", "version": "1.2.2",
@ -4402,9 +4366,9 @@
} }
}, },
"node_modules/open": { "node_modules/open": {
"version": "8.4.1", "version": "8.4.0",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
"integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
"dependencies": { "dependencies": {
"define-lazy-prop": "^2.0.0", "define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1", "is-docker": "^2.1.1",
@ -4715,15 +4679,15 @@
} }
}, },
"node_modules/postcss-load-config": { "node_modules/postcss-load-config": {
"version": "3.1.4", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
"dependencies": { "dependencies": {
"lilconfig": "^2.0.5", "lilconfig": "^2.0.5",
"yaml": "^1.10.2" "yaml": "^2.1.1"
}, },
"engines": { "engines": {
"node": ">= 10" "node": ">= 14"
}, },
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
@ -4792,9 +4756,9 @@
} }
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "2.8.4", "version": "2.8.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz",
"integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==",
"bin": { "bin": {
"prettier": "bin-prettier.js" "prettier": "bin-prettier.js"
}, },
@ -5639,6 +5603,42 @@
"node": ">=10.13.0" "node": ">=10.13.0"
} }
}, },
"node_modules/tailwindcss/node_modules/postcss-load-config": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
"dependencies": {
"lilconfig": "^2.0.5",
"yaml": "^1.10.2"
},
"engines": {
"node": ">= 10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/tailwindcss/node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"engines": {
"node": ">= 6"
}
},
"node_modules/tiny-glob": { "node_modules/tiny-glob": {
"version": "0.2.9", "version": "0.2.9",
"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
@ -5741,9 +5741,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "5.18.0", "version": "5.16.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-5.16.0.tgz",
"integrity": "sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA==", "integrity": "sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==",
"dependencies": { "dependencies": {
"busboy": "^1.6.0" "busboy": "^1.6.0"
}, },
@ -5998,14 +5998,14 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "4.1.1", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz",
"integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==",
"dependencies": { "dependencies": {
"esbuild": "^0.16.14", "esbuild": "^0.16.3",
"postcss": "^8.4.21", "postcss": "^8.4.20",
"resolve": "^1.22.1", "resolve": "^1.22.1",
"rollup": "^3.10.0" "rollup": "^3.7.0"
}, },
"bin": { "bin": {
"vite": "bin/vite.js" "vite": "bin/vite.js"
@ -6239,11 +6239,11 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
}, },
"node_modules/yaml": { "node_modules/yaml": {
"version": "1.10.2", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==",
"engines": { "engines": {
"node": ">= 6" "node": ">= 14"
} }
}, },
"node_modules/yargs-parser": { "node_modules/yargs-parser": {

View file

@ -2,7 +2,7 @@
"name": "Astro Modern Personal Website", "name": "Astro Modern Personal Website",
"description": "Astro Modern personal website template with Project Section, CV Section, Paginated Blog, Shop, RSS Feed, SEO Friendly, Visual themes and Responsive Desing.", "description": "Astro Modern personal website template with Project Section, CV Section, Paginated Blog, Shop, RSS Feed, SEO Friendly, Visual themes and Responsive Desing.",
"type": "module", "type": "module",
"version": "2.1.1", "version": "2.2.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",

View file

@ -22,3 +22,17 @@ const { title, description, image = '/social_img.png' } = Astro.props;
<title>{title}</title> <title>{title}</title>
<meta name="title" content={title} /> <meta name="title" content={title} />
<meta name="description" content={description} /> <meta name="description" content={description} />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content={Astro.url} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={new URL(image, Astro.url)} />
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:url" content={Astro.url} />
<meta property="twitter:title" content={title} />
<meta property="twitter:description" content={description} />
<meta property="twitter:image" content={new URL(image, Astro.url)} />

View file

@ -5,26 +5,18 @@ const today = new Date();
<footer class="footer footer-center block mb-5 pt-10"> <footer class="footer footer-center block mb-5 pt-10">
<div class="inline opacity-75"> <div class="inline opacity-75">
<!-- Thanks for using this template. Please keep this line to support my work :) --> <!-- Thanks for using this template. Please keep this line to support my work :) -->
<a <a href="https://astro-modern-personal-website.netlify.app/" target="_blank" class="font-bold">Website Template</a> developed by
href="https://github.com/manuelernestog/astro-modern-personal-website" <a href="https://manuelernestog.github.io" target="_blank" class="font-bold">Manuel Ernesto ⚡️</a>
target="_blank"
class="font-bold">Website Template</a
>
developed by
<a href="https://manuelernestog.github.io" target="_blank" class="font-bold"
>Manuel Ernesto ⚡️</a
>
</div> </div>
<div class="pb-2"> <br />
<p> <div class="inline opacity-75">
Excluding the template, all page content for All content for
<a href="https://andyscott.me" class="font-bold">andyscott dot me</a> <a href="https://andyscott.me" class="font-bold">andyscott dot me</a>
&copy; 2021 Andrew Scott &copy; 2021 Andrew Scott
<a <a
href="https://creativecommons.org/licenses/by-sa/4.0/" href="https://creativecommons.org/licenses/by-sa/4.0/"
class="font-bold">CC BY-SA 4.0</a class="font-bold">CC BY-SA 4.0</a
> unless otherwise noted > unless otherwise noted
</p>
</div> </div>
</footer> </footer>
<style> <style>

View file

@ -4,23 +4,13 @@
<div class="navbar"> <div class="navbar">
<div class="navbar-start"> <div class="navbar-start">
<label for="my-drawer" class="btn btn-square btn-ghost"> <label for="my-drawer" class="btn btn-square btn-ghost">
<svg <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="inline-block w-5 h-5 stroke-current"
xmlns="http://www.w3.org/2000/svg" ><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
fill="none"
viewBox="0 0 24 24"
class="inline-block w-5 h-5 stroke-current"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
></path>
</svg> </svg>
</label> </label>
</div> </div>
<div class="navbar-center"> <div class="navbar-center">
<a class="btn btn-ghost normal-case text-xl" href="/">Andrew Scott</a> <a class="btn btn-ghost normal-case text-xl" href="/">Andy Scott</a>
</div> </div>
<div class="navbar-end"></div> <div class="navbar-end"></div>
</div> </div>

View file

@ -5,7 +5,7 @@ const { title, img, desc, url, badge, tags, target = '_blank' } = Astro.props;
<div class="rounded-lg bg-base-100 hover:shadow-xl transition ease-in-out hover:scale-[102%]"> <div class="rounded-lg bg-base-100 hover:shadow-xl transition ease-in-out hover:scale-[102%]">
<a href={url} target={target}> <a href={url} target={target}>
<div class="hero-content flex-col md:flex-row"> <div class="hero-content flex-col md:flex-row">
<img src={img} alt={title} class="max-w-full md:max-w-[13rem] rounded-lg" /> {img && <img src={img} alt={title} class="max-w-full md:max-w-[13rem] rounded-lg" />}
<div class="grow w-full"> <div class="grow w-full">
<h1 class="text-xl font-bold"> <h1 class="text-xl font-bold">
{title} {title}

View file

@ -1,50 +0,0 @@
---
const {
title,
img,
desc,
url,
badge,
target = "_self",
pricing,
oldPricing,
checkoutUrl,
details = true,
custom_link = false,
custom_link_label = "",
} = Astro.props;
---
<div class="rounded-lg bg-base-100 hover:shadow-xl transition ease-in-out hover:scale-[102%]">
<div class="hero-content flex-col md:flex-row">
<img src={img} alt={title} class="max-w-full md:max-w-[13rem] rounded-lg" />
<div class="grow w-full p-5 md:p-0">
<h1 class="text-xl font-bold">
{title}
{badge && <div class="badge badge-secondary mx-2">{badge}</div>}
</h1>
<div>
<span class="text-xl mr-1"> {pricing}</span>
<span class="text-md opacity-50 line-through">{oldPricing}</span>
</div>
<p class="py-1 text-1xl">{desc}</p>
<div class="card-actions md:justify-end mt-3 md:mt-0 flex">
<a class="btn btn-primary grow md:grow-0" href={checkoutUrl} target="_blank">Buy</a>
{
custom_link && (
<a href={custom_link} target="_blank" class="btn btn-outline grow md:grow-0">
{custom_link_label}
</a>
)
}
{
details && (
<a href={url} class="btn btn-outline grow md:grow-0">
Details
</a>
)
}
</div>
</div>
</div>
</div>

View file

@ -1,6 +1,8 @@
<div class="drawer-side bg-base-200"> <div class="drawer-side bg-base-200">
<label for="my-drawer" class="drawer-overlay bg-base-200"></label> <label for="my-drawer" class="drawer-overlay bg-base-200"></label>
<div class="menu p-4 overflow-y-auto overflow-x-hidden w-[19rem] bg-base-200 text-base-content"> <div
class="menu flex flex-col flex-nowrap p-4 overflow-y-auto w-[21rem] bg-base-200 text-base-content"
>
<div class="w-fit"> <div class="w-fit">
<a href="/"> <a href="/">
<div <div
@ -16,89 +18,15 @@
</div> </div>
</a> </a>
</div> </div>
<ul> <ul class="grow shrink">
<!-- Sidebar content here --> <!-- Sidebar content here -->
<li><a href="/">Home</a></li> <li><a id="home" href="/">Home</a></li>
<li><a href="/projects">Projects</a></li> <li><a id="projects" href="/projects">Projects</a></li>
<li><a href="/blog/1">Blog</a></li> <li><a id="blog" href="/blog/">Blog</a></li>
<li><a href="/cv">CV</a></li> <li><a id="cv" href="/cv">CV</a></li>
<li><a href="mailto:hello@andyscott.me">Contact</a></li> <li><a href="mailto:hello@andyscott.me">Contact</a></li>
</ul> </ul>
<div class="grow"></div>
<div class="social-icons px-4 my-2 flex self-center"> <div class="social-icons px-4 my-2 flex self-center">
<a
href="https://codeberg.org/andyscott"
target="_blank"
class="mx-3"
aria-label="Git"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><path
d="M3 19h18a1.002 1.002 0 0 0 .823-1.569l-9-13c-.373-.539-1.271-.539-1.645 0l-9 13A.999.999 0 0 0 3 19z"
></path>
</svg>
</a>
<a
href="https://fosstodon.org/@ascott"
rel="me"
target="_blank"
class="mx-3"
aria-label="Mastodon"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><path
d="M16 17.24c2.5-.3 4.69-1.84 5-3.25a33.59 33.59 0 0 0 .4-5.42C21.33 4.23 18.48 3 18.48 3A17.64 17.64 0 0 0 12 2a17.64 17.64 0 0 0-6.48 1S2.68 4.23 2.68 8.57v3.44c.1 4.24.78 8.42 4.7 9.46A14.73 14.73 0 0 0 12 22a9.21 9.21 0 0 0 3.54-.81l-.07-1.64A11.41 11.41 0 0 1 12 20c-1.8-.06-3.71-.19-4-2.4a4.26 4.26 0 0 1 0-.63 22.68 22.68 0 0 0 4 .54 23.6 23.6 0 0 0 4-.27zm-6.54-9.8q-1.35 0-1.35 1.62v5.1H6V8.9a3.78 3.78 0 0 1 .82-2.56 2.85 2.85 0 0 1 2.23-1 2.68 2.68 0 0 1 2.4 1.23l.52.87.52-.87a2.68 2.68 0 0 1 2.4-1.23 2.85 2.85 0 0 1 2.23 1A3.78 3.78 0 0 1 18 8.9v5.26h-2.11v-5.1q0-1.62-1.35-1.62c-1 0-1.51.64-1.51 1.92v2.79H11V9.36c0-1.28-.54-1.92-1.54-1.92z"
></path>
</svg>
</a>
<a
href="xmpp:andrew@chat.acscott.dev?omemo-sid-1469474723=2f136a2443193c56bf6106509f126cb91a06d2765a1cab2b3ef49d7dedef4d12"
target="_blank"
class="mx-3"
aria-label="XMPP"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><path
d="M5 18v3.766l1.515-.909L11.277 18H16c1.103 0 2-.897 2-2V8c0-1.103-.897-2-2-2H4c-1.103 0-2 .897-2 2v8c0 1.103.897 2 2 2h1zM4 8h12v8h-5.277L7 18.234V16H4V8z"
></path><path
d="M20 2H8c-1.103 0-2 .897-2 2h12c1.103 0 2 .897 2 2v8c1.103 0 2-.897 2-2V4c0-1.103-.897-2-2-2z"
></path>
</svg>
</a>
<a
href="https://www.linkedin.com/in/andcscott"
target="_blank"
class="mx-3"
aria-label="Linkedin"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><circle cx="4.983" cy="5.009" r="2.188"></circle><path
d="M9.237 8.855v12.139h3.769v-6.003c0-1.584.298-3.118 2.262-3.118 1.937 0 1.961 1.811 1.961 3.218v5.904H21v-6.657c0-3.27-.704-5.783-4.526-5.783-1.835 0-3.065 1.007-3.568 1.96h-.051v-1.66H9.237zm-6.142 0H6.87v12.139H3.095z"
></path>
</svg>
</a>
<a <a
href="https://keyoxide.org/24D8D7C03F430A0A59A40667F8539CA70FB13B5A/" href="https://keyoxide.org/24D8D7C03F430A0A59A40667F8539CA70FB13B5A/"
target="_blank" target="_blank"
@ -116,8 +44,68 @@
></path> ></path>
</svg> </svg>
</a> </a>
<a
<a href="/rss.xml" target="_blank" class="mx-3" aria-label="RSS Feed"> href="https://git.andyscott.me/explore"
target="_blank"
class="mx-3"
aria-label=""
Git"
title="Git"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><path
d="m21.62 11.108-8.731-8.729a1.292 1.292 0 0 0-1.823 0L9.257 4.19l2.299 2.3a1.532 1.532 0 0 1 1.939 1.95l2.214 2.217a1.53 1.53 0 0 1 1.583 2.531c-.599.6-1.566.6-2.166 0a1.536 1.536 0 0 1-.337-1.662l-2.074-2.063V14.9c.146.071.286.169.407.29a1.537 1.537 0 0 1 0 2.166 1.536 1.536 0 0 1-2.174 0 1.528 1.528 0 0 1 0-2.164c.152-.15.322-.264.504-.339v-5.49a1.529 1.529 0 0 1-.83-2.008l-2.26-2.271-5.987 5.982c-.5.504-.5 1.32 0 1.824l8.731 8.729a1.286 1.286 0 0 0 1.821 0l8.69-8.689a1.284 1.284 0 0 0 .003-1.822"
></path>
</svg>
</a>
<a
href="https://fosstodon.org/@ascott"
target="_blank"
class="mx-3"
aria-label="Mastodon"
title="Mastodon"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><path
d="M16 17.24c2.5-.3 4.69-1.84 5-3.25a33.59 33.59 0 0 0 .4-5.42C21.33 4.23 18.48 3 18.48 3A17.64 17.64 0 0 0 12 2a17.64 17.64 0 0 0-6.48 1S2.68 4.23 2.68 8.57v3.44c.1 4.24.78 8.42 4.7 9.46A14.73 14.73 0 0 0 12 22a9.21 9.21 0 0 0 3.54-.81l-.07-1.64A11.41 11.41 0 0 1 12 20c-1.8-.06-3.71-.19-4-2.4a4.26 4.26 0 0 1 0-.63 22.68 22.68 0 0 0 4 .54 23.6 23.6 0 0 0 4-.27zm-6.54-9.8q-1.35 0-1.35 1.62v5.1H6V8.9a3.78 3.78 0 0 1 .82-2.56 2.85 2.85 0 0 1 2.23-1 2.68 2.68 0 0 1 2.4 1.23l.52.87.52-.87a2.68 2.68 0 0 1 2.4-1.23 2.85 2.85 0 0 1 2.23 1A3.78 3.78 0 0 1 18 8.9v5.26h-2.11v-5.1q0-1.62-1.35-1.62c-1 0-1.51.64-1.51 1.92v2.79H11V9.36c0-1.28-.54-1.92-1.54-1.92z"
></path></svg
>
</a>
<a
href="https://www.linkedin.com/in/andcscott"
target="_blank"
class="mx-3"
aria-label="Linkedin"
title="Linkedin"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
style="fill: currentColor;transform: ;msFilter:;"
><circle cx="4.983" cy="5.009" r="2.188"></circle><path
d="M9.237 8.855v12.139h3.769v-6.003c0-1.584.298-3.118 2.262-3.118 1.937 0 1.961 1.811 1.961 3.218v5.904H21v-6.657c0-3.27-.704-5.783-4.526-5.783-1.835 0-3.065 1.007-3.568 1.96h-.051v-1.66H9.237zm-6.142 0H6.87v12.139H3.095z"
></path>
</svg>
</a>
<a
href="/rss.xml"
target="_blank"
class="mx-3"
aria-label="RSS Feed"
title="RSS Feed"
>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="24" width="24"
@ -134,3 +122,27 @@
</div> </div>
</div> </div>
</div> </div>
<script>
const homeLink = document.getElementById("home");
const projectsLink = document.getElementById("projects");
const blogLink = document.getElementById("blog");
const cvLink = document.getElementById("cv");
var isHome = true;
const url = window.location.href;
const pages = [projectsLink, blogLink, cvLink];
const activeClass = "bg-base-300"; // For primary color replace with `active` class
pages.forEach((elem) => {
if (url.includes(elem.id)) {
isHome = false;
elem.classList.add(activeClass);
}
});
if (isHome) {
homeLink.classList.add(activeClass);
}
</script>

View file

@ -2,4 +2,4 @@
// You can import this data from anywhere in your site by using the `import` keyword. // You can import this data from anywhere in your site by using the `import` keyword.
export const SITE_TITLE = "Andy Scott"; export const SITE_TITLE = "Andy Scott";
export const SITE_DESCRIPTION = "Personal and Portfolio Site for Andy Scott"; export const SITE_DESCRIPTION = "A personal site for my portfolio and blog";

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Fall '22 Term" title: "Fall '22 Term"
description: "Reflecting on the Fall 2022 term at OSU" description: "Reflecting on the Fall 2022 term at OSU"
pubDate: "Dec 11 2022" pubDate: "Dec 11 2022"

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "First Post" title: "First Post"
description: "It's time for the inaugural post!" description: "It's time for the inaugural post!"
pubDate: "Jan 11 2022" pubDate: "Jan 11 2022"

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Exercise Tracker" title: "Exercise Tracker"
description: "Single Page Application using the MERN Stack" description: "Single Page Application using the MERN Stack"
pubDate: "Jun 16 2022" pubDate: "Jun 16 2022"
@ -10,6 +9,6 @@ I was finally able to make the first of my projects from this spring public toda
page application uses the MongoDB, Express, React, and Node (MERN) Stack to implement page application uses the MongoDB, Express, React, and Node (MERN) Stack to implement
a REST API and a graphical interface for logging exercises. The home page greets the user a REST API and a graphical interface for logging exercises. The home page greets the user
with a table of past exercises. An exercise can be edited, or deleted, by clicking on the with a table of past exercises. An exercise can be edited, or deleted, by clicking on the
appropriate icon within the table. [source code](https://codeberg.org/andyscott/ExerciseTracker) appropriate icon within the table. [source code](https://git.andyscott.me/a/ExerciseTracker)
*Updated Dec 9 2022* *Updated Dec 9 2022*

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Hash Maps" title: "Hash Maps"
description: "Two hash maps with different collision avoidance mechanisms" description: "Two hash maps with different collision avoidance mechanisms"
pubDate: "Jun 25 2022" pubDate: "Jun 25 2022"
@ -14,4 +13,4 @@ colisions: open addressing with quadratic probing; and separate chaining.
While data structures might seem bit mundane I actually had a lot of fun with this one! While data structures might seem bit mundane I actually had a lot of fun with this one!
I felt much more confident in this project than I have in the past as well. It's really I felt much more confident in this project than I have in the past as well. It's really
exciting to see the progress I've made since last fall and I can't wait to share more in exciting to see the progress I've made since last fall and I can't wait to share more in
the future. [source code](https://codeberg.org/andyscott/HashMaps) the future. [source code](https://git.andyscott.me/a/HashMaps)

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "MASM & Low Level I/O" title: "MASM & Low Level I/O"
description: "Using the Microsoft Macro Assembler for low-level operations" description: "Using the Microsoft Macro Assembler for low-level operations"
pubDate: "Mar 26 2022" pubDate: "Mar 26 2022"

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "OpenWeather gRPC API" title: "OpenWeather gRPC API"
description: "A high-performance API for gRPC clients to fetch weather data" description: "A high-performance API for gRPC clients to fetch weather data"
pubDate: "Aug 28 2022" pubDate: "Aug 28 2022"
@ -33,4 +32,4 @@ The following features are currently available:
- Geolocation data (latitude and longitude) for a particular city or zip code - Geolocation data (latitude and longitude) for a particular city or zip code
- Choose your preferred units among imperial, metric, or the OpenWeather default (Kelvin/meters per second) - Choose your preferred units among imperial, metric, or the OpenWeather default (Kelvin/meters per second)
[source code](https://codeberg.org/andyscott/OpenWeather-gRPC-API) [source code](https://git.andyscott.me/a/OpenWeather-gRPC-API)

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Ship Game" title: "Ship Game"
description: "A backend for the Battleship-like 'Ship Game'" description: "A backend for the Battleship-like 'Ship Game'"
pubDate: "Apr 11 2022" pubDate: "Apr 11 2022"
@ -14,6 +13,6 @@ Python.
Each player has a 10x10 grid on which they place their ships. On their turn, the player Each player has a 10x10 grid on which they place their ships. On their turn, the player
fires a torpedo at a square on their opponents grid. Player 'first' gets the first turn, after fires a torpedo at a square on their opponents grid. Player 'first' gets the first turn, after
which the players alternate. A ship is sunk when all of its squares have been hit. A player which the players alternate. A ship is sunk when all of its squares have been hit. A player
wins when all of their opponents ships have been sunk. [source code](https://codeberg.org/andyscott/ShipGame) wins when all of their opponents ships have been sunk. [source code](https://git.andyscott.me/a/ShipGame)
*Updated Dec 10 2022* *Updated Dec 10 2022*

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Spring '22 Term" title: "Spring '22 Term"
description: "Wrapping Up Spring '22" description: "Wrapping Up Spring '22"
pubDate: "May 31 2022" pubDate: "May 31 2022"

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Winter '22 Term" title: "Winter '22 Term"
description: "Winter 2022 at Oregon State is almost over!" description: "Winter 2022 at Oregon State is almost over!"
pubDate: "Mar 16 2022" pubDate: "Mar 16 2022"

View file

@ -1,5 +1,4 @@
--- ---
layout: "../../layouts/PostLayout.astro"
title: "Halfway through Winter '23" title: "Halfway through Winter '23"
description: "Database design and a little fun with shaders" description: "Database design and a little fun with shaders"
pubDate: "Feb 10 2023" pubDate: "Feb 10 2023"

18
src/content/config.ts Normal file
View file

@ -0,0 +1,18 @@
import { z, defineCollection } from "astro:content";
const blogSchema = z.object({
title: z.string(),
description: z.string(),
pubDate: z.coerce.date(),
updatedDate: z.string().optional(),
heroImage: z.string().optional(),
badge: z.string().optional(),
});
export type BlogSchema = z.infer<typeof blogSchema>;
const blogCollection = defineCollection({ schema: blogSchema });
export const collections = {
blog: blogCollection,
};

1
src/env.d.ts vendored
View file

@ -1 +1,2 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" /> /// <reference types="astro/client" />

View file

@ -6,11 +6,11 @@ import SideBar from "../components/SideBar.astro";
import { SITE_TITLE, SITE_DESCRIPTION } from "../config"; import { SITE_TITLE, SITE_DESCRIPTION } from "../config";
const { image, title = SITE_TITLE, description = SITE_DESCRIPTION } = Astro.props; const { image, title = SITE_TITLE, description = SITE_DESCRIPTION, includeSidebar = true } = Astro.props;
--- ---
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-theme="coffee"> <html lang="en" data-theme="lofi">
<head> <head>
<BaseHead title={title} description={description} image={image} /> <BaseHead title={title} description={description} image={image} />
</head> </head>
@ -26,7 +26,7 @@ const { image, title = SITE_TITLE, description = SITE_DESCRIPTION } = Astro.prop
</div> </div>
<Footer /> <Footer />
</div> </div>
<SideBar /> {includeSidebar && <SideBar />}
</div> </div>
</body> </body>
</html> </html>

View file

@ -1,28 +1,24 @@
--- ---
import BaseHead from "../components/BaseHead.astro"; import { BlogSchema } from "../content/config";
import BaseLayout from "./BaseLayout.astro"; import BaseLayout from "./BaseLayout.astro";
import dayjs from "dayjs";
import localizedFormat from "dayjs/plugin/localizedFormat";
export interface Props { export interface Props extends BlogSchema {}
content: {
title: string;
description: string;
pubDate?: string;
updatedDate?: string;
heroImage?: string;
};
}
const { const { title, description, pubDate, updatedDate, heroImage, badge } = Astro.props;
content: { title, description, pubDate, updatedDate, heroImage } dayjs.extend(localizedFormat);
} = Astro.props; const displayDate = dayjs(pubDate).format("ll");
--- ---
<BaseLayout title={title} description={description} image={heroImage}> <BaseLayout title={title} description={description} image={heroImage}>
<main class="md:flex md:justify-center"> <main class="md:flex md:justify-center">
<article class="prose prose-lg max-w-[750px] prose-img:mx-auto"> <article class="prose prose-lg max-w-[750px] prose-img:mx-auto">
{heroImage && <img src={heroImage} alt={title} class="w-full mb-6" />} {heroImage && <img src={heroImage} alt={title} class="max-w-[500px] mb-6" />}
<h1 class="title my-2 text-4xl font-bold">{title}</h1> <h1 class="title my-2 text-4xl font-bold">{title}</h1>
{pubDate && <time>{pubDate}</time>} {pubDate && <time>{displayDate}</time>}
<br>
{badge && <div class="badge badge-secondary my-1">{badge}</div>}
{ {
updatedDate && ( updatedDate && (
<div> <div>
@ -32,7 +28,7 @@ const {
) )
} }
<div class="divider my-2"></div> <div class="divider my-2"></div>
<slot /> <slot />
</article> </article>
</main> </main>
</BaseLayout> </BaseLayout>

View file

@ -1,61 +0,0 @@
---
import BaseHead from "../components/BaseHead.astro";
import BaseLayout from "./BaseLayout.astro";
const {
content: {
title,
description,
pubDate,
updatedDate,
heroImage,
pricing,
oldPricing,
checkoutUrl,
badge,
custom_link,
custom_link_label,
},
} = Astro.props;
---
<BaseLayout title={title} description={description} image={heroImage}>
<main class="md:flex md:justify-center">
<article class="prose prose-lg max-w-[750px] prose-img:mx-auto">
{heroImage && <img src={heroImage} alt={title} class="w-full mb-6" />}
<div class="">
<h1 class="title my-2 text-4xl font-bold">
{title}
{badge && <div class="badge badge-secondary mx-2">{badge}</div>}
</h1>
<div class="flex place-content-between items-center">
<div class="grow md:grow-0">
<span class="text-xl mr-1"> {pricing}</span>
<span class="text-md opacity-50 line-through">{oldPricing}</span>
</div>
<div>
{
custom_link && (
<a class="btn btn-outline grow md:grow-0 ml-4" href={custom_link} target="_blank">
{custom_link_label}
</a>
)
}
<a class="btn btn-primary grow md:grow-0 ml-4" href={checkoutUrl} target="_blank">Buy Now</a>
</div>
</div>
</div>
{
updatedDate && (
<div>
{" "}
Last updated on <time>{updatedDate}</time>{" "}
</div>
)
}
<div class="divider my-2"></div>
<slot />
</article>
</main>
</BaseLayout>

12
src/pages/404.astro Normal file
View file

@ -0,0 +1,12 @@
---
import BaseLayout from "../layouts/BaseLayout.astro";
---
<BaseLayout title = "404: Not Found" includeSidebar={false}>
<div class="text-center">
<h1 class="text-9xl font-bold mb-4">🏝</h1>
<h1 class="text-9xl font-bold mb-2">404</h1>
<h3 class="text-2xl">The page you're looking for couldn't be found.</h3>
<a class="btn btn-accent mt-9" href="/">Home</a>
</div>
</BaseLayout>

View file

@ -0,0 +1,73 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro";
import HorizontalCard from "../../components/HorizontalCard.astro";
import { getCollection } from "astro:content";
export async function getStaticPaths({ paginate }) {
const posts = await getCollection("blog");
return paginate(posts, { pageSize: 10 });
}
const { page } = Astro.props;
---
<BaseLayout title="Blog">
<ul>
{
page.data.map((post) => (
<>
<HorizontalCard
title={post.data.title}
img={post.data.heroImage}
desc={post.data.description}
url={"/blog/" + post.slug}
target="_self"
badge={post.data.badge}
/>
<div class="divider my-0" />
</>
))
}
</ul>
<div class="flex justify-between">
{
page.url.prev ? (
<a href={page.url.prev} class="btn btn-ghost my-10 mx-5">
{" "}
<svg
class="h-6 w-6 fill-current md:h-8 md:w-8"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
>
<path d="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z" />
</svg>{" "}
Recent posts
</a>
) : (
<div />
)
}
{
page.url.next ? (
<a href={page.url.next} class="btn btn-ghost my-10 mx-5">
Older Posts{" "}
<svg
class="h-6 w-6 fill-current md:h-8 md:w-8"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
>
{" "}
<path d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z" />
</svg>
</a>
) : (
<div />
)
}
</div>
</BaseLayout>

View file

@ -1,37 +0,0 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro";
import HorizontalCard from "../../components/HorizontalCard.astro";
export async function getStaticPaths({ paginate }) {
const posts = (await Astro.glob("./*.{md,mdx}")).sort(
(a, b) => new Date(b.frontmatter.pubDate).valueOf() - new Date(a.frontmatter.pubDate).valueOf()
);
return paginate(posts, { pageSize: 10 });
}
const { page } = Astro.props;
---
<BaseLayout title = "Blog">
<ul>
<!--List the array of astronaut info-->
{page.data.map(( post ) => (
<HorizontalCard
title={post.frontmatter.title}
img={post.frontmatter.heroImage}
desc={post.frontmatter.description}
url={post.url}
target="_self"
/>
<div class="divider my-0"></div>
))}
</ul>
<div class="flex justify-between">
{page.url.prev ? <a href={page.url.prev} class="btn btn-ghost my-10 mx-5" > <svg class="h-6 w-6 fill-current md:h-8 md:w-8" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z"></path></svg> Recent posts</a> : <div></div>}
{page.url.next ? <a href={page.url.next} class="btn btn-ghost my-10 mx-5">Older Posts <svg class="h-6 w-6 fill-current md:h-8 md:w-8" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"></path></svg></a> : <div></div>}
</div>
</BaseLayout>

View file

@ -0,0 +1,30 @@
---
import { CollectionEntry, getCollection } from 'astro:content';
import { BlogSchema } from '../../content/config';
import PostLayout from '../../layouts/PostLayout.astro';
export async function getStaticPaths() {
const postEntries = await getCollection('blog');
return postEntries.map(entry => ( {
params: { slug: entry.slug }, props: { entry },
} ));
}
interface Props {
entry: CollectionEntry<"blog">;
}
const { entry } = Astro.props;
const post : BlogSchema = entry.data;
const { Content } = await entry.render();
---
<PostLayout
title={post.title}
description={post.description}
pubDate={post.pubDate}
heroImage={post.heroImage}
updatedDate={post.updatedDate}
badge={post.badge}>
<Content/>
</PostLayout>

View file

@ -9,15 +9,26 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
</div> </div>
<div class="mb-10 text-justify"> <div class="mb-10 text-justify">
My first memorable experience with technology was at age five - Nintendo <div class="mb-5">
introduced me to Mario, Tetris, and Zelda. My love of games took hold I was interested in computers at a very young age. In fact, my first
immediately, and I've been hooked on technology ever since. Games, and the memorable experience with technology was at age five when Nintendo
hardware necessary to play them, were always evolving so I became determined introduced me to Tetris and Zelda. I went on to build my first desktop
to build my own desktop computer in high school. Since then, I've built at when I was in high school. Since then Ive built many more as well as a
least another dozen computers and a couple home servers to host my own few home servers to host my own cloud services. These experiences have led
privacy focused cloud services. These experiences have led me to become a me to become a strong proponent of free and open source software due to
strong proponent of open source software, in part due to its transparency, its transparency, quality, innovation, and diversity.
quality, innovation, and diversity. </div>
<div class="mb-5">
Despite my interest in computing I had always considered it a hobby, and
my first degree was in Ethics, History, and Public Policy. I ended up
working in insurance for seven years until, unfortunately, I experienced
some health issues that forced me to leave the workforce altogether. It
was not a happy time, yet as with any life-changing event it also brought
new perspective. As I began to recover I realized that, despite the
setbacks, I had a very rare opportunity to pursue an entirely new course
in life. I am currently in the progress of finishing my Computer Science
degree and I can't wait to start the next chapter!
</div>
</div> </div>
<div class="mb-5"> <div class="mb-5">
@ -27,7 +38,7 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
<div class="time-line-container grid gap-4 mb-10"> <div class="time-line-container grid gap-4 mb-10">
<TimeLineElement <TimeLineElement
title="Bachelor of Science Computer Science" title="Bachelor of Science Computer Science"
subtitle="2021 to Present at Oregon State University, Corvallis, OR" subtitle="2021 to 2023 at Oregon State University, Corvallis, OR"
/> />
<TimeLineElement <TimeLineElement
title="Bachelor of Arts Ethics, History, and Public Policy" title="Bachelor of Arts Ethics, History, and Public Policy"
@ -36,31 +47,43 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
</div> </div>
<div class="mb-5"> <div class="mb-5">
<div class="text-3xl w-full font-bold">Work Experience</div> <div class="text-3xl w-full font-bold">Work History</div>
</div> </div>
<div class="time-line-container mb-10"> <div class="time-line-container mb-10">
<TimeLineElement <TimeLineElement
title="Career Break: Health and Well-Being" title="Career Break: Health and Well-Being"
subtitle="From Mar 2017 to Present" subtitle="Mar 2017 to Present"
/> />
<TimeLineElement <TimeLineElement
title="Senior Representative, Annuity Claims" title="Senior Representative, Annuity Claims"
subtitle="From Mar 2013 to Mar 2017 at New York Life Insurance Company" subtitle="Mar 2013 to Mar 2017 at New York Life Insurance Company"
desc="Managed migration of annuity claims processing from legacy mainframe system to a modern web interface, conducting quality assurance testing while ensuring compliance with state laws. Implemented new correspondence templates to increase efficiency and accuracy, saving approximately 100 hours per processor per year." desc="Managed migration of annuity claims processing from legacy mainframe system to a modern web interface, conducting quality assurance testing while ensuring compliance with state laws. Implemented new correspondence templates to increase efficiency and accuracy, saving approximately 100 hours per processor per year."
/> />
<TimeLineElement <TimeLineElement
title="Representative" title="Representative"
subtitle="From Feb 2010 to Mar 2013 at New York Life Insurance Company" subtitle="Feb 2010 to Mar 2013 at New York Life Insurance Company"
desc="Processed death claims against life insurance policies and annuities. Assisted claimants and their representatives in both establishing new claims and finalizing existing claims." desc="Processed death claims against life insurance policies and annuities. Assisted claimants and their representatives in both establishing new claims and finalizing existing claims."
/> />
<TimeLineElement <TimeLineElement
title="Work Study Assistant, Equal Opportunity Services" title="Work Study Assistant, Equal Opportunity Services"
subtitle="From Jan 2006 to May 2009 at Carnegie-Mellon University" subtitle="Jan 2006 to May 2009 at Carnegie-Mellon University"
desc="Converted existing student and employee files from traditional paper to a digital database. Proctored distraction reduced test-taking environment for learning disabled students. Acted as primary on-call contact for after hours assignments. Directly assisted the Manager of Disability Resources in meeting the needs of disabled students as delineated by federal guidelines and University policy." desc="Converted existing student and employee files from traditional paper to a digital database. Proctored distraction reduced test-taking environment for learning disabled students. Acted as primary on-call contact for after hours assignments. Directly assisted the Manager of Disability Resources in meeting the needs of disabled students as delineated by federal guidelines and University policy."
/> />
</div> </div>
<div class="mb-5">
<div class="text-3xl w-full font-bold">Volunteering</div>
</div>
<ul class="list-disc mx-6 mb-10 grid gap-2">
<li>
Technical Consultant for the <a href="https://rrcms.org"
><strong>Rocky River Chamber Music Society</strong></a
> (2020-Present)
</li>
</ul>
<div class="mb-5"> <div class="mb-5">
<div class="text-3xl w-full font-bold">Skills</div> <div class="text-3xl w-full font-bold">Skills</div>
</div> </div>
@ -68,10 +91,17 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
<ul class="list-disc md:columns-5 columns-2 mx-6"> <ul class="list-disc md:columns-5 columns-2 mx-6">
<li>C</li> <li>C</li>
<li>C++</li> <li>C++</li>
<li>C#</li>
<li>Python</li> <li>Python</li>
<li>Go</li> <li>Go</li>
<li>x86 Assembly</li> <li>x86 Assembly</li>
<li>MASM</li> <li>MASM</li>
<li>OpenGL</li>
<li>GLSL</li>
<li>Unity</li>
<li>Node.js</li>
<li>MongoDB</li>
<li>MySQL</li>
<li>Emacs</li> <li>Emacs</li>
<li>Visual Studio</li> <li>Visual Studio</li>
<li>PyCharm</li> <li>PyCharm</li>
@ -79,7 +109,6 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
<li>Git</li> <li>Git</li>
<li>CI/CD</li> <li>CI/CD</li>
<li>Agile</li> <li>Agile</li>
<li>Kanban</li>
<li>Jira</li> <li>Jira</li>
<li>Trello</li> <li>Trello</li>
<li>Asana</li> <li>Asana</li>

View file

@ -1,11 +1,10 @@
--- ---
import BaseLayout from "../layouts/BaseLayout.astro"; import BaseLayout from "../layouts/BaseLayout.astro";
import HorizontalCard from "../components/HorizontalCard.astro"; import HorizontalCard from "../components/HorizontalCard.astro";
import { getCollection } from "astro:content";
const posts = (await Astro.glob("./blog/*.{md,mdx}")).sort( const posts = (await getCollection("blog")).sort(
(a, b) => (a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
new Date(b.frontmatter.pubDate).valueOf() -
new Date(a.frontmatter.pubDate).valueOf()
); );
const last_posts = posts.slice(0, 3); const last_posts = posts.slice(0, 3);
@ -16,51 +15,35 @@ const last_posts = posts.slice(0, 3);
<div class="text-xl py-1">Greetings, fellow human 🤘</div> <div class="text-xl py-1">Greetings, fellow human 🤘</div>
<div class="text-5xl font-bold">I'm Andy Scott</div> <div class="text-5xl font-bold">I'm Andy Scott</div>
<div class="text-3xl py-3 font-bold"> <div class="text-3xl py-3 font-bold">
Computer Science Student & Free Software Advocate CS Student & Free Software Advocate
</div> </div>
<div class="py-2"> <div class="py-2">
<text class="text-lg"> <text class="text-lg">
I created this site to showcase my projects as well as occasionally blog about I created this site to showcase my projects as well as occasionally blog
developement and my journey toward earning my degree. Feel free to navigate my journey toward earning my computer science degree. Feel free to
the site via the sidebar, or continue reading if youd like to know more about navigate the site via the sidebar, or continue reading if youd like to
my recent work! know more about my recent work!
</text> </text>
</div> </div>
<div class="mt-8">
<a
class="btn btn-outline ml-5"
href="https://fosstodon.org/@ascott"
target="_blank"
>
Find me on Mastodon</a
>
<a
href="https://codeberg.org/andyscott"
target="_blank"
class="btn btn-outline ml-5"
>
I Just Want the Code</a
>
</div>
</div> </div>
<div> <div>
<div class="text-3xl w-full font-bold mb-2">Latest projects {"</>"}</div> <div class="text-3xl w-full font-bold mb-2">Recent Projects {"</>"}</div>
</div> </div>
<div class="divider my-0"></div>
<HorizontalCard <HorizontalCard
title="Advent of Code 2022" title="Advent of Code 2022"
img="/project_images/advent_floristry.jpg" img="/project_images/advent_floristry.jpg"
desc="My first (very casual) attempt at Advent of Code" desc="My first (very casual) attempt at Advent of Code"
url="https://codeberg.org/andyscott/advent-of-code/src/branch/main/2022" url="https://git.andyscott.me/a/advent-of-code"
badge="Happy Holidays" badge="Happy Holidays"
/> />
<div class="divider my-0"></div>
<HorizontalCard <HorizontalCard
title="2D Puzzle Solver" title="2D Puzzle Solver"
img="/project_images/2d_puzzle_solver.jpg" img="/project_images/2d_puzzle_solver.jpg"
desc="Uses breadth first search (BFS) to solve 2D puzzles" desc="Uses breadth first search (BFS) to solve 2D puzzles"
url="https://codeberg.org/andyscott/2D-Puzzle-Solver" url="https://andyscott.me/a/2d-puzzle-solver"
badge="Graphs" badge="Graphs"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
@ -68,23 +51,24 @@ const last_posts = posts.slice(0, 3);
title="OpenWeather gRPC API" title="OpenWeather gRPC API"
img="/project_images/openweather_grpc_api.jpg" img="/project_images/openweather_grpc_api.jpg"
desc="Written in Go, this microservice uses protocol buffers to define a highly performant gRPC API" desc="Written in Go, this microservice uses protocol buffers to define a highly performant gRPC API"
url="https://codeberg.org/andyscott/OpenWeather-gRPC-API" url="https://git.andyscott.me/a/OpenWeather-gRPC-API`"
badge="gRPC" badge="gRPC"
/> />
<div> <div>
<div class="text-3xl w-full font-bold mb-5 mt-10">Latest posts</div> <div class="text-3xl w-full font-bold mb-5 mt-10">Latest Posts</div>
</div> </div>
{ {
last_posts.map((post) => ( last_posts.map((post) => (
<> <>
<HorizontalCard <HorizontalCard
title={post.frontmatter.title} title={post.data.title}
img={post.frontmatter.heroImage} img={post.data.heroImage}
desc={post.frontmatter.description} desc={post.data.description}
url={post.url} url={"/blog/" + post.slug}
target="_self" target="_self"
badge={post.data.badge}
/> />
<div class="divider my-0" /> <div class="divider my-0" />
</> </>

View file

@ -3,34 +3,23 @@ import BaseLayout from "../layouts/BaseLayout.astro";
import HorizontalCard from "../components/HorizontalCard.astro"; import HorizontalCard from "../components/HorizontalCard.astro";
--- ---
<BaseLayout title="Latest Projects"> <BaseLayout title="Projects">
<div> <div>
<div class="text-3xl w-full font-bold mb-5">Active Projects</div> <div class="text-3xl w-full font-bold mb-5">Projects</div>
</div> </div>
<HorizontalCard
title="New Projects Coming Soon"
img="/project_images/coming_soon.png"
desc="Currently focused on school"
url="https://andyscott.me/projects"
/>
<div class="divider my-0"></div>
<div>
<div class="text-3xl w-full font-bold mb-5 mt-10">All Projects</div>
</div>
<HorizontalCard <HorizontalCard
title="Advent of Code 2022" title="Advent of Code 2022"
img="/project_images/advent_floristry.jpg" img="/project_images/advent_floristry.jpg"
desc="My first (very casual) attempt at Advent of Code" desc="My first (very casual) attempt at Advent of Code"
url="https://codeberg.org/andyscott/advent-of-code/src/branch/main/2022" url="https://git.andyscott.me/a/advent-of-code/src/branch/main/2022"
badge="Happy Holidays" badge="Happy Holidays"
/> />
<HorizontalCard <HorizontalCard
title="2D Puzzle Solver" title="2D Puzzle Solver"
img="/project_images/2d_puzzle_solver.jpg" img="/project_images/2d_puzzle_solver.jpg"
desc="Uses breadth first search (BFS) for graph traversal to solve 2D puzzles in the fewest moves possible" desc="Uses breadth first search (BFS) for graph traversal to solve 2D puzzles in the fewest moves possible"
url="https://codeberg.org/andyscott/2D-Puzzle-Solver" url="https://git.andyscott.me/a/2D-Puzzle-Solver"
badge="Graphs" badge="Graphs"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
@ -38,7 +27,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="OpenWeather gRPC API" title="OpenWeather gRPC API"
img="/project_images/openweather_grpc_api.jpg" img="/project_images/openweather_grpc_api.jpg"
desc="Written in Go, this microservice uses protocol buffers to define a highly performant gRPC API for fetching weather data" desc="Written in Go, this microservice uses protocol buffers to define a highly performant gRPC API for fetching weather data"
url="https://codeberg.org/andyscott/OpenWeather-gRPC-API" url="https://git.andyscott.me/a/OpenWeather-gRPC-API"
badge="gRPC" badge="gRPC"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
@ -46,7 +35,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Hash Maps" title="Hash Maps"
img="/project_images/hash_maps.jpg" img="/project_images/hash_maps.jpg"
desc="Two hash map implementations featuring open addressing with quadratic probing and separate chaining to handle collisions" desc="Two hash map implementations featuring open addressing with quadratic probing and separate chaining to handle collisions"
url="https://codeberg.org/andyscott/HashMaps" url="https://git.andyscott.me/a/HashMaps"
badge="Data Structures" badge="Data Structures"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
@ -54,7 +43,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Exercise Tracker" title="Exercise Tracker"
img="/project_images/exercise_tracker.jpg" img="/project_images/exercise_tracker.jpg"
desc="A full-stack MERN app for tracking your exercises." desc="A full-stack MERN app for tracking your exercises."
url="https://codeberg.org/andyscott/ExerciseTracker" url="https://git.andyscott.me/a/ExerciseTracker"
badge="SPA" badge="SPA"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
@ -62,7 +51,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Ship Game" title="Ship Game"
img="/project_images/hash_maps.jpg" img="/project_images/hash_maps.jpg"
desc="A backend for the Battleship-like 'Ship Game'" desc="A backend for the Battleship-like 'Ship Game'"
url="https://codeberg.org/andyscott/ShipGame" url="https://git.andyscott.me/a/ShipGame"
badge="Game" badge="Game"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
@ -78,13 +67,13 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Dotfiles" title="Dotfiles"
img="/project_images/dotfiles.jpg" img="/project_images/dotfiles.jpg"
desc="Not a project per se, but always a work in progress" desc="Not a project per se, but always a work in progress"
url="https://codeberg.org/andyscott/dotfiles" url="https://git.andyscott.me/a/dotfiles"
/> />
<div class="divider my-0"></div> <div class="divider my-0"></div>
<HorizontalCard <HorizontalCard
title="Password Generator (CLI)" title="Password Generator (CLI)"
img="/project_images/password_generator_cli.jpg" img="/project_images/password_generator_cli.jpg"
desc="My first Python project" desc="My first Python project"
url="https://codeberg.org/andyscott/password-generator-cli" url="https://git.andyscott.me/a/password-generator-cli"
/> />
</BaseLayout> </BaseLayout>

View file

@ -1,10 +1,18 @@
import rss from '@astrojs/rss'; import rss from "@astrojs/rss";
import { SITE_TITLE, SITE_DESCRIPTION } from '../config'; import { SITE_TITLE, SITE_DESCRIPTION } from "../config";
import { getCollection } from "astro:content";
export const get = () => export async function get(context) {
rss({ const blog = await getCollection("blog");
title: SITE_TITLE, return rss({
description: SITE_DESCRIPTION, title: SITE_TITLE,
site: import.meta.env.SITE, description: SITE_DESCRIPTION,
items: import.meta.glob('./blog/**/*.md'), site: import.meta.env.SITE,
}); items: blog.map((post) => ({
title: post.data.title,
pubDate: post.data.pubDate,
description: post.data.description,
link: `/blog/${post.slug}/`,
})),
});
}

View file

@ -1,8 +1,12 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
theme: {
extend: {},
},
plugins: [require("@tailwindcss/typography"),require("daisyui")], plugins: [require("@tailwindcss/typography"),require("daisyui")],
daisyui: {
themes: [
'bumblebee', // this will be the default light theme
'business'
],
darkTheme: 'business' // this will be the default dark theme
}
} }

View file

@ -1,3 +1,6 @@
{ {
"extends": "astro/tsconfigs/base" "extends": "astro/tsconfigs/base",
"compilerOptions": {
"strictNullChecks": true
}
} }