add eslint to project
This commit is contained in:
parent
41f445c7a0
commit
eeee169975
50
.eslintrc.cjs
Normal file
50
.eslintrc.cjs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
es2021: true
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'standard-with-typescript',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:react/recommended'
|
||||||
|
],
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
env: {
|
||||||
|
node: true
|
||||||
|
},
|
||||||
|
files: [
|
||||||
|
'.eslintrc.{js,cjs}'
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
sourceType: 'script'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module',
|
||||||
|
project: [
|
||||||
|
'./tsconfig.json'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
'react',
|
||||||
|
'@typescript-eslint'
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
'InferGetStaticPropsType': 'wanr',
|
||||||
|
'space-before-function-paren': 'off',
|
||||||
|
'@typescript-eslint/space-before-function-paren': 'off',
|
||||||
|
'@typescript-eslint/strict-boolean-expressions': [
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
allowString: false,
|
||||||
|
allowNumber: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
ignorePatterns: ['src/**/*.test.ts', 'src/frontend/generated/*']
|
||||||
|
}
|
@ -1,18 +1,18 @@
|
|||||||
import ExternalLinkIcon from "./ExternalLinkIcon";
|
import ExternalLinkIcon from "./ExternalLinkIcon";
|
||||||
|
|
||||||
export interface ProjectProps {
|
export interface ListItemProps {
|
||||||
label: string
|
label: string
|
||||||
date: string
|
date?: string
|
||||||
url: string
|
url: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Project({ label, date, url }: ProjectProps) {
|
export default function ListItem({ label, date, url }: ListItemProps) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-row items-baseline justify-between gap-2">
|
<div className="hover:bg-white hover:bg-opacity-15 hover:px-3 hover:rounded transition-all duration-200 flex flex-row items-baseline justify-between gap-2">
|
||||||
<p className="text-sm ">{label}</p>
|
<p className="text-sm ">{label}</p>
|
||||||
<div className="border border-dashed flex-1 border-gray-500 h-0"></div>
|
<div className="border border-dashed flex-1 border-gray-500 h-0"></div>
|
||||||
<div className="flex gap-1 items-baseline">
|
<div className="flex gap-1 items-baseline">
|
||||||
<i className="text-xs">{date}</i>
|
{!!date && <i className="text-xs">{date}</i>}
|
||||||
<a href={url} target="_blank">
|
<a href={url} target="_blank">
|
||||||
<ExternalLinkIcon />
|
<ExternalLinkIcon />
|
||||||
</a>
|
</a>
|
@ -30,20 +30,11 @@ function BackLinks({ linkList }) {
|
|||||||
|
|
||||||
|
|
||||||
interface MDContentProps {
|
interface MDContentProps {
|
||||||
content: unknown
|
content: string
|
||||||
backLinks: unknown[]
|
backLinks: unknown[]
|
||||||
handleOpenNewContent: (arg?: unknown) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
function MDContent({ content, backLinks, handleOpenNewContent }: MDContentProps) {
|
|
||||||
|
|
||||||
function _handleInternalLinkClick() {
|
|
||||||
//Processing fetching
|
|
||||||
//pass result up to parent container
|
|
||||||
//TODO: handle clicking on internal link, go fetching md content from file then passing it up to parent
|
|
||||||
handleOpenNewContent(content)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function MDContent({ content, backLinks }: MDContentProps) {
|
||||||
useRouter();
|
useRouter();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
export function SocialLink({ SvgElement, link = "#" }) {
|
export function SocialLink({ SvgElement, link = "#" }) {
|
||||||
return (
|
return (
|
||||||
<li className="m-auto hover:scale-150 transition duration-100">
|
<li className="hover:rotate-90 transition duration-100">
|
||||||
<a href={link}>
|
<a href={link}>
|
||||||
{SvgElement}
|
{SvgElement}
|
||||||
</a>
|
</a>
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
import { SocialLink } from "./SocialLink"
|
import { SocialLink } from "./SocialLink"
|
||||||
|
|
||||||
export function SocialLinksList() {
|
export function SocialLinksList() {
|
||||||
|
const width = 24
|
||||||
return (
|
return (
|
||||||
<ul className="flex gap-2 list-none m-0 p-0 py-4">
|
<ul className="flex gap-2 list-none m-0 p-0 py-4">
|
||||||
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" /> <path d="M9 19c-4.286 1.35-4.286-2.55-6-3m12 5v-3.5c0-1 .099-1.405-.5-2 2.791-.3 5.5-1.366 5.5-6.04a4.567 4.567 0 0 0 -1.333 -3.21 4.192 4.192 0 00-.08-3.227s-1.05-.3-3.476 1.267a12.334 12.334 0 0 0 -6.222 0C6.462 2.723 5.413 3.023 5.413 3.023a4.192 4.192 0 0 0 -.08 3.227A4.566 4.566 0 004 9.486c0 4.64 2.709 5.68 5.5 6.014-.591.589-.56 1.183-.5 2V21" /></svg>} />
|
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" width={width} height={width} viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" /> <path d="M9 19c-4.286 1.35-4.286-2.55-6-3m12 5v-3.5c0-1 .099-1.405-.5-2 2.791-.3 5.5-1.366 5.5-6.04a4.567 4.567 0 0 0 -1.333 -3.21 4.192 4.192 0 00-.08-3.227s-1.05-.3-3.476 1.267a12.334 12.334 0 0 0 -6.222 0C6.462 2.723 5.413 3.023 5.413 3.023a4.192 4.192 0 0 0 -.08 3.227A4.566 4.566 0 004 9.486c0 4.64 2.709 5.68 5.5 6.014-.591.589-.56 1.183-.5 2V21" /></svg>} />
|
||||||
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" /> <rect x="2" y="9" width="4" height="12" /> <circle cx="4" cy="4" r="2" /></svg>} />
|
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox={`0 0 ${width} ${width}`} fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z" /> <rect x="2" y="9" width="4" height="12" /> <circle cx="4" cy="4" r="2" /></svg>} />
|
||||||
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z" /></svg>} />
|
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox={`0 0 ${width} ${width}`} fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z" /></svg>} />
|
||||||
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox="0 0 24 24" stroke="currentcolor" xmlns="http://www.w3.org/2000/svg"><path d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z" /></svg>} />
|
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox={`0 0 ${width} ${width}`} stroke="currentcolor" xmlns="http://www.w3.org/2000/svg"><path d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z" /></svg>} />
|
||||||
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z" /></svg>} />
|
<SocialLink SvgElement={<svg class="h-7 w-7 text-white" viewBox={`0 0 ${width} ${width}`} fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z" /></svg>} />
|
||||||
</ul>
|
</ul>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,10 @@ import ExternalLinkIcon from "../ExternalLinkIcon.js";
|
|||||||
|
|
||||||
export function UsefulLink({ title, link }) {
|
export function UsefulLink({ title, link }) {
|
||||||
return (
|
return (
|
||||||
<a href={link}>
|
<a href={link} className="text-white">
|
||||||
<li className="flex w-full items-baseline gap-1">
|
<li className="flex w-full items-baseline gap-1">
|
||||||
<div>{title}</div>
|
<div>{title}</div>
|
||||||
<div className="border flex-1 h-0 border-dashed border-blue-400" />
|
<div className="border flex-1 h-0 border-dashed " />
|
||||||
<ExternalLinkIcon />
|
<ExternalLinkIcon />
|
||||||
</li>
|
</li>
|
||||||
</a>
|
</a>
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
import ListItem from "../ListItem"
|
||||||
import { UsefulLink } from "./UsefulLink"
|
import { UsefulLink } from "./UsefulLink"
|
||||||
|
|
||||||
export function UsefulLinksList() {
|
export function UsefulLinksList() {
|
||||||
return (
|
return (
|
||||||
<ul className="list-none m-0 p-0 flex flex-col gap-1">
|
<ul className="list-none m-0 p-0 flex flex-col gap-1">
|
||||||
|
<ListItem />
|
||||||
<UsefulLink title="CSS-Tricks" link="" />
|
<UsefulLink title="CSS-Tricks" link="" />
|
||||||
<UsefulLink title="Indie Hackers" link="" />
|
<UsefulLink title="Indie Hackers" link="" />
|
||||||
<UsefulLink title="W3Schools" link="" />
|
<UsefulLink title="W3Schools" link="" />
|
||||||
|
2
next-env.d.ts
vendored
2
next-env.d.ts
vendored
@ -1,4 +1,6 @@
|
|||||||
|
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||||
/// <reference types="next" />
|
/// <reference types="next" />
|
||||||
|
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||||
/// <reference types="next/image-types/global" />
|
/// <reference types="next/image-types/global" />
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
webpack: (config) => {
|
|
||||||
config.resolve.fallback = { ...config.resolve.fallback, fs: false };
|
|
||||||
return config;
|
|
||||||
},
|
|
||||||
}
|
|
4
next.config.ts
Normal file
4
next.config.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export default function webpack(config: { resolve: { fallback: Record<string, unknown> } }): { resolve: { fallback: Record<string, unknown> } } {
|
||||||
|
config.resolve.fallback = { ...config.resolve.fallback, fs: false }
|
||||||
|
return config
|
||||||
|
}
|
16
package.json
16
package.json
@ -19,10 +19,16 @@
|
|||||||
"@mui/material": "latest",
|
"@mui/material": "latest",
|
||||||
"@mui/x-tree-view": "^6.17.0",
|
"@mui/x-tree-view": "^6.17.0",
|
||||||
"@types/node": "^20.10.5",
|
"@types/node": "^20.10.5",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.4.0",
|
||||||
"cytoscape-d3-force": "latest",
|
"cytoscape-d3-force": "latest",
|
||||||
"cytoscape-node-html-label": "latest",
|
"cytoscape-node-html-label": "latest",
|
||||||
"d3": "latest",
|
"d3": "latest",
|
||||||
"directory-tree": "latest",
|
"directory-tree": "latest",
|
||||||
|
"eslint-config-standard-with-typescript": "latest",
|
||||||
|
"eslint-plugin-import": "^2.25.2",
|
||||||
|
"eslint-plugin-n": "^16.0.0",
|
||||||
|
"eslint-plugin-promise": "^6.0.0",
|
||||||
|
"eslint-plugin-react": "latest",
|
||||||
"fs": "latest",
|
"fs": "latest",
|
||||||
"gray-matter": "latest",
|
"gray-matter": "latest",
|
||||||
"jsnetworkx": "latest",
|
"jsnetworkx": "latest",
|
||||||
@ -55,18 +61,24 @@
|
|||||||
"autoprefixer": "^10.4.16",
|
"autoprefixer": "^10.4.16",
|
||||||
"bimap": "latest",
|
"bimap": "latest",
|
||||||
"cytoscape": "latest",
|
"cytoscape": "latest",
|
||||||
"eslint": "latest",
|
"eslint": "^8.0.1",
|
||||||
"eslint-config-next": "latest",
|
"eslint-config-next": "latest",
|
||||||
"postcss": "^8.4.32",
|
"postcss": "^8.4.32",
|
||||||
"remark-frontmatter": "latest",
|
"remark-frontmatter": "latest",
|
||||||
"remark-react": "latest",
|
"remark-react": "latest",
|
||||||
"remark-stringify": "latest",
|
"remark-stringify": "latest",
|
||||||
"tailwindcss": "latest",
|
"tailwindcss": "latest",
|
||||||
"uuid": "latest"
|
"uuid": "latest",
|
||||||
|
"bun-types": "latest"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"react": "^18",
|
"react": "^18",
|
||||||
"react-dom": "^18",
|
"react-dom": "^18",
|
||||||
"next": "^14"
|
"next": "^14"
|
||||||
|
},
|
||||||
|
"module": "index.ts",
|
||||||
|
"type": "module",
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": "^5.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
106
pages/index.tsx
106
pages/index.tsx
@ -1,10 +1,11 @@
|
|||||||
import Job, { type JobProps } from "../components/Job";
|
import Job, { type JobProps } from '../components/Job'
|
||||||
import Skill, { type SkillProps } from "../components/Skill";
|
import Skill, { type SkillProps } from '../components/Skill'
|
||||||
import Project, { type ProjectProps } from "../components/Project";
|
import ListItem, { type ListItemProps } from '../components/ListItem'
|
||||||
import Head from "next/head";
|
import Head from 'next/head'
|
||||||
import { UsefulLinksList } from '../components/UsefulLinks/index'
|
import { UsefulLinksList } from '../components/UsefulLinks/index'
|
||||||
import { SocialLinksList } from '../components/SocialLinks/SocialLinks'
|
import { SocialLinksList } from '../components/SocialLinks/SocialLinks'
|
||||||
import type { InferGetStaticPropsType, GetStaticProps } from 'next'
|
import type { GetStaticProps } from 'next'
|
||||||
|
import { type HTMLAttributes } from 'react'
|
||||||
|
|
||||||
interface LandingProps {
|
interface LandingProps {
|
||||||
jobs: JobsType[]
|
jobs: JobsType[]
|
||||||
@ -16,24 +17,24 @@ export default function Landing({ jobs, skills, projects }: LandingProps) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Head>
|
<Head>
|
||||||
<body className="bg-gradient-to-b from-slate-900 to-slate-950 container max-w-full mx-auto text-gray-300 py-24 px-8 w-full " />
|
<body className="bg-gradient-to-b from-slate-900 to-slate-950 container max-w-full mx-auto text-gray-300 py-24 px-4 w-full sm:px-20 md:px-16" />
|
||||||
</Head>
|
</Head>
|
||||||
|
|
||||||
<main className="flex flex-col-reverse gap-8">
|
<main className="flex flex-col-reverse gap-8 md:grid md:grid-cols-8">
|
||||||
<aside className="flex flex-col gap-4">
|
<aside className="flex flex-col gap-4 md:col-start-1 md:col-span-3 lg:col-span-2">
|
||||||
<section className="md:sticky md:top-10 p-2 bg-slate-500 bg-opacity-10 rounded-xl row-span-1 col-span-6" >
|
<section className="md:sticky md:top-10 row-span-1 col-span-6" >
|
||||||
<h3 className="mt-1">Useful Links</h3>
|
<h2 className="mt-1">Useful Links</h2>
|
||||||
<UsefulLinksList />
|
<UsefulLinksList />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="grid grid-rows-3 col-start-1 col-span-6 sticky top-72 row-span-1" >
|
<section className="hidden sm:grid grid-rows-3 col-start-1 col-span-6 sticky top-64 row-span-1" >
|
||||||
<div className="row-span-1 p-2 bg-slate-500 bg-opacity-10 rounded-xl ">
|
<div className="row-span-1 ">
|
||||||
<SocialLinksList />
|
<SocialLinksList />
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<section className=" flex gap-1 flex-col ">
|
<section className=" flex gap-1 flex-col md:col-start-4 col-span-5 lg:col-start-3 xl:col-span-4">
|
||||||
<article>
|
<article>
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
<div className="flex gap-4 items-center">
|
<div className="flex gap-4 items-center">
|
||||||
@ -46,7 +47,13 @@ export default function Landing({ jobs, skills, projects }: LandingProps) {
|
|||||||
<div className="w-full border-dashed border-slate-500 my-4 border "></div>
|
<div className="w-full border-dashed border-slate-500 my-4 border "></div>
|
||||||
<p className="text-sm">I am a self taught Full Stack Software Developer with an unhealthy addiction to solving
|
<p className="text-sm">I am a self taught Full Stack Software Developer with an unhealthy addiction to solving
|
||||||
problems using code.</p>
|
problems using code.</p>
|
||||||
<div className="w-full border-dashed border-gray-700 border-opacity-10 my-4 border "></div>
|
|
||||||
|
<section className="sm:hidden" >
|
||||||
|
<div className="row-span-1 ">
|
||||||
|
<SocialLinksList />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<Border className="sm:hidden" />
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
@ -67,84 +74,87 @@ export default function Landing({ jobs, skills, projects }: LandingProps) {
|
|||||||
<article>
|
<article>
|
||||||
<h2 className="text-1xl font-bold uppercase">Personal Projects</h2>
|
<h2 className="text-1xl font-bold uppercase">Personal Projects</h2>
|
||||||
<div className="flex flex-col gap-3 py-4" id="projects">
|
<div className="flex flex-col gap-3 py-4" id="projects">
|
||||||
{projects.map(project => <Project key={project.label} label={project.label} date={project.date} url={project.url} />)}
|
{projects.map(project => <ListItem key={project.label} label={project.label} date={project.date} url={project.url} />)}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<h2 className="text-1xl font-bold uppercase">Notes</h2>
|
<h2 className="text-1xl font-bold uppercase">Notes</h2>
|
||||||
<p>An endless trail of links to my personal notes</p>
|
<p>An endless trail of links to my personal notes</p>
|
||||||
<a href="/notes" target="_blank">Go To Notes {"->"}</a>
|
<a href="/notes" target="_blank">Go To Notes {'->'}</a>
|
||||||
</article>
|
</article>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function getStaticProps(): ReturnType<GetStaticProps<{
|
export function getStaticProps(): ReturnType<GetStaticProps<{
|
||||||
projects: ProjectsType[],
|
projects: ProjectsType[]
|
||||||
skills: SkillsType[],
|
skills: SkillsType[]
|
||||||
jobs: JobsType[]
|
jobs: JobsType[]
|
||||||
}>> {
|
}>> {
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
projects: [
|
projects: [
|
||||||
{ label: "Web Window Manager", date: "9/18/2022", url: "https://github.com/tristonarmstrong/web-window-manager" },
|
{ label: 'Web Window Manager', date: '9/18/2022', url: 'https://github.com/tristonarmstrong/web-window-manager' },
|
||||||
{ label: "Component Test Helper", date: "6/18/2022", url: "https://github.com/tristonarmstrong/component-test-helper" },
|
{ label: 'Component Test Helper', date: '6/18/2022', url: 'https://github.com/tristonarmstrong/component-test-helper' },
|
||||||
{ label: "Hive DAPP", date: "3/8/2022", url: "https://github.com/tristonarmstrong/hive-dapp" },
|
{ label: 'Hive DAPP', date: '3/8/2022', url: 'https://github.com/tristonarmstrong/hive-dapp' },
|
||||||
{ label: "Kivy Twisted Input Capture", date: "6/27/2021", url: "https://github.com/tristonarmstrong/KivyTwistedInputCapture" },
|
{ label: 'Kivy Twisted Input Capture', date: '6/27/2021', url: 'https://github.com/tristonarmstrong/KivyTwistedInputCapture' },
|
||||||
{ label: "Plant Monitor Node MCU", date: "6/27/2021", url: "https://github.com/tristonarmstrong/PlantMonitorNodeMCU" },
|
{ label: 'Plant Monitor Node MCU', date: '6/27/2021', url: 'https://github.com/tristonarmstrong/PlantMonitorNodeMCU' },
|
||||||
{ label: "Oppo BDP 103 CLI", date: "4/10/2021", url: "https://github.com/tristonarmstrong/oppo_bdp_103_CLI" },
|
{ label: 'Oppo BDP 103 CLI', date: '4/10/2021', url: 'https://github.com/tristonarmstrong/oppo_bdp_103_CLI' },
|
||||||
{ label: "Sony Bravia Pro Server", date: "4/10/2021", url: "https://github.com/tristonarmstrong/sony_bravia_pro_display_mock_server" },
|
{ label: 'Sony Bravia Pro Server', date: '4/10/2021', url: 'https://github.com/tristonarmstrong/sony_bravia_pro_display_mock_server' },
|
||||||
{ label: "Chat IO", date: "6/10/2020", url: "https://github.com/tristonarmstrong/chat.io" },
|
{ label: 'Chat IO', date: '6/10/2020', url: 'https://github.com/tristonarmstrong/chat.io' },
|
||||||
{ label: "Solar Battery Monitor API", date: "7/18/2023", url: "https://github.com/tristonarmstrong/SolarBatteryMonitorApi" },
|
{ label: 'Solar Battery Monitor API', date: '7/18/2023', url: 'https://github.com/tristonarmstrong/SolarBatteryMonitorApi' },
|
||||||
{ label: "Zip Code Distance App", date: "1/28/2020", url: "https://github.com/tristonarmstrong/zipapp" },
|
{ label: 'Zip Code Distance App', date: '1/28/2020', url: 'https://github.com/tristonarmstrong/zipapp' },
|
||||||
{ label: "Armstrong Editor", date: "12/14/2022", url: "https://github.com/tristonarmstrong/armstrong-editor" },
|
{ label: 'Armstrong Editor', date: '12/14/2022', url: 'https://github.com/tristonarmstrong/armstrong-editor' }
|
||||||
],
|
],
|
||||||
skills: [
|
skills: [
|
||||||
{ label: "Typescript" },
|
{ label: 'Typescript' },
|
||||||
{ label: "Python" },
|
{ label: 'Python' },
|
||||||
{ label: "Rust" },
|
{ label: 'Rust' },
|
||||||
{ label: "Javascript" },
|
{ label: 'Javascript' }
|
||||||
],
|
],
|
||||||
jobs: [
|
jobs: [
|
||||||
{
|
{
|
||||||
logo: 'https://ventrahealth.com/wp-content/uploads/2023/08/cropped-Ventra-Health-favicon-circle-192x192.png',
|
logo: 'https://ventrahealth.com/wp-content/uploads/2023/08/cropped-Ventra-Health-favicon-circle-192x192.png',
|
||||||
name: 'Ventra Health',
|
name: 'Ventra Health',
|
||||||
details: 'Maintaining and iterating on an internal web application',
|
details: 'Maintaining and iterating on an internal web application',
|
||||||
dateFrom: "May 2023",
|
dateFrom: 'May 2023',
|
||||||
dateTo: "Present"
|
dateTo: 'Present'
|
||||||
}, {
|
}, {
|
||||||
logo: 'https://www.randstadusa.com/themes/custom/bluex/favicon.ico',
|
logo: 'https://www.randstadusa.com/themes/custom/bluex/favicon.ico',
|
||||||
name: 'Randstad Technologies',
|
name: 'Randstad Technologies',
|
||||||
details: 'Built Web Applications for external clients',
|
details: 'Built Web Applications for external clients',
|
||||||
dateFrom: "May 2022",
|
dateFrom: 'May 2022',
|
||||||
dateTo: "May 2023"
|
dateTo: 'May 2023'
|
||||||
|
|
||||||
}, {
|
}, {
|
||||||
logo: 'https://img1.wsimg.com/isteam/ip/9ba626a3-41c9-4092-90b5-cb351983b726/favicon/a8beec51-e35d-4cca-8e88-befa12f687b0.png/:/rs=w:64,h:64,m',
|
logo: 'https://img1.wsimg.com/isteam/ip/9ba626a3-41c9-4092-90b5-cb351983b726/favicon/a8beec51-e35d-4cca-8e88-befa12f687b0.png/:/rs=w:64,h:64,m',
|
||||||
name: 'Damiano Global Corporation',
|
name: 'Damiano Global Corporation',
|
||||||
details: 'Built Web Applications for external clients',
|
details: 'Built Web Applications for external clients',
|
||||||
dateFrom: "July 2020",
|
dateFrom: 'July 2020',
|
||||||
dateTo: "Nov 2021"
|
dateTo: 'Nov 2021'
|
||||||
|
|
||||||
}, {
|
}, {
|
||||||
logo: '#',
|
logo: '#',
|
||||||
name: 'Makers Ladder LLC',
|
name: 'Makers Ladder LLC',
|
||||||
details: 'Did some thangs',
|
details: 'Did some thangs',
|
||||||
dateFrom: "Dec 2019",
|
dateFrom: 'Dec 2019',
|
||||||
dateTo: "Apr 2022"
|
dateTo: 'Apr 2022'
|
||||||
|
|
||||||
},
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type SkillsType = SkillProps
|
type SkillsType = SkillProps
|
||||||
type JobsType = JobProps
|
type JobsType = JobProps
|
||||||
type ProjectsType = ProjectProps
|
type ProjectsType = ListItemProps
|
||||||
|
|
||||||
|
function Border({ className }: { className: HTMLAttributes<HTMLDivElement>['className'] }) {
|
||||||
|
return (
|
||||||
|
<div className={`w-full border-dashed border-slate-500 my-4 border ${className}`}></div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
@ -18,7 +18,6 @@ export default function Home({ note, backLinks, fileNames, tree, flattenNodes })
|
|||||||
</nav>
|
</nav>
|
||||||
<MDContent content={note.data} handleOpenNewContent={null} backLinks={backLinks} />
|
<MDContent content={note.data} handleOpenNewContent={null} backLinks={backLinks} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -41,14 +40,14 @@ export function getStaticProps({ params }) {
|
|||||||
const flattenNodes = Util.getFlattenArray(tree)
|
const flattenNodes = Util.getFlattenArray(tree)
|
||||||
|
|
||||||
const listOfEdges: unknown[] = edges.filter(anEdge => anEdge.target === params.id)
|
const listOfEdges: unknown[] = edges.filter(anEdge => anEdge.target === params.id)
|
||||||
const internalLinks: unknown[] = listOfEdges.map(anEdge => nodes.find(aNode => aNode.slug === anEdge.source)).filter(element => element !== undefined)
|
const internalLinks: unknown[] = listOfEdges.map((anEdge: { source: string }) => nodes.find(aNode => aNode.slug === anEdge.source)).filter(element => element !== undefined)
|
||||||
const backLinks = [...new Set(internalLinks)]
|
const backLinks = [...new Set(internalLinks)]
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
note,
|
note,
|
||||||
tree: tree,
|
tree: tree,
|
||||||
flattenNodes: flattenNodes,
|
flattenNodes: flattenNodes,
|
||||||
backLinks: backLinks.filter((link: Array<unknown & { slug: string }>) => link.slug !== params.id),
|
backLinks: backLinks.filter((link: { slug: string }) => link.slug !== params.id),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
module.exports = {
|
export const plugins = {
|
||||||
plugins: {
|
|
||||||
tailwindcss: {},
|
tailwindcss: {},
|
||||||
autoprefixer: {},
|
autoprefixer: {}
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,16 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
/** @type {import('tailwindcss').Config} */
|
||||||
const defaultTheme = require('tailwindcss/defaultTheme')
|
import defaultTheme, { fontFamily as _fontFamily } from 'tailwindcss/defaultTheme'
|
||||||
|
|
||||||
module.exports = {
|
export const content = [
|
||||||
content: [
|
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
|
'./components/**/*.{js,ts,jsx,tsx,mdx}'
|
||||||
"./components/**/*.{js,ts,jsx,tsx,mdx}",
|
]
|
||||||
],
|
export const theme = {
|
||||||
theme: {
|
|
||||||
...defaultTheme,
|
...defaultTheme,
|
||||||
extend: {
|
extend: {
|
||||||
fontFamily: {
|
fontFamily: {
|
||||||
sans: ['Inter var', ...defaultTheme.fontFamily.sans],
|
sans: ['Inter var', ..._fontFamily.sans]
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: [],
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const plugins = []
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
],
|
],
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
"strict": false,
|
"strict": false,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
@ -20,10 +21,16 @@
|
|||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"next-env.d.ts",
|
"next-env.d.ts",
|
||||||
"**/*.ts",
|
"pages/**/*",
|
||||||
"**/*.tsx"
|
"lib/**/*",
|
||||||
|
"components/**/*",
|
||||||
|
".eslintrc.js",
|
||||||
|
".eslintrc.cjs",
|
||||||
|
"*.config.js",
|
||||||
|
"*.config.ts",
|
||||||
],
|
],
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"node_modules"
|
"node_modules",
|
||||||
|
"notes/**/*"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user