Compare commits
	
		
			2 Commits
		
	
	
		
			30e26313b0
			...
			a1a3e21266
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a1a3e21266 | ||
|  | 6bfe06f65c | 
| @@ -1,2 +0,0 @@ | ||||
| node_modules | ||||
| .eslintrc.js | ||||
							
								
								
									
										42
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						| @@ -1,42 +0,0 @@ | ||||
| module.exports = { | ||||
|   root: true, | ||||
|   parser: '@typescript-eslint/parser', | ||||
|   env: { | ||||
|     browser: true, | ||||
|     amd: true, | ||||
|     node: true, | ||||
|     es6: true, | ||||
|   }, | ||||
|   plugins: ['@typescript-eslint'], | ||||
|   extends: [ | ||||
|     'eslint:recommended', | ||||
|     'plugin:@typescript-eslint/eslint-recommended', | ||||
|     'plugin:@typescript-eslint/recommended', | ||||
|     'plugin:jsx-a11y/recommended', | ||||
|     'plugin:prettier/recommended', | ||||
|     'next', | ||||
|     'next/core-web-vitals', | ||||
|   ], | ||||
|   parserOptions: { | ||||
|     project: true, | ||||
|     tsconfigRootDir: __dirname, | ||||
|   }, | ||||
|   rules: { | ||||
|     'prettier/prettier': 'error', | ||||
|     'react/react-in-jsx-scope': 'off', | ||||
|     'jsx-a11y/anchor-is-valid': [ | ||||
|       'error', | ||||
|       { | ||||
|         components: ['Link'], | ||||
|         specialLink: ['hrefLeft', 'hrefRight'], | ||||
|         aspects: ['invalidHref', 'preferButton'], | ||||
|       }, | ||||
|     ], | ||||
|     'react/prop-types': 0, | ||||
|     '@typescript-eslint/no-unused-vars': 0, | ||||
|     'react/no-unescaped-entities': 0, | ||||
|     '@typescript-eslint/explicit-module-boundary-types': 'off', | ||||
|     '@typescript-eslint/no-var-requires': 'off', | ||||
|     '@typescript-eslint/ban-ts-comment': 'off', | ||||
|   }, | ||||
| } | ||||
| @@ -67,29 +67,11 @@ export default function RootLayout({ children }: { children: React.ReactNode }) | ||||
|       className={`${space_grotesk.variable} scroll-smooth`} | ||||
|       suppressHydrationWarning | ||||
|     > | ||||
|       <link | ||||
|         rel="apple-touch-icon" | ||||
|         sizes="76x76" | ||||
|         href={`${basePath}/static/favicons/apple-touch-icon.png`} | ||||
|       /> | ||||
|       <link | ||||
|         rel="icon" | ||||
|         type="image/png" | ||||
|         sizes="32x32" | ||||
|         href={`${basePath}/static/favicons/favicon-32x32.png`} | ||||
|       /> | ||||
|       <link | ||||
|         rel="icon" | ||||
|         type="image/png" | ||||
|         sizes="16x16" | ||||
|         href={`${basePath}/static/favicons/favicon-16x16.png`} | ||||
|       /> | ||||
|       <link rel="manifest" href={`${basePath}/static/favicons/site.webmanifest`} /> | ||||
|       <link | ||||
|         rel="mask-icon" | ||||
|         href={`${basePath}/static/favicons/safari-pinned-tab.svg`} | ||||
|         color="#5bbad5" | ||||
|       /> | ||||
|       <link rel="icon" type="image/png" href="/static/favicons/favicon-96x96.png" sizes="96x96" /> | ||||
|       <link rel="icon" type="image/svg+xml" href="/static/favicons/favicon.svg" /> | ||||
|       <link rel="shortcut icon" href="/static/favicons/favicon.ico" /> | ||||
|       <link rel="apple-touch-icon" sizes="180x180" href="/static/favicons/apple-touch-icon.png" /> | ||||
|       <link rel="manifest" href="/static/favicons/site.webmanifest" /> | ||||
|       <meta name="msapplication-TileColor" content="#000000" /> | ||||
|       <meta name="theme-color" media="(prefers-color-scheme: light)" content="#fff" /> | ||||
|       <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#000" /> | ||||
|   | ||||
| @@ -1 +1,17 @@ | ||||
| {"art":1,"store":1,"melis-sweetsimple":1,"visual-studio-code":1,"guide":4,"tailwind-nextjs-starter-blog":1,"disney":1,"github":1,"python":1,"projects":1,"code":1,"cygnus":1,"self-hosted":1,"server":1,"next-js":1} | ||||
| { | ||||
|   "github": 1, | ||||
|   "guide": 4, | ||||
|   "next-js": 1, | ||||
|   "visual-studio-code": 1, | ||||
|   "tailwind-nextjs-starter-blog": 1, | ||||
|   "cygnus": 1, | ||||
|   "self-hosted": 1, | ||||
|   "server": 1, | ||||
|   "disney": 1, | ||||
|   "art": 1, | ||||
|   "store": 1, | ||||
|   "melis-sweetsimple": 1, | ||||
|   "python": 1, | ||||
|   "projects": 1, | ||||
|   "code": 1 | ||||
| } | ||||
|   | ||||
| @@ -17,6 +17,7 @@ export default function Footer() { | ||||
|           <SocialIcon kind="instagram" href={siteMetadata.instagram} size={6} /> | ||||
|           <SocialIcon kind="threads" href={siteMetadata.threads} size={6} /> | ||||
|           <SocialIcon kind="medium" href={siteMetadata.medium} size={6} /> | ||||
|           <SocialIcon kind="resume" href={siteMetadata.resume} size={6} /> | ||||
|         </div> | ||||
|         <div className="mb-2 flex space-x-2 text-sm text-gray-500 dark:text-gray-400"> | ||||
|           <div>{siteMetadata.author}</div> | ||||
| @@ -26,7 +27,7 @@ export default function Footer() { | ||||
|           <Link href="/">{siteMetadata.title}</Link> | ||||
|         </div> | ||||
|         <div className="mb-8 text-sm text-gray-500 dark:text-gray-400"> | ||||
|           <Link href="https://github.com/timlrx/tailwind-nextjs-starter-blog">Theme</Link> | ||||
|           <Link href="https://git.jonb.io/jblu/jonbio">Theme</Link> | ||||
|         </div> | ||||
|       </div> | ||||
|     </footer> | ||||
|   | ||||
| @@ -102,3 +102,12 @@ export function Medium(svgProps: SVGProps<SVGSVGElement>) { | ||||
|     </svg> | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export function Resume(svgProps: SVGProps<SVGSVGElement>) { | ||||
|   return ( | ||||
|     <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...svgProps}> | ||||
|       <title>Resume</title> | ||||
|       <path d="M14.727 6.727H14V0H4.91c-.905 0-1.637.732-1.637 1.636v20.728c0 .904.732 1.636 1.636 1.636h14.182c.904 0 1.636-.732 1.636-1.636V6.727h-6zm-.545 10.455H7.09v-1.364h7.09v1.364zm2.727-3.273H7.091v-1.364h9.818v1.364zm0-3.273H7.091V9.273h9.818v1.363zM14.727   6h6l-6-6v6z" /> | ||||
|     </svg> | ||||
|   ) | ||||
| } | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import { | ||||
|   Threads, | ||||
|   Instagram, | ||||
|   Medium, | ||||
|   Resume, | ||||
| } from './icons' | ||||
|  | ||||
| const components = { | ||||
| @@ -24,6 +25,7 @@ const components = { | ||||
|   threads: Threads, | ||||
|   instagram: Instagram, | ||||
|   medium: Medium, | ||||
|   resume: Resume, | ||||
| } | ||||
|  | ||||
| type SocialIconProps = { | ||||
|   | ||||
| @@ -140,6 +140,7 @@ export const Authors = defineDocumentType(() => ({ | ||||
|     linkedin: { type: 'string' }, | ||||
|     github: { type: 'string' }, | ||||
|     layout: { type: 'string' }, | ||||
|     resume: { type: 'string' }, | ||||
|   }, | ||||
|   computedFields, | ||||
| })) | ||||
|   | ||||
| @@ -2,15 +2,16 @@ | ||||
| name: Jonathan Branan | ||||
| avatar: https://s3.jonb.io/cdn/author/2.JPG | ||||
| occupation: Software Engineer | ||||
| company: Fortra | ||||
| email: jonathan.branan@fortra.com | ||||
| # company: | ||||
| email: jonbranan@gmail.com | ||||
| linkedin: https://www.linkedin.com/in/jonathanbranan/ | ||||
| github: https://github.com/jonbranan | ||||
| resume: https://s3.jonb.io/cdn/author/Resume.pdf | ||||
| --- | ||||
|  | ||||
| Jonathan Branan is a Software Engineer at Fortra. He is mostly self-taught however he did attend a vocational class at Rackspace Open Cloud Academy. | ||||
| Jonathan Branan is a Software Engineer. He is mostly self-taught however he did attend a vocational class at Rackspace Open Cloud Academy. | ||||
|  | ||||
| He has worked for Geek Squad repairing computers, GlobalScape as a Lead of the Client Services department and as a Product Owner of MFT applications at Fortra. | ||||
| He has worked for Geek Squad repairing computers, GlobalScape as a Lead of the Client Services department, a Product Owner of MFT applications and as a Software Engineer at Fortra. | ||||
|  | ||||
| He currently lives in San Antonio, Texas with his wife and two dogs. He enjoys Basketball, Video games, cooking, camping(backpacking, glamping), watching movies, | ||||
| making mixed drinks and building Lego's. Jonathan and his wife like to frequently travel. | ||||
|   | ||||
							
								
								
									
										3
									
								
								data/logo copy.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||||
| <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="344.5639097744361 330.27819548872174 111.73684210526318 91.21804511278197" width="53.87" height="43.61"><defs><path d="M453.3 331.28L453.3 359.85L388.64 418.5L388.64 388.42L453.3 331.28Z" id="aFZf6T5ED"></path><linearGradient id="gradientb2ThqnP5Op" gradientUnits="userSpaceOnUse" x1="420.97" y1="331.28" x2="420.97" y2="418.5"><stop style="stop-color: #06b6d4;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #67e8f9;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M410.23 331.28L410.23 359.85L345.56 418.5L345.56 388.42L410.23 331.28Z" id="a9fehgwfM"></path><linearGradient id="gradientk1wNV9Ostb" gradientUnits="userSpaceOnUse" x1="377.89" y1="331.28" x2="377.89" y2="418.5"><stop style="stop-color: #06b6d4;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #67e8f9;stop-opacity: 1" offset="100%"></stop></linearGradient></defs><g><g><use xlink:href="#aFZf6T5ED" opacity="1" fill="url(#gradientb2ThqnP5Op)"></use></g><g><use xlink:href="#a9fehgwfM" opacity="1" fill="url(#gradientk1wNV9Ostb)"></use></g></g></svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 38 KiB | 
| @@ -21,6 +21,7 @@ const siteMetadata = { | ||||
|   // threads: 'https://www.threads.net', | ||||
|   // instagram: 'https://www.instagram.com', | ||||
|   // medium: 'https://medium.com', | ||||
|   resume: 'https://s3.jonb.io/cdn/author/Resume.pdf', | ||||
|   locale: 'en-US', | ||||
|   // set to true if you want a navbar fixed to the top | ||||
|   stickyNav: true, | ||||
|   | ||||
							
								
								
									
										70
									
								
								eslint.config.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,70 @@ | ||||
| import typescriptEslint from '@typescript-eslint/eslint-plugin' | ||||
| import globals from 'globals' | ||||
| import tsParser from '@typescript-eslint/parser' | ||||
| import path from 'node:path' | ||||
| import { fileURLToPath } from 'node:url' | ||||
| import js from '@eslint/js' | ||||
| import { FlatCompat } from '@eslint/eslintrc' | ||||
|  | ||||
| const __filename = fileURLToPath(import.meta.url) | ||||
| const __dirname = path.dirname(__filename) | ||||
| const compat = new FlatCompat({ | ||||
|   baseDirectory: __dirname, | ||||
| }) | ||||
|  | ||||
| export default [ | ||||
|   { | ||||
|     ignores: [], | ||||
|   }, | ||||
|   js.configs.recommended, | ||||
|   ...compat.extends( | ||||
|     'plugin:@typescript-eslint/eslint-recommended', | ||||
|     'plugin:@typescript-eslint/recommended', | ||||
|     'plugin:jsx-a11y/recommended', | ||||
|     'plugin:prettier/recommended', | ||||
|     'next', | ||||
|     'next/core-web-vitals' | ||||
|   ), | ||||
|   { | ||||
|     plugins: { | ||||
|       '@typescript-eslint': typescriptEslint, | ||||
|     }, | ||||
|  | ||||
|     languageOptions: { | ||||
|       globals: { | ||||
|         ...globals.browser, | ||||
|         ...globals.amd, | ||||
|         ...globals.node, | ||||
|       }, | ||||
|  | ||||
|       parser: tsParser, | ||||
|       ecmaVersion: 5, | ||||
|       sourceType: 'commonjs', | ||||
|  | ||||
|       parserOptions: { | ||||
|         project: true, | ||||
|         tsconfigRootDir: __dirname, | ||||
|       }, | ||||
|     }, | ||||
|  | ||||
|     rules: { | ||||
|       'prettier/prettier': 'error', | ||||
|       'react/react-in-jsx-scope': 'off', | ||||
|  | ||||
|       'jsx-a11y/anchor-is-valid': [ | ||||
|         'error', | ||||
|         { | ||||
|           components: ['Link'], | ||||
|           specialLink: ['hrefLeft', 'hrefRight'], | ||||
|           aspects: ['invalidHref', 'preferButton'], | ||||
|         }, | ||||
|       ], | ||||
|       'react/prop-types': 'off', | ||||
|       '@typescript-eslint/no-unused-vars': 'off', | ||||
|       'react/no-unescaped-entities': 'off', | ||||
|       '@typescript-eslint/explicit-module-boundary-types': 'off', | ||||
|       '@typescript-eslint/no-var-requires': 'off', | ||||
|       '@typescript-eslint/ban-ts-comment': 'off', | ||||
|     }, | ||||
|   }, | ||||
| ] | ||||
| @@ -9,7 +9,7 @@ interface Props { | ||||
| } | ||||
|  | ||||
| export default function AuthorLayout({ children, content }: Props) { | ||||
|   const { name, avatar, occupation, company, email, twitter, linkedin, github } = content | ||||
|   const { name, avatar, occupation, company, email, twitter, linkedin, github, resume } = content | ||||
|  | ||||
|   return ( | ||||
|     <> | ||||
| @@ -38,6 +38,7 @@ export default function AuthorLayout({ children, content }: Props) { | ||||
|               <SocialIcon kind="github" href={github} /> | ||||
|               <SocialIcon kind="linkedin" href={linkedin} /> | ||||
|               <SocialIcon kind="x" href={twitter} /> | ||||
|               <SocialIcon kind="resume" href={resume} /> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div className="prose max-w-none pb-8 pt-8 dark:prose-invert xl:col-span-2"> | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| /* eslint-disable jsx-a11y/anchor-is-valid */ | ||||
| 'use client' | ||||
|  | ||||
| import { usePathname } from 'next/navigation' | ||||
|   | ||||
							
								
								
									
										2
									
								
								next-env.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -2,4 +2,4 @@ | ||||
| /// <reference types="next/image-types/global" /> | ||||
|  | ||||
| // NOTE: This file should not be edited | ||||
| // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. | ||||
| // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. | ||||
|   | ||||
							
								
								
									
										16561
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						| @@ -13,7 +13,7 @@ | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@headlessui/react": "2.2.0", | ||||
|     "@next/bundle-analyzer": "15.0.2", | ||||
|     "@next/bundle-analyzer": "15.1.4", | ||||
|     "@tailwindcss/forms": "^0.5.9", | ||||
|     "@tailwindcss/typography": "^0.5.15", | ||||
|     "autoprefixer": "^10.4.13", | ||||
| @@ -24,7 +24,7 @@ | ||||
|     "gray-matter": "^4.0.2", | ||||
|     "hast-util-from-html-isomorphic": "^2.0.0", | ||||
|     "image-size": "1.0.0", | ||||
|     "next": "15.0.2", | ||||
|     "next": "15.1.4", | ||||
|     "next-contentlayer2": "0.5.3", | ||||
|     "next-themes": "^0.3.0", | ||||
|     "pliny": "0.4.0", | ||||
| @@ -47,6 +47,8 @@ | ||||
|     "unist-util-visit": "^5.0.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@eslint/eslintrc": "^3.2.0", | ||||
|     "@eslint/js": "^9.16.0", | ||||
|     "@svgr/webpack": "^8.0.1", | ||||
|     "@types/mdx": "^2.0.12", | ||||
|     "@types/react": "^18.2.73", | ||||
| @@ -54,9 +56,10 @@ | ||||
|     "@typescript-eslint/parser": "^8.12.0", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "eslint": "^9.14.0", | ||||
|     "eslint-config-next": "15.0.2", | ||||
|     "eslint-config-next": "15.1.4", | ||||
|     "eslint-config-prettier": "^9.1.0", | ||||
|     "eslint-plugin-prettier": "^5.2.0", | ||||
|     "globals": "^15.12.0", | ||||
|     "husky": "^9.0.0", | ||||
|     "lint-staged": "^13.0.0", | ||||
|     "prettier": "^3.0.0", | ||||
|   | ||||
| Before Width: | Height: | Size: 3.2 KiB | 
| Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.9 KiB | 
| @@ -1,9 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <browserconfig> | ||||
|     <msapplication> | ||||
|         <tile> | ||||
|             <square150x150logo src="/mstile-150x150.png"/> | ||||
|             <TileColor>#000000</TileColor> | ||||
|         </tile> | ||||
|     </msapplication> | ||||
| </browserconfig> | ||||
| Before Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/static/favicons/favicon-96x96.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB | 
| Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 39 KiB | 
| Before Width: | Height: | Size: 4.3 KiB | 
| @@ -1,21 +0,0 @@ | ||||
| <?xml version="1.0" standalone="no"?> | ||||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" | ||||
|  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> | ||||
| <svg version="1.0" xmlns="http://www.w3.org/2000/svg" | ||||
|  width="107.000000pt" height="107.000000pt" viewBox="0 0 107.000000 107.000000" | ||||
|  preserveAspectRatio="xMidYMid meet"> | ||||
| <metadata> | ||||
| Created by potrace 1.11, written by Peter Selinger 2001-2013 | ||||
| </metadata> | ||||
| <g transform="translate(0.000000,107.000000) scale(0.100000,-0.100000)" | ||||
| fill="#000000" stroke="none"> | ||||
| <path d="M609 942 c-17 -18 -95 -88 -289 -258 -117 -102 -177 -155 -204 -179 | ||||
| -6 -5 -31 -28 -56 -50 l-45 -39 -1 -144 -1 -143 21 18 c11 10 25 23 31 28 7 6 | ||||
| 46 41 88 79 86 77 86 77 216 196 52 47 103 93 115 103 11 10 50 45 86 77 l65 | ||||
| 59 -1 131 c0 71 -3 132 -5 135 -3 2 -12 -3 -20 -13z"/> | ||||
| <path d="M929 857 c-64 -56 -145 -128 -180 -159 -35 -31 -75 -66 -89 -78 -55 | ||||
| -47 -68 -59 -150 -131 l-85 -76 2 -129 c1 -71 2 -135 2 -143 1 -11 5 -10 19 5 | ||||
| 10 10 54 51 98 89 43 39 92 83 109 99 26 24 63 58 189 171 12 11 47 43 77 70 | ||||
| 30 28 70 63 89 79 l35 29 1 138 c1 77 1 139 0 139 0 -1 -53 -47 -117 -103z"/> | ||||
| </g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 1.1 KiB | 
| @@ -1,14 +1,21 @@ | ||||
| { | ||||
|   "name": "", | ||||
|   "short_name": "", | ||||
|   "name": "Joyful Fixations", | ||||
|   "short_name": "Joyful Fixations", | ||||
|   "icons": [ | ||||
|     { | ||||
|       "src": "/android-chrome-96x96.png", | ||||
|       "sizes": "96x96", | ||||
|       "type": "image/png" | ||||
|       "src": "/static/favicons/web-app-manifest-192x192.png", | ||||
|       "sizes": "192x192", | ||||
|       "type": "image/png", | ||||
|       "purpose": "maskable" | ||||
|     }, | ||||
|     { | ||||
|       "src": "/static/favicons/web-app-manifest-512x512.png", | ||||
|       "sizes": "512x512", | ||||
|       "type": "image/png", | ||||
|       "purpose": "maskable" | ||||
|     } | ||||
|   ], | ||||
|   "theme_color": "#000000", | ||||
|   "background_color": "#000000", | ||||
|   "theme_color": "#ffffff", | ||||
|   "background_color": "#ffffff", | ||||
|   "display": "standalone" | ||||
| } | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								public/static/favicons/web-app-manifest-192x192.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/static/favicons/web-app-manifest-512x512.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 23 KiB |