diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml new file mode 100644 index 0000000..eb431af --- /dev/null +++ b/.github/workflows/nextjs.yml @@ -0,0 +1,95 @@ +# Sample workflow for building and deploying a Next.js site to GitHub Pages +# +# To get started with Next.js see: https://nextjs.org/docs/getting-started +# +name: Deploy Next.js site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["master"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Detect package manager + id: detect-package-manager + run: | + if [ -f "${{ github.workspace }}/yarn.lock" ]; then + echo "manager=yarn" >> $GITHUB_OUTPUT + echo "command=install" >> $GITHUB_OUTPUT + echo "runner=yarn" >> $GITHUB_OUTPUT + exit 0 + elif [ -f "${{ github.workspace }}/package.json" ]; then + echo "manager=npm" >> $GITHUB_OUTPUT + echo "command=ci" >> $GITHUB_OUTPUT + echo "runner=npx --no-install" >> $GITHUB_OUTPUT + exit 0 + else + echo "Unable to determine package manager" + exit 1 + fi + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "16" + cache: ${{ steps.detect-package-manager.outputs.manager }} + - name: Setup Pages + uses: actions/configure-pages@v3 + with: + # Automatically inject basePath in your Next.js configuration file and disable + # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). + # + # You may remove this line if you want to manage the configuration yourself. + static_site_generator: next + - name: Restore cache + uses: actions/cache@v3 + with: + path: | + .next/cache + # Generate a new cache whenever packages or source files change. + key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} + # If source files changed but packages didn't, rebuild from a prior cache. + restore-keys: | + ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- + - name: Install dependencies + run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} + - name: Build with Next.js + run: ${{ steps.detect-package-manager.outputs.runner }} next build + - name: Static HTML export with Next.js + run: ${{ steps.detect-package-manager.outputs.runner }} next export + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: ./out + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9bea433..8f322f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc .DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md index 8ec6bbe..ca8a3a2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,38 @@ -# Jordan-Morrison.Github.io -Jordan Morrison's Landing Page +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). + +## Getting Started + +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 `pages/index.js`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +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/components/atoms/StackList.js b/components/atoms/StackList.js new file mode 100644 index 0000000..63fc74a --- /dev/null +++ b/components/atoms/StackList.js @@ -0,0 +1,19 @@ +import techStacks from '../data/techStacks.json'; +import styles from '@/styles/StackList.module.css'; + +export default function StackList(props) { + let techStack = null; + techStack = props.techStack.map(tech => { + return techStacks.find((stack) => stack.name == tech); + }); + + return ( + + ) +} \ No newline at end of file diff --git a/components/atoms/slide.js b/components/atoms/slide.js new file mode 100644 index 0000000..3969ca4 --- /dev/null +++ b/components/atoms/slide.js @@ -0,0 +1,10 @@ +import styles from '@/styles/Slide.module.css'; + +export default function Slide(props) { + + return ( +
+ {props.image.altTxt}/ +
+ ) +} \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/dataLiteracyAssessment.md b/components/data/FUTURE PROJECTS/dataLiteracyAssessment.md new file mode 100644 index 0000000..2dc6426 --- /dev/null +++ b/components/data/FUTURE PROJECTS/dataLiteracyAssessment.md @@ -0,0 +1,10 @@ +--- +title: Data Literacy Assessment +techStack: [] +index: 999 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/dataPatterns.md b/components/data/FUTURE PROJECTS/dataPatterns.md new file mode 100644 index 0000000..9453dd9 --- /dev/null +++ b/components/data/FUTURE PROJECTS/dataPatterns.md @@ -0,0 +1,10 @@ +--- +title: Data Patterns +techStack: [] +index: 1002 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/digitalOpenLearning.md b/components/data/FUTURE PROJECTS/digitalOpenLearning.md new file mode 100644 index 0000000..3747fa6 --- /dev/null +++ b/components/data/FUTURE PROJECTS/digitalOpenLearning.md @@ -0,0 +1,10 @@ +--- +title: Digital Open Learning +techStack: [] +index: 1000 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/geoLoco.md b/components/data/FUTURE PROJECTS/geoLoco.md new file mode 100644 index 0000000..6be8f79 --- /dev/null +++ b/components/data/FUTURE PROJECTS/geoLoco.md @@ -0,0 +1,10 @@ +--- +title: GeoLoco +techStack: [] +index: 999 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/highPeakCreatives.md b/components/data/FUTURE PROJECTS/highPeakCreatives.md new file mode 100644 index 0000000..e3cc0b3 --- /dev/null +++ b/components/data/FUTURE PROJECTS/highPeakCreatives.md @@ -0,0 +1,10 @@ +--- +title: High Peak Creatives +techStack: [] +index: 999 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/personalizer.md b/components/data/FUTURE PROJECTS/personalizer.md new file mode 100644 index 0000000..b911cf7 --- /dev/null +++ b/components/data/FUTURE PROJECTS/personalizer.md @@ -0,0 +1,10 @@ +--- +title: Personalizer +techStack: [] +index: 999 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/reactChildLock.md b/components/data/FUTURE PROJECTS/reactChildLock.md new file mode 100644 index 0000000..ce45e9f --- /dev/null +++ b/components/data/FUTURE PROJECTS/reactChildLock.md @@ -0,0 +1,10 @@ +--- +title: React Child Lock +techStack: [] +index: 999 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/swipeyJS.md b/components/data/FUTURE PROJECTS/swipeyJS.md new file mode 100644 index 0000000..11dc966 --- /dev/null +++ b/components/data/FUTURE PROJECTS/swipeyJS.md @@ -0,0 +1,10 @@ +--- +title: Swipey.js +techStack: [] +index: 999 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/FUTURE PROJECTS/vExpo.md b/components/data/FUTURE PROJECTS/vExpo.md new file mode 100644 index 0000000..233531d --- /dev/null +++ b/components/data/FUTURE PROJECTS/vExpo.md @@ -0,0 +1,10 @@ +--- +title: vExpo +techStack: [] +index: 1001 +images: [ + +] +--- + +Enter description here \ No newline at end of file diff --git a/components/data/projects/adventCalendar.md b/components/data/projects/adventCalendar.md new file mode 100644 index 0000000..e900537 --- /dev/null +++ b/components/data/projects/adventCalendar.md @@ -0,0 +1,21 @@ +--- +title: Advent Calendar +techStack: ["Node.js", "MongoDB", "JavaScript", "HTML", "CSS"] +index: 40 +images: [ + { + url: /images/projects/adventCalendar/loginScreen.jpg, + altTxt: a screenshot of the advent calendar login screen + }, + { + url: /images/projects/adventCalendar/adventCalendar.jpg, + altTxt: a screenshot showcasing the advent calendar + }, + { + url: /images/projects/adventCalendar/christmasDay.jpg, + altTxt: a screenshot of Christmas day in the advent calendar app + } +] +--- + +This advent calendar was a gift for my family and everyday of December, up until Christmas it would give them a hint as to what their presents were going to be. The calendar was full of animations with snow constantly falling and gift wrap when opening a new day on the calendar. This project also featured a backend with email & password authentication using Firebase. This protected any leaks as only data up and until that day would be sent to the app from the server. \ No newline at end of file diff --git a/components/data/projects/busrides.md b/components/data/projects/busrides.md new file mode 100644 index 0000000..7652311 --- /dev/null +++ b/components/data/projects/busrides.md @@ -0,0 +1,17 @@ +--- +title: Busrides +techStack: ["Next.js", "React", "Node.js", "JavaScript", "HTML", "CSS", "Adobe XD", "React Native"] +index: 0 +images: [ + { + url: /images/projects/busrides/home.png, + altTxt: a screenshot of the Busrides home page + }, + { + url: /images/projects/busrides/authorDetails.png, + altTxt: a screenshot of the author details page in Busrides + } +] +--- + +Introducing Busrides: As the lead developer and designer, I transformed Busrides into a dynamic micro-learning platform with a name inspired by those fleeting moments on a bus ride to work when one can acquire new knowledge. Originally a modest WordPress site with a handful of users, I embarked on a comprehensive redesign, exploring alternative headless CMS options, and ultimately rebuilding the platform using Next.js and Ghost CMS. Along the way, I introduced engaging events, including an advent calendar filled with daily data insights and an interactive Easter egg hunt that led users across the site. Thanks to these enhancements and the platform's new design, Busrides experienced remarkable growth, attracting over 10,000 users monthly. Recognized for my technical and communication skills, I was offered a full-time, indeterminate position, where I not only met with business owners to translate objectives into code but also excelled in writing clear and accessible documentation, earning praise from non-technical team members. Busrides has evolved into a thriving hub for learning, made possible by this transformative journey. \ No newline at end of file diff --git a/components/data/projects/gcTortilla.md b/components/data/projects/gcTortilla.md new file mode 100644 index 0000000..1272c89 --- /dev/null +++ b/components/data/projects/gcTortilla.md @@ -0,0 +1,25 @@ +--- +title: GC-Tortilla +techStack: [React] +index: 31 +images: [ + { + url: /images/projects/gcTortilla/defaultSplashScreen.png, + altTxt: a screenshot of the default splash screen component in the GC-Tortilla library + }, + { + url: /images/projects/gcTortilla/logoSplashScreen.png, + altTxt: a screenshot showing a customized version of the splash screen component in GC-Tortilla + }, + { + url: /images/projects/gcTortilla/headerAndFooter.png, + altTxt: a screenshot showcasing the header and footer components in GC-Tortilla + }, + { + url: /images/projects/gcTortilla/npm.png, + altTxt: a screenshot of GC-Tortilla on NPM + } +] +--- + +[GC-Tortilla](https://www.npmjs.com/package/gc-tortilla) is a React library designed to help speed up the development of Government of Canada applications by providing pre-approved branded components. All elements in the components are fully customizable so they can be used by different teams with their own branding as needed. With GC-Tortilla you get a Splash Screen, Header Brand Bar and a Footer all of which are brand ready. The splash screen is unique in that it will use LocalStorage so that once the user set's their initial language preference they will not be forced to re-visit the splash screen every time they access the app. You can utilize all components pre-packaged together by importing GC-Tortilla or you have the option to import GCSplashScreen, GCHeader and GCFooter separately to use them on their own. This library is hosted on NPM and showcases my ability to write clear & concise documentation. \ No newline at end of file diff --git a/components/data/projects/lightningTutoring.md b/components/data/projects/lightningTutoring.md new file mode 100644 index 0000000..93b18a2 --- /dev/null +++ b/components/data/projects/lightningTutoring.md @@ -0,0 +1,33 @@ +--- +title: Lightning Tutoring +techStack: ["Adobe XD"] +index: 60 +images: [ + { + url: /images/projects/lightningTutoring/browseTutorsDark.jpg, + altTxt: a screenshot showcasing a list of available tutors in dark mode on Lightning Tutoring + }, + { + url: /images/projects/lightningTutoring/tutorDetailsDark.jpg, + altTxt: a screenshot of the tutor details screen in dark mode on Lightning Tutoring + }, + { + url: /images/projects/lightningTutoring/bookTutorDark.jpg, + altTxt: a screenshot of the tutor booking screen in dark mode on Lightning Tutoring + }, + { + url: /images/projects/lightningTutoring/browseTutorsLight.jpg, + altTxt: a screenshot showcasing a list of available tutors in light mode on Lightning Tutoring + }, + { + url: /images/projects/lightningTutoring/tutorDetailsLight.jpg, + altTxt: a screenshot of the tutor details screen in light mode on Lightning Tutoring + }, + { + url: /images/projects/lightningTutoring/bookTutorLight.jpg, + altTxt: a screenshot of the tutor booking screen in light mode on Lightning Tutoring + } +] +--- + +Lightning was a design project to create a tutoring app prototype. The goal here was to design the app to match the native iOS theme. Taking elements from various parts of iOS, I was able to come up with a clean and clear design. I then took the time to create a dark themed version, while still maintaining the iOS look and feel. \ No newline at end of file diff --git a/components/data/projects/masvMobile.md b/components/data/projects/masvMobile.md new file mode 100644 index 0000000..2a690f2 --- /dev/null +++ b/components/data/projects/masvMobile.md @@ -0,0 +1,29 @@ +--- +title: MASV Mobile +techStack: ["Swift", "Figma"] +index: 70 +images: [ + { + url: /images/projects/masvMobile/portalSelection.jpg, + altTxt: a screenshot of the portal list view in MASV Mobile + }, + { + url: /images/projects/masvMobile/masvPortal.jpg, + altTxt: a screenshot of the MASV portal in MASV Mobile + }, + { + url: /images/projects/masvMobile/masvPortalTransferComplete.jpg, + altTxt: a screenshot showing a completed file transfer in the MASV portal + }, + { + url: /images/projects/masvMobile/disneyPortal.jpg, + altTxt: a screenshot of the Disney portal in MASV Mobile + }, + { + url: /images/projects/masvMobile/disneyPortalTransferComplete.jpg, + altTxt: a screenshot showing a completed file transfer in the Disney portal + } +] +--- + +MASV Mobile is a team based applied research project through Algonquin College, being built for [MASV](https://massive.io) to compliment their existing products. The goal for the app was to support MASV Portals, which are setup by companies & creative professionals who wish to crowdsource files. Portals are custom branded to reflect the hosting party, and can be accessed by users to upload files. My role was project lead, where I led our team of six throughout the entire design and development process. I worked closely with the team in all aspects as we designed & developed the app. \ No newline at end of file diff --git a/components/data/projects/more.md b/components/data/projects/more.md new file mode 100644 index 0000000..1d92d60 --- /dev/null +++ b/components/data/projects/more.md @@ -0,0 +1,7 @@ +--- +title: Many more! +techStack: ["Node.js", "JavaScript", "HTML", "CSS", "MongoDB", "Adobe XD", "Figma", "Swift", "React", "React Native", "Next.js"] +index: 999999 +--- + +Between client projects and private repos, I have many more examples that I’d love to be able to show you! If you’d like to see more of my work please don’t hesitate to contact me. You can reach me through any means listed at the top of the page, or via email or phone as listed on my [resume](/Jordan%20Morrison%20Resume.pdf). \ No newline at end of file diff --git a/components/data/projects/openCall.md b/components/data/projects/openCall.md new file mode 100644 index 0000000..21abd56 --- /dev/null +++ b/components/data/projects/openCall.md @@ -0,0 +1,29 @@ +--- +title: Open Call +techStack: ["React", "JavaScript", "HTML", "CSS"] +index: 10 +images: [ + { + url: /images/projects/openCall/home.png, + altTxt: a screenshot of the Open Call home page + }, + { + url: /images/projects/openCall/contribute.png, + altTxt: a screenshot showing how to contribute to the Open Call catalogue with a short description of the project + }, + { + url: /images/projects/openCall/about.png, + altTxt: a screenshot about page in Open Call + }, + { + url: /images/projects/openCall/faq.png, + altTxt: a screenshot of the FAQ page in Open Call + }, + { + url: /images/projects/openCall/successStories.png, + altTxt: a screenshot showing the success stories catalogue in Open Call + } +] +--- + +Open Call was a project initiated and quickly built during the heart of the COVID-19 pandemic, serving as a lifeline to smaller organizations and municipalities by providing them with essential COVID-19 related tools and resources. Collaborating with the Canadian Digital Service, Code for Canada and the Canada School of Public Service, I volunteered outside of my normal duties, taking on the role of lead developer for this crucial initiative. Open Call functioned as a comprehensive catalog of valuable COVID-related resources, tools and APIs powered by a simple yet powerful backend built on the Google sheets API - easily enabling non-technical staff to add new resources. My dedication and impact was so significant that it led to being scouted by the Chief Medical Officer of Canada, Dr. Theresa Tam to contribute to the development of a data management tool for handling the influx of COVID-19 data her team was receiving. The tool has since been decommissioned and with the API being taken down, the loading indicator now spins where the catalogue items were. \ No newline at end of file diff --git a/components/data/projects/photographyPortfolio.md b/components/data/projects/photographyPortfolio.md new file mode 100644 index 0000000..d4d07df --- /dev/null +++ b/components/data/projects/photographyPortfolio.md @@ -0,0 +1,41 @@ +--- +title: Photography Portfolio +techStack: [Next.js, React, JavaScript, HTML, CSS] +index: 30 +images: [ + { + url: /images/projects/photographyPortfolio/home_light.png, + altTxt: a screenshot of the homepage for Jordan Morrison's photography portfolio + }, + { + url: /images/projects/photographyPortfolio/photoGrid_light.png, + altTxt: a screenshot of the photo grid showcasing Jordan Morrison's photography work + }, + { + url: /images/projects/photographyPortfolio/photoView_light.png, + altTxt: a screenshot of the fullscreen photo view on Jordan Morrison's photography portfolio + }, + { + url: /images/projects/photographyPortfolio/contact_light.png, + altTxt: a screenshot of the contact page on Jordan Morrison's photography portfolio + }, + { + url: /images/projects/photographyPortfolio/home_dark.png, + altTxt: a screenshot of the homepage in dark mode for Jordan Morrison's photography portfolio + }, + { + url: /images/projects/photographyPortfolio/photoGrid_dark.png, + altTxt: a screenshot of the photo grid in dark mode showcasing Jordan Morrison's photography work + }, + { + url: /images/projects/photographyPortfolio/photoView_dark.png, + altTxt: a screenshot of the fullscreen photo view in dark mode on Jordan Morrison's photography portfolio + }, + { + url: /images/projects/photographyPortfolio/contact_dark.png, + altTxt: a screenshot of the contact page in dark mode on Jordan Morrison's photography portfolio + } +] +--- + +Built as my own portfolio, [jordanmorrison.ca](https://jordanmorrison.ca) is a simple yet captivating website utilizing the latest web technologies. With millions of views on my social media it was important to create the site with lightweightness in mind as as the magnitude of visitors could quickly drive up hosting costs. With this, I'm proud to say I've done just that as the site remains online at near zero cost. Feature wise the site has a custom photo grid component, showcasing a selection of my photos along with a dynamic dark mode that automatically adjusts according to the user's browser and device settings. While simple, this site helps to create an immersive and visually stunning experience for visitors to explore my photographic work all while staying lightweight to keep costs down. \ No newline at end of file diff --git a/components/data/projects/pokedexGo.md b/components/data/projects/pokedexGo.md new file mode 100644 index 0000000..e75cded --- /dev/null +++ b/components/data/projects/pokedexGo.md @@ -0,0 +1,29 @@ +--- +title: Pokédex Go +techStack: ["Node.js", "JavaScript", "HTML", "CSS"] +index: 50 +images: [ + { + url: /images/projects/pokedexGo/pokemonScreen.png, + altTxt: a screenshot of the Pokémon list view in Pokédex Go + }, + { + url: /images/projects/pokedexGo/detailsScreen.png, + altTxt: a screenshot showcasing the stats of a Pikachu in Pokédex Go + }, + { + url: /images/projects/pokedexGo/newsPopup.png, + altTxt: a screenshot of the news screen in Pokédex Go + }, + { + url: /images/projects/pokedexGo/compareSelectScreen.png, + altTxt: a screenshot showcasing the layout for the compare Pokémon selection screen in in Pokédex Go + }, + { + url: /images/projects/pokedexGo/compareScreen.png, + altTxt: a screenshot comparing Pokémon in Pokédex Go + } +] +--- + +Starting out as a simple assignment, Pokédex Go grew into a large side project. We were to build a basic app with a list and detail view. I chose to base my app on the popular game Pokémon Go, creating a wiki like app for players. After submitting my assignment I began adding more features and screens, integrating tools like Google Analytics and added a JSON server used to detect updates and news items. I then rolled out the app by advertising on social media and began having daily users! \ No newline at end of file diff --git a/components/data/projects/winterludeApp.md b/components/data/projects/winterludeApp.md new file mode 100644 index 0000000..24f71dd --- /dev/null +++ b/components/data/projects/winterludeApp.md @@ -0,0 +1,29 @@ +--- +title: Winterlude App +techStack: ["Adobe XD"] +index: 80 +images: [ + { + url: /images/projects/winterludeApp/home.jpg, + altTxt: a screenshot of the homepage for the Winterlude App + }, + { + url: /images/projects/winterludeApp/hamburgerMenu.jpg, + altTxt: a screenshot of the Winterlude App menu + }, + { + url: /images/projects/winterludeApp/events.jpg, + altTxt: a screenshot of the activities screen for the Winterlude App + }, + { + url: /images/projects/winterludeApp/eventDetails.jpg, + altTxt: a screenshot showcasing the layout for the activity details page in the Winterlude App + }, + { + url: /images/projects/winterludeApp/map.jpg, + altTxt: a screenshot of the map view in the Winterlude App + } +] +--- + +This was an assignment in one of my design courses at Algonquin College. We were to design an app for [Winterlude](https://www.canada.ca/en/canadian-heritage/campaigns/winterlude.html), a large winter festival that takes place in Ottawa. The prototype was built using Adobe XD, and features a handful of screens. \ No newline at end of file diff --git a/components/data/socials.json b/components/data/socials.json new file mode 100644 index 0000000..f641591 --- /dev/null +++ b/components/data/socials.json @@ -0,0 +1,27 @@ +[ + { + "icon": "instagram", + "link": "https://www.instagram.com/morrison_jordan/", + "altTxt": "View Jordan Morrison's Instagram" + }, + { + "icon": "x", + "link": "https://twitter.com/J0rdan_Morrison", + "altTxt": "See Jordan Morrison on X" + }, + { + "icon": "github", + "link": "https://github.com/Jordan-Morrison", + "altTxt": "Check out Jordan Morrison on GitHub" + }, + { + "icon": "linkedin", + "link": "https://www.linkedin.com/in/jordan--morrison/", + "altTxt": "Connect with Jordan Morrison on LinkedIn" + }, + { + "icon": "resume", + "link": "./Jordan Morrison Resume.pdf", + "altTxt": "View or download a copy of Jordan Morrison's resume" + } +] \ No newline at end of file diff --git a/components/data/techStacks.json b/components/data/techStacks.json new file mode 100644 index 0000000..aa9c9cf --- /dev/null +++ b/components/data/techStacks.json @@ -0,0 +1,46 @@ +[ + { + "name": "JavaScript", + "icon": "/images/techIcons/javaScript.png" + }, + { + "name": "React", + "icon": "/images/techIcons/react.png" + }, + { + "name": "React Native", + "icon": "/images/techIcons/react.png" + }, + { + "name": "Node.js", + "icon": "/images/techIcons/nodejs.png" + }, + { + "name": "Next.js", + "icon": "/images/techIcons/nextjs.png" + }, + { + "name": "MongoDB", + "icon": "/images/techIcons/mongoDB.png" + }, + { + "name": "Adobe XD", + "icon": "/images/techIcons/adobeXD.png" + }, + { + "name": "HTML", + "icon": "/images/techIcons/html.png" + }, + { + "name": "CSS", + "icon": "/images/techIcons/css.png" + }, + { + "name": "Swift", + "icon": "/images/techIcons/swift.png" + }, + { + "name": "Figma", + "icon": "/images/techIcons/figma.png" + } +] \ No newline at end of file diff --git a/components/icons/selection.json b/components/icons/selection.json new file mode 100644 index 0000000..bf612f8 --- /dev/null +++ b/components/icons/selection.json @@ -0,0 +1 @@ +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M414.058 762.952l-388.686-388.688c-18.746-18.746-18.746-49.138 0-67.882l45.334-45.334c18.714-18.714 49.044-18.75 67.802-0.080l309.492 308.042 309.49-308.042c18.758-18.67 49.088-18.634 67.802 0.080l45.334 45.334c18.746 18.746 18.746 49.138 0 67.882l-388.684 388.688c-18.746 18.744-49.138 18.744-67.884 0z"],"attrs":[{}],"width":896,"isMulticolor":false,"isMulticolor2":false,"grid":16,"tags":["chevron-down-solid"]},"attrs":[{}],"properties":{"order":14,"id":1,"name":"chevron-down","prevSize":32,"code":59653},"setIdx":0,"setId":5,"iconIdx":0},{"icon":{"paths":["M1056 64h-960c-53 0-96 43-96 96v704c0 53 43 96 96 96h960c53 0 96-43 96-96v-704c0-53-43-96-96-96zM1056 864h-960v-704h960v704zM416 512c70.6 0 128-57.4 128-128s-57.4-128-128-128-128 57.4-128 128 57.4 128 128 128zM236.8 768h358.4c24.8 0 44.8-17.2 44.8-38.4v-38.4c0-63.6-60.2-115.2-134.4-115.2-21.6 0-37.4 16-89.6 16-53.8 0-66.8-16-89.6-16-74.2 0-134.4 51.6-134.4 115.2v38.4c0 21.2 20 38.4 44.8 38.4zM720 640h224c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-224c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16zM720 512h224c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-224c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16zM720 384h224c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16h-224c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16z"],"attrs":[{}],"width":1152,"isMulticolor":false,"isMulticolor2":false,"grid":16,"tags":["address-card-regular"]},"attrs":[{}],"properties":{"order":11,"id":0,"name":"resume","prevSize":32,"code":59652},"setIdx":0,"setId":5,"iconIdx":1},{"icon":{"paths":["M384 384h177.106v90.782h2.532c24.64-44.194 84.958-90.782 174.842-90.782 186.946 0 221.52 116.376 221.52 267.734v308.266h-184.61v-273.278c0-65.184-1.334-149.026-96.028-149.026-96.148 0-110.82 70.986-110.82 144.292v278.012h-184.542v-576z","M64 384h192v576h-192v-576z","M256 224c0 53.019-42.981 96-96 96s-96-42.981-96-96c0-53.019 42.981-96 96-96s96 42.981 96 96z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["linkedin","brand","social"],"grid":16},"attrs":[{},{},{}],"properties":{"order":1,"id":0,"name":"linkedin","prevSize":32,"code":59648},"setIdx":1,"setId":4,"iconIdx":0},{"icon":{"paths":["M512 0c-139.093 0-156.459 0.64-211.072 3.072-54.528 2.56-91.648 11.136-124.288 23.808-33.664 13.056-62.251 30.592-90.709 59.051s-46.037 57.003-59.051 90.709c-12.672 32.64-21.291 69.76-23.808 124.288-2.56 54.613-3.072 71.979-3.072 211.072s0.64 156.459 3.072 211.072c2.56 54.485 11.136 91.648 23.808 124.288 13.056 33.621 30.592 62.251 59.051 90.709 28.459 28.416 57.003 46.037 90.709 59.051 32.683 12.629 69.803 21.291 124.288 23.808 54.613 2.56 71.979 3.072 211.072 3.072s156.459-0.64 211.072-3.072c54.485-2.56 91.648-11.179 124.288-23.808 33.621-13.056 62.251-30.635 90.709-59.051 28.416-28.459 46.037-56.96 59.051-90.709 12.629-32.64 21.291-69.803 23.808-124.288 2.56-54.613 3.072-71.979 3.072-211.072s-0.64-156.459-3.072-211.072c-2.56-54.485-11.179-91.691-23.808-124.288-13.056-33.664-30.635-62.251-59.051-90.709-28.459-28.459-56.96-46.037-90.709-59.051-32.64-12.672-69.803-21.291-124.288-23.808-54.613-2.56-71.979-3.072-211.072-3.072zM512 92.16c136.661 0 152.96 0.683 206.933 3.029 49.92 2.347 77.013 10.624 95.019 17.707 23.979 9.259 40.96 20.352 58.965 38.229 17.877 17.92 28.971 34.944 38.229 58.923 6.997 18.005 15.36 45.099 17.621 95.019 2.432 54.016 2.987 70.229 2.987 206.933s-0.64 152.96-3.157 206.933c-2.603 49.92-10.923 77.013-17.963 95.019-9.557 23.979-20.437 40.96-38.357 58.965-17.877 17.877-35.157 28.971-58.88 38.229-17.92 6.997-45.44 15.36-95.36 17.621-54.357 2.432-70.357 2.987-207.317 2.987-137.003 0-153.003-0.64-207.317-3.157-49.963-2.603-77.483-10.923-95.403-17.963-24.277-9.557-40.96-20.437-58.837-38.357-17.963-17.877-29.44-35.157-38.4-58.88-7.040-17.92-15.317-45.44-17.92-95.36-1.92-53.76-2.603-70.357-2.603-206.677 0-136.363 0.683-153.003 2.603-207.403 2.603-49.92 10.88-77.397 17.92-95.317 8.96-24.32 20.437-40.96 38.4-58.923 17.877-17.877 34.56-29.397 58.837-38.315 17.92-7.083 44.843-15.403 94.763-17.963 54.4-1.92 70.4-2.56 207.317-2.56zM512 249.088c-145.28 0-262.912 117.76-262.912 262.912 0 145.28 117.76 262.912 262.912 262.912 145.28 0 262.912-117.76 262.912-262.912 0-145.28-117.76-262.912-262.912-262.912zM512 682.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM846.763 238.72c0 33.92-27.563 61.44-61.44 61.44-33.92 0-61.44-27.563-61.44-61.44s27.563-61.397 61.44-61.397c33.835-0.043 61.44 27.52 61.44 61.397z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["instagram"],"grid":16,"colorPermutations":{}},"attrs":[],"properties":{"order":1,"id":2,"name":"instagram","prevSize":32,"code":59649},"setIdx":2,"setId":3,"iconIdx":0},{"icon":{"paths":["M512 12.672c-282.88 0-512 229.248-512 512 0 226.261 146.688 418.133 350.080 485.76 25.6 4.821 34.987-11.008 34.987-24.619 0-12.16-0.427-44.373-0.64-87.040-142.421 30.891-172.459-68.693-172.459-68.693-23.296-59.093-56.96-74.88-56.96-74.88-46.379-31.744 3.584-31.104 3.584-31.104 51.413 3.584 78.421 52.736 78.421 52.736 45.653 78.293 119.851 55.68 149.12 42.581 4.608-33.109 17.792-55.68 32.427-68.48-113.707-12.8-233.216-56.832-233.216-253.013 0-55.893 19.84-101.547 52.693-137.387-5.76-12.928-23.040-64.981 4.48-135.509 0 0 42.88-13.739 140.8 52.48 40.96-11.392 84.48-17.024 128-17.28 43.52 0.256 87.040 5.888 128 17.28 97.28-66.219 140.16-52.48 140.16-52.48 27.52 70.528 10.24 122.581 5.12 135.509 32.64 35.84 52.48 81.493 52.48 137.387 0 196.693-119.68 240-233.6 252.587 17.92 15.36 34.56 46.763 34.56 94.72 0 68.523-0.64 123.563-0.64 140.203 0 13.44 8.96 29.44 35.2 24.32 204.843-67.157 351.403-259.157 351.403-485.077 0-282.752-229.248-512-512-512z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["github"],"grid":16},"attrs":[{}],"properties":{"order":1,"id":1,"name":"github","prevSize":32,"code":59650},"setIdx":2,"setId":3,"iconIdx":1},{"icon":{"paths":["M778.411 96h141.141l-308.352 352.427 362.752 479.573h-284.032l-222.464-290.859-254.549 290.859h-141.227l329.813-376.96-347.989-455.040h291.243l201.088 265.856zM728.875 843.52h78.208l-504.832-667.477h-83.925z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["x","twitter"],"grid":16},"attrs":[{}],"properties":{"order":6,"id":0,"name":"x","prevSize":32,"code":59651},"setIdx":2,"setId":3,"iconIdx":2}],"height":1024,"metadata":{"name":"icomoon"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"icomoon"},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16,"showGrid":false}} \ No newline at end of file diff --git a/components/molecules/NavButtons.js b/components/molecules/NavButtons.js new file mode 100644 index 0000000..19978c0 --- /dev/null +++ b/components/molecules/NavButtons.js @@ -0,0 +1,24 @@ +import zenScroll from 'zenscroll'; +import IcomoonReact from 'icomoon-react'; +import iconSet from "@/components/icons/selection.json"; +import styles from '@/styles/NavButtons.module.css'; + +export default function NavButtons() { + + return ( +
+ + + Home + + + + Portfolio + + + + Experience + +
+ ) +} diff --git a/components/molecules/SocialLinks.js b/components/molecules/SocialLinks.js new file mode 100644 index 0000000..36ec1a0 --- /dev/null +++ b/components/molecules/SocialLinks.js @@ -0,0 +1,17 @@ +import IcomoonReact from 'icomoon-react'; +import data from '../data/socials.json'; +import iconSet from "../icons/selection.json"; +import styles from '@/styles/SocialLinks.module.css'; + +export default function SocialLinks(props) { + + return ( +
+ {data.map(social => + + + + )} +
+ ) +} diff --git a/components/molecules/portfolioItem.js b/components/molecules/portfolioItem.js new file mode 100644 index 0000000..c8e405f --- /dev/null +++ b/components/molecules/portfolioItem.js @@ -0,0 +1,45 @@ +import Markdown from 'react-markdown'; +import { Swiper, SwiperSlide } from 'swiper/react'; +import { Keyboard, Pagination, Navigation } from 'swiper/modules'; +import isTouchDevice from 'is-touch-device'; +import styles from '@/styles/PortfolioItem.module.css'; +import 'swiper/css'; +import 'swiper/css/pagination'; +import 'swiper/css/navigation'; +import Slide from '../atoms/slide'; +import StackList from '../atoms/StackList'; + +export default function PortfolioItem(props) { + + return ( +
+ {props.project.data.images && + + {props.project.data.images.map(image => + + + + )} + + } +

{props.project.data.title}

+ {props.project.description} + +
+ ) +} \ No newline at end of file diff --git a/components/organisms/Footer.js b/components/organisms/Footer.js new file mode 100644 index 0000000..ab0585c --- /dev/null +++ b/components/organisms/Footer.js @@ -0,0 +1,20 @@ +import IcomoonReact from "icomoon-react"; +import data from '../data/socials.json'; +import iconSet from "../icons/selection.json"; +import styles from '@/styles/Footer.module.css'; + +export default function Footer() { + + return ( +
+
+ {data.map(social => + + + + )} +
+

Jordan Morrison • 2023

+
+ ) +} \ No newline at end of file diff --git a/components/organisms/PortfolioGrid.js b/components/organisms/PortfolioGrid.js new file mode 100644 index 0000000..880e80f --- /dev/null +++ b/components/organisms/PortfolioGrid.js @@ -0,0 +1,16 @@ +import PortfolioItem from '../molecules/portfolioItem'; +import styles from '@/styles/PortfolioGrid.module.css'; + +export default function PortfolioGrid(props) { + + return ( + <> +
+

Portfolio

+ {props.projects.map(project => + + )} +
+ + ) +} \ No newline at end of file diff --git a/components/organisms/ScrollButton.js b/components/organisms/ScrollButton.js new file mode 100644 index 0000000..131e36f --- /dev/null +++ b/components/organisms/ScrollButton.js @@ -0,0 +1,32 @@ +import { useEffect } from 'react'; +import zenScroll from 'zenscroll'; +import IcomoonReact from 'icomoon-react'; +import iconSet from "@/components/icons/selection.json"; +import styles from '@/styles/ScrollButton.module.css'; + +export default function ScrollButton(props) { + + useEffect(() => { + function updatePosition() { + let scrollThreshold = window.innerHeight * 0.18 + if (props.isWelcomeScreen && window.scrollY > scrollThreshold){ + props.setIsWelcomeScreen(false); + } + else if (!props.isWelcomeScreen && window.scrollY < scrollThreshold){ + props.setIsWelcomeScreen(true); + } + } + window.addEventListener("scroll", updatePosition); + return () => window.removeEventListener("scroll", updatePosition); + }, [props.isWelcomeScreen]); + + function scroll() { + props.isWelcomeScreen ? zenScroll.to(props.projectScreenRef.current) : zenScroll.center(props.welcomeScreenRef.current); + } + + return ( +
+ +
+ ) +} diff --git a/components/organisms/WelcomeScreen.js b/components/organisms/WelcomeScreen.js new file mode 100644 index 0000000..2d77bfa --- /dev/null +++ b/components/organisms/WelcomeScreen.js @@ -0,0 +1,14 @@ +import SocialLinks from '../molecules/SocialLinks'; +import styles from '@/styles/WelcomeScreen.module.css'; + +export default function WelcomeScreen(props) { + + return ( +
+ Jordan Morrison's Animoji +

Jordan Morrison

+

Web Developer | Mobile Developer | Graphic Designer | UX & UI Designer

+ +
+ ) +} \ No newline at end of file diff --git a/components/templates/Home.js b/components/templates/Home.js new file mode 100644 index 0000000..06d9db8 --- /dev/null +++ b/components/templates/Home.js @@ -0,0 +1,28 @@ +import { useRef, useState } from 'react'; +import Head from 'next/head'; +import WelcomeScreen from '@/components/organisms/WelcomeScreen'; +import PortfolioGrid from '../organisms/PortfolioGrid'; +import styles from '@/styles/Home.module.css'; +import ScrollButton from '../organisms/ScrollButton'; +import Footer from '../organisms/Footer'; + +export default function Home(props) { + + const [isWelcomeScreen, setIsWelcomeScreen] = useState(true); + + const projectScreenRef = useRef(null); + const welcomeScreenRef = useRef(null); + + return ( +
+ + Jordan Morrison + + + + + +
+ ) +} diff --git a/favicon-16x16.png b/favicon-16x16.png deleted file mode 100644 index 7086625..0000000 Binary files a/favicon-16x16.png and /dev/null differ diff --git a/favicon-32x32.png b/favicon-32x32.png deleted file mode 100644 index 6582c3a..0000000 Binary files a/favicon-32x32.png and /dev/null differ diff --git a/images/Projects/Contacts App/Add Contact.png b/images/Projects/Contacts App/Add Contact.png deleted file mode 100644 index d7078ad..0000000 Binary files a/images/Projects/Contacts App/Add Contact.png and /dev/null differ diff --git a/images/Projects/Contacts App/Contact Details.png b/images/Projects/Contacts App/Contact Details.png deleted file mode 100644 index 814c982..0000000 Binary files a/images/Projects/Contacts App/Contact Details.png and /dev/null differ diff --git a/images/Projects/Contacts App/Contacts.png b/images/Projects/Contacts App/Contacts.png deleted file mode 100644 index 1d3aceb..0000000 Binary files a/images/Projects/Contacts App/Contacts.png and /dev/null differ diff --git a/images/Projects/Movie Recommendations/Main Screen.png b/images/Projects/Movie Recommendations/Main Screen.png deleted file mode 100644 index 5d895a3..0000000 Binary files a/images/Projects/Movie Recommendations/Main Screen.png and /dev/null differ diff --git a/images/Projects/Movie Recommendations/Recommended Movies.png b/images/Projects/Movie Recommendations/Recommended Movies.png deleted file mode 100644 index f7f9b8c..0000000 Binary files a/images/Projects/Movie Recommendations/Recommended Movies.png and /dev/null differ diff --git a/images/Projects/Movie Recommendations/Search Results.png b/images/Projects/Movie Recommendations/Search Results.png deleted file mode 100644 index e77a78b..0000000 Binary files a/images/Projects/Movie Recommendations/Search Results.png and /dev/null differ diff --git a/js/main.js b/js/main.js deleted file mode 100644 index 4ffc290..0000000 --- a/js/main.js +++ /dev/null @@ -1,57 +0,0 @@ -const Jordan = { - - main: function(){ - Jordan.addEventListeners(); - Jordan.addSiemas(); - }, - - addSiemas: function(){ - const siemas = document.querySelectorAll('.siema'); - for(const siema of siemas) { - new Siema({ - selector: siema, - onInit: () => { - let div = document.createElement("div"); - div.classList.add("slideIndicator"); - siema.firstChild.childNodes.forEach(slide => { - div.innerHTML += ``; - }); - div.firstChild.classList.add("active"); - siema.insertAdjacentElement("afterend", div); - }, - onChange: Jordan.changeSlideIndicator - }) - } - }, - - changeSlideIndicator: function(){ - this.selector.nextSibling.childNodes.forEach(indicator => { - indicator.classList.remove("active"); - }) - this.selector.nextSibling.childNodes[this.currentSlide].classList.add("active"); - }, - - addEventListeners: function(){ - document.addEventListener("scroll", function(){ - if (scrollY > document.getElementById("welcomeScreen").clientHeight * 0.50){ - document.body.classList.replace("redTheme", "blueTheme"); - document.querySelector(".fa-chevron-down").classList.add("up"); - document.querySelector(".fa-chevron-down").setAttribute("onclick", "Jordan.scrollToScreen('welcomeScreen')"); - } - else{ - document.body.classList.replace("blueTheme", "redTheme"); - document.querySelector(".fa-chevron-down").classList.remove("up"); - document.querySelector(".fa-chevron-down").setAttribute("onclick", "Jordan.scrollToScreen('portfolioScreen')"); - } - }); - }, - - scrollToScreen: function(screen){ - zenscroll.center(document.getElementById(screen)); - } -} - - -window.addEventListener('DOMContentLoaded', (event) => { - Jordan.main(); -}); \ No newline at end of file diff --git a/js/siema.min.js b/js/siema.min.js deleted file mode 100755 index 48e29c7..0000000 --- a/js/siema.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Siema",[],t):"object"==typeof exports?exports.Siema=t():e.Siema=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(r){if(i[r])return i[r].exports;var n=i[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var i={};return t.m=e,t.c=i,t.d=function(e,i,r){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,i){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var i=0;i=e&&(this.perPage=this.config.perPage[e])}}},{key:"prev",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments[1];if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;if(this.config.loop){if(this.currentSlide-e<0){this.disableTransition();var r=this.currentSlide+this.innerElements.length,n=this.perPage,s=r+n,l=(this.config.rtl?1:-1)*s*(this.selectorWidth/this.perPage),o=this.config.draggable?this.drag.endX-this.drag.startX:0;this.sliderFrame.style[this.transformProperty]="translate3d("+(l+o)+"px, 0, 0)",this.currentSlide=r-e}else this.currentSlide=this.currentSlide-e}else this.currentSlide=Math.max(this.currentSlide-e,0);i!==this.currentSlide&&(this.slideToCurrent(this.config.loop),this.config.onChange.call(this),t&&t.call(this))}}},{key:"next",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments[1];if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;if(this.config.loop){if(this.currentSlide+e>this.innerElements.length-this.perPage){this.disableTransition();var r=this.currentSlide-this.innerElements.length,n=this.perPage,s=r+n,l=(this.config.rtl?1:-1)*s*(this.selectorWidth/this.perPage),o=this.config.draggable?this.drag.endX-this.drag.startX:0;this.sliderFrame.style[this.transformProperty]="translate3d("+(l+o)+"px, 0, 0)",this.currentSlide=r+e}else this.currentSlide=this.currentSlide+e}else this.currentSlide=Math.min(this.currentSlide+e,this.innerElements.length-this.perPage);i!==this.currentSlide&&(this.slideToCurrent(this.config.loop),this.config.onChange.call(this),t&&t.call(this))}}},{key:"disableTransition",value:function(){this.sliderFrame.style.webkitTransition="all 0ms "+this.config.easing,this.sliderFrame.style.transition="all 0ms "+this.config.easing}},{key:"enableTransition",value:function(){this.sliderFrame.style.webkitTransition="all "+this.config.duration+"ms "+this.config.easing,this.sliderFrame.style.transition="all "+this.config.duration+"ms "+this.config.easing}},{key:"goTo",value:function(e,t){if(!(this.innerElements.length<=this.perPage)){var i=this.currentSlide;this.currentSlide=this.config.loop?e%this.innerElements.length:Math.min(Math.max(e,0),this.innerElements.length-this.perPage),i!==this.currentSlide&&(this.slideToCurrent(),this.config.onChange.call(this),t&&t.call(this))}}},{key:"slideToCurrent",value:function(e){var t=this,i=this.config.loop?this.currentSlide+this.perPage:this.currentSlide,r=(this.config.rtl?1:-1)*i*(this.selectorWidth/this.perPage);e?requestAnimationFrame(function(){requestAnimationFrame(function(){t.enableTransition(),t.sliderFrame.style[t.transformProperty]="translate3d("+r+"px, 0, 0)"})}):this.sliderFrame.style[this.transformProperty]="translate3d("+r+"px, 0, 0)"}},{key:"updateAfterDrag",value:function(){var e=(this.config.rtl?-1:1)*(this.drag.endX-this.drag.startX),t=Math.abs(e),i=this.config.multipleDrag?Math.ceil(t/(this.selectorWidth/this.perPage)):1,r=e>0&&this.currentSlide-i<0,n=e<0&&this.currentSlide+i>this.innerElements.length-this.perPage;e>0&&t>this.config.threshold&&this.innerElements.length>this.perPage?this.prev(i):e<0&&t>this.config.threshold&&this.innerElements.length>this.perPage&&this.next(i),this.slideToCurrent(r||n)}},{key:"resizeHandler",value:function(){this.resolveSlidesNumber(),this.currentSlide+this.perPage>this.innerElements.length&&(this.currentSlide=this.innerElements.length<=this.perPage?0:this.innerElements.length-this.perPage),this.selectorWidth=this.selector.offsetWidth,this.buildSliderFrame()}},{key:"clearDrag",value:function(){this.drag={startX:0,endX:0,startY:0,letItGo:null,preventClick:this.drag.preventClick}}},{key:"touchstartHandler",value:function(e){-1!==["TEXTAREA","OPTION","INPUT","SELECT"].indexOf(e.target.nodeName)||(e.stopPropagation(),this.pointerDown=!0,this.drag.startX=e.touches[0].pageX,this.drag.startY=e.touches[0].pageY)}},{key:"touchendHandler",value:function(e){e.stopPropagation(),this.pointerDown=!1,this.enableTransition(),this.drag.endX&&this.updateAfterDrag(),this.clearDrag()}},{key:"touchmoveHandler",value:function(e){if(e.stopPropagation(),null===this.drag.letItGo&&(this.drag.letItGo=Math.abs(this.drag.startY-e.touches[0].pageY)=this.innerElements.length)throw new Error("Item to remove doesn't exist 😭");var i=ethis.innerElements.length+1)throw new Error("Unable to inset it at this index 😭");if(-1!==this.innerElements.indexOf(e))throw new Error("The same item in a carousel? Really? Nope 😭");var r=t<=this.currentSlide>0&&this.innerElements.length;this.currentSlide=r?this.currentSlide+1:this.currentSlide,this.innerElements.splice(t,0,e),this.buildSliderFrame(),i&&i.call(this)}},{key:"prepend",value:function(e,t){this.insert(e,0),t&&t.call(this)}},{key:"append",value:function(e,t){this.insert(e,this.innerElements.length+1),t&&t.call(this)}},{key:"destroy",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments[1];if(this.detachEvents(),this.selector.style.cursor="auto",e){for(var i=document.createDocumentFragment(),r=0;r - * - */ - -/*jshint devel:true, asi:true */ - -/*global define, module */ - - -(function (root, factory) { - if (typeof define === "function" && define.amd) { - define([], factory()) - } else if (typeof module === "object" && module.exports) { - module.exports = factory() - } else { - (function install() { - // To make sure Zenscroll can be referenced from the header, before `body` is available - if (document && document.body) { - root.zenscroll = factory() - } else { - // retry 9ms later - setTimeout(install, 9) - } - })() - } -}(this, function () { - "use strict" - - - // Detect if the browser already supports native smooth scrolling (e.g., Firefox 36+ and Chrome 49+) and it is enabled: - var isNativeSmoothScrollEnabledOn = function (elem) { - return elem && "getComputedStyle" in window && - window.getComputedStyle(elem)["scroll-behavior"] === "smooth" - } - - - // Exit if it’s not a browser environment: - if (typeof window === "undefined" || !("document" in window)) { - return {} - } - - - var makeScroller = function (container, defaultDuration, edgeOffset) { - - // Use defaults if not provided - defaultDuration = defaultDuration || 999 //ms - if (!edgeOffset && edgeOffset !== 0) { - // When scrolling, this amount of distance is kept from the edges of the container: - edgeOffset = 9 //px - } - - // Handling the life-cycle of the scroller - var scrollTimeoutId - var setScrollTimeoutId = function (newValue) { - scrollTimeoutId = newValue - } - - /** - * Stop the current smooth scroll operation immediately - */ - var stopScroll = function () { - clearTimeout(scrollTimeoutId) - setScrollTimeoutId(0) - } - - var getTopWithEdgeOffset = function (elem) { - return Math.max(0, container.getTopOf(elem) - edgeOffset) - } - - /** - * Scrolls to a specific vertical position in the document. - * - * @param {targetY} The vertical position within the document. - * @param {duration} Optionally the duration of the scroll operation. - * If not provided the default duration is used. - * @param {onDone} An optional callback function to be invoked once the scroll finished. - */ - var scrollToY = function (targetY, duration, onDone) { - stopScroll() - if (duration === 0 || (duration && duration < 0) || isNativeSmoothScrollEnabledOn(container.body)) { - container.toY(targetY) - if (onDone) { - onDone() - } - } else { - var startY = container.getY() - var distance = Math.max(0, targetY) - startY - var startTime = new Date().getTime() - duration = duration || Math.min(Math.abs(distance), defaultDuration); - (function loopScroll() { - setScrollTimeoutId(setTimeout(function () { - // Calculate percentage: - var p = Math.min(1, (new Date().getTime() - startTime) / duration) - // Calculate the absolute vertical position: - var y = Math.max(0, Math.floor(startY + distance*(p < 0.5 ? 2*p*p : p*(4 - p*2)-1))) - container.toY(y) - if (p < 1 && (container.getHeight() + y) < container.body.scrollHeight) { - loopScroll() - } else { - setTimeout(stopScroll, 99) // with cooldown time - if (onDone) { - onDone() - } - } - }, 9)) - })() - } - } - - /** - * Scrolls to the top of a specific element. - * - * @param {elem} The element to scroll to. - * @param {duration} Optionally the duration of the scroll operation. - * @param {onDone} An optional callback function to be invoked once the scroll finished. - */ - var scrollToElem = function (elem, duration, onDone) { - scrollToY(getTopWithEdgeOffset(elem), duration, onDone) - } - - /** - * Scrolls an element into view if necessary. - * - * @param {elem} The element. - * @param {duration} Optionally the duration of the scroll operation. - * @param {onDone} An optional callback function to be invoked once the scroll finished. - */ - var scrollIntoView = function (elem, duration, onDone) { - var elemHeight = elem.getBoundingClientRect().height - var elemBottom = container.getTopOf(elem) + elemHeight - var containerHeight = container.getHeight() - var y = container.getY() - var containerBottom = y + containerHeight - if (getTopWithEdgeOffset(elem) < y || (elemHeight + edgeOffset) > containerHeight) { - // Element is clipped at top or is higher than screen. - scrollToElem(elem, duration, onDone) - } else if ((elemBottom + edgeOffset) > containerBottom) { - // Element is clipped at the bottom. - scrollToY(elemBottom - containerHeight + edgeOffset, duration, onDone) - } else if (onDone) { - onDone() - } - } - - /** - * Scrolls to the center of an element. - * - * @param {elem} The element. - * @param {duration} Optionally the duration of the scroll operation. - * @param {offset} Optionally the offset of the top of the element from the center of the screen. - * A value of 0 is ignored. - * @param {onDone} An optional callback function to be invoked once the scroll finished. - */ - var scrollToCenterOf = function (elem, duration, offset, onDone) { - scrollToY(Math.max(0, container.getTopOf(elem) - container.getHeight()/2 + (offset || elem.getBoundingClientRect().height/2)), duration, onDone) - } - - /** - * Changes default settings for this scroller. - * - * @param {newDefaultDuration} Optionally a new value for default duration, used for each scroll method by default. - * Ignored if null or undefined. - * @param {newEdgeOffset} Optionally a new value for the edge offset, used by each scroll method by default. Ignored if null or undefined. - * @returns An object with the current values. - */ - var setup = function (newDefaultDuration, newEdgeOffset) { - if (newDefaultDuration === 0 || newDefaultDuration) { - defaultDuration = newDefaultDuration - } - if (newEdgeOffset === 0 || newEdgeOffset) { - edgeOffset = newEdgeOffset - } - return { - defaultDuration: defaultDuration, - edgeOffset: edgeOffset - } - } - - return { - setup: setup, - to: scrollToElem, - toY: scrollToY, - intoView: scrollIntoView, - center: scrollToCenterOf, - stop: stopScroll, - moving: function () { return !!scrollTimeoutId }, - getY: container.getY, - getTopOf: container.getTopOf - } - - } - - - var docElem = document.documentElement - var getDocY = function () { return window.scrollY || docElem.scrollTop } - - // Create a scroller for the document: - var zenscroll = makeScroller({ - body: document.scrollingElement || document.body, - toY: function (y) { window.scrollTo(0, y) }, - getY: getDocY, - getHeight: function () { return window.innerHeight || docElem.clientHeight }, - getTopOf: function (elem) { return elem.getBoundingClientRect().top + getDocY() - docElem.offsetTop } - }) - - - /** - * Creates a scroller from the provided container element (e.g., a DIV) - * - * @param {scrollContainer} The vertical position within the document. - * @param {defaultDuration} Optionally a value for default duration, used for each scroll method by default. - * Ignored if 0 or null or undefined. - * @param {edgeOffset} Optionally a value for the edge offset, used by each scroll method by default. - * Ignored if null or undefined. - * @returns A scroller object, similar to `zenscroll` but controlling the provided element. - */ - zenscroll.createScroller = function (scrollContainer, defaultDuration, edgeOffset) { - return makeScroller({ - body: scrollContainer, - toY: function (y) { scrollContainer.scrollTop = y }, - getY: function () { return scrollContainer.scrollTop }, - getHeight: function () { return Math.min(scrollContainer.clientHeight, window.innerHeight || docElem.clientHeight) }, - getTopOf: function (elem) { return elem.offsetTop } - }, defaultDuration, edgeOffset) - } - - - // Automatic link-smoothing on achors - // Exclude IE8- or when native is enabled or Zenscroll auto- is disabled - if ("addEventListener" in window && !window.noZensmooth && !isNativeSmoothScrollEnabledOn(document.body)) { - - var isHistorySupported = "history" in window && "pushState" in history - var isScrollRestorationSupported = isHistorySupported && "scrollRestoration" in history - - // On first load & refresh make sure the browser restores the position first - if (isScrollRestorationSupported) { - history.scrollRestoration = "auto" - } - - window.addEventListener("load", function () { - - if (isScrollRestorationSupported) { - // Set it to manual - setTimeout(function () { history.scrollRestoration = "manual" }, 9) - window.addEventListener("popstate", function (event) { - if (event.state && "zenscrollY" in event.state) { - zenscroll.toY(event.state.zenscrollY) - } - }, false) - } - - // Add edge offset on first load if necessary - // This may not work on IE (or older computer?) as it requires more timeout, around 100 ms - if (window.location.hash) { - setTimeout(function () { - // Adjustment is only needed if there is an edge offset: - var edgeOffset = zenscroll.setup().edgeOffset - if (edgeOffset) { - var targetElem = document.getElementById(window.location.href.split("#")[1]) - if (targetElem) { - var targetY = Math.max(0, zenscroll.getTopOf(targetElem) - edgeOffset) - var diff = zenscroll.getY() - targetY - // Only do the adjustment if the browser is very close to the element: - if (0 <= diff && diff < 9 ) { - window.scrollTo(0, targetY) - } - } - } - }, 9) - } - - }, false) - - // Handling clicks on anchors - var RE_noZensmooth = new RegExp("(^|\\s)noZensmooth(\\s|$)") - window.addEventListener("click", function (event) { - var anchor = event.target - while (anchor && anchor.tagName !== "A") { - anchor = anchor.parentNode - } - // Let the browser handle the click if it wasn't with the primary button, or with some modifier keys: - if (!anchor || event.which !== 1 || event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) { - return - } - // Save the current scrolling position so it can be used for scroll restoration: - if (isScrollRestorationSupported) { - var historyState = history.state && typeof history.state === "object" ? history.state : {} - historyState.zenscrollY = zenscroll.getY() - try { - history.replaceState(historyState, "") - } catch (e) { - // Avoid the Chrome Security exception on file protocol, e.g., file://index.html - } - } - // Find the referenced ID: - var href = anchor.getAttribute("href") || "" - if (href.indexOf("#") === 0 && !RE_noZensmooth.test(anchor.className)) { - var targetY = 0 - var targetElem = document.getElementById(href.substring(1)) - if (href !== "#") { - if (!targetElem) { - // Let the browser handle the click if the target ID is not found. - return - } - targetY = zenscroll.getTopOf(targetElem) - } - event.preventDefault() - // By default trigger the browser's `hashchange` event... - var onDone = function () { window.location = href } - // ...unless there is an edge offset specified - var edgeOffset = zenscroll.setup().edgeOffset - if (edgeOffset) { - targetY = Math.max(0, targetY - edgeOffset) - if (isHistorySupported) { - onDone = function () { history.pushState({}, "", href) } - } - } - zenscroll.toY(targetY, null, onDone) - } - }, false) - - } - - - return zenscroll - - -})); diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..2a2e4b3 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..a843cbe --- /dev/null +++ b/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +} + +module.exports = nextConfig diff --git a/index.html b/old_TEMP/index.html similarity index 100% rename from index.html rename to old_TEMP/index.html diff --git a/css/main.css b/old_TEMP/main.css similarity index 100% rename from css/main.css rename to old_TEMP/main.css diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ab56825 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1392 @@ +{ + "name": "jordan-morrison.github.io", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jordan-morrison.github.io", + "version": "0.1.0", + "dependencies": { + "front-matter": "^4.0.2", + "icomoon-react": "^3.0.0", + "is-touch-device": "^1.0.1", + "next": "13.4.19", + "react-dom": "18.2.0", + "react-markdown": "^9.0.0", + "swiper": "^11.0.2", + "zenscroll": "^4.0.2" + } + }, + "node_modules/@next/env": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz", + "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz", + "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz", + "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz", + "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz", + "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz", + "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz", + "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz", + "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz", + "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz", + "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", + "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.1.tgz", + "integrity": "sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.1.tgz", + "integrity": "sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", + "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.8", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", + "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", + "peer": true + }, + "node_modules/@types/react": { + "version": "18.2.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", + "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", + "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "peer": true + }, + "node_modules/@types/unist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", + "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001527", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", + "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "peer": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz", + "integrity": "sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/icomoon-react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/icomoon-react/-/icomoon-react-3.0.0.tgz", + "integrity": "sha512-2zfOpjnFj83v7MoG2D2+g7bn+Ha4HnousvHyNUs7IZrjM/yjAsfBq6uxrFf7erTnEYscdXGieLv66ANgSnI1ag==", + "dependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-touch-device": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-touch-device/-/is-touch-device-1.0.1.tgz", + "integrity": "sha512-LAYzo9kMT1b2p19L/1ATGt2XcSilnzNlyvq6c0pbPRVisLbAPpLqr53tIJS00kvrTkj0HtR8U7+u8X0yR8lPSw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz", + "integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz", + "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==", + "dependencies": { + "@next/env": "13.4.19", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.19", + "@next/swc-darwin-x64": "13.4.19", + "@next/swc-linux-arm64-gnu": "13.4.19", + "@next/swc-linux-arm64-musl": "13.4.19", + "@next/swc-linux-x64-gnu": "13.4.19", + "@next/swc-linux-x64-musl": "13.4.19", + "@next/swc-win32-arm64-msvc": "13.4.19", + "@next/swc-win32-ia32-msvc": "13.4.19", + "@next/swc-win32-x64-msvc": "13.4.19" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.3.0.tgz", + "integrity": "sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-markdown": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.0.tgz", + "integrity": "sha512-v6yNf3AB8GfJ8lCpUvzxAXKxgsHpdmWPlcVRQ6Nocsezp255E/IDrF31kLQsPJeB/cKto/geUwjU36wH784FCA==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", + "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/swiper": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.0.2.tgz", + "integrity": "sha512-JMHZYdUDG0V5ZdzWJkQicW4F7u4edmS4vlOhciTDhcZokDL2N8EE2uP4INxqIgpiJMoeHlwATqZk2yEAW7F6Dw==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "engines": { + "node": ">= 4.7.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/unified": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.3.tgz", + "integrity": "sha512-jlCV402P+YDcFcB2VcN/n8JasOddqIiaxv118wNBoZXEhOn+lYG7BR4Bfg2BwxvlK58dwbuH2w7GX2esAjL6Mg==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/zenscroll": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", + "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==" + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..303eb4c --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "jordan-morrison.github.io", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "front-matter": "^4.0.2", + "icomoon-react": "^3.0.0", + "is-touch-device": "^1.0.1", + "next": "13.4.19", + "react-dom": "18.2.0", + "react-markdown": "^9.0.0", + "swiper": "^11.0.2", + "zenscroll": "^4.0.2" + } +} diff --git a/pages/_app.js b/pages/_app.js new file mode 100644 index 0000000..b40224d --- /dev/null +++ b/pages/_app.js @@ -0,0 +1,7 @@ +import '@/styles/globals.css'; + +export default function App({ Component, pageProps }) { + return ( + + ) +} diff --git a/pages/_document.js b/pages/_document.js new file mode 100644 index 0000000..54e8bf3 --- /dev/null +++ b/pages/_document.js @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + + + +
+ + + + ) +} diff --git a/pages/index.js b/pages/index.js new file mode 100644 index 0000000..4e1f2cd --- /dev/null +++ b/pages/index.js @@ -0,0 +1,41 @@ +const fs = require('fs'); +var fm = require('front-matter'); +import Home from "@/components/templates/Home"; + +export default function Index(props) { + + return ( + + ) +} + + +export async function getStaticProps() { + + const path = "components/data/projects"; + let projects = []; + + fs.readdirSync(path).forEach(file => { + if (file.slice(-3) === ".md"){ + let fileContents = fs.readFileSync(`${path}/${file}`); + fileContents = fm(fileContents.toString()); + projects.push({ + data: fileContents.attributes, + description: fileContents.body + }); + } + }); + + projects.sort(function(x, y) { + if (x.data.index < y.data.index) { + return -1; + } + if (x.data.index > y.data.index) { + return 1; + } + return 0; + }); + + return {props : {projects}} + +} \ No newline at end of file diff --git a/Jordan Morrison Resume.pdf b/public/Jordan Morrison Resume.pdf similarity index 100% rename from Jordan Morrison Resume.pdf rename to public/Jordan Morrison Resume.pdf diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..c2d8e5f Binary files /dev/null and b/public/favicon.ico differ diff --git a/images/Jordan.png b/public/images/Jordan.png similarity index 100% rename from images/Jordan.png rename to public/images/Jordan.png diff --git a/images/Projects/Advent Calendar/Calendar Screen.jpg b/public/images/projects/adventCalendar/adventCalendar.jpg similarity index 100% rename from images/Projects/Advent Calendar/Calendar Screen.jpg rename to public/images/projects/adventCalendar/adventCalendar.jpg diff --git a/images/Projects/Advent Calendar/Christmas Day.jpg b/public/images/projects/adventCalendar/christmasDay.jpg similarity index 100% rename from images/Projects/Advent Calendar/Christmas Day.jpg rename to public/images/projects/adventCalendar/christmasDay.jpg diff --git a/images/Projects/Advent Calendar/Login Screen.jpg b/public/images/projects/adventCalendar/loginScreen.jpg similarity index 100% rename from images/Projects/Advent Calendar/Login Screen.jpg rename to public/images/projects/adventCalendar/loginScreen.jpg diff --git a/public/images/projects/busrides/authorDetails.png b/public/images/projects/busrides/authorDetails.png new file mode 100644 index 0000000..90d5382 Binary files /dev/null and b/public/images/projects/busrides/authorDetails.png differ diff --git a/public/images/projects/busrides/home.png b/public/images/projects/busrides/home.png new file mode 100644 index 0000000..ddc3ae7 Binary files /dev/null and b/public/images/projects/busrides/home.png differ diff --git a/public/images/projects/gcTortilla/defaultSplashScreen.png b/public/images/projects/gcTortilla/defaultSplashScreen.png new file mode 100644 index 0000000..dc72336 Binary files /dev/null and b/public/images/projects/gcTortilla/defaultSplashScreen.png differ diff --git a/public/images/projects/gcTortilla/headerAndFooter.png b/public/images/projects/gcTortilla/headerAndFooter.png new file mode 100644 index 0000000..d3cbbfc Binary files /dev/null and b/public/images/projects/gcTortilla/headerAndFooter.png differ diff --git a/public/images/projects/gcTortilla/logoSplashScreen.png b/public/images/projects/gcTortilla/logoSplashScreen.png new file mode 100644 index 0000000..40f5937 Binary files /dev/null and b/public/images/projects/gcTortilla/logoSplashScreen.png differ diff --git a/public/images/projects/gcTortilla/npm.png b/public/images/projects/gcTortilla/npm.png new file mode 100644 index 0000000..7f18760 Binary files /dev/null and b/public/images/projects/gcTortilla/npm.png differ diff --git a/images/Projects/Lightning/Book Tutor Dark.jpg b/public/images/projects/lightningTutoring/bookTutorDark.jpg similarity index 100% rename from images/Projects/Lightning/Book Tutor Dark.jpg rename to public/images/projects/lightningTutoring/bookTutorDark.jpg diff --git a/images/Projects/Lightning/Book Tutor Light.jpg b/public/images/projects/lightningTutoring/bookTutorLight.jpg similarity index 100% rename from images/Projects/Lightning/Book Tutor Light.jpg rename to public/images/projects/lightningTutoring/bookTutorLight.jpg diff --git a/images/Projects/Lightning/Browse Tutors Dark.jpg b/public/images/projects/lightningTutoring/browseTutorsDark.jpg similarity index 100% rename from images/Projects/Lightning/Browse Tutors Dark.jpg rename to public/images/projects/lightningTutoring/browseTutorsDark.jpg diff --git a/images/Projects/Lightning/Browse Tutors Light.jpg b/public/images/projects/lightningTutoring/browseTutorsLight.jpg similarity index 100% rename from images/Projects/Lightning/Browse Tutors Light.jpg rename to public/images/projects/lightningTutoring/browseTutorsLight.jpg diff --git a/images/Projects/Lightning/Tutor Details Dark.jpg b/public/images/projects/lightningTutoring/tutorDetailsDark.jpg similarity index 100% rename from images/Projects/Lightning/Tutor Details Dark.jpg rename to public/images/projects/lightningTutoring/tutorDetailsDark.jpg diff --git a/images/Projects/Lightning/Tutor Details Light.jpg b/public/images/projects/lightningTutoring/tutorDetailsLight.jpg similarity index 100% rename from images/Projects/Lightning/Tutor Details Light.jpg rename to public/images/projects/lightningTutoring/tutorDetailsLight.jpg diff --git a/images/Projects/MASV/Disney Portal.jpg b/public/images/projects/masvMobile/disneyPortal.jpg similarity index 100% rename from images/Projects/MASV/Disney Portal.jpg rename to public/images/projects/masvMobile/disneyPortal.jpg diff --git a/images/Projects/MASV/Disney Portal Transfer Complete.jpg b/public/images/projects/masvMobile/disneyPortalTransferComplete.jpg similarity index 100% rename from images/Projects/MASV/Disney Portal Transfer Complete.jpg rename to public/images/projects/masvMobile/disneyPortalTransferComplete.jpg diff --git a/images/Projects/MASV/MASV Portal.jpg b/public/images/projects/masvMobile/masvPortal.jpg similarity index 100% rename from images/Projects/MASV/MASV Portal.jpg rename to public/images/projects/masvMobile/masvPortal.jpg diff --git a/images/Projects/MASV/MASV Portal Transfer Complete.jpg b/public/images/projects/masvMobile/masvPortalTransferComplete.jpg similarity index 100% rename from images/Projects/MASV/MASV Portal Transfer Complete.jpg rename to public/images/projects/masvMobile/masvPortalTransferComplete.jpg diff --git a/images/Projects/MASV/Portal Selection.jpg b/public/images/projects/masvMobile/portalSelection.jpg similarity index 100% rename from images/Projects/MASV/Portal Selection.jpg rename to public/images/projects/masvMobile/portalSelection.jpg diff --git a/public/images/projects/openCall/about.png b/public/images/projects/openCall/about.png new file mode 100644 index 0000000..4287ba2 Binary files /dev/null and b/public/images/projects/openCall/about.png differ diff --git a/public/images/projects/openCall/contribute.png b/public/images/projects/openCall/contribute.png new file mode 100644 index 0000000..c32c85f Binary files /dev/null and b/public/images/projects/openCall/contribute.png differ diff --git a/public/images/projects/openCall/faq.png b/public/images/projects/openCall/faq.png new file mode 100644 index 0000000..276df9e Binary files /dev/null and b/public/images/projects/openCall/faq.png differ diff --git a/public/images/projects/openCall/home.png b/public/images/projects/openCall/home.png new file mode 100644 index 0000000..b295543 Binary files /dev/null and b/public/images/projects/openCall/home.png differ diff --git a/public/images/projects/openCall/successStories.png b/public/images/projects/openCall/successStories.png new file mode 100644 index 0000000..9e15e24 Binary files /dev/null and b/public/images/projects/openCall/successStories.png differ diff --git a/public/images/projects/photographyPortfolio/contact_dark.png b/public/images/projects/photographyPortfolio/contact_dark.png new file mode 100644 index 0000000..b69cef1 Binary files /dev/null and b/public/images/projects/photographyPortfolio/contact_dark.png differ diff --git a/public/images/projects/photographyPortfolio/contact_light.png b/public/images/projects/photographyPortfolio/contact_light.png new file mode 100644 index 0000000..623bf4e Binary files /dev/null and b/public/images/projects/photographyPortfolio/contact_light.png differ diff --git a/public/images/projects/photographyPortfolio/home_dark.png b/public/images/projects/photographyPortfolio/home_dark.png new file mode 100644 index 0000000..89e5357 Binary files /dev/null and b/public/images/projects/photographyPortfolio/home_dark.png differ diff --git a/public/images/projects/photographyPortfolio/home_light.png b/public/images/projects/photographyPortfolio/home_light.png new file mode 100644 index 0000000..d01c78c Binary files /dev/null and b/public/images/projects/photographyPortfolio/home_light.png differ diff --git a/public/images/projects/photographyPortfolio/photoGrid_dark.png b/public/images/projects/photographyPortfolio/photoGrid_dark.png new file mode 100644 index 0000000..6b701a9 Binary files /dev/null and b/public/images/projects/photographyPortfolio/photoGrid_dark.png differ diff --git a/public/images/projects/photographyPortfolio/photoGrid_light.png b/public/images/projects/photographyPortfolio/photoGrid_light.png new file mode 100644 index 0000000..256a257 Binary files /dev/null and b/public/images/projects/photographyPortfolio/photoGrid_light.png differ diff --git a/public/images/projects/photographyPortfolio/photoView_dark.png b/public/images/projects/photographyPortfolio/photoView_dark.png new file mode 100644 index 0000000..8f54f90 Binary files /dev/null and b/public/images/projects/photographyPortfolio/photoView_dark.png differ diff --git a/public/images/projects/photographyPortfolio/photoView_light.png b/public/images/projects/photographyPortfolio/photoView_light.png new file mode 100644 index 0000000..05dbf18 Binary files /dev/null and b/public/images/projects/photographyPortfolio/photoView_light.png differ diff --git a/images/Projects/PokedexGo/Compare Screen.png b/public/images/projects/pokedexGo/compareScreen.png similarity index 100% rename from images/Projects/PokedexGo/Compare Screen.png rename to public/images/projects/pokedexGo/compareScreen.png diff --git a/images/Projects/PokedexGo/Compare Select Screen.png b/public/images/projects/pokedexGo/compareSelectScreen.png similarity index 100% rename from images/Projects/PokedexGo/Compare Select Screen.png rename to public/images/projects/pokedexGo/compareSelectScreen.png diff --git a/images/Projects/PokedexGo/Detail Screen.png b/public/images/projects/pokedexGo/detailsScreen.png similarity index 100% rename from images/Projects/PokedexGo/Detail Screen.png rename to public/images/projects/pokedexGo/detailsScreen.png diff --git a/images/Projects/PokedexGo/News Popup.png b/public/images/projects/pokedexGo/newsPopup.png similarity index 100% rename from images/Projects/PokedexGo/News Popup.png rename to public/images/projects/pokedexGo/newsPopup.png diff --git a/images/Projects/PokedexGo/Pokemon Screen.png b/public/images/projects/pokedexGo/pokemonScreen.png similarity index 100% rename from images/Projects/PokedexGo/Pokemon Screen.png rename to public/images/projects/pokedexGo/pokemonScreen.png diff --git a/images/Projects/Winterlude App/Event Details.jpg b/public/images/projects/winterludeApp/eventDetails.jpg similarity index 100% rename from images/Projects/Winterlude App/Event Details.jpg rename to public/images/projects/winterludeApp/eventDetails.jpg diff --git a/images/Projects/Winterlude App/List of Events.jpg b/public/images/projects/winterludeApp/events.jpg similarity index 100% rename from images/Projects/Winterlude App/List of Events.jpg rename to public/images/projects/winterludeApp/events.jpg diff --git a/images/Projects/Winterlude App/Hamburger Menu.jpg b/public/images/projects/winterludeApp/hamburgerMenu.jpg similarity index 100% rename from images/Projects/Winterlude App/Hamburger Menu.jpg rename to public/images/projects/winterludeApp/hamburgerMenu.jpg diff --git a/images/Projects/Winterlude App/Home.jpg b/public/images/projects/winterludeApp/home.jpg similarity index 100% rename from images/Projects/Winterlude App/Home.jpg rename to public/images/projects/winterludeApp/home.jpg diff --git a/images/Projects/Winterlude App/Map.jpg b/public/images/projects/winterludeApp/map.jpg similarity index 100% rename from images/Projects/Winterlude App/Map.jpg rename to public/images/projects/winterludeApp/map.jpg diff --git a/public/images/techIcons/adobeXD.png b/public/images/techIcons/adobeXD.png new file mode 100644 index 0000000..4764a75 Binary files /dev/null and b/public/images/techIcons/adobeXD.png differ diff --git a/public/images/techIcons/css.png b/public/images/techIcons/css.png new file mode 100644 index 0000000..0891a0f Binary files /dev/null and b/public/images/techIcons/css.png differ diff --git a/public/images/techIcons/figma.png b/public/images/techIcons/figma.png new file mode 100644 index 0000000..0d51795 Binary files /dev/null and b/public/images/techIcons/figma.png differ diff --git a/public/images/techIcons/html.png b/public/images/techIcons/html.png new file mode 100644 index 0000000..3ce810a Binary files /dev/null and b/public/images/techIcons/html.png differ diff --git a/public/images/techIcons/javaScript.png b/public/images/techIcons/javaScript.png new file mode 100644 index 0000000..f93f2ac Binary files /dev/null and b/public/images/techIcons/javaScript.png differ diff --git a/public/images/techIcons/mongoDB.png b/public/images/techIcons/mongoDB.png new file mode 100644 index 0000000..6fc7a99 Binary files /dev/null and b/public/images/techIcons/mongoDB.png differ diff --git a/public/images/techIcons/nextjs.png b/public/images/techIcons/nextjs.png new file mode 100644 index 0000000..415d966 Binary files /dev/null and b/public/images/techIcons/nextjs.png differ diff --git a/public/images/techIcons/nodejs.png b/public/images/techIcons/nodejs.png new file mode 100644 index 0000000..38ca7e7 Binary files /dev/null and b/public/images/techIcons/nodejs.png differ diff --git a/public/images/techIcons/react.png b/public/images/techIcons/react.png new file mode 100644 index 0000000..2e817f3 Binary files /dev/null and b/public/images/techIcons/react.png differ diff --git a/public/images/techIcons/swift.png b/public/images/techIcons/swift.png new file mode 100644 index 0000000..ac371cc Binary files /dev/null and b/public/images/techIcons/swift.png differ 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/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/styles/Footer.module.css b/styles/Footer.module.css new file mode 100644 index 0000000..c495e5d --- /dev/null +++ b/styles/Footer.module.css @@ -0,0 +1,27 @@ +.footer { + margin-top: 50px; + padding-bottom: 10px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.socials { + margin-bottom: 20px; + display: flex; + justify-content: center; + align-items: center; + gap: 30px; +} + +.socials a { + fill: var(--primary-foreground); +} + +.footer p { + color: var(--primary-foreground); + margin: 0; + font-size: 12px; + opacity: 33%; +} \ No newline at end of file diff --git a/styles/Home.module.css b/styles/Home.module.css new file mode 100644 index 0000000..1182406 --- /dev/null +++ b/styles/Home.module.css @@ -0,0 +1,8 @@ +.container { + background-color: var(--primary-background); + transition: background-color 1s; + animation: changeColours 10s infinite; +} +.container.notWelcomeScreen { + background-color: var(--secondary-background); +} \ No newline at end of file diff --git a/styles/NavButtons.module.css b/styles/NavButtons.module.css new file mode 100644 index 0000000..b035e3b --- /dev/null +++ b/styles/NavButtons.module.css @@ -0,0 +1,64 @@ +.container { + position: fixed; + top: 60px; + left: 50px; + display: flex; + flex-direction: column; + gap: 10px; +} + +.navTest { + margin: 0; + background-color: white; + padding: 10px; + border-radius: 20px; + height: 20px; + min-width: 20px; + display: flex; + justify-content: center; + align-items: center; + transition: all 750ms; + cursor: pointer; + filter: drop-shadow(0px 0px 10px rgba(0, 0, 0, 0.3)); +} + +.navTest svg { + width: auto; +} + +.navTest span { + max-width: 0; + margin-left: 0; + transition: all 500ms, margin 750ms; + overflow: hidden; + text-wrap: nowrap; +} + +/* .navTest:hover .title{ + max-width: 500px; + margin-left: 15px; +} */ + +/* .container:hover .navTest:not(:hover) { + max-width: 0; +} + +.container:hover .navTest .title { + max-width: 0; + margin-left: 0; + overflow: hidden; + text-wrap: nowrap; +} */ + +.container .navTest:hover .title { + max-width: 500px; + margin-left: 15px; +} + +.navTest:not(:hover) .title { + max-width: 0; +} + +.navTest:not(:hover) { + max-width: 20px; +} \ No newline at end of file diff --git a/styles/PortfolioGrid.module.css b/styles/PortfolioGrid.module.css new file mode 100644 index 0000000..669cb02 --- /dev/null +++ b/styles/PortfolioGrid.module.css @@ -0,0 +1,15 @@ +.container { + color: var(--primary-foreground); + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 30px; +} + +.container h3 { + font-size: 50px; + padding-top: 50px; + margin-bottom: 20px; +} \ No newline at end of file diff --git a/styles/PortfolioItem.module.css b/styles/PortfolioItem.module.css new file mode 100644 index 0000000..48b6463 --- /dev/null +++ b/styles/PortfolioItem.module.css @@ -0,0 +1,21 @@ +.container { + background-color: white; + color: black; + width: 100%; + max-width: 1300px; + border-radius: 6px; +} + +.container h4 { + font-size: 32px; + margin: 30px 0 15px 20px; +} + +.container p { + margin: 0 20px 30px 20px; +} + +.swiper { + border-radius: 6px 6px 0 0; + z-index: 0 !important; +} \ No newline at end of file diff --git a/styles/ScrollButton.module.css b/styles/ScrollButton.module.css new file mode 100644 index 0000000..9e723d9 --- /dev/null +++ b/styles/ScrollButton.module.css @@ -0,0 +1,54 @@ +.scrollButton { + display: flex; + justify-content: center; + align-items: center; + position: fixed; + width: 100%; + transition: all 2s; + bottom: 10px; +} +.scrollButton.top { + rotate: 180deg; + margin-bottom: 92vh; + animation: pulseTop 2s infinite; +} + +.scrollButton svg{ + height: 50px; + cursor: pointer; + animation: pulse 2s infinite; + transition: all 2s; + z-index: 100; + fill: var(--primary-foreground); +} + +/* ANIMATIONS */ +@keyframes pulse{ + 0% { + height: 45px; + filter: drop-shadow(0px 0px 1px rgba(0, 0, 0, 0.5)); + } + 50% { + height: 60px; + filter: drop-shadow(0px 5px 20px rgba(0, 0, 0, 0.5)); + } + 100% { + height: 45px; + filter: drop-shadow(0px 0px 1px rgba(0, 0, 0, 0.5)); + } +} + +@keyframes pulseTop{ + 0% { + height: 45px; + filter: 0px 0px 1px rgba(0, 0, 0, 0.5); + } + 50% { + height: 60px; + filter: 0px -5px 20px rgba(0, 0, 0, 0.5); + } + 100% { + height: 45px; + filter: 0px 0px 1px rgba(0, 0, 0, 0.5); + } +} \ No newline at end of file diff --git a/styles/Slide.module.css b/styles/Slide.module.css new file mode 100644 index 0000000..53a4857 --- /dev/null +++ b/styles/Slide.module.css @@ -0,0 +1,15 @@ +.container { + display: flex; + justify-content: center; + align-items: center; + background-color: whitesmoke; +} + +.container img { + max-height: 500px; + max-width: 90%; + margin: 30px 0 40px 0; + user-select: none; + box-shadow: rgb(0 0 0 / 25%) 0 0 20px 0px; + border-radius: 3px; +} \ No newline at end of file diff --git a/styles/SocialLinks.module.css b/styles/SocialLinks.module.css new file mode 100644 index 0000000..3602116 --- /dev/null +++ b/styles/SocialLinks.module.css @@ -0,0 +1,18 @@ +.socials { + display: flex; + justify-content: center; + grid-gap: 20px; +} + +.socials svg { + height: 60px; + width: auto; + fill: var(--primary-foreground); +} + +/* MEDIA QUERIES */ +@media (max-width: 500px){ + .socials svg { + height: 37px; + } +} \ No newline at end of file diff --git a/styles/StackList.module.css b/styles/StackList.module.css new file mode 100644 index 0000000..30e0ccd --- /dev/null +++ b/styles/StackList.module.css @@ -0,0 +1,22 @@ +.list { + display: flex; + gap: 5px; + flex-wrap: wrap; + list-style: none; + padding: 0 20px; +} + +.list li { + padding: 6px 10px; + border-radius: 20px; + background-color: whitesmoke; + display: flex; + justify-content: center; + align-items: center; + gap: 5px; +} + +.list li img { + height: 15px; + border-radius: 2px; +} \ No newline at end of file diff --git a/styles/WelcomeScreen.module.css b/styles/WelcomeScreen.module.css new file mode 100644 index 0000000..41e2e44 --- /dev/null +++ b/styles/WelcomeScreen.module.css @@ -0,0 +1,66 @@ +.container { + flex: 1; + padding-top: 5%; + text-align: center; + box-sizing: border-box; + color: var(--primary-foreground); + min-height: 100vh; +} + +.container h1{ + font-weight: 400; + font-size: 75px; + margin: 0; + text-align: center; +} + +.container h2 { + font-size: 30px; + font-weight: 300; + margin: 25px 30px 30px 30px +} + +.container img{ + margin: auto; + display: block; + width: 50%; + max-width: 300px; +} + +/* MEDIA QUERIES */ +@media (max-width: 1000px){ + + .container { + padding-top: 10%; + margin: 30px; + } + +} + +@media (max-width: 615px){ + + .container h1 { + font-size: 60px; + } + + .container h2 { + font-size: 23px; + } + +} + +@media (max-width: 500px){ + + .container { + padding-top: 15%; + } + + .container h1 { + font-size: 45px; + } + + .container h2 { + font-size: 18px; + margin: 14px 15px 20px 15px; + } +} \ No newline at end of file diff --git a/styles/globals.css b/styles/globals.css new file mode 100644 index 0000000..2283d95 --- /dev/null +++ b/styles/globals.css @@ -0,0 +1,13 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400&family=Varela&display=swap'); + +:root { + --primary-foreground: white; + --primary-background: #E0142F; + /* --secondary-background: #08A9D6; */ + --secondary-background: rgb(35, 35, 42); +} + +body { + font-family: 'Roboto', sans-serif; + margin: 0; +} \ No newline at end of file