diff --git a/src/components/index.js b/src/components/index.js
index b2bd286..5f7aa19 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,8 +1,6 @@
export { default as Gallery } from './Gallery';
export { default as GalleryContext } from './GalleryContext';
-export { default as GalleryPage } from './GalleryPage';
export { default as Menu } from './Menu';
export { default as Page } from './Page';
export { default as Project, ProjectProps } from './Project';
-export { default as ProjectPage } from './ProjectPage';
export { default as Slide, SlideProps } from './Slide';
diff --git a/src/data/art.json b/src/data/art.json
index fe6b712..f7b702b 100644
--- a/src/data/art.json
+++ b/src/data/art.json
@@ -26,7 +26,7 @@
"buttons": [
{
"name": "Download",
- "link": "https://drive.google.com/open?id=1oLkn4-Zg5VK-ZHi1LO3SvlIHqf6Tzh_n"
+ "link": "https://drive.google.com/file/d/1WG-eI8QvhrFCTdRJlGesNV7vs7nddq6L/view?usp=drive_link"
},
{
"name": "Source Code",
@@ -72,7 +72,7 @@
"buttons": [
{
"name": "Download",
- "link": "https://drive.google.com/open?id=1qB9JmZHepVmPDG6hM04gqMZAEV7e5miZ"
+ "link": "https://drive.google.com/file/d/14FD_603deu6C40w49c3u3vpvZOD9sDkA/view?usp=drive_link"
},
{
"name": "Source Code",
@@ -119,7 +119,7 @@
"buttons": [
{
"name": "Download",
- "link": "https://drive.google.com/open?id=1TJlHyaSILvaviyt8g0tODV9eBN7iC0HJ"
+ "link": "https://drive.google.com/file/d/1Sr5wxTQrm2jqemSOTLa0xlzYCEKysixm/view?usp=drive_link"
},
{
"name": "Source Code",
@@ -164,7 +164,7 @@
"buttons": [
{
"name": "Download",
- "link": "https://drive.google.com/drive/folders/1VrMFBTO4-DQbiazHRnyDYpN_LQCaGETv?usp=sharing"
+ "link": "https://drive.google.com/drive/folders/1uJo0g6eBtnyHLSCCmUatIQl80VX0UY_9?usp=drive_link"
},
{
"name": "Source Code",
diff --git a/src/data/games.json b/src/data/games.json
index d848105..caa5130 100644
--- a/src/data/games.json
+++ b/src/data/games.json
@@ -25,7 +25,7 @@
"sections": [
{
"title": "Beta",
- "link": "https://drive.google.com/open?id=0BzUWUmwjB6l2ZW00Z3poTXE3UVU",
+ "link": "https://drive.google.com/file/d/1A28Dm-oLWkOgr3L49f46jjcyovBnfp-G/view?usp=drive_link",
"mainVideo": "JtCg7oB67wY",
"gallery": [
"../images/screenshots/the-wandering-dark-screenshot-01.jpg",
@@ -39,7 +39,7 @@
},
{
"title": "Alpha",
- "link": "https://drive.google.com/open?id=0BzUWUmwjB6l2QUd2RTNOYnI3TWs",
+ "link": "https://drive.google.com/file/d/1smEETzdTMVHylPhxZzS2nHsCTbrBYddo/view?usp=drive_link",
"mainVideo": "EF8ywk3Qq48",
"gallery": [
"../images/screenshots/project-dream-screenshot-01.jpg",
@@ -55,7 +55,7 @@
"category": "games",
"date": "November 2014",
"title": "Boss Rush",
- "description": "Boss Rush is a top-down, twin-stick shooter consisting of nothing but boss fights. Developed as a university project, the objective was to create a vertical slice of a complete game, thus it consists of one action-packed boss fight – the Spider Tank.",
+ "description": "Boss Rush is a top-down twin-stick shooter consisting of nothing but boss fights. Developed as a university project, the objective was to create a vertical slice of a complete game, thus it consists of one action-packed boss fight – the Spider Tank.",
"image": "../images/banners/boss-rush-painting.jpg",
"imageAltText": "Boss Rush Painting",
"details": [
@@ -120,7 +120,7 @@
"buttons": [
{
"name": "Download",
- "link": "https://drive.google.com/open?id=0BzUWUmwjB6l2b2M2b00zR25xc28"
+ "link": "https://drive.google.com/file/d/1wfnwkmW56U3aYZ4cnrMFPZOIpwjYz-52/view?usp=drive_link"
}
],
"sections": [
@@ -241,7 +241,7 @@
"buttons": [
{
"name": "Download",
- "link": "https://drive.google.com/open?id=1RHmvqyU1B5gXo0hb18n7ahSxnKQeSTra"
+ "link": "https://drive.google.com/file/d/1VOryTrKiH_2HlJKeO_CmzNbVjCrU7wRr/view?usp=drive_link"
},
{
"name": "Source Code",
diff --git a/src/data/presentations.json b/src/data/presentations.json
index 2fcc736..510346e 100644
--- a/src/data/presentations.json
+++ b/src/data/presentations.json
@@ -21,7 +21,7 @@
"buttons": [
{
"name": "View Deck",
- "link": "https://drive.google.com/open?id=1j_bFqhJ2f6z17afxccK0hWlX6mMVkFGj"
+ "link": "https://drive.google.com/file/d/1mHUDzD7EzfrRR03Z_1WNsduszsIUj4ny/view?usp=drive_link"
}
],
"sections": [
@@ -106,7 +106,7 @@
"buttons": [
{
"name": "View Deck",
- "link": "https://drive.google.com/open?id=0BzUWUmwjB6l2X0RCeERwRm9hejA"
+ "link": "https://drive.google.com/file/d/1nw_EMTZB47svcDjgCPaSAAPE84gNYqfK/view?usp=drive_link"
}
],
"sections": [
@@ -135,7 +135,7 @@
{
"id": "3d-application-development-overview",
"category": "presentations",
- "title": "3D Application Development Overview",
+ "title": "3D Application Development",
"date": "April 2016",
"description_short": "A presentation to teach introductory concepts for 3D application development covering topics across art, design, and tech. The presentation serves as a starting point from which creators can continue to grow their knowledge.",
"description_long": [
@@ -143,7 +143,7 @@
"The deck is grounded in the Unity engine to provide real, applicable examples of the concepts. Adam presented this deck to around 30 software professionals who were interested in learning more."
],
"image": "../images/banners/3d-application-development-overview-painting.jpg",
- "imageAltText": "3D Application Development Overview Painting",
+ "imageAltText": "3D Application Development Painting",
"details": [
{
"key": "ROLE —",
@@ -161,7 +161,7 @@
"buttons": [
{
"name": "View Deck",
- "link": "https://drive.google.com/open?id=0BzUWUmwjB6l2MnYzWk00VzZWY1k"
+ "link": "https://drive.google.com/file/d/1r2DCuz7PckbaD0CH4NWlKIK1X5-po9MI/view?usp=drive_link"
}
],
"sections": [
diff --git a/src/data/tech.json b/src/data/tech.json
index 2c25eb4..f763ffa 100644
--- a/src/data/tech.json
+++ b/src/data/tech.json
@@ -47,9 +47,9 @@
"category": "tech",
"date": "September 2016",
"title": "RockstAR",
- "description_short": "RockstAR is an interactive AR experience demoed at Solstice FWD. By coupling the power of Microsoft's HoloLens, Philips Hue Lightbulbs, and a series of stage technologies, users are given the ability to customize a live rockband experience.",
+ "description_short": "RockstAR is an interactive AR experience demoed at Solstice FWD. By coupling the power of Microsoft's HoloLens, Philips Hue Lightbulbs, and a series of stage technologies, users are given the ability to customize a live rock band experience.",
"description_long": [
- "Augmented reality is making it possible to merge virtual objects into the physical world around us. To explore the possibilities, Adam and fellow Solstice engineers built RockstAR, an interactive AR experience demoed at Solstice FWD. By coupling the power of Microsoft's HoloLens, Philips Hue Lightbulbs, and a series of stage technologies, users are given the ability to customize a live rockband experience.",
+ "Augmented reality is making it possible to merge virtual objects into the physical world around us. To explore the possibilities, Adam and fellow Solstice engineers built RockstAR, an interactive AR experience demoed at Solstice FWD. By coupling the power of Microsoft's HoloLens, Philips Hue Lightbulbs, and a series of stage technologies, users are given the ability to customize a live rock band experience.",
"You can choose your song and color theme preferences using digital menus. Once you're ready to go, the band plays your song as you set the stage for your audience and let the lights groove to the beat. You might look a little odd pointing to things no one else can see, but the joke's on them - you're the star of the show!"
],
"image": "../images/banners/rockstar-painting.jpg",
diff --git a/src/data/websites.json b/src/data/websites.json
index a6e1be3..8b5d89a 100644
--- a/src/data/websites.json
+++ b/src/data/websites.json
@@ -151,8 +151,8 @@
"category": "websites",
"date": "June 2016",
"title": "Ashantis Jones",
- "description": "Ashantis is a native Clevelander that entertains and creates memorable events through detail oriented design and calculated execution. Adam designed Ashantis's portfolio to assist in her job hunt as a graduate of the BFA Theatre Management at DePaul University looking for opportunities in the event management space.",
- "description_short": "Ashantis is a native Clevelander that entertains and creates memorable events through detail oriented design and calculated execution.",
+ "description": "Ashantis is an event planner from Cleaveland that entertains and creates memorable events through detail oriented design and calculated execution. Adam designed Ashantis's portfolio to assist in her job hunt as a graduate of the BFA Theatre Management at DePaul University looking for opportunities in the event management space.",
+ "description_short": "Ashantis is an event planner from Cleaveland that entertains and creates memorable events through detail oriented design and calculated execution.",
"image": "../images/banners/ashantis-jones-painting.jpg",
"imageAltText": "Ashantis Jones Painting",
"details": [
diff --git a/src/hooks/useElementSize.js b/src/hooks/useElementSize.js
new file mode 100644
index 0000000..e722059
--- /dev/null
+++ b/src/hooks/useElementSize.js
@@ -0,0 +1,34 @@
+import { useEffect, useLayoutEffect, useState } from 'react';
+import { clamp } from '../utils/clamp';
+
+export function useElementSize(targetRef) {
+ const getSize = () => {
+ return {
+ width: targetRef.current?.offsetWidth ?? 0,
+ height: targetRef.current?.offsetHeight ?? 0,
+ };
+ };
+
+ const [size, setSize] = useState(getSize);
+ const [scale, setScale] = useState(1);
+
+ const handleResize = () => {
+ const size = getSize();
+ setSize(getSize());
+ if (typeof window !== 'undefined') {
+ setScale(clamp((window.innerWidth * 0.8) / size.width, 1, 1.309));
+ }
+ };
+
+ useEffect(() => {
+ if (typeof window === 'undefined') return;
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, []);
+
+ useLayoutEffect(() => {
+ handleResize();
+ }, []);
+
+ return [size, scale];
+}
diff --git a/src/icons.js b/src/icons.js
deleted file mode 100644
index 1899f9c..0000000
--- a/src/icons.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import chevronLeftIcon from './images/icons/chevron-left.svg';
-import chevronRightIcon from './images/icons/chevron-right.svg';
-import galleryIcon from './images/icons/fullscreen.svg';
-import galleryOpenIcon from './images/icons/fullscreen-exit.svg';
-import menuIcon from './images/icons/menu.svg';
-import menuOpenIcon from './images/icons/menu-open.svg';
-
-const icons = {
- chevronLeft: chevronLeftIcon,
- chevronRight: chevronRightIcon,
- gallery: galleryIcon,
- galleryOpen: galleryOpenIcon,
- menu: menuIcon,
- menuOpen: menuOpenIcon,
-};
-
-export default icons;
diff --git a/src/images/banners/blackhole-painting.jpg b/src/images/banners/blackhole-painting.jpg
index e630af0..3d2eb73 100644
Binary files a/src/images/banners/blackhole-painting.jpg and b/src/images/banners/blackhole-painting.jpg differ
diff --git a/src/images/banners/canvas-painting.png b/src/images/banners/canvas-painting.png
index 2323b00..4934ff1 100644
Binary files a/src/images/banners/canvas-painting.png and b/src/images/banners/canvas-painting.png differ
diff --git a/src/images/icons/chevron-left.svg b/src/images/icons/chevron-left.svg
index f595736..7c24ee2 100644
--- a/src/images/icons/chevron-left.svg
+++ b/src/images/icons/chevron-left.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/chevron-right.svg b/src/images/icons/chevron-right.svg
index 406cc67..fe99ee0 100644
--- a/src/images/icons/chevron-right.svg
+++ b/src/images/icons/chevron-right.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/fullscreen-exit.svg b/src/images/icons/fullscreen-exit.svg
index b375d15..435b859 100644
--- a/src/images/icons/fullscreen-exit.svg
+++ b/src/images/icons/fullscreen-exit.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/fullscreen.svg b/src/images/icons/fullscreen.svg
index 048d113..93232c7 100644
--- a/src/images/icons/fullscreen.svg
+++ b/src/images/icons/fullscreen.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/image.svg b/src/images/icons/image.svg
index 4922e3f..d7b6f6f 100644
--- a/src/images/icons/image.svg
+++ b/src/images/icons/image.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/info.svg b/src/images/icons/info.svg
index c5c1098..5874f78 100644
--- a/src/images/icons/info.svg
+++ b/src/images/icons/info.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/menu-open.svg b/src/images/icons/menu-open.svg
index d500435..7558f79 100644
--- a/src/images/icons/menu-open.svg
+++ b/src/images/icons/menu-open.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/menu.svg b/src/images/icons/menu.svg
index 7d9c95c..59dd94b 100644
--- a/src/images/icons/menu.svg
+++ b/src/images/icons/menu.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/links.js b/src/links.js
index dfc6a84..2a82ec1 100644
--- a/src/links.js
+++ b/src/links.js
@@ -1,57 +1,70 @@
+export const baseUri = 'https://adamgraham.github.io';
+export const email = 'mailto:adam@zigurous.com';
+export const resume = 'https://docs.google.com/document/d/1qLHBV7Ry11O-pd0XC3HvALBIKJ8YDBmSafP0Z5c4dww/edit?usp=drive_link'; // prettier-ignore
+export const github = 'https://github.com/adamgraham';
+export const linkedIn = 'https://www.linkedin.com/in/adamzigurous';
+export const instagram = 'http://instagram.com/adam.zigurous';
+export const twitter = 'https://twitter.com/zigurous';
+
export const navLinks = [
{
+ key: 'games',
name: 'Games',
to: '/games',
},
{
- name: 'Visual Art',
- to: '/art',
+ key: 'websites',
+ name: 'Websites',
+ to: '/websites',
},
{
- name: 'Web Design',
- to: '/websites',
+ key: 'art',
+ name: 'Visual Art',
+ to: '/art',
},
{
+ key: 'tech',
name: 'Emerging Tech',
to: '/tech',
},
{
+ key: 'presentations',
name: 'Presentations',
to: '/presentations',
},
- {
- name: 'Software',
- to: 'https://github.com/adamgraham',
- rightIcon: 'open_in_new',
- ElementType: 'a',
- external: true,
- },
+ // {
+ // name: 'Software',
+ // to: github,
+ // rightIcon: 'open_in_new',
+ // ElementType: 'a',
+ // external: true,
+ // },
];
export const socialLinks = [
{
key: 'github',
name: 'GitHub',
- url: 'https://github.com/adamgraham',
+ url: github,
},
{
key: 'linkedIn',
name: 'LinkedIn',
- url: 'https://www.linkedin.com/in/adamzigurous',
+ url: linkedIn,
},
{
key: 'instagram',
name: 'Instagram',
- url: 'http://instagram.com/adam.zigurous',
- },
- {
- key: 'twitter',
- name: 'Twitter',
- url: 'https://twitter.com/Zigurous',
+ url: instagram,
},
+ // {
+ // key: 'twitter',
+ // name: 'Twitter',
+ // url: twitter,
+ // },
{
key: 'email',
name: 'Email',
- url: 'mailto:adam@zigurous.com',
+ url: email,
},
];
diff --git a/src/pages/art.js b/src/pages/art.js
index e674fce..c0ac13a 100644
--- a/src/pages/art.js
+++ b/src/pages/art.js
@@ -1,12 +1,13 @@
import { graphql } from 'gatsby';
import PropTypes from 'prop-types';
import React from 'react';
-import { GalleryPage, SlideProps } from '../components';
+import { Gallery, Page, SlideProps } from '../components';
+import { baseUri } from '../links';
export const query = graphql`
query Art {
json: allArtJson {
- gallery: nodes {
+ slides: nodes {
id: jsonId
category
date
@@ -30,14 +31,26 @@ export const query = graphql`
`;
const Art = ({ data, location }) => {
- const { gallery } = data.json;
- return ;
+ const { slides } = data.json;
+ return (
+
+
+
+ );
};
Art.propTypes = {
data: PropTypes.shape({
json: PropTypes.shape({
- gallery: PropTypes.arrayOf(SlideProps),
+ slides: PropTypes.arrayOf(SlideProps),
}),
}),
location: PropTypes.object,
diff --git a/src/pages/art/{ArtJson.jsonId}.js b/src/pages/art/{ArtJson.jsonId}.js
index b623a7c..39d79b8 100644
--- a/src/pages/art/{ArtJson.jsonId}.js
+++ b/src/pages/art/{ArtJson.jsonId}.js
@@ -1,7 +1,8 @@
import { graphql } from 'gatsby';
import PropTypes from 'prop-types';
import React from 'react';
-import { ProjectPage, ProjectProps, SlideProps } from '../../components';
+import { Page, Project, ProjectProps, SlideProps } from '../../components';
+import { baseUri } from '../../links';
export const query = graphql`
query ($id: String!) {
@@ -58,7 +59,7 @@ export const query = graphql`
}
}
json: allArtJson {
- gallery: nodes {
+ slides: nodes {
id
category
title
@@ -82,14 +83,21 @@ export const query = graphql`
const Art = ({ data, location }) => {
const { project } = data;
- const { gallery } = data.json;
+ const { slides } = data.json;
return (
-
+ metadata={{
+ url: `${baseUri}/${project.category}/${project.id}`,
+ title: `Adam Graham • ${project.title}`,
+ description: project.description_short || project.description,
+ image: project.image && project.image.sharp.original.src,
+ }}
+ >
+
+
);
};
@@ -97,7 +105,7 @@ Art.propTypes = {
data: PropTypes.shape({
project: ProjectProps,
json: PropTypes.shape({
- gallery: PropTypes.arrayOf(SlideProps),
+ slides: PropTypes.arrayOf(SlideProps),
}),
}),
location: PropTypes.object,
diff --git a/src/pages/games.js b/src/pages/games.js
index e3713bc..c15db1a 100644
--- a/src/pages/games.js
+++ b/src/pages/games.js
@@ -1,12 +1,13 @@
import { graphql } from 'gatsby';
import PropTypes from 'prop-types';
import React from 'react';
-import { GalleryPage, SlideProps } from '../components';
+import { Gallery, Page, SlideProps } from '../components';
+import { baseUri } from '../links';
export const query = graphql`
query Games {
json: allGamesJson {
- gallery: nodes {
+ slides: nodes {
id: jsonId
category
date
@@ -30,14 +31,26 @@ export const query = graphql`
`;
const Games = ({ data, location }) => {
- const { gallery } = data.json;
- return ;
+ const { slides } = data.json;
+ return (
+
+
+
+ );
};
Games.propTypes = {
data: PropTypes.shape({
json: PropTypes.shape({
- gallery: PropTypes.arrayOf(SlideProps),
+ slides: PropTypes.arrayOf(SlideProps),
}),
}),
location: PropTypes.object,
diff --git a/src/pages/games/{GamesJson.jsonId}.js b/src/pages/games/{GamesJson.jsonId}.js
index 11c7e51..4d6ef94 100644
--- a/src/pages/games/{GamesJson.jsonId}.js
+++ b/src/pages/games/{GamesJson.jsonId}.js
@@ -1,7 +1,8 @@
import { graphql } from 'gatsby';
import PropTypes from 'prop-types';
import React from 'react';
-import { ProjectPage, ProjectProps, SlideProps } from '../../components';
+import { Page, Project, ProjectProps, SlideProps } from '../../components';
+import { baseUri } from '../../links';
export const query = graphql`
query ($id: String!) {
@@ -58,7 +59,7 @@ export const query = graphql`
}
}
json: allGamesJson {
- gallery: nodes {
+ slides: nodes {
id
category
title
@@ -82,14 +83,21 @@ export const query = graphql`
const Game = ({ data, location }) => {
const { project } = data;
- const { gallery } = data.json;
+ const { slides } = data.json;
return (
-
+ metadata={{
+ url: `${baseUri}/${project.category}/${project.id}`,
+ title: `Adam Graham • ${project.title}`,
+ description: project.description_short || project.description,
+ image: project.image && project.image.sharp.original.src,
+ }}
+ >
+
+
);
};
@@ -97,7 +105,7 @@ Game.propTypes = {
data: PropTypes.shape({
project: ProjectProps,
json: PropTypes.shape({
- gallery: PropTypes.arrayOf(SlideProps),
+ slides: PropTypes.arrayOf(SlideProps),
}),
}),
location: PropTypes.object,
diff --git a/src/pages/index.js b/src/pages/index.js
index 9c32734..dcf4e9d 100644
--- a/src/pages/index.js
+++ b/src/pages/index.js
@@ -1,28 +1,81 @@
-import { Button, Link } from '@zigurous/react-components';
+import { Button, ButtonGroup, Link } from '@zigurous/react-components';
import { Link as GatsbyLink } from 'gatsby';
-import React from 'react';
+import React, { useRef } from 'react';
+import { Page } from '../components';
+import { useElementSize } from '../hooks/useElementSize';
+import { baseUri, resume } from '../links';
const Home = () => {
+ const ref = useRef();
+ const [_, scale] = useElementSize(ref);
return (
-
-
- Hello, my name is
-
Adam Graham
-
- Adam is a professional software engineer and game developer with 10+
- years of experience. He founded the indie game studio{' '}
-
- Zigurous
- {' '}
- in 2021 and is currently working on his first major release alongside
- other enterprise projects. Adam's work is inspired by a passion for
- art, design, and engineering.
-
-
-
-
-
-
+
+
+
+ Hello! 👋 My name is
+
Adam Graham
+
+ I'm a software engineer and game developer inspired by the blending
+ of art, design, and engineering to create best in class user
+ experiences. I love working on design centric projects across web
+ and mobile having been a tech lead and UX engineer for many Fortune
+ 500 clients over the past 10 years.
+