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
.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 mdx from '@astrojs/mdx';
import sitemap from '@astrojs/sitemap';
import { defineConfig } from "astro/config";
import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap";
import tailwind from "@astrojs/tailwind";
// https://astro.build/config
export default defineConfig({
site: 'https://andyscott.me',
integrations: [mdx(), sitemap(), tailwind()]
site: "https://andyscott.me",
integrations: [mdx(), sitemap(), tailwind()],
});

162
package-lock.json generated
View file

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

View file

@ -2,7 +2,7 @@
"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.",
"type": "module",
"version": "2.1.1",
"version": "2.2.0",
"private": true,
"scripts": {
"dev": "astro dev",

View file

@ -22,3 +22,17 @@ const { title, description, image = '/social_img.png' } = Astro.props;
<title>{title}</title>
<meta name="title" content={title} />
<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">
<div class="inline opacity-75">
<!-- Thanks for using this template. Please keep this line to support my work :) -->
<a
href="https://github.com/manuelernestog/astro-modern-personal-website"
target="_blank"
class="font-bold">Website Template</a
>
developed by
<a href="https://manuelernestog.github.io" target="_blank" class="font-bold"
>Manuel Ernesto ⚡️</a
>
<a href="https://astro-modern-personal-website.netlify.app/" 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 class="pb-2">
<p>
Excluding the template, all page content for
<br />
<div class="inline opacity-75">
All content for
<a href="https://andyscott.me" class="font-bold">andyscott dot me</a>
&copy; 2021 Andrew Scott
<a
href="https://creativecommons.org/licenses/by-sa/4.0/"
class="font-bold">CC BY-SA 4.0</a
> unless otherwise noted
</p>
</div>
</footer>
<style>

View file

@ -4,23 +4,13 @@
<div class="navbar">
<div class="navbar-start">
<label for="my-drawer" class="btn btn-square btn-ghost">
<svg
xmlns="http://www.w3.org/2000/svg"
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 xmlns="http://www.w3.org/2000/svg" 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>
</label>
</div>
<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 class="navbar-end"></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%]">
<a href={url} target={target}>
<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">
<h1 class="text-xl font-bold">
{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">
<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">
<a href="/">
<div
@ -16,89 +18,15 @@
</div>
</a>
</div>
<ul>
<ul class="grow shrink">
<!-- Sidebar content here -->
<li><a href="/">Home</a></li>
<li><a href="/projects">Projects</a></li>
<li><a href="/blog/1">Blog</a></li>
<li><a href="/cv">CV</a></li>
<li><a id="home" href="/">Home</a></li>
<li><a id="projects" href="/projects">Projects</a></li>
<li><a id="blog" href="/blog/">Blog</a></li>
<li><a id="cv" href="/cv">CV</a></li>
<li><a href="mailto:hello@andyscott.me">Contact</a></li>
</ul>
<div class="grow"></div>
<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
href="https://keyoxide.org/24D8D7C03F430A0A59A40667F8539CA70FB13B5A/"
target="_blank"
@ -116,8 +44,68 @@
></path>
</svg>
</a>
<a href="/rss.xml" target="_blank" class="mx-3" aria-label="RSS Feed">
<a
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
xmlns="http://www.w3.org/2000/svg"
width="24"
@ -134,3 +122,27 @@
</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.
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"
description: "Reflecting on the Fall 2022 term at OSU"
pubDate: "Dec 11 2022"

View file

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

View file

@ -1,5 +1,4 @@
---
layout: "../../layouts/PostLayout.astro"
title: "Exercise Tracker"
description: "Single Page Application using the MERN Stack"
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
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
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*

View file

@ -1,5 +1,4 @@
---
layout: "../../layouts/PostLayout.astro"
title: "Hash Maps"
description: "Two hash maps with different collision avoidance mechanisms"
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!
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
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"
description: "Using the Microsoft Macro Assembler for low-level operations"
pubDate: "Mar 26 2022"

View file

@ -1,5 +1,4 @@
---
layout: "../../layouts/PostLayout.astro"
title: "OpenWeather gRPC API"
description: "A high-performance API for gRPC clients to fetch weather data"
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
- 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"
description: "A backend for the Battleship-like 'Ship Game'"
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
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
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*

View file

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

View file

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

View file

@ -1,5 +1,4 @@
---
layout: "../../layouts/PostLayout.astro"
title: "Halfway through Winter '23"
description: "Database design and a little fun with shaders"
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" />

View file

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

View file

@ -1,28 +1,24 @@
---
import BaseHead from "../components/BaseHead.astro";
import { BlogSchema } from "../content/config";
import BaseLayout from "./BaseLayout.astro";
import dayjs from "dayjs";
import localizedFormat from "dayjs/plugin/localizedFormat";
export interface Props {
content: {
title: string;
description: string;
pubDate?: string;
updatedDate?: string;
heroImage?: string;
};
}
export interface Props extends BlogSchema {}
const {
content: { title, description, pubDate, updatedDate, heroImage }
} = Astro.props;
const { title, description, pubDate, updatedDate, heroImage, badge } = Astro.props;
dayjs.extend(localizedFormat);
const displayDate = dayjs(pubDate).format("ll");
---
<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" />}
{heroImage && <img src={heroImage} alt={title} class="max-w-[500px] mb-6" />}
<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 && (
<div>

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 class="mb-10 text-justify">
My first memorable experience with technology was at age five - Nintendo
introduced me to Mario, Tetris, and Zelda. My love of games took hold
immediately, and I've been hooked on technology ever since. Games, and the
hardware necessary to play them, were always evolving so I became determined
to build my own desktop computer in high school. Since then, I've built at
least another dozen computers and a couple home servers to host my own
privacy focused cloud services. These experiences have led me to become a
strong proponent of open source software, in part due to its transparency,
quality, innovation, and diversity.
<div class="mb-5">
I was interested in computers at a very young age. In fact, my first
memorable experience with technology was at age five when Nintendo
introduced me to Tetris and Zelda. I went on to build my first desktop
when I was in high school. Since then Ive built many more as well as a
few home servers to host my own cloud services. These experiences have led
me to become a strong proponent of free and open source software due to
its transparency, 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 class="mb-5">
@ -27,7 +38,7 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
<div class="time-line-container grid gap-4 mb-10">
<TimeLineElement
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
title="Bachelor of Arts Ethics, History, and Public Policy"
@ -36,31 +47,43 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
</div>
<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 class="time-line-container mb-10">
<TimeLineElement
title="Career Break: Health and Well-Being"
subtitle="From Mar 2017 to Present"
subtitle="Mar 2017 to Present"
/>
<TimeLineElement
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."
/>
<TimeLineElement
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."
/>
<TimeLineElement
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."
/>
</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="text-3xl w-full font-bold">Skills</div>
</div>
@ -68,10 +91,17 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
<ul class="list-disc md:columns-5 columns-2 mx-6">
<li>C</li>
<li>C++</li>
<li>C#</li>
<li>Python</li>
<li>Go</li>
<li>x86 Assembly</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>Visual Studio</li>
<li>PyCharm</li>
@ -79,7 +109,6 @@ import TimeLineElement from "../components/cv/TimeLine.astro";
<li>Git</li>
<li>CI/CD</li>
<li>Agile</li>
<li>Kanban</li>
<li>Jira</li>
<li>Trello</li>
<li>Asana</li>

View file

@ -1,11 +1,10 @@
---
import BaseLayout from "../layouts/BaseLayout.astro";
import HorizontalCard from "../components/HorizontalCard.astro";
import { getCollection } from "astro:content";
const posts = (await Astro.glob("./blog/*.{md,mdx}")).sort(
(a, b) =>
new Date(b.frontmatter.pubDate).valueOf() -
new Date(a.frontmatter.pubDate).valueOf()
const posts = (await getCollection("blog")).sort(
(a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
);
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-5xl font-bold">I'm Andy Scott</div>
<div class="text-3xl py-3 font-bold">
Computer Science Student & Free Software Advocate
CS Student & Free Software Advocate
</div>
<div class="py-2">
<text class="text-lg">
I created this site to showcase my projects as well as occasionally blog about
developement and my journey toward earning my degree. Feel free to navigate
the site via the sidebar, or continue reading if youd like to know more about
my recent work!
I created this site to showcase my projects as well as occasionally blog
my journey toward earning my computer science degree. Feel free to
navigate the site via the sidebar, or continue reading if youd like to
know more about my recent work!
</text>
</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 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 class="divider my-0"></div>
<HorizontalCard
title="Advent of Code 2022"
img="/project_images/advent_floristry.jpg"
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"
/>
<div class="divider my-0"></div>
<HorizontalCard
title="2D Puzzle Solver"
img="/project_images/2d_puzzle_solver.jpg"
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"
/>
<div class="divider my-0"></div>
@ -68,23 +51,24 @@ const last_posts = posts.slice(0, 3);
title="OpenWeather gRPC API"
img="/project_images/openweather_grpc_api.jpg"
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"
/>
<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>
{
last_posts.map((post) => (
<>
<HorizontalCard
title={post.frontmatter.title}
img={post.frontmatter.heroImage}
desc={post.frontmatter.description}
url={post.url}
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" />
</>

View file

@ -3,34 +3,23 @@ import BaseLayout from "../layouts/BaseLayout.astro";
import HorizontalCard from "../components/HorizontalCard.astro";
---
<BaseLayout title="Latest Projects">
<BaseLayout title="Projects">
<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>
<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
title="Advent of Code 2022"
img="/project_images/advent_floristry.jpg"
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"
/>
<HorizontalCard
title="2D Puzzle Solver"
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"
url="https://codeberg.org/andyscott/2D-Puzzle-Solver"
url="https://git.andyscott.me/a/2D-Puzzle-Solver"
badge="Graphs"
/>
<div class="divider my-0"></div>
@ -38,7 +27,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="OpenWeather gRPC API"
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"
url="https://codeberg.org/andyscott/OpenWeather-gRPC-API"
url="https://git.andyscott.me/a/OpenWeather-gRPC-API"
badge="gRPC"
/>
<div class="divider my-0"></div>
@ -46,7 +35,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Hash Maps"
img="/project_images/hash_maps.jpg"
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"
/>
<div class="divider my-0"></div>
@ -54,7 +43,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Exercise Tracker"
img="/project_images/exercise_tracker.jpg"
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"
/>
<div class="divider my-0"></div>
@ -62,7 +51,7 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Ship Game"
img="/project_images/hash_maps.jpg"
desc="A backend for the Battleship-like 'Ship Game'"
url="https://codeberg.org/andyscott/ShipGame"
url="https://git.andyscott.me/a/ShipGame"
badge="Game"
/>
<div class="divider my-0"></div>
@ -78,13 +67,13 @@ import HorizontalCard from "../components/HorizontalCard.astro";
title="Dotfiles"
img="/project_images/dotfiles.jpg"
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>
<HorizontalCard
title="Password Generator (CLI)"
img="/project_images/password_generator_cli.jpg"
desc="My first Python project"
url="https://codeberg.org/andyscott/password-generator-cli"
url="https://git.andyscott.me/a/password-generator-cli"
/>
</BaseLayout>

View file

@ -1,10 +1,18 @@
import rss from '@astrojs/rss';
import { SITE_TITLE, SITE_DESCRIPTION } from '../config';
import rss from "@astrojs/rss";
import { SITE_TITLE, SITE_DESCRIPTION } from "../config";
import { getCollection } from "astro:content";
export const get = () =>
rss({
export async function get(context) {
const blog = await getCollection("blog");
return rss({
title: SITE_TITLE,
description: SITE_DESCRIPTION,
site: import.meta.env.SITE,
items: import.meta.glob('./blog/**/*.md'),
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} */
module.exports = {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
theme: {
extend: {},
},
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
}
}