diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 15f1d65..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - extends: [ - 'plugin:vue/essential', - '@vue/standard' - ], - parserOptions: { - parser: 'babel-eslint' - }, - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' - }, - overrides: [ - { - files: [ - '**/__tests__/*.{j,t}s?(x)', - '**/tests/unit/**/*.spec.{j,t}s?(x)' - ], - env: { - jest: true - } - } - ] -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b58a71..0813681 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,42 +1,42 @@ -name: test, build and deploy site -on: [push] -jobs: - cypress-run: - runs-on: ubuntu-latest - steps: - - name: checkout - uses: actions/checkout@v3 - - name: run e2e tests - uses: cypress-io/github-action@v5 - with: - start: npm run ci:e2e - env: - CYPRESS_baseUrl: http://localhost:8080/ - - uses: actions/upload-artifact@v3 - if: failure() - with: - name: cypress-screenshots - path: ./cypress/videos/ - build: - needs: cypress-run - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/main' - steps: - - uses: actions/checkout@v3 - - name: setup node - uses: actions/setup-node@v3 - with: - node-version: '18.x' - cache: 'npm' - - name: build for static hosting - run: | - npm install - npm run docs:build - touch docs/.vitepress/dist/.nojekyll # https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/ - - name: deploy the site - uses: crazy-max/ghaction-github-pages@v2 - with: - build_dir: docs/.vitepress/dist/ - fqdn: ${{ secrets.SITE_FQDN }} - env: - GH_PAT: ${{ secrets.DEPLOYMENT_PAT }} +# name: test, build and deploy site +# on: [push] +# jobs: +# cypress-run: +# runs-on: ubuntu-latest +# steps: +# - name: checkout +# uses: actions/checkout@v3 +# - name: run e2e tests +# uses: cypress-io/github-action@v5 +# with: +# start: npm run ci:e2e +# env: +# CYPRESS_baseUrl: http://localhost:8080/ +# - uses: actions/upload-artifact@v3 +# if: failure() +# with: +# name: cypress-screenshots +# path: ./cypress/videos/ +# build: +# needs: cypress-run +# runs-on: ubuntu-latest +# if: github.ref == 'refs/heads/main' +# steps: +# - uses: actions/checkout@v3 +# - name: setup node +# uses: actions/setup-node@v3 +# with: +# node-version: '18.x' +# cache: 'npm' +# - name: build for static hosting +# run: | +# npm install +# npm run docs:build +# touch docs/.vitepress/dist/.nojekyll # https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/ +# - name: deploy the site +# uses: crazy-max/ghaction-github-pages@v2 +# with: +# build_dir: docs/.vitepress/dist/ +# fqdn: ${{ secrets.SITE_FQDN }} +# env: +# GH_PAT: ${{ secrets.DEPLOYMENT_PAT }} diff --git a/.gitignore b/.gitignore index 49eb00b..8651177 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,39 @@ -.DS_Store -node_modules -/dist +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -/tests/e2e/videos/ -/tests/e2e/screenshots/ +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz +# testing +/coverage -# local env files -.env.local -.env.*.local +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem -# Log files +# debug npm-debug.log* yarn-debug.log* yarn-error.log* -pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts # Editor directories and files .idea @@ -25,24 +44,11 @@ pnpm-debug.log* *.sln *.sw? -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# cypress -cypress/videos/ - -# latex build output -public/*.aux -public/*.out -public/*.log - # python __pycache__ - -# vite build -docs/.vitepress/dist/ -docs/.vitepress/cache/ +# Stores VSCode versions used for testing VSCode extensions +.vscode-test # cypress cypress/videos diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7f62b1f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "vuejs: chrome", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}/src", + "breakOnLoad": true, + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + } + }, + { + "type": "firefox", + "request": "launch", + "name": "vuejs: firefox", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}/src", + "pathMappings": [ + { + "url": "webpack:///src/", + "path": "${webRoot}/" + } + ] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/README.md b/README.md index dfeff23..627f5ac 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,55 @@ -# clintp.xyz - my bio site  ![test, build and deploy site](https://github.com/yuhonas/clintp.xyz/workflows/test,%20build%20and%20deploy%20site/badge.svg) - -![Site Preview](./gh-site-preview.avif) +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). ## Getting Started -This is a simple one page bio site that uses [vitepress](https://vitepress.dev/) with some basic CI/CD using [github actions](./.github/workflows/ci.yml) and a resume built using [latex](https://www.latex-project.org/) - -### Prerequisites - -### Site - -* Node.js 18.x +First, run the development server: -### Installing - -Install all our dependencies - -``` -$ npm install +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev ``` -## Development +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -To run a local web server for development +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. -``` -$ npm run docs:dev -``` +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. -## Running the tests +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. -### End-to-end tests -``` -npm run ci:e2e -``` +## Learn More -## Building the site +To learn more about Next.js, take a look at the following resources: -To build a static website for hosting - -``` -npm run docs:build -``` +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. -## Deployment +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +## Deploy on Vercel -This site is automatically built and deployed by [github actions](https://github.com/actions) to [Github Pages](https://pages.github.com/) +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. -## Building the resume - -My resume is built using [latex](https://www.latex-project.org/) - -![picture of latex envy](./gh-latexenvy.png) - -### Dependencies - -You will need [ basictex ](https://tug.org/mactex/morepackages.html) installed in order to produce a pdf -or (what ever format you want) - -Install basictex using homebrew - -``` -$ brew install basictex +## Top repos +```bash +curl -L \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/users/yuhonas/repos | jq '[sort_by(.stargazers_count) | reverse | limit(4; .[])]' ``` -The following packages are utilised in the latex document and will also need to be installed via latex's package manager +## TODO +Add timeline - https://matplotlib.org/stable/gallery/lines_bars_and_markers/timeline.html -``` -$ tlmgr install moresize raleway ly1 fontawesome -``` - -To export it to pdf - -``` -$ npm resume:export -``` +## Links +* https://github.com/gauravghongde/social-icons +* https://www.svgrepo.com/svg/342086/open-source-initiative diff --git a/cypress/e2e/site.cy.js b/cypress/e2e/site.cy.js index f8268b5..974bf6b 100644 --- a/cypress/e2e/site.cy.js +++ b/cypress/e2e/site.cy.js @@ -1,41 +1,54 @@ /// -context('site', () => { +context("site", () => { beforeEach(() => { - cy.visit('/') - }) - - it('should have the correct meta title', () => { - cy.title().should('eq', 'clintp.xyz | my bio in two mouse clicks or less') - }) - - it('should have the correct meta description', () => { - cy.document().get('head meta[name="description"]') - .should('have.attr', 'content', 'my bio in two mouse clicks or less') - }) - - it('should have the correct opening page title', () => { - cy.get('h1').contains('clintp.xyz') - }) - - it('should have my email address somewhere so I can be contacted', () => { - cy.contains('hello@clintp.xyz') - }) - - it('should have a working link to my resume', () => { - cy.get('a').contains('Resume').should('have.attr', 'href', '/Resume_ClintPlummer_ENMR.pdf').then(($anchor) => { - cy.request($anchor.attr('href')).its('status').should('eq', 200) - }) - }) - - it('should have a working link to my ipynb', () => { - cy.get('a').contains('ipynb').should('have.attr', 'href', 'https://github.com/yuhonas/clintp.xyz/blob/main/docs/public/Resume_ClintPlummer_ENMR.ipynb').then(($anchor) => { - cy.request($anchor.attr('href')).its('status').should('eq', 200) - }) - }) - - it('should have a link to my linkedin', () => { - cy.get('a').contains('Linked-In').should('have.attr', 'href', 'https://www.linkedin.com/in/clint-plummer/') - }) - -}) + cy.visit("/"); + }); + + it("should have the correct meta title", () => { + cy.title().should("eq", "clintp.xyz | my bio in two mouse clicks or less"); + }); + + it("should have the correct meta description", () => { + cy.document() + .get('head meta[name="description"]') + .should("have.attr", "content", "my bio in two mouse clicks or less"); + }); + + it("should have the correct opening page title", () => { + cy.get("h1").contains("clintp.xyz"); + }); + + it("should have my email address somewhere so I can be contacted", () => { + cy.contains("hello@clintp.xyz"); + }); + + it("should have a working link to my resume", () => { + cy.get("a[href='/resume.clintp.docx']") + .should("exist") + .then(($anchor) => { + cy.request($anchor.attr("href")).its("status").should("eq", 200); + }); + }); + + // it("should have a working link to my ipynb", () => { + // cy.get("a") + // .contains("ipynb") + // .should( + // "have.attr", + // "href", + // "https://github.com/yuhonas/clintp.xyz/blob/main/docs/public/Resume_ClintPlummer_ENMR.ipynb" + // ) + // .then(($anchor) => { + // cy.request($anchor.attr("href")).its("status").should("eq", 200); + // }); + // }); + + it("should have a working link to my linkedin", () => { + cy.get("a[href='https://www.linkedin.com/in/clint-plummer/']") + .should("exist") + .then(($anchor) => { + cy.request($anchor.attr("href")).its("status").should("eq", 200); + }); + }); +}); diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js deleted file mode 100644 index 6cdf2d6..0000000 --- a/docs/.vitepress/config.js +++ /dev/null @@ -1,20 +0,0 @@ -import { defineConfig } from 'vitepress' - -// https://vitepress.dev/reference/site-config -export default defineConfig({ - head: [ - ['link', { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Fira+Code:400,700&display=swap' }], - ['link', { rel: 'icon', href: '/favicon.svg', type: 'image/svg+xml' }], - ['link', { rel: 'apple-touch-icon', href: '/apple-touch-icon.png', sizes: '180x180' }], - ['link', { rel: 'icon', href: '/favicon-32x32.png', type: 'image/png', sizes: '32x32' }], - ['link', { rel: 'icon', href: '/favicon-16x16.png', type: 'image/png', sizes: '16x16' }], - ['link', { rel: 'manifest', href: '/site.webmanifest' }], - ['link', { rel: 'mask-icon', href: '/safari-pinned-tab.svg' }], - ], - title: "clintp.xyz", - titleTemplate: 'clintp.xyz | :title', - description: "my bio in two mouse clicks or less", - themeConfig: { - // https://vitepress.dev/reference/default-theme-config - } -}) diff --git a/docs/public/Resume_ClintPlummer_ENMR-2020.docx b/docs/public/Resume_ClintPlummer_ENMR-2020.docx deleted file mode 100644 index 432b3df..0000000 Binary files a/docs/public/Resume_ClintPlummer_ENMR-2020.docx and /dev/null differ diff --git a/docs/public/Resume_ClintPlummer_ENMR.out b/docs/public/Resume_ClintPlummer_ENMR.out deleted file mode 100644 index e69de29..0000000 diff --git a/docs/public/developercv.cls b/docs/public/developercv.cls deleted file mode 100644 index 08fe9a0..0000000 --- a/docs/public/developercv.cls +++ /dev/null @@ -1,206 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Developer CV -% LaTeX Class -% Version 1.0 (28/1/19) -% -% This class originates from: -% http://www.LaTeXTemplates.com -% -% Authors: -% Jan Vorisek (jan@vorisek.me) -% Based on a template by Jan Küster (info@jankuester.com) -% Modified for LaTeX Templates by Vel (vel@LaTeXTemplates.com) -% -% License: -% The MIT License (see included LICENSE file) -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%---------------------------------------------------------------------------------------- -% CLASS CONFIGURATION -%---------------------------------------------------------------------------------------- - -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{developercv}[2019/01/28 Developer CV class v1.0] - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{extarticle}} % Pass through any options to the base class -\ProcessOptions\relax % Process given options - -\LoadClass{extarticle} % Load the base class - -%---------------------------------------------------------------------------------------- -% PACKAGES AND OTHER DOCUMENT CONFIGURATIONS -%---------------------------------------------------------------------------------------- - -\setlength{\parindent}{0mm} % Suppress paragraph indentation - -\usepackage[hidelinks]{hyperref} % Required for links but hide the default boxes around links - -\newcommand{\lorem}{Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus.} % Dummy text - -\pagestyle{empty} % No headers or footers - -\usepackage{moresize} % Provides more font size commands (\HUGE and \ssmall) - -%---------------------------------------------------------------------------------------- -% PAGE LAYOUT -%---------------------------------------------------------------------------------------- - -\usepackage{geometry} % Required for adjusting page dimensions and margins - -\geometry{ - paper=a4paper, % Paper size, change to letterpaper for US letter size - top=1.75cm, % Top margin - bottom=1.75cm, % Bottom margin - left=2cm, % Left margin - right=2cm, % Right margin - headheight=0.75cm, % Header height - footskip=1cm, % Space from the bottom margin to the baseline of the footer - headsep=0.5cm, % Space from the top margin to the baseline of the header - %showframe, % Uncomment to show how the type block is set on the page -} - -%---------------------------------------------------------------------------------------- -% FONTS -%---------------------------------------------------------------------------------------- - -\usepackage[utf8]{inputenc} % Required for inputting international characters -\usepackage[T1]{fontenc} % Output font encoding for international characters - -\usepackage[default]{raleway} -%\usepackage[defaultsans]{droidsans} -%\usepackage{cmbright} -%\usepackage{fetamont} -%\usepackage[default]{gillius} -%\usepackage{roboto} - -\renewcommand*\familydefault{\sfdefault} % Force the sans-serif version of any font used - -%------------------------------------------------ - -\usepackage{fontawesome} % Required for FontAwesome icons - -% Command to output an icon in a black square box with text to the right -\newcommand{\icon}[3]{% The first parameter is the FontAwesome icon name, the second is the box size and the third is the text - \vcenteredhbox{\colorbox{black}{\makebox(#2, #2){\textcolor{white}{\large\csname fa#1\endcsname}}}}% Icon and box - \hspace{0.2cm}% Whitespace - \vcenteredhbox{\textcolor{black}{#3}}% Text -} - -%---------------------------------------------------------------------------------------- -% GRAPHICS DEFINITIONS -%---------------------------------------------------------------------------------------- - -\usepackage{tikz} % Required for creating the plots -\usetikzlibrary{shapes, backgrounds} -\tikzset{x=1cm, y=1cm} % Default tikz units - -% Command to vertically centre adjacent content -\newcommand{\vcenteredhbox}[1]{% The only parameter is for the content to centre - \begingroup% - \setbox0=\hbox{#1}\parbox{\wd0}{\box0}% - \endgroup% -} - -%---------------------------------------------------------------------------------------- -% CHARTS -%---------------------------------------------------------------------------------------- - -\newcounter{barcount} - -% Environment to hold a new bar chart -\newenvironment{barchart}[1]{ % The only parameter is the maximum bar width, in cm - \newcommand{\barwidth}{0.35} - \newcommand{\barsep}{0.2} - - % Command to add a bar to the bar chart - \newcommand{\baritem}[2]{ % The first argument is the bar label and the second is the percentage the current bar should take up of the total width - \pgfmathparse{##2} - \let\perc\pgfmathresult - - \pgfmathparse{#1} - \let\barsize\pgfmathresult - - \pgfmathparse{\barsize*##2/100} - \let\barone\pgfmathresult - - \pgfmathparse{(\barwidth*\thebarcount)+(\barsep*\thebarcount)} - \let\barx\pgfmathresult - - \filldraw[fill=black, draw=none] (0,-\barx) rectangle (\barone,-\barx-\barwidth); - - \node [label=180:\colorbox{black}{\textcolor{white}{##1}}] at (0,-\barx-0.175) {}; - \addtocounter{barcount}{1} - } - \begin{tikzpicture} - \setcounter{barcount}{0} -}{ - \end{tikzpicture} -} - -%------------------------------------------------ - -\newcounter{a} -\newcounter{b} -\newcounter{c} - -% Command to output a number of automatically-sized bubbles from a string in the format of '/