diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index ef97522..df8a24d 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -23,24 +23,25 @@
"GitHub.copilot-chat",
"DavidAnson.vscode-markdownlint",
"unifiedjs.vscode-mdx",
- "bradlc.vscode-tailwindcss"
+ "bradlc.vscode-tailwindcss",
+ "esbenp.prettier-vscode"
],
"settings": {
- "[typescript]": {
- "editor.defaultFormatter": "dbaeumer.vscode-eslint"
- },
- "[typescriptreact]": {
- "editor.defaultFormatter": "dbaeumer.vscode-eslint"
- },
- "[markdown]": {
- "editor.defaultFormatter": "DavidAnson.vscode-markdownlint"
- },
- "[json]": {
- "editor.defaultFormatter": "vscode.json-language-features"
- },
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ // "[typescript]": {
+ // "editor.defaultFormatter": "esbenp.prettier-vscode"
+ // },
+ // "[typescriptreact]": {
+ // "editor.defaultFormatter": "esbenp.prettier-vscode"
+ // },
+ // "[markdown]": {
+ // "editor.defaultFormatter": "esbenp.prettier-vscode"
+ // },
+ // "[json]": {
+ // "editor.defaultFormatter": "esbenp.prettier-vscode"
+ // },
"editor.inlineSuggest.enabled": true,
"editor.formatOnSave": true,
- "eslint.format.enable": true,
"editor.codeActionsOnSave": {
"source.fixAll": true
}
diff --git a/.eslintrc.js b/.eslintrc.js
index 774b3d3..736b751 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -13,6 +13,15 @@ module.exports = {
"prettier",
],
overrides: [],
+ parser: "@typescript-eslint/parser",
+ parserOptions: {
+ ecmaVersion: "latest",
+ ecmaFeatures: {
+ jsx: true,
+ },
+ sourceType: "module",
+ project: ["./tsconfig.json"],
+ },
plugins: ["prettier", "react", "@typescript-eslint"],
rules: {
"react/react-in-jsx-scope": 0,
diff --git a/app/BlueShape.svg b/app/BlueShape.svg
new file mode 100644
index 0000000..f166aad
--- /dev/null
+++ b/app/BlueShape.svg
@@ -0,0 +1,3 @@
+
diff --git a/app/OrangeShape.svg b/app/OrangeShape.svg
new file mode 100644
index 0000000..bd75214
--- /dev/null
+++ b/app/OrangeShape.svg
@@ -0,0 +1,3 @@
+
diff --git a/app/ScrollTopButton.tsx b/app/ScrollTopButton.tsx
new file mode 100644
index 0000000..04ab30c
--- /dev/null
+++ b/app/ScrollTopButton.tsx
@@ -0,0 +1,11 @@
+export default function ScrollTopButton() {
+ return (
+
+ ⬆
+ Back to top
+
+ );
+}
diff --git a/app/TopNavigation.tsx b/app/TopNavigation.tsx
new file mode 100644
index 0000000..1db7b6c
--- /dev/null
+++ b/app/TopNavigation.tsx
@@ -0,0 +1,38 @@
+import ClayLogo from "./clay-logo.svg";
+import Image from "next/image";
+
+const navigation = [
+ {
+ name: "Resume",
+ href: "https://github.com/ClayMav/resume/blob/main/resume.pdf",
+ },
+ { name: "LinkedIn", href: "https://www.linkedin.com/in/claymav/" },
+ { name: "Github", href: "https://github.com/ClayMav" },
+] as const;
+
+export default function TopNavigation() {
+ return (
+
+ );
+}
diff --git a/app/clay-logo.svg b/app/clay-logo.svg
new file mode 100644
index 0000000..e28d2eb
--- /dev/null
+++ b/app/clay-logo.svg
@@ -0,0 +1,10 @@
+
diff --git a/app/layout.tsx b/app/layout.tsx
index e85eaae..ae980fc 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,20 +1,27 @@
-import React from 'react'
-import type { Metadata } from 'next'
-import './globals.css'
+import TopNavigation from "./TopNavigation";
+import "./globals.css";
+import type { Metadata } from "next";
+import React from "react";
export const metadata: Metadata = {
- title: 'Clay McGinnis',
- description: 'The portfolio of Clay McGinnis',
-}
+ title: "Clay McGinnis",
+ description: "The portfolio of Clay McGinnis",
+};
export default function RootLayout({
- children,
+ children,
}: {
- children: React.ReactNode
+ children: React.ReactNode;
}) {
- return (
-
-
{children}
-
- )
+ return (
+
+
+
+ {children}
+
+
+ );
}
diff --git a/app/page.tsx b/app/page.tsx
index 3c24855..7027a4e 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,7 +1,92 @@
+import BlueShape from "./BlueShape.svg";
+import OrangeShape from "./OrangeShape.svg";
+import ScrollTopButton from "./ScrollTopButton";
+import StratosLogo from "./stratos-logo.png";
+import WherobotsLogo from "./wherobots-logo.png";
+import Image from "next/image";
+import React from "react";
+
+type ProjectInfo = {
+ role: string;
+ logo: React.ReactNode;
+ description: string;
+ button: React.ReactNode;
+};
+const projects: ProjectInfo[] = [
+ {
+ role: "I work here",
+ logo: ,
+ description:
+ "The spatial data analytics and AI platform trusted in production, at scale, from the original creators of Apache Sedona.",
+ button: (
+
+ ),
+ },
+ {
+ role: "I founded this",
+ logo: ,
+ description:
+ "The spatial data analytics and AI platform trusted in production, at scale, from the original creators of Apache Sedona.",
+ button: (
+
+ ),
+ },
+];
+
+function Project({ role, logo, description, button }: ProjectInfo) {
+ return (
+
+
{role}
+
{logo}
+
{description}
+
{button}
+
+ );
+}
export default function Home() {
- return (
-
- Clay McGinnis
-
- )
+ return (
+
+
+
+
+ Clay McGinnis
+
+
+ I’m a software developer and maker with
+ a passion for user experience
+
+
+
+
+ {projects.map((project) => (
+ -
+
+
+ ))}
+
+
+ {/*
+
+ */}
+
+ );
}
diff --git a/app/stratos-logo.png b/app/stratos-logo.png
new file mode 100644
index 0000000..dff69df
Binary files /dev/null and b/app/stratos-logo.png differ
diff --git a/app/wherobots-logo.png b/app/wherobots-logo.png
new file mode 100644
index 0000000..6d8933c
Binary files /dev/null and b/app/wherobots-logo.png differ
diff --git a/package.json b/package.json
index 3ffde6f..75c86c3 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
"react-dom": "^18"
},
"devDependencies": {
+ "@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/node": "^20.10.4",
"@types/react": "^18.2.42",
"@types/react-dom": "^18.2.17",
@@ -36,4 +37,4 @@
"tailwindcss": "^3.3.6",
"typescript": "^5.3.3"
}
-}
\ No newline at end of file
+}
diff --git a/prettier.config.js b/prettier.config.cjs
similarity index 56%
rename from prettier.config.js
rename to prettier.config.cjs
index e228366..804d6e8 100644
--- a/prettier.config.js
+++ b/prettier.config.cjs
@@ -1,11 +1,13 @@
/** @type {import("prettier").Config} */
const config = {
trailingComma: "all",
- tabWidth: 2,
+ tabWidth: 4,
semi: true,
singleQuote: false,
useTabs: false,
endOfLine: "auto",
+ importOrderSeparation: true,
+ plugins: ["@trivago/prettier-plugin-sort-imports"],
};
-export default config;
\ No newline at end of file
+module.exports = config;
diff --git a/tsconfig.json b/tsconfig.json
index 2332b0c..a16edf2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -37,7 +37,8 @@
"**/*.tsx",
".next/types/**/*.ts",
".eslintrc.js",
- "*.config.js"
+ "*.config.js",
+ "prettier.config.cjs"
],
"exclude": [
"node_modules"
diff --git a/yarn.lock b/yarn.lock
index 74f8f1f..2aec7de 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -63,6 +63,25 @@
eslint-visitor-keys "^2.1.0"
semver "^6.3.1"
+"@babel/generator@7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad"
+ integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==
+ dependencies:
+ "@babel/types" "^7.17.0"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.23.0":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
+ integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
+ dependencies:
+ "@babel/types" "^7.23.6"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
"@babel/generator@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755"
@@ -234,7 +253,7 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
-"@babel/helper-validator-identifier@^7.22.20":
+"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
@@ -271,6 +290,11 @@
chalk "^2.4.2"
js-tokens "^4.0.0"
+"@babel/parser@^7.20.5", "@babel/parser@^7.23.0":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
+ integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
+
"@babel/parser@^7.22.15", "@babel/parser@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563"
@@ -1102,6 +1126,22 @@
"@babel/parser" "^7.22.15"
"@babel/types" "^7.22.15"
+"@babel/traverse@7.23.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
+ integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/generator" "^7.23.0"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.23.0"
+ "@babel/types" "^7.23.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
"@babel/traverse@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec"
@@ -1118,6 +1158,23 @@
debug "^4.1.0"
globals "^11.1.0"
+"@babel/types@7.17.0":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
+ integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@^7.17.0", "@babel/types@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
+ integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.5", "@babel/types@^7.4.4":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602"
@@ -1319,6 +1376,18 @@
dependencies:
tslib "^2.4.0"
+"@trivago/prettier-plugin-sort-imports@^4.3.0":
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789"
+ integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==
+ dependencies:
+ "@babel/generator" "7.17.7"
+ "@babel/parser" "^7.20.5"
+ "@babel/traverse" "7.23.2"
+ "@babel/types" "7.17.0"
+ javascript-natural-sort "0.7.1"
+ lodash "^4.17.21"
+
"@types/json-schema@^7.0.9":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
@@ -2351,7 +2420,7 @@ eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1:
object.entries "^1.1.7"
object.fromentries "^2.0.7"
-eslint-plugin-prettier@^5.0.0:
+eslint-plugin-prettier@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515"
integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==
@@ -3112,6 +3181,11 @@ iterator.prototype@^1.1.2:
reflect.getprototypeof "^1.0.4"
set-function-name "^2.0.1"
+javascript-natural-sort@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
+ integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==
+
jiti@^1.19.1:
version "1.21.0"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
@@ -3935,6 +4009,11 @@ source-map-js@^1.0.2:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+source-map@^0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
streamsearch@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"