├── .gitignore ├── README.md ├── eslint.config.js ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public ├── dev.png └── vite.svg ├── src ├── App.tsx ├── components │ └── button │ │ └── index.tsx ├── configs │ └── portfolio.json ├── index.css ├── layouts │ ├── header.tsx │ ├── index.tsx │ └── wrapper.tsx ├── main.tsx ├── pages │ └── homepage │ │ ├── Bio.tsx │ │ ├── Contacts.tsx │ │ ├── Education.tsx │ │ ├── Experience.tsx │ │ ├── Projects.tsx │ │ ├── Skills.tsx │ │ └── index.tsx └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | 4 | # Output directory 5 | dist 6 | 7 | # @vitjs/vit temporary directory 8 | .vit 9 | 10 | # Generated by rollup-plugin-visualizer 11 | stats.html 12 | 13 | .eslintcache -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![thumbnail](https://awesomescreenshot.s3.amazonaws.com/image/6171274/53100357-9a5237efdc5e8fc11fee8bcff878d9d4.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJSCJQ2NM3XLFPVKA%2F20250224%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250224T140733Z&X-Amz-Expires=28800&X-Amz-SignedHeaders=host&X-Amz-Signature=5985566598d0627063790b385ac7667effeccc5eb90158c077024962d06597c9) 2 | 3 | # React Vite Portfolio Template 4 | 5 | A lightweight, modern, and customizable portfolio template built with [React](https://reactjs.org/) and [Vite](https://vitejs.dev/). This template is designed to help developers quickly showcase their projects, skills, and personal information in a clean and responsive layout. It uses `pnpm` for fast and efficient package management and includes a `portfolio.json` file to easily manage your portfolio data. 6 | 7 | ## Features 8 | - Built with React and Vite for fast development and optimal performance 9 | - Fully responsive design 10 | - Centralized portfolio data management via `portfolio.json` 11 | - Easy to customize and extend 12 | - Uses `pnpm` for lightweight and efficient dependency management 13 | 14 | ## Prerequisites 15 | Before you begin, ensure you have the following installed: 16 | - [Node.js](https://nodejs.org/) (v16 or higher recommended) 17 | - [pnpm](https://pnpm.io/) (install globally with `npm install -g pnpm`) 18 | 19 | ## Getting Started 20 | 21 | ### Installation 22 | 1. Clone the repository: 23 | ```bash 24 | git clone https://github.com/your-username/react-vite-portfolio-template.git 25 | cd react-vite-portfolio-template 26 | ``` 27 | 2. Install dependencies using `pnpm`: 28 | ```bash 29 | pnpm install 30 | ``` 31 | 3. Customize the `portfolio.json` file located in the `/src/configs`: 32 | ```json 33 | { 34 | "name": "Your Name", 35 | "title": "Your Job Title", 36 | "bio": "A short bio about yourself", 37 | "contacts": { 38 | "github": "https://github.com/your-username", 39 | "twitter": "https://twitter.com/your-username" 40 | }, 41 | "education": { 42 | "logo": "University Logo", 43 | "degree": "Your Degree", 44 | "university": "Your University", 45 | "location": "Location", 46 | "graduation": "2025/01/01 00:00:00", 47 | "courseWork": [ 48 | "Algorithms" 49 | ], 50 | "project": "Your senior project" 51 | }, 52 | "meetingLink": "Calendly link", 53 | "projects": [ 54 | { 55 | "name": "Project Name", 56 | "bio": "A short bio about the project", 57 | "logo": "Project Logo", 58 | "description": "The detailed descripion about the project", 59 | "skills": ["Used skills in an array"] 60 | } 61 | ], 62 | "skills": ["React", "Vite", "JavaScript", "CSS"] 63 | } 64 | ``` 65 | 4. Build 66 | ```bash 67 | pnpm build 68 | ``` 69 | 5. Run 70 | ```bash 71 | pnpm dev 72 | ``` -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import reactHooks from 'eslint-plugin-react-hooks' 4 | import reactRefresh from 'eslint-plugin-react-refresh' 5 | import tseslint from 'typescript-eslint' 6 | 7 | export default tseslint.config( 8 | { ignores: ['dist'] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ['**/*.{ts,tsx}'], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | 'react-hooks': reactHooks, 18 | 'react-refresh': reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | 'react-refresh/only-export-components': [ 23 | 'warn', 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | React + Vite Portfolio 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "portfolio", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@tailwindcss/vite": "^4.0.8", 14 | "classnames": "^2.5.1", 15 | "dayjs": "^1.11.13", 16 | "react": "^19.0.0", 17 | "react-dom": "^19.0.0", 18 | "react-icons": "^5.5.0" 19 | }, 20 | "devDependencies": { 21 | "@eslint/js": "^9.19.0", 22 | "@types/react": "^19.0.8", 23 | "@types/react-dom": "^19.0.3", 24 | "@vitejs/plugin-react": "^4.3.4", 25 | "autoprefixer": "^10.4.20", 26 | "eslint": "^9.19.0", 27 | "eslint-plugin-react-hooks": "^5.0.0", 28 | "eslint-plugin-react-refresh": "^0.4.18", 29 | "globals": "^15.14.0", 30 | "postcss": "^8.5.3", 31 | "tailwindcss": "^4.0.8", 32 | "typescript": "~5.7.2", 33 | "typescript-eslint": "^8.22.0", 34 | "vite": "^6.1.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tailwindcss/vite': 12 | specifier: ^4.0.8 13 | version: 4.0.8(vite@6.1.1(jiti@2.4.2)(lightningcss@1.29.1)) 14 | classnames: 15 | specifier: ^2.5.1 16 | version: 2.5.1 17 | dayjs: 18 | specifier: ^1.11.13 19 | version: 1.11.13 20 | react: 21 | specifier: ^19.0.0 22 | version: 19.0.0 23 | react-dom: 24 | specifier: ^19.0.0 25 | version: 19.0.0(react@19.0.0) 26 | react-icons: 27 | specifier: ^5.5.0 28 | version: 5.5.0(react@19.0.0) 29 | devDependencies: 30 | '@eslint/js': 31 | specifier: ^9.19.0 32 | version: 9.21.0 33 | '@types/react': 34 | specifier: ^19.0.8 35 | version: 19.0.10 36 | '@types/react-dom': 37 | specifier: ^19.0.3 38 | version: 19.0.4(@types/react@19.0.10) 39 | '@vitejs/plugin-react': 40 | specifier: ^4.3.4 41 | version: 4.3.4(vite@6.1.1(jiti@2.4.2)(lightningcss@1.29.1)) 42 | autoprefixer: 43 | specifier: ^10.4.20 44 | version: 10.4.20(postcss@8.5.3) 45 | eslint: 46 | specifier: ^9.19.0 47 | version: 9.21.0(jiti@2.4.2) 48 | eslint-plugin-react-hooks: 49 | specifier: ^5.0.0 50 | version: 5.1.0(eslint@9.21.0(jiti@2.4.2)) 51 | eslint-plugin-react-refresh: 52 | specifier: ^0.4.18 53 | version: 0.4.19(eslint@9.21.0(jiti@2.4.2)) 54 | globals: 55 | specifier: ^15.14.0 56 | version: 15.15.0 57 | postcss: 58 | specifier: ^8.5.3 59 | version: 8.5.3 60 | tailwindcss: 61 | specifier: ^4.0.8 62 | version: 4.0.8 63 | typescript: 64 | specifier: ~5.7.2 65 | version: 5.7.3 66 | typescript-eslint: 67 | specifier: ^8.22.0 68 | version: 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 69 | vite: 70 | specifier: ^6.1.0 71 | version: 6.1.1(jiti@2.4.2)(lightningcss@1.29.1) 72 | 73 | packages: 74 | 75 | '@ampproject/remapping@2.3.0': 76 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 77 | engines: {node: '>=6.0.0'} 78 | 79 | '@babel/code-frame@7.26.2': 80 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 81 | engines: {node: '>=6.9.0'} 82 | 83 | '@babel/compat-data@7.26.8': 84 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 85 | engines: {node: '>=6.9.0'} 86 | 87 | '@babel/core@7.26.9': 88 | resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} 89 | engines: {node: '>=6.9.0'} 90 | 91 | '@babel/generator@7.26.9': 92 | resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} 93 | engines: {node: '>=6.9.0'} 94 | 95 | '@babel/helper-compilation-targets@7.26.5': 96 | resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} 97 | engines: {node: '>=6.9.0'} 98 | 99 | '@babel/helper-module-imports@7.25.9': 100 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 101 | engines: {node: '>=6.9.0'} 102 | 103 | '@babel/helper-module-transforms@7.26.0': 104 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 105 | engines: {node: '>=6.9.0'} 106 | peerDependencies: 107 | '@babel/core': ^7.0.0 108 | 109 | '@babel/helper-plugin-utils@7.26.5': 110 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 111 | engines: {node: '>=6.9.0'} 112 | 113 | '@babel/helper-string-parser@7.25.9': 114 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 115 | engines: {node: '>=6.9.0'} 116 | 117 | '@babel/helper-validator-identifier@7.25.9': 118 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 119 | engines: {node: '>=6.9.0'} 120 | 121 | '@babel/helper-validator-option@7.25.9': 122 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 123 | engines: {node: '>=6.9.0'} 124 | 125 | '@babel/helpers@7.26.9': 126 | resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} 127 | engines: {node: '>=6.9.0'} 128 | 129 | '@babel/parser@7.26.9': 130 | resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} 131 | engines: {node: '>=6.0.0'} 132 | hasBin: true 133 | 134 | '@babel/plugin-transform-react-jsx-self@7.25.9': 135 | resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} 136 | engines: {node: '>=6.9.0'} 137 | peerDependencies: 138 | '@babel/core': ^7.0.0-0 139 | 140 | '@babel/plugin-transform-react-jsx-source@7.25.9': 141 | resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} 142 | engines: {node: '>=6.9.0'} 143 | peerDependencies: 144 | '@babel/core': ^7.0.0-0 145 | 146 | '@babel/template@7.26.9': 147 | resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} 148 | engines: {node: '>=6.9.0'} 149 | 150 | '@babel/traverse@7.26.9': 151 | resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} 152 | engines: {node: '>=6.9.0'} 153 | 154 | '@babel/types@7.26.9': 155 | resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} 156 | engines: {node: '>=6.9.0'} 157 | 158 | '@esbuild/aix-ppc64@0.24.2': 159 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 160 | engines: {node: '>=18'} 161 | cpu: [ppc64] 162 | os: [aix] 163 | 164 | '@esbuild/android-arm64@0.24.2': 165 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 166 | engines: {node: '>=18'} 167 | cpu: [arm64] 168 | os: [android] 169 | 170 | '@esbuild/android-arm@0.24.2': 171 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 172 | engines: {node: '>=18'} 173 | cpu: [arm] 174 | os: [android] 175 | 176 | '@esbuild/android-x64@0.24.2': 177 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 178 | engines: {node: '>=18'} 179 | cpu: [x64] 180 | os: [android] 181 | 182 | '@esbuild/darwin-arm64@0.24.2': 183 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 184 | engines: {node: '>=18'} 185 | cpu: [arm64] 186 | os: [darwin] 187 | 188 | '@esbuild/darwin-x64@0.24.2': 189 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 190 | engines: {node: '>=18'} 191 | cpu: [x64] 192 | os: [darwin] 193 | 194 | '@esbuild/freebsd-arm64@0.24.2': 195 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 196 | engines: {node: '>=18'} 197 | cpu: [arm64] 198 | os: [freebsd] 199 | 200 | '@esbuild/freebsd-x64@0.24.2': 201 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 202 | engines: {node: '>=18'} 203 | cpu: [x64] 204 | os: [freebsd] 205 | 206 | '@esbuild/linux-arm64@0.24.2': 207 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 208 | engines: {node: '>=18'} 209 | cpu: [arm64] 210 | os: [linux] 211 | 212 | '@esbuild/linux-arm@0.24.2': 213 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 214 | engines: {node: '>=18'} 215 | cpu: [arm] 216 | os: [linux] 217 | 218 | '@esbuild/linux-ia32@0.24.2': 219 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 220 | engines: {node: '>=18'} 221 | cpu: [ia32] 222 | os: [linux] 223 | 224 | '@esbuild/linux-loong64@0.24.2': 225 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 226 | engines: {node: '>=18'} 227 | cpu: [loong64] 228 | os: [linux] 229 | 230 | '@esbuild/linux-mips64el@0.24.2': 231 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 232 | engines: {node: '>=18'} 233 | cpu: [mips64el] 234 | os: [linux] 235 | 236 | '@esbuild/linux-ppc64@0.24.2': 237 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 238 | engines: {node: '>=18'} 239 | cpu: [ppc64] 240 | os: [linux] 241 | 242 | '@esbuild/linux-riscv64@0.24.2': 243 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 244 | engines: {node: '>=18'} 245 | cpu: [riscv64] 246 | os: [linux] 247 | 248 | '@esbuild/linux-s390x@0.24.2': 249 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 250 | engines: {node: '>=18'} 251 | cpu: [s390x] 252 | os: [linux] 253 | 254 | '@esbuild/linux-x64@0.24.2': 255 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 256 | engines: {node: '>=18'} 257 | cpu: [x64] 258 | os: [linux] 259 | 260 | '@esbuild/netbsd-arm64@0.24.2': 261 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 262 | engines: {node: '>=18'} 263 | cpu: [arm64] 264 | os: [netbsd] 265 | 266 | '@esbuild/netbsd-x64@0.24.2': 267 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 268 | engines: {node: '>=18'} 269 | cpu: [x64] 270 | os: [netbsd] 271 | 272 | '@esbuild/openbsd-arm64@0.24.2': 273 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 274 | engines: {node: '>=18'} 275 | cpu: [arm64] 276 | os: [openbsd] 277 | 278 | '@esbuild/openbsd-x64@0.24.2': 279 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 280 | engines: {node: '>=18'} 281 | cpu: [x64] 282 | os: [openbsd] 283 | 284 | '@esbuild/sunos-x64@0.24.2': 285 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 286 | engines: {node: '>=18'} 287 | cpu: [x64] 288 | os: [sunos] 289 | 290 | '@esbuild/win32-arm64@0.24.2': 291 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 292 | engines: {node: '>=18'} 293 | cpu: [arm64] 294 | os: [win32] 295 | 296 | '@esbuild/win32-ia32@0.24.2': 297 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 298 | engines: {node: '>=18'} 299 | cpu: [ia32] 300 | os: [win32] 301 | 302 | '@esbuild/win32-x64@0.24.2': 303 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 304 | engines: {node: '>=18'} 305 | cpu: [x64] 306 | os: [win32] 307 | 308 | '@eslint-community/eslint-utils@4.4.1': 309 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 310 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 311 | peerDependencies: 312 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 313 | 314 | '@eslint-community/regexpp@4.12.1': 315 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 316 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 317 | 318 | '@eslint/config-array@0.19.2': 319 | resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} 320 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 321 | 322 | '@eslint/core@0.12.0': 323 | resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} 324 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 325 | 326 | '@eslint/eslintrc@3.3.0': 327 | resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} 328 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 329 | 330 | '@eslint/js@9.21.0': 331 | resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} 332 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 333 | 334 | '@eslint/object-schema@2.1.6': 335 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 336 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 337 | 338 | '@eslint/plugin-kit@0.2.7': 339 | resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} 340 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 341 | 342 | '@humanfs/core@0.19.1': 343 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 344 | engines: {node: '>=18.18.0'} 345 | 346 | '@humanfs/node@0.16.6': 347 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 348 | engines: {node: '>=18.18.0'} 349 | 350 | '@humanwhocodes/module-importer@1.0.1': 351 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 352 | engines: {node: '>=12.22'} 353 | 354 | '@humanwhocodes/retry@0.3.1': 355 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 356 | engines: {node: '>=18.18'} 357 | 358 | '@humanwhocodes/retry@0.4.2': 359 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 360 | engines: {node: '>=18.18'} 361 | 362 | '@jridgewell/gen-mapping@0.3.8': 363 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 364 | engines: {node: '>=6.0.0'} 365 | 366 | '@jridgewell/resolve-uri@3.1.2': 367 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 368 | engines: {node: '>=6.0.0'} 369 | 370 | '@jridgewell/set-array@1.2.1': 371 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 372 | engines: {node: '>=6.0.0'} 373 | 374 | '@jridgewell/sourcemap-codec@1.5.0': 375 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 376 | 377 | '@jridgewell/trace-mapping@0.3.25': 378 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 379 | 380 | '@nodelib/fs.scandir@2.1.5': 381 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 382 | engines: {node: '>= 8'} 383 | 384 | '@nodelib/fs.stat@2.0.5': 385 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 386 | engines: {node: '>= 8'} 387 | 388 | '@nodelib/fs.walk@1.2.8': 389 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 390 | engines: {node: '>= 8'} 391 | 392 | '@rollup/rollup-android-arm-eabi@4.34.8': 393 | resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} 394 | cpu: [arm] 395 | os: [android] 396 | 397 | '@rollup/rollup-android-arm64@4.34.8': 398 | resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} 399 | cpu: [arm64] 400 | os: [android] 401 | 402 | '@rollup/rollup-darwin-arm64@4.34.8': 403 | resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} 404 | cpu: [arm64] 405 | os: [darwin] 406 | 407 | '@rollup/rollup-darwin-x64@4.34.8': 408 | resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} 409 | cpu: [x64] 410 | os: [darwin] 411 | 412 | '@rollup/rollup-freebsd-arm64@4.34.8': 413 | resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} 414 | cpu: [arm64] 415 | os: [freebsd] 416 | 417 | '@rollup/rollup-freebsd-x64@4.34.8': 418 | resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} 419 | cpu: [x64] 420 | os: [freebsd] 421 | 422 | '@rollup/rollup-linux-arm-gnueabihf@4.34.8': 423 | resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} 424 | cpu: [arm] 425 | os: [linux] 426 | 427 | '@rollup/rollup-linux-arm-musleabihf@4.34.8': 428 | resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} 429 | cpu: [arm] 430 | os: [linux] 431 | 432 | '@rollup/rollup-linux-arm64-gnu@4.34.8': 433 | resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} 434 | cpu: [arm64] 435 | os: [linux] 436 | 437 | '@rollup/rollup-linux-arm64-musl@4.34.8': 438 | resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} 439 | cpu: [arm64] 440 | os: [linux] 441 | 442 | '@rollup/rollup-linux-loongarch64-gnu@4.34.8': 443 | resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} 444 | cpu: [loong64] 445 | os: [linux] 446 | 447 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': 448 | resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} 449 | cpu: [ppc64] 450 | os: [linux] 451 | 452 | '@rollup/rollup-linux-riscv64-gnu@4.34.8': 453 | resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} 454 | cpu: [riscv64] 455 | os: [linux] 456 | 457 | '@rollup/rollup-linux-s390x-gnu@4.34.8': 458 | resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} 459 | cpu: [s390x] 460 | os: [linux] 461 | 462 | '@rollup/rollup-linux-x64-gnu@4.34.8': 463 | resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} 464 | cpu: [x64] 465 | os: [linux] 466 | 467 | '@rollup/rollup-linux-x64-musl@4.34.8': 468 | resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} 469 | cpu: [x64] 470 | os: [linux] 471 | 472 | '@rollup/rollup-win32-arm64-msvc@4.34.8': 473 | resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} 474 | cpu: [arm64] 475 | os: [win32] 476 | 477 | '@rollup/rollup-win32-ia32-msvc@4.34.8': 478 | resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} 479 | cpu: [ia32] 480 | os: [win32] 481 | 482 | '@rollup/rollup-win32-x64-msvc@4.34.8': 483 | resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} 484 | cpu: [x64] 485 | os: [win32] 486 | 487 | '@tailwindcss/node@4.0.8': 488 | resolution: {integrity: sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==} 489 | 490 | '@tailwindcss/oxide-android-arm64@4.0.8': 491 | resolution: {integrity: sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==} 492 | engines: {node: '>= 10'} 493 | cpu: [arm64] 494 | os: [android] 495 | 496 | '@tailwindcss/oxide-darwin-arm64@4.0.8': 497 | resolution: {integrity: sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==} 498 | engines: {node: '>= 10'} 499 | cpu: [arm64] 500 | os: [darwin] 501 | 502 | '@tailwindcss/oxide-darwin-x64@4.0.8': 503 | resolution: {integrity: sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==} 504 | engines: {node: '>= 10'} 505 | cpu: [x64] 506 | os: [darwin] 507 | 508 | '@tailwindcss/oxide-freebsd-x64@4.0.8': 509 | resolution: {integrity: sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==} 510 | engines: {node: '>= 10'} 511 | cpu: [x64] 512 | os: [freebsd] 513 | 514 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8': 515 | resolution: {integrity: sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==} 516 | engines: {node: '>= 10'} 517 | cpu: [arm] 518 | os: [linux] 519 | 520 | '@tailwindcss/oxide-linux-arm64-gnu@4.0.8': 521 | resolution: {integrity: sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==} 522 | engines: {node: '>= 10'} 523 | cpu: [arm64] 524 | os: [linux] 525 | 526 | '@tailwindcss/oxide-linux-arm64-musl@4.0.8': 527 | resolution: {integrity: sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==} 528 | engines: {node: '>= 10'} 529 | cpu: [arm64] 530 | os: [linux] 531 | 532 | '@tailwindcss/oxide-linux-x64-gnu@4.0.8': 533 | resolution: {integrity: sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==} 534 | engines: {node: '>= 10'} 535 | cpu: [x64] 536 | os: [linux] 537 | 538 | '@tailwindcss/oxide-linux-x64-musl@4.0.8': 539 | resolution: {integrity: sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==} 540 | engines: {node: '>= 10'} 541 | cpu: [x64] 542 | os: [linux] 543 | 544 | '@tailwindcss/oxide-win32-arm64-msvc@4.0.8': 545 | resolution: {integrity: sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==} 546 | engines: {node: '>= 10'} 547 | cpu: [arm64] 548 | os: [win32] 549 | 550 | '@tailwindcss/oxide-win32-x64-msvc@4.0.8': 551 | resolution: {integrity: sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==} 552 | engines: {node: '>= 10'} 553 | cpu: [x64] 554 | os: [win32] 555 | 556 | '@tailwindcss/oxide@4.0.8': 557 | resolution: {integrity: sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==} 558 | engines: {node: '>= 10'} 559 | 560 | '@tailwindcss/vite@4.0.8': 561 | resolution: {integrity: sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==} 562 | peerDependencies: 563 | vite: ^5.2.0 || ^6 564 | 565 | '@types/babel__core@7.20.5': 566 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 567 | 568 | '@types/babel__generator@7.6.8': 569 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 570 | 571 | '@types/babel__template@7.4.4': 572 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 573 | 574 | '@types/babel__traverse@7.20.6': 575 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 576 | 577 | '@types/estree@1.0.6': 578 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 579 | 580 | '@types/json-schema@7.0.15': 581 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 582 | 583 | '@types/react-dom@19.0.4': 584 | resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} 585 | peerDependencies: 586 | '@types/react': ^19.0.0 587 | 588 | '@types/react@19.0.10': 589 | resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} 590 | 591 | '@typescript-eslint/eslint-plugin@8.24.1': 592 | resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} 593 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 594 | peerDependencies: 595 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 596 | eslint: ^8.57.0 || ^9.0.0 597 | typescript: '>=4.8.4 <5.8.0' 598 | 599 | '@typescript-eslint/parser@8.24.1': 600 | resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} 601 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 602 | peerDependencies: 603 | eslint: ^8.57.0 || ^9.0.0 604 | typescript: '>=4.8.4 <5.8.0' 605 | 606 | '@typescript-eslint/scope-manager@8.24.1': 607 | resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} 608 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 609 | 610 | '@typescript-eslint/type-utils@8.24.1': 611 | resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} 612 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 613 | peerDependencies: 614 | eslint: ^8.57.0 || ^9.0.0 615 | typescript: '>=4.8.4 <5.8.0' 616 | 617 | '@typescript-eslint/types@8.24.1': 618 | resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} 619 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 620 | 621 | '@typescript-eslint/typescript-estree@8.24.1': 622 | resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} 623 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 624 | peerDependencies: 625 | typescript: '>=4.8.4 <5.8.0' 626 | 627 | '@typescript-eslint/utils@8.24.1': 628 | resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} 629 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 630 | peerDependencies: 631 | eslint: ^8.57.0 || ^9.0.0 632 | typescript: '>=4.8.4 <5.8.0' 633 | 634 | '@typescript-eslint/visitor-keys@8.24.1': 635 | resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} 636 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 637 | 638 | '@vitejs/plugin-react@4.3.4': 639 | resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} 640 | engines: {node: ^14.18.0 || >=16.0.0} 641 | peerDependencies: 642 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0 643 | 644 | acorn-jsx@5.3.2: 645 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 646 | peerDependencies: 647 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 648 | 649 | acorn@8.14.0: 650 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 651 | engines: {node: '>=0.4.0'} 652 | hasBin: true 653 | 654 | ajv@6.12.6: 655 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 656 | 657 | ansi-styles@4.3.0: 658 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 659 | engines: {node: '>=8'} 660 | 661 | argparse@2.0.1: 662 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 663 | 664 | autoprefixer@10.4.20: 665 | resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} 666 | engines: {node: ^10 || ^12 || >=14} 667 | hasBin: true 668 | peerDependencies: 669 | postcss: ^8.1.0 670 | 671 | balanced-match@1.0.2: 672 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 673 | 674 | brace-expansion@1.1.11: 675 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 676 | 677 | brace-expansion@2.0.1: 678 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 679 | 680 | braces@3.0.3: 681 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 682 | engines: {node: '>=8'} 683 | 684 | browserslist@4.24.4: 685 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 686 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 687 | hasBin: true 688 | 689 | callsites@3.1.0: 690 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 691 | engines: {node: '>=6'} 692 | 693 | caniuse-lite@1.0.30001700: 694 | resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} 695 | 696 | chalk@4.1.2: 697 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 698 | engines: {node: '>=10'} 699 | 700 | classnames@2.5.1: 701 | resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} 702 | 703 | color-convert@2.0.1: 704 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 705 | engines: {node: '>=7.0.0'} 706 | 707 | color-name@1.1.4: 708 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 709 | 710 | concat-map@0.0.1: 711 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 712 | 713 | convert-source-map@2.0.0: 714 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 715 | 716 | cross-spawn@7.0.6: 717 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 718 | engines: {node: '>= 8'} 719 | 720 | csstype@3.1.3: 721 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 722 | 723 | dayjs@1.11.13: 724 | resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} 725 | 726 | debug@4.4.0: 727 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 728 | engines: {node: '>=6.0'} 729 | peerDependencies: 730 | supports-color: '*' 731 | peerDependenciesMeta: 732 | supports-color: 733 | optional: true 734 | 735 | deep-is@0.1.4: 736 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 737 | 738 | detect-libc@1.0.3: 739 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 740 | engines: {node: '>=0.10'} 741 | hasBin: true 742 | 743 | electron-to-chromium@1.5.103: 744 | resolution: {integrity: sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==} 745 | 746 | enhanced-resolve@5.18.1: 747 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 748 | engines: {node: '>=10.13.0'} 749 | 750 | esbuild@0.24.2: 751 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 752 | engines: {node: '>=18'} 753 | hasBin: true 754 | 755 | escalade@3.2.0: 756 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 757 | engines: {node: '>=6'} 758 | 759 | escape-string-regexp@4.0.0: 760 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 761 | engines: {node: '>=10'} 762 | 763 | eslint-plugin-react-hooks@5.1.0: 764 | resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} 765 | engines: {node: '>=10'} 766 | peerDependencies: 767 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 768 | 769 | eslint-plugin-react-refresh@0.4.19: 770 | resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} 771 | peerDependencies: 772 | eslint: '>=8.40' 773 | 774 | eslint-scope@8.2.0: 775 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 776 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 777 | 778 | eslint-visitor-keys@3.4.3: 779 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 780 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 781 | 782 | eslint-visitor-keys@4.2.0: 783 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 784 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 785 | 786 | eslint@9.21.0: 787 | resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} 788 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 789 | hasBin: true 790 | peerDependencies: 791 | jiti: '*' 792 | peerDependenciesMeta: 793 | jiti: 794 | optional: true 795 | 796 | espree@10.3.0: 797 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 798 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 799 | 800 | esquery@1.6.0: 801 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 802 | engines: {node: '>=0.10'} 803 | 804 | esrecurse@4.3.0: 805 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 806 | engines: {node: '>=4.0'} 807 | 808 | estraverse@5.3.0: 809 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 810 | engines: {node: '>=4.0'} 811 | 812 | esutils@2.0.3: 813 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 814 | engines: {node: '>=0.10.0'} 815 | 816 | fast-deep-equal@3.1.3: 817 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 818 | 819 | fast-glob@3.3.3: 820 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 821 | engines: {node: '>=8.6.0'} 822 | 823 | fast-json-stable-stringify@2.1.0: 824 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 825 | 826 | fast-levenshtein@2.0.6: 827 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 828 | 829 | fastq@1.19.0: 830 | resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} 831 | 832 | file-entry-cache@8.0.0: 833 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 834 | engines: {node: '>=16.0.0'} 835 | 836 | fill-range@7.1.1: 837 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 838 | engines: {node: '>=8'} 839 | 840 | find-up@5.0.0: 841 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 842 | engines: {node: '>=10'} 843 | 844 | flat-cache@4.0.1: 845 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 846 | engines: {node: '>=16'} 847 | 848 | flatted@3.3.3: 849 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 850 | 851 | fraction.js@4.3.7: 852 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 853 | 854 | fsevents@2.3.3: 855 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 856 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 857 | os: [darwin] 858 | 859 | gensync@1.0.0-beta.2: 860 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 861 | engines: {node: '>=6.9.0'} 862 | 863 | glob-parent@5.1.2: 864 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 865 | engines: {node: '>= 6'} 866 | 867 | glob-parent@6.0.2: 868 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 869 | engines: {node: '>=10.13.0'} 870 | 871 | globals@11.12.0: 872 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 873 | engines: {node: '>=4'} 874 | 875 | globals@14.0.0: 876 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 877 | engines: {node: '>=18'} 878 | 879 | globals@15.15.0: 880 | resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 881 | engines: {node: '>=18'} 882 | 883 | graceful-fs@4.2.11: 884 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 885 | 886 | graphemer@1.4.0: 887 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 888 | 889 | has-flag@4.0.0: 890 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 891 | engines: {node: '>=8'} 892 | 893 | ignore@5.3.2: 894 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 895 | engines: {node: '>= 4'} 896 | 897 | import-fresh@3.3.1: 898 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 899 | engines: {node: '>=6'} 900 | 901 | imurmurhash@0.1.4: 902 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 903 | engines: {node: '>=0.8.19'} 904 | 905 | is-extglob@2.1.1: 906 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 907 | engines: {node: '>=0.10.0'} 908 | 909 | is-glob@4.0.3: 910 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 911 | engines: {node: '>=0.10.0'} 912 | 913 | is-number@7.0.0: 914 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 915 | engines: {node: '>=0.12.0'} 916 | 917 | isexe@2.0.0: 918 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 919 | 920 | jiti@2.4.2: 921 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 922 | hasBin: true 923 | 924 | js-tokens@4.0.0: 925 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 926 | 927 | js-yaml@4.1.0: 928 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 929 | hasBin: true 930 | 931 | jsesc@3.1.0: 932 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 933 | engines: {node: '>=6'} 934 | hasBin: true 935 | 936 | json-buffer@3.0.1: 937 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 938 | 939 | json-schema-traverse@0.4.1: 940 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 941 | 942 | json-stable-stringify-without-jsonify@1.0.1: 943 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 944 | 945 | json5@2.2.3: 946 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 947 | engines: {node: '>=6'} 948 | hasBin: true 949 | 950 | keyv@4.5.4: 951 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 952 | 953 | levn@0.4.1: 954 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 955 | engines: {node: '>= 0.8.0'} 956 | 957 | lightningcss-darwin-arm64@1.29.1: 958 | resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} 959 | engines: {node: '>= 12.0.0'} 960 | cpu: [arm64] 961 | os: [darwin] 962 | 963 | lightningcss-darwin-x64@1.29.1: 964 | resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} 965 | engines: {node: '>= 12.0.0'} 966 | cpu: [x64] 967 | os: [darwin] 968 | 969 | lightningcss-freebsd-x64@1.29.1: 970 | resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} 971 | engines: {node: '>= 12.0.0'} 972 | cpu: [x64] 973 | os: [freebsd] 974 | 975 | lightningcss-linux-arm-gnueabihf@1.29.1: 976 | resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} 977 | engines: {node: '>= 12.0.0'} 978 | cpu: [arm] 979 | os: [linux] 980 | 981 | lightningcss-linux-arm64-gnu@1.29.1: 982 | resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} 983 | engines: {node: '>= 12.0.0'} 984 | cpu: [arm64] 985 | os: [linux] 986 | 987 | lightningcss-linux-arm64-musl@1.29.1: 988 | resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} 989 | engines: {node: '>= 12.0.0'} 990 | cpu: [arm64] 991 | os: [linux] 992 | 993 | lightningcss-linux-x64-gnu@1.29.1: 994 | resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} 995 | engines: {node: '>= 12.0.0'} 996 | cpu: [x64] 997 | os: [linux] 998 | 999 | lightningcss-linux-x64-musl@1.29.1: 1000 | resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} 1001 | engines: {node: '>= 12.0.0'} 1002 | cpu: [x64] 1003 | os: [linux] 1004 | 1005 | lightningcss-win32-arm64-msvc@1.29.1: 1006 | resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} 1007 | engines: {node: '>= 12.0.0'} 1008 | cpu: [arm64] 1009 | os: [win32] 1010 | 1011 | lightningcss-win32-x64-msvc@1.29.1: 1012 | resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} 1013 | engines: {node: '>= 12.0.0'} 1014 | cpu: [x64] 1015 | os: [win32] 1016 | 1017 | lightningcss@1.29.1: 1018 | resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} 1019 | engines: {node: '>= 12.0.0'} 1020 | 1021 | locate-path@6.0.0: 1022 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1023 | engines: {node: '>=10'} 1024 | 1025 | lodash.merge@4.6.2: 1026 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1027 | 1028 | lru-cache@5.1.1: 1029 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1030 | 1031 | merge2@1.4.1: 1032 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1033 | engines: {node: '>= 8'} 1034 | 1035 | micromatch@4.0.8: 1036 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1037 | engines: {node: '>=8.6'} 1038 | 1039 | minimatch@3.1.2: 1040 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1041 | 1042 | minimatch@9.0.5: 1043 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1044 | engines: {node: '>=16 || 14 >=14.17'} 1045 | 1046 | ms@2.1.3: 1047 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1048 | 1049 | nanoid@3.3.8: 1050 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1051 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1052 | hasBin: true 1053 | 1054 | natural-compare@1.4.0: 1055 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1056 | 1057 | node-releases@2.0.19: 1058 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1059 | 1060 | normalize-range@0.1.2: 1061 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1062 | engines: {node: '>=0.10.0'} 1063 | 1064 | optionator@0.9.4: 1065 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1066 | engines: {node: '>= 0.8.0'} 1067 | 1068 | p-limit@3.1.0: 1069 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1070 | engines: {node: '>=10'} 1071 | 1072 | p-locate@5.0.0: 1073 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1074 | engines: {node: '>=10'} 1075 | 1076 | parent-module@1.0.1: 1077 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1078 | engines: {node: '>=6'} 1079 | 1080 | path-exists@4.0.0: 1081 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1082 | engines: {node: '>=8'} 1083 | 1084 | path-key@3.1.1: 1085 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1086 | engines: {node: '>=8'} 1087 | 1088 | picocolors@1.1.1: 1089 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1090 | 1091 | picomatch@2.3.1: 1092 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1093 | engines: {node: '>=8.6'} 1094 | 1095 | postcss-value-parser@4.2.0: 1096 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1097 | 1098 | postcss@8.5.3: 1099 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1100 | engines: {node: ^10 || ^12 || >=14} 1101 | 1102 | prelude-ls@1.2.1: 1103 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1104 | engines: {node: '>= 0.8.0'} 1105 | 1106 | punycode@2.3.1: 1107 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1108 | engines: {node: '>=6'} 1109 | 1110 | queue-microtask@1.2.3: 1111 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1112 | 1113 | react-dom@19.0.0: 1114 | resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} 1115 | peerDependencies: 1116 | react: ^19.0.0 1117 | 1118 | react-icons@5.5.0: 1119 | resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} 1120 | peerDependencies: 1121 | react: '*' 1122 | 1123 | react-refresh@0.14.2: 1124 | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} 1125 | engines: {node: '>=0.10.0'} 1126 | 1127 | react@19.0.0: 1128 | resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} 1129 | engines: {node: '>=0.10.0'} 1130 | 1131 | resolve-from@4.0.0: 1132 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1133 | engines: {node: '>=4'} 1134 | 1135 | reusify@1.0.4: 1136 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1137 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1138 | 1139 | rollup@4.34.8: 1140 | resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} 1141 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1142 | hasBin: true 1143 | 1144 | run-parallel@1.2.0: 1145 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1146 | 1147 | scheduler@0.25.0: 1148 | resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} 1149 | 1150 | semver@6.3.1: 1151 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1152 | hasBin: true 1153 | 1154 | semver@7.7.1: 1155 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1156 | engines: {node: '>=10'} 1157 | hasBin: true 1158 | 1159 | shebang-command@2.0.0: 1160 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1161 | engines: {node: '>=8'} 1162 | 1163 | shebang-regex@3.0.0: 1164 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1165 | engines: {node: '>=8'} 1166 | 1167 | source-map-js@1.2.1: 1168 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1169 | engines: {node: '>=0.10.0'} 1170 | 1171 | strip-json-comments@3.1.1: 1172 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1173 | engines: {node: '>=8'} 1174 | 1175 | supports-color@7.2.0: 1176 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1177 | engines: {node: '>=8'} 1178 | 1179 | tailwindcss@4.0.8: 1180 | resolution: {integrity: sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==} 1181 | 1182 | tapable@2.2.1: 1183 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1184 | engines: {node: '>=6'} 1185 | 1186 | to-regex-range@5.0.1: 1187 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1188 | engines: {node: '>=8.0'} 1189 | 1190 | ts-api-utils@2.0.1: 1191 | resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} 1192 | engines: {node: '>=18.12'} 1193 | peerDependencies: 1194 | typescript: '>=4.8.4' 1195 | 1196 | type-check@0.4.0: 1197 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1198 | engines: {node: '>= 0.8.0'} 1199 | 1200 | typescript-eslint@8.24.1: 1201 | resolution: {integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==} 1202 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1203 | peerDependencies: 1204 | eslint: ^8.57.0 || ^9.0.0 1205 | typescript: '>=4.8.4 <5.8.0' 1206 | 1207 | typescript@5.7.3: 1208 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1209 | engines: {node: '>=14.17'} 1210 | hasBin: true 1211 | 1212 | update-browserslist-db@1.1.2: 1213 | resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} 1214 | hasBin: true 1215 | peerDependencies: 1216 | browserslist: '>= 4.21.0' 1217 | 1218 | uri-js@4.4.1: 1219 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1220 | 1221 | vite@6.1.1: 1222 | resolution: {integrity: sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==} 1223 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1224 | hasBin: true 1225 | peerDependencies: 1226 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1227 | jiti: '>=1.21.0' 1228 | less: '*' 1229 | lightningcss: ^1.21.0 1230 | sass: '*' 1231 | sass-embedded: '*' 1232 | stylus: '*' 1233 | sugarss: '*' 1234 | terser: ^5.16.0 1235 | tsx: ^4.8.1 1236 | yaml: ^2.4.2 1237 | peerDependenciesMeta: 1238 | '@types/node': 1239 | optional: true 1240 | jiti: 1241 | optional: true 1242 | less: 1243 | optional: true 1244 | lightningcss: 1245 | optional: true 1246 | sass: 1247 | optional: true 1248 | sass-embedded: 1249 | optional: true 1250 | stylus: 1251 | optional: true 1252 | sugarss: 1253 | optional: true 1254 | terser: 1255 | optional: true 1256 | tsx: 1257 | optional: true 1258 | yaml: 1259 | optional: true 1260 | 1261 | which@2.0.2: 1262 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1263 | engines: {node: '>= 8'} 1264 | hasBin: true 1265 | 1266 | word-wrap@1.2.5: 1267 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1268 | engines: {node: '>=0.10.0'} 1269 | 1270 | yallist@3.1.1: 1271 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1272 | 1273 | yocto-queue@0.1.0: 1274 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1275 | engines: {node: '>=10'} 1276 | 1277 | snapshots: 1278 | 1279 | '@ampproject/remapping@2.3.0': 1280 | dependencies: 1281 | '@jridgewell/gen-mapping': 0.3.8 1282 | '@jridgewell/trace-mapping': 0.3.25 1283 | 1284 | '@babel/code-frame@7.26.2': 1285 | dependencies: 1286 | '@babel/helper-validator-identifier': 7.25.9 1287 | js-tokens: 4.0.0 1288 | picocolors: 1.1.1 1289 | 1290 | '@babel/compat-data@7.26.8': {} 1291 | 1292 | '@babel/core@7.26.9': 1293 | dependencies: 1294 | '@ampproject/remapping': 2.3.0 1295 | '@babel/code-frame': 7.26.2 1296 | '@babel/generator': 7.26.9 1297 | '@babel/helper-compilation-targets': 7.26.5 1298 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) 1299 | '@babel/helpers': 7.26.9 1300 | '@babel/parser': 7.26.9 1301 | '@babel/template': 7.26.9 1302 | '@babel/traverse': 7.26.9 1303 | '@babel/types': 7.26.9 1304 | convert-source-map: 2.0.0 1305 | debug: 4.4.0 1306 | gensync: 1.0.0-beta.2 1307 | json5: 2.2.3 1308 | semver: 6.3.1 1309 | transitivePeerDependencies: 1310 | - supports-color 1311 | 1312 | '@babel/generator@7.26.9': 1313 | dependencies: 1314 | '@babel/parser': 7.26.9 1315 | '@babel/types': 7.26.9 1316 | '@jridgewell/gen-mapping': 0.3.8 1317 | '@jridgewell/trace-mapping': 0.3.25 1318 | jsesc: 3.1.0 1319 | 1320 | '@babel/helper-compilation-targets@7.26.5': 1321 | dependencies: 1322 | '@babel/compat-data': 7.26.8 1323 | '@babel/helper-validator-option': 7.25.9 1324 | browserslist: 4.24.4 1325 | lru-cache: 5.1.1 1326 | semver: 6.3.1 1327 | 1328 | '@babel/helper-module-imports@7.25.9': 1329 | dependencies: 1330 | '@babel/traverse': 7.26.9 1331 | '@babel/types': 7.26.9 1332 | transitivePeerDependencies: 1333 | - supports-color 1334 | 1335 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': 1336 | dependencies: 1337 | '@babel/core': 7.26.9 1338 | '@babel/helper-module-imports': 7.25.9 1339 | '@babel/helper-validator-identifier': 7.25.9 1340 | '@babel/traverse': 7.26.9 1341 | transitivePeerDependencies: 1342 | - supports-color 1343 | 1344 | '@babel/helper-plugin-utils@7.26.5': {} 1345 | 1346 | '@babel/helper-string-parser@7.25.9': {} 1347 | 1348 | '@babel/helper-validator-identifier@7.25.9': {} 1349 | 1350 | '@babel/helper-validator-option@7.25.9': {} 1351 | 1352 | '@babel/helpers@7.26.9': 1353 | dependencies: 1354 | '@babel/template': 7.26.9 1355 | '@babel/types': 7.26.9 1356 | 1357 | '@babel/parser@7.26.9': 1358 | dependencies: 1359 | '@babel/types': 7.26.9 1360 | 1361 | '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': 1362 | dependencies: 1363 | '@babel/core': 7.26.9 1364 | '@babel/helper-plugin-utils': 7.26.5 1365 | 1366 | '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9)': 1367 | dependencies: 1368 | '@babel/core': 7.26.9 1369 | '@babel/helper-plugin-utils': 7.26.5 1370 | 1371 | '@babel/template@7.26.9': 1372 | dependencies: 1373 | '@babel/code-frame': 7.26.2 1374 | '@babel/parser': 7.26.9 1375 | '@babel/types': 7.26.9 1376 | 1377 | '@babel/traverse@7.26.9': 1378 | dependencies: 1379 | '@babel/code-frame': 7.26.2 1380 | '@babel/generator': 7.26.9 1381 | '@babel/parser': 7.26.9 1382 | '@babel/template': 7.26.9 1383 | '@babel/types': 7.26.9 1384 | debug: 4.4.0 1385 | globals: 11.12.0 1386 | transitivePeerDependencies: 1387 | - supports-color 1388 | 1389 | '@babel/types@7.26.9': 1390 | dependencies: 1391 | '@babel/helper-string-parser': 7.25.9 1392 | '@babel/helper-validator-identifier': 7.25.9 1393 | 1394 | '@esbuild/aix-ppc64@0.24.2': 1395 | optional: true 1396 | 1397 | '@esbuild/android-arm64@0.24.2': 1398 | optional: true 1399 | 1400 | '@esbuild/android-arm@0.24.2': 1401 | optional: true 1402 | 1403 | '@esbuild/android-x64@0.24.2': 1404 | optional: true 1405 | 1406 | '@esbuild/darwin-arm64@0.24.2': 1407 | optional: true 1408 | 1409 | '@esbuild/darwin-x64@0.24.2': 1410 | optional: true 1411 | 1412 | '@esbuild/freebsd-arm64@0.24.2': 1413 | optional: true 1414 | 1415 | '@esbuild/freebsd-x64@0.24.2': 1416 | optional: true 1417 | 1418 | '@esbuild/linux-arm64@0.24.2': 1419 | optional: true 1420 | 1421 | '@esbuild/linux-arm@0.24.2': 1422 | optional: true 1423 | 1424 | '@esbuild/linux-ia32@0.24.2': 1425 | optional: true 1426 | 1427 | '@esbuild/linux-loong64@0.24.2': 1428 | optional: true 1429 | 1430 | '@esbuild/linux-mips64el@0.24.2': 1431 | optional: true 1432 | 1433 | '@esbuild/linux-ppc64@0.24.2': 1434 | optional: true 1435 | 1436 | '@esbuild/linux-riscv64@0.24.2': 1437 | optional: true 1438 | 1439 | '@esbuild/linux-s390x@0.24.2': 1440 | optional: true 1441 | 1442 | '@esbuild/linux-x64@0.24.2': 1443 | optional: true 1444 | 1445 | '@esbuild/netbsd-arm64@0.24.2': 1446 | optional: true 1447 | 1448 | '@esbuild/netbsd-x64@0.24.2': 1449 | optional: true 1450 | 1451 | '@esbuild/openbsd-arm64@0.24.2': 1452 | optional: true 1453 | 1454 | '@esbuild/openbsd-x64@0.24.2': 1455 | optional: true 1456 | 1457 | '@esbuild/sunos-x64@0.24.2': 1458 | optional: true 1459 | 1460 | '@esbuild/win32-arm64@0.24.2': 1461 | optional: true 1462 | 1463 | '@esbuild/win32-ia32@0.24.2': 1464 | optional: true 1465 | 1466 | '@esbuild/win32-x64@0.24.2': 1467 | optional: true 1468 | 1469 | '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@2.4.2))': 1470 | dependencies: 1471 | eslint: 9.21.0(jiti@2.4.2) 1472 | eslint-visitor-keys: 3.4.3 1473 | 1474 | '@eslint-community/regexpp@4.12.1': {} 1475 | 1476 | '@eslint/config-array@0.19.2': 1477 | dependencies: 1478 | '@eslint/object-schema': 2.1.6 1479 | debug: 4.4.0 1480 | minimatch: 3.1.2 1481 | transitivePeerDependencies: 1482 | - supports-color 1483 | 1484 | '@eslint/core@0.12.0': 1485 | dependencies: 1486 | '@types/json-schema': 7.0.15 1487 | 1488 | '@eslint/eslintrc@3.3.0': 1489 | dependencies: 1490 | ajv: 6.12.6 1491 | debug: 4.4.0 1492 | espree: 10.3.0 1493 | globals: 14.0.0 1494 | ignore: 5.3.2 1495 | import-fresh: 3.3.1 1496 | js-yaml: 4.1.0 1497 | minimatch: 3.1.2 1498 | strip-json-comments: 3.1.1 1499 | transitivePeerDependencies: 1500 | - supports-color 1501 | 1502 | '@eslint/js@9.21.0': {} 1503 | 1504 | '@eslint/object-schema@2.1.6': {} 1505 | 1506 | '@eslint/plugin-kit@0.2.7': 1507 | dependencies: 1508 | '@eslint/core': 0.12.0 1509 | levn: 0.4.1 1510 | 1511 | '@humanfs/core@0.19.1': {} 1512 | 1513 | '@humanfs/node@0.16.6': 1514 | dependencies: 1515 | '@humanfs/core': 0.19.1 1516 | '@humanwhocodes/retry': 0.3.1 1517 | 1518 | '@humanwhocodes/module-importer@1.0.1': {} 1519 | 1520 | '@humanwhocodes/retry@0.3.1': {} 1521 | 1522 | '@humanwhocodes/retry@0.4.2': {} 1523 | 1524 | '@jridgewell/gen-mapping@0.3.8': 1525 | dependencies: 1526 | '@jridgewell/set-array': 1.2.1 1527 | '@jridgewell/sourcemap-codec': 1.5.0 1528 | '@jridgewell/trace-mapping': 0.3.25 1529 | 1530 | '@jridgewell/resolve-uri@3.1.2': {} 1531 | 1532 | '@jridgewell/set-array@1.2.1': {} 1533 | 1534 | '@jridgewell/sourcemap-codec@1.5.0': {} 1535 | 1536 | '@jridgewell/trace-mapping@0.3.25': 1537 | dependencies: 1538 | '@jridgewell/resolve-uri': 3.1.2 1539 | '@jridgewell/sourcemap-codec': 1.5.0 1540 | 1541 | '@nodelib/fs.scandir@2.1.5': 1542 | dependencies: 1543 | '@nodelib/fs.stat': 2.0.5 1544 | run-parallel: 1.2.0 1545 | 1546 | '@nodelib/fs.stat@2.0.5': {} 1547 | 1548 | '@nodelib/fs.walk@1.2.8': 1549 | dependencies: 1550 | '@nodelib/fs.scandir': 2.1.5 1551 | fastq: 1.19.0 1552 | 1553 | '@rollup/rollup-android-arm-eabi@4.34.8': 1554 | optional: true 1555 | 1556 | '@rollup/rollup-android-arm64@4.34.8': 1557 | optional: true 1558 | 1559 | '@rollup/rollup-darwin-arm64@4.34.8': 1560 | optional: true 1561 | 1562 | '@rollup/rollup-darwin-x64@4.34.8': 1563 | optional: true 1564 | 1565 | '@rollup/rollup-freebsd-arm64@4.34.8': 1566 | optional: true 1567 | 1568 | '@rollup/rollup-freebsd-x64@4.34.8': 1569 | optional: true 1570 | 1571 | '@rollup/rollup-linux-arm-gnueabihf@4.34.8': 1572 | optional: true 1573 | 1574 | '@rollup/rollup-linux-arm-musleabihf@4.34.8': 1575 | optional: true 1576 | 1577 | '@rollup/rollup-linux-arm64-gnu@4.34.8': 1578 | optional: true 1579 | 1580 | '@rollup/rollup-linux-arm64-musl@4.34.8': 1581 | optional: true 1582 | 1583 | '@rollup/rollup-linux-loongarch64-gnu@4.34.8': 1584 | optional: true 1585 | 1586 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': 1587 | optional: true 1588 | 1589 | '@rollup/rollup-linux-riscv64-gnu@4.34.8': 1590 | optional: true 1591 | 1592 | '@rollup/rollup-linux-s390x-gnu@4.34.8': 1593 | optional: true 1594 | 1595 | '@rollup/rollup-linux-x64-gnu@4.34.8': 1596 | optional: true 1597 | 1598 | '@rollup/rollup-linux-x64-musl@4.34.8': 1599 | optional: true 1600 | 1601 | '@rollup/rollup-win32-arm64-msvc@4.34.8': 1602 | optional: true 1603 | 1604 | '@rollup/rollup-win32-ia32-msvc@4.34.8': 1605 | optional: true 1606 | 1607 | '@rollup/rollup-win32-x64-msvc@4.34.8': 1608 | optional: true 1609 | 1610 | '@tailwindcss/node@4.0.8': 1611 | dependencies: 1612 | enhanced-resolve: 5.18.1 1613 | jiti: 2.4.2 1614 | tailwindcss: 4.0.8 1615 | 1616 | '@tailwindcss/oxide-android-arm64@4.0.8': 1617 | optional: true 1618 | 1619 | '@tailwindcss/oxide-darwin-arm64@4.0.8': 1620 | optional: true 1621 | 1622 | '@tailwindcss/oxide-darwin-x64@4.0.8': 1623 | optional: true 1624 | 1625 | '@tailwindcss/oxide-freebsd-x64@4.0.8': 1626 | optional: true 1627 | 1628 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8': 1629 | optional: true 1630 | 1631 | '@tailwindcss/oxide-linux-arm64-gnu@4.0.8': 1632 | optional: true 1633 | 1634 | '@tailwindcss/oxide-linux-arm64-musl@4.0.8': 1635 | optional: true 1636 | 1637 | '@tailwindcss/oxide-linux-x64-gnu@4.0.8': 1638 | optional: true 1639 | 1640 | '@tailwindcss/oxide-linux-x64-musl@4.0.8': 1641 | optional: true 1642 | 1643 | '@tailwindcss/oxide-win32-arm64-msvc@4.0.8': 1644 | optional: true 1645 | 1646 | '@tailwindcss/oxide-win32-x64-msvc@4.0.8': 1647 | optional: true 1648 | 1649 | '@tailwindcss/oxide@4.0.8': 1650 | optionalDependencies: 1651 | '@tailwindcss/oxide-android-arm64': 4.0.8 1652 | '@tailwindcss/oxide-darwin-arm64': 4.0.8 1653 | '@tailwindcss/oxide-darwin-x64': 4.0.8 1654 | '@tailwindcss/oxide-freebsd-x64': 4.0.8 1655 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.8 1656 | '@tailwindcss/oxide-linux-arm64-gnu': 4.0.8 1657 | '@tailwindcss/oxide-linux-arm64-musl': 4.0.8 1658 | '@tailwindcss/oxide-linux-x64-gnu': 4.0.8 1659 | '@tailwindcss/oxide-linux-x64-musl': 4.0.8 1660 | '@tailwindcss/oxide-win32-arm64-msvc': 4.0.8 1661 | '@tailwindcss/oxide-win32-x64-msvc': 4.0.8 1662 | 1663 | '@tailwindcss/vite@4.0.8(vite@6.1.1(jiti@2.4.2)(lightningcss@1.29.1))': 1664 | dependencies: 1665 | '@tailwindcss/node': 4.0.8 1666 | '@tailwindcss/oxide': 4.0.8 1667 | lightningcss: 1.29.1 1668 | tailwindcss: 4.0.8 1669 | vite: 6.1.1(jiti@2.4.2)(lightningcss@1.29.1) 1670 | 1671 | '@types/babel__core@7.20.5': 1672 | dependencies: 1673 | '@babel/parser': 7.26.9 1674 | '@babel/types': 7.26.9 1675 | '@types/babel__generator': 7.6.8 1676 | '@types/babel__template': 7.4.4 1677 | '@types/babel__traverse': 7.20.6 1678 | 1679 | '@types/babel__generator@7.6.8': 1680 | dependencies: 1681 | '@babel/types': 7.26.9 1682 | 1683 | '@types/babel__template@7.4.4': 1684 | dependencies: 1685 | '@babel/parser': 7.26.9 1686 | '@babel/types': 7.26.9 1687 | 1688 | '@types/babel__traverse@7.20.6': 1689 | dependencies: 1690 | '@babel/types': 7.26.9 1691 | 1692 | '@types/estree@1.0.6': {} 1693 | 1694 | '@types/json-schema@7.0.15': {} 1695 | 1696 | '@types/react-dom@19.0.4(@types/react@19.0.10)': 1697 | dependencies: 1698 | '@types/react': 19.0.10 1699 | 1700 | '@types/react@19.0.10': 1701 | dependencies: 1702 | csstype: 3.1.3 1703 | 1704 | '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': 1705 | dependencies: 1706 | '@eslint-community/regexpp': 4.12.1 1707 | '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 1708 | '@typescript-eslint/scope-manager': 8.24.1 1709 | '@typescript-eslint/type-utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 1710 | '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 1711 | '@typescript-eslint/visitor-keys': 8.24.1 1712 | eslint: 9.21.0(jiti@2.4.2) 1713 | graphemer: 1.4.0 1714 | ignore: 5.3.2 1715 | natural-compare: 1.4.0 1716 | ts-api-utils: 2.0.1(typescript@5.7.3) 1717 | typescript: 5.7.3 1718 | transitivePeerDependencies: 1719 | - supports-color 1720 | 1721 | '@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': 1722 | dependencies: 1723 | '@typescript-eslint/scope-manager': 8.24.1 1724 | '@typescript-eslint/types': 8.24.1 1725 | '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) 1726 | '@typescript-eslint/visitor-keys': 8.24.1 1727 | debug: 4.4.0 1728 | eslint: 9.21.0(jiti@2.4.2) 1729 | typescript: 5.7.3 1730 | transitivePeerDependencies: 1731 | - supports-color 1732 | 1733 | '@typescript-eslint/scope-manager@8.24.1': 1734 | dependencies: 1735 | '@typescript-eslint/types': 8.24.1 1736 | '@typescript-eslint/visitor-keys': 8.24.1 1737 | 1738 | '@typescript-eslint/type-utils@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': 1739 | dependencies: 1740 | '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) 1741 | '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 1742 | debug: 4.4.0 1743 | eslint: 9.21.0(jiti@2.4.2) 1744 | ts-api-utils: 2.0.1(typescript@5.7.3) 1745 | typescript: 5.7.3 1746 | transitivePeerDependencies: 1747 | - supports-color 1748 | 1749 | '@typescript-eslint/types@8.24.1': {} 1750 | 1751 | '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)': 1752 | dependencies: 1753 | '@typescript-eslint/types': 8.24.1 1754 | '@typescript-eslint/visitor-keys': 8.24.1 1755 | debug: 4.4.0 1756 | fast-glob: 3.3.3 1757 | is-glob: 4.0.3 1758 | minimatch: 9.0.5 1759 | semver: 7.7.1 1760 | ts-api-utils: 2.0.1(typescript@5.7.3) 1761 | typescript: 5.7.3 1762 | transitivePeerDependencies: 1763 | - supports-color 1764 | 1765 | '@typescript-eslint/utils@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': 1766 | dependencies: 1767 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) 1768 | '@typescript-eslint/scope-manager': 8.24.1 1769 | '@typescript-eslint/types': 8.24.1 1770 | '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) 1771 | eslint: 9.21.0(jiti@2.4.2) 1772 | typescript: 5.7.3 1773 | transitivePeerDependencies: 1774 | - supports-color 1775 | 1776 | '@typescript-eslint/visitor-keys@8.24.1': 1777 | dependencies: 1778 | '@typescript-eslint/types': 8.24.1 1779 | eslint-visitor-keys: 4.2.0 1780 | 1781 | '@vitejs/plugin-react@4.3.4(vite@6.1.1(jiti@2.4.2)(lightningcss@1.29.1))': 1782 | dependencies: 1783 | '@babel/core': 7.26.9 1784 | '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) 1785 | '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) 1786 | '@types/babel__core': 7.20.5 1787 | react-refresh: 0.14.2 1788 | vite: 6.1.1(jiti@2.4.2)(lightningcss@1.29.1) 1789 | transitivePeerDependencies: 1790 | - supports-color 1791 | 1792 | acorn-jsx@5.3.2(acorn@8.14.0): 1793 | dependencies: 1794 | acorn: 8.14.0 1795 | 1796 | acorn@8.14.0: {} 1797 | 1798 | ajv@6.12.6: 1799 | dependencies: 1800 | fast-deep-equal: 3.1.3 1801 | fast-json-stable-stringify: 2.1.0 1802 | json-schema-traverse: 0.4.1 1803 | uri-js: 4.4.1 1804 | 1805 | ansi-styles@4.3.0: 1806 | dependencies: 1807 | color-convert: 2.0.1 1808 | 1809 | argparse@2.0.1: {} 1810 | 1811 | autoprefixer@10.4.20(postcss@8.5.3): 1812 | dependencies: 1813 | browserslist: 4.24.4 1814 | caniuse-lite: 1.0.30001700 1815 | fraction.js: 4.3.7 1816 | normalize-range: 0.1.2 1817 | picocolors: 1.1.1 1818 | postcss: 8.5.3 1819 | postcss-value-parser: 4.2.0 1820 | 1821 | balanced-match@1.0.2: {} 1822 | 1823 | brace-expansion@1.1.11: 1824 | dependencies: 1825 | balanced-match: 1.0.2 1826 | concat-map: 0.0.1 1827 | 1828 | brace-expansion@2.0.1: 1829 | dependencies: 1830 | balanced-match: 1.0.2 1831 | 1832 | braces@3.0.3: 1833 | dependencies: 1834 | fill-range: 7.1.1 1835 | 1836 | browserslist@4.24.4: 1837 | dependencies: 1838 | caniuse-lite: 1.0.30001700 1839 | electron-to-chromium: 1.5.103 1840 | node-releases: 2.0.19 1841 | update-browserslist-db: 1.1.2(browserslist@4.24.4) 1842 | 1843 | callsites@3.1.0: {} 1844 | 1845 | caniuse-lite@1.0.30001700: {} 1846 | 1847 | chalk@4.1.2: 1848 | dependencies: 1849 | ansi-styles: 4.3.0 1850 | supports-color: 7.2.0 1851 | 1852 | classnames@2.5.1: {} 1853 | 1854 | color-convert@2.0.1: 1855 | dependencies: 1856 | color-name: 1.1.4 1857 | 1858 | color-name@1.1.4: {} 1859 | 1860 | concat-map@0.0.1: {} 1861 | 1862 | convert-source-map@2.0.0: {} 1863 | 1864 | cross-spawn@7.0.6: 1865 | dependencies: 1866 | path-key: 3.1.1 1867 | shebang-command: 2.0.0 1868 | which: 2.0.2 1869 | 1870 | csstype@3.1.3: {} 1871 | 1872 | dayjs@1.11.13: {} 1873 | 1874 | debug@4.4.0: 1875 | dependencies: 1876 | ms: 2.1.3 1877 | 1878 | deep-is@0.1.4: {} 1879 | 1880 | detect-libc@1.0.3: {} 1881 | 1882 | electron-to-chromium@1.5.103: {} 1883 | 1884 | enhanced-resolve@5.18.1: 1885 | dependencies: 1886 | graceful-fs: 4.2.11 1887 | tapable: 2.2.1 1888 | 1889 | esbuild@0.24.2: 1890 | optionalDependencies: 1891 | '@esbuild/aix-ppc64': 0.24.2 1892 | '@esbuild/android-arm': 0.24.2 1893 | '@esbuild/android-arm64': 0.24.2 1894 | '@esbuild/android-x64': 0.24.2 1895 | '@esbuild/darwin-arm64': 0.24.2 1896 | '@esbuild/darwin-x64': 0.24.2 1897 | '@esbuild/freebsd-arm64': 0.24.2 1898 | '@esbuild/freebsd-x64': 0.24.2 1899 | '@esbuild/linux-arm': 0.24.2 1900 | '@esbuild/linux-arm64': 0.24.2 1901 | '@esbuild/linux-ia32': 0.24.2 1902 | '@esbuild/linux-loong64': 0.24.2 1903 | '@esbuild/linux-mips64el': 0.24.2 1904 | '@esbuild/linux-ppc64': 0.24.2 1905 | '@esbuild/linux-riscv64': 0.24.2 1906 | '@esbuild/linux-s390x': 0.24.2 1907 | '@esbuild/linux-x64': 0.24.2 1908 | '@esbuild/netbsd-arm64': 0.24.2 1909 | '@esbuild/netbsd-x64': 0.24.2 1910 | '@esbuild/openbsd-arm64': 0.24.2 1911 | '@esbuild/openbsd-x64': 0.24.2 1912 | '@esbuild/sunos-x64': 0.24.2 1913 | '@esbuild/win32-arm64': 0.24.2 1914 | '@esbuild/win32-ia32': 0.24.2 1915 | '@esbuild/win32-x64': 0.24.2 1916 | 1917 | escalade@3.2.0: {} 1918 | 1919 | escape-string-regexp@4.0.0: {} 1920 | 1921 | eslint-plugin-react-hooks@5.1.0(eslint@9.21.0(jiti@2.4.2)): 1922 | dependencies: 1923 | eslint: 9.21.0(jiti@2.4.2) 1924 | 1925 | eslint-plugin-react-refresh@0.4.19(eslint@9.21.0(jiti@2.4.2)): 1926 | dependencies: 1927 | eslint: 9.21.0(jiti@2.4.2) 1928 | 1929 | eslint-scope@8.2.0: 1930 | dependencies: 1931 | esrecurse: 4.3.0 1932 | estraverse: 5.3.0 1933 | 1934 | eslint-visitor-keys@3.4.3: {} 1935 | 1936 | eslint-visitor-keys@4.2.0: {} 1937 | 1938 | eslint@9.21.0(jiti@2.4.2): 1939 | dependencies: 1940 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2)) 1941 | '@eslint-community/regexpp': 4.12.1 1942 | '@eslint/config-array': 0.19.2 1943 | '@eslint/core': 0.12.0 1944 | '@eslint/eslintrc': 3.3.0 1945 | '@eslint/js': 9.21.0 1946 | '@eslint/plugin-kit': 0.2.7 1947 | '@humanfs/node': 0.16.6 1948 | '@humanwhocodes/module-importer': 1.0.1 1949 | '@humanwhocodes/retry': 0.4.2 1950 | '@types/estree': 1.0.6 1951 | '@types/json-schema': 7.0.15 1952 | ajv: 6.12.6 1953 | chalk: 4.1.2 1954 | cross-spawn: 7.0.6 1955 | debug: 4.4.0 1956 | escape-string-regexp: 4.0.0 1957 | eslint-scope: 8.2.0 1958 | eslint-visitor-keys: 4.2.0 1959 | espree: 10.3.0 1960 | esquery: 1.6.0 1961 | esutils: 2.0.3 1962 | fast-deep-equal: 3.1.3 1963 | file-entry-cache: 8.0.0 1964 | find-up: 5.0.0 1965 | glob-parent: 6.0.2 1966 | ignore: 5.3.2 1967 | imurmurhash: 0.1.4 1968 | is-glob: 4.0.3 1969 | json-stable-stringify-without-jsonify: 1.0.1 1970 | lodash.merge: 4.6.2 1971 | minimatch: 3.1.2 1972 | natural-compare: 1.4.0 1973 | optionator: 0.9.4 1974 | optionalDependencies: 1975 | jiti: 2.4.2 1976 | transitivePeerDependencies: 1977 | - supports-color 1978 | 1979 | espree@10.3.0: 1980 | dependencies: 1981 | acorn: 8.14.0 1982 | acorn-jsx: 5.3.2(acorn@8.14.0) 1983 | eslint-visitor-keys: 4.2.0 1984 | 1985 | esquery@1.6.0: 1986 | dependencies: 1987 | estraverse: 5.3.0 1988 | 1989 | esrecurse@4.3.0: 1990 | dependencies: 1991 | estraverse: 5.3.0 1992 | 1993 | estraverse@5.3.0: {} 1994 | 1995 | esutils@2.0.3: {} 1996 | 1997 | fast-deep-equal@3.1.3: {} 1998 | 1999 | fast-glob@3.3.3: 2000 | dependencies: 2001 | '@nodelib/fs.stat': 2.0.5 2002 | '@nodelib/fs.walk': 1.2.8 2003 | glob-parent: 5.1.2 2004 | merge2: 1.4.1 2005 | micromatch: 4.0.8 2006 | 2007 | fast-json-stable-stringify@2.1.0: {} 2008 | 2009 | fast-levenshtein@2.0.6: {} 2010 | 2011 | fastq@1.19.0: 2012 | dependencies: 2013 | reusify: 1.0.4 2014 | 2015 | file-entry-cache@8.0.0: 2016 | dependencies: 2017 | flat-cache: 4.0.1 2018 | 2019 | fill-range@7.1.1: 2020 | dependencies: 2021 | to-regex-range: 5.0.1 2022 | 2023 | find-up@5.0.0: 2024 | dependencies: 2025 | locate-path: 6.0.0 2026 | path-exists: 4.0.0 2027 | 2028 | flat-cache@4.0.1: 2029 | dependencies: 2030 | flatted: 3.3.3 2031 | keyv: 4.5.4 2032 | 2033 | flatted@3.3.3: {} 2034 | 2035 | fraction.js@4.3.7: {} 2036 | 2037 | fsevents@2.3.3: 2038 | optional: true 2039 | 2040 | gensync@1.0.0-beta.2: {} 2041 | 2042 | glob-parent@5.1.2: 2043 | dependencies: 2044 | is-glob: 4.0.3 2045 | 2046 | glob-parent@6.0.2: 2047 | dependencies: 2048 | is-glob: 4.0.3 2049 | 2050 | globals@11.12.0: {} 2051 | 2052 | globals@14.0.0: {} 2053 | 2054 | globals@15.15.0: {} 2055 | 2056 | graceful-fs@4.2.11: {} 2057 | 2058 | graphemer@1.4.0: {} 2059 | 2060 | has-flag@4.0.0: {} 2061 | 2062 | ignore@5.3.2: {} 2063 | 2064 | import-fresh@3.3.1: 2065 | dependencies: 2066 | parent-module: 1.0.1 2067 | resolve-from: 4.0.0 2068 | 2069 | imurmurhash@0.1.4: {} 2070 | 2071 | is-extglob@2.1.1: {} 2072 | 2073 | is-glob@4.0.3: 2074 | dependencies: 2075 | is-extglob: 2.1.1 2076 | 2077 | is-number@7.0.0: {} 2078 | 2079 | isexe@2.0.0: {} 2080 | 2081 | jiti@2.4.2: {} 2082 | 2083 | js-tokens@4.0.0: {} 2084 | 2085 | js-yaml@4.1.0: 2086 | dependencies: 2087 | argparse: 2.0.1 2088 | 2089 | jsesc@3.1.0: {} 2090 | 2091 | json-buffer@3.0.1: {} 2092 | 2093 | json-schema-traverse@0.4.1: {} 2094 | 2095 | json-stable-stringify-without-jsonify@1.0.1: {} 2096 | 2097 | json5@2.2.3: {} 2098 | 2099 | keyv@4.5.4: 2100 | dependencies: 2101 | json-buffer: 3.0.1 2102 | 2103 | levn@0.4.1: 2104 | dependencies: 2105 | prelude-ls: 1.2.1 2106 | type-check: 0.4.0 2107 | 2108 | lightningcss-darwin-arm64@1.29.1: 2109 | optional: true 2110 | 2111 | lightningcss-darwin-x64@1.29.1: 2112 | optional: true 2113 | 2114 | lightningcss-freebsd-x64@1.29.1: 2115 | optional: true 2116 | 2117 | lightningcss-linux-arm-gnueabihf@1.29.1: 2118 | optional: true 2119 | 2120 | lightningcss-linux-arm64-gnu@1.29.1: 2121 | optional: true 2122 | 2123 | lightningcss-linux-arm64-musl@1.29.1: 2124 | optional: true 2125 | 2126 | lightningcss-linux-x64-gnu@1.29.1: 2127 | optional: true 2128 | 2129 | lightningcss-linux-x64-musl@1.29.1: 2130 | optional: true 2131 | 2132 | lightningcss-win32-arm64-msvc@1.29.1: 2133 | optional: true 2134 | 2135 | lightningcss-win32-x64-msvc@1.29.1: 2136 | optional: true 2137 | 2138 | lightningcss@1.29.1: 2139 | dependencies: 2140 | detect-libc: 1.0.3 2141 | optionalDependencies: 2142 | lightningcss-darwin-arm64: 1.29.1 2143 | lightningcss-darwin-x64: 1.29.1 2144 | lightningcss-freebsd-x64: 1.29.1 2145 | lightningcss-linux-arm-gnueabihf: 1.29.1 2146 | lightningcss-linux-arm64-gnu: 1.29.1 2147 | lightningcss-linux-arm64-musl: 1.29.1 2148 | lightningcss-linux-x64-gnu: 1.29.1 2149 | lightningcss-linux-x64-musl: 1.29.1 2150 | lightningcss-win32-arm64-msvc: 1.29.1 2151 | lightningcss-win32-x64-msvc: 1.29.1 2152 | 2153 | locate-path@6.0.0: 2154 | dependencies: 2155 | p-locate: 5.0.0 2156 | 2157 | lodash.merge@4.6.2: {} 2158 | 2159 | lru-cache@5.1.1: 2160 | dependencies: 2161 | yallist: 3.1.1 2162 | 2163 | merge2@1.4.1: {} 2164 | 2165 | micromatch@4.0.8: 2166 | dependencies: 2167 | braces: 3.0.3 2168 | picomatch: 2.3.1 2169 | 2170 | minimatch@3.1.2: 2171 | dependencies: 2172 | brace-expansion: 1.1.11 2173 | 2174 | minimatch@9.0.5: 2175 | dependencies: 2176 | brace-expansion: 2.0.1 2177 | 2178 | ms@2.1.3: {} 2179 | 2180 | nanoid@3.3.8: {} 2181 | 2182 | natural-compare@1.4.0: {} 2183 | 2184 | node-releases@2.0.19: {} 2185 | 2186 | normalize-range@0.1.2: {} 2187 | 2188 | optionator@0.9.4: 2189 | dependencies: 2190 | deep-is: 0.1.4 2191 | fast-levenshtein: 2.0.6 2192 | levn: 0.4.1 2193 | prelude-ls: 1.2.1 2194 | type-check: 0.4.0 2195 | word-wrap: 1.2.5 2196 | 2197 | p-limit@3.1.0: 2198 | dependencies: 2199 | yocto-queue: 0.1.0 2200 | 2201 | p-locate@5.0.0: 2202 | dependencies: 2203 | p-limit: 3.1.0 2204 | 2205 | parent-module@1.0.1: 2206 | dependencies: 2207 | callsites: 3.1.0 2208 | 2209 | path-exists@4.0.0: {} 2210 | 2211 | path-key@3.1.1: {} 2212 | 2213 | picocolors@1.1.1: {} 2214 | 2215 | picomatch@2.3.1: {} 2216 | 2217 | postcss-value-parser@4.2.0: {} 2218 | 2219 | postcss@8.5.3: 2220 | dependencies: 2221 | nanoid: 3.3.8 2222 | picocolors: 1.1.1 2223 | source-map-js: 1.2.1 2224 | 2225 | prelude-ls@1.2.1: {} 2226 | 2227 | punycode@2.3.1: {} 2228 | 2229 | queue-microtask@1.2.3: {} 2230 | 2231 | react-dom@19.0.0(react@19.0.0): 2232 | dependencies: 2233 | react: 19.0.0 2234 | scheduler: 0.25.0 2235 | 2236 | react-icons@5.5.0(react@19.0.0): 2237 | dependencies: 2238 | react: 19.0.0 2239 | 2240 | react-refresh@0.14.2: {} 2241 | 2242 | react@19.0.0: {} 2243 | 2244 | resolve-from@4.0.0: {} 2245 | 2246 | reusify@1.0.4: {} 2247 | 2248 | rollup@4.34.8: 2249 | dependencies: 2250 | '@types/estree': 1.0.6 2251 | optionalDependencies: 2252 | '@rollup/rollup-android-arm-eabi': 4.34.8 2253 | '@rollup/rollup-android-arm64': 4.34.8 2254 | '@rollup/rollup-darwin-arm64': 4.34.8 2255 | '@rollup/rollup-darwin-x64': 4.34.8 2256 | '@rollup/rollup-freebsd-arm64': 4.34.8 2257 | '@rollup/rollup-freebsd-x64': 4.34.8 2258 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 2259 | '@rollup/rollup-linux-arm-musleabihf': 4.34.8 2260 | '@rollup/rollup-linux-arm64-gnu': 4.34.8 2261 | '@rollup/rollup-linux-arm64-musl': 4.34.8 2262 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 2263 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 2264 | '@rollup/rollup-linux-riscv64-gnu': 4.34.8 2265 | '@rollup/rollup-linux-s390x-gnu': 4.34.8 2266 | '@rollup/rollup-linux-x64-gnu': 4.34.8 2267 | '@rollup/rollup-linux-x64-musl': 4.34.8 2268 | '@rollup/rollup-win32-arm64-msvc': 4.34.8 2269 | '@rollup/rollup-win32-ia32-msvc': 4.34.8 2270 | '@rollup/rollup-win32-x64-msvc': 4.34.8 2271 | fsevents: 2.3.3 2272 | 2273 | run-parallel@1.2.0: 2274 | dependencies: 2275 | queue-microtask: 1.2.3 2276 | 2277 | scheduler@0.25.0: {} 2278 | 2279 | semver@6.3.1: {} 2280 | 2281 | semver@7.7.1: {} 2282 | 2283 | shebang-command@2.0.0: 2284 | dependencies: 2285 | shebang-regex: 3.0.0 2286 | 2287 | shebang-regex@3.0.0: {} 2288 | 2289 | source-map-js@1.2.1: {} 2290 | 2291 | strip-json-comments@3.1.1: {} 2292 | 2293 | supports-color@7.2.0: 2294 | dependencies: 2295 | has-flag: 4.0.0 2296 | 2297 | tailwindcss@4.0.8: {} 2298 | 2299 | tapable@2.2.1: {} 2300 | 2301 | to-regex-range@5.0.1: 2302 | dependencies: 2303 | is-number: 7.0.0 2304 | 2305 | ts-api-utils@2.0.1(typescript@5.7.3): 2306 | dependencies: 2307 | typescript: 5.7.3 2308 | 2309 | type-check@0.4.0: 2310 | dependencies: 2311 | prelude-ls: 1.2.1 2312 | 2313 | typescript-eslint@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3): 2314 | dependencies: 2315 | '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 2316 | '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 2317 | '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3) 2318 | eslint: 9.21.0(jiti@2.4.2) 2319 | typescript: 5.7.3 2320 | transitivePeerDependencies: 2321 | - supports-color 2322 | 2323 | typescript@5.7.3: {} 2324 | 2325 | update-browserslist-db@1.1.2(browserslist@4.24.4): 2326 | dependencies: 2327 | browserslist: 4.24.4 2328 | escalade: 3.2.0 2329 | picocolors: 1.1.1 2330 | 2331 | uri-js@4.4.1: 2332 | dependencies: 2333 | punycode: 2.3.1 2334 | 2335 | vite@6.1.1(jiti@2.4.2)(lightningcss@1.29.1): 2336 | dependencies: 2337 | esbuild: 0.24.2 2338 | postcss: 8.5.3 2339 | rollup: 4.34.8 2340 | optionalDependencies: 2341 | fsevents: 2.3.3 2342 | jiti: 2.4.2 2343 | lightningcss: 1.29.1 2344 | 2345 | which@2.0.2: 2346 | dependencies: 2347 | isexe: 2.0.0 2348 | 2349 | word-wrap@1.2.5: {} 2350 | 2351 | yallist@3.1.1: {} 2352 | 2353 | yocto-queue@0.1.0: {} 2354 | -------------------------------------------------------------------------------- /public/dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/block-stacker/react-portfolio-template/19da14b7244433392d45f7195e67a7f777f98acc/public/dev.png -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import Homepage from "./pages/homepage" 2 | 3 | 4 | function App() { 5 | return ( 6 | 7 | ) 8 | } 9 | 10 | export default App 11 | -------------------------------------------------------------------------------- /src/components/button/index.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import cn from "classnames"; 3 | 4 | interface ButtonProps { 5 | label: string; 6 | href?: string; 7 | onClick?: () => void; 8 | icon?: ReactNode; 9 | } 10 | 11 | export function PrimaryButton({ label, icon, href }: ButtonProps) { 12 | return href ? ( 13 | 20 | {icon} 21 | {label} 22 | 23 | ) : ( 24 | 33 | ) 34 | } 35 | 36 | export function SecondaryButton({ label, icon, href, onClick }: ButtonProps) { 37 | return href ? ( 38 | 39 | {icon} 40 | {label} 41 | 42 | ) : ( 43 | 50 | ) 51 | } -------------------------------------------------------------------------------- /src/configs/portfolio.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Your Name", 3 | "bio": "I am a passionate full stack developer with over 8 years of experience building dynamic, user-focused web applications. I’m proficient in both front-end and back-end technologies, excelling at crafting seamless experiences using tools like React, Node.js, and PostgreSQL. With a keen eye for design and a knack for solving complex problems, I’ve contributed to projects ranging from sleek e-commerce platforms to robust enterprise solutions. When I’m not coding, I enjoy mentoring junior developers, exploring the latest tech trends, and sipping coffee while debugging late into the night.", 4 | "contacts": { 5 | "phone": "+1 2222 333 4444", 6 | "email": "for@example.com", 7 | "github": "https://github.com/your-username", 8 | "twitter": "https://x.com/your-username", 9 | "telegram": "https://t.me/your-username", 10 | "discord": "your-username", 11 | "linkedin": "https://linkedin.com/in/your-username" 12 | }, 13 | "education": { 14 | "logo": "https://picsum.photos/id/231/300/300", 15 | "degree": "Your Degree", 16 | "university": "Your University", 17 | "location": "Location", 18 | "graduation": "2012/05/01 00:00:00", 19 | "courseWork": [ 20 | "Algorithms" 21 | ], 22 | "project": "Your senior project" 23 | }, 24 | "meetingLink": "https://meet.google.com", 25 | "skills": { 26 | "languages": [ 27 | "JavaScript" 28 | ], 29 | "frameworks": [ 30 | "React", 31 | "Next.js", 32 | "Nest.js" 33 | ] 34 | }, 35 | "projects": [ 36 | { 37 | "name": "Project1", 38 | "link": "https://project1.link", 39 | "logo": "https://picsum.photos/id/232/300/300", 40 | "description": "Lorem Ipsum dolor sit amet, consectetur adipiscing elit. Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Lorem Ipsum duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Lorem Ipsum excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 41 | "skills": [ 42 | "React", 43 | "TypeScript", 44 | "Tailwind CSS" 45 | ] 46 | }, 47 | { 48 | "name": "Project2", 49 | "link": "https://project2.link", 50 | "logo": "https://picsum.photos/id/233/300/300", 51 | "description": "Lorem Ipsum dolor sit amet, consectetur adipiscing elit. Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Lorem Ipsum duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Lorem Ipsum excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 52 | "skills": [ 53 | "React", 54 | "TypeScript", 55 | "Tailwind CSS" 56 | ] 57 | }, 58 | { 59 | "name": "Project3", 60 | "link": "https://project3.link", 61 | "logo": "https://picsum.photos/id/234/300/300", 62 | "description": "Lorem Ipsum dolor sit amet, consectetur adipiscing elit. Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Lorem Ipsum duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Lorem Ipsum excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 63 | "skills": [ 64 | "React", 65 | "TypeScript", 66 | "Tailwind CSS" 67 | ] 68 | }, 69 | { 70 | "name": "Project4", 71 | "link": "https://project4.link", 72 | "logo": "https://picsum.photos/id/235/300/300", 73 | "description": "Lorem Ipsum dolor sit amet, consectetur adipiscing elit. Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Lorem Ipsum duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Lorem Ipsum excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 74 | "skills": [ 75 | "React", 76 | "TypeScript", 77 | "Tailwind CSS" 78 | ] 79 | } 80 | ], 81 | "experience": [ 82 | { 83 | "from": 1730347070000, 84 | "to": 1740347070445, 85 | "company": "Microsft", 86 | "role": "Senior Software Engineer", 87 | "logo": "https://companiesmarketcap.com/img/company-logos/64/MSFT.webp", 88 | "descriptions": [ 89 | "Lorem Ipsum dolor sit amet, consectetur adipiscing elit.", 90 | "Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 91 | "Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 92 | ] 93 | }, 94 | { 95 | "from": 1730347070000, 96 | "to": 1740347070445, 97 | "company": "Microsft", 98 | "role": "Senior Software Engineer", 99 | "logo": "https://companiesmarketcap.com/img/company-logos/64/GOOG.webp", 100 | "descriptions": [ 101 | "Lorem Ipsum dolor sit amet, consectetur adipiscing elit.", 102 | "Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 103 | "Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 104 | ] 105 | }, 106 | { 107 | "from": 1730347070000, 108 | "to": 1740347070445, 109 | "company": "Nvidia", 110 | "role": "Senior Software Engineer", 111 | "logo": "https://companiesmarketcap.com/img/company-logos/64/NVDA.webp", 112 | "descriptions": [ 113 | "Lorem Ipsum dolor sit amet, consectetur adipiscing elit.", 114 | "Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 115 | "Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 116 | ] 117 | }, 118 | { 119 | "from": 1730347070000, 120 | "to": 1740347070445, 121 | "company": "Tesla", 122 | "role": "Senior Software Engineer", 123 | "logo": "https://companiesmarketcap.com/img/company-logos/64/TSLA.webp", 124 | "descriptions": [ 125 | "Lorem Ipsum dolor sit amet, consectetur adipiscing elit.", 126 | "Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 127 | "Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 128 | ] 129 | }, 130 | { 131 | "from": 1730347070000, 132 | "to": 1740347070445, 133 | "company": "Oracle", 134 | "role": "Senior Software Engineer", 135 | "logo": "https://companiesmarketcap.com/img/company-logos/64/ORCL.webp", 136 | "descriptions": [ 137 | "Lorem Ipsum dolor sit amet, consectetur adipiscing elit.", 138 | "Lorem Ipsum sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 139 | "Lorem Ipsum ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 140 | ] 141 | } 142 | ] 143 | } -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | 3 | :root { 4 | font-family: "Inter", "Geist", system-ui, Avenir, Helvetica, Arial, sans-serif; 5 | line-height: 1.5; 6 | font-weight: 400; 7 | 8 | color-scheme: light dark; 9 | color: rgba(255, 255, 255, 0.87); 10 | 11 | font-synthesis: none; 12 | text-rendering: optimizeLegibility; 13 | -webkit-font-smoothing: antialiased; 14 | -moz-osx-font-smoothing: grayscale; 15 | } 16 | 17 | html { 18 | scroll-behavior: smooth; 19 | } -------------------------------------------------------------------------------- /src/layouts/header.tsx: -------------------------------------------------------------------------------- 1 | import { FaAward, FaBrain, FaGraduationCap, FaHome, FaPaperPlane, FaProjectDiagram } from 'react-icons/fa'; 2 | import WrapperBody from './wrapper'; 3 | import { SecondaryButton } from '../components/button'; 4 | import { DiReact } from 'react-icons/di'; 5 | 6 | export default function Header() { 7 | const scrollTo = (elementId: string) => { 8 | const targetElement = document.querySelector(elementId); 9 | if (!targetElement) return; 10 | const headerHeight = 64; 11 | const elementPosition = targetElement.getBoundingClientRect().top + window.scrollY; 12 | const offsetPosition = elementPosition - headerHeight; 13 | 14 | window.scrollTo({ 15 | top: offsetPosition, 16 | behavior: 'smooth' 17 | }); 18 | }; 19 | 20 | return ( 21 |
22 | 23 |
24 | 25 | Vite.Dev 26 | 27 |
28 | scrollTo('#bio')} label="Bio" icon={} /> 29 | scrollTo('#education')} label="Education" icon={} /> 30 | scrollTo('#experience')} label="Experience" icon={} /> 31 | scrollTo('#projects')} label="Projects" icon={} /> 32 | scrollTo('#skills')} label="Skills" icon={} /> 33 | scrollTo('#contacts')} label="Contacts" icon={} /> 34 |
35 |
36 |
37 |
38 | ) 39 | } -------------------------------------------------------------------------------- /src/layouts/index.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import Header from "./header"; 3 | 4 | export default function Layout({ children }: { children: ReactNode | Array }) { 5 | return ( 6 |
7 |
8 |
9 | {children} 10 |
11 |
12 | ) 13 | } -------------------------------------------------------------------------------- /src/layouts/wrapper.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export default function WrapperBody({ children }: { children: ReactNode | Array }) { 4 | return ( 5 |
6 | {children} 7 |
8 | ) 9 | } -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import './index.css' 4 | import App from './App.tsx' 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /src/pages/homepage/Bio.tsx: -------------------------------------------------------------------------------- 1 | import { PrimaryButton, SecondaryButton } from "../../components/button"; 2 | import profile from "../../configs/portfolio.json"; 3 | import WrapperBody from "../../layouts/wrapper"; 4 | 5 | export default function Bio() { 6 | return ( 7 |
8 | 9 |
10 |

👋 I'm {profile.name}

11 |

{profile.bio}

12 |
13 |
14 | 15 | 16 |
17 |
18 |
19 | ); 20 | } -------------------------------------------------------------------------------- /src/pages/homepage/Contacts.tsx: -------------------------------------------------------------------------------- 1 | import WrapperBody from "../../layouts/wrapper"; 2 | import profile from "../../configs/portfolio.json"; 3 | import { FaDiscord, FaEnvelope, FaGithub, FaLinkedin, FaPaperPlane, FaPhone, FaTelegram, FaTwitter } from "react-icons/fa"; 4 | 5 | export default function Contacts() { 6 | return ( 7 |
8 | 9 |
10 |

Contacts

11 |
12 |
13 | 14 | {profile.contacts.email} 15 |
16 |
17 | 18 | {profile.contacts.phone} 19 |
20 |
21 | 22 | {profile.contacts.twitter} 23 |
24 |
25 | 26 | {profile.contacts.linkedin} 27 |
28 |
29 | 30 | {profile.contacts.github} 31 |
32 |
33 | 34 | {profile.contacts.telegram} 35 |
36 |
37 | 38 | {profile.contacts.discord} 39 |
40 |
41 |
42 |
43 |
44 | ) 45 | } -------------------------------------------------------------------------------- /src/pages/homepage/Education.tsx: -------------------------------------------------------------------------------- 1 | import WrapperBody from "../../layouts/wrapper"; 2 | import profile from "../../configs/portfolio.json"; 3 | import { FaGraduationCap } from "react-icons/fa"; 4 | import dayjs from "dayjs"; 5 | 6 | export default function Education() { 7 | return ( 8 |
9 | 10 |
11 |

Education

12 |
13 |
14 | university-logo 15 |

{profile.education.university}

16 |

17 |

Location:

18 | {profile.education.location} 19 |

20 |

21 |

Degree:

22 | {profile.education.degree} 23 |

24 |

25 |

Graduated:

26 | {dayjs(profile.education.graduation).format("MMM YYYY")} 27 |

28 |

29 |

Relevant Coursework:

30 | {profile.education.courseWork.join(', ')} 31 |

32 |

33 |

Senior Project:

34 | {profile.education.project} 35 |

36 |
37 |
38 |
39 |
40 |
41 | ) 42 | } -------------------------------------------------------------------------------- /src/pages/homepage/Experience.tsx: -------------------------------------------------------------------------------- 1 | import WrapperBody from "../../layouts/wrapper"; 2 | import profile from "../../configs/portfolio.json"; 3 | import { FaAward } from "react-icons/fa"; 4 | import dayjs from "dayjs"; 5 | 6 | export default function Experience() { 7 | return ( 8 |
9 | 10 |
11 |

Experience

12 |
13 | {profile.experience.map((experience) => ( 14 |
18 |
19 | logo 20 |

21 | {experience.company} 22 |

23 |
24 |
25 |
26 |

{experience.role}

27 |

28 | {dayjs(experience.from).format('MMM YYYY')} ~ {experience.to === 'present' ? 'Present' : dayjs(experience.to).format('MMM YYYY')} 29 |

30 |
31 |
    32 | {experience.descriptions.map((description, index) => ( 33 |
  • 34 | {description} 35 |
  • 36 | ))} 37 |
38 |
39 |
40 | ))} 41 |
42 |
43 |
44 |
45 | ) 46 | } -------------------------------------------------------------------------------- /src/pages/homepage/Projects.tsx: -------------------------------------------------------------------------------- 1 | import WrapperBody from "../../layouts/wrapper"; 2 | import profile from "../../configs/portfolio.json"; 3 | import { FaProjectDiagram } from "react-icons/fa"; 4 | 5 | export default function Projects() { 6 | return ( 7 |
8 | 9 |
10 |

Projects

11 |
12 | {profile.projects.map((project) => ( 13 |
17 |
18 | logo 19 |

{project.name}

20 | {project.link} 21 |

{project.description}

22 |
23 |
24 | {project.skills?.map((skill) => ( 25 |

{skill}

26 | ))} 27 |
28 |
29 | ))} 30 |
31 |
32 |
33 |
34 | ) 35 | } -------------------------------------------------------------------------------- /src/pages/homepage/Skills.tsx: -------------------------------------------------------------------------------- 1 | import WrapperBody from "../../layouts/wrapper"; 2 | import profile from "../../configs/portfolio.json"; 3 | import { FaBrain } from "react-icons/fa"; 4 | 5 | export default function Skills() { 6 | const skillSection = (skillName: string, skills: Array) => ( 7 |
8 |

{skillName}

9 | {skills.map((skill) => ( 10 |
11 |

{skill}

12 |
13 | ))} 14 |
15 | ); 16 | return ( 17 |
18 | 19 |
20 |

Skills

21 | {skillSection("Language", profile.skills.languages)} 22 | {skillSection("Frameworks", profile.skills.frameworks)} 23 |
24 |
25 |
26 | ) 27 | } -------------------------------------------------------------------------------- /src/pages/homepage/index.tsx: -------------------------------------------------------------------------------- 1 | import Layout from "../../layouts"; 2 | import Bio from "./Bio"; 3 | import Contacts from "./Contacts"; 4 | import Education from "./Education"; 5 | import Experience from "./Experience"; 6 | import Projects from "./Projects"; 7 | import Skills from "./Skills"; 8 | 9 | export default function Homepage() { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ) 20 | } -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2020", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "isolatedModules": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "noUncheckedSideEffectImports": true 24 | }, 25 | "include": ["src"] 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | import tailwindcss from "@tailwindcss/vite"; 4 | 5 | // https://vite.dev/config/ 6 | export default defineConfig({ 7 | plugins: [react(), tailwindcss()], 8 | }); 9 | --------------------------------------------------------------------------------