Rebuild homepage with Flask
70
.github/workflows/codeql-analysis.yml
vendored
@@ -1,70 +0,0 @@
|
|||||||
# For most projects, this workflow file will not need changing; you simply need
|
|
||||||
# to commit it to your repository.
|
|
||||||
#
|
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
|
||||||
# or to provide custom queries or build logic.
|
|
||||||
#
|
|
||||||
# ******** NOTE ********
|
|
||||||
# We have attempted to detect the languages in your repository. Please check
|
|
||||||
# the `language` matrix defined below to confirm you have the correct set of
|
|
||||||
# supported CodeQL languages.
|
|
||||||
#
|
|
||||||
name: "CodeQL"
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
# The branches below must be a subset of the branches above
|
|
||||||
branches: [ master ]
|
|
||||||
schedule:
|
|
||||||
- cron: '37 14 * * 6'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: Analyze
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
security-events: write
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
language: [ 'javascript' ]
|
|
||||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
|
||||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v2
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
||||||
# By default, queries listed here will override any specified in a config file.
|
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
|
||||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
|
||||||
- name: Autobuild
|
|
||||||
uses: github/codeql-action/autobuild@v2
|
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
|
||||||
# 📚 https://git.io/JvXDl
|
|
||||||
|
|
||||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
|
||||||
# and modify them (or add more) to build your code if your project
|
|
||||||
# uses a compiled language
|
|
||||||
|
|
||||||
#- run: |
|
|
||||||
# make bootstrap
|
|
||||||
# make release
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v2
|
|
||||||
28
.gitignore
vendored
@@ -1,26 +1,4 @@
|
|||||||
site
|
.venv
|
||||||
|
__pycache__
|
||||||
# dependencies
|
srcReact
|
||||||
/node_modules
|
|
||||||
/.pnp
|
|
||||||
.pnp.js
|
|
||||||
|
|
||||||
# testing
|
|
||||||
/coverage
|
|
||||||
|
|
||||||
# production
|
|
||||||
/build
|
|
||||||
|
|
||||||
# misc
|
|
||||||
.DS_Store
|
|
||||||
.env.local
|
|
||||||
.env.development.local
|
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
|
|
||||||
notes.txt
|
notes.txt
|
||||||
28
Dockerfile
@@ -1,24 +1,14 @@
|
|||||||
# pull official base image
|
FROM docker.io/python:3.8-buster
|
||||||
FROM node:13.12.0-alpine
|
LABEL maintainer="Andrew Simonson <asimonson1125@gmail.com>"
|
||||||
|
|
||||||
# set working directory
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
ADD ./src /app
|
||||||
|
COPY ./requirements.txt requirements.txt
|
||||||
|
RUN apt-get -yq update && \
|
||||||
|
pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
# add `/app/node_modules/.bin` to $PATH
|
COPY . .
|
||||||
ENV PATH /app/node_modules/.bin:$PATH
|
|
||||||
|
|
||||||
# install app dependencies
|
WORKDIR /app/src
|
||||||
COPY package.json ./
|
|
||||||
COPY package-lock.json ./
|
|
||||||
RUN npm install --silent
|
|
||||||
RUN npm install react-scripts@3.4.1 -g --silent
|
|
||||||
|
|
||||||
RUN mkdir node_modules/.cache && chmod -R 777 node_modules/.cache
|
CMD [ "gunicorn", "-k" , "geventwebsocket.gunicorn.workers.GeventWebSocketWorker", "--bind", "0.0.0.0:8080", "application:app"]
|
||||||
|
|
||||||
|
|
||||||
# add app
|
|
||||||
COPY . ./
|
|
||||||
ENV PORT=8080
|
|
||||||
|
|
||||||
# start app
|
|
||||||
CMD ["npm", "start"]
|
|
||||||
45133
package-lock.json
generated
58
package.json
@@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "portfolio",
|
|
||||||
"version": "0.3.0",
|
|
||||||
"homepage": "https://asimonson.com",
|
|
||||||
"private": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@testing-library/jest-dom": "^5.16.4",
|
|
||||||
"@testing-library/react": "^13.0.1",
|
|
||||||
"@testing-library/user-event": "^14.1.0",
|
|
||||||
"aos": "^2.3.4",
|
|
||||||
"node": "^17.7.2",
|
|
||||||
"node-dom": "^0.1.0",
|
|
||||||
"on-resize": "^2.0.0",
|
|
||||||
"react": "^18.0.0",
|
|
||||||
"react-aos": "^1.0.1",
|
|
||||||
"react-bootstrap": "^2.2.3",
|
|
||||||
"react-dom": "^18.0.0",
|
|
||||||
"react-ga": "^3.3.1",
|
|
||||||
"react-image-gallery": "^1.2.11",
|
|
||||||
"react-p5": "^1.3.30",
|
|
||||||
"react-router-dom": "^6.3.0",
|
|
||||||
"react-router-sitemap": "^1.2.0",
|
|
||||||
"react-scripts": "^5.0.1",
|
|
||||||
"sass": "^1.55.0",
|
|
||||||
"semver": "^7.3.7",
|
|
||||||
"set-value": "^4.1.0",
|
|
||||||
"update": "^0.7.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"gh-pages": "^3.2.3"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"predeploy": "npm run build",
|
|
||||||
"deploy": "gh-pages -d build",
|
|
||||||
"start": "react-scripts start",
|
|
||||||
"build": "react-scripts build",
|
|
||||||
"test": "react-scripts test",
|
|
||||||
"eject": "react-scripts eject"
|
|
||||||
},
|
|
||||||
"eslintConfig": {
|
|
||||||
"extends": [
|
|
||||||
"react-app",
|
|
||||||
"react-app/jest"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"browserslist": {
|
|
||||||
"production": [
|
|
||||||
">0.2%",
|
|
||||||
"not dead",
|
|
||||||
"not op_mini all"
|
|
||||||
],
|
|
||||||
"development": [
|
|
||||||
"last 1 chrome version",
|
|
||||||
"last 1 firefox version",
|
|
||||||
"last 1 safari version"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# 301 REDIRECT WWW TO NON-WWW
|
|
||||||
<IfModule mod_rewrite.c>
|
|
||||||
RewriteEngine On
|
|
||||||
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
|
|
||||||
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
|
|
||||||
</IfModule>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
asimonson.com
|
|
||||||
www.asimonson.com
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
theme: minima
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<meta name="theme-color" content="#000000" />
|
|
||||||
<meta
|
|
||||||
name="Simonson - Portfolio"
|
|
||||||
content="Digital portfolio of Andrew Simonson"
|
|
||||||
/>
|
|
||||||
<meta property="og:title" content="European Travel Destinations" />
|
|
||||||
<meta property="og:type" content="article" />
|
|
||||||
<meta
|
|
||||||
property="og:description"
|
|
||||||
content="Digital Portfolio - Andrew Simonson"
|
|
||||||
/>
|
|
||||||
<meta property="og:image" content="%PUBLIC_URL%/lol.jpg" />
|
|
||||||
<meta property="og:url" content="%PUBLIC_URL%" />
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
|
||||||
<meta property="og:site_name" content="Andrew Simonson - Portfolio" />
|
|
||||||
<meta name="twitter:image:alt" content="some example picture idk" />
|
|
||||||
<!-- <meta property="og:title" content="__OG_TITLE__" />
|
|
||||||
<meta property="og:description" content="__OG_DESCRIPTION__" /> -->
|
|
||||||
<!--
|
|
||||||
manifest.json provides metadata used when your web app is installed on a
|
|
||||||
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
|
|
||||||
-->
|
|
||||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
|
||||||
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script
|
|
||||||
async
|
|
||||||
src="https://www.googletagmanager.com/gtag/js?id=G-E2V93W9CNV"
|
|
||||||
></script>
|
|
||||||
<script>
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
function gtag() {
|
|
||||||
dataLayer.push(arguments);
|
|
||||||
}
|
|
||||||
gtag("js", new Date());
|
|
||||||
|
|
||||||
gtag("config", "G-E2V93W9CNV");
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<title>Simonson - Portfolio</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
||||||
<div id="root"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
BIN
public/lol.jpg
|
Before Width: | Height: | Size: 361 KiB |
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"short_name": "React App",
|
|
||||||
"name": "Create React App Sample",
|
|
||||||
"icons": [
|
|
||||||
{
|
|
||||||
"src": "favicon.ico",
|
|
||||||
"sizes": "64x64 32x32 24x24 16x16",
|
|
||||||
"type": "image/x-icon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "logo192.png",
|
|
||||||
"type": "image/png",
|
|
||||||
"sizes": "192x192"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "logo512.png",
|
|
||||||
"type": "image/png",
|
|
||||||
"sizes": "512x512"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"start_url": ".",
|
|
||||||
"display": "standalone",
|
|
||||||
"theme_color": "#000000",
|
|
||||||
"background_color": "#ffffff"
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
||||||
<url>
|
|
||||||
<loc>https://asimonson.com</loc>
|
|
||||||
<loc>https://asimonson.com/about</loc>
|
|
||||||
<loc>https://asimonson.com/projects</loc>
|
|
||||||
<loc>https://asimonson.com/Resume</loc>
|
|
||||||
<lastmod>2022-06-04</lastmod>
|
|
||||||
</url>
|
|
||||||
</urlset>
|
|
||||||
56
src/App.js
@@ -1,56 +0,0 @@
|
|||||||
import { Route, Link, Routes, BrowserRouter as Router, Navigate } from "react-router-dom";
|
|
||||||
|
|
||||||
import "./assets/css/App.css";
|
|
||||||
import "./assets/css/checkbox.css"
|
|
||||||
import "./assets/css/head.scss";
|
|
||||||
import menu from "./assets/icons/menu.svg";
|
|
||||||
import Nav from "./componets/Nav.js";
|
|
||||||
import Socials from "./componets/Socials.js";
|
|
||||||
import Name from "./componets/Name.js";
|
|
||||||
import Home from "./pages/Home.js";
|
|
||||||
import Projects from "./pages/Projects";
|
|
||||||
import Activities from "./pages/Activities";
|
|
||||||
import AboutMe from "./pages/AboutMe";
|
|
||||||
import Idler from "./componets/Idler";
|
|
||||||
import ErrorNotFound from "./pages/Error";
|
|
||||||
import AOS from "aos";
|
|
||||||
// import 'aos/dist/aos.css'; // You can also use <link> for styles
|
|
||||||
import { toggleMenu } from "./scripts/responsive";
|
|
||||||
|
|
||||||
AOS.init();
|
|
||||||
function App() {
|
|
||||||
return (
|
|
||||||
<Router>
|
|
||||||
<Idler />
|
|
||||||
<div className="App">
|
|
||||||
<div className="header">
|
|
||||||
<Name />
|
|
||||||
<img src={menu} alt="menu" id="menu" onClick={toggleMenu} />
|
|
||||||
<Nav id="navbar">
|
|
||||||
<Link to="/">Home</Link>
|
|
||||||
<a href="Resume.pdf" target="_blank">
|
|
||||||
Resume
|
|
||||||
</a>
|
|
||||||
<Link to="/projects">Projects</Link>
|
|
||||||
{/* <Link to="/activities">Activities</Link> */}
|
|
||||||
<Link to="/about">About Me</Link>
|
|
||||||
</Nav>
|
|
||||||
</div>
|
|
||||||
<Routes>
|
|
||||||
{/* <Route exact path='' element={ <Navigate to='/' />} /> */}
|
|
||||||
<Route exact path="/" element={<Home />}></Route>
|
|
||||||
<Route exact path="/projects" element={<Projects />}></Route>
|
|
||||||
<Route exact path="activities" element={<Activities />}></Route>
|
|
||||||
<Route exact path="/about" element={<AboutMe />}></Route>
|
|
||||||
<Route exact path="/notFound" element={<ErrorNotFound />} />
|
|
||||||
<Route exact path="/*" element={<ErrorNotFound />} />
|
|
||||||
</Routes>
|
|
||||||
<div className="footer">
|
|
||||||
<Socials />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</Router>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default App;
|
|
||||||
43
src/app.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import flask
|
||||||
|
from flask_sitemap import Sitemap
|
||||||
|
import sass
|
||||||
|
|
||||||
|
app = flask.Flask(__name__)
|
||||||
|
ext = Sitemap(app=app)
|
||||||
|
sass.compile(dirname=('static/scss', 'static/css'), output_style='compressed')
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def home():
|
||||||
|
return flask.render_template('home.html', title='Andrew Simonson - Portfolio Home', description="Andrew Simonson's Digital portfolio home", canonical='')
|
||||||
|
|
||||||
|
@app.route('/about')
|
||||||
|
def about():
|
||||||
|
return flask.render_template('about.html', title='Andrew Simonson - About Me', description="About Andrew Simonson", canonical='about')
|
||||||
|
|
||||||
|
@app.route('/resume')
|
||||||
|
@app.route('/Resume.pdf')
|
||||||
|
def resume():
|
||||||
|
return flask.send_file('./static/resume.pdf')
|
||||||
|
|
||||||
|
|
||||||
|
@app.errorhandler(Exception)
|
||||||
|
def page404(e):
|
||||||
|
eCode = e.code
|
||||||
|
message = e.description
|
||||||
|
try:
|
||||||
|
message = e.length
|
||||||
|
finally:
|
||||||
|
return flask.render_template('error.html', error=eCode, message=message, title=f'{eCode} - Simonson Portfolio'), eCode
|
||||||
|
|
||||||
|
# @app.route('/sitemap.xml')
|
||||||
|
@app.route('/robots.txt')
|
||||||
|
def static_from_root():
|
||||||
|
return flask.send_from_directory(app.static_folder, flask.request.path[1:])
|
||||||
|
|
||||||
|
# @ext.register_generator
|
||||||
|
# def index():
|
||||||
|
# # Not needed if you set SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS=True
|
||||||
|
# yield 'index', {}
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import ImageGallery from 'react-image-gallery';
|
|
||||||
|
|
||||||
export default function ResponsiveCarousel(props) {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div className="carousel-container">
|
|
||||||
<ImageGallery items={props.children}/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import bg from "../assets/chesscom-embed/diamonds.png";
|
|
||||||
import def from "../assets/chesscom-embed/default.svg";
|
|
||||||
|
|
||||||
export default class ChessBed extends React.Component {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.seeAccount = this.seeAccount.bind(this, props.username);
|
|
||||||
this.addChessEmbed = this.addChessEmbed.bind(this, props.username);
|
|
||||||
this.state = {
|
|
||||||
name: "Loading..",
|
|
||||||
pic: def,
|
|
||||||
ratings: {
|
|
||||||
rapid: "Loading",
|
|
||||||
blitz: "Loading",
|
|
||||||
bullet: "Loading",
|
|
||||||
tactics: "Loading",
|
|
||||||
},
|
|
||||||
loaded: "hidden"
|
|
||||||
};
|
|
||||||
this.diamonds = {
|
|
||||||
background: "black",
|
|
||||||
backgroundImage: `linear-gradient(rgba(0, 0, 0, .5), rgba(0, 0, 0, .75)), url(${bg})`,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
seeAccount(username) {
|
|
||||||
window.top.location.href = "https://chess.com/member/" + username;
|
|
||||||
}
|
|
||||||
|
|
||||||
async addChessEmbed(username) {
|
|
||||||
let user, stats;
|
|
||||||
try {
|
|
||||||
user = await fetch(`https://api.chess.com/pub/player/${username}`);
|
|
||||||
stats = await fetch(
|
|
||||||
`https://api.chess.com/pub/player/${username}/stats`
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
this.setState({
|
|
||||||
name: "Chess.com request failed",
|
|
||||||
ratings: {
|
|
||||||
rapid: "Site may",
|
|
||||||
blitz: "be blocked",
|
|
||||||
bullet: "by client.\n\n",
|
|
||||||
tactics: "not my fault :(",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (user.status === 200) {
|
|
||||||
user = await user.json();
|
|
||||||
stats = await stats.json();
|
|
||||||
this.setState({
|
|
||||||
name: user["username"],
|
|
||||||
pic: user.avatar,
|
|
||||||
ratings: {
|
|
||||||
rapid: stats.chess_rapid.last.rating,
|
|
||||||
blitz: stats.chess_blitz.last.rating,
|
|
||||||
bullet: stats.chess_bullet.last.rating,
|
|
||||||
tactics: stats.tactics.highest.rating,
|
|
||||||
},
|
|
||||||
loaded: ''
|
|
||||||
});
|
|
||||||
} else if (user === null || user.status === 403 || user.status === null) {
|
|
||||||
this.setState({
|
|
||||||
name: "Chess.com request failed"
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.setState({
|
|
||||||
name: "User Not Found",
|
|
||||||
loaded: ''
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
this.addChessEmbed();
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className="black">
|
|
||||||
<div
|
|
||||||
id="chessProfile"
|
|
||||||
onClick={this.seeAccount}
|
|
||||||
style={this.diamonds}
|
|
||||||
>
|
|
||||||
<div className="identity chessInfo">
|
|
||||||
<div className="pfpContainer">
|
|
||||||
<div>
|
|
||||||
<img
|
|
||||||
className="pfp"
|
|
||||||
src={this.state.pic}
|
|
||||||
alt={this.username}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<h5 className="chessName">{this.state.name}</h5>
|
|
||||||
</div>
|
|
||||||
<div className="vContainer chessInfo">
|
|
||||||
<div className="vItem">
|
|
||||||
<div className={"chessIcon rapid " + this.state.loaded}>Ἓ</div>
|
|
||||||
<p>{this.state.ratings.rapid}</p>
|
|
||||||
</div>
|
|
||||||
<div className="vItem">
|
|
||||||
<div className={"chessIcon blitz " + this.state.loaded}>Ἔ</div>
|
|
||||||
<p>{this.state.ratings.blitz}</p>
|
|
||||||
</div>
|
|
||||||
<div className="vItem">
|
|
||||||
<div className={"chessIcon bullet " + this.state.loaded}>Ἕ</div>
|
|
||||||
<p>{this.state.ratings.bullet}</p>
|
|
||||||
</div>
|
|
||||||
<div className="vItem">
|
|
||||||
<div className={"chessIcon puzzles " + this.state.loaded}>ἕ</div>
|
|
||||||
<p>{this.state.ratings.tactics}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="bottomtext">
|
|
||||||
Chess.com Stat Embed by Andrew Simonson
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import { skill } from '../scripts/skill'
|
|
||||||
|
|
||||||
export default function HexGrid() {
|
|
||||||
return (
|
|
||||||
<div className="hex-wrapper">
|
|
||||||
<div className="hex-row hex-odd">
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('python')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
</div>
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('js')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="hex-row hex-even">
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('html')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<h3>Ahoy</h3>
|
|
||||||
</div>
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('sql')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
</div>
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('cpp')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="hex-row hex-odd">
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('other')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
</div>
|
|
||||||
<div className="hex" onMouseOver={(event) => skill('tools')}>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
<div className="hex-border"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
import Sketch from "react-p5";
|
|
||||||
import React from "react";
|
|
||||||
|
|
||||||
const balls = [];
|
|
||||||
const density = 0.00005;
|
|
||||||
let screenWidth = window.innerWidth + 10;
|
|
||||||
let screenHeight = window.innerHeight + 10;
|
|
||||||
|
|
||||||
export default class Idler extends React.Component {
|
|
||||||
setup = (p5, parentRef) => {
|
|
||||||
p5.frameRate(15);
|
|
||||||
const pix = screenHeight * screenWidth;
|
|
||||||
p5.createCanvas(screenWidth, screenHeight).parent(parentRef);
|
|
||||||
for (let i = 0; i < pix * density; i++) {
|
|
||||||
let thisBall = new Ball(
|
|
||||||
p5.random(screenWidth),
|
|
||||||
p5.random(screenHeight),
|
|
||||||
p5.random(6) + 3,
|
|
||||||
Math.exp(p5.random(4) + 3) / 1000 + 1,
|
|
||||||
p5.random(360)
|
|
||||||
);
|
|
||||||
balls.push(thisBall);
|
|
||||||
}
|
|
||||||
|
|
||||||
p5.stroke(255);
|
|
||||||
};
|
|
||||||
|
|
||||||
draw = (p5) => {
|
|
||||||
p5.background(32);
|
|
||||||
|
|
||||||
for (let i = 0; i < balls.length; i++) {
|
|
||||||
balls[i].update();
|
|
||||||
p5.stroke(200, 100);
|
|
||||||
p5.strokeWeight(2);
|
|
||||||
p5.fill(0);
|
|
||||||
p5.ellipse(balls[i].x, balls[i].y, balls[i].size, balls[i].size);
|
|
||||||
}
|
|
||||||
for (let i = 0; i < balls.length - 1; i++) {
|
|
||||||
for (let j = i + 1; j < balls.length; j++) {
|
|
||||||
let distance = p5.dist(balls[i].x, balls[i].y, balls[j].x, balls[j].y);
|
|
||||||
if (distance < 100){
|
|
||||||
p5.stroke(150);
|
|
||||||
p5.line(balls[i].x, balls[i].y, balls[j].x, balls[j].y);
|
|
||||||
}
|
|
||||||
else if (distance < 150) {
|
|
||||||
p5.stroke(100);
|
|
||||||
let chance = 0.3 ** (((p5.random(0.2) + 0.8) * distance) / 150);
|
|
||||||
if (chance < 0.5) {
|
|
||||||
p5.stroke(50);
|
|
||||||
}
|
|
||||||
p5.line(balls[i].x, balls[i].y, balls[j].x, balls[j].y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
render() {
|
|
||||||
const windowResized = (p5) => {
|
|
||||||
p5.resizeCanvas(p5.windowWidth, p5.windowHeight);
|
|
||||||
screenWidth = window.innerWidth + 10;
|
|
||||||
screenHeight = window.innerHeight + 10;
|
|
||||||
};
|
|
||||||
return (
|
|
||||||
<Sketch
|
|
||||||
windowResized={windowResized}
|
|
||||||
setup={this.setup}
|
|
||||||
draw={this.draw}
|
|
||||||
style={{ position: "fixed", zIndex: -69 }}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Ball {
|
|
||||||
constructor(x, y, size, speed, angle) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.size = size;
|
|
||||||
this.speed = speed;
|
|
||||||
this.angle = angle;
|
|
||||||
this.calcChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
calcChange() {
|
|
||||||
this.xSpeed = this.speed * Math.sin((this.angle * Math.PI) / 180);
|
|
||||||
this.ySpeed = this.speed * Math.cos((this.angle * Math.PI) / 180);
|
|
||||||
}
|
|
||||||
|
|
||||||
update() {
|
|
||||||
this.x += this.xSpeed;
|
|
||||||
this.y += this.ySpeed;
|
|
||||||
if (this.x > screenWidth) {
|
|
||||||
this.x -= screenWidth;
|
|
||||||
} else if (this.x < 0) {
|
|
||||||
this.x += screenWidth;
|
|
||||||
}
|
|
||||||
if (this.y > screenHeight) {
|
|
||||||
this.y -= screenHeight;
|
|
||||||
} else if (this.y < 0) {
|
|
||||||
this.y += screenHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
export default function Name() {
|
|
||||||
return (
|
|
||||||
<a href="/">
|
|
||||||
<div id="name-container">
|
|
||||||
<div className="glitch">
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
<div className="line name">
|
|
||||||
<h1 className="textGrad">Andrew Simonson</h1>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
|
|
||||||
export default function Nav(props) {
|
|
||||||
let items;
|
|
||||||
for (let i = 0; i < props.children.length; i++) {
|
|
||||||
items = (
|
|
||||||
<>
|
|
||||||
{items}
|
|
||||||
<div className='navElement'>{props.children[i]}</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div className='navControl'>
|
|
||||||
<div className='navBar'>
|
|
||||||
{items}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
export default function ProjectList(props) {
|
|
||||||
let text;
|
|
||||||
props.children.forEach(function (x) {
|
|
||||||
text = (
|
|
||||||
<>
|
|
||||||
{text}
|
|
||||||
{x}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
text = (<div className='neonBox'>{text}</div>)
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div id="pBody">
|
|
||||||
<div className="fPage">
|
|
||||||
<div className="heightBox">{text}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import placeholder from "../assets/photos/placeholder.png";
|
|
||||||
|
|
||||||
export default class Project extends React.Component {
|
|
||||||
render() {
|
|
||||||
let style = {
|
|
||||||
backgroundImage: "url(" + this.props.bgi + ")",
|
|
||||||
};
|
|
||||||
let links = <></>;
|
|
||||||
if (this.props.links != null) {
|
|
||||||
this.props.links.forEach((x) => {
|
|
||||||
links = (
|
|
||||||
<>
|
|
||||||
{links}
|
|
||||||
<a href={x[0]}>{x[1]}</a>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
links = (
|
|
||||||
<div className="placeholder">
|
|
||||||
<img alt="no links!" src={placeholder} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<div className={"project " + this.props.classes} data-aos="fade-up">
|
|
||||||
<div className="vFlex">
|
|
||||||
<div className="projTitle">
|
|
||||||
<h3>{this.props.title}</h3>
|
|
||||||
<p className={this.props.status + " tab"}>⬤</p>
|
|
||||||
</div>
|
|
||||||
<div className='projBody vFlex spaceBetween'>
|
|
||||||
<div style={style} className='bgi' />
|
|
||||||
<div className="topBox">
|
|
||||||
<p className="backedBody">{this.props.children}</p>
|
|
||||||
</div>
|
|
||||||
<div className="bottomBox">{links}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import React from 'react'
|
|
||||||
|
|
||||||
export default function ProjectList(props){
|
|
||||||
let projects;
|
|
||||||
props.children.forEach(function(x){
|
|
||||||
projects = (
|
|
||||||
<>
|
|
||||||
{projects}
|
|
||||||
{x}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
return(
|
|
||||||
<div className={'projectList centeredForeground ' + props.classes} data-aos='fade-up'>
|
|
||||||
{projects}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import React from 'react'
|
|
||||||
|
|
||||||
export default function Skills(props){
|
|
||||||
let allSkills;
|
|
||||||
props.children.forEach(x => {
|
|
||||||
allSkills = (
|
|
||||||
<>
|
|
||||||
{allSkills}
|
|
||||||
<li className='skill'>{x}</li>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
});
|
|
||||||
return (
|
|
||||||
<ul className='skills'>
|
|
||||||
{allSkills}
|
|
||||||
</ul>);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
|
|
||||||
import github from '../assets/icons/github.svg'
|
|
||||||
import instagram from '../assets/icons/instagram.svg'
|
|
||||||
import linkedin from '../assets/icons/linkedin.svg'
|
|
||||||
import email from '../assets/icons/email.svg'
|
|
||||||
|
|
||||||
export default function Socials(){
|
|
||||||
return(
|
|
||||||
<div className='socials'>
|
|
||||||
<a href='https://github.com/asimonson1125'><img alt='Github' src={github} /></a>
|
|
||||||
<a href='https://www.instagram.com/an_a.simonson/'><img alt='Instagram' src={instagram} /></a>
|
|
||||||
<a href='https://www.linkedin.com/in/simonsonandrew/'><img alt='LinkedIn' src={linkedin} /></a>
|
|
||||||
<a href='mailto:asimonson1125@gmail.com'><img alt='E-mail' src={email} /></a>
|
|
||||||
<div id='vertLine'></div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
|
|
||||||
export default class TimeItem extends React.Component {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.date = props.date;
|
|
||||||
this.classes = props.classes;
|
|
||||||
this.item = (
|
|
||||||
<>
|
|
||||||
<h2>{props.title}</h2>
|
|
||||||
<div className="timeline-deets">
|
|
||||||
<p>{props.children}</p>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return <div className={"timeitem " + this.classes}><p className="datetext">{this.date}</p><div className="timeline-item">{this.item}</div></div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
|
|
||||||
export default class Timeline extends React.Component {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.items = props.children;
|
|
||||||
this.classes = props.classes;
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return <div className={"timeline " + this.classes}>
|
|
||||||
{this.items}
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
11
src/index.js
@@ -1,11 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { createRoot } from 'react-dom/client';
|
|
||||||
import App from './App';
|
|
||||||
|
|
||||||
const container = document.getElementById('root');
|
|
||||||
const root = createRoot(container);
|
|
||||||
root.render(
|
|
||||||
// <React.StrictMode>
|
|
||||||
<App />
|
|
||||||
// </React.StrictMode>
|
|
||||||
);
|
|
||||||
@@ -1,265 +0,0 @@
|
|||||||
import React, { useEffect } from "react";
|
|
||||||
// import MyCarousel from "../componets/Carousel.js";
|
|
||||||
import ChessBed from "../componets/ChessBed.js";
|
|
||||||
// import HexGrid from "../componets/HexGrid";
|
|
||||||
import Skills from "../componets/Skills";
|
|
||||||
import Timeline from "../componets/Timeline";
|
|
||||||
import TimeItem from "../componets/TimeItem.js";
|
|
||||||
import { toggle } from "../scripts/checkbox";
|
|
||||||
// import img1 from '../assets/photos/itsa_me.JPG'
|
|
||||||
// import img2 from '../assets/photos/me_robot.jpeg'
|
|
||||||
// import img3 from "../assets/photos/AcademicTeam.jpg";
|
|
||||||
// import img4 from "../assets/photos/hagerstownVex2019.jpg";
|
|
||||||
// import img5 from "../assets/photos/WeThePeople_Districts.jpg";
|
|
||||||
// import img6 from "../assets/photos/WeThePeople.jpg";
|
|
||||||
// import img7 from "../assets/photos/WeThePeople_NationalsSetup.jpg";
|
|
||||||
|
|
||||||
export default function AboutMe() {
|
|
||||||
useEffect(() => {
|
|
||||||
// This will run when the page first loads and whenever the title changes
|
|
||||||
document.title = "Andrew Simonson - About Me";
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="foreground" onLoad={() => toggle("up")}>
|
|
||||||
<meta
|
|
||||||
name="description"
|
|
||||||
content="About Andrew Simonson - learn all about me and the stuff I do, it's real great."
|
|
||||||
/>
|
|
||||||
<link rel="canonical" href="https://asimonson.com/about"></link>
|
|
||||||
<div className="col">
|
|
||||||
<div id="aboutMe" data-aos="fade-up">
|
|
||||||
<h2 className="concentratedHead">About Me</h2>
|
|
||||||
<p>
|
|
||||||
I'm Andrew Simonson, a second year (third year standing) student at{" "}
|
|
||||||
<strong>Rochester Institute of Technology </strong>
|
|
||||||
in the <b>Computer Science</b> BS program, pursuing a career in data
|
|
||||||
science with a focus on predictive analytics.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
When I'm not in class, you can find me working on extra
|
|
||||||
collaborative projects, building discord bots, playing chess,
|
|
||||||
reading up on some recent geopolitical development, or haphazardly
|
|
||||||
expanding my list of unusable, yet bizzarely wise quotes.
|
|
||||||
</p>
|
|
||||||
{/* <p>
|
|
||||||
My goal is to strive to make the biggest positive impact on the
|
|
||||||
world that I can. I'm here to improve and optimize what we have so
|
|
||||||
that we can spend more time on the things that matter.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
I also value the ability to understand the world at large. That
|
|
||||||
awareness is what grounds a person into reality and gives their
|
|
||||||
place in the world value. My favorite part of learning about
|
|
||||||
grographies and cultures is when I can justify to myself the hidden
|
|
||||||
causality to historic events, which presents an inside look into how
|
|
||||||
we can act in the present.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
It is my belief that being able to channel each distinct creative
|
|
||||||
interest into a final product is vital. With this philosophy that
|
|
||||||
promotes dedication and enables an in-depth understanding, I can
|
|
||||||
take pride in each of my projects, bridging the gap between the the
|
|
||||||
multifaceted purpose present in everything around us.
|
|
||||||
</p> */}
|
|
||||||
{/*<img src={img1} alt='Me' className='boxedImg' />*/}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="col">
|
|
||||||
<div id="skills" data-aos="fade-up">
|
|
||||||
<h2>Skills</h2>
|
|
||||||
{/* <div id="skillList">
|
|
||||||
<HexGrid></HexGrid>
|
|
||||||
<div id="skillDisp">
|
|
||||||
<h2></h2>
|
|
||||||
<p></p>
|
|
||||||
</div>
|
|
||||||
</div> */}
|
|
||||||
<Skills>
|
|
||||||
{[
|
|
||||||
"Python",
|
|
||||||
"JavaScript",
|
|
||||||
"Java",
|
|
||||||
"C",
|
|
||||||
"C++",
|
|
||||||
"MIPS Assembly",
|
|
||||||
"Processing",
|
|
||||||
"P5.js",
|
|
||||||
"SQL",
|
|
||||||
"SQLite",
|
|
||||||
"PostgreSQL",
|
|
||||||
"SQLAlchemy",
|
|
||||||
"HTML",
|
|
||||||
"CSS",
|
|
||||||
"Docker",
|
|
||||||
"LaTeX",
|
|
||||||
"ArcGIS",
|
|
||||||
"Git",
|
|
||||||
"Github",
|
|
||||||
"Linux",
|
|
||||||
"OKD4",
|
|
||||||
"Kubernetes",
|
|
||||||
"Angular",
|
|
||||||
"Flask",
|
|
||||||
"Jinja",
|
|
||||||
"DOM Scraping",
|
|
||||||
"Google API",
|
|
||||||
"React",
|
|
||||||
"Node.js",
|
|
||||||
"ArcGIS",
|
|
||||||
]}
|
|
||||||
</Skills>
|
|
||||||
<div className="chess">
|
|
||||||
<ChessBed username="asimonson1125"></ChessBed>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/* <div data-aos="fade-up" className="elementBlock">
|
|
||||||
<h2>Extracirricular Awards</h2>
|
|
||||||
<MyCarousel className="carousel" data-aos="fade-up">
|
|
||||||
{[
|
|
||||||
{
|
|
||||||
original: img4,
|
|
||||||
description:
|
|
||||||
"High School VEX Robotics President and Team Leader",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
original: img5,
|
|
||||||
description:
|
|
||||||
"We the People Civics Competition District Champions",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
original: img6,
|
|
||||||
description: "We The People State Civics Competition Champions",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
original: img7,
|
|
||||||
description:
|
|
||||||
"what it looks like to compete in We the People Nationals, circa 2020",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
original: img3,
|
|
||||||
description: "Academic Team county championships",
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
</MyCarousel>
|
|
||||||
</div> */}
|
|
||||||
</div>
|
|
||||||
<div className="col">
|
|
||||||
<div className="checkbox-wrapper">
|
|
||||||
<div className="flex start">
|
|
||||||
<label className="switch" htmlFor="pinned">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
id="pinned"
|
|
||||||
onClick={() => toggle("up")}
|
|
||||||
defaultChecked
|
|
||||||
/>
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Pinned</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div className="flex start">
|
|
||||||
<label className="switch" htmlFor="education">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
id="education"
|
|
||||||
onClick={() => toggle("up")}
|
|
||||||
/>
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Education</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div className="flex start">
|
|
||||||
<label
|
|
||||||
className="switch"
|
|
||||||
htmlFor="experience"
|
|
||||||
onClick={() => toggle("up")}
|
|
||||||
>
|
|
||||||
<input type="checkbox" id="experience" />
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Work Experience</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div className="flex start">
|
|
||||||
<label
|
|
||||||
className="switch"
|
|
||||||
htmlFor="technical"
|
|
||||||
onClick={() => toggle("up")}
|
|
||||||
>
|
|
||||||
<input type="checkbox" id="technical" />
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Technical</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<Timeline classes="checkbox-client">
|
|
||||||
<TimeItem
|
|
||||||
date="01/2023 - 05/2023"
|
|
||||||
title="Co-op @ Dow Chemical"
|
|
||||||
classes="pinned experience technical"
|
|
||||||
>
|
|
||||||
Spring 2023 Semester Co-op under Dow Chemical's Global Reactive
|
|
||||||
Chemicals team in Analytical Sciences. Responsibilities included
|
|
||||||
management of chemical compatability data and tool creation for
|
|
||||||
parsing, generating, and submitting reports.
|
|
||||||
</TimeItem>
|
|
||||||
<TimeItem date="08/26/2021" title="Started Portfolio">
|
|
||||||
I started building this website on this day. I wish I could say I
|
|
||||||
was farther along than I am.
|
|
||||||
</TimeItem>
|
|
||||||
<TimeItem
|
|
||||||
date="08/2021 - 05/2025"
|
|
||||||
title="Rochester Institute of Technology"
|
|
||||||
classes="pinned education technical"
|
|
||||||
>
|
|
||||||
Studying in Rochester Institute of Technology's Computer Science BS
|
|
||||||
program with a minor in International Relations.
|
|
||||||
</TimeItem>
|
|
||||||
<TimeItem
|
|
||||||
date="04/2021 - 08/2021"
|
|
||||||
title="Pretzel & Pizza Creations"
|
|
||||||
classes="experience"
|
|
||||||
>
|
|
||||||
Worked part-time as a chef, managing active ingredient supply and
|
|
||||||
fulfilling orders. I personally recommend the stuffed pretzels.
|
|
||||||
</TimeItem>
|
|
||||||
<TimeItem
|
|
||||||
date="08/2020 - 12/2020"
|
|
||||||
title="Election Official"
|
|
||||||
classes="experience"
|
|
||||||
>
|
|
||||||
Trained in voter registry operations and provisional voting by the
|
|
||||||
Washington County Board of Elections for the 2020 US Presidential
|
|
||||||
Election.
|
|
||||||
</TimeItem>
|
|
||||||
<TimeItem
|
|
||||||
date="09/2016 - 06/2021"
|
|
||||||
title="Boonsboro High School"
|
|
||||||
classes="education"
|
|
||||||
>
|
|
||||||
Graduated high school with highest honors.
|
|
||||||
<br />
|
|
||||||
Member of National Honor Society, Academic Team County Champions.
|
|
||||||
Participated in Physics Olympics, Robotics Club, and scored at state
|
|
||||||
championships in{" "}
|
|
||||||
<a href="https://www.athletic.net/athlete/10265585/track-and-field/high-school">
|
|
||||||
Cross Country and Track and Field (4x800, 800)
|
|
||||||
</a>
|
|
||||||
.{" "}
|
|
||||||
</TimeItem>
|
|
||||||
<TimeItem
|
|
||||||
date="10/2015 - 04/2021"
|
|
||||||
title="Vex Robotics Team Lead/Club President"
|
|
||||||
classes="technical"
|
|
||||||
>
|
|
||||||
Led 5 teams through middle and high school to VEX Robotics
|
|
||||||
Competitions, elevating Boonsboro from county group-stage
|
|
||||||
elimination to its first state championship participation.
|
|
||||||
Reorganized club and set up its first interface with the community +
|
|
||||||
sponsors
|
|
||||||
</TimeItem>
|
|
||||||
</Timeline>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import Neon from "../componets/Neon";
|
|
||||||
|
|
||||||
export default function ErrorNotFound() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<link rel="canonical" href="https://asimonson.com/activities"></link>
|
|
||||||
<Neon color="#fff">
|
|
||||||
<h1 className="neon">ERROR 404</h1>
|
|
||||||
<br />
|
|
||||||
<h3 className="neon">URL Not Found</h3>
|
|
||||||
</Neon>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import Neon from '../componets/Neon'
|
|
||||||
|
|
||||||
export default function ErrorNotFound() {
|
|
||||||
return (<>
|
|
||||||
<link rel="canonical" href="https://asimonson.com/404"></link>
|
|
||||||
<Neon color='#fff'><h1 className='neon'>ERROR 404</h1><br /><h3 className='neon'>URL Not Found</h3></Neon>
|
|
||||||
</>)
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import React, { useEffect } from "react";
|
|
||||||
import ChessBed from "../componets/ChessBed.js";
|
|
||||||
|
|
||||||
export default function Home() {
|
|
||||||
const langstyle = {
|
|
||||||
width: "350px",
|
|
||||||
height: "165px",
|
|
||||||
border: "none",
|
|
||||||
display: "block",
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// This will run when the page first loads and whenever the title changes
|
|
||||||
document.title = "Andrew Simonson - Portfolio Home";
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div id="home">
|
|
||||||
<link rel="canonical" href="https://asimonson.com/"></link>
|
|
||||||
<meta
|
|
||||||
name="description"
|
|
||||||
content="Andrew Simonson's Portfolio Website - Homepage"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="homeground">
|
|
||||||
<div className="relative">
|
|
||||||
<div className="flex">
|
|
||||||
<div id="HomeContent" data-aos="fade-up">
|
|
||||||
<h1>Andrew Simonson</h1>
|
|
||||||
<h3>
|
|
||||||
Computer Science student at Rochester Institute of Technology
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="onRight" data-aos="fade-up">
|
|
||||||
<iframe
|
|
||||||
title="langstats"
|
|
||||||
src="./readme-stats-vercel-01-25-2023.svg"
|
|
||||||
style={langstyle}
|
|
||||||
></iframe>
|
|
||||||
<div className="chess">
|
|
||||||
<ChessBed username="asimonson1125"></ChessBed>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,287 +0,0 @@
|
|||||||
import React, { useEffect } from "react";
|
|
||||||
import ProjectList from "../componets/ProjectList";
|
|
||||||
import Project from "../componets/Project";
|
|
||||||
import { toggle } from "../scripts/checkbox";
|
|
||||||
import github from "../assets/icons/github.svg";
|
|
||||||
import globe from "../assets/icons/globe.svg";
|
|
||||||
|
|
||||||
import geovisF from "../assets/photos/geovisF.png";
|
|
||||||
import chessbed from "../assets/photos/chessbed.png";
|
|
||||||
import occupyrit from "../assets/photos/occupyRIT.png";
|
|
||||||
import slate from "../assets/photos/slate.png";
|
|
||||||
import website from "../assets/photos/website.png";
|
|
||||||
import resume from "../assets/photos/resume.png";
|
|
||||||
import yugoslavia from "../assets/photos/ceoOfYugo.png";
|
|
||||||
import vexbutt from "../assets/photos/vexcodeButtons.jpeg";
|
|
||||||
|
|
||||||
export default function Projects() {
|
|
||||||
useEffect(() => {
|
|
||||||
// This will run when the page first loads and whenever the title changes
|
|
||||||
document.title = "Andrew Simonson - Projects";
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="foreground" onLoad={() => toggle('')}>
|
|
||||||
<link rel="canonical" href="https://asimonson.com/projects"></link>
|
|
||||||
<meta
|
|
||||||
name="description"
|
|
||||||
content="Recent projects by Andrew Simonson on his lovely portfolio website :)"
|
|
||||||
/>
|
|
||||||
<div data-aos="fade-up">
|
|
||||||
<h2 className="concentratedHead">Projects</h2>
|
|
||||||
<p>
|
|
||||||
Project status is indicated by the color of the project card:
|
|
||||||
<br />
|
|
||||||
<span className="complete">⬤</span> - Complete
|
|
||||||
<br />
|
|
||||||
<span className="WIP">⬤</span> - Work In Progress
|
|
||||||
<br />
|
|
||||||
<span className="incomplete">⬤</span> - Incomplete
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="checkbox-wrapper">
|
|
||||||
<div className="flex start">
|
|
||||||
<label className="switch" htmlFor="pinned">
|
|
||||||
<input type="checkbox" id="pinned" onClick={() => toggle('')} defaultChecked/>
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Pinned</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div className="flex start">
|
|
||||||
<label className="switch" htmlFor="programming">
|
|
||||||
<input type="checkbox" id="programming" onClick={() => toggle('')} />
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Programming</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div className="flex start">
|
|
||||||
<label className="switch" htmlFor="geospacial" onClick={() => toggle('')}>
|
|
||||||
<input type="checkbox" id="geospacial" />
|
|
||||||
<div className="slider round"></div>
|
|
||||||
<strong>Geospacial</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<ProjectList classes="checkbox-client">
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Lower 48 Alt. Energy Map"
|
|
||||||
bgi={geovisF}
|
|
||||||
classes="pinned geospacial"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://ritarcgis.maps.arcgis.com/apps/dashboards/17d5bda01edc4a2eb6205a4922d889c9",
|
|
||||||
<img alt="ArcGIS" src={globe} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
ArcGIS Map of the most effective alternative energy sources in the
|
|
||||||
continental United States
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="WIP"
|
|
||||||
title="OccupyRIT"
|
|
||||||
classes="pinned programming"
|
|
||||||
bgi={occupyrit}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/Occupy-RIT",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
Collects RIT Gym Occupancy data, determining busiest workout
|
|
||||||
times.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Chesscom Embeds"
|
|
||||||
classes="programming"
|
|
||||||
bgi={chessbed}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/chesscom-embed",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A template for creating Chess.com user profile embeds
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Resume"
|
|
||||||
classes="programming"
|
|
||||||
bgi={resume}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/Resume",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"https://asimonson.com/Resume.pdf/",
|
|
||||||
<img alt="site" src={globe} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
My Resume, made in LaTeX with a custom design derived by the AltaCV
|
|
||||||
template on OverLeaf.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="WIP"
|
|
||||||
title="Digital Portfolio"
|
|
||||||
classes="programming"
|
|
||||||
bgi={website}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/asimonson1125.github.io",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
["https://asimonson.com/", <img alt="site" src={globe} />],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A personal portfolio site made with React.js.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Slate"
|
|
||||||
classes="pinned programming"
|
|
||||||
bgi={slate}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/Slate",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
["https://slate.csh.rit.edu/", <img alt="site" src={globe} />],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
Slate is a web app designed to help event coordinators schedule events
|
|
||||||
by congregating participant calendar data. Includes Computer Science
|
|
||||||
House account integration.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Humans vs. Zombies Bot"
|
|
||||||
classes="programming"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/HvZ-bot",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A Discord bot to handle role management and statistics for RIT's
|
|
||||||
Humans vs. Zombies games.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="WIP"
|
|
||||||
title="FinTech"
|
|
||||||
classes="pinned programming"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/LukeHorigan/Financial-Management-Assocation-",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A team derived from the RIT Financial Management Association dedicated
|
|
||||||
to learning about financial management of equities using automated
|
|
||||||
solutions developed by students.
|
|
||||||
</Project>
|
|
||||||
<Project status="complete" classes="programming" title="Browser Trivia Bot">
|
|
||||||
A tampermonkey tool used to automatically answer and submit online
|
|
||||||
trivia forms, which can be tailored to different site layouts.
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
Source is currently private.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Querist"
|
|
||||||
classes="programming"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/Querist",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A modular discord bot to manage class discord servers divided by class
|
|
||||||
sections. Used in my Web and Mobile 101 class discord server.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="Acumen"
|
|
||||||
classes="programming"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/Acumen",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A personal Discord bot focused on statistical insight and role
|
|
||||||
management for NationsGame, including NG Rolls Sim accessibility.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="NationsGame Rolls Sim"
|
|
||||||
classes="programming"
|
|
||||||
bgi={yugoslavia}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/NG-Rolls-Simulator",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A simulator for the browser game, NationsGame, to analyze unit
|
|
||||||
composition and predict in-game victors and unit statistics.
|
|
||||||
<br />
|
|
||||||
Unfortunately, NationsGame is now defunct. Limited screenshots of
|
|
||||||
functionality.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="incomplete"
|
|
||||||
title="WallCycle"
|
|
||||||
classes="programming"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/WallCycle",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A GNOME extension that cycles through a folder of wallpapers.
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="VEXcode Button Engine"
|
|
||||||
classes="programming"
|
|
||||||
bgi={vexbutt}
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/VEXcode-Button-Generator",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
VEXcode button library + examples and template for the VEX V5 brain
|
|
||||||
</Project>
|
|
||||||
<Project
|
|
||||||
status="complete"
|
|
||||||
title="WinKeylogger"
|
|
||||||
classes="programming"
|
|
||||||
links={[
|
|
||||||
[
|
|
||||||
"https://github.com/asimonson1125/WinKeylogger",
|
|
||||||
<img alt="github" src={github} />,
|
|
||||||
],
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
A C++ keylogger for windows based off a udemy course with my custom
|
|
||||||
modifications and powershell script.
|
|
||||||
</Project>
|
|
||||||
</ProjectList>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
let currentType = "";
|
|
||||||
|
|
||||||
const dict = {
|
|
||||||
'python': {'name': 'Python', 'info': 'Python and shit'},
|
|
||||||
'js': {'name': 'Javascript', 'info': 'JS and shit'},
|
|
||||||
'html': {'name': 'HTML/CSS', 'info': 'also SCSS'},
|
|
||||||
'sql': {'name': 'HTML/CSS', 'info': 'also SCSS'},
|
|
||||||
'cpp': {'name': 'HTML/CSS', 'info': 'also SCSS'},
|
|
||||||
'other': {'name': 'HTML/CSS', 'info': 'also SCSS'},
|
|
||||||
'tools': {'name': 'HTML/CSS', 'info': 'also SCSS'}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function skill(type) {
|
|
||||||
if (currentType === type) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
currentType = type;
|
|
||||||
let disp = document.getElementById("skillDisp");
|
|
||||||
disp.classList = [];
|
|
||||||
let ugh = disp.offsetWidth; // without this delay the animation doesn't begin. idfk.
|
|
||||||
disp.querySelector('h2').textContent = dict[type]['name'];
|
|
||||||
disp.querySelector('p').textContent = dict[type]['info'];
|
|
||||||
disp.classList.add(type);
|
|
||||||
disp.classList.add('swipeIn');
|
|
||||||
return ugh; // gets rid of unused variable warning
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1,8 +1,6 @@
|
|||||||
@import "~react-image-gallery/styles/css/image-gallery.css";
|
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "neon-future";
|
font-family: "neon-future";
|
||||||
src: url("../fonts/Neon\ Future.ttf")
|
src: url("../fonts/Neon Future.ttf")
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
@@ -52,6 +50,14 @@ body {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#defaultCanvas0 {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
position: fixed;
|
||||||
|
z-index: -69;
|
||||||
|
}
|
||||||
|
|
||||||
h1, h2 {
|
h1, h2 {
|
||||||
color: #ecebeb;
|
color: #ecebeb;
|
||||||
}
|
}
|
||||||
@@ -108,9 +114,10 @@ a {
|
|||||||
|
|
||||||
.name {
|
.name {
|
||||||
display: inline;
|
display: inline;
|
||||||
background: url("../../assets/photos/sun.png") 0/5rem no-repeat;
|
background: url("../photos/sun.png") 0/5rem no-repeat;
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
padding-left: 5.5rem;
|
padding-left: 5.5rem;
|
||||||
|
font-size: xx-large;
|
||||||
}
|
}
|
||||||
|
|
||||||
.glitch {
|
.glitch {
|
||||||
@@ -160,6 +167,18 @@ a {
|
|||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.langstats {
|
||||||
|
width: 350px;
|
||||||
|
height: 165px;
|
||||||
|
border: none;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diamonds {
|
||||||
|
background: black;
|
||||||
|
background-image: linear-gradient(rgba(0, 0, 0, .5), rgba(0, 0, 0, .75)), url('../chesscom-embed/diamonds.png');
|
||||||
|
}
|
||||||
|
|
||||||
.concentratedHead {
|
.concentratedHead {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding-right: 4rem;
|
padding-right: 4rem;
|
||||||
@@ -253,10 +272,12 @@ a {
|
|||||||
right: 0;
|
right: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
max-width: 100vw;
|
max-width: 100vw;
|
||||||
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.onRight > * {
|
.onRight>* {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bgi {
|
.bgi {
|
||||||
@@ -447,7 +468,7 @@ a {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.projTitle > * {
|
.projTitle>* {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -637,6 +658,39 @@ a {
|
|||||||
margin: 1em;
|
margin: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.chessRapid::after, .chessBlitz::after, .chessBullet::after, .chessPuzzles::after {
|
||||||
|
font-size: xx-small;
|
||||||
|
float: right;
|
||||||
|
margin-right: 5px;
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chessStat {
|
||||||
|
display: inline;
|
||||||
|
vertical-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chessStat::after {
|
||||||
|
font-size: xx-small;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chessPuzzles::after {
|
||||||
|
content: 'Tactics';
|
||||||
|
}
|
||||||
|
|
||||||
|
.chessBullet::after {
|
||||||
|
content: "Bullet";
|
||||||
|
}
|
||||||
|
|
||||||
|
.chessBlitz::after {
|
||||||
|
content: "Blitz";
|
||||||
|
}
|
||||||
|
|
||||||
|
.chessRapid::after {
|
||||||
|
content: "Rapid";
|
||||||
|
}
|
||||||
|
|
||||||
.bottomtext {
|
.bottomtext {
|
||||||
font-size: x-small;
|
font-size: x-small;
|
||||||
margin: 3px;
|
margin: 3px;
|
||||||
@@ -686,15 +740,7 @@ a {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
justify-content: space-around;
|
||||||
|
|
||||||
.vItem {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vItem p {
|
|
||||||
margin: 0px;
|
|
||||||
display: inline;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.chessIcon {
|
.chessIcon {
|
||||||
@@ -735,17 +781,17 @@ a {
|
|||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeline-item{
|
.timeline-item {
|
||||||
border-left: solid #AAAAAA 3px;
|
border-left: solid #AAAAAA 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeline-item h2{
|
.timeline-item h2 {
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
margin-left: .5em;
|
margin-left: .5em;
|
||||||
font-family: robotoreg;
|
font-family: robotoreg;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeline-item p{
|
.timeline-item p {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
padding-bottom: 2em;
|
padding-bottom: 2em;
|
||||||
padding-left: 3em;
|
padding-left: 3em;
|
||||||
@@ -837,6 +883,7 @@ a {
|
|||||||
.onRight {
|
.onRight {
|
||||||
position: unset;
|
position: unset;
|
||||||
margin-top: 3rem;
|
margin-top: 3rem;
|
||||||
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.col {
|
.col {
|
||||||
1
src/static/css/head.css
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.line:not(:first-child){position:absolute;top:0;left:0}.line:nth-child(1){animation:clip 6000ms -600ms linear infinite,glitch1 2500ms -333ms linear infinite}@keyframes glitch1{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(-1px);color:#4E9A26}98%{transform:translateX(-1px);color:#AC1212}99%{transform:translateX(4px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(2){animation:clip 6000ms -1200ms linear infinite,glitch2 2500ms -129ms linear infinite}@keyframes glitch2{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(0px);color:#4E9A26}98%{transform:translateX(-4px);color:#AC1212}99%{transform:translateX(0px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(3){animation:clip 6000ms -1800ms linear infinite,glitch3 2500ms -458ms linear infinite}@keyframes glitch3{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(-2px);color:#4E9A26}98%{transform:translateX(-2px);color:#AC1212}99%{transform:translateX(-3px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(4){animation:clip 6000ms -2400ms linear infinite,glitch4 2500ms -490ms linear infinite}@keyframes glitch4{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(-4px);color:#4E9A26}98%{transform:translateX(-1px);color:#AC1212}99%{transform:translateX(-2px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(5){animation:clip 6000ms -3000ms linear infinite,glitch5 2500ms -53ms linear infinite}@keyframes glitch5{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(0px);color:#4E9A26}98%{transform:translateX(4px);color:#AC1212}99%{transform:translateX(-3px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(6){animation:clip 6000ms -3600ms linear infinite,glitch6 2500ms -710ms linear infinite}@keyframes glitch6{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(-1px);color:#4E9A26}98%{transform:translateX(-4px);color:#AC1212}99%{transform:translateX(5px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(7){animation:clip 6000ms -4200ms linear infinite,glitch7 2500ms -450ms linear infinite}@keyframes glitch7{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(3px);color:#4E9A26}98%{transform:translateX(0px);color:#AC1212}99%{transform:translateX(0px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(8){animation:clip 6000ms -4800ms linear infinite,glitch8 2500ms -696ms linear infinite}@keyframes glitch8{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(2px);color:#4E9A26}98%{transform:translateX(2px);color:#AC1212}99%{transform:translateX(-3px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(9){animation:clip 6000ms -5400ms linear infinite,glitch9 2500ms -595ms linear infinite}@keyframes glitch9{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(4px);color:#4E9A26}98%{transform:translateX(2px);color:#AC1212}99%{transform:translateX(2px);color:#fff}100%{transform:translateX(0)}}.line:nth-child(10){animation:clip 6000ms -6000ms linear infinite,glitch10 2500ms -479ms linear infinite}@keyframes glitch10{0%{transform:translateX(0)}96%{transform:translateX(0);color:#fff}97%{transform:translateX(-4px);color:#4E9A26}98%{transform:translateX(3px);color:#AC1212}99%{transform:translateX(-1px);color:#fff}100%{transform:translateX(0)}}@keyframes clip{0%{clip-path:polygon(0 100%, 100% 100%, 100% 120%, 0 120%)}100%{clip-path:polygon(0 -20%, 100% -20%, 100% 0%, 0 0)}}
|
||||||
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
0
src/assets/fonts/Starixo.otf → src/static/fonts/Starixo.otf
Executable file → Normal file
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 759 B After Width: | Height: | Size: 759 B |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 683 B After Width: | Height: | Size: 683 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 764 B After Width: | Height: | Size: 764 B |
@@ -1,4 +1,4 @@
|
|||||||
export function toggle(dir) {
|
function toggle(dir) {
|
||||||
let toggles = document.querySelectorAll(
|
let toggles = document.querySelectorAll(
|
||||||
".checkbox-wrapper input[type=checkbox]"
|
".checkbox-wrapper input[type=checkbox]"
|
||||||
);
|
);
|
||||||
40
src/static/js/chessbed.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
async function addChessEmbed(username) {
|
||||||
|
let user, stats;
|
||||||
|
try {
|
||||||
|
user = await fetch(`https://api.chess.com/pub/player/${username}`);
|
||||||
|
stats = await fetch(`https://api.chess.com/pub/player/${username}/stats`);
|
||||||
|
} catch (e) {
|
||||||
|
setChess({cName:"Chess.com request failed"});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (user.status === 200) {
|
||||||
|
user = await user.json();
|
||||||
|
stats = await stats.json();
|
||||||
|
ratings = {
|
||||||
|
rapid: stats.chess_rapid.last.rating,
|
||||||
|
blitz: stats.chess_blitz.last.rating,
|
||||||
|
bullet: stats.chess_bullet.last.rating,
|
||||||
|
tactics: stats.tactics.highest.rating,
|
||||||
|
}
|
||||||
|
setChess({cName:user["username"],pic:user.avatar,ratings:ratings});
|
||||||
|
} else if (user === null || user.status === 403 || user.status === null) {
|
||||||
|
chessSet({cName:"Chess.com request failed"});
|
||||||
|
} else {
|
||||||
|
chessSet({cName:"User Not Found"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setChess({cName = null, pic = null, ratings = null}) {
|
||||||
|
if (cName) {
|
||||||
|
document.querySelector(".chessName").textContent = cName;
|
||||||
|
}
|
||||||
|
if (pic) {
|
||||||
|
document.querySelector(".chessImage").src = pic;
|
||||||
|
}
|
||||||
|
if (ratings) {
|
||||||
|
document.querySelector(".chessRapid .chessStat").textContent = ratings.rapid;
|
||||||
|
document.querySelector(".chessBlitz .chessStat").textContent = ratings.blitz;
|
||||||
|
document.querySelector(".chessBullet .chessStat").textContent = ratings.bullet;
|
||||||
|
document.querySelector(".chessPuzzles .chessStat").textContent = ratings.tactics;
|
||||||
|
}
|
||||||
|
}
|
||||||
92
src/static/js/idler.js
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
const balls = [];
|
||||||
|
const density = 0.00003;
|
||||||
|
let screenWidth = window.innerWidth + 10;
|
||||||
|
let screenHeight = window.innerHeight + 10;
|
||||||
|
|
||||||
|
class Ball {
|
||||||
|
constructor(x, y, size, speed, angle) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.size = size;
|
||||||
|
this.speed = speed;
|
||||||
|
this.angle = angle;
|
||||||
|
this.calcChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
calcChange() {
|
||||||
|
this.xSpeed = this.speed * Math.sin((this.angle * Math.PI) / 180);
|
||||||
|
this.ySpeed = this.speed * Math.cos((this.angle * Math.PI) / 180);
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
this.x += this.xSpeed;
|
||||||
|
this.y += this.ySpeed;
|
||||||
|
if (this.x > screenWidth) {
|
||||||
|
this.x -= screenWidth;
|
||||||
|
} else if (this.x < 0) {
|
||||||
|
this.x += screenWidth;
|
||||||
|
}
|
||||||
|
if (this.y > screenHeight) {
|
||||||
|
this.y -= screenHeight;
|
||||||
|
} else if (this.y < 0) {
|
||||||
|
this.y += screenHeight;
|
||||||
|
}
|
||||||
|
this.draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
draw() {
|
||||||
|
stroke(200, 100);
|
||||||
|
strokeWeight(2);
|
||||||
|
fill(0);
|
||||||
|
ellipse(this.x, this.y, this.size, this.size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
frameRate(15);
|
||||||
|
const pix = screenHeight * screenWidth;
|
||||||
|
createCanvas(screenWidth, screenHeight);
|
||||||
|
for (let i = 0; i < pix * density; i++) {
|
||||||
|
let thisBall = new Ball(
|
||||||
|
random(screenWidth),
|
||||||
|
random(screenHeight),
|
||||||
|
random(6) + 3,
|
||||||
|
Math.exp(random(4) + 3) / 1000 + 1,
|
||||||
|
random(360)
|
||||||
|
);
|
||||||
|
balls.push(thisBall);
|
||||||
|
}
|
||||||
|
|
||||||
|
stroke(255);
|
||||||
|
}
|
||||||
|
|
||||||
|
function windowResized() {
|
||||||
|
screenWidth = window.innerWidth + 10;
|
||||||
|
screenHeight = window.innerHeight + 10;
|
||||||
|
resizeCanvas(screenWidth, screenHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
background(32);
|
||||||
|
|
||||||
|
for (let i = 0; i < balls.length; i++) {
|
||||||
|
balls[i].update();
|
||||||
|
}
|
||||||
|
for (let i = 0; i < balls.length - 1; i++) {
|
||||||
|
for (let j = i + 1; j < balls.length; j++) {
|
||||||
|
let distance = dist(balls[i].x, balls[i].y, balls[j].x, balls[j].y);
|
||||||
|
if (distance < 100){
|
||||||
|
stroke(150);
|
||||||
|
line(balls[i].x, balls[i].y, balls[j].x, balls[j].y);
|
||||||
|
}
|
||||||
|
else if (distance < 150) {
|
||||||
|
stroke(100);
|
||||||
|
let chance = 0.3 ** (((random(0.2) + 0.8) * distance) / 150);
|
||||||
|
if (chance < 0.5) {
|
||||||
|
stroke(50);
|
||||||
|
}
|
||||||
|
line(balls[i].x, balls[i].y, balls[j].x, balls[j].y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -74,7 +74,7 @@ function scrollFunction() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function toggleMenu() {
|
function toggleMenu() {
|
||||||
if (window.innerWidth < 1200) {
|
if (window.innerWidth < 1200) {
|
||||||
const e = document.querySelector(".navControl");
|
const e = document.querySelector(".navControl");
|
||||||
const bar = document.querySelector(".header");
|
const bar = document.querySelector(".header");
|
||||||
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 813 KiB After Width: | Height: | Size: 813 KiB |
|
Before Width: | Height: | Size: 898 KiB After Width: | Height: | Size: 898 KiB |
|
Before Width: | Height: | Size: 463 KiB After Width: | Height: | Size: 463 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 829 KiB After Width: | Height: | Size: 829 KiB |
|
Before Width: | Height: | Size: 549 KiB After Width: | Height: | Size: 549 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 546 B After Width: | Height: | Size: 546 B |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 247 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 453 KiB After Width: | Height: | Size: 453 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
11
src/templates/error.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{% extends "header.html" %} {% block content %}
|
||||||
|
<div class="fPage">
|
||||||
|
<div class="heightBox">
|
||||||
|
<div class="neonBox">
|
||||||
|
<h1 class="neon">ERROR {{error}}</h1>
|
||||||
|
<br /><br />
|
||||||
|
<h3 class="neon">{{message}}</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
108
src/templates/header.html
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#000000" />
|
||||||
|
<meta name="description" content="{{ description }}" />
|
||||||
|
<meta property="og:title" content="Andrew Simonson" />
|
||||||
|
<!-- <meta property="og:type" content="article" /> -->
|
||||||
|
<meta
|
||||||
|
property="og:description"
|
||||||
|
content="Digital Portfolio - Andrew Simonson"
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
property="og:image"
|
||||||
|
content="{{ url_for('static', filename='photos/sun.png') }}"
|
||||||
|
/>
|
||||||
|
<meta property="og:url" content="https://asimonson.com" />
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta property="og:site_name" content="Andrew Simonson - Portfolio" />
|
||||||
|
<meta name="twitter:image:alt" content="some example picture idk" />
|
||||||
|
|
||||||
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||||
|
<script
|
||||||
|
async
|
||||||
|
src="https://www.googletagmanager.com/gtag/js?id=G-E2V93W9CNV"
|
||||||
|
></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag() {
|
||||||
|
dataLayer.push(arguments);
|
||||||
|
}
|
||||||
|
gtag("js", new Date());
|
||||||
|
|
||||||
|
gtag("config", "G-E2V93W9CNV");
|
||||||
|
</script>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="{{ url_for('static', filename='css/App.css') }}"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="{{ url_for('static', filename='css/checkbox.css') }}"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="{{ url_for('static', filename='css/head.css') }}"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://asimonson.com/{{ canonical }}" />
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/p5@1.4.1/lib/p5.js"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/idler.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/checkbox.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/responsive.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/chessbed.js') }}"></script>
|
||||||
|
<title>{{ title }}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<!-- https://jinja.palletsprojects.com/en/3.1.x/templates/#include -->
|
||||||
|
<div class="App">
|
||||||
|
<div class="header">
|
||||||
|
|
||||||
|
<a href="/">
|
||||||
|
<div id="name-container">
|
||||||
|
<div class="glitch">
|
||||||
|
{% for i in range(9) %}
|
||||||
|
<div class="line name">
|
||||||
|
<span class="textGrad">Andrew Simonson</span>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<img
|
||||||
|
src="{{ url_for('static', filename='icons/menu.svg')}}"
|
||||||
|
alt="menu"
|
||||||
|
id="menu"
|
||||||
|
onClick="toggleMenu()"
|
||||||
|
/>
|
||||||
|
<div class="navControl">
|
||||||
|
<div class="navBar">
|
||||||
|
<div class="navElement">
|
||||||
|
<a href="/">Home</a>
|
||||||
|
</div>
|
||||||
|
<div class="navElement">
|
||||||
|
<a href="Resume.pdf" target="_blank"> Resume </a>
|
||||||
|
</div>
|
||||||
|
<div class="navElement">
|
||||||
|
<a href="/projects">Projects</a>
|
||||||
|
</div>
|
||||||
|
<!-- <a href="/activities">Activities</a> -->
|
||||||
|
<div class="navElement">
|
||||||
|
<a href="/about">About Me</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<!-- <Socials /> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="root">{% block content %}{% endblock %}</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
23
src/templates/home.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{% extends "header.html" %} {% block content %}
|
||||||
|
<div class="homeground">
|
||||||
|
<div class="relative">
|
||||||
|
<div class="flex">
|
||||||
|
<div id="HomeContent" data-aos="fade-up">
|
||||||
|
<h1>Andrew Simonson</h1>
|
||||||
|
<h3>Computer Science student at Rochester Institute of Technology</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="onRight" data-aos="fade-up">
|
||||||
|
<iframe
|
||||||
|
title="langstats"
|
||||||
|
src="{{ url_for('static', filename='readme-stats-vercel-01-25-2023.svg') }}"
|
||||||
|
class="langstats"
|
||||||
|
></iframe>
|
||||||
|
<div class="chess">
|
||||||
|
{% from 'partials/chess.html' import chess %}
|
||||||
|
{{ chess('asimonson1125') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
41
src/templates/partials/chess.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{% macro chess(username) %}
|
||||||
|
<div class="black">
|
||||||
|
<div
|
||||||
|
id="chessProfile"
|
||||||
|
class="diamonds"
|
||||||
|
onClick="window.top.location.href = 'https://chess.com/member/{{ username }}'"
|
||||||
|
>
|
||||||
|
<div class="identity chessInfo">
|
||||||
|
<div class="pfpContainer">
|
||||||
|
<div>
|
||||||
|
<img class="pfp chessImage" src='{{ url_for('static',
|
||||||
|
filename='chesscom-embed/default.svg') }}' alt={{ username }} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h5 class="chessName">Loading...</h5>
|
||||||
|
</div>
|
||||||
|
<div class="vContainer chessInfo">
|
||||||
|
<div class="vItem chessRapid">
|
||||||
|
<div class="chessIcon rapid">Ἓ</div>
|
||||||
|
<div class="chessStat"></div>
|
||||||
|
</div>
|
||||||
|
<div class="vItem chessBlitz">
|
||||||
|
<div class="chessIcon blitz">Ἔ</div>
|
||||||
|
<div class="chessStat"></div>
|
||||||
|
</div>
|
||||||
|
<div class="vItem chessBullet">
|
||||||
|
<div class="chessIcon bullet">Ἕ</div>
|
||||||
|
<div class="chessStat"></div>
|
||||||
|
</div>
|
||||||
|
<div class="vItem chessPuzzles">
|
||||||
|
<div class="chessIcon puzzles">ἕ</div>
|
||||||
|
<div class="chessStat"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bottomtext">Chess.com Stat Embed by Andrew Simonson</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
addChessEmbed("{{ username }}");
|
||||||
|
</script>
|
||||||
|
{%- endmacro %}
|
||||||