├── public ├── favicon.ico ├── katherine.jpg └── vercel.svg ├── postcss.config.js ├── README.md ├── .prettierrc ├── pages ├── api │ └── hello.js ├── projects.js ├── _app.js ├── index.js └── about.js ├── .gitignore ├── tailwind.config.js ├── package.json ├── hooks └── useLocalStorage.js └── components └── layout.js /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octokatherine/personal-website/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/katherine.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octokatherine/personal-website/HEAD/public/katherine.jpg -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | My personal website, built with Next.js. 2 | 3 | You can visit the deployed site [here](https://katherineoelsner.com) 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true, 6 | "printWidth": 100 7 | } 8 | -------------------------------------------------------------------------------- /pages/api/hello.js: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | 3 | export default (req, res) => { 4 | res.status(200).json({ name: 'John Doe' }) 5 | } 6 | -------------------------------------------------------------------------------- /pages/projects.js: -------------------------------------------------------------------------------- 1 | import Layout from '../components/layout' 2 | 3 | export default function Projects() { 4 | return ( 5 | 6 |
projects
7 |
8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import 'tailwindcss/tailwind.css' 2 | import { AnimateSharedLayout } from 'framer-motion' 3 | 4 | function MyApp({ Component, pageProps }) { 5 | return ( 6 | 7 | 8 | 9 | ) 10 | } 11 | 12 | export default MyApp 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require('tailwindcss/colors') 2 | 3 | module.exports = { 4 | purge: ['./pages/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}'], 5 | darkMode: 'class', // or 'media' or 'class' 6 | theme: { 7 | extend: {}, 8 | colors: { 9 | lightBlue: colors.lightBlue, 10 | blue: colors.blue, 11 | gray: colors.gray, 12 | blueGray: colors.blueGray, 13 | white: colors.white, 14 | pink: colors.pink, 15 | }, 16 | }, 17 | variants: { 18 | extend: {}, 19 | }, 20 | plugins: [], 21 | } 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "personal-website", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "@fortawesome/fontawesome-free": "^5.15.2", 12 | "@fortawesome/fontawesome-svg-core": "^1.2.34", 13 | "@fortawesome/free-brands-svg-icons": "^5.15.2", 14 | "@fortawesome/free-solid-svg-icons": "^5.15.2", 15 | "@fortawesome/react-fontawesome": "^0.1.14", 16 | "dark-mode-toggle-animation": "^1.0.0", 17 | "framer-motion": "^3.6.2", 18 | "next": "11.1.3", 19 | "react": "17.0.1", 20 | "react-dom": "17.0.1" 21 | }, 22 | "devDependencies": { 23 | "autoprefixer": "^10.2.4", 24 | "postcss": "^8.2.6", 25 | "tailwindcss": "^2.0.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import Layout from '../components/layout' 2 | import { motion } from 'framer-motion' 3 | 4 | export default function Home() { 5 | return ( 6 | 7 | 14 |
15 | Katherine 16 |

17 | KATHERINE OELSNER 18 |

19 |
20 |

SENIOR SOFTWARE ENGINEER

21 |
22 |
23 |
24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /pages/about.js: -------------------------------------------------------------------------------- 1 | import Layout from '../components/layout' 2 | import { motion } from 'framer-motion' 3 | 4 | export default function About() { 5 | return ( 6 | 7 | 14 |
15 | Hi, I'm Katherine! I am a Senior Software Engineer at GitHub with a passion for developing web and mobile 16 | applications that make a positive impact on peoples lives. 17 |
18 |
19 | In addition to coding and learning new tech, I enjoy rock climbing, drinking coffee, 20 | playing guitar, reading, and hanging with my dog. If any of these things interest you too, 21 | I'd love to chat! 22 |
23 |
24 |
25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /hooks/useLocalStorage.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react' 2 | 3 | export function useLocalStorage(key, initialValue) { 4 | // State to store our value 5 | // Pass initial state function to useState so logic is only executed once 6 | const [storedValue, setStoredValue] = useState(() => { 7 | try { 8 | // Get from local storage by key 9 | const item = window.localStorage.getItem(key) 10 | 11 | return item ? item : initialValue 12 | } catch (error) { 13 | // If error also return initialValue 14 | console.log(error) 15 | return initialValue 16 | } 17 | }) 18 | 19 | // Return a wrapped version of useState's setter function that ... 20 | // ... persists the new value to localStorage. 21 | const setValue = (value) => { 22 | try { 23 | // Allow value to be a function so we have same API as useState 24 | const valueToStore = value instanceof Function ? value(storedValue) : value 25 | // Save state 26 | setStoredValue(valueToStore) 27 | // Save to local storage 28 | window.localStorage.setItem(key, JSON.stringify(valueToStore)) 29 | } catch (error) { 30 | // A more advanced implementation would handle the error case 31 | console.log(error) 32 | } 33 | } 34 | 35 | return [storedValue, setValue] 36 | } 37 | -------------------------------------------------------------------------------- /components/layout.js: -------------------------------------------------------------------------------- 1 | import { AnimatePresence, motion } from 'framer-motion' 2 | import { faDev, faGithub, faLinkedinIn, faTwitter } from '@fortawesome/free-brands-svg-icons' 3 | 4 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' 5 | import Head from 'next/head' 6 | import Link from 'next/link' 7 | import dynamic from 'next/dynamic' 8 | import { faPencilAlt } from '@fortawesome/free-solid-svg-icons' 9 | import { useEffect } from 'react' 10 | import { useLocalStorage } from '../hooks/useLocalStorage' 11 | 12 | const DarkModeToggle = dynamic(() => import('dark-mode-toggle-animation'), { ssr: false }) 13 | 14 | export default function Layout({ children }) { 15 | const [theme, setTheme] = useLocalStorage('theme', 'light') 16 | 17 | useEffect(() => { 18 | if ( 19 | localStorage.theme === 'dark' || 20 | (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches) 21 | ) { 22 | document.getElementsByTagName('html')[0].classList.add('dark') 23 | } else { 24 | document.getElementsByTagName('html')[0].classList.remove('dark') 25 | } 26 | }, []) 27 | 28 | useEffect(() => { 29 | if (theme == 'dark') { 30 | document.getElementsByTagName('html')[0].classList.add('dark') 31 | localStorage.theme = 'dark' 32 | } else { 33 | document.getElementsByTagName('html')[0].classList.remove('dark') 34 | localStorage.theme = 'light' 35 | } 36 | }, [theme]) 37 | 38 | const toggleDarkMode = () => { 39 | if (theme == 'dark') { 40 | setTheme('light') 41 | } else { 42 | setTheme('dark') 43 | } 44 | } 45 | 46 | return ( 47 |
48 | 49 | Katherine Oelsner 50 | 51 | 52 | 53 |
57 |
58 | 66 |
67 | 68 | 69 | 72 | 73 | 74 | 77 | 78 | 79 | 83 | {children} 84 | 85 | 86 | 91 | 92 | 93 | 98 | 99 | 100 | 105 | 106 | 107 | 108 |
109 |
110 | ) 111 | } 112 | --------------------------------------------------------------------------------