diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..f16da9b
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,6 @@
+{
+ "extends": "next/core-web-vitals",
+ "rules": {
+ "import/no-anonymous-default-export": "off"
+ }
+}
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..4df28c2
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,20 @@
+name: build check (mikayla dot dev)
+
+on:
+ push:
+ branches:
+ - master
+ - next-migration
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: checkout
+ uses: actions/checkout@v2
+ with:
+ ref: master
+ - name: install
+ run: npm install
+ - name: build check
+ run: npm run build
diff --git a/.gitignore b/.gitignore
index b02a1ff..6a94682 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,25 +1,37 @@
-# Logs
-logs
-*.log
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+package-lock.json
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+*.env
+
+# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-node_modules
-dist
-dist-ssr
-*.local
-package-lock.json
+# local env files
+.env*.local
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/README.md b/README.md
index 39ddc34..f4da3c4 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,34 @@
-# Mikayla Dobson, Web Developer, Software Engineer, Musician
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
-Thanks for checking out my portfolio site! This repo has been migrated over from an [older version](https://github.com/innocuous-symmetry/about-mikayla) which is no longer being maintained. This version will stay up to date with my latest projects and experience!
+## Getting Started
-Created using React, Sass, Material UI, and Vite. Hosted with Github pages.
\ No newline at end of file
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
+
+This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/app/about/education/page.tsx b/app/about/education/page.tsx
new file mode 100644
index 0000000..41552c2
--- /dev/null
+++ b/app/about/education/page.tsx
@@ -0,0 +1,3 @@
+export default function EducationPage() {
+ return <>Education Page>
+}
diff --git a/app/about/me/content.mdx b/app/about/me/content.mdx
new file mode 100644
index 0000000..0d0c3ca
--- /dev/null
+++ b/app/about/me/content.mdx
@@ -0,0 +1,79 @@
+# What I Do
+
+## CREATE FULL STACK WEB APPLICATIONS
+
+I have experience building web applications with and without back-end integrations.
+
+I am comfortable conceptualizing and organizing complex structures, and as such, my projects tend to be natural in their structure and easy to maintain.
+
+## COLLABORATIVE SOFTWARE ENGINEERING
+
+I have consulted on small teams with:
+
+- Dization, a Pittsburgh-based company developing an enterprise resource planning solution for small businesses
+- Metazu Studio, a Nashville-based startup connecting clients with services in video production, AR/VR, social media, photography, and web design.
+
+My work on these projects deals with managing the complexities of full-stack web engineering, as well as delivering beautiful user experiences to end customers.
+
+## CREATIVE MINDED PROBLEM SOLVER
+
+My background as a musician, composer, producer, and artistic collaborator provide me with a unique frame of reference for solving technical problems and adapting to dynamic environments.
+
+## DATABASE OPERATIONS AND MANAGEMENT
+
+My projects have featured both relational and non-relational databases, in particular PostgreSQL and MongoDB. I also have experience with various methods of connecting these to front-end applications.
+
+# Education
+
+## BACHELORS OF ARTS, MUSIC
+
+Southern Methodist University, 2014 - 2017
+
+Concentrations: Piano Performance, Music Composition, Music Theory
+
+Minor: French Language and Culture
+
+## SELF DIRECTED STUDY, WEB ENGINEERING
+
+2021 - present
+
+Codecademy Pro, Front End Engineer Career Path
+
+Concentrations: React, Redux, Express, PostgreSQL
+
+# Employment
+
+## SOFTWARE ENGINEER
+
+Dropper Studio | Nashville, TN
+Mar 2023 - present
+Relevant Duties: developing a full-stack web application for a client in the music industry.
+
+- Next.js
+- tRPC, MongoDB
+- Integrating additional services (Redis, S3)
+- Networking and cloud management (on premise)
+- UI/UX Design
+
+## FULL STACK ENGINEER, INTERN
+
+Dization, Inc | Pittsburgh, PA (remote)
+Sept 2022 - Mar 2023
+Relevant Duties: contributing to the development of a full-stack enterprise resource planning application built using the LAMP stack hosted on AWS.
+
+- Enterprise Resource Planning
+- AWS
+- System Design
+- UI/UX Design
+- Database management
+
+## FULL STACK ENGINEER, INTERN
+Dization, Inc | Pittsburgh, PA (remote)
+Sept 2022 - present
+Relevant Duties: contributing to the development of a full-stack enterprise resource planning application built using the LAMP stack hosted on AWS.
+
+Enterprise Resource Planning
+AWS
+System Design
+UI/UX Design
+Database management
diff --git a/app/about/me/page.tsx b/app/about/me/page.tsx
new file mode 100644
index 0000000..62bc58c
--- /dev/null
+++ b/app/about/me/page.tsx
@@ -0,0 +1,41 @@
+'use client';
+import { useState } from "react";
+import Software from "./software.mdx";
+import CompanyShowcase from "@/components/About/CompanyShowcase";
+
+export default function AboutMe() {
+ const [selected, setSelected] = useState<'musician' | 'developer'>();
+
+ return (
+
+
This page is also coming soon!
+ {/*
So, who is Mikayla Dobson?
+
+
+ setSelected('developer')}>Software Engineer
+ setSelected('musician')}>Musician
+
+
+ {selected === 'developer' && (
+
+
+ I have been writing software for about three years, and have produced valuable work for several
+ companies working in a variety of paradigms.
+
+
+
Here are some traits that my supervisors have consistently praised:
+
+ )}
+
+ {selected === 'musician' && (
+
+
Musician
+
+ I am a musician with a passion for creating beautiful, functional, and accessible music.
+ I have experience with the piano, guitar, and more.
+
+
+ )} */}
+
+ )
+}
diff --git a/app/about/me/software.mdx b/app/about/me/software.mdx
new file mode 100644
index 0000000..c6fb8b6
--- /dev/null
+++ b/app/about/me/software.mdx
@@ -0,0 +1,10 @@
+# Software Engineer
+
+I have been writing software for about three years, and have produced valuable work for several
+companies working in a variety of paradigms.
+
+## Some
+
+## Some ways I have brought value:
+
+
diff --git a/app/about/music/page.tsx b/app/about/music/page.tsx
new file mode 100644
index 0000000..4a604af
--- /dev/null
+++ b/app/about/music/page.tsx
@@ -0,0 +1,19 @@
+import Link from 'next/link';
+
+export default function MusicPage() {
+ return (
+
+
+
Projects
+
+
+
+
Works
+
+
+
+
Stream
+
+
+ )
+}
diff --git a/app/about/music/projects/page.tsx b/app/about/music/projects/page.tsx
new file mode 100644
index 0000000..465a104
--- /dev/null
+++ b/app/about/music/projects/page.tsx
@@ -0,0 +1,9 @@
+export default function MusicProjectPage() {
+ return (
+
+
Music Project Page
+
+
This is where I'll keep a running list of my projects
+
+ )
+}
diff --git a/app/about/music/stream/page.tsx b/app/about/music/stream/page.tsx
new file mode 100644
index 0000000..90ee54a
--- /dev/null
+++ b/app/about/music/stream/page.tsx
@@ -0,0 +1,7 @@
+export default function MusicStreamingPage() {
+ return (
+
+
Music Streaming Page
+
+ )
+}
diff --git a/app/about/music/works/[id]/page.tsx b/app/about/music/works/[id]/page.tsx
new file mode 100644
index 0000000..7b8ed18
--- /dev/null
+++ b/app/about/music/works/[id]/page.tsx
@@ -0,0 +1,16 @@
+export default function MusicalWorkPage({ params }: { params: { id: string }}) {
+ if (Number.isNaN(parseInt(params.id))) {
+ return Fail
+ }
+
+ return (
+
+
Music Works Page
+
Work No. {params.id}
+
+
+
This page is coming soon!
+
+
+ )
+}
diff --git a/app/about/music/works/page.tsx b/app/about/music/works/page.tsx
new file mode 100644
index 0000000..71b5733
--- /dev/null
+++ b/app/about/music/works/page.tsx
@@ -0,0 +1,21 @@
+import Link from 'next/link';
+
+export default function MusicWorksPage() {
+ return (
+
+
Music Works Page
+
+
+
First
+
+
+
+
Second
+
+
+
+
Third
+
+
+ )
+}
diff --git a/app/about/page.tsx b/app/about/page.tsx
new file mode 100644
index 0000000..5724fec
--- /dev/null
+++ b/app/about/page.tsx
@@ -0,0 +1,79 @@
+"use client";
+
+import Link from "next/link";
+import { Experience, Projects, Skills } from "../../components/Resume";
+import { RxChevronDown } from "react-icons/rx";
+import { useState } from "react";
+import { FaGithub, FaLinkedin } from "react-icons/fa";
+
+export default function Resume() {
+ const [skillsVisible, setSkillsVisible] = useState(true);
+ const [experienceVisible, setExperienceVisible] = useState(true);
+ const [educationVisible, setEducationVisible] = useState(true);
+ const [projectsVisible, setProjectsVisible] = useState(true);
+
+ return (
+
+
+ Mikayla Dobson
+ Software Engineer | Nashville, TN
+
+
+
+
+
Download a copy for later?
+
.pdf
+
.docx
+
+
+
+ innocuous-symmetry
+ mikayla-dobson
+
+
+
+
+ setSkillsVisible(!skillsVisible)} className={"sticky top-[5.5rem] w-full flex items-center text-rose-300 uppercase tracking-wide list-none" + (skillsVisible ? " bg-black" : "")}>
+ Skills
+
+
+ { skillsVisible ? : null }
+
+
+
+ setExperienceVisible(!experienceVisible)} className="sticky top-[5.5rem] w-full bg-black flex items-center text-rose-300 uppercase tracking-wide list-none">
+ Experience
+
+
+ { experienceVisible ? : null }
+
+
+
+ setEducationVisible(!educationVisible)} className={"sticky top-[5.5rem] w-full flex items-center text-rose-300 uppercase tracking-wide list-none" + (educationVisible ? " bg-black" : "")}>
+ Education
+
+
+
+ {
+ educationVisible ? (
+
+ Southern Methodist University
+ Dallas, TX - B.A. Music
+
+
+ Concentrations in Piano Performance and Music Composition. Special focus on orchestral composition and arranging. Minor in French Language and Culture.
+
+ ) : null
+ }
+
+
+
+ setProjectsVisible(!projectsVisible)} className={"sticky top-[5.5rem] w-full flex items-center text-rose-300 uppercase tracking-wide list-none " + (projectsVisible ? " bg-black" : "")}>
+ Projects
+
+
+ { projectsVisible ? : null }
+
+
+ )
+}
diff --git a/app/about/work/[employer]/page.tsx b/app/about/work/[employer]/page.tsx
new file mode 100644
index 0000000..86b3b4a
--- /dev/null
+++ b/app/about/work/[employer]/page.tsx
@@ -0,0 +1,18 @@
+'use client';
+import { usePathname } from "next/navigation";
+
+export default function ExperiencePage() {
+ const path = usePathname();
+
+ return (
+
+
+
Work Page
+
Employer: {path.split('/').at(-1)}
+
+
+
This section is coming soon!
+
+
+ )
+}
diff --git a/app/about/work/page.tsx b/app/about/work/page.tsx
new file mode 100644
index 0000000..d3955be
--- /dev/null
+++ b/app/about/work/page.tsx
@@ -0,0 +1,7 @@
+const WorkHistory = () => {
+ return (
+
+
Work History
+
+ );
+}
diff --git a/app/contact/page.tsx b/app/contact/page.tsx
new file mode 100644
index 0000000..59b7165
--- /dev/null
+++ b/app/contact/page.tsx
@@ -0,0 +1,42 @@
+'use client';
+import { useState } from "react";
+
+export default function ContactPage() {
+ const [name, setName] = useState('');
+ const [email, setEmail] = useState('');
+ const [message, setMessage] = useState('');
+
+ function handleSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ console.log(name, email, message);
+ }
+
+ return (
+
+
+
Thanks for your interest! I'm looking forward to hearing from you.
+
+
+
+
+ )
+}
diff --git a/app/content.mdx b/app/content.mdx
new file mode 100644
index 0000000..e82c304
--- /dev/null
+++ b/app/content.mdx
@@ -0,0 +1,23 @@
+# Mikayla Dobson | Software Engineer
+
+Software design at the confluence of efficiency, ingenuity, and artistry.
+
+## Why do you want me on your team?
+
+Here are some things I've provided for my teams in the past:
+
+### Connecting the dots
+
+My strength lies in the big picture. My background as a composer of classical music has given me a lasting sense for how to assemble the pieces of a project into a cohesive whole.
+
+As a software engineer, this means:
+
+- I'm comfortable living in the world between the front-end and back-end
+- I love solving emergent problems as a project's stack is expanding
+
+---
+
+## Want to know more?
+
+You're in the right place! This site is the best place to learn about the work I've done, what I know, and what I've
+done with the knowledge I have.
diff --git a/app/favicon.ico b/app/favicon.ico
new file mode 100644
index 0000000..718d6fe
Binary files /dev/null and b/app/favicon.ico differ
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..fd81e88
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,27 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 214, 219, 220;
+ --background-end-rgb: 255, 255, 255;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+ }
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..32a8766
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,78 @@
+'use client'
+
+import './globals.css'
+
+import Head from 'next/head'
+import Navbar from '@/components/Navbar'
+import SiteTree from '@/components/SiteTree'
+import components from '@/components/mdx'
+import { MDXProvider } from '@mdx-js/react'
+import { Inter, Besley, Cabin } from 'next/font/google'
+import { usePathname } from 'next/navigation'
+import { IconContext } from 'react-icons'
+import { useEffect, useState } from 'react'
+
+export const inter = Inter({ subsets: ['latin'] })
+export const besley = Besley({ subsets: ['latin'] })
+export const cabin = Cabin({ subsets: ['latin'] })
+
+export const metadata = {
+ title: 'Mikayla Dobson | Software Engineer',
+ description: 'Integrating artistry and technology to create beautiful software',
+}
+
+export default function RootLayout({ children }: { children: React.ReactNode }) {
+ const pathname = usePathname();
+ const [bg, setBg] = useState('bg-slate-900');
+ const [overlay, setOverlay] = useState(false);
+
+ const [pageIsScrolled, setPageIsScrolled] = useState(false);
+
+ useEffect(() => {
+ switch (pathname) {
+ case '/contact':
+ setBg('bg-darkPlum');
+ setOverlay(true);
+ break;
+ case '/':
+ case '/about':
+ default:
+ setBg('bg-slate-900');
+ setOverlay(false);
+ break;
+ }
+ }, [pathname])
+
+ useEffect(() => {
+ document.addEventListener('scroll', () => {
+ if (window.scrollY > 0) {
+ setPageIsScrolled(true);
+ } else {
+ setPageIsScrolled(false);
+ }
+ })
+ }, [])
+
+ return (
+
+
+ {metadata.title}
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+ )
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..0f390c6
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,39 @@
+import { ColorChangeName } from "@/components/Home";
+import Image from "next/image";
+import Link from "next/link";
+
+export default function Home() {
+ return (
+
+
+
+
+
+
+
+
+
Hi! My name is Mikayla.
+
I build full-stack software solutions for the web, answer open-ended questions, and pet cats.
+
+
+
+ Tell me what I can do for you
+
+
+ And check out some of my work while you're at it
+
+
+ Check out my work
+
+
+
+
+
+ )
+}
diff --git a/app/projects/[id]/page.tsx b/app/projects/[id]/page.tsx
new file mode 100644
index 0000000..d474e83
--- /dev/null
+++ b/app/projects/[id]/page.tsx
@@ -0,0 +1,12 @@
+import { usePathname } from 'next/navigation'
+
+export default function ProjectById() {
+ const pathname = usePathname();
+
+ return (
+
+
ProjectById Page
+
Project ID: {pathname}
+
+ )
+}
diff --git a/app/projects/page.tsx b/app/projects/page.tsx
new file mode 100644
index 0000000..26d1e9d
--- /dev/null
+++ b/app/projects/page.tsx
@@ -0,0 +1,9 @@
+export default function ProjectsPage() {
+ return (
+
+
Projects Page
+
+
Contents of this page coming soon!
+
+ )
+}
diff --git a/components/About/CompanyShowcase.tsx b/components/About/CompanyShowcase.tsx
new file mode 100644
index 0000000..9c8f86f
--- /dev/null
+++ b/components/About/CompanyShowcase.tsx
@@ -0,0 +1,28 @@
+import { useEffect, useState } from "react";
+import { RxTriangleDown } from "react-icons/rx";
+
+interface CompanyShowcaseProps {
+ companyName: string
+ children: React.ReactNode
+}
+
+export default function CompanyShowcase({ companyName, children }: CompanyShowcaseProps) {
+ const [collapsed, setCollapsed] = useState(true);
+
+ useEffect(() => console.log(collapsed), [collapsed]);
+
+ return (
+
+
+
{companyName}
+
+ setCollapsed(!collapsed)} />
+
+ {/*
setCollapsed(!collapsed)}>Show more */}
+
+
+ { collapsed ? <>> : children }
+
+
+ )
+}
diff --git a/components/Home/index.tsx b/components/Home/index.tsx
new file mode 100644
index 0000000..82d2edc
--- /dev/null
+++ b/components/Home/index.tsx
@@ -0,0 +1,20 @@
+'use client';
+
+import { useColorShift } from "../logo";
+
+export const ColorChangeName = () => {
+ const { firstColor, secondColor, thirdColor } = useColorShift(14000);
+
+ return (
+ <>
+
+ Mikayla Dobson
+
+ Software Engineer
+
+
+
Pragmatic software design with style and artistry.
+
+ >
+ )
+}
diff --git a/components/Navbar/index.tsx b/components/Navbar/index.tsx
new file mode 100644
index 0000000..051c876
--- /dev/null
+++ b/components/Navbar/index.tsx
@@ -0,0 +1,124 @@
+import Link from 'next/link'
+import { InlineLogo, useColorShift } from '../logo'
+import { useEffect, useState } from 'react';
+import { UseColorShiftReturnType } from '../logo/useColorShift';
+import { RxActivityLog } from "react-icons/rx";
+
+interface HoverState {
+ about: boolean
+ projects: boolean
+ contact: boolean
+}
+
+const SHIFT_INTERVAL = 3000;
+
+export default function Navbar({ pageIsScrolled = false }) {
+ const navbarColorShift = useColorShift(SHIFT_INTERVAL);
+ const { shift } = navbarColorShift;
+
+ const [colors, setColors] = useState>({
+ firstColor: 'bg-inherit',
+ secondColor: 'bg-inherit',
+ thirdColor: 'bg-inherit',
+ });
+ const [hoverState, setHoverState] = useState({
+ about: false,
+ projects: false,
+ contact: false,
+ })
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
+
+ function mouseOver(source: keyof HoverState) {
+ const { colorKeys, actualColorReferences, activeIndex } = identifyActiveButton();
+
+ setColors({ ...colors, [colorKeys[activeIndex]]: actualColorReferences[activeIndex] });
+ setHoverState({ ...hoverState, [source]: true })
+ }
+
+ function mouseOut(source: keyof HoverState) {
+ setHoverState({ ...hoverState, [source]: false })
+ setColors({ firstColor: 'bg-inherit', secondColor: 'bg-inherit', thirdColor: 'bg-inherit' });
+ }
+
+ function identifyActiveButton() {
+ const buttonKeys: (keyof HoverState)[] = ['about', 'projects', 'contact'];
+ const { firstColor, secondColor, thirdColor } = navbarColorShift;
+ const colorKeys = ['firstColor', 'secondColor', 'thirdColor'];
+ const actualColorReferences = [firstColor, secondColor, thirdColor];
+
+ const activeButton = buttonKeys.find(key => hoverState[key]);
+ const activeIndex = buttonKeys.indexOf(activeButton as keyof HoverState);
+
+ return { colorKeys, actualColorReferences, activeIndex };
+ }
+
+ useEffect(() => {
+ const interval = setInterval(shift, SHIFT_INTERVAL);
+ return () => clearInterval(interval);
+ }, [])
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ const { colorKeys, actualColorReferences, activeIndex } = identifyActiveButton();
+
+ for (const key in hoverState) {
+ if (hoverState[key as keyof HoverState]) {
+ setColors({
+ ...colors,
+ [colorKeys[activeIndex]]: actualColorReferences[activeIndex]
+ });
+ }
+ }
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, [shift])
+
+ return (
+ <>
+
+
+
+
+
+
+
mouseOver('about')} onMouseOut={() => mouseOut('about')} className={`ml-2 ${colors.firstColor} rounded-lg transition-colors ease-quick-start duration-${hoverState.about ? '[5000ms]' : '0'}`}>
+
About
+
+
+
mouseOver("projects")} onMouseOut={() => mouseOut('projects')} className={`ml-2 ${colors.secondColor} rounded-lg transition-colors ease-quick-start duration-${hoverState.projects ? '[5000ms]' : '0'}`}>
+
Projects
+
+
+
mouseOver('contact')} onMouseOut={() => mouseOut('contact')} className={`ml-2 ${colors.thirdColor} rounded-lg transition-colors ease-quick-start duration-${hoverState.contact ? '[5000ms]' : '0'}`}>
+
Contact
+
+
+
+
+ setMobileMenuOpen(!mobileMenuOpen)}>
+
+
+
+
+ setMobileMenuOpen(false)} className={`flex flex-col z-50 rounded-bl-lg justify-end md:hidden fixed top-24 w-[35vw] text-right place-self-end bg-[#131313] ${mobileMenuOpen ? 'translate-x-[65vw]' : 'translate-x-[100vw]'} transition-all duration-500`}>
+ {/*
*/}
+
setMobileMenuOpen(false)} passHref href="/" className="w-auto px-2">
+
Home
+
+
+
setMobileMenuOpen(false)} passHref href="/about" className="w-auto px-2">
+
About
+
+
+
setMobileMenuOpen(false)} passHref href="/projects" className="w-auto px-2">
+
Projects
+
+
+
setMobileMenuOpen(false)} passHref href="/contact" className="w-auto px-2">
+
Contact
+
+
+ >
+ )
+}
diff --git a/components/Resume/Experience.tsx b/components/Resume/Experience.tsx
new file mode 100644
index 0000000..2b6bc15
--- /dev/null
+++ b/components/Resume/Experience.tsx
@@ -0,0 +1,45 @@
+import Link from "next/link";
+
+const Experience = () => {
+ return (
+
+
+ Dropper Studio
+ Nashville, TN (hybrid) - Software Engineer
+ March 2023 - present
+
+
+
+ Building a full-stack e-commerce platform for the music industry. Experience includes: producing a functional proof of concept from design specifications; constructing a scalable, performant full-stack architecture; and project/team management skills.
+
+ Learn more about my work with Dropper
+
+
+
+ Dization, Inc.
+ Pittsburgh, PA (remote) - Software Engineer (intern)
+ October 2022 - March 2023
+
+
+
+ Participated in the development of an enterprise project management solution. Built several new features, contributed to design and UX discussions, and took initiative on debugging efforts. Technologies included PHP, MySQL, jQuery, and Bootstrap.
+
+ Learn more about my work with Dization
+
+
+
+ Metazu Studio
+ Nashville, TN (hybrid) - Software Engineer (consultant)
+ March 2022 - December 2022
+
+
+
+ Consulted on small teams for the design and engineering of full-stack web applications for clients. Used technologies including Node.js, React, MongoDB, and PostgreSQL.
+
+
+ See more about my experience
+
+ )
+}
+
+export default Experience;
diff --git a/components/Resume/Projects.tsx b/components/Resume/Projects.tsx
new file mode 100644
index 0000000..6fcf471
--- /dev/null
+++ b/components/Resume/Projects.tsx
@@ -0,0 +1,25 @@
+const Projects = () => (
+
+
+ Subsequent
+ May 2023 - present
+ TypeScript, Tone.js
+
+
+
+ A tool for music creators to explore generative music composition. Composed of an engine that wraps around Tone.js, allowing the end user to specify parameters for indefinite generative music output. To be published as an NPM package, including providers to be consumed in front-end web frameworks.
+
+
+
+ Recipin
+ October 2022 - present
+ React, Express, TypeScript, PostgreSQL
+
+
+
+ A full stack web application for storing personal recipes in collections and sharing them in a lightweight social network.
+
+
+)
+
+export default Projects
diff --git a/components/Resume/Skills.tsx b/components/Resume/Skills.tsx
new file mode 100644
index 0000000..4446242
--- /dev/null
+++ b/components/Resume/Skills.tsx
@@ -0,0 +1,164 @@
+import { RxChevronDown } from "react-icons/rx";
+import Link from "next/link";
+
+const Skills = () => (
+
+
+
Strong:
+
+
+
+ JavaScript
+
+
+
+
TypeScript
+
React
+
Next.js
+
tRPC
+
React Query
+
jQuery
+
Express
+
Node.js
+
+
+
+
+
+
+
+ CSS
+
+
+
+
Tailwind
+
Bootstrap
+
Sass
+
Material UI
+
+
+
+
+
+
+
Experienced:
+
+
+
+ Python
+
+
+
+
Micropython
+
Flask
+
Flet
+
+
+
+
+
+
+
+ Database Operations
+
+
+
+
PostgreSQL
+
MySQL
+
MongoDB
+
Caching with Redis
+
+
+
+
+
+
+
+ Tooling
+
+
+
+
Docker
+
Github Actions
+
Git / Github
+
+
+
+
+
+
+
Learning:
+
+
+
+ Design Principles
+
+
+
+
Domain Driven Design
+
Microservices
+
Readable Code
+
+
+
+
+
+
+
+ Cloud Development and Infrastructure
+
+
+
+
AWS SDK
+
Proxmox
+
Minio
+
Linux
+
+
+
+
+
+
+
+ Server-side programming languages
+
+
+
+
Ruby / Rails
+
Golang
+
+
+
+
+
+
+
+ Natural Language Processing
+
+
+
+
+
+
+
+
+
+ Soft Skills:
+
+
+
+
Strong communicator
+
Fast learner
+
Self-driver
+
Improviser
+
Problem solver
+
Design thinker
+
+
+
+);
+
+export default Skills;
diff --git a/components/Resume/index.tsx b/components/Resume/index.tsx
new file mode 100644
index 0000000..0c0be0e
--- /dev/null
+++ b/components/Resume/index.tsx
@@ -0,0 +1,3 @@
+export { default as Skills } from "./Skills";
+export { default as Experience } from "./Experience";
+export { default as Projects } from "./Projects";
diff --git a/components/SiteTree.tsx b/components/SiteTree.tsx
new file mode 100644
index 0000000..9ace73e
--- /dev/null
+++ b/components/SiteTree.tsx
@@ -0,0 +1,32 @@
+'use client'
+import { usePathname } from 'next/navigation'
+import Link from 'next/link'
+import { v4 } from 'uuid'
+
+export default function SiteTree() {
+ const pathname = usePathname()
+ const pathAsArray = pathname.split('/').filter(x => x !== '');
+
+ // return (
+ //
+ //
+ //
home
+ //
+
+ // {pathAsArray.map((segment: string, idx: number) => {
+ // const path = pathAsArray.slice(0, idx + 1).join('/')
+
+ // return (
+ //
+ //
/
+ //
+ //
{segment}
+ //
+ //
+ // )
+ // })}
+ //
+ // )
+
+ return <>>
+}
diff --git a/components/logo/index.tsx b/components/logo/index.tsx
new file mode 100644
index 0000000..f444eda
--- /dev/null
+++ b/components/logo/index.tsx
@@ -0,0 +1,82 @@
+'use client'
+import { FC } from "react";
+import useColorShift, { UseColorShiftReturnType, type ColorListType } from "./useColorShift";
+import { useRouter } from "next/navigation";
+export { default as useColorShift } from "./useColorShift";
+
+const DEFAULT_SHIFT_INTERVAL = 3000;
+
+interface LogoProps {
+ shiftInterval?: number,
+ customColorList?: ColorListType[],
+ disableShift?: boolean,
+ customHookInstance?: UseColorShiftReturnType
+}
+
+export const StackedLogo: FC = ({ shiftInterval, customColorList, customHookInstance, disableShift = false }) => {
+ const hookProps = [
+ shiftInterval ?? DEFAULT_SHIFT_INTERVAL,
+ disableShift,
+ customColorList,
+ ] as const;
+
+ const { firstColor, secondColor, thirdColor, shift } = useColorShift(...hookProps);
+
+ return (
+
+ )
+}
+
+export const InlineLogo: FC = ({ shiftInterval, customColorList, customHookInstance, disableShift = false }) => {
+ const router = useRouter();
+
+ const hookProps = [
+ shiftInterval ?? DEFAULT_SHIFT_INTERVAL,
+ disableShift,
+ customColorList,
+ ] as const;
+
+ const { firstColor, secondColor, thirdColor, shift } = useColorShift(...hookProps);
+
+ if (customHookInstance) return (
+ router.push('/')} id="inline-logo-container" className="flex w-auto h-auto justify-center">
+
+
+
+
+
+
+ )
+
+ return (
+ router.push('/')} id="inline-logo-container" className="flex w-auto h-auto justify-center">
+
+
+
+
+
+
+ )
+}
diff --git a/components/logo/useColorShift.tsx b/components/logo/useColorShift.tsx
new file mode 100644
index 0000000..aa76e1f
--- /dev/null
+++ b/components/logo/useColorShift.tsx
@@ -0,0 +1,63 @@
+import { useEffect, useState } from "react";
+import { DefaultColors } from "tailwindcss/types/generated/colors";
+
+export type ColorListType = (`bg-${keyof DefaultColors}` | `bg-${keyof DefaultColors}-${string}` | "");
+
+const colorList: ColorListType[] = [
+ "bg-purple-500",
+ "bg-purple-800",
+ "bg-sky-500",
+ "bg-sky-800",
+ "bg-blue-500",
+ "bg-pink-500",
+ "bg-pink-800",
+];
+
+export interface UseColorShiftReturnType {
+ firstColor: ColorListType
+ secondColor: ColorListType
+ thirdColor: ColorListType
+ shift: () => { firstColor: ColorListType, secondColor: ColorListType, thirdColor: ColorListType }
+ shiftInterval: number | undefined
+}
+
+const useColorShift = (shiftInterval?: number, disableShift = false, customColorList?: ColorListType[]): UseColorShiftReturnType => {
+ if (shiftInterval && shiftInterval <= 0) throw new Error("shiftInterval must be greater than 0")
+
+ const randomColor = () => (customColorList ?? colorList)[Math.floor(Math.random() * colorList.length | 0)];
+
+ const [circleColors, setCircleColors] = useState<{
+ firstColor: ColorListType | "",
+ secondColor: ColorListType | "",
+ thirdColor: ColorListType | "",
+ }>({
+ firstColor: colorList[0],
+ secondColor: colorList[1],
+ thirdColor: colorList[2],
+ })
+
+ function shift() {
+ const firstColor = randomColor();
+ const secondColor = randomColor();
+ const thirdColor = randomColor();
+
+ setCircleColors({ firstColor, secondColor, thirdColor });
+ return { firstColor, secondColor, thirdColor };
+ }
+
+ // perform initial mount of color changing pattern
+ useEffect(disableShift ? shift : (() => { return }), []);
+
+ // set this function to repeat
+ useEffect(() => {
+ const interval = setInterval(() => {
+ shift();
+ }, shiftInterval ?? 3000);
+
+ return () => clearInterval(interval);
+ }, [])
+
+ return { ...circleColors, shift, shiftInterval };
+}
+
+export default useColorShift
diff --git a/components/mdx/index.tsx b/components/mdx/index.tsx
new file mode 100644
index 0000000..0801caa
--- /dev/null
+++ b/components/mdx/index.tsx
@@ -0,0 +1,45 @@
+import { v4 } from "uuid"
+import { cabin } from "@/app/layout";
+
+type ElementType = React.FC
+type FormattedTags = {
+ [Key in keyof JSX.IntrinsicElements]: ElementType
+}
+
+const H1TAG: ElementType<"h1"> = ({ children }) => { return (
+ {children}
+)}
+
+const H2Tag: ElementType<"h2"> = ({ children }) => (
+ {children}
+)
+
+const H3Tag: ElementType<"h3"> = ({ children }) => (
+ {children}
+)
+
+const H4Tag: ElementType<"h4"> = ({ children }) => (
+ {children}
+)
+
+const PTag: ElementType<"p"> = ({ children }) => (
+ {children}
+)
+
+const LiTag: ElementType<"li"> = ({ children }) => (
+ {children}
+)
+
+const BrTag: ElementType<"br"> = () => (
+
+)
+
+export default {
+ "h1": H1TAG,
+ "h2": H2Tag,
+ "h3": H3Tag,
+ "h4": H4Tag,
+ "p": PTag,
+ "li": LiTag,
+ "br": BrTag
+} satisfies Partial
diff --git a/components/ui/Panel.tsx b/components/ui/Panel.tsx
new file mode 100644
index 0000000..dda8a36
--- /dev/null
+++ b/components/ui/Panel.tsx
@@ -0,0 +1,31 @@
+import { FC, ReactNode } from "react"
+import { v4 } from "uuid"
+import type { TailwindFraction, TailwindNumber } from "./types"
+
+interface PanelProps {
+ children: ReactNode
+ width?: TailwindFraction | TailwindNumber | undefined
+ height?: TailwindFraction | TailwindNumber | undefined
+}
+
+const Panel: FC = ({ children, width, height }) => {
+ const narrow = (input: TailwindNumber | TailwindFraction | undefined) => {
+ if (typeof input === 'number') return input.toString();
+ return input ?? "auto";
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
+export default Panel
diff --git a/components/ui/types.ts b/components/ui/types.ts
new file mode 100644
index 0000000..5bd7641
--- /dev/null
+++ b/components/ui/types.ts
@@ -0,0 +1,17 @@
+const tailwindNumbers = [
+ 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 14, 16, 20, 24, 28,
+ 32, 36, 40, 44, 48, 52, 56, 60, 64,
+ 72, 80, 96
+] as const;
+
+const tailwindFractions = [
+ "1/2", "1/3", "2/3", "1/4", "2/4", "3/4",
+ "1/5", "2/5", "3/5", "4/5", "1/6", "2/6",
+ "3/6", "4/6", "5/6", "1/12", "2/12", "3/12",
+ "4/12", "5/12", "6/12", "7/12", "8/12", "9/12",
+ "10/12", "11/12"
+] as const;
+
+export type TailwindNumber = typeof tailwindNumbers[number];
+export type TailwindFraction = typeof tailwindFractions[number];
diff --git a/index.html b/index.html
deleted file mode 100644
index bc48649..0000000
--- a/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
- Mikayla Dobson | Developer
-
-
-
-
-
-
diff --git a/mdx-components.tsx b/mdx-components.tsx
new file mode 100644
index 0000000..77f0053
--- /dev/null
+++ b/mdx-components.tsx
@@ -0,0 +1,12 @@
+// https://github.com/vercel/next.js/blob/canary/examples/app-dir-mdx/mdx-components.tsx
+
+import type { MDXComponents } from 'mdx/types'
+
+// This file is required to use MDX in `app` directory.
+export function useMDXComponents(components: MDXComponents): MDXComponents {
+ return {
+ // Allows customizing built-in components, e.g. to add styling.
+ // h1: ({ children }) => {children} ,
+ ...components,
+ }
+}
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 0000000..f257fac
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,26 @@
+// more about configuring mdx
+// https://nextjs.org/docs/pages/building-your-application/configuring/mdx
+
+const withMDX = require('@next/mdx')({
+ extension: /\.mdx?$/,
+ options: {
+ // If you use remark-gfm, you'll need to use next.config.mjs
+ // as the package is ESM only
+ // https://github.com/remarkjs/remark-gfm#install
+ remarkPlugins: [require("remark-prism")],
+ rehypePlugins: [],
+ providerImportSource: "@mdx-js/react",
+ },
+});
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx'],
+ reactStrictMode: true,
+ experimental: {
+ // mdxRs: true,
+ // serverActions: true,
+ }
+}
+
+module.exports = withMDX(nextConfig);
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 998e633..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,2687 +0,0 @@
-{
- "name": "about-mikayla-0722",
- "version": "0.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "about-mikayla-0722",
- "version": "0.0.0",
- "dependencies": {
- "@emotion/react": "^11.9.3",
- "@emotion/styled": "^11.9.3",
- "@mui/icons-material": "^5.8.4",
- "@mui/material": "^5.8.7",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "react-router-dom": "^6.3.0",
- "sass": "^1.53.0",
- "uuid": "^8.3.2"
- },
- "devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "@vitejs/plugin-react": "^1.3.0",
- "vite": "^2.9.9"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.2.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.1.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/highlight": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.18.8",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.6",
- "@babel/helper-compilation-targets": "^7.18.6",
- "@babel/helper-module-transforms": "^7.18.6",
- "@babel/helpers": "^7.18.6",
- "@babel/parser": "^7.18.6",
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.6",
- "@babel/types": "^7.18.6",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.18.7",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.18.7",
- "@jridgewell/gen-mapping": "^0.3.2",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.18.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.18.6",
- "@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.20.2",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.18.6",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.18.6",
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.18.8",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.18.6",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.18.6",
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.8",
- "@babel/types": "^7.18.8"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.18.6",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.18.6",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.18.6",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.6",
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.18.8",
- "license": "MIT",
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.18.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.18.6",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-jsx": "^7.18.6",
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.18.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.18.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.18.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.13.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.6",
- "@babel/types": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.18.8",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.7",
- "@babel/helper-environment-visitor": "^7.18.6",
- "@babel/helper-function-name": "^7.18.6",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.18.8",
- "@babel/types": "^7.18.8",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.18.8",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@emotion/babel-plugin": {
- "version": "11.9.2",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/plugin-syntax-jsx": "^7.12.13",
- "@babel/runtime": "^7.13.10",
- "@emotion/hash": "^0.8.0",
- "@emotion/memoize": "^0.7.5",
- "@emotion/serialize": "^1.0.2",
- "babel-plugin-macros": "^2.6.1",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.0.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@emotion/cache": {
- "version": "11.9.3",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.7.4",
- "@emotion/sheet": "^1.1.1",
- "@emotion/utils": "^1.0.0",
- "@emotion/weak-memoize": "^0.2.5",
- "stylis": "4.0.13"
- }
- },
- "node_modules/@emotion/hash": {
- "version": "0.8.0",
- "license": "MIT"
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.1.3",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.7.4"
- }
- },
- "node_modules/@emotion/memoize": {
- "version": "0.7.5",
- "license": "MIT"
- },
- "node_modules/@emotion/react": {
- "version": "11.9.3",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@emotion/babel-plugin": "^11.7.1",
- "@emotion/cache": "^11.9.3",
- "@emotion/serialize": "^1.0.4",
- "@emotion/utils": "^1.1.0",
- "@emotion/weak-memoize": "^0.2.5",
- "hoist-non-react-statics": "^3.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/serialize": {
- "version": "1.0.4",
- "license": "MIT",
- "dependencies": {
- "@emotion/hash": "^0.8.0",
- "@emotion/memoize": "^0.7.4",
- "@emotion/unitless": "^0.7.5",
- "@emotion/utils": "^1.0.0",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@emotion/sheet": {
- "version": "1.1.1",
- "license": "MIT"
- },
- "node_modules/@emotion/styled": {
- "version": "11.9.3",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@emotion/babel-plugin": "^11.7.1",
- "@emotion/is-prop-valid": "^1.1.3",
- "@emotion/serialize": "^1.0.4",
- "@emotion/utils": "^1.1.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0",
- "@emotion/react": "^11.0.0-rc.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/unitless": {
- "version": "0.7.5",
- "license": "MIT"
- },
- "node_modules/@emotion/utils": {
- "version": "1.1.0",
- "license": "MIT"
- },
- "node_modules/@emotion/weak-memoize": {
- "version": "0.2.5",
- "license": "MIT"
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.14",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "node_modules/@mui/base": {
- "version": "5.0.0-alpha.88",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2",
- "@emotion/is-prop-valid": "^1.1.3",
- "@mui/types": "^7.1.4",
- "@mui/utils": "^5.8.6",
- "@popperjs/core": "^2.11.5",
- "clsx": "^1.2.0",
- "prop-types": "^15.8.1",
- "react-is": "^17.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0",
- "react-dom": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/icons-material": {
- "version": "5.8.4",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "@mui/material": "^5.0.0",
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/material": {
- "version": "5.8.7",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2",
- "@mui/base": "5.0.0-alpha.88",
- "@mui/system": "^5.8.7",
- "@mui/types": "^7.1.4",
- "@mui/utils": "^5.8.6",
- "@types/react-transition-group": "^4.4.5",
- "clsx": "^1.2.0",
- "csstype": "^3.1.0",
- "prop-types": "^15.8.1",
- "react-is": "^17.0.2",
- "react-transition-group": "^4.4.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0",
- "react-dom": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/private-theming": {
- "version": "5.8.6",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2",
- "@mui/utils": "^5.8.6",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/styled-engine": {
- "version": "5.8.7",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2",
- "@emotion/cache": "^11.9.3",
- "csstype": "^3.1.0",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "@emotion/react": "^11.4.1",
- "@emotion/styled": "^11.3.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/system": {
- "version": "5.8.7",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2",
- "@mui/private-theming": "^5.8.6",
- "@mui/styled-engine": "^5.8.7",
- "@mui/types": "^7.1.4",
- "@mui/utils": "^5.8.6",
- "clsx": "^1.2.0",
- "csstype": "^3.1.0",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/types": {
- "version": "7.1.4",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/utils": {
- "version": "5.8.6",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.17.2",
- "@types/prop-types": "^15.7.5",
- "@types/react-is": "^16.7.1 || ^17.0.0",
- "prop-types": "^15.8.1",
- "react-is": "^17.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui"
- },
- "peerDependencies": {
- "react": "^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.5",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "4.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "estree-walker": "^2.0.1",
- "picomatch": "^2.2.2"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.0",
- "license": "MIT"
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.5",
- "license": "MIT"
- },
- "node_modules/@types/react": {
- "version": "18.0.15",
- "license": "MIT",
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.0.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-is": {
- "version": "17.0.3",
- "license": "MIT",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-transition-group": {
- "version": "4.4.5",
- "license": "MIT",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.2",
- "license": "MIT"
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "1.3.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.17.10",
- "@babel/plugin-transform-react-jsx": "^7.17.3",
- "@babel/plugin-transform-react-jsx-development": "^7.16.7",
- "@babel/plugin-transform-react-jsx-self": "^7.16.7",
- "@babel/plugin-transform-react-jsx-source": "^7.16.7",
- "@rollup/pluginutils": "^4.2.1",
- "react-refresh": "^0.13.0",
- "resolve": "^1.22.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/babel-plugin-macros": {
- "version": "2.8.0",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.7.2",
- "cosmiconfig": "^6.0.0",
- "resolve": "^1.12.0"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.21.1",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "caniuse-lite": "^1.0.30001359",
- "electron-to-chromium": "^1.4.172",
- "node-releases": "^2.0.5",
- "update-browserslist-db": "^1.0.4"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001364",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/clsx": {
- "version": "1.2.1",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "license": "MIT"
- },
- "node_modules/convert-source-map": {
- "version": "1.8.0",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/cosmiconfig": {
- "version": "6.0.0",
- "license": "MIT",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.0",
- "license": "MIT"
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "license": "MIT",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.185",
- "license": "ISC"
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.14.48",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "esbuild-android-64": "0.14.48",
- "esbuild-android-arm64": "0.14.48",
- "esbuild-darwin-64": "0.14.48",
- "esbuild-darwin-arm64": "0.14.48",
- "esbuild-freebsd-64": "0.14.48",
- "esbuild-freebsd-arm64": "0.14.48",
- "esbuild-linux-32": "0.14.48",
- "esbuild-linux-64": "0.14.48",
- "esbuild-linux-arm": "0.14.48",
- "esbuild-linux-arm64": "0.14.48",
- "esbuild-linux-mips64le": "0.14.48",
- "esbuild-linux-ppc64le": "0.14.48",
- "esbuild-linux-riscv64": "0.14.48",
- "esbuild-linux-s390x": "0.14.48",
- "esbuild-netbsd-64": "0.14.48",
- "esbuild-openbsd-64": "0.14.48",
- "esbuild-sunos-64": "0.14.48",
- "esbuild-windows-32": "0.14.48",
- "esbuild-windows-64": "0.14.48",
- "esbuild-windows-arm64": "0.14.48"
- }
- },
- "node_modules/esbuild-darwin-64": {
- "version": "0.14.48",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-root": {
- "version": "1.1.0",
- "license": "MIT"
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "license": "MIT"
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/history": {
- "version": "5.3.0",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.7.6"
- }
- },
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "license": "BSD-3-Clause",
- "dependencies": {
- "react-is": "^16.7.0"
- }
- },
- "node_modules/hoist-non-react-statics/node_modules/react-is": {
- "version": "16.13.1",
- "license": "MIT"
- },
- "node_modules/immutable": {
- "version": "4.1.0",
- "license": "MIT"
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "license": "MIT"
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.9.0",
- "license": "MIT",
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "license": "MIT"
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "license": "MIT"
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "license": "MIT"
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.4",
- "dev": true,
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.6",
- "license": "MIT"
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "license": "MIT"
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.14",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/prop-types/node_modules/react-is": {
- "version": "16.13.1",
- "license": "MIT"
- },
- "node_modules/react": {
- "version": "18.2.0",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "18.2.0",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- }
- },
- "node_modules/react-is": {
- "version": "17.0.2",
- "license": "MIT"
- },
- "node_modules/react-refresh": {
- "version": "0.13.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-router": {
- "version": "6.3.0",
- "license": "MIT",
- "dependencies": {
- "history": "^5.2.0"
- },
- "peerDependencies": {
- "react": ">=16.8"
- }
- },
- "node_modules/react-router-dom": {
- "version": "6.3.0",
- "license": "MIT",
- "dependencies": {
- "history": "^5.2.0",
- "react-router": "6.3.0"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
- }
- },
- "node_modules/react-transition-group": {
- "version": "4.4.2",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.9",
- "license": "MIT"
- },
- "node_modules/resolve": {
- "version": "1.22.1",
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/rollup": {
- "version": "2.76.0",
- "dev": true,
- "license": "MIT",
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "license": "MIT"
- },
- "node_modules/sass": {
- "version": "1.53.0",
- "license": "MIT",
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/scheduler": {
- "version": "0.23.0",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/semver": {
- "version": "6.3.0",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/source-map": {
- "version": "0.5.7",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stylis": {
- "version": "4.0.13",
- "license": "MIT"
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.4",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "browserslist-lint": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/vite": {
- "version": "2.9.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.14.27",
- "postcss": "^8.4.13",
- "resolve": "^1.22.0",
- "rollup": "^2.59.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": ">=12.2.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- },
- "peerDependencies": {
- "less": "*",
- "sass": "*",
- "stylus": "*"
- },
- "peerDependenciesMeta": {
- "less": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- }
- }
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "license": "ISC",
- "engines": {
- "node": ">= 6"
- }
- }
- },
- "dependencies": {
- "@ampproject/remapping": {
- "version": "2.2.0",
- "requires": {
- "@jridgewell/gen-mapping": "^0.1.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@babel/code-frame": {
- "version": "7.18.6",
- "requires": {
- "@babel/highlight": "^7.18.6"
- }
- },
- "@babel/compat-data": {
- "version": "7.18.8"
- },
- "@babel/core": {
- "version": "7.18.6",
- "requires": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.6",
- "@babel/helper-compilation-targets": "^7.18.6",
- "@babel/helper-module-transforms": "^7.18.6",
- "@babel/helpers": "^7.18.6",
- "@babel/parser": "^7.18.6",
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.6",
- "@babel/types": "^7.18.6",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
- "semver": "^6.3.0"
- }
- },
- "@babel/generator": {
- "version": "7.18.7",
- "requires": {
- "@babel/types": "^7.18.7",
- "@jridgewell/gen-mapping": "^0.3.2",
- "jsesc": "^2.5.1"
- },
- "dependencies": {
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- }
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.18.6",
- "dev": true,
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.18.6",
- "requires": {
- "@babel/compat-data": "^7.18.6",
- "@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.20.2",
- "semver": "^6.3.0"
- }
- },
- "@babel/helper-environment-visitor": {
- "version": "7.18.6"
- },
- "@babel/helper-function-name": {
- "version": "7.18.6",
- "requires": {
- "@babel/template": "^7.18.6",
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.18.6",
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.18.8",
- "requires": {
- "@babel/helper-environment-visitor": "^7.18.6",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.18.6",
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.8",
- "@babel/types": "^7.18.8"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.18.6"
- },
- "@babel/helper-simple-access": {
- "version": "7.18.6",
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "requires": {
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.18.6"
- },
- "@babel/helper-validator-option": {
- "version": "7.18.6"
- },
- "@babel/helpers": {
- "version": "7.18.6",
- "requires": {
- "@babel/template": "^7.18.6",
- "@babel/traverse": "^7.18.6",
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/highlight": {
- "version": "7.18.6",
- "requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.18.8"
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "requires": {
- "@babel/helper-plugin-utils": "^7.18.6"
- }
- },
- "@babel/plugin-transform-react-jsx": {
- "version": "7.18.6",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.18.6",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-jsx": "^7.18.6",
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/plugin-transform-react-jsx-development": {
- "version": "7.18.6",
- "dev": true,
- "requires": {
- "@babel/plugin-transform-react-jsx": "^7.18.6"
- }
- },
- "@babel/plugin-transform-react-jsx-self": {
- "version": "7.18.6",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.18.6"
- }
- },
- "@babel/plugin-transform-react-jsx-source": {
- "version": "7.18.6",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.18.6"
- }
- },
- "@babel/runtime": {
- "version": "7.18.6",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.18.6",
- "requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.6",
- "@babel/types": "^7.18.6"
- }
- },
- "@babel/traverse": {
- "version": "7.18.8",
- "requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.7",
- "@babel/helper-environment-visitor": "^7.18.6",
- "@babel/helper-function-name": "^7.18.6",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.18.8",
- "@babel/types": "^7.18.8",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/types": {
- "version": "7.18.8",
- "requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@emotion/babel-plugin": {
- "version": "11.9.2",
- "requires": {
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/plugin-syntax-jsx": "^7.12.13",
- "@babel/runtime": "^7.13.10",
- "@emotion/hash": "^0.8.0",
- "@emotion/memoize": "^0.7.5",
- "@emotion/serialize": "^1.0.2",
- "babel-plugin-macros": "^2.6.1",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.0.13"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0"
- }
- }
- },
- "@emotion/cache": {
- "version": "11.9.3",
- "requires": {
- "@emotion/memoize": "^0.7.4",
- "@emotion/sheet": "^1.1.1",
- "@emotion/utils": "^1.0.0",
- "@emotion/weak-memoize": "^0.2.5",
- "stylis": "4.0.13"
- }
- },
- "@emotion/hash": {
- "version": "0.8.0"
- },
- "@emotion/is-prop-valid": {
- "version": "1.1.3",
- "requires": {
- "@emotion/memoize": "^0.7.4"
- }
- },
- "@emotion/memoize": {
- "version": "0.7.5"
- },
- "@emotion/react": {
- "version": "11.9.3",
- "requires": {
- "@babel/runtime": "^7.13.10",
- "@emotion/babel-plugin": "^11.7.1",
- "@emotion/cache": "^11.9.3",
- "@emotion/serialize": "^1.0.4",
- "@emotion/utils": "^1.1.0",
- "@emotion/weak-memoize": "^0.2.5",
- "hoist-non-react-statics": "^3.3.1"
- }
- },
- "@emotion/serialize": {
- "version": "1.0.4",
- "requires": {
- "@emotion/hash": "^0.8.0",
- "@emotion/memoize": "^0.7.4",
- "@emotion/unitless": "^0.7.5",
- "@emotion/utils": "^1.0.0",
- "csstype": "^3.0.2"
- }
- },
- "@emotion/sheet": {
- "version": "1.1.1"
- },
- "@emotion/styled": {
- "version": "11.9.3",
- "requires": {
- "@babel/runtime": "^7.13.10",
- "@emotion/babel-plugin": "^11.7.1",
- "@emotion/is-prop-valid": "^1.1.3",
- "@emotion/serialize": "^1.0.4",
- "@emotion/utils": "^1.1.0"
- }
- },
- "@emotion/unitless": {
- "version": "0.7.5"
- },
- "@emotion/utils": {
- "version": "1.1.0"
- },
- "@emotion/weak-memoize": {
- "version": "0.2.5"
- },
- "@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "requires": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0"
- },
- "@jridgewell/set-array": {
- "version": "1.1.2"
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14"
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.14",
- "requires": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "@mui/base": {
- "version": "5.0.0-alpha.88",
- "requires": {
- "@babel/runtime": "^7.17.2",
- "@emotion/is-prop-valid": "^1.1.3",
- "@mui/types": "^7.1.4",
- "@mui/utils": "^5.8.6",
- "@popperjs/core": "^2.11.5",
- "clsx": "^1.2.0",
- "prop-types": "^15.8.1",
- "react-is": "^17.0.2"
- }
- },
- "@mui/icons-material": {
- "version": "5.8.4",
- "requires": {
- "@babel/runtime": "^7.17.2"
- }
- },
- "@mui/material": {
- "version": "5.8.7",
- "requires": {
- "@babel/runtime": "^7.17.2",
- "@mui/base": "5.0.0-alpha.88",
- "@mui/system": "^5.8.7",
- "@mui/types": "^7.1.4",
- "@mui/utils": "^5.8.6",
- "@types/react-transition-group": "^4.4.5",
- "clsx": "^1.2.0",
- "csstype": "^3.1.0",
- "prop-types": "^15.8.1",
- "react-is": "^17.0.2",
- "react-transition-group": "^4.4.2"
- }
- },
- "@mui/private-theming": {
- "version": "5.8.6",
- "requires": {
- "@babel/runtime": "^7.17.2",
- "@mui/utils": "^5.8.6",
- "prop-types": "^15.8.1"
- }
- },
- "@mui/styled-engine": {
- "version": "5.8.7",
- "requires": {
- "@babel/runtime": "^7.17.2",
- "@emotion/cache": "^11.9.3",
- "csstype": "^3.1.0",
- "prop-types": "^15.8.1"
- }
- },
- "@mui/system": {
- "version": "5.8.7",
- "requires": {
- "@babel/runtime": "^7.17.2",
- "@mui/private-theming": "^5.8.6",
- "@mui/styled-engine": "^5.8.7",
- "@mui/types": "^7.1.4",
- "@mui/utils": "^5.8.6",
- "clsx": "^1.2.0",
- "csstype": "^3.1.0",
- "prop-types": "^15.8.1"
- }
- },
- "@mui/types": {
- "version": "7.1.4",
- "requires": {}
- },
- "@mui/utils": {
- "version": "5.8.6",
- "requires": {
- "@babel/runtime": "^7.17.2",
- "@types/prop-types": "^15.7.5",
- "@types/react-is": "^16.7.1 || ^17.0.0",
- "prop-types": "^15.8.1",
- "react-is": "^17.0.2"
- }
- },
- "@popperjs/core": {
- "version": "2.11.5"
- },
- "@rollup/pluginutils": {
- "version": "4.2.1",
- "dev": true,
- "requires": {
- "estree-walker": "^2.0.1",
- "picomatch": "^2.2.2"
- }
- },
- "@types/parse-json": {
- "version": "4.0.0"
- },
- "@types/prop-types": {
- "version": "15.7.5"
- },
- "@types/react": {
- "version": "18.0.15",
- "requires": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "@types/react-dom": {
- "version": "18.0.6",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/react-is": {
- "version": "17.0.3",
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/react-transition-group": {
- "version": "4.4.5",
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/scheduler": {
- "version": "0.16.2"
- },
- "@vitejs/plugin-react": {
- "version": "1.3.2",
- "dev": true,
- "requires": {
- "@babel/core": "^7.17.10",
- "@babel/plugin-transform-react-jsx": "^7.17.3",
- "@babel/plugin-transform-react-jsx-development": "^7.16.7",
- "@babel/plugin-transform-react-jsx-self": "^7.16.7",
- "@babel/plugin-transform-react-jsx-source": "^7.16.7",
- "@rollup/pluginutils": "^4.2.1",
- "react-refresh": "^0.13.0",
- "resolve": "^1.22.0"
- }
- },
- "ansi-styles": {
- "version": "3.2.1",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "anymatch": {
- "version": "3.1.2",
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "babel-plugin-macros": {
- "version": "2.8.0",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "cosmiconfig": "^6.0.0",
- "resolve": "^1.12.0"
- }
- },
- "binary-extensions": {
- "version": "2.2.0"
- },
- "braces": {
- "version": "3.0.2",
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "browserslist": {
- "version": "4.21.1",
- "requires": {
- "caniuse-lite": "^1.0.30001359",
- "electron-to-chromium": "^1.4.172",
- "node-releases": "^2.0.5",
- "update-browserslist-db": "^1.0.4"
- }
- },
- "callsites": {
- "version": "3.1.0"
- },
- "caniuse-lite": {
- "version": "1.0.30001364"
- },
- "chalk": {
- "version": "2.4.2",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chokidar": {
- "version": "3.5.3",
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "clsx": {
- "version": "1.2.1"
- },
- "color-convert": {
- "version": "1.9.3",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3"
- },
- "convert-source-map": {
- "version": "1.8.0",
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cosmiconfig": {
- "version": "6.0.0",
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- }
- },
- "csstype": {
- "version": "3.1.0"
- },
- "debug": {
- "version": "4.3.4",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "dom-helpers": {
- "version": "5.2.1",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "electron-to-chromium": {
- "version": "1.4.185"
- },
- "error-ex": {
- "version": "1.3.2",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "esbuild": {
- "version": "0.14.48",
- "dev": true,
- "requires": {
- "esbuild-android-64": "0.14.48",
- "esbuild-android-arm64": "0.14.48",
- "esbuild-darwin-64": "0.14.48",
- "esbuild-darwin-arm64": "0.14.48",
- "esbuild-freebsd-64": "0.14.48",
- "esbuild-freebsd-arm64": "0.14.48",
- "esbuild-linux-32": "0.14.48",
- "esbuild-linux-64": "0.14.48",
- "esbuild-linux-arm": "0.14.48",
- "esbuild-linux-arm64": "0.14.48",
- "esbuild-linux-mips64le": "0.14.48",
- "esbuild-linux-ppc64le": "0.14.48",
- "esbuild-linux-riscv64": "0.14.48",
- "esbuild-linux-s390x": "0.14.48",
- "esbuild-netbsd-64": "0.14.48",
- "esbuild-openbsd-64": "0.14.48",
- "esbuild-sunos-64": "0.14.48",
- "esbuild-windows-32": "0.14.48",
- "esbuild-windows-64": "0.14.48",
- "esbuild-windows-arm64": "0.14.48"
- }
- },
- "esbuild-darwin-64": {
- "version": "0.14.48",
- "dev": true,
- "optional": true
- },
- "escalade": {
- "version": "3.1.1"
- },
- "escape-string-regexp": {
- "version": "1.0.5"
- },
- "estree-walker": {
- "version": "2.0.2",
- "dev": true
- },
- "fill-range": {
- "version": "7.0.1",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-root": {
- "version": "1.1.0"
- },
- "fsevents": {
- "version": "2.3.2",
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1"
- },
- "gensync": {
- "version": "1.0.0-beta.2"
- },
- "glob-parent": {
- "version": "5.1.2",
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globals": {
- "version": "11.12.0"
- },
- "has": {
- "version": "1.0.3",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0"
- },
- "history": {
- "version": "5.3.0",
- "requires": {
- "@babel/runtime": "^7.7.6"
- }
- },
- "hoist-non-react-statics": {
- "version": "3.3.2",
- "requires": {
- "react-is": "^16.7.0"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1"
- }
- }
- },
- "immutable": {
- "version": "4.1.0"
- },
- "import-fresh": {
- "version": "3.3.0",
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "is-arrayish": {
- "version": "0.2.1"
- },
- "is-binary-path": {
- "version": "2.1.0",
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-core-module": {
- "version": "2.9.0",
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-extglob": {
- "version": "2.1.1"
- },
- "is-glob": {
- "version": "4.0.3",
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "7.0.0"
- },
- "js-tokens": {
- "version": "4.0.0"
- },
- "jsesc": {
- "version": "2.5.2"
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1"
- },
- "json5": {
- "version": "2.2.3"
- },
- "lines-and-columns": {
- "version": "1.2.4"
- },
- "loose-envify": {
- "version": "1.4.0",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "ms": {
- "version": "2.1.2"
- },
- "nanoid": {
- "version": "3.3.4",
- "dev": true
- },
- "node-releases": {
- "version": "2.0.6"
- },
- "normalize-path": {
- "version": "3.0.0"
- },
- "object-assign": {
- "version": "4.1.1"
- },
- "parent-module": {
- "version": "1.0.1",
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "5.2.0",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-parse": {
- "version": "1.0.7"
- },
- "path-type": {
- "version": "4.0.0"
- },
- "picocolors": {
- "version": "1.0.0"
- },
- "picomatch": {
- "version": "2.3.1"
- },
- "postcss": {
- "version": "8.4.14",
- "dev": true,
- "requires": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- }
- },
- "prop-types": {
- "version": "15.8.1",
- "requires": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1"
- }
- }
- },
- "react": {
- "version": "18.2.0",
- "requires": {
- "loose-envify": "^1.1.0"
- }
- },
- "react-dom": {
- "version": "18.2.0",
- "requires": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- }
- },
- "react-is": {
- "version": "17.0.2"
- },
- "react-refresh": {
- "version": "0.13.0",
- "dev": true
- },
- "react-router": {
- "version": "6.3.0",
- "requires": {
- "history": "^5.2.0"
- }
- },
- "react-router-dom": {
- "version": "6.3.0",
- "requires": {
- "history": "^5.2.0",
- "react-router": "6.3.0"
- }
- },
- "react-transition-group": {
- "version": "4.4.2",
- "requires": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.9"
- },
- "resolve": {
- "version": "1.22.1",
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-from": {
- "version": "4.0.0"
- },
- "rollup": {
- "version": "2.76.0",
- "dev": true,
- "requires": {
- "fsevents": "~2.3.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.2"
- },
- "sass": {
- "version": "1.53.0",
- "requires": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- }
- },
- "scheduler": {
- "version": "0.23.0",
- "requires": {
- "loose-envify": "^1.1.0"
- }
- },
- "semver": {
- "version": "6.3.0"
- },
- "source-map": {
- "version": "0.5.7"
- },
- "source-map-js": {
- "version": "1.0.2"
- },
- "stylis": {
- "version": "4.0.13"
- },
- "supports-color": {
- "version": "5.5.0",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0"
- },
- "to-fast-properties": {
- "version": "2.0.0"
- },
- "to-regex-range": {
- "version": "5.0.1",
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "update-browserslist-db": {
- "version": "1.0.4",
- "requires": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- }
- },
- "uuid": {
- "version": "8.3.2"
- },
- "vite": {
- "version": "2.9.14",
- "dev": true,
- "requires": {
- "esbuild": "^0.14.27",
- "fsevents": "~2.3.2",
- "postcss": "^8.4.13",
- "resolve": "^1.22.0",
- "rollup": "^2.59.0"
- }
- },
- "yaml": {
- "version": "1.10.2"
- }
- }
-}
diff --git a/package.json b/package.json
index 78ad9b7..6dca4dd 100644
--- a/package.json
+++ b/package.json
@@ -1,27 +1,36 @@
{
- "name": "about-mikayla-0722",
+ "name": "mikayla-dobson-dev",
+ "version": "0.1.0",
"private": true,
- "version": "0.0.0",
"scripts": {
- "dev": "vite",
- "build": "vite build",
- "preview": "vite preview"
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
},
"dependencies": {
- "@emotion/react": "^11.9.3",
- "@emotion/styled": "^11.9.3",
- "@mui/icons-material": "^5.8.4",
- "@mui/material": "^5.8.7",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "react-router-dom": "^6.3.0",
- "sass": "^1.53.0",
- "uuid": "^8.3.2"
+ "@aws-sdk/client-s3": "^3.367.0",
+ "@mdx-js/loader": "^2.3.0",
+ "@mdx-js/react": "^2.3.0",
+ "@next/mdx": "^13.4.4",
+ "@supabase/supabase-js": "^2.26.0",
+ "autoprefixer": "10.4.14",
+ "eslint": "^8.46.0",
+ "eslint-config-next": "^13.4.12",
+ "next": "^13.4.12",
+ "postcss": "8.4.24",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ "react-icons": "^4.9.0",
+ "remark-prism": "^1.3.6",
+ "tailwindcss": "3.3.2",
+ "typescript": "5.0.4",
+ "uuid": "^9.0.0"
},
"devDependencies": {
- "@types/react": "^18.0.0",
- "@types/react-dom": "^18.0.0",
- "@vitejs/plugin-react": "^1.3.0",
- "vite": "^2.9.9"
+ "@types/node": "20.2.5",
+ "@types/react": "18.2.7",
+ "@types/react-dom": "18.2.4",
+ "@types/uuid": "^9.0.1"
}
}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..33ad091
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/public/backdrops/jean-beller-peW5dg2-cLI-unsplash.jpg b/public/backdrops/jean-beller-peW5dg2-cLI-unsplash.jpg
new file mode 100644
index 0000000..30b9996
Binary files /dev/null and b/public/backdrops/jean-beller-peW5dg2-cLI-unsplash.jpg differ
diff --git a/src/media/profile.jpeg b/public/img/profile.jpeg
similarity index 100%
rename from src/media/profile.jpeg
rename to public/img/profile.jpeg
diff --git a/public/next.svg b/public/next.svg
new file mode 100644
index 0000000..5174b28
--- /dev/null
+++ b/public/next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/resume/Mikayla Resume 0623.docx b/public/resume/Mikayla Resume 0623.docx
new file mode 100644
index 0000000..7f55bd7
Binary files /dev/null and b/public/resume/Mikayla Resume 0623.docx differ
diff --git a/public/resume/Mikayla Resume 0623.pdf b/public/resume/Mikayla Resume 0623.pdf
new file mode 100644
index 0000000..396fad4
Binary files /dev/null and b/public/resume/Mikayla Resume 0623.pdf differ
diff --git a/public/vercel.svg b/public/vercel.svg
new file mode 100644
index 0000000..d2f8422
--- /dev/null
+++ b/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/server/actions/projects.actions.ts b/server/actions/projects.actions.ts
new file mode 100644
index 0000000..894c244
--- /dev/null
+++ b/server/actions/projects.actions.ts
@@ -0,0 +1,19 @@
+import supabaseClient from "../services/supabase";
+
+export default class ProjectsActions {
+ static api = supabaseClient();
+
+ static async getProjects() {
+ const { data, error } = await this.api.from("projects").select("*");
+
+ if (error) throw error;
+ return data;
+ }
+
+ static async getProjectsById(id: string) {
+ const { data, error } = await this.api.from("projects").select("*").eq("id", id);
+
+ if (error) throw error;
+ return data;
+ }
+}
diff --git a/server/actions/work.actions.ts b/server/actions/work.actions.ts
new file mode 100644
index 0000000..86d153b
--- /dev/null
+++ b/server/actions/work.actions.ts
@@ -0,0 +1,21 @@
+'use server';
+
+import supabaseClient from "../services/supabase";
+
+export default class WorkActions {
+ static api = supabaseClient();
+
+ static async getWork() {
+ const { data, error } = await this.api.from("work").select("*");
+
+ if (error) throw error;
+ return data;
+ }
+
+ static async getWorkById(id: string) {
+ const { data, error } = await this.api.from("work").select("*").eq("id", id);
+
+ if (error) throw error;
+ return data;
+ }
+}
diff --git a/server/index.ts b/server/index.ts
new file mode 100644
index 0000000..4f5afdf
--- /dev/null
+++ b/server/index.ts
@@ -0,0 +1,3 @@
+export default async function main() {
+ return await Promise.resolve(12);
+}
diff --git a/server/services/s3.ts b/server/services/s3.ts
new file mode 100644
index 0000000..825890b
--- /dev/null
+++ b/server/services/s3.ts
@@ -0,0 +1,19 @@
+import { S3Client } from "@aws-sdk/client-s3";
+
+export default function createS3Client() {
+ if (typeof process.env.S3_ACCESS_KEY !== "string") {
+ throw new Error("S3_ACCESS_KEY is not defined");
+ }
+
+ if (typeof process.env.S3_SECRET !== "string") {
+ throw new Error("S3_SECRET is not defined");
+ }
+
+ return new S3Client({
+ region: "us-east-1",
+ credentials: {
+ accessKeyId: process.env.S3_ACCESS_KEY,
+ secretAccessKey: process.env.S3_SECRET,
+ },
+ });
+}
diff --git a/server/services/supabase.ts b/server/services/supabase.ts
new file mode 100644
index 0000000..f40935b
--- /dev/null
+++ b/server/services/supabase.ts
@@ -0,0 +1,13 @@
+import { createClient } from "@supabase/supabase-js";
+
+export default function supabaseClient() {
+ if (typeof process.env.SUPABASE_URL !== "string") {
+ throw new Error("SUPABASE_URL is not defined");
+ }
+
+ if (typeof process.env.SUPABASE_KEY !== "string") {
+ throw new Error("SUPABASE_KEY is not defined");
+ }
+
+ return createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
+}
diff --git a/src/App.jsx b/src/App.jsx
deleted file mode 100644
index 4ca9c12..0000000
--- a/src/App.jsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { BrowserRouter, Routes, Route } from 'react-router-dom';
-
-import Welcome from './pages/Welcome';
-import AboutMe from './pages/AboutMe';
-import Projects from './pages/Projects';
-import Technologies from './pages/Technologies';
-import Links from './pages/Links';
-import CreativeWorks from './pages/CreativeWorks';
-import Navbar from './components/Navbar';
-
-import './sass/App.scss';
-
-function App() {
- return (
-
-
-
-
-
- } />
- } />
- } />
- } />
- } />
- } />
-
-
-
-
- );
-}
-
-export default App;
diff --git a/src/components/AboutMe/AboutSection.jsx b/src/components/AboutMe/AboutSection.jsx
deleted file mode 100644
index 4583a2a..0000000
--- a/src/components/AboutMe/AboutSection.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { useState } from "react"
-
-export function AboutSection({ data }) {
- const [visible, setVisible] = useState(false);
-
- return (
-
-
-
{data.title}
- setVisible(!visible)}>{visible ? "Hide" : "Show"}
-
- { visible && data.jsx }
-
- )
-}
\ No newline at end of file
diff --git a/src/components/AboutMe/SectionData.jsx b/src/components/AboutMe/SectionData.jsx
deleted file mode 100644
index 83942d5..0000000
--- a/src/components/AboutMe/SectionData.jsx
+++ /dev/null
@@ -1,126 +0,0 @@
-import { Card, Chip } from "@mui/material"
-import { v4 } from 'uuid';
-
-export const WhatIDo = {
- title: "What I Do",
- jsx: (
-
-
- Create full stack web applications
- I have experience building web applications with and without back-end integrations.
- I am comfortable conceptualizing and organizing complex structures, and as such, my projects tend to be
- natural in their structure and easy to maintain.
-
-
-
- Collaborative software engineering
- I have consulted on small teams with:
-
-
Dization , a Pittsburgh-based company developing an enterprise resource planning solution for small businesses
-
Metazu Studio , a Nashville-based startup connecting clients with services in video production, AR/VR, social media, photography, and web design.
-
-
- My work on these projects deals with managing the complexities of full-stack web engineering, as well as delivering beautiful user experiences to end customers.
-
-
-
- Creative minded problem solver
-
- My background as a musician, composer, producer, and artistic
- collaborator provide me with a unique frame of reference for solving technical
- problems and adapting to dynamic environments.
-
-
-
-
- Database Operations and Management
- My projects have featured both relational and non-relational databases, in particular
- PostgreSQL and MongoDB. I also have experience with various methods of connecting these
- to front-end applications.
-
-
- )
-}
-
-export const Education = {
- title: "Education",
- jsx: (
-
-
- Bachelors of Arts, Music
- Southern Methodist University, 2014 - 2017
- Concentrations: Piano Performance, Music Composition, Music Theory
- Minor: French Language and Culture
-
-
-
- Self Directed Study, Web Engineering
- 2021 - present
- Codecademy Pro, Front End Engineer Career Path
- Concentrations: React, Redux, Express, PostgreSQL
-
-
- )
-}
-
-const MetazuConcepts = [
- "UI/UX design", "Pair Programming", "REST APIs", "Database management", "Consulting with clients"
-]
-
-const DizationConcepts = [
- "Enterprise Resource Planning", "AWS", "System Design", "UI/UX Design", "Database management"
-]
-
-const MusicExperiences = [
- "Avant Chamber Ballet", "Dallas Symphony Orchestra", "Boston University", "National Public Radio"
-]
-
-export const Employment = {
- title: "Employment",
- jsx: (
-
-
- Full Stack Engineer, intern
- Dization, Inc | Pittsburgh, PA (remote) Sept 2022 - present
- Relevant Duties: contributing to the development of a full-stack enterprise resource planning application built using
- the LAMP stack hosted on AWS.
-
- { DizationConcepts.map(each => )}
-
-
-
- Web Design Consultant
- Metazu Studio | Nashville, TN Mar 2022 - present
- Relevant Duties: collaboration on the design and production of responsive web apps, using skills including:
-
- { MetazuConcepts.map(each => ) }
-
-
-
-
- Singer-Songwriter, Composer
-
- Contract, Independent
-
- 2010 - present
-
-
- Multi-instrumentalist, singer-songwriter, and producer, well-versed in a number of musical idioms
- and music technologies.
-
-
- { MusicExperiences.map(each => ) }
-
-
-
-
- Barista, Barista Trainer
- Starbucks Coffee Co. 2017 - 2021
-
- Relevant Duties: collaboration, problem-solving, streamlined execution of a process,
- attention to detail, adhering to standardized safety protocols, observing best practices, training new hires.
-
-
-
- )
-}
\ No newline at end of file
diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx
deleted file mode 100644
index dda4cbd..0000000
--- a/src/components/Navbar.jsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import { Button, Drawer, List, ListItem } from "@mui/material"
-import { useEffect, useState } from "react"
-import { useNavigate } from "react-router-dom";
-
-import MenuIcon from '@mui/icons-material/Menu';
-import '../sass/Navbar.scss';
-import { v4 } from "uuid";
-
-const navOptions = [
- "Home",
- "About Me",
- "My Projects",
- "My Technologies",
- "Links",
- "Creative Work"
-]
-
-export default function Navbar() {
- const [open, setOpen] = useState(false);
- const [selected, setSelected] = useState(null);
-
- const navigate = useNavigate();
-
- useEffect(() => {
- setOpen(false);
- switch (selected) {
- case 0:
- navigate('/');
- break;
- case 1:
- navigate('/about-me');
- break;
- case 2:
- navigate('/projects');
- break;
- case 3:
- navigate('/technologies');
- break;
- case 4:
- navigate('/links');
- break;
- case 5:
- navigate('/creative-works');
- break;
- default:
- navigate('/');
- break;
- }
- }, [selected, navigate]);
-
- return (
-
-
-
-
- setOpen(!open)}>
-
-
-
-
- setOpen(false)}
- open={open}
- >
-
-
-
- {
- navOptions.map(each => {
- let idx = navOptions.indexOf(each);
- return (
- setSelected(idx)}>
- {each}
-
- )
- })
- }
-
-
-
-
- )
-}
\ No newline at end of file
diff --git a/src/components/ProjectsArray.jsx b/src/components/ProjectsArray.jsx
deleted file mode 100644
index cd7caeb..0000000
--- a/src/components/ProjectsArray.jsx
+++ /dev/null
@@ -1,136 +0,0 @@
-import { Card } from "@mui/material";
-import { v4 } from 'uuid';
-
-export const projectsArray = [
- {
- name: "Express Spice Shop",
- languages: ["TypeScript", "React", "PERN", "REST_API"],
- inProgress: true,
- jsx: (
-
-
- A sample, fully-featured e-commerce platform
- Built in React with TypeScript, Node/Express, and PostgreSQL
- Payment processing supported through Stripe (in progress)
- API documentation with Swagger
- IN PROGRESS
-
- )
- },
- {
- name: "Procedural Drones",
- languages: ["JavaScript", "HTML/CSS"],
- inProgress: true,
- deployed: true,
- jsx: (
-
- Procedural Music Generation
- An experimental space for building out procedural music generation using vanilla JavaScript
- Uses Tone.js to interact with the Web Audio API
- Features a plain HTML/CSS front end to interact with the program
-
-
- )
- },
- {
- name: "Reddit, but it's all cats",
- languages: ["React", "Redux"],
- inProgress: false,
- deployed: true,
- jsx: (
-
- Reddit, but it's all cats
- A read-only Reddit client -- this site fetches data from Reddit and displays a curated feed.
- This was built on Reddit's JSON API, using React/Redux and CSS.
- And yes, it's all cats.
-
-
- )
- },
- {
- name: "Personal Timestamp Generator",
- languages: ["Python", "SQLite"],
- inProgress: false,
- jsx: (
-
- Personal Timestamp Generator
- A small-scale timestamp/productivity management tool for individual use and logging of
- time, including compartmentalization by task and some aggregate functions based on queries.
-
- Command-line interface built on Python with a SQLite Database.
- View the repo here!
-
- )
- },
- {
- name: "Password Game",
- languages: ["React", "MongoDB", "MERN", "React", "REST_API", "Socket.io", "Sass", "MaterialUI"],
- inProgress: true,
- jsx: (
-
- Password Game
- As part of a mentorship program hosted by Metazu Studio
- Implemented using MongoDB, React, and Node/Express, styled with Material UI/SCSS.
- In progress, building in collaboration with others at Metazu Studio.
-
- )
- },
- {
- name: "Splendor Clone",
- languages: ["React", "TypeScript"],
- inProgress: true,
- jsx: (
-
- Splendor -- a clone of the board game by Marc André
- A clone of a popular card-based resource gathering game
- Local multiplayer, with plans to build out online multiplayer and solo vs. CPU
- In progress. Using React, Node/Express, and PostgreSQL.
-
- )
- },
- {
- name: "Recipin",
- languages: ["React", "TypeScript", "PERN"],
- inProgress: true,
- jsx: (
-
- Recipin -- a home recipe management solution
- Manage a collection of your own commonly-used recipes
- Features a full user-auth workflow and enables the sharing of recipes between users
- Allows the user to build shopping lists from collections of their recipes
- Built using full end-to-end TypeScript for the React front end and the Express server
-
- )
- },
- {
- name: "Photosorting with VGG16",
- languages: ["Python", "TensorFlow", "PostgreSQL"],
- inProgress: true,
- jsx: (
-
- Photosorting with VGG16
- A tool written in Python for sorting photos based on the output of VGG16, the pre-trained image recognition model included with TensorFlow.
- The user may also integrate the results of their photo sort into a PostgreSQL database.
- The repository may be found here!
-
- )
- },
- {
- name: "About Mikayla",
- languages: ["React", "Sass", "MaterialUI"],
- inProgress: true,
- jsx: (
-
- And, last but not least, the site you see here!
- This site is built using React, Material UI, and SCSS, and is hosted with Netlify.
- View the site repo here!
-
- )
- }
-]
\ No newline at end of file
diff --git a/src/components/Technologies/MainTopic.jsx b/src/components/Technologies/MainTopic.jsx
deleted file mode 100644
index bc0ebb3..0000000
--- a/src/components/Technologies/MainTopic.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { useState } from "react";
-import { SubTopic } from "./SubTopic";
-import { Card, Chip } from "@mui/material";
-import { v4 } from "uuid";
-
-export function MainTopic({ name, subtopics }) {
- const [collapsed, setCollapsed] = useState(true);
-
- return (
-
- {name}
-
- {
- collapsed || subtopics.map(inner => {
- return (
- inner.subtopics ?
-
- :
- )
- })
- }
-
- setCollapsed(!collapsed)}>{collapsed ? "Show" : "Hide"}
-
- )
-}
\ No newline at end of file
diff --git a/src/components/Technologies/SubTopic.jsx b/src/components/Technologies/SubTopic.jsx
deleted file mode 100644
index f73df74..0000000
--- a/src/components/Technologies/SubTopic.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Card, Chip } from "@mui/material";
-import { useEffect, useState } from "react";
-import { v4 } from "uuid";
-
-export function SubTopic({ data }) {
- const [contents, setContents] = useState();
-
- useEffect(() => {
- setContents(() => {
- if (data.subtopics.length) {
- return data.subtopics.map(each => );
- } else {
- return In progress!
- }
- })
- }, []);
-
- return (
-
- {data.topic}
-
- {contents}
-
-
- )
-}
\ No newline at end of file
diff --git a/src/components/Technologies/techList.js b/src/components/Technologies/techList.js
deleted file mode 100644
index 4e430b6..0000000
--- a/src/components/Technologies/techList.js
+++ /dev/null
@@ -1,104 +0,0 @@
-export const techList = [
- {
- topic: "Programming Languages",
- subtopics: [
- {
- topic: "JavaScript",
- subtopics: [
- "TypeScript",
- "React",
- "Redux",
- "jQuery",
- "NodeJS",
- "Express",
- "ToneJS",
- "Jest"
- ]
- },
- {
- topic: "Python",
- subtopics: [
- "Pandas",
- "Beautiful Soup",
- "TensorFlow, Keras",
- "Flutter with Flet"
- ]
- },
- {
- topic: "Java",
- subtopics: [
- "Spring Boot",
- "Swing"
- ]
- },
- {
- topic: "PHP",
- subtopics: []
- }
- ]
- },
- {
- topic: "Front End Engineering",
- subtopics: [
- {
- topic: "React",
- subtopics: [
- "Redux",
- "React / TypeScript",
- "React Native",
- "React Testing Library",
- "React Router"
- ]
- },
- {
- topic: "Styling",
- subtopics: [
- "CSS",
- "Sass",
- "Bootstrap",
- "Material UI",
- "Responsive Design",
- ]
- }
- ]
- },
-
- {
- topic: "Back End Engineering",
- subtopics: [
- {
- topic: "SQL",
- subtopics: [
- "PostgreSQL",
- "MySQL",
- "Apache Web Server",
- "MongoDB",
- "Supabase"
- ]
- },
- {
- topic: "REST API",
- subtopics: [
- "Express.js",
- "Express-Session",
- "PHP / Apache / MySQL",
- "Java / Spring Boot",
- "API Documentation with Swagger",
- "MVC Architecture"
- ]
- }
- ]
- },
- {
- topic: "Developer Tools",
- subtopics: [
- "Git",
- "GitHub",
- "Visual Studio Code",
- "Vite",
- "Netlify",
- "Heroku",
- "Figma",
- ]
- }
-]
diff --git a/src/favicon.svg b/src/favicon.svg
deleted file mode 100644
index de4aedd..0000000
--- a/src/favicon.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/index.scss b/src/index.scss
deleted file mode 100644
index ec2585e..0000000
--- a/src/index.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
- monospace;
-}
diff --git a/src/main.jsx b/src/main.jsx
deleted file mode 100644
index a3171de..0000000
--- a/src/main.jsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import ReactDOM from 'react-dom/client'
-import App from './App'
-import './index.scss'
-
-ReactDOM.createRoot(document.getElementById('root')).render(
-
-
-
-)
diff --git a/src/media/GitHub-Mark-120px-plus.png b/src/media/GitHub-Mark-120px-plus.png
deleted file mode 100644
index ea6ff54..0000000
Binary files a/src/media/GitHub-Mark-120px-plus.png and /dev/null differ
diff --git a/src/media/LI-In-Bug.png b/src/media/LI-In-Bug.png
deleted file mode 100644
index 8bc2d53..0000000
Binary files a/src/media/LI-In-Bug.png and /dev/null differ
diff --git a/src/media/bandcamp-button-circle-line-black-128.png b/src/media/bandcamp-button-circle-line-black-128.png
deleted file mode 100644
index 16d2022..0000000
Binary files a/src/media/bandcamp-button-circle-line-black-128.png and /dev/null differ
diff --git a/src/media/modulars.jpeg b/src/media/modulars.jpeg
deleted file mode 100644
index 43b2bde..0000000
Binary files a/src/media/modulars.jpeg and /dev/null differ
diff --git a/src/media/paper_score.jpeg b/src/media/paper_score.jpeg
deleted file mode 100644
index 246a43f..0000000
Binary files a/src/media/paper_score.jpeg and /dev/null differ
diff --git a/src/media/soundcloud-icon.png b/src/media/soundcloud-icon.png
deleted file mode 100644
index 4871885..0000000
Binary files a/src/media/soundcloud-icon.png and /dev/null differ
diff --git a/src/media/with_guitar.png b/src/media/with_guitar.png
deleted file mode 100644
index b91b61e..0000000
Binary files a/src/media/with_guitar.png and /dev/null differ
diff --git a/src/pages/AboutMe.jsx b/src/pages/AboutMe.jsx
deleted file mode 100644
index 20225be..0000000
--- a/src/pages/AboutMe.jsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import Card from '@mui/material/Card';
-import { AboutSection } from '../components/AboutMe/AboutSection';
-import { WhatIDo, Education, Employment } from '../components/AboutMe/SectionData';
-import '../sass/pages/AboutMe.scss';
-
-export default function AboutMe() {
- return (
-
- )
-}
\ No newline at end of file
diff --git a/src/pages/CreativeWorks.jsx b/src/pages/CreativeWorks.jsx
deleted file mode 100644
index f700708..0000000
--- a/src/pages/CreativeWorks.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import "../sass/pages/CreativeWorks.scss";
-import { Card } from "@mui/material";
-
-import modulars from "../media/modulars.jpeg";
-import score from "../media/paper_score.jpeg";
-import bandcamp from "../media/bandcamp-button-circle-line-black-128.png";
-import soundcloud from "../media/soundcloud-icon.png";
-
-export default function CreativeWorks() {
- return (
-
-
Creative works
-
-
-
-
-
-
-
- I would be remiss not to take the opportunity to speak about how I feel my experience as a musician informs my work as a developer!
- Working as a musician helped me to develop invaluable skills that provide me with a unique frame of reference in regards to my approach to technical problems.
- See below some of the relevant applications of my musical experience:
-
-
-
- Modular synthesis , which heavily involves fundamentals of arithmetic and data flow
- Orchestration ; ensuring all instrumental parts are executable and comfortable to play within a given set of parameters
- Learning to play new instruments, and adapt my pre-existing knowledge to apply to new frames of reference
- Audio engineering , and the associated practices of learning/using music technology
- Proper interaction of components within a complex system
- Managing proportional integrity in musical forms
-
-
-
- If you're interested, you can find some samples of my music at the links below:
-
-
-
- )
-}
\ No newline at end of file
diff --git a/src/pages/Links.jsx b/src/pages/Links.jsx
deleted file mode 100644
index 701747d..0000000
--- a/src/pages/Links.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import "../sass/pages/Links.scss";
-import Card from '@mui/material/Card';
-import github from "../media/GitHub-Mark-120px-plus.png";
-import linkedin from "../media/LI-In-Bug.png";
-
-export default function Links() {
- return (
-
-
Check out the links below to get a better look at my work!
-
-
-
- )
-}
\ No newline at end of file
diff --git a/src/pages/Projects.jsx b/src/pages/Projects.jsx
deleted file mode 100644
index 9ffff91..0000000
--- a/src/pages/Projects.jsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import { useState, useEffect, useRef } from 'react';
-import { projectsArray } from '../components/ProjectsArray';
-import { Divider } from '@mui/material';
-import '../sass/pages/Projects.scss';
-
-export default function Projects() {
- const [results, setResults] = useState();
- const [search, setSearch] = useState(null);
- const [text, setText] = useState();
-
- const searchInput = useRef();
-
- useEffect(() => {
- let result = new Set();
-
- if (!search) {
- setResults(projectsArray.map(card => card.jsx));
- return;
- }
-
- if (search && text) {
- for (let entry of text) {
- for (let field of entry.text) {
- if (field.toLowerCase().includes(search)) {
- result.add(projectsArray[entry.projectID]);
- }
- }
- }
- }
-
- if (search && result.size == 0) {
- setResults(
- No results found for search "{search}"
- )
- } else {
- setResults(Array.from(result).map(card => card.jsx));
- }
- }, [search]);
-
- useEffect(() => {
- function unpack(element) {
- if (typeof element == "string") return element;
-
- if (typeof element.props.children != "string") {
- if (Array.isArray(element.props.children)) {
- let composite = "";
-
- for (let each of element.props.children) {
- composite += unpack(each);
- }
-
- return composite;
- }
-
- return unpack(element.props.children);
- }
-
- return element.props.children;
- }
-
- let projectText = [];
- let i = 0;
- while (i < projectsArray.length) {
- let project = {
- projectID: i,
- text: []
- }
-
- let newText;
-
- for (let each of projectsArray[i].jsx.props.children) {
- newText = unpack(each);
- project.text.push(newText);
- }
-
- projectText.push(project);
- i++;
- }
-
- setText(projectText);
- setResults(projectsArray.map(card => card.jsx));
- }, [])
-
- const handleReset = () => {
- setSearch(null);
- searchInput.current.value = null;
- }
-
- return (
-
-
Check out these projects from my portfolio!
-
A selection of my projects:
-
-
-
-
-
-
- {results}
-
-
- )
-}
\ No newline at end of file
diff --git a/src/pages/Technologies.jsx b/src/pages/Technologies.jsx
deleted file mode 100644
index 766fd35..0000000
--- a/src/pages/Technologies.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import '../sass/pages/Technologies.scss';
-import { MainTopic } from '../components/Technologies/MainTopic';
-import { techList } from '../components/Technologies/techList';
-import { v4 } from 'uuid';
-
-export default function Technologies() {
- return (
-
-
These are some of my most frequently used skills and technologies:
-
- {techList.map(item => {
- return (
-
- );
- })}
-
-
- )
-}
\ No newline at end of file
diff --git a/src/pages/Welcome.jsx b/src/pages/Welcome.jsx
deleted file mode 100644
index 8087810..0000000
--- a/src/pages/Welcome.jsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Avatar, Card, Divider } from '@mui/material';
-import profile from '../media/profile.jpeg';
-import '../sass/pages/Welcome.scss';
-
-export default function Welcome() {
- return (
-
-
-
-
-
-
-
- I am a software engineer based in Nashville, Tennessee. I build performant
- web applications, seek out simple solutions to complex problems, and emphasize
- elegance of design.
-
-
- Some of my most frequently used technologies include React, Redux, Node.js,
- Express, TypeScript, Vite, PostgreSQL, MongoDB, and Sass, among others.
-
-
-
-
-
-
- © Mikayla Dobson 2022
-
-
- );
-}
\ No newline at end of file
diff --git a/src/sass/App.scss b/src/sass/App.scss
deleted file mode 100644
index 029122c..0000000
--- a/src/sass/App.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap');
-@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap');
-
-@import "helper/queries";
-@import "helper/variables";
-@import "components/Page";
-
-.App {
- .mobile-show {
- display: none;
- }
-
- button {
- border: transparent;
- border-radius: 6px;
- }
-
- main {
- text-align: center;
- position: relative;
- top: 4.5rem;
-
- .page {
- @extend %page;
- }
- }
-
- @extend %tablet-queries;
- @extend %mobile-queries;
-}
\ No newline at end of file
diff --git a/src/sass/Navbar.scss b/src/sass/Navbar.scss
deleted file mode 100644
index d362438..0000000
--- a/src/sass/Navbar.scss
+++ /dev/null
@@ -1,83 +0,0 @@
-@import "helper/variables";
-@import "components/Button";
-
-.app-navbar {
- display: flex;
- position: fixed;
- top: 0;
-
- background-color: $darkGreen;
- color: $indigoWhite;
- font-family: 'Open Sans', sans-serif;
- border-bottom: 1px solid black;
-
- width: 100vw;
- height: 4.5rem;
- z-index: 9;
-
- button {
- @extend %button-style;
- color: $indigoWhite;
- border-color: transparent;
- border-radius: 0;
- position: absolute;
- right: 0;
- height: 100%;
- &:hover {
- background-color: $mintGreen;
- }
- }
-
- .navbar-left {
- display: flex;
- flex-direction: row;
- width: 75%;
- justify-content: flex-start;
- align-items: baseline;
- }
-
- .navbar-right {
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- padding-right: 1rem;
- width: 25%;
- }
-
- // top right corner, Mikayla Dobson text
- a {
- transition: color 150ms ease;
- font-weight: 900;
- font-size: 2rem;
- padding-left: 1rem;
- border-right: 1px solid black;
- padding-right: 1rem;
- text-decoration: none;
- &:visited {
- color: inherit;
- }
- &:hover {
- color: $mintGreen;
- transition: color 150ms ease;
- }
- }
- h2 {
- font-weight: 400;
- position: relative;
- padding-left: 1rem;
- }
-
- // styles for open sidebar
- .drawer {
- .MuiButtonBase-root {
- background-color: red;
- }
- .drawer-list {
- height: 100vh;
- background-color: red;
- }
- .drawer-list-item {
- background-color: orange;
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/components/_Button.scss b/src/sass/components/_Button.scss
deleted file mode 100644
index 3b484ed..0000000
--- a/src/sass/components/_Button.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-@import "../helper/variables";
-
-%button-style {
- border: transparent;
- background-color: inherit;
- color: $indigoOne;
- padding: 10px 1rem;
- &:hover {
- background-color: $lightIndigo;
- color: $indigoOne;
- }
- &:active {
- background-color: $indigoWhite;
- }
-}
\ No newline at end of file
diff --git a/src/sass/components/_Divider.scss b/src/sass/components/_Divider.scss
deleted file mode 100644
index 2e42e49..0000000
--- a/src/sass/components/_Divider.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-%divider {
- width: 80%;
- color: #000;
- border-width: 2px;
-}
\ No newline at end of file
diff --git a/src/sass/components/_FadeAll.scss b/src/sass/components/_FadeAll.scss
deleted file mode 100644
index afa0053..0000000
--- a/src/sass/components/_FadeAll.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-@import "../helper/animations";
-
-%fadeAll {
- animation: 0.5s fade-in 0.6s linear forwards;
-}
\ No newline at end of file
diff --git a/src/sass/components/_Page.scss b/src/sass/components/_Page.scss
deleted file mode 100644
index deedc17..0000000
--- a/src/sass/components/_Page.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-@import "../helper/variables";
-@import "../components/FadeAll";
-
-%page {
- display: flex;
- flex-direction: column;
- align-items: center;
- min-height: 100vh;
- width: 100vw;
- background-color: #fff;
-}
\ No newline at end of file
diff --git a/src/sass/helper/_animations.scss b/src/sass/helper/_animations.scss
deleted file mode 100644
index cd9cff0..0000000
--- a/src/sass/helper/_animations.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-@keyframes fade-in {
- from {
- opacity: 0;
- }
- 100% {
- opacity: 1;
- }
-}
\ No newline at end of file
diff --git a/src/sass/helper/_mixins.scss b/src/sass/helper/_mixins.scss
deleted file mode 100644
index a82b7d7..0000000
--- a/src/sass/helper/_mixins.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-@import "../helper/animations";
-
-@mixin step-entry($len) {
- @for $i from 1 through $len {
- &:nth-child(#{$i}) {
- animation: 0.5s fade-in #{$i * 0.6 - 0.6}s linear forwards;
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/helper/_queries.scss b/src/sass/helper/_queries.scss
deleted file mode 100644
index 65bb31c..0000000
--- a/src/sass/helper/_queries.scss
+++ /dev/null
@@ -1,236 +0,0 @@
-@import "./mixins";
-@import "./variables";
-
-%tablet-queries {
- @media only screen and (max-width: 1050px) {
- .welcome-page {
- #header-card {
- padding: 0.7rem;
- h3 {
- font-size: 1.2rem;
- }
- h4 {
- font-size: 1rem;
- }
- }
- }
-
- .about-me-page {
- height: auto;
- .about-me-section {
- h1 {
- font-size: 2.25rem;
- }
- button {
- padding: 8px;
- }
- }
- .about-gallery {
- margin-top: 0;
- width: 90vw;
- height: 100%;
- flex-flow: column nowrap;
- align-items: center;
- .MuiPaper-root {
- width: 55%;
- height: auto;
- overflow-y: scroll;
- }
- }
- }
-
- .projects-page {
- .filter-panel {
- margin-bottom: 2rem;
- width: 65%;
- }
- }
-
- .technologies-page {
- .main-topic {
- width: 70vw;
- }
- }
-
- .creative-works-page {
- > * {
- width: 100%;
- }
-
- .cw-gallery img {
- max-width: 45%;
- }
-
- .cw-information, .cw-experiences {
- width: 90%;
- }
-
- .cw-examples {
- .examples-left {
- width: 40vw;
- }
- .examples-right {
- margin-right: 1rem;
- h2 {
- padding: 1rem;
- }
- width: 50vw;
- }
- }
- }
- }
-}
-
-%mobile-queries {
- @media only screen and (max-width: 600px) {
- // universal tags for handling mobile-sensitive elements
- .mobile-hide {
- display: none;
- }
-
- .app-navbar {
- .navbar-left {
- width: 80vw;
- align-items: center;
- .my-name {
- border-right: none;
- }
- }
- .navbar-right {
- width: 20vw;
- align-items: center;
- button {
- padding: 0;
- height: auto;
- }
- }
- a, h2 {
- color: inherit;
- font-weight: 600;
- font-size: 1.25rem;
- }
- }
-
- .welcome-page {
- #header-card {
- animation: none;
- width: 75vw;
- }
- #welcome-info {
- animation: none;
- }
- }
-
- .about-me-page {
- .about-me-section {
- .am-section-mini {
- background-color: $darkLilac;
- position: sticky;
- top: 4.5rem;
- width: 88vw;
- z-index: 8;
-
- h1 {
- font-size: 1.35rem;
- }
- button {
- padding: 4px;
- height: 1.5rem;
- }
- }
- .about-gallery {
- .MuiPaper-root {
- width: 85%;
- height: auto;
- margin-bottom: 12px;
- .card-title {
- font-size: 1.2rem;
- }
- h3 {
- font-size: 1rem;
- }
- }
- }
- }
- }
-
- .projects-page {
- .mobile-show {
- display: block;
- font-size: 1.35rem;
- }
- .filter-panel {
- position: sticky;
- top: 5.5rem;
- height: 4rem;
- margin: 1.5rem;
- h2 {
- margin-top: 0;
- font-size: 1.15rem;
- }
- .filter-controls input, button {
- margin: 0 8px;
- border-radius: 8px;
- }
- }
-
- .project-cards {
- margin-top: 1.5rem;
- .MuiPaper-root {
- padding: 8px;
- h1 {
- font-size: 1.5rem;
- }
- }
- }
- }
-
- .technologies-page {
- .tech-title {
- width: 95vw;
- }
- .main-topic {
- width: 85vw;
-
- h1 {
- font-size: 1.2rem;
- }
- button {
- padding: 6px;
- }
- }
- }
-
- .links-page {
- margin-top: 1rem;
-
- a {
- text-decoration: none;
- }
-
- h1 {
- font-size: 1.35rem;
- width: 85%;
- margin-top: 1rem;
- }
- justify-content: flex-start;
- height: 20rem;
- }
-
- .creative-works-page {
- .cw-gallery {
- flex-flow: column nowrap;
- img {
- max-width: 65%;
- margin: 1rem 0;
- }
- }
-
- .cw-information {
- width: 95vw;
- margin: 0;
- text-align: left;
- }
- }
- }
-}
diff --git a/src/sass/helper/_variables.scss b/src/sass/helper/_variables.scss
deleted file mode 100644
index cd49bd6..0000000
--- a/src/sass/helper/_variables.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-$indigoOne: #301755;
-$indigoWhite: #e8eaf6;
-$lightIndigo: #8191ec;
-
-$lilac: #e2e0fe;
-$lilacWhite: #eae4f4;
-$darkLilac: #caa5dd;
-
-$darkBlueGreen: #1a6f6d;
-
-$darkGreen: #264935;
-$mintGreen: #bef9ca;
\ No newline at end of file
diff --git a/src/sass/pages/AboutMe.scss b/src/sass/pages/AboutMe.scss
deleted file mode 100644
index 79c762e..0000000
--- a/src/sass/pages/AboutMe.scss
+++ /dev/null
@@ -1,102 +0,0 @@
-@import "../helper/variables";
-@import "../helper/mixins";
-
-.about-me-page {
- .about-me-section {
- display: flex;
- flex-flow: column nowrap;
- align-items: center;
-
- background-color: $darkLilac;
- border: 1px solid $indigoOne;
- border-radius: 12px;
- margin: 1rem;
- padding: 8px 2rem;
- width: 75vw;
-
- border: transparent;
-
- opacity: 0;
- transition: 0.5s transform ease;
-
- @include step-entry(4);
-
- .am-section-mini {
- display: inline-flex;
- flex-flow: row wrap;
- align-items: center;
- justify-content: space-between;
- width: 100%;
-
- h1 {
- font-size: 2.5rem;
- }
-
- > * {
- margin: 8px;
- }
-
- button {
- display: inline-flex;
- align-items: center;
- height: 2rem;
- padding: 1rem;
- }
- }
- .about-gallery {
- display: flex;
- flex-flow: row wrap;
- height: auto;
- width: 95%;
- justify-content: space-around;
- margin: 2rem;
-
- .MuiCard-root {
- .card-title {
- text-transform: uppercase;
- }
-
- display: flex;
- flex-direction: column;
- background-color: $indigoOne;
- color: $indigoWhite;
- text-align: center;
- align-items: center;
-
- opacity: 0;
- transition: 0.5s transform ease;
-
- width: 40%;
- height: 400px;
- border-radius: 12px;
-
- padding: 1rem;
- margin: 0.5rem;
- margin-bottom: 3rem;
-
- overflow-y: scroll;
- @include step-entry(4);
-
- .MuiChip-root {
- background-color: $indigoWhite;
- max-width: 75%;
- margin: 4px;
- }
- }
- }
- }
- h1 {
- color: $indigoOne;
- font-weight: 800;
- font-size: 4rem;
- }
- a {
- color: white;
- border-radius: 12px;
- transition: color 0.3s linear;
- &:hover {
- color: white;
- transition: color 0.3s linear;
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/pages/CreativeWorks.scss b/src/sass/pages/CreativeWorks.scss
deleted file mode 100644
index 0063664..0000000
--- a/src/sass/pages/CreativeWorks.scss
+++ /dev/null
@@ -1,88 +0,0 @@
-@import "../helper/variables";
-
-.creative-works-page {
- display: flex;
- flex-direction: column;
-
- section {
- margin-bottom: 3rem;
- p {
- display: inline-block;
- background-color: white;
- margin: 4px 8px;
- padding: 1rem;
- border-radius: 12px;
- list-style: none;
- }
- h2 {
- font-size: 1.2rem;
- }
- }
-
- .cw-gallery {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 30rem;
- margin-bottom: 3rem;
- img {
- display: inline;
- height: 90%;
- width: auto;
- object-fit: cover;
- margin: 0 1rem;
- }
- }
-
- .cw-information {
- display: flex;
- flex-flow: row wrap;
- justify-content: flex-end;
- text-align: right;
- margin: 0 2rem 3rem 0;
- p {
- background-color: rgb(200, 219, 225);
- }
- }
-
- .cw-experiences {
- display: flex;
- flex-flow: row wrap;
- text-align: left;
- p {
- background-color: $indigoWhite;
- }
- }
-
- .cw-examples {
- display: flex;
- min-width: 100%;
- flex-flow: column nowrap;
- align-items: center;
- .sources {
- display: inline-flex;
- flex-flow: row nowrap;
- justify-content: space-evenly;
- width: 100%;
- > * {
- display: inline-flex;
- flex-flow: column nowrap;
- width: 35%;
- height: 15rem;
- align-items: center;
- justify-content: space-evenly;
- background-color: $indigoWhite;
- margin-top: 1rem;
- img {
- width: 100px;
- height: 100px;
- margin-bottom: 1rem;
- }
- a {
- color: $indigoOne;
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/pages/Links.scss b/src/sass/pages/Links.scss
deleted file mode 100644
index 5a62837..0000000
--- a/src/sass/pages/Links.scss
+++ /dev/null
@@ -1,53 +0,0 @@
-@import "../helper/variables";
-@import "../helper/mixins";
-
-.links-page {
- background-color: $lilac;
- justify-content: center;
-
- .links-container {
- display: flex;
- flex-flow: row wrap;
-
- .MuiCard-root {
- @include step-entry(2);
-
- opacity: 0;
- transition: 0.5s transform ease;
-
- display: inline-flex;
- flex-direction: column;
- align-items: center;
- justify-content: space-between;
-
- height: 8rem;
- width: 20vw;
-
- padding: 2rem;
- margin: 1rem;
-
- background-color: $lilacWhite;
-
- a {
- color: $indigoOne;
- text-transform: uppercase;
- text-underline-offset: 5px;
-
- &:hover {
- color: $darkGreen;
- }
- &:active {
- color: $indigoOne;
- }
- &:visited {
- color: inherit;
- }
- }
-
- img {
- width: 4rem;
- height: auto;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/pages/Projects.scss b/src/sass/pages/Projects.scss
deleted file mode 100644
index b767aad..0000000
--- a/src/sass/pages/Projects.scss
+++ /dev/null
@@ -1,72 +0,0 @@
-@import "../components/Divider";
-@import "../helper/variables";
-
-.projects-page {
- .divider {
- @extend %divider;
- }
-
- .filter-panel {
- display: flex;
- position: static;
- flex-direction: column;
- align-items: center;
-
- background-color: $darkGreen;
- color: $indigoWhite;
-
- padding: 1rem;
- margin-bottom: 2rem;
- border-radius: 12px;
-
- width: 40vw;
-
- .filter-controls {
- display: flex;
- justify-content: center;
- width: 80%;
- > * {
- margin: 1rem;
- }
- input {
- padding: 6px;
- border-radius: 4px;
- }
- }
- }
-
- .project-cards {
- display: flex;
- flex-direction: column;
- align-items: center;
- margin-top: 2rem;
-
- a {
- color: $indigoWhite;
- &:hover {
- color: lightblue;
- }
- }
-
- > * {
- display: flex;
- flex-direction: column;
- align-items: center;
- background-color: $indigoOne;
- color: $indigoWhite;
- width: 80vw;
- height: auto;
- margin-bottom: 2rem;
- border-radius: 12px;
- .links {
- display: flex;
- width: 75%;
- align-items: baseline;
- justify-content: space-around;
- }
- a:last-child {
- margin-bottom: 1rem;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/pages/Technologies.scss b/src/sass/pages/Technologies.scss
deleted file mode 100644
index c9c1989..0000000
--- a/src/sass/pages/Technologies.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-@import "../helper/variables";
-@import "../helper/animations";
-@import "../helper/mixins";
-@import "../components/Button";
-
-.technologies-page {
- .tech-title {
- font-size: 1.4rem;
- font-weight: bold;
- }
-
- .main-topic {
- display: flex;
- flex-direction: column;
- align-items: center;
-
- opacity: 0;
- transition: 0.5s transform ease;
-
- @include step-entry(4);
-
- background-color: $indigoOne;
- color: $indigoWhite;
-
- width: 50vw;
- border-radius: 16px;
-
- margin: 1rem 0;
- padding: 1rem;
- button {
- @extend %button-style;
- background-color: $indigoWhite;
- }
- }
-
- .subtopic-container {
- display: flex;
- flex-flow: row wrap;
- justify-content: center;
-
- .subtopic-card {
- width: 75%;
- margin: 1rem;
- padding: 1rem;
- .subtopics {
- display: flex;
- flex-flow: row wrap;
- justify-content: center;
- padding: 1rem;
- & > * {
- padding: 0.5rem;
- margin: 0.5rem;
- }
- }
- &:last-child {
- margin-bottom: 2rem;
- }
- }
-
- .MuiChip-root {
- margin: 5px 4px 1rem;
- background-color: $indigoWhite;
- }
- }
-}
\ No newline at end of file
diff --git a/src/sass/pages/Welcome.scss b/src/sass/pages/Welcome.scss
deleted file mode 100644
index 4f5adec..0000000
--- a/src/sass/pages/Welcome.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-@import "../helper/animations";
-@import "../helper/variables";
-@import "../components/Divider";
-
-.welcome-page {
- display: flex;
- flex-direction: column;
- align-items: center;
- min-height: 100vh;
- overflow-x: hidden;
-
- #header-card {
- display: flex;
- flex-direction: column;
- align-items: center;
-
- width: 35vw;
- height: 18rem;
-
- padding: 1rem;
- margin: 2rem;
-
- font-size: 1.2rem;
- border-radius: 12px;
- background-color: $indigoOne;
- color: $lilac;
-
- // animation: sideToSide 10s infinite;
- }
-
- #welcome-info {
- margin: 2rem 0;
- width: 75%;
- font-size: 1rem;
- font-weight: 500;
- padding: 0.6rem;
- // animation: sideToSide 15s infinite;
-
- background-color: $indigoOne;
- color: $lilac;
- }
-
- .divider {
- @extend %divider;
- }
-
- footer {
- width: 80%;
- display: block;
- text-align: right;
- }
-}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..9f3cccc
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,64 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ safelist: [
+ {
+ pattern: /from-.*/,
+ },
+ {
+ pattern: /to-.*/,
+ }
+ ],
+ theme: {
+ extend: {
+ colors: {
+ 'darkPlum': '#1e0631',
+ },
+ transitionTimingFunction: {
+ 'quick-start': 'cubic-bezier(.17,.67,0,.89)',
+ },
+ backgroundImage: {
+ 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
+ 'gradient-conic':
+ 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
+ },
+ animation: {
+ 'logo-throw-left': 'logoThrowLeft 1s ease forwards',
+ 'logo-throw-right': 'logoThrowRight 1s ease forwards',
+ 'logo-throw-down': 'logoThrowDown 1s ease forwards',
+ 'fade-in': 'fadeIn 1s ease forwards',
+ 'text-gradient': 'textGradient 15s ease infinite'
+ },
+ keyframes: {
+ fadeIn: {
+ '0%': { opacity: 0 },
+ '100%': { opacity: 1 }
+ },
+ logoThrowLeft: {
+ '0%': { transform: 'translateX(0)'},
+ '100%': { transform: 'translateX(-56px)' }
+ },
+ logoThrowRight: {
+ '0%': { transform: 'translateX(0)'},
+ '100%': { transform: 'translateX(56px)' }
+ },
+ logoThrowDown: {
+ '0%': { transform: 'translateY(0)'},
+ '100%': { transform: 'translateY(80px)' }
+ },
+
+ textGradient: {
+ '0%': { opacity: 0},
+ '12%': { opacity: 100 },
+ '88%': { opacity: 98 },
+ '100%': { opacity: 0 }
+ }
+ }
+ },
+ },
+ plugins: [],
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..e06a445
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/vite.config.js b/vite.config.js
deleted file mode 100644
index b1b5f91..0000000
--- a/vite.config.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
-
-// https://vitejs.dev/config/
-export default defineConfig({
- plugins: [react()]
-})