rest of react file
23
.gitignore
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/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*
|
||||
70
README.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# Getting Started with Create React App
|
||||
|
||||
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
||||
|
||||
## Available Scripts
|
||||
|
||||
In the project directory, you can run:
|
||||
|
||||
### `npm start`
|
||||
|
||||
Runs the app in the development mode.\
|
||||
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
||||
|
||||
The page will reload if you make edits.\
|
||||
You will also see any lint errors in the console.
|
||||
|
||||
### `npm test`
|
||||
|
||||
Launches the test runner in the interactive watch mode.\
|
||||
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
|
||||
|
||||
### `npm run build`
|
||||
|
||||
Builds the app for production to the `build` folder.\
|
||||
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||
|
||||
The build is minified and the filenames include the hashes.\
|
||||
Your app is ready to be deployed!
|
||||
|
||||
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
||||
|
||||
### `npm run eject`
|
||||
|
||||
**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
|
||||
|
||||
If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
|
||||
|
||||
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
|
||||
|
||||
You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
|
||||
|
||||
## Learn More
|
||||
|
||||
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||
|
||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||
|
||||
### Code Splitting
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
|
||||
|
||||
### Analyzing the Bundle Size
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
|
||||
|
||||
### Making a Progressive Web App
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
|
||||
|
||||
### Advanced Configuration
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
|
||||
|
||||
### Deployment
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
|
||||
|
||||
### `npm run build` fails to minify
|
||||
|
||||
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
|
||||
2
node_modules/.cache/.eslintcache
generated
vendored
17467
package-lock.json
generated
Normal file
41
package.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "react-scss2",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@testing-library/jest-dom": "^5.14.1",
|
||||
"@testing-library/react": "^11.2.7",
|
||||
"@testing-library/user-event": "^12.8.3",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-scripts": "4.0.3",
|
||||
"web-vitals": "^1.1.2"
|
||||
},
|
||||
"scripts": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"node-sass": "^6.0.1"
|
||||
}
|
||||
}
|
||||
54
src/App.js
Normal file
@@ -0,0 +1,54 @@
|
||||
// import logo from './logo.svg';
|
||||
import React from 'react';
|
||||
|
||||
import './App.scss';
|
||||
import Nav from './components/Nav';
|
||||
import Profile from './components/Profile';
|
||||
import Projects from './components/Projects';
|
||||
import Footer from './components/Footer';
|
||||
|
||||
function App() {
|
||||
const [darkMode, setDarkMode] = React.useState(false);
|
||||
|
||||
React.useEffect(() => {
|
||||
const json = localStorage.getItem('lerko96-dark-mode');
|
||||
const currentMode = JSON.parse(json);
|
||||
if (currentMode) {
|
||||
setDarkMode(true);
|
||||
} else {
|
||||
setDarkMode(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (darkMode) {
|
||||
document.body.classList.add('dark');
|
||||
} else {
|
||||
document.body.classList.remove('dark');
|
||||
}
|
||||
const json = JSON.stringify(darkMode);
|
||||
localStorage.setItem('lerko96-dark-mode', json);
|
||||
}, [darkMode]);
|
||||
|
||||
return (
|
||||
<div className='App'>
|
||||
<div class='app__wrapper'>
|
||||
<Nav />
|
||||
<div class='switch-container'>
|
||||
<label class='switch-wrap'>
|
||||
<input
|
||||
type='checkbox'
|
||||
onClick={() => setDarkMode(!darkMode)}
|
||||
/>
|
||||
<div class='switch'></div>
|
||||
</label>
|
||||
</div>
|
||||
<Profile />
|
||||
<Projects />
|
||||
<Footer />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
7
src/App.scss
Normal file
@@ -0,0 +1,7 @@
|
||||
@import './styles/mixins.scss';
|
||||
@import './styles/variables.scss';
|
||||
@import './styles/base.scss';
|
||||
@import './styles/animations.scss';
|
||||
|
||||
@import './styles/components.scss'
|
||||
|
||||
8
src/App.test.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import App from './App';
|
||||
|
||||
test('renders learn react link', () => {
|
||||
render(<App />);
|
||||
const linkElement = screen.getByText(/learn react/i);
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
});
|
||||
35
src/components/Footer.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import React from 'react';
|
||||
|
||||
const Footer = () => (
|
||||
<footer>
|
||||
<span class='copyright'>© 2021 Tyler Koenig</span>
|
||||
<div class='foot__links'>
|
||||
<a
|
||||
href='https://github.com/lerko96'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
title='github'
|
||||
>
|
||||
<i class='fa fa-github fa-2x' aria-hidden='true'></i>
|
||||
</a>
|
||||
<a
|
||||
href='https://www.linkedin.com/in/tyler-koenig-72607a18b/'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
title='LinkedIn'
|
||||
>
|
||||
<i class='fa fa-linkedin-square fa-2x' aria-hidden='true'></i>
|
||||
</a>
|
||||
<a
|
||||
href='mailto:tylerkng96@icloud.com'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
title='email'
|
||||
>
|
||||
<i class='fa fa-envelope-o fa-2x' aria-hidden='true'></i>
|
||||
</a>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
|
||||
export default Footer;
|
||||
42
src/components/Nav.js
Normal file
@@ -0,0 +1,42 @@
|
||||
import React from 'react';
|
||||
|
||||
const Nav = () => (
|
||||
<header>
|
||||
<nav>
|
||||
<div id='logo'>
|
||||
<a href='index.html'>tk</a>
|
||||
</div>
|
||||
<div id='nav__list'>
|
||||
<ul>
|
||||
{/* <li id='nav__contact'>
|
||||
<a href='#contact' target='_self'>
|
||||
CONTACT
|
||||
</a>
|
||||
</li> */}
|
||||
<li>
|
||||
<a href='#profile' target='_self'>
|
||||
PROFILE
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='#projects' target='_self'>
|
||||
PROJECTS
|
||||
</a>
|
||||
</li>
|
||||
{/* <li>
|
||||
<button onClick={() => setDarkMode(!darkMode)}>
|
||||
Toggle Dark Mode
|
||||
</button>
|
||||
</li> */}
|
||||
{/* <li>
|
||||
<a href='#skills' target='_self'>
|
||||
SKILLS
|
||||
</a>
|
||||
</li> */}
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
);
|
||||
|
||||
export default Nav;
|
||||
96
src/components/Profile.js
Normal file
@@ -0,0 +1,96 @@
|
||||
import React from 'react';
|
||||
|
||||
import headshot from '../images/headshot-tyler_koenig.png';
|
||||
|
||||
// function Greet() {
|
||||
// return <p>Hello TK</p>
|
||||
// }
|
||||
|
||||
const Profile = () => (
|
||||
<section id='profile'>
|
||||
<article class='profile__card'>
|
||||
<div class='card__img'>
|
||||
<img id='headshot' src={headshot} alt='tyler' />
|
||||
</div>
|
||||
<div class='card__bio'>
|
||||
<div class='bio__name'>
|
||||
<a href='index.html'>TYLER KOENIG</a>
|
||||
</div>
|
||||
<div class='bio__desc'>
|
||||
<p>SOFTWARE DEVELOPER</p>
|
||||
</div>
|
||||
<div class='bio__contacts' id='contact'>
|
||||
<a
|
||||
href='https://www.linkedin.com/in/tyler-koenig-72607a18b/'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
title='LinkedIn'
|
||||
>
|
||||
<i
|
||||
class='fa fa-linkedin-square fa-2x'
|
||||
aria-hidden='true'
|
||||
></i>
|
||||
</a>
|
||||
<a
|
||||
href='https://github.com/lerko96'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
title='github'
|
||||
>
|
||||
<i class='fa fa-github fa-2x' aria-hidden='true'></i>
|
||||
</a>
|
||||
<a
|
||||
href='mailto:tylerkng96@icloud.com'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
title='email'
|
||||
>
|
||||
<i
|
||||
class='fa fa-envelope-o fa-2x'
|
||||
aria-hidden='true'
|
||||
></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<article class='profile__about'>
|
||||
<h2>about</h2>
|
||||
<p>
|
||||
Full-Stack Java Developer, with a focus on Front-End
|
||||
Development. I graduated with an Associate of Arts from Lorain
|
||||
County Community College in Spring of 2018. I began building
|
||||
HTML, CSS and JavaScript projects by the Summer of 2020 from
|
||||
courses provided on Udemy. I received my Certificate in Software
|
||||
Development from We Can Code IT in Fall of 2021. Thanks to the
|
||||
courses I've taken, I have developed strong skills needed for
|
||||
working in remote team environments, and ones that utilize Scrum
|
||||
and Agile practices. My passion comes from seeing ideas be
|
||||
brought to life. Let's get to work.
|
||||
</p>
|
||||
</article>
|
||||
<article class='profile__skills' id='skills'>
|
||||
<h2>skills</h2>
|
||||
<ul>
|
||||
<li>Java</li>
|
||||
<li>Spring</li>
|
||||
<li>MVC</li>
|
||||
<li>JavaScript</li>
|
||||
<li>JSON</li>
|
||||
<li>Restful APIs</li>
|
||||
<li>Test Driven Development</li>
|
||||
<li>Relational Databases</li>
|
||||
<li>Git</li>
|
||||
<li>Agile/ Scrum</li>
|
||||
<li>HTML</li>
|
||||
<li>CSS</li>
|
||||
<li>SCSS</li>
|
||||
<li>React</li>
|
||||
<li>Responsive Design</li>
|
||||
<li>Thymeleaf</li>
|
||||
{/* <li>Object Oriented Programming</li> */}
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
);
|
||||
|
||||
export default Profile;
|
||||
287
src/components/Projects.js
Normal file
@@ -0,0 +1,287 @@
|
||||
import React from 'react';
|
||||
|
||||
import wereHooked from '../images/were-hooked.png';
|
||||
import donutClicker from '../images/donut-clicker.png';
|
||||
import mysteryEducator from '../images/mystery-educator.png';
|
||||
import trekkingSite from '../images/trek.png';
|
||||
// import reviewSite from '../images/review-site.png';
|
||||
|
||||
const Projects = () => (
|
||||
<section id='projects'>
|
||||
<h2>projects</h2>
|
||||
|
||||
<article class='project'>
|
||||
<a
|
||||
class='project__img_link'
|
||||
href='https://github.com/lerko96/were-hooked-repo'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
<img
|
||||
src={wereHooked}
|
||||
class='project__img'
|
||||
alt='were-hooked-img'
|
||||
/>
|
||||
</a>
|
||||
<div class='project__text'>
|
||||
<h3 class='project__title'>
|
||||
<a
|
||||
href='https://github.com/lerko96/were-hooked-repo'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
We're Hooked
|
||||
</a>
|
||||
</h3>
|
||||
<div class='project__subtitle_small'>
|
||||
<time datetime='2021-08-20 12:00:00'>
|
||||
<i class='fa fa-calendar mr-2'></i>Fri, August 20th 2021
|
||||
</time>
|
||||
</div>
|
||||
<div class='project__bar'></div>
|
||||
<div class='project__info'>
|
||||
<p>
|
||||
Designed, built and tested an MVC application that
|
||||
allows users to discover fishing locations in Ohio, as
|
||||
well as teach beginners how to get started fishing and
|
||||
the current regulations that are needed to follow. This
|
||||
project was built between a team of five in a completely
|
||||
remote environment with the help of Github, Zoom and
|
||||
Slack.
|
||||
</p>
|
||||
</div>
|
||||
<ul class='project__tagbox'>
|
||||
<li class='tag__item'>Java</li>
|
||||
<li class='tag__item'>Spring</li>
|
||||
<li class='tag__item'>JavaScript</li>
|
||||
<li class='tag__item'>Restful API</li>
|
||||
<li class='tag__item'>Thymeleaf</li>
|
||||
<li class='tag__item'>HTML</li>
|
||||
<li class='tag__item'>CSS</li>
|
||||
<li class='tag__item'>Responsive Design</li>
|
||||
{/* <li class='tag__item'>TDD</li> */}
|
||||
{/* <li class='tag__item'>VS Code</li> */}
|
||||
<li class='tag__item'>Git</li>
|
||||
<li class='tag__item'>Agile</li>
|
||||
<li class='tag__item'>Scrum</li>
|
||||
<li class='tag__item'>Zoom</li>
|
||||
<li class='tag__item'>Slack</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
<article class='project'>
|
||||
<a
|
||||
class='project__img_link'
|
||||
href='https://github.com/lerko96/mystery-educator'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
<img class='project__img' src={mysteryEducator} alt='' />
|
||||
</a>
|
||||
<div class='project__text'>
|
||||
<h3 class='project__title'>
|
||||
<a
|
||||
href='https://github.com/lerko96/mystery-educator'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
Mystery Educator
|
||||
</a>
|
||||
</h3>
|
||||
<div class='project__subtitle_small'>
|
||||
<time datetime='2021-07-23 12:00:00'>
|
||||
<i class='fas fa-calendar-alt mr-2'></i>Fri, July 23rd
|
||||
2021
|
||||
</time>
|
||||
</div>
|
||||
<div class='project__bar'></div>
|
||||
<div class='project__info'>
|
||||
<p>
|
||||
Designed, built and tested a single page application
|
||||
that renders unique data from the MET Museum and NASA
|
||||
APIs each time you visit. We also built a local backend
|
||||
database to store historical information. This project
|
||||
was built between a team of four in a completely remote
|
||||
environemnt with the help of Github, Zoom, and Slack.
|
||||
</p>
|
||||
</div>
|
||||
<ul class='project__tagbox'>
|
||||
<li class='tag__item'>JavaScript</li>
|
||||
|
||||
<li class='tag__item'>Node.js</li>
|
||||
<li class='tag__item'>Spring</li>
|
||||
<li class='tag__item'>RESTful APIs</li>
|
||||
<li class='tag__item'>Java</li>
|
||||
<li class='tag__item'>HTML</li>
|
||||
<li class='tag__item'>CSS</li>
|
||||
<li class='tag__item'>Responsive Design</li>
|
||||
{/* <li class='tag__item'>TDD</li> */}
|
||||
{/* <li class='tag__item'>VS Code</li> */}
|
||||
<li class='tag__item'>Git</li>
|
||||
<li class='tag__item'>Agile</li>
|
||||
<li class='tag__item'>Scrum</li>
|
||||
<li class='tag__item'>Zoom</li>
|
||||
<li class='tag__item'>Slack</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
<article class='project'>
|
||||
<a
|
||||
class='project__img_link'
|
||||
href='https://github.com/lerko96/donut-clicker-lerko96'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
<img
|
||||
class='project__img'
|
||||
src={donutClicker}
|
||||
alt='donut-clicker-img'
|
||||
/>
|
||||
</a>
|
||||
<div class='project__text'>
|
||||
<h3 class='project__title'>
|
||||
<a
|
||||
href='https://github.com/lerko96/donut-clicker-lerko96'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
Donut Clicker
|
||||
</a>
|
||||
</h3>
|
||||
<div class='project__subtitle_small'>
|
||||
<time datetime='2021-07-09 12:00:00'>
|
||||
<i class='fas fa-calendar-alt mr-2'></i>Fri, July 9th
|
||||
2021
|
||||
</time>
|
||||
</div>
|
||||
<div class='project__bar'></div>
|
||||
<div class='project__info'>
|
||||
<p>
|
||||
Designed, built and tested a single page application
|
||||
that lets users make virtual donuts via clicking. Once
|
||||
enough donuts are made you have the ability to purchase
|
||||
upgrades such as auto-clickers and clicking-multipliers.
|
||||
</p>
|
||||
</div>
|
||||
<ul class='project__tagbox'>
|
||||
<li class='tag__item'>JavaScript</li>
|
||||
<li class='tag__item'>Node.js</li>
|
||||
<li class='tag__item'>HTML</li>
|
||||
<li class='tag__item'>CSS</li>
|
||||
<li class='tag__item'>Responsive Design</li>
|
||||
<li class='tag__item'>TDD</li>
|
||||
{/* <li class='tag__item'>VS Code</li> */}
|
||||
<li class='tag__item'>Git</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
<article class='project'>
|
||||
<a
|
||||
class='project__img_link'
|
||||
href='https://github.com/lerko96/trek'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
<img
|
||||
class='project__img'
|
||||
src={trekkingSite}
|
||||
alt='trekking-img'
|
||||
/>
|
||||
</a>
|
||||
<div class='project__text'>
|
||||
<h3 class='project__title'>
|
||||
<a
|
||||
href='https://github.com/lerko96/trek'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
Trekking Site
|
||||
</a>
|
||||
</h3>
|
||||
<div class='project__subtitle_small'>
|
||||
<time datetime='2021-06-18 12:00:00'>
|
||||
<i class='fas fa-calendar-alt mr-2'></i>Fri, June 18th
|
||||
2021
|
||||
</time>
|
||||
</div>
|
||||
<div class='project__bar'></div>
|
||||
<div class='project__info'>
|
||||
<p>
|
||||
Designed, built and tested an MVC application that lets
|
||||
users discover treks located by continent, region and
|
||||
type. This project was built between a team of four in a
|
||||
completely remote environemnt with the help of Github,
|
||||
Zoom and Slack.
|
||||
</p>
|
||||
</div>
|
||||
<ul class='project__tagbox'>
|
||||
<li class='tag__item'>Java</li>
|
||||
<li class='tag__item'>Spring</li>
|
||||
{/* <li class='tag__item'>OOP</li> */}
|
||||
<li class='tag__item'>HTML</li>
|
||||
<li class='tag__item'>CSS</li>
|
||||
<li class='tag__item'>Responsive Design</li>
|
||||
<li class='tag__item'>TDD</li>
|
||||
{/* <li class='tag__item'>IntelliJ</li> */}
|
||||
<li class='tag__item'>Git</li>
|
||||
<li class='tag__item'>Agile</li>
|
||||
<li class='tag__item'>Scrum</li>
|
||||
<li class='tag__item'>Zoom</li>
|
||||
<li class='tag__item'>Slack</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
{/* <article class='project'>
|
||||
<a
|
||||
class='project__img_link'
|
||||
href='https://github.com/lerko96/reviews-mvc'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
<img
|
||||
class='project__img'
|
||||
src={reviewSite}
|
||||
alt='review-site-img'
|
||||
/>
|
||||
</a>
|
||||
<div class='project__text'>
|
||||
<h3 class='project__title'>
|
||||
<a
|
||||
href='https://github.com/lerko96/reviews-mvc'
|
||||
rel='noreferrer'
|
||||
target='_blank'
|
||||
>
|
||||
Movie Reviews
|
||||
</a>
|
||||
</h3>
|
||||
<div class='project__subtitle_small'>
|
||||
<time datetime='2021-06-04 12:00:00'>
|
||||
<i class='fas fa-calendar-alt mr-2'></i>Fri, June 4th
|
||||
2021
|
||||
</time>
|
||||
</div>
|
||||
<div class='project__bar'></div>
|
||||
<div class='project__info'>
|
||||
<p>
|
||||
Designed, built and tested a Java application for movie
|
||||
reviews.
|
||||
</p>
|
||||
</div>
|
||||
<ul class='project__tagbox'>
|
||||
<li class='tag__item'>Java</li>
|
||||
<li class='tag__item'>SpringJPA</li>
|
||||
<li class='tag__item'>OOP</li>
|
||||
<li class='tag__item'>Thymeleaf</li>
|
||||
<li class='tag__item'>HTML</li>
|
||||
<li class='tag__item'>CSS</li>
|
||||
<li class='tag__item'>Responsive Design</li>
|
||||
<li class='tag__item'>TDD</li>
|
||||
<li class='tag__item'>IntelliJ</li>
|
||||
<li class='tag__item'>Github</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article> */}
|
||||
</section>
|
||||
);
|
||||
|
||||
export default Projects;
|
||||
BIN
src/images/amok.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
src/images/donut-clicker.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
src/images/headshot-tyler_koenig.png
Normal file
|
After Width: | Height: | Size: 1001 KiB |
BIN
src/images/mystery-educator.png
Normal file
|
After Width: | Height: | Size: 526 KiB |
BIN
src/images/pet.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
src/images/profile.png
Normal file
|
After Width: | Height: | Size: 488 KiB |
BIN
src/images/review-site.png
Normal file
|
After Width: | Height: | Size: 394 KiB |
BIN
src/images/shelter.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
src/images/trek.png
Normal file
|
After Width: | Height: | Size: 4.2 MiB |
BIN
src/images/were-hooked.png
Normal file
|
After Width: | Height: | Size: 829 KiB |
13
src/index.css
Normal file
@@ -0,0 +1,13 @@
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
||||
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||
sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
|
||||
monospace;
|
||||
}
|
||||
22
src/index.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
import reportWebVitals from './reportWebVitals';
|
||||
|
||||
|
||||
|
||||
ReactDOM.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>,
|
||||
document.getElementById('root')
|
||||
);
|
||||
|
||||
|
||||
|
||||
// If you want to start measuring performance in your app, pass a function
|
||||
// to log results (for example: reportWebVitals(console.log))
|
||||
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
||||
reportWebVitals();
|
||||
|
||||
1
src/logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
13
src/reportWebVitals.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const reportWebVitals = onPerfEntry => {
|
||||
if (onPerfEntry && onPerfEntry instanceof Function) {
|
||||
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
|
||||
getCLS(onPerfEntry);
|
||||
getFID(onPerfEntry);
|
||||
getFCP(onPerfEntry);
|
||||
getLCP(onPerfEntry);
|
||||
getTTFB(onPerfEntry);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default reportWebVitals;
|
||||
5
src/setupTests.js
Normal file
@@ -0,0 +1,5 @@
|
||||
// jest-dom adds custom jest matchers for asserting on DOM nodes.
|
||||
// allows you to do things like:
|
||||
// expect(element).toHaveTextContent(/react/i)
|
||||
// learn more: https://github.com/testing-library/jest-dom
|
||||
import '@testing-library/jest-dom';
|
||||
73
src/styles/animations.scss
Normal file
@@ -0,0 +1,73 @@
|
||||
.App {
|
||||
@include respond-below(xs) {
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
animation: appScale 500ms alternate 1 ease forwards;
|
||||
}
|
||||
@keyframes appScale {
|
||||
from {
|
||||
transform: scale(1.09);
|
||||
}
|
||||
to {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#headshot {
|
||||
@include respond-above(xs) {
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
// animation: App-logo-spin 1 1250ms ease-in-out;
|
||||
animation: appScale 333ms alternate 3 ease forwards;
|
||||
}
|
||||
|
||||
// @keyframes App-logo-spin {
|
||||
// from {
|
||||
// transform: rotateY(0deg);
|
||||
// }
|
||||
// to {
|
||||
// transform: rotateY(360deg);
|
||||
// }
|
||||
// }
|
||||
|
||||
@keyframes appScale {
|
||||
from {
|
||||
transform: scale(1);
|
||||
}
|
||||
to {
|
||||
transform: scale(1.4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.profile__about,
|
||||
.profile__skills,
|
||||
#projects {
|
||||
@include respond-below(xs) {
|
||||
animation: lowerApp 1000ms normal 1 ease-out backwards;
|
||||
@keyframes lowerApp {
|
||||
from {
|
||||
transform: translateY(300px);
|
||||
}
|
||||
to {
|
||||
transform: translateY(0px);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bio__contacts {
|
||||
animation: fadeInAnimation ease-out 2000ms;
|
||||
animation-iteration-count: 1;
|
||||
animation-fill-mode: forwards;
|
||||
|
||||
@keyframes fadeInAnimation {
|
||||
0% {
|
||||
opacity: 0.1;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
120
src/styles/base.scss
Normal file
@@ -0,0 +1,120 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
body {
|
||||
background: $white2;
|
||||
color: $black;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-weight: $fw-4;
|
||||
text-align: start;
|
||||
text-rendering: optimizeLegibility;
|
||||
transition: background 0.2s linear;
|
||||
a {
|
||||
color: $black;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
.dark {
|
||||
background: $black2;
|
||||
color: $color-light;
|
||||
|
||||
#logo {
|
||||
a {
|
||||
color: $green;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
color: $color-green;
|
||||
}
|
||||
|
||||
.profile__card {
|
||||
.card__img {
|
||||
#headshot {
|
||||
border: 3px solid $grey3;
|
||||
}
|
||||
}
|
||||
}
|
||||
.project {
|
||||
background: $black;
|
||||
color: $white;
|
||||
box-shadow: 0 7px 30px -10px rgba(150, 170, 180, 0.2);
|
||||
|
||||
.project__title a {
|
||||
color: $white;
|
||||
}
|
||||
|
||||
.project__info {
|
||||
color: $white;
|
||||
}
|
||||
|
||||
@include respond-above(sm) {
|
||||
.project__title a {
|
||||
color: $grey3;
|
||||
}
|
||||
|
||||
.project__info {
|
||||
color: $grey3;
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.project__bar {
|
||||
background-color: $grey4;
|
||||
}
|
||||
.project__title a {
|
||||
color: $white;
|
||||
}
|
||||
.project__info {
|
||||
color: $white;
|
||||
}
|
||||
}
|
||||
.project__tagbox {
|
||||
.tag__item {
|
||||
background: $grey4;
|
||||
:hover {
|
||||
background: $grey2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.App {
|
||||
margin: 0 auto;
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
@include respond-above(xs) {
|
||||
// margin: 0 1rem;
|
||||
max-width: 990px;
|
||||
}
|
||||
}
|
||||
|
||||
.app__wrapper {
|
||||
margin: auto 1rem;
|
||||
}
|
||||
|
||||
header {
|
||||
line-height: 1.7;
|
||||
// margin: 0 1rem;
|
||||
padding-top: 30px;
|
||||
min-height: 150px;
|
||||
}
|
||||
|
||||
// .wrapper_main {
|
||||
// // margin: 0 1rem;
|
||||
// // max-width: 768px;
|
||||
// }
|
||||
424
src/styles/components.scss
Normal file
@@ -0,0 +1,424 @@
|
||||
nav {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
#logo {
|
||||
font-size: $fs-xl;
|
||||
font-weight: $fw-7;
|
||||
letter-spacing: 0.2rem;
|
||||
margin-left: 8px;
|
||||
a {
|
||||
color: $grey2;
|
||||
}
|
||||
a:hover {
|
||||
color: $black2;
|
||||
}
|
||||
}
|
||||
#nav__list {
|
||||
text-align: end;
|
||||
font-weight: $fw-5;
|
||||
font-size: 0.8rem;
|
||||
letter-spacing: 0.02rem;
|
||||
}
|
||||
a {
|
||||
color: $black2;
|
||||
}
|
||||
a:hover {
|
||||
background-color: $green;
|
||||
color: $black;
|
||||
transition: $transition-hl;
|
||||
}
|
||||
}
|
||||
|
||||
.switch-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.switch-wrap {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 25px;
|
||||
cursor: pointer;
|
||||
background: $grey;
|
||||
padding: $sw-padding;
|
||||
width: $sw-width;
|
||||
height: $sw-height;
|
||||
border-radius: $sw-height / 2;
|
||||
input {
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.switch {
|
||||
height: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: 0fr 1fr 1fr;
|
||||
transition: 0.2s;
|
||||
//ICYMI, pseudo elements are treated as grid items
|
||||
&::after {
|
||||
content: '';
|
||||
border-radius: 50%;
|
||||
background: #ccc;
|
||||
grid-column: 2;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
}
|
||||
|
||||
input:checked {
|
||||
+ .switch {
|
||||
grid-template-columns: 1fr 1fr 0fr;
|
||||
&::after {
|
||||
background-color: $green2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#profile {
|
||||
// min-height: 80vh;
|
||||
h2 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.profile__card {
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
|
||||
.card__img {
|
||||
margin-bottom: 8px;
|
||||
|
||||
#headshot {
|
||||
height: 125px;
|
||||
width: 125px;
|
||||
border: 3px solid $black2;
|
||||
border-radius: 50%;
|
||||
box-shadow: $shadow-360;
|
||||
}
|
||||
}
|
||||
|
||||
.card__bio {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
transition: padding-top 800ms ease;
|
||||
|
||||
.bio__name {
|
||||
line-height: 0.9em;
|
||||
font-size: $fs-xl;
|
||||
font-weight: $fw-7;
|
||||
|
||||
a {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.bio__desc {
|
||||
margin: 8px auto 14px;
|
||||
font-weight: $fw-6;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.bio__contacts {
|
||||
width: 125px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
|
||||
a {
|
||||
color: $grey4;
|
||||
margin: 0;
|
||||
|
||||
&:hover {
|
||||
color: $grey2;
|
||||
transition: $transition-hl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include respond-above(xs) {
|
||||
padding-top: 36px;
|
||||
}
|
||||
@include respond-below(xs) {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.profile__about {
|
||||
margin: 2em auto;
|
||||
line-height: 1.8em;
|
||||
max-width: 764px;
|
||||
|
||||
@include respond-above(xs) {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 30px;
|
||||
}
|
||||
|
||||
@include respond-above(sm) {
|
||||
// margin: 2em 3rem;
|
||||
}
|
||||
transition: padding-top 800ms ease;
|
||||
}
|
||||
|
||||
.profile__skills {
|
||||
ul {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
li {
|
||||
border: 1px solid $color-grey;
|
||||
border-radius: 2px;
|
||||
padding: 4px 12px;
|
||||
margin: 5px 3px;
|
||||
}
|
||||
|
||||
@include respond-above(xs) {
|
||||
margin: 0 auto;
|
||||
max-width: 613px;
|
||||
}
|
||||
}
|
||||
|
||||
#projects {
|
||||
padding: 70px 0 60px;
|
||||
|
||||
h2 {
|
||||
display: none;
|
||||
color: $color-grey;
|
||||
font-size: $fs-xl;
|
||||
}
|
||||
|
||||
// @include respond-above(sm) {
|
||||
// max-width: 990px;
|
||||
// margin: 3rem auto;
|
||||
// }
|
||||
}
|
||||
|
||||
.project {
|
||||
flex-wrap: wrap;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
box-shadow: $shadow-360;
|
||||
border-radius: 10px;
|
||||
margin: 3rem auto;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
// max-width: 800px;
|
||||
|
||||
a,
|
||||
a:hover {
|
||||
color: $color-dark;
|
||||
}
|
||||
|
||||
h3,
|
||||
.h3 {
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: $weight-heavy;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.project__subtitle_small {
|
||||
font-size: 80%;
|
||||
i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.project__title {
|
||||
font-size: 1.75rem;
|
||||
a {
|
||||
transition: color 0.1s ease;
|
||||
transition: background 250ms ease-in-out;
|
||||
}
|
||||
|
||||
:hover {
|
||||
background: $color-green;
|
||||
}
|
||||
}
|
||||
.project__img {
|
||||
max-height: 180px;
|
||||
width: 100%;
|
||||
object-fit: cover;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.project__img_link {
|
||||
display: contents;
|
||||
}
|
||||
|
||||
.project__bar {
|
||||
width: 50px;
|
||||
height: 8px;
|
||||
margin: 10px 0;
|
||||
border-radius: 5px;
|
||||
background-color: $color-lgrey;
|
||||
transition: background-color 0.1s ease;
|
||||
transition: width 0.2s ease;
|
||||
}
|
||||
|
||||
.project__text {
|
||||
padding: 1.5rem;
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
// background: $color-light;
|
||||
}
|
||||
|
||||
.project__info {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
text-align: justify;
|
||||
height: 100%;
|
||||
color: $color-dark;
|
||||
transition: color 0.1s ease;
|
||||
}
|
||||
|
||||
.project__tagbox {
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
font-size: 14px;
|
||||
margin: 20px 0 0 0;
|
||||
padding: 0;
|
||||
justify-content: center;
|
||||
|
||||
.tag__item {
|
||||
display: inline-block;
|
||||
background: $color-lgrey;
|
||||
color: $color-dark;
|
||||
border-radius: 3px;
|
||||
padding: 5px 10px;
|
||||
margin: 0 5px 5px 0;
|
||||
cursor: default;
|
||||
user-select: none;
|
||||
transition: background 0.1s ease-in-out;
|
||||
transition: color 0.05s ease-out;
|
||||
|
||||
&:hover {
|
||||
background: $color-grey;
|
||||
color: $color-light;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
opacity: 1;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.project__bar {
|
||||
width: 100px;
|
||||
background-color: $color-grey;
|
||||
}
|
||||
|
||||
.project__title {
|
||||
a {
|
||||
color: $color-dark;
|
||||
}
|
||||
}
|
||||
|
||||
.project__info {
|
||||
color: $color-dark;
|
||||
}
|
||||
}
|
||||
|
||||
@include respond-above(sm) {
|
||||
flex-wrap: inherit;
|
||||
|
||||
a {
|
||||
color: $color-grey;
|
||||
}
|
||||
|
||||
.project__title {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.project__tagbox {
|
||||
justify-content: start;
|
||||
}
|
||||
|
||||
.project__img {
|
||||
max-width: 250px;
|
||||
max-height: 100%;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
.project__text {
|
||||
padding: 3rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.project__info {
|
||||
color: $color-grey;
|
||||
}
|
||||
|
||||
.media.project__text:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: -20%;
|
||||
height: 130%;
|
||||
width: 55px;
|
||||
}
|
||||
|
||||
&:hover .project__img {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
&:nth-child(2n + 1) {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
&:nth-child(2n + 0) {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
&:nth-child(2n + 1) .project__text::before {
|
||||
left: -12px !important;
|
||||
transform: rotate(4deg);
|
||||
}
|
||||
|
||||
&:nth-child(2n + 0) .project__text::before {
|
||||
right: -12px !important;
|
||||
transform: rotate(-4deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
text-align: center;
|
||||
justify-content: center;
|
||||
margin: 0 auto;
|
||||
// height: 200px;
|
||||
max-width: 500px;
|
||||
.foot__links {
|
||||
// border: 1px solid yellow;
|
||||
font-size: 2rem;
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
margin-bottom: 50px;
|
||||
a {
|
||||
color: $green2;
|
||||
|
||||
:hover {
|
||||
color: $green3;
|
||||
}
|
||||
}
|
||||
}
|
||||
.copyright {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
66
src/styles/mixins.scss
Normal file
@@ -0,0 +1,66 @@
|
||||
// A map of breakpoints.
|
||||
$breakpoints: (
|
||||
xs: 576px,
|
||||
sm: 768px,
|
||||
md: 992px,
|
||||
lg: 1200px,
|
||||
);
|
||||
|
||||
// RESPOND ABOVE
|
||||
//––––––––––––––––––––––––––––––––––––––––––––––––––
|
||||
// @include respond-above(sm) {}
|
||||
@mixin respond-above($breakpoint) {
|
||||
// If the breakpoint exists in the map.
|
||||
@if map-has-key($breakpoints, $breakpoint) {
|
||||
// Get the breakpoint value.
|
||||
$breakpoint-value: map-get($breakpoints, $breakpoint);
|
||||
// Write the media query.
|
||||
@media (min-width: $breakpoint-value) {
|
||||
@content;
|
||||
}
|
||||
// If the breakpoint doesn't exist in the map.
|
||||
} @else {
|
||||
// Log a warning.
|
||||
@warn 'Invalid breakpoint: #{$breakpoint}.';
|
||||
}
|
||||
}
|
||||
|
||||
// RESPOND BELOW
|
||||
// ––––––––––––––––––––––––––––––––––––––––––––––––––
|
||||
// @include respond-below(sm) {}
|
||||
@mixin respond-below($breakpoint) {
|
||||
@if map-has-key($breakpoints, $breakpoint) {
|
||||
$breakpoint-value: map-get($breakpoints, $breakpoint);
|
||||
|
||||
@media (max-width: ($breakpoint-value - 1)) {
|
||||
@content;
|
||||
}
|
||||
} @else {
|
||||
@warn 'Invalid breakpoint: #{$breakpoint}.';
|
||||
}
|
||||
}
|
||||
|
||||
// RESPOND BETWEEN
|
||||
//––––––––––––––––––––––––––––––––––––––––––––––––––
|
||||
// @include respond-between(sm, md) {}
|
||||
@mixin respond-between($lower, $upper) {
|
||||
// If both the lower and upper breakpoints exist in the map.
|
||||
@if map-has-key($breakpoints, $lower) and map-has-key($breakpoints, $upper)
|
||||
{
|
||||
// Get the lower and upper breakpoints.
|
||||
$lower-breakpoint: map-get($breakpoints, $lower);
|
||||
$upper-breakpoint: map-get($breakpoints, $upper);
|
||||
|
||||
@media (min-width: $lower-breakpoint) and (max-width: ($upper-breakpoint - 1)) {
|
||||
@content;
|
||||
}
|
||||
} @else {
|
||||
@if (map-has-key($breakpoints, $lower) == false) {
|
||||
@warn 'Your lower breakpoint was invalid: #{$lower}.';
|
||||
}
|
||||
|
||||
@if (map-has-key($breakpoints, $upper) == false) {
|
||||
@warn 'Your upper breakpoint was invalid: #{$upper}.';
|
||||
}
|
||||
}
|
||||
}
|
||||
57
src/styles/variables.scss
Normal file
@@ -0,0 +1,57 @@
|
||||
$background-dark: #272727;
|
||||
$background-light: #f7f9fb;
|
||||
|
||||
$color-dark: #272727;
|
||||
$color-light: #fafafa;
|
||||
|
||||
$color-dark2: #1b1b1b;
|
||||
|
||||
$color-grey: #707171;
|
||||
|
||||
$color-lgrey: #c9cacc;
|
||||
$color-blue: #61dafb;
|
||||
$color-green: #2bf3c4;
|
||||
|
||||
$green: #2bf3c4;
|
||||
$green2: #27bb98;
|
||||
$green3: #238770;
|
||||
$green4: #1f4b40;
|
||||
|
||||
$black: #1b1b1b;
|
||||
$black2: #272727;
|
||||
|
||||
$grey: #4b4b4b;
|
||||
$grey2: #707171;
|
||||
$grey3: #999a9a;
|
||||
$grey4: #c5c6c6;
|
||||
|
||||
$white: #fafafa;
|
||||
$white2: #f7f9fb;
|
||||
|
||||
$fs-xs: 0.5rem;
|
||||
$fs-sm: 0.8rem;
|
||||
$fs-md: 1rem;
|
||||
$fs-lg: 1.8rem;
|
||||
$fs-xl: 2.3rem;
|
||||
|
||||
$fw-2: 200;
|
||||
$fw-3: 300;
|
||||
$fw-4: 400;
|
||||
$fw-5: 500;
|
||||
$fw-6: 600;
|
||||
$fw-7: 700;
|
||||
$fw-8: 800;
|
||||
|
||||
$weight-norm: 400;
|
||||
$weight-mid: 500;
|
||||
$weight-heavy: 700;
|
||||
|
||||
$transition-hl: 150ms ease;
|
||||
|
||||
$shadow-360: 0 7px 30px -10px rgba(150, 170, 180, 0.5);
|
||||
$shadow-360-og: 0 10px 25px 5px rgba(0, 0, 0, 0.2);
|
||||
$shadow-360-inset: inset -10px -20px 20px 1px rgba(0, 0, 0, 0.2);
|
||||
|
||||
$sw-width: 50px;
|
||||
$sw-padding: 6px;
|
||||
$sw-height: $sw-width / 2 + $sw-padding;
|
||||