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: Wherobots 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: Stratos 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 +

+
+
+ + + {/* Blue Shape + Orange Shape + Orange Shape */} +
+ ); } 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"