├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── public ├── CNAME ├── favicon.ico └── favicon.png ├── src ├── App.vue ├── assets │ ├── images │ │ ├── covid_pic.png │ │ ├── initials.png │ │ ├── portfolio_pic.png │ │ ├── portrait1.jpeg │ │ ├── portrait2.jpeg │ │ ├── portrait3.jpeg │ │ ├── recentportrait.png │ │ ├── sudoku_pic.png │ │ ├── tracksubs_pic.png │ │ ├── trivia_pic.png │ │ ├── version_edtech_pic.png │ │ └── webdevportfolio_pic.png │ └── main.css ├── components │ ├── ExperienceCard.vue │ ├── Navbar.vue │ ├── WorkUnit.vue │ ├── icons │ │ └── bullet_point.svg │ └── transitions │ │ ├── LoadTransition.vue │ │ ├── NavTransition.vue │ │ └── ProjectTransition.vue ├── composables │ └── onIntersect.js ├── icons.js ├── main.js ├── portfolio.js ├── router │ └── index.js └── views │ ├── AboutView.vue │ ├── ContactView.vue │ ├── ExperienceView.vue │ ├── LandingView.vue │ ├── MainView.vue │ ├── SplashView.vue │ └── WorkView.vue ├── tailwind.config.js └── vite.config.js /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | on: 3 | push: 4 | branches: 5 | - main 6 | workflow_dispatch: 7 | 8 | jobs: 9 | build: 10 | name: Build 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout repo 15 | uses: actions/checkout@v3 16 | 17 | - name: Setup Node 18 | uses: actions/setup-node@v3 19 | 20 | - name: Install npm dependencies 21 | run: npm ci --ignore-scripts 22 | 23 | - name: Build project 24 | run: npm run build 25 | 26 | - name: Upload production-ready build files 27 | uses: actions/upload-artifact@v3 28 | with: 29 | name: production-files 30 | path: ./dist 31 | 32 | deploy: 33 | name: Deploy 34 | needs: build 35 | runs-on: ubuntu-latest 36 | if: github.ref == 'refs/heads/main' 37 | 38 | steps: 39 | - name: Download artifact 40 | uses: actions/download-artifact@v3 41 | with: 42 | name: production-files 43 | path: ./dist 44 | 45 | - name: Deploy to GitHub Pages 46 | uses: peaceiris/actions-gh-pages@v3 47 | with: 48 | github_token: ${{ secrets.GITHUB_TOKEN }} 49 | publish_dir: ./dist -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/ 22 | .vscode 23 | .vscode/* 24 | .idea 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw? 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Maxim Shelepov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 💻 Web Developer Portfolio ![Last Commit](https://img.shields.io/github/last-commit/feifykike/webdev_portfolio?color=blueviolet) ![Commit Activity](https://img.shields.io/github/commit-activity/m/feifykike/webdev_portfolio?color=blueviolet) [![License](https://img.shields.io/github/license/feifykike/webdev_portfolio?color=blueviolet)](https://github.com/feifyKike/webdev_portfolio/blob/main/LICENSE) 2 | 3 | ## A modern, clean, & simple to navigate portfolio template for web developers (or any developer)! 4 | 5 | ### Includes Pertinent Sections for any Web Developer Portfolio: 6 | ✔️ Name & Introduction\ 7 | ✔️ About\ 8 | ✔️ Experience\ 9 | ✔️ Projects / Work\ 10 | ✔️ Contact 11 | 12 | To add your own info into the template just alter the [src/portfolio.js](src/portfolio.js) file variables. More customization options will come & be incorporated in the future 🔮. 13 | 14 | If you have any suggestions on what else you want to be customized through the [portfolio.js](src/portfolio.js) file or added / changed in general please feel free to reach out through the hosted page [contact form](https://forms.gle/vhWrKD32i1d2MSZGA) or leave an issue. 15 | 16 | If you would like to contribute to the project take a look at the [Issues](https://github.com/feifyKike/webdev_portfolio/issues). 17 | 18 | Want to add a personal touch to the portfolio? Feel free to open a [pull request](https://github.com/feifyKike/webdev_portfolio/pulls). 19 | 20 | 🙏 I would greatly appreciate proper credit if you do decided to use this portfolio for any of your purposes. Just leaving the footer as is at the bottom of the template **Designed & Created by Maxim Shelepov** would be enough. Thanks. 21 | 22 | ⭐️ Also leave a star if you would like to see the project further develop and be improved. 23 | 24 | ## Table of Contents 25 | - [Getting Started](#getting-started) 26 | - [How to Use](#how-to-use) 27 | - [Customizing Content](#customizing-content) 28 | - [Deployment](#deployment) 29 | - [Technologies Used](#technologies-used) 30 | - [Images and Icons](#images-and-icons) 31 | - [Future](#future) 32 | - [License](#license) 33 | 34 | Check out the [live demo](https://feifykike.github.io/webdev_portfolio/) of the project. 35 | 36 | ## Getting Started 37 | 38 | These instructions will help you get the project up and running on your local machine for your development, testing, & eventual deployment. 39 | 40 | ### Fork the repository (that's it really) 41 | To keep your changes and version of the portfolio under your github and actions [fork this repository](https://github.com/feifyKike/webdev_portfolio/fork). More on forking repositories [here](https://docs.github.com/en/get-started/quickstart/fork-a-repo). 42 | 43 | After creating your fork, you can make all content ([src/portfolio.js](src/portfolio.js)) updates and commits in github without cloning on your machine for local development. To run the deployment of your portfolio site make your first change to and commit (that will trigger the workflow and pages site deployment). 44 | 45 | > 46 | > ℹ️ The following steps in this section describe the setup for local development which is recommended if you want to see your styling (css) and content (js and html) changes instantly without rebuilding the Github Actions site each time. 47 | > 48 | 49 | ### For local development 50 | You will need to install [Git](https://github.com/git-guides/install-git), [Node.js](https://nodejs.org/en/download), & [npm](https://www.npmjs.com/package/npm). 51 | 52 | Using [brew](https://brew.sh) package manager is recommended for mac users. 53 | 54 | #### Clone your forked repository 55 | After installing the global packages from the previous step and copying your forked repo clone url. 56 | ```sh 57 | # Copy the forked remote repository to your local directory (folder) 58 | git clone https://github.com/your-github-username/webdev_portfolio.git # the name of the clone repo should match the forked repo name 59 | 60 | # Navigate into the project folder within your current directory 61 | cd webdev_portfolio 62 | ``` 63 | 64 | #### Install necessary project required packages 65 | ```sh 66 | npm install 67 | ``` 68 | 69 | ## How to Use 70 | Once all is set up, you can start developing by running the vite server and viewing the site from your browser. 71 | ### Compile and Hot-Reload for Development 72 | ```sh 73 | npm run dev 74 | ``` 75 | A `localhost:####/webdev_portfolio` link should appear. Paste into your browser and view. 76 | 77 | ### Making commits, pushing them to your forked remote repository, & syncing changes 78 | To push your local changes to your forked github repository: 79 | ```sh 80 | git add . # add all the changes to the stage 81 | git status # shows all the staged changes 82 | 83 | git commit -m "Updating portfolio.js content." 84 | git push # automatically points to the origin url / target specified in `git remote -v` 85 | ``` 86 | Syncing changes between your forked repository and this repository: 87 | ```sh 88 | git remote add upstream https://github.com/feifykike/webdev_portfolio.git # set a remote url to point to original repository (this one) 89 | git remote -v # shows the set remotes 90 | 91 | # When you want to sync new changes/updates from the original repository 92 | git fetch upstream # fetches changes from this repository 93 | git merge upstream/main # merges changes with your code; conflicts may occur 94 | ``` 95 | 🎉 Now watch and enjoy as the latest commit appears in your remote repo and the automatic deployment begins. For deployment, check out the [Deployment](#deployment) section. 96 | 97 | ## Customizing Content 98 | 99 | To personalize the template site to your content you can: 100 | 1. Populate your own information, appearance settings, & site behavioral setting in [src/portfolio.js](src/portfolio.js). 101 | 2. Change the [index.html](index.html) `` tag to whatever text you want others to see in the browser tab (ex: name, title, etc.). 102 | 3. Add your own `favicon.ico` and `favicon.png` in the [public/](public) folder or **feel free to use the current emoji favicon** (the icon that will appear in the browser tab next to the title). 103 | 4. Optional: Use different global font for the site. You can choose one from [google fonts](https://fonts.google.com) and then replace the import link in the [main.css](src/assets/main.css) file. 104 | 105 | ```javascript 106 | 107 | const greeting = { 108 | intro: "...", 109 | message: "...", 110 | basedLocation: "...", 111 | resumeLink: "...", 112 | logoAbsoluteLink: "...", 113 | portraitAbsoluteLink: "..." 114 | } 115 | 116 | const about = { ... } 117 | 118 | const experiences = { ... } 119 | 120 | const works = { ... } 121 | 122 | // ... 123 | 124 | ``` 125 | 126 | ## Deployment 127 | 128 | ### Deploying on Github Pages 129 | In the *Settings -> Actions -> General -> Workflow Permissions* set the github actions permission to **read & write**. 130 | 131 | The github workflow [deploy.yml](.github/workflows/deploy.yml) file should automatically start the build process for deployment to your github pages url: `https://.github.io/webdev_portfolio/` after you push to the main branch of your remote repository. Enjoy & Good Luck! 132 | 133 | ## Technologies Used 134 | - [Vue.js](https://vuejs.org) 135 | - [Vite.js](https://vitejs.dev) 136 | - [Tailwind.css](https://tailwindcss.com) 137 | 138 | ## Images and Icons 139 | The images in the [src/assets/images/](https://github.com/feifyKike/webdev_portfolio/tree/main/src/assets/images) project folder are meant to serve as placeholders for your own images. Please intend to replace them with your own image assets. 140 | 141 | The project comes pre-equipped with: 142 | - [heroicons](https://heroicons.com) - Offer nice general-purpose icons. 2 icons used in the menu dropdown and 3 icons for project links. 143 | ```html 144 | 147 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webdev_portfolio", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "webdev_portfolio", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@fortawesome/fontawesome-svg-core": "^6.4.0", 12 | "@fortawesome/free-brands-svg-icons": "^6.4.0", 13 | "@fortawesome/vue-fontawesome": "^3.0.3", 14 | "@heroicons/vue": "^2.0.17", 15 | "vue": "^3.2.47", 16 | "vue-router": "^4.1.6" 17 | }, 18 | "devDependencies": { 19 | "@vitejs/plugin-vue": "^4.2.1", 20 | "autoprefixer": "^10.4.14", 21 | "postcss": "^8.4.23", 22 | "tailwindcss": "^3.3.2", 23 | "vite": "^4.3.4" 24 | } 25 | }, 26 | "node_modules/@alloc/quick-lru": { 27 | "version": "5.2.0", 28 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 29 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 30 | "dev": true, 31 | "engines": { 32 | "node": ">=10" 33 | }, 34 | "funding": { 35 | "url": "https://github.com/sponsors/sindresorhus" 36 | } 37 | }, 38 | "node_modules/@babel/parser": { 39 | "version": "7.23.5", 40 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", 41 | "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", 42 | "bin": { 43 | "parser": "bin/babel-parser.js" 44 | }, 45 | "engines": { 46 | "node": ">=6.0.0" 47 | } 48 | }, 49 | "node_modules/@esbuild/android-arm": { 50 | "version": "0.18.20", 51 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 52 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 53 | "cpu": [ 54 | "arm" 55 | ], 56 | "dev": true, 57 | "optional": true, 58 | "os": [ 59 | "android" 60 | ], 61 | "engines": { 62 | "node": ">=12" 63 | } 64 | }, 65 | "node_modules/@esbuild/android-arm64": { 66 | "version": "0.18.20", 67 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 68 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 69 | "cpu": [ 70 | "arm64" 71 | ], 72 | "dev": true, 73 | "optional": true, 74 | "os": [ 75 | "android" 76 | ], 77 | "engines": { 78 | "node": ">=12" 79 | } 80 | }, 81 | "node_modules/@esbuild/android-x64": { 82 | "version": "0.18.20", 83 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 84 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 85 | "cpu": [ 86 | "x64" 87 | ], 88 | "dev": true, 89 | "optional": true, 90 | "os": [ 91 | "android" 92 | ], 93 | "engines": { 94 | "node": ">=12" 95 | } 96 | }, 97 | "node_modules/@esbuild/darwin-arm64": { 98 | "version": "0.18.20", 99 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 100 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 101 | "cpu": [ 102 | "arm64" 103 | ], 104 | "dev": true, 105 | "optional": true, 106 | "os": [ 107 | "darwin" 108 | ], 109 | "engines": { 110 | "node": ">=12" 111 | } 112 | }, 113 | "node_modules/@esbuild/darwin-x64": { 114 | "version": "0.18.20", 115 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 116 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 117 | "cpu": [ 118 | "x64" 119 | ], 120 | "dev": true, 121 | "optional": true, 122 | "os": [ 123 | "darwin" 124 | ], 125 | "engines": { 126 | "node": ">=12" 127 | } 128 | }, 129 | "node_modules/@esbuild/freebsd-arm64": { 130 | "version": "0.18.20", 131 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 132 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 133 | "cpu": [ 134 | "arm64" 135 | ], 136 | "dev": true, 137 | "optional": true, 138 | "os": [ 139 | "freebsd" 140 | ], 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/@esbuild/freebsd-x64": { 146 | "version": "0.18.20", 147 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 148 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 149 | "cpu": [ 150 | "x64" 151 | ], 152 | "dev": true, 153 | "optional": true, 154 | "os": [ 155 | "freebsd" 156 | ], 157 | "engines": { 158 | "node": ">=12" 159 | } 160 | }, 161 | "node_modules/@esbuild/linux-arm": { 162 | "version": "0.18.20", 163 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 164 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 165 | "cpu": [ 166 | "arm" 167 | ], 168 | "dev": true, 169 | "optional": true, 170 | "os": [ 171 | "linux" 172 | ], 173 | "engines": { 174 | "node": ">=12" 175 | } 176 | }, 177 | "node_modules/@esbuild/linux-arm64": { 178 | "version": "0.18.20", 179 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 180 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 181 | "cpu": [ 182 | "arm64" 183 | ], 184 | "dev": true, 185 | "optional": true, 186 | "os": [ 187 | "linux" 188 | ], 189 | "engines": { 190 | "node": ">=12" 191 | } 192 | }, 193 | "node_modules/@esbuild/linux-ia32": { 194 | "version": "0.18.20", 195 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 196 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 197 | "cpu": [ 198 | "ia32" 199 | ], 200 | "dev": true, 201 | "optional": true, 202 | "os": [ 203 | "linux" 204 | ], 205 | "engines": { 206 | "node": ">=12" 207 | } 208 | }, 209 | "node_modules/@esbuild/linux-loong64": { 210 | "version": "0.18.20", 211 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 212 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 213 | "cpu": [ 214 | "loong64" 215 | ], 216 | "dev": true, 217 | "optional": true, 218 | "os": [ 219 | "linux" 220 | ], 221 | "engines": { 222 | "node": ">=12" 223 | } 224 | }, 225 | "node_modules/@esbuild/linux-mips64el": { 226 | "version": "0.18.20", 227 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 228 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 229 | "cpu": [ 230 | "mips64el" 231 | ], 232 | "dev": true, 233 | "optional": true, 234 | "os": [ 235 | "linux" 236 | ], 237 | "engines": { 238 | "node": ">=12" 239 | } 240 | }, 241 | "node_modules/@esbuild/linux-ppc64": { 242 | "version": "0.18.20", 243 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 244 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 245 | "cpu": [ 246 | "ppc64" 247 | ], 248 | "dev": true, 249 | "optional": true, 250 | "os": [ 251 | "linux" 252 | ], 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/@esbuild/linux-riscv64": { 258 | "version": "0.18.20", 259 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 260 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 261 | "cpu": [ 262 | "riscv64" 263 | ], 264 | "dev": true, 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/@esbuild/linux-s390x": { 274 | "version": "0.18.20", 275 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 276 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 277 | "cpu": [ 278 | "s390x" 279 | ], 280 | "dev": true, 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/linux-x64": { 290 | "version": "0.18.20", 291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 292 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 293 | "cpu": [ 294 | "x64" 295 | ], 296 | "dev": true, 297 | "optional": true, 298 | "os": [ 299 | "linux" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/netbsd-x64": { 306 | "version": "0.18.20", 307 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 308 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 309 | "cpu": [ 310 | "x64" 311 | ], 312 | "dev": true, 313 | "optional": true, 314 | "os": [ 315 | "netbsd" 316 | ], 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/@esbuild/openbsd-x64": { 322 | "version": "0.18.20", 323 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 324 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 325 | "cpu": [ 326 | "x64" 327 | ], 328 | "dev": true, 329 | "optional": true, 330 | "os": [ 331 | "openbsd" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/@esbuild/sunos-x64": { 338 | "version": "0.18.20", 339 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 340 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 341 | "cpu": [ 342 | "x64" 343 | ], 344 | "dev": true, 345 | "optional": true, 346 | "os": [ 347 | "sunos" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/@esbuild/win32-arm64": { 354 | "version": "0.18.20", 355 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 356 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 357 | "cpu": [ 358 | "arm64" 359 | ], 360 | "dev": true, 361 | "optional": true, 362 | "os": [ 363 | "win32" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/@esbuild/win32-ia32": { 370 | "version": "0.18.20", 371 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 372 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 373 | "cpu": [ 374 | "ia32" 375 | ], 376 | "dev": true, 377 | "optional": true, 378 | "os": [ 379 | "win32" 380 | ], 381 | "engines": { 382 | "node": ">=12" 383 | } 384 | }, 385 | "node_modules/@esbuild/win32-x64": { 386 | "version": "0.18.20", 387 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 388 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 389 | "cpu": [ 390 | "x64" 391 | ], 392 | "dev": true, 393 | "optional": true, 394 | "os": [ 395 | "win32" 396 | ], 397 | "engines": { 398 | "node": ">=12" 399 | } 400 | }, 401 | "node_modules/@fortawesome/fontawesome-common-types": { 402 | "version": "6.5.1", 403 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", 404 | "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", 405 | "hasInstallScript": true, 406 | "engines": { 407 | "node": ">=6" 408 | } 409 | }, 410 | "node_modules/@fortawesome/fontawesome-svg-core": { 411 | "version": "6.5.1", 412 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", 413 | "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", 414 | "hasInstallScript": true, 415 | "dependencies": { 416 | "@fortawesome/fontawesome-common-types": "6.5.1" 417 | }, 418 | "engines": { 419 | "node": ">=6" 420 | } 421 | }, 422 | "node_modules/@fortawesome/free-brands-svg-icons": { 423 | "version": "6.5.1", 424 | "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", 425 | "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", 426 | "hasInstallScript": true, 427 | "dependencies": { 428 | "@fortawesome/fontawesome-common-types": "6.5.1" 429 | }, 430 | "engines": { 431 | "node": ">=6" 432 | } 433 | }, 434 | "node_modules/@fortawesome/vue-fontawesome": { 435 | "version": "3.0.5", 436 | "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.5.tgz", 437 | "integrity": "sha512-isZZ4+utQH9qg9cWxWYHQ9GwI3r5FeO7GnmzKYV+gbjxcptQhh+F99iZXi1Y9AvFUEgy8kRpAdvDlbb3drWFrw==", 438 | "peerDependencies": { 439 | "@fortawesome/fontawesome-svg-core": "~1 || ~6", 440 | "vue": ">= 3.0.0 < 4" 441 | } 442 | }, 443 | "node_modules/@heroicons/vue": { 444 | "version": "2.0.18", 445 | "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.0.18.tgz", 446 | "integrity": "sha512-BcTC9nq2TkwNSfQuqo96J7ehx4etezypc2YeTq7KsXWxrcrerhkgjLrxGRBnStN0wrXo0Gv4BInybqz5uBG6Cw==", 447 | "peerDependencies": { 448 | "vue": ">= 3" 449 | } 450 | }, 451 | "node_modules/@jridgewell/gen-mapping": { 452 | "version": "0.3.3", 453 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 454 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 455 | "dev": true, 456 | "dependencies": { 457 | "@jridgewell/set-array": "^1.0.1", 458 | "@jridgewell/sourcemap-codec": "^1.4.10", 459 | "@jridgewell/trace-mapping": "^0.3.9" 460 | }, 461 | "engines": { 462 | "node": ">=6.0.0" 463 | } 464 | }, 465 | "node_modules/@jridgewell/resolve-uri": { 466 | "version": "3.1.1", 467 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 468 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 469 | "dev": true, 470 | "engines": { 471 | "node": ">=6.0.0" 472 | } 473 | }, 474 | "node_modules/@jridgewell/set-array": { 475 | "version": "1.1.2", 476 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 477 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 478 | "dev": true, 479 | "engines": { 480 | "node": ">=6.0.0" 481 | } 482 | }, 483 | "node_modules/@jridgewell/sourcemap-codec": { 484 | "version": "1.4.15", 485 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 486 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 487 | }, 488 | "node_modules/@jridgewell/trace-mapping": { 489 | "version": "0.3.20", 490 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", 491 | "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", 492 | "dev": true, 493 | "dependencies": { 494 | "@jridgewell/resolve-uri": "^3.1.0", 495 | "@jridgewell/sourcemap-codec": "^1.4.14" 496 | } 497 | }, 498 | "node_modules/@nodelib/fs.scandir": { 499 | "version": "2.1.5", 500 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 501 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 502 | "dev": true, 503 | "dependencies": { 504 | "@nodelib/fs.stat": "2.0.5", 505 | "run-parallel": "^1.1.9" 506 | }, 507 | "engines": { 508 | "node": ">= 8" 509 | } 510 | }, 511 | "node_modules/@nodelib/fs.stat": { 512 | "version": "2.0.5", 513 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 514 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 515 | "dev": true, 516 | "engines": { 517 | "node": ">= 8" 518 | } 519 | }, 520 | "node_modules/@nodelib/fs.walk": { 521 | "version": "1.2.8", 522 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 523 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 524 | "dev": true, 525 | "dependencies": { 526 | "@nodelib/fs.scandir": "2.1.5", 527 | "fastq": "^1.6.0" 528 | }, 529 | "engines": { 530 | "node": ">= 8" 531 | } 532 | }, 533 | "node_modules/@vitejs/plugin-vue": { 534 | "version": "4.5.0", 535 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz", 536 | "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==", 537 | "dev": true, 538 | "engines": { 539 | "node": "^14.18.0 || >=16.0.0" 540 | }, 541 | "peerDependencies": { 542 | "vite": "^4.0.0 || ^5.0.0", 543 | "vue": "^3.2.25" 544 | } 545 | }, 546 | "node_modules/@vue/compiler-core": { 547 | "version": "3.3.9", 548 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.9.tgz", 549 | "integrity": "sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ==", 550 | "dependencies": { 551 | "@babel/parser": "^7.23.3", 552 | "@vue/shared": "3.3.9", 553 | "estree-walker": "^2.0.2", 554 | "source-map-js": "^1.0.2" 555 | } 556 | }, 557 | "node_modules/@vue/compiler-dom": { 558 | "version": "3.3.9", 559 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.9.tgz", 560 | "integrity": "sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg==", 561 | "dependencies": { 562 | "@vue/compiler-core": "3.3.9", 563 | "@vue/shared": "3.3.9" 564 | } 565 | }, 566 | "node_modules/@vue/compiler-sfc": { 567 | "version": "3.3.9", 568 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.9.tgz", 569 | "integrity": "sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A==", 570 | "dependencies": { 571 | "@babel/parser": "^7.23.3", 572 | "@vue/compiler-core": "3.3.9", 573 | "@vue/compiler-dom": "3.3.9", 574 | "@vue/compiler-ssr": "3.3.9", 575 | "@vue/reactivity-transform": "3.3.9", 576 | "@vue/shared": "3.3.9", 577 | "estree-walker": "^2.0.2", 578 | "magic-string": "^0.30.5", 579 | "postcss": "^8.4.31", 580 | "source-map-js": "^1.0.2" 581 | } 582 | }, 583 | "node_modules/@vue/compiler-ssr": { 584 | "version": "3.3.9", 585 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.9.tgz", 586 | "integrity": "sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g==", 587 | "dependencies": { 588 | "@vue/compiler-dom": "3.3.9", 589 | "@vue/shared": "3.3.9" 590 | } 591 | }, 592 | "node_modules/@vue/devtools-api": { 593 | "version": "6.5.1", 594 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", 595 | "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" 596 | }, 597 | "node_modules/@vue/reactivity": { 598 | "version": "3.3.9", 599 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.9.tgz", 600 | "integrity": "sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw==", 601 | "dependencies": { 602 | "@vue/shared": "3.3.9" 603 | } 604 | }, 605 | "node_modules/@vue/reactivity-transform": { 606 | "version": "3.3.9", 607 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.9.tgz", 608 | "integrity": "sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg==", 609 | "dependencies": { 610 | "@babel/parser": "^7.23.3", 611 | "@vue/compiler-core": "3.3.9", 612 | "@vue/shared": "3.3.9", 613 | "estree-walker": "^2.0.2", 614 | "magic-string": "^0.30.5" 615 | } 616 | }, 617 | "node_modules/@vue/runtime-core": { 618 | "version": "3.3.9", 619 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.9.tgz", 620 | "integrity": "sha512-xxaG9KvPm3GTRuM4ZyU8Tc+pMVzcu6eeoSRQJ9IE7NmCcClW6z4B3Ij6L4EDl80sxe/arTtQ6YmgiO4UZqRc+w==", 621 | "dependencies": { 622 | "@vue/reactivity": "3.3.9", 623 | "@vue/shared": "3.3.9" 624 | } 625 | }, 626 | "node_modules/@vue/runtime-dom": { 627 | "version": "3.3.9", 628 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.9.tgz", 629 | "integrity": "sha512-e7LIfcxYSWbV6BK1wQv9qJyxprC75EvSqF/kQKe6bdZEDNValzeRXEVgiX7AHI6hZ59HA4h7WT5CGvm69vzJTQ==", 630 | "dependencies": { 631 | "@vue/runtime-core": "3.3.9", 632 | "@vue/shared": "3.3.9", 633 | "csstype": "^3.1.2" 634 | } 635 | }, 636 | "node_modules/@vue/server-renderer": { 637 | "version": "3.3.9", 638 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.9.tgz", 639 | "integrity": "sha512-w0zT/s5l3Oa3ZjtLW88eO4uV6AQFqU8X5GOgzq7SkQQu6vVr+8tfm+OI2kDBplS/W/XgCBuFXiPw6T5EdwXP0A==", 640 | "dependencies": { 641 | "@vue/compiler-ssr": "3.3.9", 642 | "@vue/shared": "3.3.9" 643 | }, 644 | "peerDependencies": { 645 | "vue": "3.3.9" 646 | } 647 | }, 648 | "node_modules/@vue/shared": { 649 | "version": "3.3.9", 650 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.9.tgz", 651 | "integrity": "sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA==" 652 | }, 653 | "node_modules/any-promise": { 654 | "version": "1.3.0", 655 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 656 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 657 | "dev": true 658 | }, 659 | "node_modules/anymatch": { 660 | "version": "3.1.3", 661 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 662 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 663 | "dev": true, 664 | "dependencies": { 665 | "normalize-path": "^3.0.0", 666 | "picomatch": "^2.0.4" 667 | }, 668 | "engines": { 669 | "node": ">= 8" 670 | } 671 | }, 672 | "node_modules/arg": { 673 | "version": "5.0.2", 674 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 675 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 676 | "dev": true 677 | }, 678 | "node_modules/autoprefixer": { 679 | "version": "10.4.16", 680 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", 681 | "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", 682 | "dev": true, 683 | "funding": [ 684 | { 685 | "type": "opencollective", 686 | "url": "https://opencollective.com/postcss/" 687 | }, 688 | { 689 | "type": "tidelift", 690 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 691 | }, 692 | { 693 | "type": "github", 694 | "url": "https://github.com/sponsors/ai" 695 | } 696 | ], 697 | "dependencies": { 698 | "browserslist": "^4.21.10", 699 | "caniuse-lite": "^1.0.30001538", 700 | "fraction.js": "^4.3.6", 701 | "normalize-range": "^0.1.2", 702 | "picocolors": "^1.0.0", 703 | "postcss-value-parser": "^4.2.0" 704 | }, 705 | "bin": { 706 | "autoprefixer": "bin/autoprefixer" 707 | }, 708 | "engines": { 709 | "node": "^10 || ^12 || >=14" 710 | }, 711 | "peerDependencies": { 712 | "postcss": "^8.1.0" 713 | } 714 | }, 715 | "node_modules/balanced-match": { 716 | "version": "1.0.2", 717 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 718 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 719 | "dev": true 720 | }, 721 | "node_modules/binary-extensions": { 722 | "version": "2.2.0", 723 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 724 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 725 | "dev": true, 726 | "engines": { 727 | "node": ">=8" 728 | } 729 | }, 730 | "node_modules/brace-expansion": { 731 | "version": "1.1.11", 732 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 733 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 734 | "dev": true, 735 | "dependencies": { 736 | "balanced-match": "^1.0.0", 737 | "concat-map": "0.0.1" 738 | } 739 | }, 740 | "node_modules/braces": { 741 | "version": "3.0.3", 742 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 743 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 744 | "dev": true, 745 | "license": "MIT", 746 | "dependencies": { 747 | "fill-range": "^7.1.1" 748 | }, 749 | "engines": { 750 | "node": ">=8" 751 | } 752 | }, 753 | "node_modules/browserslist": { 754 | "version": "4.22.1", 755 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", 756 | "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", 757 | "dev": true, 758 | "funding": [ 759 | { 760 | "type": "opencollective", 761 | "url": "https://opencollective.com/browserslist" 762 | }, 763 | { 764 | "type": "tidelift", 765 | "url": "https://tidelift.com/funding/github/npm/browserslist" 766 | }, 767 | { 768 | "type": "github", 769 | "url": "https://github.com/sponsors/ai" 770 | } 771 | ], 772 | "dependencies": { 773 | "caniuse-lite": "^1.0.30001541", 774 | "electron-to-chromium": "^1.4.535", 775 | "node-releases": "^2.0.13", 776 | "update-browserslist-db": "^1.0.13" 777 | }, 778 | "bin": { 779 | "browserslist": "cli.js" 780 | }, 781 | "engines": { 782 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 783 | } 784 | }, 785 | "node_modules/camelcase-css": { 786 | "version": "2.0.1", 787 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 788 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 789 | "dev": true, 790 | "engines": { 791 | "node": ">= 6" 792 | } 793 | }, 794 | "node_modules/caniuse-lite": { 795 | "version": "1.0.30001651", 796 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", 797 | "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", 798 | "dev": true, 799 | "funding": [ 800 | { 801 | "type": "opencollective", 802 | "url": "https://opencollective.com/browserslist" 803 | }, 804 | { 805 | "type": "tidelift", 806 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 807 | }, 808 | { 809 | "type": "github", 810 | "url": "https://github.com/sponsors/ai" 811 | } 812 | ], 813 | "license": "CC-BY-4.0" 814 | }, 815 | "node_modules/chokidar": { 816 | "version": "3.5.3", 817 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 818 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 819 | "dev": true, 820 | "funding": [ 821 | { 822 | "type": "individual", 823 | "url": "https://paulmillr.com/funding/" 824 | } 825 | ], 826 | "dependencies": { 827 | "anymatch": "~3.1.2", 828 | "braces": "~3.0.2", 829 | "glob-parent": "~5.1.2", 830 | "is-binary-path": "~2.1.0", 831 | "is-glob": "~4.0.1", 832 | "normalize-path": "~3.0.0", 833 | "readdirp": "~3.6.0" 834 | }, 835 | "engines": { 836 | "node": ">= 8.10.0" 837 | }, 838 | "optionalDependencies": { 839 | "fsevents": "~2.3.2" 840 | } 841 | }, 842 | "node_modules/chokidar/node_modules/glob-parent": { 843 | "version": "5.1.2", 844 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 845 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 846 | "dev": true, 847 | "dependencies": { 848 | "is-glob": "^4.0.1" 849 | }, 850 | "engines": { 851 | "node": ">= 6" 852 | } 853 | }, 854 | "node_modules/commander": { 855 | "version": "4.1.1", 856 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 857 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 858 | "dev": true, 859 | "engines": { 860 | "node": ">= 6" 861 | } 862 | }, 863 | "node_modules/concat-map": { 864 | "version": "0.0.1", 865 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 866 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 867 | "dev": true 868 | }, 869 | "node_modules/cssesc": { 870 | "version": "3.0.0", 871 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 872 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 873 | "dev": true, 874 | "bin": { 875 | "cssesc": "bin/cssesc" 876 | }, 877 | "engines": { 878 | "node": ">=4" 879 | } 880 | }, 881 | "node_modules/csstype": { 882 | "version": "3.1.2", 883 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 884 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" 885 | }, 886 | "node_modules/didyoumean": { 887 | "version": "1.2.2", 888 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 889 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 890 | "dev": true 891 | }, 892 | "node_modules/dlv": { 893 | "version": "1.1.3", 894 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 895 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 896 | "dev": true 897 | }, 898 | "node_modules/electron-to-chromium": { 899 | "version": "1.4.600", 900 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.600.tgz", 901 | "integrity": "sha512-KD6CWjf1BnQG+NsXuyiTDDT1eV13sKuYsOUioXkQweYTQIbgHkXPry9K7M+7cKtYHnSUPitVaLrXYB1jTkkYrw==", 902 | "dev": true 903 | }, 904 | "node_modules/esbuild": { 905 | "version": "0.18.20", 906 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 907 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 908 | "dev": true, 909 | "hasInstallScript": true, 910 | "bin": { 911 | "esbuild": "bin/esbuild" 912 | }, 913 | "engines": { 914 | "node": ">=12" 915 | }, 916 | "optionalDependencies": { 917 | "@esbuild/android-arm": "0.18.20", 918 | "@esbuild/android-arm64": "0.18.20", 919 | "@esbuild/android-x64": "0.18.20", 920 | "@esbuild/darwin-arm64": "0.18.20", 921 | "@esbuild/darwin-x64": "0.18.20", 922 | "@esbuild/freebsd-arm64": "0.18.20", 923 | "@esbuild/freebsd-x64": "0.18.20", 924 | "@esbuild/linux-arm": "0.18.20", 925 | "@esbuild/linux-arm64": "0.18.20", 926 | "@esbuild/linux-ia32": "0.18.20", 927 | "@esbuild/linux-loong64": "0.18.20", 928 | "@esbuild/linux-mips64el": "0.18.20", 929 | "@esbuild/linux-ppc64": "0.18.20", 930 | "@esbuild/linux-riscv64": "0.18.20", 931 | "@esbuild/linux-s390x": "0.18.20", 932 | "@esbuild/linux-x64": "0.18.20", 933 | "@esbuild/netbsd-x64": "0.18.20", 934 | "@esbuild/openbsd-x64": "0.18.20", 935 | "@esbuild/sunos-x64": "0.18.20", 936 | "@esbuild/win32-arm64": "0.18.20", 937 | "@esbuild/win32-ia32": "0.18.20", 938 | "@esbuild/win32-x64": "0.18.20" 939 | } 940 | }, 941 | "node_modules/escalade": { 942 | "version": "3.1.1", 943 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 944 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 945 | "dev": true, 946 | "engines": { 947 | "node": ">=6" 948 | } 949 | }, 950 | "node_modules/estree-walker": { 951 | "version": "2.0.2", 952 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 953 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 954 | }, 955 | "node_modules/fast-glob": { 956 | "version": "3.3.2", 957 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 958 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 959 | "dev": true, 960 | "dependencies": { 961 | "@nodelib/fs.stat": "^2.0.2", 962 | "@nodelib/fs.walk": "^1.2.3", 963 | "glob-parent": "^5.1.2", 964 | "merge2": "^1.3.0", 965 | "micromatch": "^4.0.4" 966 | }, 967 | "engines": { 968 | "node": ">=8.6.0" 969 | } 970 | }, 971 | "node_modules/fast-glob/node_modules/glob-parent": { 972 | "version": "5.1.2", 973 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 974 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 975 | "dev": true, 976 | "dependencies": { 977 | "is-glob": "^4.0.1" 978 | }, 979 | "engines": { 980 | "node": ">= 6" 981 | } 982 | }, 983 | "node_modules/fastq": { 984 | "version": "1.15.0", 985 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 986 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 987 | "dev": true, 988 | "dependencies": { 989 | "reusify": "^1.0.4" 990 | } 991 | }, 992 | "node_modules/fill-range": { 993 | "version": "7.1.1", 994 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 995 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 996 | "dev": true, 997 | "license": "MIT", 998 | "dependencies": { 999 | "to-regex-range": "^5.0.1" 1000 | }, 1001 | "engines": { 1002 | "node": ">=8" 1003 | } 1004 | }, 1005 | "node_modules/fraction.js": { 1006 | "version": "4.3.7", 1007 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 1008 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 1009 | "dev": true, 1010 | "engines": { 1011 | "node": "*" 1012 | }, 1013 | "funding": { 1014 | "type": "patreon", 1015 | "url": "https://github.com/sponsors/rawify" 1016 | } 1017 | }, 1018 | "node_modules/fs.realpath": { 1019 | "version": "1.0.0", 1020 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1021 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1022 | "dev": true 1023 | }, 1024 | "node_modules/fsevents": { 1025 | "version": "2.3.3", 1026 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1027 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1028 | "dev": true, 1029 | "hasInstallScript": true, 1030 | "optional": true, 1031 | "os": [ 1032 | "darwin" 1033 | ], 1034 | "engines": { 1035 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1036 | } 1037 | }, 1038 | "node_modules/function-bind": { 1039 | "version": "1.1.2", 1040 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1041 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1042 | "dev": true, 1043 | "funding": { 1044 | "url": "https://github.com/sponsors/ljharb" 1045 | } 1046 | }, 1047 | "node_modules/glob": { 1048 | "version": "7.1.6", 1049 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1050 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1051 | "dev": true, 1052 | "dependencies": { 1053 | "fs.realpath": "^1.0.0", 1054 | "inflight": "^1.0.4", 1055 | "inherits": "2", 1056 | "minimatch": "^3.0.4", 1057 | "once": "^1.3.0", 1058 | "path-is-absolute": "^1.0.0" 1059 | }, 1060 | "engines": { 1061 | "node": "*" 1062 | }, 1063 | "funding": { 1064 | "url": "https://github.com/sponsors/isaacs" 1065 | } 1066 | }, 1067 | "node_modules/glob-parent": { 1068 | "version": "6.0.2", 1069 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1070 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1071 | "dev": true, 1072 | "dependencies": { 1073 | "is-glob": "^4.0.3" 1074 | }, 1075 | "engines": { 1076 | "node": ">=10.13.0" 1077 | } 1078 | }, 1079 | "node_modules/hasown": { 1080 | "version": "2.0.0", 1081 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 1082 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 1083 | "dev": true, 1084 | "dependencies": { 1085 | "function-bind": "^1.1.2" 1086 | }, 1087 | "engines": { 1088 | "node": ">= 0.4" 1089 | } 1090 | }, 1091 | "node_modules/inflight": { 1092 | "version": "1.0.6", 1093 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1094 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "once": "^1.3.0", 1098 | "wrappy": "1" 1099 | } 1100 | }, 1101 | "node_modules/inherits": { 1102 | "version": "2.0.4", 1103 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1104 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1105 | "dev": true 1106 | }, 1107 | "node_modules/is-binary-path": { 1108 | "version": "2.1.0", 1109 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1110 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1111 | "dev": true, 1112 | "dependencies": { 1113 | "binary-extensions": "^2.0.0" 1114 | }, 1115 | "engines": { 1116 | "node": ">=8" 1117 | } 1118 | }, 1119 | "node_modules/is-core-module": { 1120 | "version": "2.13.1", 1121 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1122 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1123 | "dev": true, 1124 | "dependencies": { 1125 | "hasown": "^2.0.0" 1126 | }, 1127 | "funding": { 1128 | "url": "https://github.com/sponsors/ljharb" 1129 | } 1130 | }, 1131 | "node_modules/is-extglob": { 1132 | "version": "2.1.1", 1133 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1134 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1135 | "dev": true, 1136 | "engines": { 1137 | "node": ">=0.10.0" 1138 | } 1139 | }, 1140 | "node_modules/is-glob": { 1141 | "version": "4.0.3", 1142 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1143 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1144 | "dev": true, 1145 | "dependencies": { 1146 | "is-extglob": "^2.1.1" 1147 | }, 1148 | "engines": { 1149 | "node": ">=0.10.0" 1150 | } 1151 | }, 1152 | "node_modules/is-number": { 1153 | "version": "7.0.0", 1154 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1155 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1156 | "dev": true, 1157 | "license": "MIT", 1158 | "engines": { 1159 | "node": ">=0.12.0" 1160 | } 1161 | }, 1162 | "node_modules/jiti": { 1163 | "version": "1.21.0", 1164 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", 1165 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", 1166 | "dev": true, 1167 | "bin": { 1168 | "jiti": "bin/jiti.js" 1169 | } 1170 | }, 1171 | "node_modules/lilconfig": { 1172 | "version": "2.1.0", 1173 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 1174 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 1175 | "dev": true, 1176 | "engines": { 1177 | "node": ">=10" 1178 | } 1179 | }, 1180 | "node_modules/lines-and-columns": { 1181 | "version": "1.2.4", 1182 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1183 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1184 | "dev": true 1185 | }, 1186 | "node_modules/magic-string": { 1187 | "version": "0.30.5", 1188 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", 1189 | "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", 1190 | "dependencies": { 1191 | "@jridgewell/sourcemap-codec": "^1.4.15" 1192 | }, 1193 | "engines": { 1194 | "node": ">=12" 1195 | } 1196 | }, 1197 | "node_modules/merge2": { 1198 | "version": "1.4.1", 1199 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1200 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1201 | "dev": true, 1202 | "engines": { 1203 | "node": ">= 8" 1204 | } 1205 | }, 1206 | "node_modules/micromatch": { 1207 | "version": "4.0.8", 1208 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1209 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1210 | "dev": true, 1211 | "license": "MIT", 1212 | "dependencies": { 1213 | "braces": "^3.0.3", 1214 | "picomatch": "^2.3.1" 1215 | }, 1216 | "engines": { 1217 | "node": ">=8.6" 1218 | } 1219 | }, 1220 | "node_modules/minimatch": { 1221 | "version": "3.1.2", 1222 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1223 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1224 | "dev": true, 1225 | "dependencies": { 1226 | "brace-expansion": "^1.1.7" 1227 | }, 1228 | "engines": { 1229 | "node": "*" 1230 | } 1231 | }, 1232 | "node_modules/mz": { 1233 | "version": "2.7.0", 1234 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1235 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1236 | "dev": true, 1237 | "dependencies": { 1238 | "any-promise": "^1.0.0", 1239 | "object-assign": "^4.0.1", 1240 | "thenify-all": "^1.0.0" 1241 | } 1242 | }, 1243 | "node_modules/nanoid": { 1244 | "version": "3.3.7", 1245 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1246 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1247 | "funding": [ 1248 | { 1249 | "type": "github", 1250 | "url": "https://github.com/sponsors/ai" 1251 | } 1252 | ], 1253 | "bin": { 1254 | "nanoid": "bin/nanoid.cjs" 1255 | }, 1256 | "engines": { 1257 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1258 | } 1259 | }, 1260 | "node_modules/node-releases": { 1261 | "version": "2.0.13", 1262 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", 1263 | "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", 1264 | "dev": true 1265 | }, 1266 | "node_modules/normalize-path": { 1267 | "version": "3.0.0", 1268 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1269 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1270 | "dev": true, 1271 | "engines": { 1272 | "node": ">=0.10.0" 1273 | } 1274 | }, 1275 | "node_modules/normalize-range": { 1276 | "version": "0.1.2", 1277 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1278 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1279 | "dev": true, 1280 | "engines": { 1281 | "node": ">=0.10.0" 1282 | } 1283 | }, 1284 | "node_modules/object-assign": { 1285 | "version": "4.1.1", 1286 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1287 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1288 | "dev": true, 1289 | "engines": { 1290 | "node": ">=0.10.0" 1291 | } 1292 | }, 1293 | "node_modules/object-hash": { 1294 | "version": "3.0.0", 1295 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1296 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1297 | "dev": true, 1298 | "engines": { 1299 | "node": ">= 6" 1300 | } 1301 | }, 1302 | "node_modules/once": { 1303 | "version": "1.4.0", 1304 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1305 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1306 | "dev": true, 1307 | "dependencies": { 1308 | "wrappy": "1" 1309 | } 1310 | }, 1311 | "node_modules/path-is-absolute": { 1312 | "version": "1.0.1", 1313 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1314 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1315 | "dev": true, 1316 | "engines": { 1317 | "node": ">=0.10.0" 1318 | } 1319 | }, 1320 | "node_modules/path-parse": { 1321 | "version": "1.0.7", 1322 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1323 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1324 | "dev": true 1325 | }, 1326 | "node_modules/picocolors": { 1327 | "version": "1.0.0", 1328 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1329 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1330 | }, 1331 | "node_modules/picomatch": { 1332 | "version": "2.3.1", 1333 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1334 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1335 | "dev": true, 1336 | "engines": { 1337 | "node": ">=8.6" 1338 | }, 1339 | "funding": { 1340 | "url": "https://github.com/sponsors/jonschlinkert" 1341 | } 1342 | }, 1343 | "node_modules/pify": { 1344 | "version": "2.3.0", 1345 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1346 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1347 | "dev": true, 1348 | "engines": { 1349 | "node": ">=0.10.0" 1350 | } 1351 | }, 1352 | "node_modules/pirates": { 1353 | "version": "4.0.6", 1354 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 1355 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 1356 | "dev": true, 1357 | "engines": { 1358 | "node": ">= 6" 1359 | } 1360 | }, 1361 | "node_modules/postcss": { 1362 | "version": "8.4.31", 1363 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 1364 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 1365 | "funding": [ 1366 | { 1367 | "type": "opencollective", 1368 | "url": "https://opencollective.com/postcss/" 1369 | }, 1370 | { 1371 | "type": "tidelift", 1372 | "url": "https://tidelift.com/funding/github/npm/postcss" 1373 | }, 1374 | { 1375 | "type": "github", 1376 | "url": "https://github.com/sponsors/ai" 1377 | } 1378 | ], 1379 | "dependencies": { 1380 | "nanoid": "^3.3.6", 1381 | "picocolors": "^1.0.0", 1382 | "source-map-js": "^1.0.2" 1383 | }, 1384 | "engines": { 1385 | "node": "^10 || ^12 || >=14" 1386 | } 1387 | }, 1388 | "node_modules/postcss-import": { 1389 | "version": "15.1.0", 1390 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 1391 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 1392 | "dev": true, 1393 | "dependencies": { 1394 | "postcss-value-parser": "^4.0.0", 1395 | "read-cache": "^1.0.0", 1396 | "resolve": "^1.1.7" 1397 | }, 1398 | "engines": { 1399 | "node": ">=14.0.0" 1400 | }, 1401 | "peerDependencies": { 1402 | "postcss": "^8.0.0" 1403 | } 1404 | }, 1405 | "node_modules/postcss-js": { 1406 | "version": "4.0.1", 1407 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 1408 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 1409 | "dev": true, 1410 | "dependencies": { 1411 | "camelcase-css": "^2.0.1" 1412 | }, 1413 | "engines": { 1414 | "node": "^12 || ^14 || >= 16" 1415 | }, 1416 | "funding": { 1417 | "type": "opencollective", 1418 | "url": "https://opencollective.com/postcss/" 1419 | }, 1420 | "peerDependencies": { 1421 | "postcss": "^8.4.21" 1422 | } 1423 | }, 1424 | "node_modules/postcss-load-config": { 1425 | "version": "4.0.2", 1426 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 1427 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 1428 | "dev": true, 1429 | "funding": [ 1430 | { 1431 | "type": "opencollective", 1432 | "url": "https://opencollective.com/postcss/" 1433 | }, 1434 | { 1435 | "type": "github", 1436 | "url": "https://github.com/sponsors/ai" 1437 | } 1438 | ], 1439 | "dependencies": { 1440 | "lilconfig": "^3.0.0", 1441 | "yaml": "^2.3.4" 1442 | }, 1443 | "engines": { 1444 | "node": ">= 14" 1445 | }, 1446 | "peerDependencies": { 1447 | "postcss": ">=8.0.9", 1448 | "ts-node": ">=9.0.0" 1449 | }, 1450 | "peerDependenciesMeta": { 1451 | "postcss": { 1452 | "optional": true 1453 | }, 1454 | "ts-node": { 1455 | "optional": true 1456 | } 1457 | } 1458 | }, 1459 | "node_modules/postcss-load-config/node_modules/lilconfig": { 1460 | "version": "3.0.0", 1461 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", 1462 | "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", 1463 | "dev": true, 1464 | "engines": { 1465 | "node": ">=14" 1466 | } 1467 | }, 1468 | "node_modules/postcss-nested": { 1469 | "version": "6.0.1", 1470 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", 1471 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", 1472 | "dev": true, 1473 | "dependencies": { 1474 | "postcss-selector-parser": "^6.0.11" 1475 | }, 1476 | "engines": { 1477 | "node": ">=12.0" 1478 | }, 1479 | "funding": { 1480 | "type": "opencollective", 1481 | "url": "https://opencollective.com/postcss/" 1482 | }, 1483 | "peerDependencies": { 1484 | "postcss": "^8.2.14" 1485 | } 1486 | }, 1487 | "node_modules/postcss-selector-parser": { 1488 | "version": "6.0.13", 1489 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", 1490 | "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", 1491 | "dev": true, 1492 | "dependencies": { 1493 | "cssesc": "^3.0.0", 1494 | "util-deprecate": "^1.0.2" 1495 | }, 1496 | "engines": { 1497 | "node": ">=4" 1498 | } 1499 | }, 1500 | "node_modules/postcss-value-parser": { 1501 | "version": "4.2.0", 1502 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1503 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1504 | "dev": true 1505 | }, 1506 | "node_modules/queue-microtask": { 1507 | "version": "1.2.3", 1508 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1509 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1510 | "dev": true, 1511 | "funding": [ 1512 | { 1513 | "type": "github", 1514 | "url": "https://github.com/sponsors/feross" 1515 | }, 1516 | { 1517 | "type": "patreon", 1518 | "url": "https://www.patreon.com/feross" 1519 | }, 1520 | { 1521 | "type": "consulting", 1522 | "url": "https://feross.org/support" 1523 | } 1524 | ] 1525 | }, 1526 | "node_modules/read-cache": { 1527 | "version": "1.0.0", 1528 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1529 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "pify": "^2.3.0" 1533 | } 1534 | }, 1535 | "node_modules/readdirp": { 1536 | "version": "3.6.0", 1537 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1538 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1539 | "dev": true, 1540 | "dependencies": { 1541 | "picomatch": "^2.2.1" 1542 | }, 1543 | "engines": { 1544 | "node": ">=8.10.0" 1545 | } 1546 | }, 1547 | "node_modules/resolve": { 1548 | "version": "1.22.8", 1549 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1550 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1551 | "dev": true, 1552 | "dependencies": { 1553 | "is-core-module": "^2.13.0", 1554 | "path-parse": "^1.0.7", 1555 | "supports-preserve-symlinks-flag": "^1.0.0" 1556 | }, 1557 | "bin": { 1558 | "resolve": "bin/resolve" 1559 | }, 1560 | "funding": { 1561 | "url": "https://github.com/sponsors/ljharb" 1562 | } 1563 | }, 1564 | "node_modules/reusify": { 1565 | "version": "1.0.4", 1566 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1567 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1568 | "dev": true, 1569 | "engines": { 1570 | "iojs": ">=1.0.0", 1571 | "node": ">=0.10.0" 1572 | } 1573 | }, 1574 | "node_modules/rollup": { 1575 | "version": "3.29.5", 1576 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", 1577 | "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", 1578 | "dev": true, 1579 | "license": "MIT", 1580 | "bin": { 1581 | "rollup": "dist/bin/rollup" 1582 | }, 1583 | "engines": { 1584 | "node": ">=14.18.0", 1585 | "npm": ">=8.0.0" 1586 | }, 1587 | "optionalDependencies": { 1588 | "fsevents": "~2.3.2" 1589 | } 1590 | }, 1591 | "node_modules/run-parallel": { 1592 | "version": "1.2.0", 1593 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1594 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1595 | "dev": true, 1596 | "funding": [ 1597 | { 1598 | "type": "github", 1599 | "url": "https://github.com/sponsors/feross" 1600 | }, 1601 | { 1602 | "type": "patreon", 1603 | "url": "https://www.patreon.com/feross" 1604 | }, 1605 | { 1606 | "type": "consulting", 1607 | "url": "https://feross.org/support" 1608 | } 1609 | ], 1610 | "dependencies": { 1611 | "queue-microtask": "^1.2.2" 1612 | } 1613 | }, 1614 | "node_modules/source-map-js": { 1615 | "version": "1.0.2", 1616 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1617 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1618 | "engines": { 1619 | "node": ">=0.10.0" 1620 | } 1621 | }, 1622 | "node_modules/sucrase": { 1623 | "version": "3.34.0", 1624 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", 1625 | "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", 1626 | "dev": true, 1627 | "dependencies": { 1628 | "@jridgewell/gen-mapping": "^0.3.2", 1629 | "commander": "^4.0.0", 1630 | "glob": "7.1.6", 1631 | "lines-and-columns": "^1.1.6", 1632 | "mz": "^2.7.0", 1633 | "pirates": "^4.0.1", 1634 | "ts-interface-checker": "^0.1.9" 1635 | }, 1636 | "bin": { 1637 | "sucrase": "bin/sucrase", 1638 | "sucrase-node": "bin/sucrase-node" 1639 | }, 1640 | "engines": { 1641 | "node": ">=8" 1642 | } 1643 | }, 1644 | "node_modules/supports-preserve-symlinks-flag": { 1645 | "version": "1.0.0", 1646 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1647 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1648 | "dev": true, 1649 | "engines": { 1650 | "node": ">= 0.4" 1651 | }, 1652 | "funding": { 1653 | "url": "https://github.com/sponsors/ljharb" 1654 | } 1655 | }, 1656 | "node_modules/tailwindcss": { 1657 | "version": "3.3.5", 1658 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", 1659 | "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", 1660 | "dev": true, 1661 | "dependencies": { 1662 | "@alloc/quick-lru": "^5.2.0", 1663 | "arg": "^5.0.2", 1664 | "chokidar": "^3.5.3", 1665 | "didyoumean": "^1.2.2", 1666 | "dlv": "^1.1.3", 1667 | "fast-glob": "^3.3.0", 1668 | "glob-parent": "^6.0.2", 1669 | "is-glob": "^4.0.3", 1670 | "jiti": "^1.19.1", 1671 | "lilconfig": "^2.1.0", 1672 | "micromatch": "^4.0.5", 1673 | "normalize-path": "^3.0.0", 1674 | "object-hash": "^3.0.0", 1675 | "picocolors": "^1.0.0", 1676 | "postcss": "^8.4.23", 1677 | "postcss-import": "^15.1.0", 1678 | "postcss-js": "^4.0.1", 1679 | "postcss-load-config": "^4.0.1", 1680 | "postcss-nested": "^6.0.1", 1681 | "postcss-selector-parser": "^6.0.11", 1682 | "resolve": "^1.22.2", 1683 | "sucrase": "^3.32.0" 1684 | }, 1685 | "bin": { 1686 | "tailwind": "lib/cli.js", 1687 | "tailwindcss": "lib/cli.js" 1688 | }, 1689 | "engines": { 1690 | "node": ">=14.0.0" 1691 | } 1692 | }, 1693 | "node_modules/thenify": { 1694 | "version": "3.3.1", 1695 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1696 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1697 | "dev": true, 1698 | "dependencies": { 1699 | "any-promise": "^1.0.0" 1700 | } 1701 | }, 1702 | "node_modules/thenify-all": { 1703 | "version": "1.6.0", 1704 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1705 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 1706 | "dev": true, 1707 | "dependencies": { 1708 | "thenify": ">= 3.1.0 < 4" 1709 | }, 1710 | "engines": { 1711 | "node": ">=0.8" 1712 | } 1713 | }, 1714 | "node_modules/to-regex-range": { 1715 | "version": "5.0.1", 1716 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1717 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1718 | "dev": true, 1719 | "license": "MIT", 1720 | "dependencies": { 1721 | "is-number": "^7.0.0" 1722 | }, 1723 | "engines": { 1724 | "node": ">=8.0" 1725 | } 1726 | }, 1727 | "node_modules/ts-interface-checker": { 1728 | "version": "0.1.13", 1729 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 1730 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 1731 | "dev": true 1732 | }, 1733 | "node_modules/update-browserslist-db": { 1734 | "version": "1.0.13", 1735 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 1736 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 1737 | "dev": true, 1738 | "funding": [ 1739 | { 1740 | "type": "opencollective", 1741 | "url": "https://opencollective.com/browserslist" 1742 | }, 1743 | { 1744 | "type": "tidelift", 1745 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1746 | }, 1747 | { 1748 | "type": "github", 1749 | "url": "https://github.com/sponsors/ai" 1750 | } 1751 | ], 1752 | "dependencies": { 1753 | "escalade": "^3.1.1", 1754 | "picocolors": "^1.0.0" 1755 | }, 1756 | "bin": { 1757 | "update-browserslist-db": "cli.js" 1758 | }, 1759 | "peerDependencies": { 1760 | "browserslist": ">= 4.21.0" 1761 | } 1762 | }, 1763 | "node_modules/util-deprecate": { 1764 | "version": "1.0.2", 1765 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1766 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1767 | "dev": true 1768 | }, 1769 | "node_modules/vite": { 1770 | "version": "4.5.5", 1771 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", 1772 | "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", 1773 | "dev": true, 1774 | "license": "MIT", 1775 | "dependencies": { 1776 | "esbuild": "^0.18.10", 1777 | "postcss": "^8.4.27", 1778 | "rollup": "^3.27.1" 1779 | }, 1780 | "bin": { 1781 | "vite": "bin/vite.js" 1782 | }, 1783 | "engines": { 1784 | "node": "^14.18.0 || >=16.0.0" 1785 | }, 1786 | "funding": { 1787 | "url": "https://github.com/vitejs/vite?sponsor=1" 1788 | }, 1789 | "optionalDependencies": { 1790 | "fsevents": "~2.3.2" 1791 | }, 1792 | "peerDependencies": { 1793 | "@types/node": ">= 14", 1794 | "less": "*", 1795 | "lightningcss": "^1.21.0", 1796 | "sass": "*", 1797 | "stylus": "*", 1798 | "sugarss": "*", 1799 | "terser": "^5.4.0" 1800 | }, 1801 | "peerDependenciesMeta": { 1802 | "@types/node": { 1803 | "optional": true 1804 | }, 1805 | "less": { 1806 | "optional": true 1807 | }, 1808 | "lightningcss": { 1809 | "optional": true 1810 | }, 1811 | "sass": { 1812 | "optional": true 1813 | }, 1814 | "stylus": { 1815 | "optional": true 1816 | }, 1817 | "sugarss": { 1818 | "optional": true 1819 | }, 1820 | "terser": { 1821 | "optional": true 1822 | } 1823 | } 1824 | }, 1825 | "node_modules/vue": { 1826 | "version": "3.3.9", 1827 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.9.tgz", 1828 | "integrity": "sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==", 1829 | "dependencies": { 1830 | "@vue/compiler-dom": "3.3.9", 1831 | "@vue/compiler-sfc": "3.3.9", 1832 | "@vue/runtime-dom": "3.3.9", 1833 | "@vue/server-renderer": "3.3.9", 1834 | "@vue/shared": "3.3.9" 1835 | }, 1836 | "peerDependencies": { 1837 | "typescript": "*" 1838 | }, 1839 | "peerDependenciesMeta": { 1840 | "typescript": { 1841 | "optional": true 1842 | } 1843 | } 1844 | }, 1845 | "node_modules/vue-router": { 1846 | "version": "4.2.5", 1847 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", 1848 | "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", 1849 | "dependencies": { 1850 | "@vue/devtools-api": "^6.5.0" 1851 | }, 1852 | "funding": { 1853 | "url": "https://github.com/sponsors/posva" 1854 | }, 1855 | "peerDependencies": { 1856 | "vue": "^3.2.0" 1857 | } 1858 | }, 1859 | "node_modules/wrappy": { 1860 | "version": "1.0.2", 1861 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1862 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1863 | "dev": true 1864 | }, 1865 | "node_modules/yaml": { 1866 | "version": "2.3.4", 1867 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", 1868 | "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", 1869 | "dev": true, 1870 | "engines": { 1871 | "node": ">= 14" 1872 | } 1873 | } 1874 | } 1875 | } 1876 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webdev_portfolio", 3 | "homepage": ".", 4 | "version": "0.0.0", 5 | "type": "module", 6 | "private": true, 7 | "scripts": { 8 | "dev": "vite", 9 | "build": "vite build", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@fortawesome/fontawesome-svg-core": "^6.4.0", 14 | "@fortawesome/free-brands-svg-icons": "^6.4.0", 15 | "@fortawesome/vue-fontawesome": "^3.0.3", 16 | "@heroicons/vue": "^2.0.17", 17 | "vue": "^3.2.47", 18 | "vue-router": "^4.1.6" 19 | }, 20 | "devDependencies": { 21 | "@vitejs/plugin-vue": "^4.2.1", 22 | "autoprefixer": "^10.4.14", 23 | "postcss": "^8.4.23", 24 | "tailwindcss": "^3.3.2", 25 | "vite": "^4.3.4" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/CNAME: -------------------------------------------------------------------------------- 1 | maxshelepov.com -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/public/favicon.ico -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/public/favicon.png -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /src/assets/images/covid_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/covid_pic.png -------------------------------------------------------------------------------- /src/assets/images/initials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/initials.png -------------------------------------------------------------------------------- /src/assets/images/portfolio_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/portfolio_pic.png -------------------------------------------------------------------------------- /src/assets/images/portrait1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/portrait1.jpeg -------------------------------------------------------------------------------- /src/assets/images/portrait2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/portrait2.jpeg -------------------------------------------------------------------------------- /src/assets/images/portrait3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/portrait3.jpeg -------------------------------------------------------------------------------- /src/assets/images/recentportrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/recentportrait.png -------------------------------------------------------------------------------- /src/assets/images/sudoku_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/sudoku_pic.png -------------------------------------------------------------------------------- /src/assets/images/tracksubs_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/tracksubs_pic.png -------------------------------------------------------------------------------- /src/assets/images/trivia_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/trivia_pic.png -------------------------------------------------------------------------------- /src/assets/images/version_edtech_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/version_edtech_pic.png -------------------------------------------------------------------------------- /src/assets/images/webdevportfolio_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/feifyKike/webdev_portfolio/59a08d4e69f060fdd49b51536c37e971ff556d8c/src/assets/images/webdevportfolio_pic.png -------------------------------------------------------------------------------- /src/assets/main.css: -------------------------------------------------------------------------------- 1 | /* replace with your own fonts if need be */ 2 | @import url('https://fonts.googleapis.com/css2?family=Reenie+Beanie&family=Source+Code+Pro'); 3 | 4 | @tailwind base; 5 | @tailwind components; 6 | @tailwind utilities; 7 | 8 | #app { 9 | font-family: 'Source Code Pro', monospace; /* update if importing a different font than the one above */ 10 | font-size: 16px; /* update if needed (16px is the standard for modern browsers) */ 11 | height: 100%; 12 | margin: 0; 13 | width: 100%; 14 | scroll-behavior: smooth; 15 | } 16 | 17 | /* Custom HTML & CSS Logo */ 18 | #custom-logo { 19 | font-family: 'Reenie Beanie', cursive; 20 | } 21 | 22 | /* Mobile Behavior */ 23 | html { 24 | -webkit-tap-highlight-color: transparent; 25 | } 26 | 27 | /* Dark Mode */ 28 | @media (prefers-color-scheme: dark) { 29 | html { 30 | background-color: rgb(15, 23, 42); 31 | } 32 | } -------------------------------------------------------------------------------- /src/components/ExperienceCard.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 98 | 99 | -------------------------------------------------------------------------------- /src/components/WorkUnit.vue: -------------------------------------------------------------------------------- 1 | 43 | -------------------------------------------------------------------------------- /src/components/icons/bullet_point.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/components/transitions/LoadTransition.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/components/transitions/NavTransition.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/components/transitions/ProjectTransition.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/composables/onIntersect.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @function onIntersect 3 | * @param {HTMLElement} elementToWatch elementToWatch 4 | * @param {Boolean} once if true only run once 5 | * @param {Object} options Intersection Observer API options 6 | * @return {type} Ref 7 | */ 8 | import { ref, onMounted, onUnmounted } from 'vue'; 9 | 10 | export const onIntersect = (elementToWatch, once = true, options = { threshold: 0.15 }) => { 11 | // toggleable visibility 12 | const visible = ref(false) 13 | 14 | // Initiate the observer 15 | const observer = new IntersectionObserver(([entry]) => { 16 | // If the element to watch is intersecting within the threshold 17 | if (entry && entry.isIntersecting) { 18 | // set to visible 19 | visible.value = true 20 | 21 | // If should only run once, unobserve the element 22 | if (once) { 23 | observer.unobserve(entry.target); 24 | } 25 | } 26 | 27 | // If the element is not intersecting, run visibility off 28 | else { 29 | visible.value = false 30 | } 31 | }, options); 32 | 33 | // Hook into components onMounted and onUnmounted states for setup and cleanup 34 | onMounted(() => observer.observe(elementToWatch.value)) 35 | onUnmounted(() => observer.disconnect()) 36 | 37 | return visible; 38 | }; 39 | 40 | // Credit: Megan Valcour & Tim Spears - https://www.imarc.com/blog/adding-intersection-observer-to-your-vue-animation -------------------------------------------------------------------------------- /src/icons.js: -------------------------------------------------------------------------------- 1 | /* import the fontawesome core */ 2 | import { library } from '@fortawesome/fontawesome-svg-core' 3 | 4 | /* 5 | import specific icons (Replace or add any other brand icons you need in here) 6 | Check out the official fontawesome page for all the available icons: https://fontawesome.com/search?o=r&m=free&f=brands 7 | */ 8 | /* import icons first */ 9 | import { 10 | faGithub, 11 | faLinkedin, 12 | faMedium, 13 | faStackOverflow, 14 | faXTwitter 15 | } from '@fortawesome/free-brands-svg-icons' 16 | 17 | /* add icons to the library */ 18 | library.add( 19 | faGithub, 20 | faLinkedin, 21 | faMedium, 22 | faStackOverflow, 23 | faXTwitter 24 | ) 25 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import './assets/main.css' 2 | 3 | import { createApp } from 'vue' 4 | import App from './App.vue' 5 | import router from './router' 6 | 7 | const app = createApp(App) 8 | 9 | app.use(router) 10 | 11 | import './icons' 12 | import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // configuring fontawesome icons 13 | app.component('font-awesome-icon', FontAwesomeIcon) // creating fontawesome component 14 | 15 | app.mount('#app') 16 | -------------------------------------------------------------------------------- /src/portfolio.js: -------------------------------------------------------------------------------- 1 | // --- 🎨 Site Styling --- 2 | 3 | // Colors (recommendation: choose a color suitable for dark and light modes) 4 | // Should be inputted as a hex value. Use https://g.co/kgs/XCcs7T for choosing colors with hex. 5 | const colors = { 6 | buttonColor: "#4305ba", 7 | LinkHighlightColor: "#4305ba" 8 | } 9 | 10 | // Transitions 11 | const transitions = { 12 | active: true, // activate for all sections 13 | onlyLanding: false, // activate only for initial load of landing page 14 | showOnce: true, // transition only once 15 | thresholdOption: 0.2 // indicates at what percentage of the sections visibility the transition should start 16 | } 17 | 18 | // Splash Screen 19 | const splashScreen = true // recommended: for best behavior after refresh 20 | 21 | // --- 👋 Greeting Section --- 22 | const greeting = { 23 | intro: "Hello 👋, my name is", 24 | name: "Maxim Shelepov", 25 | message: "I'm a computer science senior with hefty experience in app development. Previously worked as a web developer at my university, where I built tools to support both students and educators. Currently, I'm developing an educational AI tool aimed at redefining how college students interact with AI.", 26 | basedLocation: "Raleigh, NC", 27 | resumeLink: "https://drive.google.com/file/d/1BEiPuAOCQPWc1RVN5Bn_7KyxhR0HL_bv/view?usp=sharing", // recommended: google drive file share link (change to "anyone on the internet can view") 28 | logo: { 29 | link: "images/initials.png", // use relative path from parent directory -> ex: images/image.ext 30 | custom: true // takes precedence over image logo and allows for custom HTML logo (./components/Navbar.vue) 31 | }, 32 | portraitLink: 'images/recentportrait.png' 33 | } 34 | 35 | const socialMediaLinks = { 36 | github: "https://github.com/feifyKike", 37 | linkedin: "https://www.linkedin.com/in/maxim-shelepov1", 38 | medium: "https://medium.com/@mimaishel", 39 | stackoverflow: "", 40 | xtwitter: "https://twitter.com/mimaishel" 41 | } // to add any additional social media links check out the README.md or src/icons.js file 42 | 43 | // --- 😎 About Section --- 44 | const about = { 45 | autobiography: [ 46 | "My name is Maxim Shelepov and I'm a computer science senior at North Carolina State University. I have a knack for solving problems and creating impactful software solutions. Through personal studies in high school, I built my first every full-stack personal website maximshelepov.com. While in college, I worked as a web developer for my university's IT team, gaining extensive experience in industry-grade software and advanced app development practices.", 47 | "Nowadays you can find me doing CS coursework (😅) or developing an app to tackle the next big challenge." 48 | ], // Separated items are paragraphs 49 | techStack: [ 50 | "PHP", 51 | "Python", 52 | "JavaScript", 53 | "Vue.js", 54 | "MySQL", 55 | "Swift" 56 | ], 57 | photo1Link: "images/portrait1.jpeg", 58 | photo2Link: "images/portrait2.jpeg", 59 | photo3Link: "images/portrait3.jpeg" 60 | } 61 | 62 | // --- 🛡️ Experience Section --- 63 | const experiences = [ 64 | { 65 | position: "Web Dev Intern", 66 | company: { 67 | name: "WolfTech", 68 | link: "https://tools.wolftech.ncsu.edu/support/index.php/WolfTech_Information_Technology" 69 | }, 70 | duration: "Aug 2022 - Aug 2024", 71 | bulletPoints: [ 72 | "Supported the development and maintenance of university web applications over two years, improving user experience and developer efficiency using PHP, Laravel, SQL, Docker, and Vue.js.", 73 | "Made 350+ contributions to code repositories, including developing tools for email automation, research discovery, and AI-driven news sharing, which reduced operational time and led to higher user adoption.", 74 | "Laid the groundwork for the modernized campus digital signage system and management application which supports 360 digital signs and 50 different organizations on campus." 75 | ], 76 | hashtags: [ 77 | "Laravel", 78 | "PHP", 79 | "MySQL", 80 | "JS", 81 | "Vue.js", 82 | "HTML", 83 | "Tailwind" 84 | ] 85 | }, 86 | { 87 | position: "Math Tutor", 88 | company: { 89 | name: "Mathnasium", 90 | link: "https://www.mathnasium.com" 91 | }, 92 | duration: "Jan 2022 - Aug 2022", 93 | bulletPoints: [ 94 | "Provided math tutoring to students from elementary through high school, covering a range of topics from basic algebra to college-level calculus, using personalized teaching strategies.", 95 | "Designed and directed individualized learning plans, tailoring math topics evaluation to enhance understanding and improve performance in their school math classes." 96 | ], 97 | hashtags: [ 98 | "Calc 1-2", 99 | "Algebra 1-3", 100 | "Discrete Math", 101 | "Statistics" 102 | ] 103 | } 104 | ] 105 | 106 | // --- 💻 Work Section --- 107 | const works = [ 108 | { 109 | projectName: "EdTech AI Tool", 110 | yearCompleted: "2024", 111 | description: "Developed an educational tool in collaboration with a peer, to rethink the college student and AI interaction. With a core principle to enhance learning and personal growth. Responsible for UI, UX, and DB management with ongoing goal to complete version 1.0 in December 2024.", 112 | techStack: "Python, Vue.js", 113 | links: [ 114 | // { 115 | // label: "", 116 | // type: "git", 117 | // url: "#" 118 | // }, 119 | // { 120 | // label: "", 121 | // type: "external", 122 | // url: "#" 123 | // } 124 | ], 125 | imageLink: "images/version_edtech_pic.png", 126 | alignLeft: false 127 | }, 128 | { 129 | projectName: "Open-Source Developer Portfolio", 130 | yearCompleted: "2023", 131 | description: "Designed and developed an open-sourced single page application template to help web developers create visually appealing personal portfolios, focusing on ease of use and customization. Built with Vue.js, JS, HTML, Tailwind CSS, the project achieved 27 stars and 14 forks on GitHub.", 132 | techStack: "Vue.js, JS, HTML, Tailwind.css", 133 | links: [ 134 | { 135 | label: "", 136 | type: "git", 137 | url: "https://github.com/feifyKike/webdev_portfolio" 138 | }, 139 | { 140 | label: "", 141 | type: "external", 142 | url: "https://feifykike.github.io/webdev_portfolio" 143 | } 144 | ], 145 | imageLink: "images/webdevportfolio_pic.png", 146 | alignLeft: true 147 | }, 148 | { 149 | projectName: "TrackYourSubs IOS App", 150 | yearCompleted: "2022", 151 | description: "An IOS app to track you subscriptions and expenses, all the while presenting in a clean and professional look with a load of features. Some of the more evident features are: Budgeting (monthly / yearly option available), Current monthly & yearly total expense at a glance, Custom suggestions to meet budget, Organize (Categorization & Importance) and filter through subscriptions, Reminders via scheduled notifications, Stats page: pie chart visual, bar chart visual, and streak indicator.", 152 | techStack: "Swift, SwiftUI", 153 | links: [ 154 | { 155 | label: "", 156 | type: "git", 157 | url: "https://github.com/feifyKike/TrackYourSubsDemo/" 158 | }, 159 | { 160 | label: "", 161 | type: "external", 162 | url: "https://youtu.be/KsTx-F70OOk" 163 | } 164 | ], 165 | imageLink: "images/tracksubs_pic.png", 166 | alignLeft: false 167 | }, 168 | { 169 | projectName: "Personal Portfolio App", 170 | yearCompleted: "2021", 171 | description: "Built a dynamic, live-editable personal portfolio website with an admin dashboard for real-time updates. Developed using Django (Python) for the backend, and HTML, CSS, and JavaScript for the frontend, following the MVC architecture, which enhanced my full-stack development skills.", 172 | techStack: "Django, Python, HTML, CSS, Bootstrap4, JS", 173 | links: [ 174 | { 175 | label: "", 176 | type: "external", 177 | url: "https://site--maximshelepov--6tkhqqjrq9c5.code.run" 178 | } 179 | ], 180 | imageLink: "images/portfolio_pic.png", 181 | alignLeft: true 182 | }, 183 | // { 184 | // projectName: "Sudoku Game & Solver", 185 | // yearCompleted: "2021", 186 | // description: "Built a Sudoku game UI incorporating the Java Swing library. Randomly generates a Sudoku puzzle and solves itself using the backtracking algorithm written in Java..", 187 | // techStack: "Java", 188 | // links: [ 189 | // { 190 | // label: "", 191 | // type: "git", 192 | // url: "https://github.com/feifyKike/sudokusolver" 193 | // }, 194 | // { 195 | // label: "", 196 | // type: "external", 197 | // url: "https://youtu.be/lXOjOrjf5hU" 198 | // } 199 | // ], 200 | // imageLink: "images/sudoku_pic.png", 201 | // alignLeft: false 202 | // }, 203 | // { 204 | // projectName: "Trivia Quiz", 205 | // yearCompleted: "2020", 206 | // description: "Interested in taking a fun and interactive pop quiz? Using the HTML, CSS3, JavaScript, and jQuery I created a quiz that can be taken on numerous topics of your choice and gives instant feedback. The entire project is built mostly on JavaScript and all the functionality and events are controlled through functions such as ReadDisplay and Validate. The HTML portion of the online quiz only serves as the skeleton and template for elements that will be created via JS.", 207 | // techStack: "JS, HTML, CSS", 208 | // links: [ 209 | // { 210 | // label: "", 211 | // type: "git", 212 | // url: "https://github.com/feifyKike/JS-API-Quiz" 213 | // }, 214 | // { 215 | // label: "", 216 | // type: "external", 217 | // url: "https://codepen.io/Max_the_coder/pen/yLXZOYL" //https://codepen.io/Max_the_coder/pen/yLXZOYL 218 | // } 219 | // ], 220 | // imageLink: "images/trivia_pic.png", 221 | // alignLeft: true 222 | // }, 223 | // { 224 | // projectName: "Coronavirus Report", 225 | // yearCompleted: "2020", 226 | // description: "Created a program that displays up-to-date COVID-19 data and shows results in a graphical / visual representation. Coded with the Python programming language and libraries such as Matplotlib, Requests, and CSV.", 227 | // techStack: "Python", 228 | // links: [ 229 | // { 230 | // label: "", 231 | // type: "git", 232 | // url: "https://youtu.be/gw5kb1QKVp0" 233 | // }, 234 | // { 235 | // label: "", 236 | // type: "external", 237 | // url: "https://github.com/feifyKike/Covid-Cases-Visual" 238 | // } 239 | // ], 240 | // imageLink: "images/covid_pic.png", 241 | // alignLeft: false 242 | // } 243 | ] 244 | 245 | const archiveLink = "https://github.com/feifyKike?tab=repositories" 246 | 247 | // --- 📭 Contact Section --- 248 | // 2 Options available - Choose 1 249 | const contact = { 250 | externalLink: { 251 | shortTitle: "Get in Touch", 252 | note: [ 253 | "Actively seeking full-time software development positions as a May 2025 graduate.", 254 | ], // paragraph breaks will be entered after each item, 255 | link: { 256 | email: "mimaishel@gmail.com", // email takes precedance 257 | other: "https://forms.gle/W3MswTKsPWMxEbn58" 258 | }, 259 | responseTimeMessage: "" 260 | }, 261 | formEmbedLink: "" // inclusion of this link will take precedance 262 | } 263 | 264 | export default { 265 | colors, 266 | transitions, 267 | splashScreen, 268 | greeting, 269 | socialMediaLinks, 270 | about, 271 | experiences, 272 | works, 273 | archiveLink, 274 | contact 275 | } -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import MainView from '../views/MainView.vue' 3 | 4 | const router = createRouter({ 5 | history: createWebHistory(import.meta.env.BASE_URL), 6 | routes: [ 7 | { 8 | path: '/', 9 | name: 'main', 10 | component: MainView 11 | } 12 | ], 13 | scrollBehavior(to, from, savedPosition) { 14 | if (to.hash && to.hash == '#landing-page') { 15 | return { 16 | top: 0, 17 | behavior: window.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant' 18 | } 19 | } 20 | if (to.hash) { 21 | return { 22 | el: to.hash, 23 | top: isScrollingUp(to.hash) ? getOffsetHeight() : 0, 24 | behavior: window.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant' 25 | } 26 | } 27 | }, 28 | }) 29 | 30 | let isScrollingUp = (elem_id) => { 31 | const elem = document.querySelector(elem_id) 32 | const toScrollPos = elem.getBoundingClientRect().top 33 | 34 | return toScrollPos < 0 35 | } 36 | 37 | let getOffsetHeight = () => { 38 | const nav = document.querySelector('nav') 39 | const navHeight = nav.getBoundingClientRect().height + 25 40 | 41 | return navHeight 42 | } 43 | 44 | export default router 45 | -------------------------------------------------------------------------------- /src/views/AboutView.vue: -------------------------------------------------------------------------------- 1 | 33 | -------------------------------------------------------------------------------- /src/views/ContactView.vue: -------------------------------------------------------------------------------- 1 | 32 | -------------------------------------------------------------------------------- /src/views/ExperienceView.vue: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /src/views/LandingView.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/views/MainView.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | -------------------------------------------------------------------------------- /src/views/SplashView.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /src/views/WorkView.vue: -------------------------------------------------------------------------------- 1 | 25 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | import portfolio from './src/portfolio' 3 | 4 | module.exports = { 5 | darkMode: 'class', 6 | content: [ 7 | "./index.html", 8 | "./src/**/*.{vue,js,ts,jsx,tsx}", 9 | ], 10 | theme: { 11 | extend: { 12 | colors: { 13 | 'button-color': portfolio.colors.buttonColor, 14 | 'link-color': portfolio.colors.LinkHighlightColor 15 | } 16 | }, 17 | }, 18 | plugins: [], 19 | } 20 | 21 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | base: '/', // base set to root to support custom domain. 9 | plugins: [vue()], 10 | resolve: { 11 | alias: { 12 | '@': fileURLToPath(new URL('./src', import.meta.url)) 13 | } 14 | } 15 | }) 16 | --------------------------------------------------------------------------------