Updated site icons and added resume to about
@ -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">
|
||||
|
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 |