├── .gitignore ├── README.md ├── bun.lockb ├── components.json ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public └── vite.svg ├── src ├── App.css ├── App.tsx ├── AppHookContainer.tsx ├── AppRouter.tsx ├── ErrorBoundary.tsx ├── assets │ └── react.svg ├── components │ ├── Button │ │ ├── Button.css │ │ └── Button.tsx │ ├── ErrorBoundaryExamples │ │ ├── EffectExample.tsx │ │ ├── PromiseError.tsx │ │ ├── UndefinedExample.tsx │ │ └── index.ts │ ├── Form │ │ └── Form.tsx │ ├── Modal │ │ ├── Modal.css │ │ ├── Modal.tsx │ │ └── context │ │ │ ├── ModalContext.tsx │ │ │ ├── UseModalContext.ts │ │ │ └── index.ts │ ├── RoutesWithNotFound │ │ └── RoutesWithNotFound.tsx │ ├── UseCallback │ │ └── PhoneBook.tsx │ ├── UseMemo │ │ └── ShoppingCart.tsx │ ├── UseRef │ │ ├── BookReader.tsx │ │ ├── FocusInput.tsx │ │ └── index.ts │ └── index.ts ├── context │ ├── global.context.ts │ └── global.provider.tsx ├── guard │ └── PrivateGuard.tsx ├── hooks │ ├── index.ts │ ├── useApi.ts │ └── useFetch.ts ├── index.css ├── main.tsx ├── models │ ├── character.model.ts │ ├── index.ts │ ├── routes.model.ts │ ├── useApi.model.ts │ └── user.model.ts ├── private │ ├── Dashboard │ │ └── Dashboard.tsx │ └── PrivateRouter.tsx ├── public │ └── Login │ │ └── Login.tsx ├── services │ ├── api.service.ts │ ├── axios.service.ts │ ├── index.ts │ └── share-value-children.service.ts ├── utilities │ ├── index.ts │ └── loadAbort.utility.ts └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ¡Bienvenidos a mi Curso de React en Vivo! 2 | 3 | 4 | Este repositorio es donde la magia sucede. Aquí documentaré cada paso de mi curso de React, transmitido en vivo para que aprendamos juntos. Usaremos Bun, Vite.js, TypeScript y React para construir aplicaciones increíbles, ¡y tú serás parte del proceso! 5 | 6 | ### Estructura del Repositorio 7 | 8 | * **Commits:** Cada commit representa una lección, un concepto clave o un momento épico de nuestras sesiones en vivo. 9 | 10 | * **Branches:** Las branches principales se organizan por secciones o módulos del curso, con nombres como `clase-01`, `clase-02`, etc. 11 | * **Código:** El código fuente de nuestras creaciones con React, construido con Bun, Vite.js, TypeScript y React, evolucionará en la rama principal a medida que avancemos juntos. 12 | 13 | 14 | ### Redes 15 | 16 | [https://doras.to/gentleman-programming](https://doras.to/gentleman-programming) 17 | 18 | ### Cómo Sacarle el Máximo Provecho 19 | 20 | 1. **Clona el repositorio:** `git clone https://docs.github.com/es/repositories` 21 | 2. **Instala las dependencias:** `bun install` 22 | 3. **¡Únete a mis streams!** Sígueme en YouTube, Kick y Twitch para no perderte ninguna sesión en vivo (link arriba). 23 | 4. **Explora las branches:** `git checkout clase-XX` (reemplaza XX con el número de clase que te interese) 24 | 5. **Revisa los commits:** `git log` para ver la historia de nuestro progreso juntos. 25 | 6. **¡Pregunta, comenta, participa!** Este curso es interactivo, ¡así que no te quedes con dudas! 26 | 27 | ### Contribuciones 28 | 29 | 30 | Aunque este repositorio es principalmente para documentar el curso, si tienes alguna sugerencia, corrección o mejora ¡no dudes en abrir un issue o pull request! ¡Tu aporte es valioso! 31 | 32 | **¡Nos vemos en los streams! ¡Vamos a dominar React juntos!** 🚀 33 | 34 | -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gentleman-Programming/React-Desde-0-a-Avanzado/d8640cbde165b46f450bd3f227042acc8d150dcb/bun.lockb -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/index.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /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 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gentlemanreact", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "gentlemanreact", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@mantine/core": "^7.12.2", 12 | "@mantine/hooks": "^7.12.2", 13 | "@radix-ui/react-icons": "^1.3.0", 14 | "@radix-ui/react-menubar": "^1.1.1", 15 | "@radix-ui/react-slot": "^1.1.0", 16 | "@tabler/icons-react": "^3.14.0", 17 | "axios": "^1.7.7", 18 | "class-variance-authority": "^0.7.0", 19 | "clsx": "^2.1.1", 20 | "lucide-react": "^0.439.0", 21 | "react": "^18.3.1", 22 | "react-dom": "^18.3.1", 23 | "react-router-dom": "^6.27.0", 24 | "tailwind-merge": "^2.5.2", 25 | "tailwindcss-animate": "^1.0.7" 26 | }, 27 | "devDependencies": { 28 | "@eslint/js": "^9.9.0", 29 | "@types/node": "^22.7.6", 30 | "@types/react": "^18.3.3", 31 | "@types/react-dom": "^18.3.0", 32 | "@vitejs/plugin-react-swc": "^3.5.0", 33 | "autoprefixer": "^10.4.20", 34 | "eslint": "^9.9.0", 35 | "eslint-plugin-react-hooks": "^5.1.0-rc.0", 36 | "eslint-plugin-react-refresh": "^0.4.9", 37 | "globals": "^15.9.0", 38 | "postcss": "^8.4.45", 39 | "tailwindcss": "^3.4.10", 40 | "typescript": "^5.5.3", 41 | "typescript-eslint": "^8.0.1", 42 | "vite": "^5.4.1" 43 | } 44 | }, 45 | "node_modules/@alloc/quick-lru": { 46 | "version": "5.2.0", 47 | "license": "MIT", 48 | "engines": { 49 | "node": ">=10" 50 | }, 51 | "funding": { 52 | "url": "https://github.com/sponsors/sindresorhus" 53 | } 54 | }, 55 | "node_modules/@babel/runtime": { 56 | "version": "7.25.6", 57 | "license": "MIT", 58 | "dependencies": { 59 | "regenerator-runtime": "^0.14.0" 60 | }, 61 | "engines": { 62 | "node": ">=6.9.0" 63 | } 64 | }, 65 | "node_modules/@esbuild/linux-x64": { 66 | "version": "0.21.5", 67 | "cpu": [ 68 | "x64" 69 | ], 70 | "dev": true, 71 | "license": "MIT", 72 | "optional": true, 73 | "os": [ 74 | "linux" 75 | ], 76 | "engines": { 77 | "node": ">=12" 78 | } 79 | }, 80 | "node_modules/@eslint-community/eslint-utils": { 81 | "version": "4.4.0", 82 | "dev": true, 83 | "license": "MIT", 84 | "dependencies": { 85 | "eslint-visitor-keys": "^3.3.0" 86 | }, 87 | "engines": { 88 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 89 | }, 90 | "peerDependencies": { 91 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 92 | } 93 | }, 94 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 95 | "version": "3.4.3", 96 | "dev": true, 97 | "license": "Apache-2.0", 98 | "engines": { 99 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 100 | }, 101 | "funding": { 102 | "url": "https://opencollective.com/eslint" 103 | } 104 | }, 105 | "node_modules/@eslint-community/regexpp": { 106 | "version": "4.11.0", 107 | "dev": true, 108 | "license": "MIT", 109 | "engines": { 110 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 111 | } 112 | }, 113 | "node_modules/@eslint/config-array": { 114 | "version": "0.18.0", 115 | "dev": true, 116 | "license": "Apache-2.0", 117 | "dependencies": { 118 | "@eslint/object-schema": "^2.1.4", 119 | "debug": "^4.3.1", 120 | "minimatch": "^3.1.2" 121 | }, 122 | "engines": { 123 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 124 | } 125 | }, 126 | "node_modules/@eslint/eslintrc": { 127 | "version": "3.1.0", 128 | "dev": true, 129 | "license": "MIT", 130 | "dependencies": { 131 | "ajv": "^6.12.4", 132 | "debug": "^4.3.2", 133 | "espree": "^10.0.1", 134 | "globals": "^14.0.0", 135 | "ignore": "^5.2.0", 136 | "import-fresh": "^3.2.1", 137 | "js-yaml": "^4.1.0", 138 | "minimatch": "^3.1.2", 139 | "strip-json-comments": "^3.1.1" 140 | }, 141 | "engines": { 142 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 143 | }, 144 | "funding": { 145 | "url": "https://opencollective.com/eslint" 146 | } 147 | }, 148 | "node_modules/@eslint/eslintrc/node_modules/globals": { 149 | "version": "14.0.0", 150 | "dev": true, 151 | "license": "MIT", 152 | "engines": { 153 | "node": ">=18" 154 | }, 155 | "funding": { 156 | "url": "https://github.com/sponsors/sindresorhus" 157 | } 158 | }, 159 | "node_modules/@eslint/js": { 160 | "version": "9.9.1", 161 | "dev": true, 162 | "license": "MIT", 163 | "engines": { 164 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 165 | } 166 | }, 167 | "node_modules/@eslint/object-schema": { 168 | "version": "2.1.4", 169 | "dev": true, 170 | "license": "Apache-2.0", 171 | "engines": { 172 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 173 | } 174 | }, 175 | "node_modules/@floating-ui/core": { 176 | "version": "1.6.7", 177 | "license": "MIT", 178 | "dependencies": { 179 | "@floating-ui/utils": "^0.2.7" 180 | } 181 | }, 182 | "node_modules/@floating-ui/dom": { 183 | "version": "1.6.10", 184 | "license": "MIT", 185 | "dependencies": { 186 | "@floating-ui/core": "^1.6.0", 187 | "@floating-ui/utils": "^0.2.7" 188 | } 189 | }, 190 | "node_modules/@floating-ui/react": { 191 | "version": "0.26.23", 192 | "license": "MIT", 193 | "dependencies": { 194 | "@floating-ui/react-dom": "^2.1.1", 195 | "@floating-ui/utils": "^0.2.7", 196 | "tabbable": "^6.0.0" 197 | }, 198 | "peerDependencies": { 199 | "react": ">=16.8.0", 200 | "react-dom": ">=16.8.0" 201 | } 202 | }, 203 | "node_modules/@floating-ui/react-dom": { 204 | "version": "2.1.1", 205 | "license": "MIT", 206 | "dependencies": { 207 | "@floating-ui/dom": "^1.0.0" 208 | }, 209 | "peerDependencies": { 210 | "react": ">=16.8.0", 211 | "react-dom": ">=16.8.0" 212 | } 213 | }, 214 | "node_modules/@floating-ui/utils": { 215 | "version": "0.2.7", 216 | "license": "MIT" 217 | }, 218 | "node_modules/@humanwhocodes/module-importer": { 219 | "version": "1.0.1", 220 | "dev": true, 221 | "license": "Apache-2.0", 222 | "engines": { 223 | "node": ">=12.22" 224 | }, 225 | "funding": { 226 | "type": "github", 227 | "url": "https://github.com/sponsors/nzakas" 228 | } 229 | }, 230 | "node_modules/@humanwhocodes/retry": { 231 | "version": "0.3.0", 232 | "dev": true, 233 | "license": "Apache-2.0", 234 | "engines": { 235 | "node": ">=18.18" 236 | }, 237 | "funding": { 238 | "type": "github", 239 | "url": "https://github.com/sponsors/nzakas" 240 | } 241 | }, 242 | "node_modules/@isaacs/cliui": { 243 | "version": "8.0.2", 244 | "license": "ISC", 245 | "dependencies": { 246 | "string-width": "^5.1.2", 247 | "string-width-cjs": "npm:string-width@^4.2.0", 248 | "strip-ansi": "^7.0.1", 249 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 250 | "wrap-ansi": "^8.1.0", 251 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 252 | }, 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 258 | "version": "7.1.0", 259 | "license": "MIT", 260 | "dependencies": { 261 | "ansi-regex": "^6.0.1" 262 | }, 263 | "engines": { 264 | "node": ">=12" 265 | }, 266 | "funding": { 267 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 268 | } 269 | }, 270 | "node_modules/@isaacs/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { 271 | "version": "6.0.1", 272 | "license": "MIT", 273 | "engines": { 274 | "node": ">=12" 275 | }, 276 | "funding": { 277 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 278 | } 279 | }, 280 | "node_modules/@jridgewell/gen-mapping": { 281 | "version": "0.3.5", 282 | "license": "MIT", 283 | "dependencies": { 284 | "@jridgewell/set-array": "^1.2.1", 285 | "@jridgewell/sourcemap-codec": "^1.4.10", 286 | "@jridgewell/trace-mapping": "^0.3.24" 287 | }, 288 | "engines": { 289 | "node": ">=6.0.0" 290 | } 291 | }, 292 | "node_modules/@jridgewell/resolve-uri": { 293 | "version": "3.1.2", 294 | "license": "MIT", 295 | "engines": { 296 | "node": ">=6.0.0" 297 | } 298 | }, 299 | "node_modules/@jridgewell/set-array": { 300 | "version": "1.2.1", 301 | "license": "MIT", 302 | "engines": { 303 | "node": ">=6.0.0" 304 | } 305 | }, 306 | "node_modules/@jridgewell/sourcemap-codec": { 307 | "version": "1.5.0", 308 | "license": "MIT" 309 | }, 310 | "node_modules/@jridgewell/trace-mapping": { 311 | "version": "0.3.25", 312 | "license": "MIT", 313 | "dependencies": { 314 | "@jridgewell/resolve-uri": "^3.1.0", 315 | "@jridgewell/sourcemap-codec": "^1.4.14" 316 | } 317 | }, 318 | "node_modules/@mantine/core": { 319 | "version": "7.12.2", 320 | "license": "MIT", 321 | "dependencies": { 322 | "@floating-ui/react": "^0.26.9", 323 | "clsx": "^2.1.1", 324 | "react-number-format": "^5.3.1", 325 | "react-remove-scroll": "^2.5.7", 326 | "react-textarea-autosize": "8.5.3", 327 | "type-fest": "^4.12.0" 328 | }, 329 | "peerDependencies": { 330 | "@mantine/hooks": "7.12.2", 331 | "react": "^18.2.0", 332 | "react-dom": "^18.2.0" 333 | } 334 | }, 335 | "node_modules/@mantine/hooks": { 336 | "version": "7.12.2", 337 | "license": "MIT", 338 | "peerDependencies": { 339 | "react": "^18.2.0" 340 | } 341 | }, 342 | "node_modules/@nodelib/fs.scandir": { 343 | "version": "2.1.5", 344 | "license": "MIT", 345 | "dependencies": { 346 | "@nodelib/fs.stat": "2.0.5", 347 | "run-parallel": "^1.1.9" 348 | }, 349 | "engines": { 350 | "node": ">= 8" 351 | } 352 | }, 353 | "node_modules/@nodelib/fs.stat": { 354 | "version": "2.0.5", 355 | "license": "MIT", 356 | "engines": { 357 | "node": ">= 8" 358 | } 359 | }, 360 | "node_modules/@nodelib/fs.walk": { 361 | "version": "1.2.8", 362 | "license": "MIT", 363 | "dependencies": { 364 | "@nodelib/fs.scandir": "2.1.5", 365 | "fastq": "^1.6.0" 366 | }, 367 | "engines": { 368 | "node": ">= 8" 369 | } 370 | }, 371 | "node_modules/@pkgjs/parseargs": { 372 | "version": "0.11.0", 373 | "license": "MIT", 374 | "optional": true, 375 | "engines": { 376 | "node": ">=14" 377 | } 378 | }, 379 | "node_modules/@radix-ui/primitive": { 380 | "version": "1.1.0", 381 | "license": "MIT" 382 | }, 383 | "node_modules/@radix-ui/react-arrow": { 384 | "version": "1.1.0", 385 | "license": "MIT", 386 | "dependencies": { 387 | "@radix-ui/react-primitive": "2.0.0" 388 | }, 389 | "peerDependencies": { 390 | "@types/react": "*", 391 | "@types/react-dom": "*", 392 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 393 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 394 | }, 395 | "peerDependenciesMeta": { 396 | "@types/react": { 397 | "optional": true 398 | }, 399 | "@types/react-dom": { 400 | "optional": true 401 | } 402 | } 403 | }, 404 | "node_modules/@radix-ui/react-collection": { 405 | "version": "1.1.0", 406 | "license": "MIT", 407 | "dependencies": { 408 | "@radix-ui/react-compose-refs": "1.1.0", 409 | "@radix-ui/react-context": "1.1.0", 410 | "@radix-ui/react-primitive": "2.0.0", 411 | "@radix-ui/react-slot": "1.1.0" 412 | }, 413 | "peerDependencies": { 414 | "@types/react": "*", 415 | "@types/react-dom": "*", 416 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 417 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 418 | }, 419 | "peerDependenciesMeta": { 420 | "@types/react": { 421 | "optional": true 422 | }, 423 | "@types/react-dom": { 424 | "optional": true 425 | } 426 | } 427 | }, 428 | "node_modules/@radix-ui/react-compose-refs": { 429 | "version": "1.1.0", 430 | "license": "MIT", 431 | "peerDependencies": { 432 | "@types/react": "*", 433 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 434 | }, 435 | "peerDependenciesMeta": { 436 | "@types/react": { 437 | "optional": true 438 | } 439 | } 440 | }, 441 | "node_modules/@radix-ui/react-context": { 442 | "version": "1.1.0", 443 | "license": "MIT", 444 | "peerDependencies": { 445 | "@types/react": "*", 446 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 447 | }, 448 | "peerDependenciesMeta": { 449 | "@types/react": { 450 | "optional": true 451 | } 452 | } 453 | }, 454 | "node_modules/@radix-ui/react-direction": { 455 | "version": "1.1.0", 456 | "license": "MIT", 457 | "peerDependencies": { 458 | "@types/react": "*", 459 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 460 | }, 461 | "peerDependenciesMeta": { 462 | "@types/react": { 463 | "optional": true 464 | } 465 | } 466 | }, 467 | "node_modules/@radix-ui/react-dismissable-layer": { 468 | "version": "1.1.0", 469 | "license": "MIT", 470 | "dependencies": { 471 | "@radix-ui/primitive": "1.1.0", 472 | "@radix-ui/react-compose-refs": "1.1.0", 473 | "@radix-ui/react-primitive": "2.0.0", 474 | "@radix-ui/react-use-callback-ref": "1.1.0", 475 | "@radix-ui/react-use-escape-keydown": "1.1.0" 476 | }, 477 | "peerDependencies": { 478 | "@types/react": "*", 479 | "@types/react-dom": "*", 480 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 481 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 482 | }, 483 | "peerDependenciesMeta": { 484 | "@types/react": { 485 | "optional": true 486 | }, 487 | "@types/react-dom": { 488 | "optional": true 489 | } 490 | } 491 | }, 492 | "node_modules/@radix-ui/react-focus-guards": { 493 | "version": "1.1.0", 494 | "license": "MIT", 495 | "peerDependencies": { 496 | "@types/react": "*", 497 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 498 | }, 499 | "peerDependenciesMeta": { 500 | "@types/react": { 501 | "optional": true 502 | } 503 | } 504 | }, 505 | "node_modules/@radix-ui/react-focus-scope": { 506 | "version": "1.1.0", 507 | "license": "MIT", 508 | "dependencies": { 509 | "@radix-ui/react-compose-refs": "1.1.0", 510 | "@radix-ui/react-primitive": "2.0.0", 511 | "@radix-ui/react-use-callback-ref": "1.1.0" 512 | }, 513 | "peerDependencies": { 514 | "@types/react": "*", 515 | "@types/react-dom": "*", 516 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 517 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 518 | }, 519 | "peerDependenciesMeta": { 520 | "@types/react": { 521 | "optional": true 522 | }, 523 | "@types/react-dom": { 524 | "optional": true 525 | } 526 | } 527 | }, 528 | "node_modules/@radix-ui/react-icons": { 529 | "version": "1.3.0", 530 | "license": "MIT", 531 | "peerDependencies": { 532 | "react": "^16.x || ^17.x || ^18.x" 533 | } 534 | }, 535 | "node_modules/@radix-ui/react-id": { 536 | "version": "1.1.0", 537 | "license": "MIT", 538 | "dependencies": { 539 | "@radix-ui/react-use-layout-effect": "1.1.0" 540 | }, 541 | "peerDependencies": { 542 | "@types/react": "*", 543 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 544 | }, 545 | "peerDependenciesMeta": { 546 | "@types/react": { 547 | "optional": true 548 | } 549 | } 550 | }, 551 | "node_modules/@radix-ui/react-menu": { 552 | "version": "2.1.1", 553 | "license": "MIT", 554 | "dependencies": { 555 | "@radix-ui/primitive": "1.1.0", 556 | "@radix-ui/react-collection": "1.1.0", 557 | "@radix-ui/react-compose-refs": "1.1.0", 558 | "@radix-ui/react-context": "1.1.0", 559 | "@radix-ui/react-direction": "1.1.0", 560 | "@radix-ui/react-dismissable-layer": "1.1.0", 561 | "@radix-ui/react-focus-guards": "1.1.0", 562 | "@radix-ui/react-focus-scope": "1.1.0", 563 | "@radix-ui/react-id": "1.1.0", 564 | "@radix-ui/react-popper": "1.2.0", 565 | "@radix-ui/react-portal": "1.1.1", 566 | "@radix-ui/react-presence": "1.1.0", 567 | "@radix-ui/react-primitive": "2.0.0", 568 | "@radix-ui/react-roving-focus": "1.1.0", 569 | "@radix-ui/react-slot": "1.1.0", 570 | "@radix-ui/react-use-callback-ref": "1.1.0", 571 | "aria-hidden": "^1.1.1", 572 | "react-remove-scroll": "2.5.7" 573 | }, 574 | "peerDependencies": { 575 | "@types/react": "*", 576 | "@types/react-dom": "*", 577 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 578 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 579 | }, 580 | "peerDependenciesMeta": { 581 | "@types/react": { 582 | "optional": true 583 | }, 584 | "@types/react-dom": { 585 | "optional": true 586 | } 587 | } 588 | }, 589 | "node_modules/@radix-ui/react-menubar": { 590 | "version": "1.1.1", 591 | "license": "MIT", 592 | "dependencies": { 593 | "@radix-ui/primitive": "1.1.0", 594 | "@radix-ui/react-collection": "1.1.0", 595 | "@radix-ui/react-compose-refs": "1.1.0", 596 | "@radix-ui/react-context": "1.1.0", 597 | "@radix-ui/react-direction": "1.1.0", 598 | "@radix-ui/react-id": "1.1.0", 599 | "@radix-ui/react-menu": "2.1.1", 600 | "@radix-ui/react-primitive": "2.0.0", 601 | "@radix-ui/react-roving-focus": "1.1.0", 602 | "@radix-ui/react-use-controllable-state": "1.1.0" 603 | }, 604 | "peerDependencies": { 605 | "@types/react": "*", 606 | "@types/react-dom": "*", 607 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 608 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 609 | }, 610 | "peerDependenciesMeta": { 611 | "@types/react": { 612 | "optional": true 613 | }, 614 | "@types/react-dom": { 615 | "optional": true 616 | } 617 | } 618 | }, 619 | "node_modules/@radix-ui/react-popper": { 620 | "version": "1.2.0", 621 | "license": "MIT", 622 | "dependencies": { 623 | "@floating-ui/react-dom": "^2.0.0", 624 | "@radix-ui/react-arrow": "1.1.0", 625 | "@radix-ui/react-compose-refs": "1.1.0", 626 | "@radix-ui/react-context": "1.1.0", 627 | "@radix-ui/react-primitive": "2.0.0", 628 | "@radix-ui/react-use-callback-ref": "1.1.0", 629 | "@radix-ui/react-use-layout-effect": "1.1.0", 630 | "@radix-ui/react-use-rect": "1.1.0", 631 | "@radix-ui/react-use-size": "1.1.0", 632 | "@radix-ui/rect": "1.1.0" 633 | }, 634 | "peerDependencies": { 635 | "@types/react": "*", 636 | "@types/react-dom": "*", 637 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 638 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 639 | }, 640 | "peerDependenciesMeta": { 641 | "@types/react": { 642 | "optional": true 643 | }, 644 | "@types/react-dom": { 645 | "optional": true 646 | } 647 | } 648 | }, 649 | "node_modules/@radix-ui/react-portal": { 650 | "version": "1.1.1", 651 | "license": "MIT", 652 | "dependencies": { 653 | "@radix-ui/react-primitive": "2.0.0", 654 | "@radix-ui/react-use-layout-effect": "1.1.0" 655 | }, 656 | "peerDependencies": { 657 | "@types/react": "*", 658 | "@types/react-dom": "*", 659 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 660 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 661 | }, 662 | "peerDependenciesMeta": { 663 | "@types/react": { 664 | "optional": true 665 | }, 666 | "@types/react-dom": { 667 | "optional": true 668 | } 669 | } 670 | }, 671 | "node_modules/@radix-ui/react-presence": { 672 | "version": "1.1.0", 673 | "license": "MIT", 674 | "dependencies": { 675 | "@radix-ui/react-compose-refs": "1.1.0", 676 | "@radix-ui/react-use-layout-effect": "1.1.0" 677 | }, 678 | "peerDependencies": { 679 | "@types/react": "*", 680 | "@types/react-dom": "*", 681 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 682 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 683 | }, 684 | "peerDependenciesMeta": { 685 | "@types/react": { 686 | "optional": true 687 | }, 688 | "@types/react-dom": { 689 | "optional": true 690 | } 691 | } 692 | }, 693 | "node_modules/@radix-ui/react-primitive": { 694 | "version": "2.0.0", 695 | "license": "MIT", 696 | "dependencies": { 697 | "@radix-ui/react-slot": "1.1.0" 698 | }, 699 | "peerDependencies": { 700 | "@types/react": "*", 701 | "@types/react-dom": "*", 702 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 703 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 704 | }, 705 | "peerDependenciesMeta": { 706 | "@types/react": { 707 | "optional": true 708 | }, 709 | "@types/react-dom": { 710 | "optional": true 711 | } 712 | } 713 | }, 714 | "node_modules/@radix-ui/react-roving-focus": { 715 | "version": "1.1.0", 716 | "license": "MIT", 717 | "dependencies": { 718 | "@radix-ui/primitive": "1.1.0", 719 | "@radix-ui/react-collection": "1.1.0", 720 | "@radix-ui/react-compose-refs": "1.1.0", 721 | "@radix-ui/react-context": "1.1.0", 722 | "@radix-ui/react-direction": "1.1.0", 723 | "@radix-ui/react-id": "1.1.0", 724 | "@radix-ui/react-primitive": "2.0.0", 725 | "@radix-ui/react-use-callback-ref": "1.1.0", 726 | "@radix-ui/react-use-controllable-state": "1.1.0" 727 | }, 728 | "peerDependencies": { 729 | "@types/react": "*", 730 | "@types/react-dom": "*", 731 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 732 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 733 | }, 734 | "peerDependenciesMeta": { 735 | "@types/react": { 736 | "optional": true 737 | }, 738 | "@types/react-dom": { 739 | "optional": true 740 | } 741 | } 742 | }, 743 | "node_modules/@radix-ui/react-slot": { 744 | "version": "1.1.0", 745 | "license": "MIT", 746 | "dependencies": { 747 | "@radix-ui/react-compose-refs": "1.1.0" 748 | }, 749 | "peerDependencies": { 750 | "@types/react": "*", 751 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 752 | }, 753 | "peerDependenciesMeta": { 754 | "@types/react": { 755 | "optional": true 756 | } 757 | } 758 | }, 759 | "node_modules/@radix-ui/react-use-callback-ref": { 760 | "version": "1.1.0", 761 | "license": "MIT", 762 | "peerDependencies": { 763 | "@types/react": "*", 764 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 765 | }, 766 | "peerDependenciesMeta": { 767 | "@types/react": { 768 | "optional": true 769 | } 770 | } 771 | }, 772 | "node_modules/@radix-ui/react-use-controllable-state": { 773 | "version": "1.1.0", 774 | "license": "MIT", 775 | "dependencies": { 776 | "@radix-ui/react-use-callback-ref": "1.1.0" 777 | }, 778 | "peerDependencies": { 779 | "@types/react": "*", 780 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 781 | }, 782 | "peerDependenciesMeta": { 783 | "@types/react": { 784 | "optional": true 785 | } 786 | } 787 | }, 788 | "node_modules/@radix-ui/react-use-escape-keydown": { 789 | "version": "1.1.0", 790 | "license": "MIT", 791 | "dependencies": { 792 | "@radix-ui/react-use-callback-ref": "1.1.0" 793 | }, 794 | "peerDependencies": { 795 | "@types/react": "*", 796 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 797 | }, 798 | "peerDependenciesMeta": { 799 | "@types/react": { 800 | "optional": true 801 | } 802 | } 803 | }, 804 | "node_modules/@radix-ui/react-use-layout-effect": { 805 | "version": "1.1.0", 806 | "license": "MIT", 807 | "peerDependencies": { 808 | "@types/react": "*", 809 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 810 | }, 811 | "peerDependenciesMeta": { 812 | "@types/react": { 813 | "optional": true 814 | } 815 | } 816 | }, 817 | "node_modules/@radix-ui/react-use-rect": { 818 | "version": "1.1.0", 819 | "license": "MIT", 820 | "dependencies": { 821 | "@radix-ui/rect": "1.1.0" 822 | }, 823 | "peerDependencies": { 824 | "@types/react": "*", 825 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 826 | }, 827 | "peerDependenciesMeta": { 828 | "@types/react": { 829 | "optional": true 830 | } 831 | } 832 | }, 833 | "node_modules/@radix-ui/react-use-size": { 834 | "version": "1.1.0", 835 | "license": "MIT", 836 | "dependencies": { 837 | "@radix-ui/react-use-layout-effect": "1.1.0" 838 | }, 839 | "peerDependencies": { 840 | "@types/react": "*", 841 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 842 | }, 843 | "peerDependenciesMeta": { 844 | "@types/react": { 845 | "optional": true 846 | } 847 | } 848 | }, 849 | "node_modules/@radix-ui/rect": { 850 | "version": "1.1.0", 851 | "license": "MIT" 852 | }, 853 | "node_modules/@remix-run/router": { 854 | "version": "1.20.0", 855 | "license": "MIT", 856 | "engines": { 857 | "node": ">=14.0.0" 858 | } 859 | }, 860 | "node_modules/@rollup/rollup-linux-x64-gnu": { 861 | "version": "4.21.2", 862 | "cpu": [ 863 | "x64" 864 | ], 865 | "dev": true, 866 | "license": "MIT", 867 | "optional": true, 868 | "os": [ 869 | "linux" 870 | ] 871 | }, 872 | "node_modules/@rollup/rollup-linux-x64-musl": { 873 | "version": "4.21.2", 874 | "cpu": [ 875 | "x64" 876 | ], 877 | "dev": true, 878 | "license": "MIT", 879 | "optional": true, 880 | "os": [ 881 | "linux" 882 | ] 883 | }, 884 | "node_modules/@swc/core": { 885 | "version": "1.7.23", 886 | "dev": true, 887 | "hasInstallScript": true, 888 | "license": "Apache-2.0", 889 | "dependencies": { 890 | "@swc/counter": "^0.1.3", 891 | "@swc/types": "^0.1.12" 892 | }, 893 | "engines": { 894 | "node": ">=10" 895 | }, 896 | "funding": { 897 | "type": "opencollective", 898 | "url": "https://opencollective.com/swc" 899 | }, 900 | "optionalDependencies": { 901 | "@swc/core-darwin-arm64": "1.7.23", 902 | "@swc/core-darwin-x64": "1.7.23", 903 | "@swc/core-linux-arm-gnueabihf": "1.7.23", 904 | "@swc/core-linux-arm64-gnu": "1.7.23", 905 | "@swc/core-linux-arm64-musl": "1.7.23", 906 | "@swc/core-linux-x64-gnu": "1.7.23", 907 | "@swc/core-linux-x64-musl": "1.7.23", 908 | "@swc/core-win32-arm64-msvc": "1.7.23", 909 | "@swc/core-win32-ia32-msvc": "1.7.23", 910 | "@swc/core-win32-x64-msvc": "1.7.23" 911 | }, 912 | "peerDependencies": { 913 | "@swc/helpers": "*" 914 | }, 915 | "peerDependenciesMeta": { 916 | "@swc/helpers": { 917 | "optional": true 918 | } 919 | } 920 | }, 921 | "node_modules/@swc/core-linux-x64-gnu": { 922 | "version": "1.7.23", 923 | "cpu": [ 924 | "x64" 925 | ], 926 | "dev": true, 927 | "license": "Apache-2.0 AND MIT", 928 | "optional": true, 929 | "os": [ 930 | "linux" 931 | ], 932 | "engines": { 933 | "node": ">=10" 934 | } 935 | }, 936 | "node_modules/@swc/core-linux-x64-musl": { 937 | "version": "1.7.23", 938 | "cpu": [ 939 | "x64" 940 | ], 941 | "dev": true, 942 | "license": "Apache-2.0 AND MIT", 943 | "optional": true, 944 | "os": [ 945 | "linux" 946 | ], 947 | "engines": { 948 | "node": ">=10" 949 | } 950 | }, 951 | "node_modules/@swc/counter": { 952 | "version": "0.1.3", 953 | "dev": true, 954 | "license": "Apache-2.0" 955 | }, 956 | "node_modules/@swc/types": { 957 | "version": "0.1.12", 958 | "dev": true, 959 | "license": "Apache-2.0", 960 | "dependencies": { 961 | "@swc/counter": "^0.1.3" 962 | } 963 | }, 964 | "node_modules/@tabler/icons": { 965 | "version": "3.14.0", 966 | "license": "MIT", 967 | "funding": { 968 | "type": "github", 969 | "url": "https://github.com/sponsors/codecalm" 970 | } 971 | }, 972 | "node_modules/@tabler/icons-react": { 973 | "version": "3.14.0", 974 | "license": "MIT", 975 | "dependencies": { 976 | "@tabler/icons": "3.14.0" 977 | }, 978 | "funding": { 979 | "type": "github", 980 | "url": "https://github.com/sponsors/codecalm" 981 | }, 982 | "peerDependencies": { 983 | "react": ">= 16" 984 | } 985 | }, 986 | "node_modules/@types/estree": { 987 | "version": "1.0.5", 988 | "dev": true, 989 | "license": "MIT" 990 | }, 991 | "node_modules/@types/node": { 992 | "version": "22.7.6", 993 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz", 994 | "integrity": "sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==", 995 | "dev": true, 996 | "license": "MIT", 997 | "dependencies": { 998 | "undici-types": "~6.19.2" 999 | } 1000 | }, 1001 | "node_modules/@types/prop-types": { 1002 | "version": "15.7.12", 1003 | "devOptional": true, 1004 | "license": "MIT" 1005 | }, 1006 | "node_modules/@types/react": { 1007 | "version": "18.3.5", 1008 | "devOptional": true, 1009 | "license": "MIT", 1010 | "dependencies": { 1011 | "@types/prop-types": "*", 1012 | "csstype": "^3.0.2" 1013 | } 1014 | }, 1015 | "node_modules/@types/react-dom": { 1016 | "version": "18.3.0", 1017 | "devOptional": true, 1018 | "license": "MIT", 1019 | "dependencies": { 1020 | "@types/react": "*" 1021 | } 1022 | }, 1023 | "node_modules/@typescript-eslint/eslint-plugin": { 1024 | "version": "8.4.0", 1025 | "dev": true, 1026 | "license": "MIT", 1027 | "dependencies": { 1028 | "@eslint-community/regexpp": "^4.10.0", 1029 | "@typescript-eslint/scope-manager": "8.4.0", 1030 | "@typescript-eslint/type-utils": "8.4.0", 1031 | "@typescript-eslint/utils": "8.4.0", 1032 | "@typescript-eslint/visitor-keys": "8.4.0", 1033 | "graphemer": "^1.4.0", 1034 | "ignore": "^5.3.1", 1035 | "natural-compare": "^1.4.0", 1036 | "ts-api-utils": "^1.3.0" 1037 | }, 1038 | "engines": { 1039 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1040 | }, 1041 | "funding": { 1042 | "type": "opencollective", 1043 | "url": "https://opencollective.com/typescript-eslint" 1044 | }, 1045 | "peerDependencies": { 1046 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 1047 | "eslint": "^8.57.0 || ^9.0.0" 1048 | }, 1049 | "peerDependenciesMeta": { 1050 | "typescript": { 1051 | "optional": true 1052 | } 1053 | } 1054 | }, 1055 | "node_modules/@typescript-eslint/parser": { 1056 | "version": "8.4.0", 1057 | "dev": true, 1058 | "license": "BSD-2-Clause", 1059 | "dependencies": { 1060 | "@typescript-eslint/scope-manager": "8.4.0", 1061 | "@typescript-eslint/types": "8.4.0", 1062 | "@typescript-eslint/typescript-estree": "8.4.0", 1063 | "@typescript-eslint/visitor-keys": "8.4.0", 1064 | "debug": "^4.3.4" 1065 | }, 1066 | "engines": { 1067 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1068 | }, 1069 | "funding": { 1070 | "type": "opencollective", 1071 | "url": "https://opencollective.com/typescript-eslint" 1072 | }, 1073 | "peerDependencies": { 1074 | "eslint": "^8.57.0 || ^9.0.0" 1075 | }, 1076 | "peerDependenciesMeta": { 1077 | "typescript": { 1078 | "optional": true 1079 | } 1080 | } 1081 | }, 1082 | "node_modules/@typescript-eslint/scope-manager": { 1083 | "version": "8.4.0", 1084 | "dev": true, 1085 | "license": "MIT", 1086 | "dependencies": { 1087 | "@typescript-eslint/types": "8.4.0", 1088 | "@typescript-eslint/visitor-keys": "8.4.0" 1089 | }, 1090 | "engines": { 1091 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1092 | }, 1093 | "funding": { 1094 | "type": "opencollective", 1095 | "url": "https://opencollective.com/typescript-eslint" 1096 | } 1097 | }, 1098 | "node_modules/@typescript-eslint/type-utils": { 1099 | "version": "8.4.0", 1100 | "dev": true, 1101 | "license": "MIT", 1102 | "dependencies": { 1103 | "@typescript-eslint/typescript-estree": "8.4.0", 1104 | "@typescript-eslint/utils": "8.4.0", 1105 | "debug": "^4.3.4", 1106 | "ts-api-utils": "^1.3.0" 1107 | }, 1108 | "engines": { 1109 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1110 | }, 1111 | "funding": { 1112 | "type": "opencollective", 1113 | "url": "https://opencollective.com/typescript-eslint" 1114 | }, 1115 | "peerDependenciesMeta": { 1116 | "typescript": { 1117 | "optional": true 1118 | } 1119 | } 1120 | }, 1121 | "node_modules/@typescript-eslint/types": { 1122 | "version": "8.4.0", 1123 | "dev": true, 1124 | "license": "MIT", 1125 | "engines": { 1126 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1127 | }, 1128 | "funding": { 1129 | "type": "opencollective", 1130 | "url": "https://opencollective.com/typescript-eslint" 1131 | } 1132 | }, 1133 | "node_modules/@typescript-eslint/typescript-estree": { 1134 | "version": "8.4.0", 1135 | "dev": true, 1136 | "license": "BSD-2-Clause", 1137 | "dependencies": { 1138 | "@typescript-eslint/types": "8.4.0", 1139 | "@typescript-eslint/visitor-keys": "8.4.0", 1140 | "debug": "^4.3.4", 1141 | "fast-glob": "^3.3.2", 1142 | "is-glob": "^4.0.3", 1143 | "minimatch": "^9.0.4", 1144 | "semver": "^7.6.0", 1145 | "ts-api-utils": "^1.3.0" 1146 | }, 1147 | "engines": { 1148 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1149 | }, 1150 | "funding": { 1151 | "type": "opencollective", 1152 | "url": "https://opencollective.com/typescript-eslint" 1153 | }, 1154 | "peerDependenciesMeta": { 1155 | "typescript": { 1156 | "optional": true 1157 | } 1158 | } 1159 | }, 1160 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1161 | "version": "9.0.5", 1162 | "dev": true, 1163 | "license": "ISC", 1164 | "dependencies": { 1165 | "brace-expansion": "^2.0.1" 1166 | }, 1167 | "engines": { 1168 | "node": ">=16 || 14 >=14.17" 1169 | }, 1170 | "funding": { 1171 | "url": "https://github.com/sponsors/isaacs" 1172 | } 1173 | }, 1174 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { 1175 | "version": "2.0.1", 1176 | "dev": true, 1177 | "license": "MIT", 1178 | "dependencies": { 1179 | "balanced-match": "^1.0.0" 1180 | } 1181 | }, 1182 | "node_modules/@typescript-eslint/utils": { 1183 | "version": "8.4.0", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "dependencies": { 1187 | "@eslint-community/eslint-utils": "^4.4.0", 1188 | "@typescript-eslint/scope-manager": "8.4.0", 1189 | "@typescript-eslint/types": "8.4.0", 1190 | "@typescript-eslint/typescript-estree": "8.4.0" 1191 | }, 1192 | "engines": { 1193 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1194 | }, 1195 | "funding": { 1196 | "type": "opencollective", 1197 | "url": "https://opencollective.com/typescript-eslint" 1198 | }, 1199 | "peerDependencies": { 1200 | "eslint": "^8.57.0 || ^9.0.0" 1201 | } 1202 | }, 1203 | "node_modules/@typescript-eslint/visitor-keys": { 1204 | "version": "8.4.0", 1205 | "dev": true, 1206 | "license": "MIT", 1207 | "dependencies": { 1208 | "@typescript-eslint/types": "8.4.0", 1209 | "eslint-visitor-keys": "^3.4.3" 1210 | }, 1211 | "engines": { 1212 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1213 | }, 1214 | "funding": { 1215 | "type": "opencollective", 1216 | "url": "https://opencollective.com/typescript-eslint" 1217 | } 1218 | }, 1219 | "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { 1220 | "version": "3.4.3", 1221 | "dev": true, 1222 | "license": "Apache-2.0", 1223 | "engines": { 1224 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1225 | }, 1226 | "funding": { 1227 | "url": "https://opencollective.com/eslint" 1228 | } 1229 | }, 1230 | "node_modules/@vitejs/plugin-react-swc": { 1231 | "version": "3.7.0", 1232 | "dev": true, 1233 | "license": "MIT", 1234 | "dependencies": { 1235 | "@swc/core": "^1.5.7" 1236 | }, 1237 | "peerDependencies": { 1238 | "vite": "^4 || ^5" 1239 | } 1240 | }, 1241 | "node_modules/acorn": { 1242 | "version": "8.12.1", 1243 | "dev": true, 1244 | "license": "MIT", 1245 | "bin": { 1246 | "acorn": "bin/acorn" 1247 | }, 1248 | "engines": { 1249 | "node": ">=0.4.0" 1250 | } 1251 | }, 1252 | "node_modules/acorn-jsx": { 1253 | "version": "5.3.2", 1254 | "dev": true, 1255 | "license": "MIT", 1256 | "peerDependencies": { 1257 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1258 | } 1259 | }, 1260 | "node_modules/ajv": { 1261 | "version": "6.12.6", 1262 | "dev": true, 1263 | "license": "MIT", 1264 | "dependencies": { 1265 | "fast-deep-equal": "^3.1.1", 1266 | "fast-json-stable-stringify": "^2.0.0", 1267 | "json-schema-traverse": "^0.4.1", 1268 | "uri-js": "^4.2.2" 1269 | }, 1270 | "funding": { 1271 | "type": "github", 1272 | "url": "https://github.com/sponsors/epoberezkin" 1273 | } 1274 | }, 1275 | "node_modules/ansi-regex": { 1276 | "version": "5.0.1", 1277 | "license": "MIT", 1278 | "engines": { 1279 | "node": ">=8" 1280 | } 1281 | }, 1282 | "node_modules/ansi-styles": { 1283 | "version": "4.3.0", 1284 | "license": "MIT", 1285 | "dependencies": { 1286 | "color-convert": "^2.0.1" 1287 | }, 1288 | "engines": { 1289 | "node": ">=8" 1290 | }, 1291 | "funding": { 1292 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1293 | } 1294 | }, 1295 | "node_modules/any-promise": { 1296 | "version": "1.3.0", 1297 | "license": "MIT" 1298 | }, 1299 | "node_modules/anymatch": { 1300 | "version": "3.1.3", 1301 | "license": "ISC", 1302 | "dependencies": { 1303 | "normalize-path": "^3.0.0", 1304 | "picomatch": "^2.0.4" 1305 | }, 1306 | "engines": { 1307 | "node": ">= 8" 1308 | } 1309 | }, 1310 | "node_modules/arg": { 1311 | "version": "5.0.2", 1312 | "license": "MIT" 1313 | }, 1314 | "node_modules/argparse": { 1315 | "version": "2.0.1", 1316 | "dev": true, 1317 | "license": "Python-2.0" 1318 | }, 1319 | "node_modules/aria-hidden": { 1320 | "version": "1.2.4", 1321 | "license": "MIT", 1322 | "dependencies": { 1323 | "tslib": "^2.0.0" 1324 | }, 1325 | "engines": { 1326 | "node": ">=10" 1327 | } 1328 | }, 1329 | "node_modules/asynckit": { 1330 | "version": "0.4.0", 1331 | "license": "MIT" 1332 | }, 1333 | "node_modules/autoprefixer": { 1334 | "version": "10.4.20", 1335 | "dev": true, 1336 | "funding": [ 1337 | { 1338 | "type": "opencollective", 1339 | "url": "https://opencollective.com/postcss/" 1340 | }, 1341 | { 1342 | "type": "tidelift", 1343 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 1344 | }, 1345 | { 1346 | "type": "github", 1347 | "url": "https://github.com/sponsors/ai" 1348 | } 1349 | ], 1350 | "license": "MIT", 1351 | "dependencies": { 1352 | "browserslist": "^4.23.3", 1353 | "caniuse-lite": "^1.0.30001646", 1354 | "fraction.js": "^4.3.7", 1355 | "normalize-range": "^0.1.2", 1356 | "picocolors": "^1.0.1", 1357 | "postcss-value-parser": "^4.2.0" 1358 | }, 1359 | "bin": { 1360 | "autoprefixer": "bin/autoprefixer" 1361 | }, 1362 | "engines": { 1363 | "node": "^10 || ^12 || >=14" 1364 | }, 1365 | "peerDependencies": { 1366 | "postcss": "^8.1.0" 1367 | } 1368 | }, 1369 | "node_modules/axios": { 1370 | "version": "1.7.7", 1371 | "license": "MIT", 1372 | "dependencies": { 1373 | "follow-redirects": "^1.15.6", 1374 | "form-data": "^4.0.0", 1375 | "proxy-from-env": "^1.1.0" 1376 | } 1377 | }, 1378 | "node_modules/balanced-match": { 1379 | "version": "1.0.2", 1380 | "license": "MIT" 1381 | }, 1382 | "node_modules/binary-extensions": { 1383 | "version": "2.3.0", 1384 | "license": "MIT", 1385 | "engines": { 1386 | "node": ">=8" 1387 | }, 1388 | "funding": { 1389 | "url": "https://github.com/sponsors/sindresorhus" 1390 | } 1391 | }, 1392 | "node_modules/brace-expansion": { 1393 | "version": "1.1.11", 1394 | "dev": true, 1395 | "license": "MIT", 1396 | "dependencies": { 1397 | "balanced-match": "^1.0.0", 1398 | "concat-map": "0.0.1" 1399 | } 1400 | }, 1401 | "node_modules/braces": { 1402 | "version": "3.0.3", 1403 | "license": "MIT", 1404 | "dependencies": { 1405 | "fill-range": "^7.1.1" 1406 | }, 1407 | "engines": { 1408 | "node": ">=8" 1409 | } 1410 | }, 1411 | "node_modules/browserslist": { 1412 | "version": "4.23.3", 1413 | "dev": true, 1414 | "funding": [ 1415 | { 1416 | "type": "opencollective", 1417 | "url": "https://opencollective.com/browserslist" 1418 | }, 1419 | { 1420 | "type": "tidelift", 1421 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1422 | }, 1423 | { 1424 | "type": "github", 1425 | "url": "https://github.com/sponsors/ai" 1426 | } 1427 | ], 1428 | "license": "MIT", 1429 | "dependencies": { 1430 | "caniuse-lite": "^1.0.30001646", 1431 | "electron-to-chromium": "^1.5.4", 1432 | "node-releases": "^2.0.18", 1433 | "update-browserslist-db": "^1.1.0" 1434 | }, 1435 | "bin": { 1436 | "browserslist": "cli.js" 1437 | }, 1438 | "engines": { 1439 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1440 | } 1441 | }, 1442 | "node_modules/callsites": { 1443 | "version": "3.1.0", 1444 | "dev": true, 1445 | "license": "MIT", 1446 | "engines": { 1447 | "node": ">=6" 1448 | } 1449 | }, 1450 | "node_modules/camelcase-css": { 1451 | "version": "2.0.1", 1452 | "license": "MIT", 1453 | "engines": { 1454 | "node": ">= 6" 1455 | } 1456 | }, 1457 | "node_modules/caniuse-lite": { 1458 | "version": "1.0.30001658", 1459 | "dev": true, 1460 | "funding": [ 1461 | { 1462 | "type": "opencollective", 1463 | "url": "https://opencollective.com/browserslist" 1464 | }, 1465 | { 1466 | "type": "tidelift", 1467 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1468 | }, 1469 | { 1470 | "type": "github", 1471 | "url": "https://github.com/sponsors/ai" 1472 | } 1473 | ], 1474 | "license": "CC-BY-4.0" 1475 | }, 1476 | "node_modules/chalk": { 1477 | "version": "4.1.2", 1478 | "dev": true, 1479 | "license": "MIT", 1480 | "dependencies": { 1481 | "ansi-styles": "^4.1.0", 1482 | "supports-color": "^7.1.0" 1483 | }, 1484 | "engines": { 1485 | "node": ">=10" 1486 | }, 1487 | "funding": { 1488 | "url": "https://github.com/chalk/chalk?sponsor=1" 1489 | } 1490 | }, 1491 | "node_modules/chokidar": { 1492 | "version": "3.6.0", 1493 | "license": "MIT", 1494 | "dependencies": { 1495 | "anymatch": "~3.1.2", 1496 | "braces": "~3.0.2", 1497 | "glob-parent": "~5.1.2", 1498 | "is-binary-path": "~2.1.0", 1499 | "is-glob": "~4.0.1", 1500 | "normalize-path": "~3.0.0", 1501 | "readdirp": "~3.6.0" 1502 | }, 1503 | "engines": { 1504 | "node": ">= 8.10.0" 1505 | }, 1506 | "funding": { 1507 | "url": "https://paulmillr.com/funding/" 1508 | }, 1509 | "optionalDependencies": { 1510 | "fsevents": "~2.3.2" 1511 | } 1512 | }, 1513 | "node_modules/chokidar/node_modules/glob-parent": { 1514 | "version": "5.1.2", 1515 | "license": "ISC", 1516 | "dependencies": { 1517 | "is-glob": "^4.0.1" 1518 | }, 1519 | "engines": { 1520 | "node": ">= 6" 1521 | } 1522 | }, 1523 | "node_modules/class-variance-authority": { 1524 | "version": "0.7.0", 1525 | "license": "Apache-2.0", 1526 | "dependencies": { 1527 | "clsx": "2.0.0" 1528 | }, 1529 | "funding": { 1530 | "url": "https://joebell.co.uk" 1531 | } 1532 | }, 1533 | "node_modules/class-variance-authority/node_modules/clsx": { 1534 | "version": "2.0.0", 1535 | "license": "MIT", 1536 | "engines": { 1537 | "node": ">=6" 1538 | } 1539 | }, 1540 | "node_modules/clsx": { 1541 | "version": "2.1.1", 1542 | "license": "MIT", 1543 | "engines": { 1544 | "node": ">=6" 1545 | } 1546 | }, 1547 | "node_modules/color-convert": { 1548 | "version": "2.0.1", 1549 | "license": "MIT", 1550 | "dependencies": { 1551 | "color-name": "~1.1.4" 1552 | }, 1553 | "engines": { 1554 | "node": ">=7.0.0" 1555 | } 1556 | }, 1557 | "node_modules/color-name": { 1558 | "version": "1.1.4", 1559 | "license": "MIT" 1560 | }, 1561 | "node_modules/combined-stream": { 1562 | "version": "1.0.8", 1563 | "license": "MIT", 1564 | "dependencies": { 1565 | "delayed-stream": "~1.0.0" 1566 | }, 1567 | "engines": { 1568 | "node": ">= 0.8" 1569 | } 1570 | }, 1571 | "node_modules/commander": { 1572 | "version": "4.1.1", 1573 | "license": "MIT", 1574 | "engines": { 1575 | "node": ">= 6" 1576 | } 1577 | }, 1578 | "node_modules/concat-map": { 1579 | "version": "0.0.1", 1580 | "dev": true, 1581 | "license": "MIT" 1582 | }, 1583 | "node_modules/cross-spawn": { 1584 | "version": "7.0.3", 1585 | "license": "MIT", 1586 | "dependencies": { 1587 | "path-key": "^3.1.0", 1588 | "shebang-command": "^2.0.0", 1589 | "which": "^2.0.1" 1590 | }, 1591 | "engines": { 1592 | "node": ">= 8" 1593 | } 1594 | }, 1595 | "node_modules/cssesc": { 1596 | "version": "3.0.0", 1597 | "license": "MIT", 1598 | "bin": { 1599 | "cssesc": "bin/cssesc" 1600 | }, 1601 | "engines": { 1602 | "node": ">=4" 1603 | } 1604 | }, 1605 | "node_modules/csstype": { 1606 | "version": "3.1.3", 1607 | "devOptional": true, 1608 | "license": "MIT" 1609 | }, 1610 | "node_modules/debug": { 1611 | "version": "4.3.7", 1612 | "dev": true, 1613 | "license": "MIT", 1614 | "dependencies": { 1615 | "ms": "^2.1.3" 1616 | }, 1617 | "engines": { 1618 | "node": ">=6.0" 1619 | }, 1620 | "peerDependenciesMeta": { 1621 | "supports-color": { 1622 | "optional": true 1623 | } 1624 | } 1625 | }, 1626 | "node_modules/deep-is": { 1627 | "version": "0.1.4", 1628 | "dev": true, 1629 | "license": "MIT" 1630 | }, 1631 | "node_modules/delayed-stream": { 1632 | "version": "1.0.0", 1633 | "license": "MIT", 1634 | "engines": { 1635 | "node": ">=0.4.0" 1636 | } 1637 | }, 1638 | "node_modules/detect-node-es": { 1639 | "version": "1.1.0", 1640 | "license": "MIT" 1641 | }, 1642 | "node_modules/didyoumean": { 1643 | "version": "1.2.2", 1644 | "license": "Apache-2.0" 1645 | }, 1646 | "node_modules/dlv": { 1647 | "version": "1.1.3", 1648 | "license": "MIT" 1649 | }, 1650 | "node_modules/eastasianwidth": { 1651 | "version": "0.2.0", 1652 | "license": "MIT" 1653 | }, 1654 | "node_modules/electron-to-chromium": { 1655 | "version": "1.5.17", 1656 | "dev": true, 1657 | "license": "ISC" 1658 | }, 1659 | "node_modules/emoji-regex": { 1660 | "version": "9.2.2", 1661 | "license": "MIT" 1662 | }, 1663 | "node_modules/esbuild": { 1664 | "version": "0.21.5", 1665 | "dev": true, 1666 | "hasInstallScript": true, 1667 | "license": "MIT", 1668 | "bin": { 1669 | "esbuild": "bin/esbuild" 1670 | }, 1671 | "engines": { 1672 | "node": ">=12" 1673 | }, 1674 | "optionalDependencies": { 1675 | "@esbuild/aix-ppc64": "0.21.5", 1676 | "@esbuild/android-arm": "0.21.5", 1677 | "@esbuild/android-arm64": "0.21.5", 1678 | "@esbuild/android-x64": "0.21.5", 1679 | "@esbuild/darwin-arm64": "0.21.5", 1680 | "@esbuild/darwin-x64": "0.21.5", 1681 | "@esbuild/freebsd-arm64": "0.21.5", 1682 | "@esbuild/freebsd-x64": "0.21.5", 1683 | "@esbuild/linux-arm": "0.21.5", 1684 | "@esbuild/linux-arm64": "0.21.5", 1685 | "@esbuild/linux-ia32": "0.21.5", 1686 | "@esbuild/linux-loong64": "0.21.5", 1687 | "@esbuild/linux-mips64el": "0.21.5", 1688 | "@esbuild/linux-ppc64": "0.21.5", 1689 | "@esbuild/linux-riscv64": "0.21.5", 1690 | "@esbuild/linux-s390x": "0.21.5", 1691 | "@esbuild/linux-x64": "0.21.5", 1692 | "@esbuild/netbsd-x64": "0.21.5", 1693 | "@esbuild/openbsd-x64": "0.21.5", 1694 | "@esbuild/sunos-x64": "0.21.5", 1695 | "@esbuild/win32-arm64": "0.21.5", 1696 | "@esbuild/win32-ia32": "0.21.5", 1697 | "@esbuild/win32-x64": "0.21.5" 1698 | } 1699 | }, 1700 | "node_modules/escalade": { 1701 | "version": "3.2.0", 1702 | "dev": true, 1703 | "license": "MIT", 1704 | "engines": { 1705 | "node": ">=6" 1706 | } 1707 | }, 1708 | "node_modules/escape-string-regexp": { 1709 | "version": "4.0.0", 1710 | "dev": true, 1711 | "license": "MIT", 1712 | "engines": { 1713 | "node": ">=10" 1714 | }, 1715 | "funding": { 1716 | "url": "https://github.com/sponsors/sindresorhus" 1717 | } 1718 | }, 1719 | "node_modules/eslint": { 1720 | "version": "9.9.1", 1721 | "dev": true, 1722 | "license": "MIT", 1723 | "dependencies": { 1724 | "@eslint-community/eslint-utils": "^4.2.0", 1725 | "@eslint-community/regexpp": "^4.11.0", 1726 | "@eslint/config-array": "^0.18.0", 1727 | "@eslint/eslintrc": "^3.1.0", 1728 | "@eslint/js": "9.9.1", 1729 | "@humanwhocodes/module-importer": "^1.0.1", 1730 | "@humanwhocodes/retry": "^0.3.0", 1731 | "@nodelib/fs.walk": "^1.2.8", 1732 | "ajv": "^6.12.4", 1733 | "chalk": "^4.0.0", 1734 | "cross-spawn": "^7.0.2", 1735 | "debug": "^4.3.2", 1736 | "escape-string-regexp": "^4.0.0", 1737 | "eslint-scope": "^8.0.2", 1738 | "eslint-visitor-keys": "^4.0.0", 1739 | "espree": "^10.1.0", 1740 | "esquery": "^1.5.0", 1741 | "esutils": "^2.0.2", 1742 | "fast-deep-equal": "^3.1.3", 1743 | "file-entry-cache": "^8.0.0", 1744 | "find-up": "^5.0.0", 1745 | "glob-parent": "^6.0.2", 1746 | "ignore": "^5.2.0", 1747 | "imurmurhash": "^0.1.4", 1748 | "is-glob": "^4.0.0", 1749 | "is-path-inside": "^3.0.3", 1750 | "json-stable-stringify-without-jsonify": "^1.0.1", 1751 | "levn": "^0.4.1", 1752 | "lodash.merge": "^4.6.2", 1753 | "minimatch": "^3.1.2", 1754 | "natural-compare": "^1.4.0", 1755 | "optionator": "^0.9.3", 1756 | "strip-ansi": "^6.0.1", 1757 | "text-table": "^0.2.0" 1758 | }, 1759 | "bin": { 1760 | "eslint": "bin/eslint.js" 1761 | }, 1762 | "engines": { 1763 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1764 | }, 1765 | "funding": { 1766 | "url": "https://eslint.org/donate" 1767 | }, 1768 | "peerDependencies": { 1769 | "jiti": "*" 1770 | }, 1771 | "peerDependenciesMeta": { 1772 | "jiti": { 1773 | "optional": true 1774 | } 1775 | } 1776 | }, 1777 | "node_modules/eslint-plugin-react-hooks": { 1778 | "version": "5.1.0-rc-fb9a90fa48-20240614", 1779 | "dev": true, 1780 | "license": "MIT", 1781 | "engines": { 1782 | "node": ">=10" 1783 | }, 1784 | "peerDependencies": { 1785 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 1786 | } 1787 | }, 1788 | "node_modules/eslint-plugin-react-refresh": { 1789 | "version": "0.4.11", 1790 | "dev": true, 1791 | "license": "MIT", 1792 | "peerDependencies": { 1793 | "eslint": ">=7" 1794 | } 1795 | }, 1796 | "node_modules/eslint-scope": { 1797 | "version": "8.0.2", 1798 | "dev": true, 1799 | "license": "BSD-2-Clause", 1800 | "dependencies": { 1801 | "esrecurse": "^4.3.0", 1802 | "estraverse": "^5.2.0" 1803 | }, 1804 | "engines": { 1805 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1806 | }, 1807 | "funding": { 1808 | "url": "https://opencollective.com/eslint" 1809 | } 1810 | }, 1811 | "node_modules/eslint-visitor-keys": { 1812 | "version": "4.0.0", 1813 | "dev": true, 1814 | "license": "Apache-2.0", 1815 | "engines": { 1816 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1817 | }, 1818 | "funding": { 1819 | "url": "https://opencollective.com/eslint" 1820 | } 1821 | }, 1822 | "node_modules/espree": { 1823 | "version": "10.1.0", 1824 | "dev": true, 1825 | "license": "BSD-2-Clause", 1826 | "dependencies": { 1827 | "acorn": "^8.12.0", 1828 | "acorn-jsx": "^5.3.2", 1829 | "eslint-visitor-keys": "^4.0.0" 1830 | }, 1831 | "engines": { 1832 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1833 | }, 1834 | "funding": { 1835 | "url": "https://opencollective.com/eslint" 1836 | } 1837 | }, 1838 | "node_modules/esquery": { 1839 | "version": "1.6.0", 1840 | "dev": true, 1841 | "license": "BSD-3-Clause", 1842 | "dependencies": { 1843 | "estraverse": "^5.1.0" 1844 | }, 1845 | "engines": { 1846 | "node": ">=0.10" 1847 | } 1848 | }, 1849 | "node_modules/esrecurse": { 1850 | "version": "4.3.0", 1851 | "dev": true, 1852 | "license": "BSD-2-Clause", 1853 | "dependencies": { 1854 | "estraverse": "^5.2.0" 1855 | }, 1856 | "engines": { 1857 | "node": ">=4.0" 1858 | } 1859 | }, 1860 | "node_modules/estraverse": { 1861 | "version": "5.3.0", 1862 | "dev": true, 1863 | "license": "BSD-2-Clause", 1864 | "engines": { 1865 | "node": ">=4.0" 1866 | } 1867 | }, 1868 | "node_modules/esutils": { 1869 | "version": "2.0.3", 1870 | "dev": true, 1871 | "license": "BSD-2-Clause", 1872 | "engines": { 1873 | "node": ">=0.10.0" 1874 | } 1875 | }, 1876 | "node_modules/fast-deep-equal": { 1877 | "version": "3.1.3", 1878 | "dev": true, 1879 | "license": "MIT" 1880 | }, 1881 | "node_modules/fast-glob": { 1882 | "version": "3.3.2", 1883 | "license": "MIT", 1884 | "dependencies": { 1885 | "@nodelib/fs.stat": "^2.0.2", 1886 | "@nodelib/fs.walk": "^1.2.3", 1887 | "glob-parent": "^5.1.2", 1888 | "merge2": "^1.3.0", 1889 | "micromatch": "^4.0.4" 1890 | }, 1891 | "engines": { 1892 | "node": ">=8.6.0" 1893 | } 1894 | }, 1895 | "node_modules/fast-glob/node_modules/glob-parent": { 1896 | "version": "5.1.2", 1897 | "license": "ISC", 1898 | "dependencies": { 1899 | "is-glob": "^4.0.1" 1900 | }, 1901 | "engines": { 1902 | "node": ">= 6" 1903 | } 1904 | }, 1905 | "node_modules/fast-json-stable-stringify": { 1906 | "version": "2.1.0", 1907 | "dev": true, 1908 | "license": "MIT" 1909 | }, 1910 | "node_modules/fast-levenshtein": { 1911 | "version": "2.0.6", 1912 | "dev": true, 1913 | "license": "MIT" 1914 | }, 1915 | "node_modules/fastq": { 1916 | "version": "1.17.1", 1917 | "license": "ISC", 1918 | "dependencies": { 1919 | "reusify": "^1.0.4" 1920 | } 1921 | }, 1922 | "node_modules/file-entry-cache": { 1923 | "version": "8.0.0", 1924 | "dev": true, 1925 | "license": "MIT", 1926 | "dependencies": { 1927 | "flat-cache": "^4.0.0" 1928 | }, 1929 | "engines": { 1930 | "node": ">=16.0.0" 1931 | } 1932 | }, 1933 | "node_modules/fill-range": { 1934 | "version": "7.1.1", 1935 | "license": "MIT", 1936 | "dependencies": { 1937 | "to-regex-range": "^5.0.1" 1938 | }, 1939 | "engines": { 1940 | "node": ">=8" 1941 | } 1942 | }, 1943 | "node_modules/find-up": { 1944 | "version": "5.0.0", 1945 | "dev": true, 1946 | "license": "MIT", 1947 | "dependencies": { 1948 | "locate-path": "^6.0.0", 1949 | "path-exists": "^4.0.0" 1950 | }, 1951 | "engines": { 1952 | "node": ">=10" 1953 | }, 1954 | "funding": { 1955 | "url": "https://github.com/sponsors/sindresorhus" 1956 | } 1957 | }, 1958 | "node_modules/flat-cache": { 1959 | "version": "4.0.1", 1960 | "dev": true, 1961 | "license": "MIT", 1962 | "dependencies": { 1963 | "flatted": "^3.2.9", 1964 | "keyv": "^4.5.4" 1965 | }, 1966 | "engines": { 1967 | "node": ">=16" 1968 | } 1969 | }, 1970 | "node_modules/flatted": { 1971 | "version": "3.3.1", 1972 | "dev": true, 1973 | "license": "ISC" 1974 | }, 1975 | "node_modules/follow-redirects": { 1976 | "version": "1.15.9", 1977 | "funding": [ 1978 | { 1979 | "type": "individual", 1980 | "url": "https://github.com/sponsors/RubenVerborgh" 1981 | } 1982 | ], 1983 | "license": "MIT", 1984 | "engines": { 1985 | "node": ">=4.0" 1986 | }, 1987 | "peerDependenciesMeta": { 1988 | "debug": { 1989 | "optional": true 1990 | } 1991 | } 1992 | }, 1993 | "node_modules/foreground-child": { 1994 | "version": "3.3.0", 1995 | "license": "ISC", 1996 | "dependencies": { 1997 | "cross-spawn": "^7.0.0", 1998 | "signal-exit": "^4.0.1" 1999 | }, 2000 | "engines": { 2001 | "node": ">=14" 2002 | }, 2003 | "funding": { 2004 | "url": "https://github.com/sponsors/isaacs" 2005 | } 2006 | }, 2007 | "node_modules/form-data": { 2008 | "version": "4.0.1", 2009 | "license": "MIT", 2010 | "dependencies": { 2011 | "asynckit": "^0.4.0", 2012 | "combined-stream": "^1.0.8", 2013 | "mime-types": "^2.1.12" 2014 | }, 2015 | "engines": { 2016 | "node": ">= 6" 2017 | } 2018 | }, 2019 | "node_modules/fraction.js": { 2020 | "version": "4.3.7", 2021 | "dev": true, 2022 | "license": "MIT", 2023 | "engines": { 2024 | "node": "*" 2025 | }, 2026 | "funding": { 2027 | "type": "patreon", 2028 | "url": "https://github.com/sponsors/rawify" 2029 | } 2030 | }, 2031 | "node_modules/function-bind": { 2032 | "version": "1.1.2", 2033 | "license": "MIT", 2034 | "funding": { 2035 | "url": "https://github.com/sponsors/ljharb" 2036 | } 2037 | }, 2038 | "node_modules/get-nonce": { 2039 | "version": "1.0.1", 2040 | "license": "MIT", 2041 | "engines": { 2042 | "node": ">=6" 2043 | } 2044 | }, 2045 | "node_modules/glob": { 2046 | "version": "10.4.5", 2047 | "license": "ISC", 2048 | "dependencies": { 2049 | "foreground-child": "^3.1.0", 2050 | "jackspeak": "^3.1.2", 2051 | "minimatch": "^9.0.4", 2052 | "minipass": "^7.1.2", 2053 | "package-json-from-dist": "^1.0.0", 2054 | "path-scurry": "^1.11.1" 2055 | }, 2056 | "bin": { 2057 | "glob": "dist/esm/bin.mjs" 2058 | }, 2059 | "funding": { 2060 | "url": "https://github.com/sponsors/isaacs" 2061 | } 2062 | }, 2063 | "node_modules/glob-parent": { 2064 | "version": "6.0.2", 2065 | "license": "ISC", 2066 | "dependencies": { 2067 | "is-glob": "^4.0.3" 2068 | }, 2069 | "engines": { 2070 | "node": ">=10.13.0" 2071 | } 2072 | }, 2073 | "node_modules/glob/node_modules/minimatch": { 2074 | "version": "9.0.5", 2075 | "license": "ISC", 2076 | "dependencies": { 2077 | "brace-expansion": "^2.0.1" 2078 | }, 2079 | "engines": { 2080 | "node": ">=16 || 14 >=14.17" 2081 | }, 2082 | "funding": { 2083 | "url": "https://github.com/sponsors/isaacs" 2084 | } 2085 | }, 2086 | "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { 2087 | "version": "2.0.1", 2088 | "license": "MIT", 2089 | "dependencies": { 2090 | "balanced-match": "^1.0.0" 2091 | } 2092 | }, 2093 | "node_modules/globals": { 2094 | "version": "15.9.0", 2095 | "dev": true, 2096 | "license": "MIT", 2097 | "engines": { 2098 | "node": ">=18" 2099 | }, 2100 | "funding": { 2101 | "url": "https://github.com/sponsors/sindresorhus" 2102 | } 2103 | }, 2104 | "node_modules/graphemer": { 2105 | "version": "1.4.0", 2106 | "dev": true, 2107 | "license": "MIT" 2108 | }, 2109 | "node_modules/has-flag": { 2110 | "version": "4.0.0", 2111 | "dev": true, 2112 | "license": "MIT", 2113 | "engines": { 2114 | "node": ">=8" 2115 | } 2116 | }, 2117 | "node_modules/hasown": { 2118 | "version": "2.0.2", 2119 | "license": "MIT", 2120 | "dependencies": { 2121 | "function-bind": "^1.1.2" 2122 | }, 2123 | "engines": { 2124 | "node": ">= 0.4" 2125 | } 2126 | }, 2127 | "node_modules/ignore": { 2128 | "version": "5.3.2", 2129 | "dev": true, 2130 | "license": "MIT", 2131 | "engines": { 2132 | "node": ">= 4" 2133 | } 2134 | }, 2135 | "node_modules/import-fresh": { 2136 | "version": "3.3.0", 2137 | "dev": true, 2138 | "license": "MIT", 2139 | "dependencies": { 2140 | "parent-module": "^1.0.0", 2141 | "resolve-from": "^4.0.0" 2142 | }, 2143 | "engines": { 2144 | "node": ">=6" 2145 | }, 2146 | "funding": { 2147 | "url": "https://github.com/sponsors/sindresorhus" 2148 | } 2149 | }, 2150 | "node_modules/imurmurhash": { 2151 | "version": "0.1.4", 2152 | "dev": true, 2153 | "license": "MIT", 2154 | "engines": { 2155 | "node": ">=0.8.19" 2156 | } 2157 | }, 2158 | "node_modules/invariant": { 2159 | "version": "2.2.4", 2160 | "license": "MIT", 2161 | "dependencies": { 2162 | "loose-envify": "^1.0.0" 2163 | } 2164 | }, 2165 | "node_modules/is-binary-path": { 2166 | "version": "2.1.0", 2167 | "license": "MIT", 2168 | "dependencies": { 2169 | "binary-extensions": "^2.0.0" 2170 | }, 2171 | "engines": { 2172 | "node": ">=8" 2173 | } 2174 | }, 2175 | "node_modules/is-core-module": { 2176 | "version": "2.15.1", 2177 | "license": "MIT", 2178 | "dependencies": { 2179 | "hasown": "^2.0.2" 2180 | }, 2181 | "engines": { 2182 | "node": ">= 0.4" 2183 | }, 2184 | "funding": { 2185 | "url": "https://github.com/sponsors/ljharb" 2186 | } 2187 | }, 2188 | "node_modules/is-extglob": { 2189 | "version": "2.1.1", 2190 | "license": "MIT", 2191 | "engines": { 2192 | "node": ">=0.10.0" 2193 | } 2194 | }, 2195 | "node_modules/is-fullwidth-code-point": { 2196 | "version": "3.0.0", 2197 | "license": "MIT", 2198 | "engines": { 2199 | "node": ">=8" 2200 | } 2201 | }, 2202 | "node_modules/is-glob": { 2203 | "version": "4.0.3", 2204 | "license": "MIT", 2205 | "dependencies": { 2206 | "is-extglob": "^2.1.1" 2207 | }, 2208 | "engines": { 2209 | "node": ">=0.10.0" 2210 | } 2211 | }, 2212 | "node_modules/is-number": { 2213 | "version": "7.0.0", 2214 | "license": "MIT", 2215 | "engines": { 2216 | "node": ">=0.12.0" 2217 | } 2218 | }, 2219 | "node_modules/is-path-inside": { 2220 | "version": "3.0.3", 2221 | "dev": true, 2222 | "license": "MIT", 2223 | "engines": { 2224 | "node": ">=8" 2225 | } 2226 | }, 2227 | "node_modules/isexe": { 2228 | "version": "2.0.0", 2229 | "license": "ISC" 2230 | }, 2231 | "node_modules/jackspeak": { 2232 | "version": "3.4.3", 2233 | "license": "BlueOak-1.0.0", 2234 | "dependencies": { 2235 | "@isaacs/cliui": "^8.0.2" 2236 | }, 2237 | "funding": { 2238 | "url": "https://github.com/sponsors/isaacs" 2239 | }, 2240 | "optionalDependencies": { 2241 | "@pkgjs/parseargs": "^0.11.0" 2242 | } 2243 | }, 2244 | "node_modules/jiti": { 2245 | "version": "1.21.6", 2246 | "license": "MIT", 2247 | "bin": { 2248 | "jiti": "bin/jiti.js" 2249 | } 2250 | }, 2251 | "node_modules/js-tokens": { 2252 | "version": "4.0.0", 2253 | "license": "MIT" 2254 | }, 2255 | "node_modules/js-yaml": { 2256 | "version": "4.1.0", 2257 | "dev": true, 2258 | "license": "MIT", 2259 | "dependencies": { 2260 | "argparse": "^2.0.1" 2261 | }, 2262 | "bin": { 2263 | "js-yaml": "bin/js-yaml.js" 2264 | } 2265 | }, 2266 | "node_modules/json-buffer": { 2267 | "version": "3.0.1", 2268 | "dev": true, 2269 | "license": "MIT" 2270 | }, 2271 | "node_modules/json-schema-traverse": { 2272 | "version": "0.4.1", 2273 | "dev": true, 2274 | "license": "MIT" 2275 | }, 2276 | "node_modules/json-stable-stringify-without-jsonify": { 2277 | "version": "1.0.1", 2278 | "dev": true, 2279 | "license": "MIT" 2280 | }, 2281 | "node_modules/keyv": { 2282 | "version": "4.5.4", 2283 | "dev": true, 2284 | "license": "MIT", 2285 | "dependencies": { 2286 | "json-buffer": "3.0.1" 2287 | } 2288 | }, 2289 | "node_modules/levn": { 2290 | "version": "0.4.1", 2291 | "dev": true, 2292 | "license": "MIT", 2293 | "dependencies": { 2294 | "prelude-ls": "^1.2.1", 2295 | "type-check": "~0.4.0" 2296 | }, 2297 | "engines": { 2298 | "node": ">= 0.8.0" 2299 | } 2300 | }, 2301 | "node_modules/lilconfig": { 2302 | "version": "2.1.0", 2303 | "license": "MIT", 2304 | "engines": { 2305 | "node": ">=10" 2306 | } 2307 | }, 2308 | "node_modules/lines-and-columns": { 2309 | "version": "1.2.4", 2310 | "license": "MIT" 2311 | }, 2312 | "node_modules/locate-path": { 2313 | "version": "6.0.0", 2314 | "dev": true, 2315 | "license": "MIT", 2316 | "dependencies": { 2317 | "p-locate": "^5.0.0" 2318 | }, 2319 | "engines": { 2320 | "node": ">=10" 2321 | }, 2322 | "funding": { 2323 | "url": "https://github.com/sponsors/sindresorhus" 2324 | } 2325 | }, 2326 | "node_modules/lodash.merge": { 2327 | "version": "4.6.2", 2328 | "dev": true, 2329 | "license": "MIT" 2330 | }, 2331 | "node_modules/loose-envify": { 2332 | "version": "1.4.0", 2333 | "license": "MIT", 2334 | "dependencies": { 2335 | "js-tokens": "^3.0.0 || ^4.0.0" 2336 | }, 2337 | "bin": { 2338 | "loose-envify": "cli.js" 2339 | } 2340 | }, 2341 | "node_modules/lru-cache": { 2342 | "version": "10.4.3", 2343 | "license": "ISC" 2344 | }, 2345 | "node_modules/lucide-react": { 2346 | "version": "0.439.0", 2347 | "license": "ISC", 2348 | "peerDependencies": { 2349 | "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" 2350 | } 2351 | }, 2352 | "node_modules/merge2": { 2353 | "version": "1.4.1", 2354 | "license": "MIT", 2355 | "engines": { 2356 | "node": ">= 8" 2357 | } 2358 | }, 2359 | "node_modules/micromatch": { 2360 | "version": "4.0.8", 2361 | "license": "MIT", 2362 | "dependencies": { 2363 | "braces": "^3.0.3", 2364 | "picomatch": "^2.3.1" 2365 | }, 2366 | "engines": { 2367 | "node": ">=8.6" 2368 | } 2369 | }, 2370 | "node_modules/mime-db": { 2371 | "version": "1.52.0", 2372 | "license": "MIT", 2373 | "engines": { 2374 | "node": ">= 0.6" 2375 | } 2376 | }, 2377 | "node_modules/mime-types": { 2378 | "version": "2.1.35", 2379 | "license": "MIT", 2380 | "dependencies": { 2381 | "mime-db": "1.52.0" 2382 | }, 2383 | "engines": { 2384 | "node": ">= 0.6" 2385 | } 2386 | }, 2387 | "node_modules/minimatch": { 2388 | "version": "3.1.2", 2389 | "dev": true, 2390 | "license": "ISC", 2391 | "dependencies": { 2392 | "brace-expansion": "^1.1.7" 2393 | }, 2394 | "engines": { 2395 | "node": "*" 2396 | } 2397 | }, 2398 | "node_modules/minipass": { 2399 | "version": "7.1.2", 2400 | "license": "ISC", 2401 | "engines": { 2402 | "node": ">=16 || 14 >=14.17" 2403 | } 2404 | }, 2405 | "node_modules/ms": { 2406 | "version": "2.1.3", 2407 | "dev": true, 2408 | "license": "MIT" 2409 | }, 2410 | "node_modules/mz": { 2411 | "version": "2.7.0", 2412 | "license": "MIT", 2413 | "dependencies": { 2414 | "any-promise": "^1.0.0", 2415 | "object-assign": "^4.0.1", 2416 | "thenify-all": "^1.0.0" 2417 | } 2418 | }, 2419 | "node_modules/nanoid": { 2420 | "version": "3.3.7", 2421 | "funding": [ 2422 | { 2423 | "type": "github", 2424 | "url": "https://github.com/sponsors/ai" 2425 | } 2426 | ], 2427 | "license": "MIT", 2428 | "bin": { 2429 | "nanoid": "bin/nanoid.cjs" 2430 | }, 2431 | "engines": { 2432 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2433 | } 2434 | }, 2435 | "node_modules/natural-compare": { 2436 | "version": "1.4.0", 2437 | "dev": true, 2438 | "license": "MIT" 2439 | }, 2440 | "node_modules/node-releases": { 2441 | "version": "2.0.18", 2442 | "dev": true, 2443 | "license": "MIT" 2444 | }, 2445 | "node_modules/normalize-path": { 2446 | "version": "3.0.0", 2447 | "license": "MIT", 2448 | "engines": { 2449 | "node": ">=0.10.0" 2450 | } 2451 | }, 2452 | "node_modules/normalize-range": { 2453 | "version": "0.1.2", 2454 | "dev": true, 2455 | "license": "MIT", 2456 | "engines": { 2457 | "node": ">=0.10.0" 2458 | } 2459 | }, 2460 | "node_modules/object-assign": { 2461 | "version": "4.1.1", 2462 | "license": "MIT", 2463 | "engines": { 2464 | "node": ">=0.10.0" 2465 | } 2466 | }, 2467 | "node_modules/object-hash": { 2468 | "version": "3.0.0", 2469 | "license": "MIT", 2470 | "engines": { 2471 | "node": ">= 6" 2472 | } 2473 | }, 2474 | "node_modules/optionator": { 2475 | "version": "0.9.4", 2476 | "dev": true, 2477 | "license": "MIT", 2478 | "dependencies": { 2479 | "deep-is": "^0.1.3", 2480 | "fast-levenshtein": "^2.0.6", 2481 | "levn": "^0.4.1", 2482 | "prelude-ls": "^1.2.1", 2483 | "type-check": "^0.4.0", 2484 | "word-wrap": "^1.2.5" 2485 | }, 2486 | "engines": { 2487 | "node": ">= 0.8.0" 2488 | } 2489 | }, 2490 | "node_modules/p-limit": { 2491 | "version": "3.1.0", 2492 | "dev": true, 2493 | "license": "MIT", 2494 | "dependencies": { 2495 | "yocto-queue": "^0.1.0" 2496 | }, 2497 | "engines": { 2498 | "node": ">=10" 2499 | }, 2500 | "funding": { 2501 | "url": "https://github.com/sponsors/sindresorhus" 2502 | } 2503 | }, 2504 | "node_modules/p-locate": { 2505 | "version": "5.0.0", 2506 | "dev": true, 2507 | "license": "MIT", 2508 | "dependencies": { 2509 | "p-limit": "^3.0.2" 2510 | }, 2511 | "engines": { 2512 | "node": ">=10" 2513 | }, 2514 | "funding": { 2515 | "url": "https://github.com/sponsors/sindresorhus" 2516 | } 2517 | }, 2518 | "node_modules/package-json-from-dist": { 2519 | "version": "1.0.0", 2520 | "license": "BlueOak-1.0.0" 2521 | }, 2522 | "node_modules/parent-module": { 2523 | "version": "1.0.1", 2524 | "dev": true, 2525 | "license": "MIT", 2526 | "dependencies": { 2527 | "callsites": "^3.0.0" 2528 | }, 2529 | "engines": { 2530 | "node": ">=6" 2531 | } 2532 | }, 2533 | "node_modules/path-exists": { 2534 | "version": "4.0.0", 2535 | "dev": true, 2536 | "license": "MIT", 2537 | "engines": { 2538 | "node": ">=8" 2539 | } 2540 | }, 2541 | "node_modules/path-key": { 2542 | "version": "3.1.1", 2543 | "license": "MIT", 2544 | "engines": { 2545 | "node": ">=8" 2546 | } 2547 | }, 2548 | "node_modules/path-parse": { 2549 | "version": "1.0.7", 2550 | "license": "MIT" 2551 | }, 2552 | "node_modules/path-scurry": { 2553 | "version": "1.11.1", 2554 | "license": "BlueOak-1.0.0", 2555 | "dependencies": { 2556 | "lru-cache": "^10.2.0", 2557 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2558 | }, 2559 | "engines": { 2560 | "node": ">=16 || 14 >=14.18" 2561 | }, 2562 | "funding": { 2563 | "url": "https://github.com/sponsors/isaacs" 2564 | } 2565 | }, 2566 | "node_modules/picocolors": { 2567 | "version": "1.1.0", 2568 | "license": "ISC" 2569 | }, 2570 | "node_modules/picomatch": { 2571 | "version": "2.3.1", 2572 | "license": "MIT", 2573 | "engines": { 2574 | "node": ">=8.6" 2575 | }, 2576 | "funding": { 2577 | "url": "https://github.com/sponsors/jonschlinkert" 2578 | } 2579 | }, 2580 | "node_modules/pify": { 2581 | "version": "2.3.0", 2582 | "license": "MIT", 2583 | "engines": { 2584 | "node": ">=0.10.0" 2585 | } 2586 | }, 2587 | "node_modules/pirates": { 2588 | "version": "4.0.6", 2589 | "license": "MIT", 2590 | "engines": { 2591 | "node": ">= 6" 2592 | } 2593 | }, 2594 | "node_modules/postcss": { 2595 | "version": "8.4.45", 2596 | "funding": [ 2597 | { 2598 | "type": "opencollective", 2599 | "url": "https://opencollective.com/postcss/" 2600 | }, 2601 | { 2602 | "type": "tidelift", 2603 | "url": "https://tidelift.com/funding/github/npm/postcss" 2604 | }, 2605 | { 2606 | "type": "github", 2607 | "url": "https://github.com/sponsors/ai" 2608 | } 2609 | ], 2610 | "license": "MIT", 2611 | "dependencies": { 2612 | "nanoid": "^3.3.7", 2613 | "picocolors": "^1.0.1", 2614 | "source-map-js": "^1.2.0" 2615 | }, 2616 | "engines": { 2617 | "node": "^10 || ^12 || >=14" 2618 | } 2619 | }, 2620 | "node_modules/postcss-import": { 2621 | "version": "15.1.0", 2622 | "license": "MIT", 2623 | "dependencies": { 2624 | "postcss-value-parser": "^4.0.0", 2625 | "read-cache": "^1.0.0", 2626 | "resolve": "^1.1.7" 2627 | }, 2628 | "engines": { 2629 | "node": ">=14.0.0" 2630 | }, 2631 | "peerDependencies": { 2632 | "postcss": "^8.0.0" 2633 | } 2634 | }, 2635 | "node_modules/postcss-js": { 2636 | "version": "4.0.1", 2637 | "license": "MIT", 2638 | "dependencies": { 2639 | "camelcase-css": "^2.0.1" 2640 | }, 2641 | "engines": { 2642 | "node": "^12 || ^14 || >= 16" 2643 | }, 2644 | "funding": { 2645 | "type": "opencollective", 2646 | "url": "https://opencollective.com/postcss/" 2647 | }, 2648 | "peerDependencies": { 2649 | "postcss": "^8.4.21" 2650 | } 2651 | }, 2652 | "node_modules/postcss-load-config": { 2653 | "version": "4.0.2", 2654 | "funding": [ 2655 | { 2656 | "type": "opencollective", 2657 | "url": "https://opencollective.com/postcss/" 2658 | }, 2659 | { 2660 | "type": "github", 2661 | "url": "https://github.com/sponsors/ai" 2662 | } 2663 | ], 2664 | "license": "MIT", 2665 | "dependencies": { 2666 | "lilconfig": "^3.0.0", 2667 | "yaml": "^2.3.4" 2668 | }, 2669 | "engines": { 2670 | "node": ">= 14" 2671 | }, 2672 | "peerDependencies": { 2673 | "postcss": ">=8.0.9", 2674 | "ts-node": ">=9.0.0" 2675 | }, 2676 | "peerDependenciesMeta": { 2677 | "postcss": { 2678 | "optional": true 2679 | }, 2680 | "ts-node": { 2681 | "optional": true 2682 | } 2683 | } 2684 | }, 2685 | "node_modules/postcss-load-config/node_modules/lilconfig": { 2686 | "version": "3.1.2", 2687 | "license": "MIT", 2688 | "engines": { 2689 | "node": ">=14" 2690 | }, 2691 | "funding": { 2692 | "url": "https://github.com/sponsors/antonk52" 2693 | } 2694 | }, 2695 | "node_modules/postcss-nested": { 2696 | "version": "6.2.0", 2697 | "funding": [ 2698 | { 2699 | "type": "opencollective", 2700 | "url": "https://opencollective.com/postcss/" 2701 | }, 2702 | { 2703 | "type": "github", 2704 | "url": "https://github.com/sponsors/ai" 2705 | } 2706 | ], 2707 | "license": "MIT", 2708 | "dependencies": { 2709 | "postcss-selector-parser": "^6.1.1" 2710 | }, 2711 | "engines": { 2712 | "node": ">=12.0" 2713 | }, 2714 | "peerDependencies": { 2715 | "postcss": "^8.2.14" 2716 | } 2717 | }, 2718 | "node_modules/postcss-selector-parser": { 2719 | "version": "6.1.2", 2720 | "license": "MIT", 2721 | "dependencies": { 2722 | "cssesc": "^3.0.0", 2723 | "util-deprecate": "^1.0.2" 2724 | }, 2725 | "engines": { 2726 | "node": ">=4" 2727 | } 2728 | }, 2729 | "node_modules/postcss-value-parser": { 2730 | "version": "4.2.0", 2731 | "license": "MIT" 2732 | }, 2733 | "node_modules/prelude-ls": { 2734 | "version": "1.2.1", 2735 | "dev": true, 2736 | "license": "MIT", 2737 | "engines": { 2738 | "node": ">= 0.8.0" 2739 | } 2740 | }, 2741 | "node_modules/proxy-from-env": { 2742 | "version": "1.1.0", 2743 | "license": "MIT" 2744 | }, 2745 | "node_modules/punycode": { 2746 | "version": "2.3.1", 2747 | "dev": true, 2748 | "license": "MIT", 2749 | "engines": { 2750 | "node": ">=6" 2751 | } 2752 | }, 2753 | "node_modules/queue-microtask": { 2754 | "version": "1.2.3", 2755 | "funding": [ 2756 | { 2757 | "type": "github", 2758 | "url": "https://github.com/sponsors/feross" 2759 | }, 2760 | { 2761 | "type": "patreon", 2762 | "url": "https://www.patreon.com/feross" 2763 | }, 2764 | { 2765 | "type": "consulting", 2766 | "url": "https://feross.org/support" 2767 | } 2768 | ], 2769 | "license": "MIT" 2770 | }, 2771 | "node_modules/react": { 2772 | "version": "18.3.1", 2773 | "license": "MIT", 2774 | "dependencies": { 2775 | "loose-envify": "^1.1.0" 2776 | }, 2777 | "engines": { 2778 | "node": ">=0.10.0" 2779 | } 2780 | }, 2781 | "node_modules/react-dom": { 2782 | "version": "18.3.1", 2783 | "license": "MIT", 2784 | "dependencies": { 2785 | "loose-envify": "^1.1.0", 2786 | "scheduler": "^0.23.2" 2787 | }, 2788 | "peerDependencies": { 2789 | "react": "^18.3.1" 2790 | } 2791 | }, 2792 | "node_modules/react-number-format": { 2793 | "version": "5.4.1", 2794 | "license": "MIT", 2795 | "peerDependencies": { 2796 | "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", 2797 | "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" 2798 | } 2799 | }, 2800 | "node_modules/react-remove-scroll": { 2801 | "version": "2.5.7", 2802 | "license": "MIT", 2803 | "dependencies": { 2804 | "react-remove-scroll-bar": "^2.3.4", 2805 | "react-style-singleton": "^2.2.1", 2806 | "tslib": "^2.1.0", 2807 | "use-callback-ref": "^1.3.0", 2808 | "use-sidecar": "^1.1.2" 2809 | }, 2810 | "engines": { 2811 | "node": ">=10" 2812 | }, 2813 | "peerDependencies": { 2814 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", 2815 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 2816 | }, 2817 | "peerDependenciesMeta": { 2818 | "@types/react": { 2819 | "optional": true 2820 | } 2821 | } 2822 | }, 2823 | "node_modules/react-remove-scroll-bar": { 2824 | "version": "2.3.6", 2825 | "license": "MIT", 2826 | "dependencies": { 2827 | "react-style-singleton": "^2.2.1", 2828 | "tslib": "^2.0.0" 2829 | }, 2830 | "engines": { 2831 | "node": ">=10" 2832 | }, 2833 | "peerDependencies": { 2834 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", 2835 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 2836 | }, 2837 | "peerDependenciesMeta": { 2838 | "@types/react": { 2839 | "optional": true 2840 | } 2841 | } 2842 | }, 2843 | "node_modules/react-router": { 2844 | "version": "6.27.0", 2845 | "license": "MIT", 2846 | "dependencies": { 2847 | "@remix-run/router": "1.20.0" 2848 | }, 2849 | "engines": { 2850 | "node": ">=14.0.0" 2851 | }, 2852 | "peerDependencies": { 2853 | "react": ">=16.8" 2854 | } 2855 | }, 2856 | "node_modules/react-router-dom": { 2857 | "version": "6.27.0", 2858 | "license": "MIT", 2859 | "dependencies": { 2860 | "@remix-run/router": "1.20.0", 2861 | "react-router": "6.27.0" 2862 | }, 2863 | "engines": { 2864 | "node": ">=14.0.0" 2865 | }, 2866 | "peerDependencies": { 2867 | "react": ">=16.8", 2868 | "react-dom": ">=16.8" 2869 | } 2870 | }, 2871 | "node_modules/react-style-singleton": { 2872 | "version": "2.2.1", 2873 | "license": "MIT", 2874 | "dependencies": { 2875 | "get-nonce": "^1.0.0", 2876 | "invariant": "^2.2.4", 2877 | "tslib": "^2.0.0" 2878 | }, 2879 | "engines": { 2880 | "node": ">=10" 2881 | }, 2882 | "peerDependencies": { 2883 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", 2884 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 2885 | }, 2886 | "peerDependenciesMeta": { 2887 | "@types/react": { 2888 | "optional": true 2889 | } 2890 | } 2891 | }, 2892 | "node_modules/react-textarea-autosize": { 2893 | "version": "8.5.3", 2894 | "license": "MIT", 2895 | "dependencies": { 2896 | "@babel/runtime": "^7.20.13", 2897 | "use-composed-ref": "^1.3.0", 2898 | "use-latest": "^1.2.1" 2899 | }, 2900 | "engines": { 2901 | "node": ">=10" 2902 | }, 2903 | "peerDependencies": { 2904 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 2905 | } 2906 | }, 2907 | "node_modules/read-cache": { 2908 | "version": "1.0.0", 2909 | "license": "MIT", 2910 | "dependencies": { 2911 | "pify": "^2.3.0" 2912 | } 2913 | }, 2914 | "node_modules/readdirp": { 2915 | "version": "3.6.0", 2916 | "license": "MIT", 2917 | "dependencies": { 2918 | "picomatch": "^2.2.1" 2919 | }, 2920 | "engines": { 2921 | "node": ">=8.10.0" 2922 | } 2923 | }, 2924 | "node_modules/regenerator-runtime": { 2925 | "version": "0.14.1", 2926 | "license": "MIT" 2927 | }, 2928 | "node_modules/resolve": { 2929 | "version": "1.22.8", 2930 | "license": "MIT", 2931 | "dependencies": { 2932 | "is-core-module": "^2.13.0", 2933 | "path-parse": "^1.0.7", 2934 | "supports-preserve-symlinks-flag": "^1.0.0" 2935 | }, 2936 | "bin": { 2937 | "resolve": "bin/resolve" 2938 | }, 2939 | "funding": { 2940 | "url": "https://github.com/sponsors/ljharb" 2941 | } 2942 | }, 2943 | "node_modules/resolve-from": { 2944 | "version": "4.0.0", 2945 | "dev": true, 2946 | "license": "MIT", 2947 | "engines": { 2948 | "node": ">=4" 2949 | } 2950 | }, 2951 | "node_modules/reusify": { 2952 | "version": "1.0.4", 2953 | "license": "MIT", 2954 | "engines": { 2955 | "iojs": ">=1.0.0", 2956 | "node": ">=0.10.0" 2957 | } 2958 | }, 2959 | "node_modules/rollup": { 2960 | "version": "4.21.2", 2961 | "dev": true, 2962 | "license": "MIT", 2963 | "dependencies": { 2964 | "@types/estree": "1.0.5" 2965 | }, 2966 | "bin": { 2967 | "rollup": "dist/bin/rollup" 2968 | }, 2969 | "engines": { 2970 | "node": ">=18.0.0", 2971 | "npm": ">=8.0.0" 2972 | }, 2973 | "optionalDependencies": { 2974 | "@rollup/rollup-android-arm-eabi": "4.21.2", 2975 | "@rollup/rollup-android-arm64": "4.21.2", 2976 | "@rollup/rollup-darwin-arm64": "4.21.2", 2977 | "@rollup/rollup-darwin-x64": "4.21.2", 2978 | "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", 2979 | "@rollup/rollup-linux-arm-musleabihf": "4.21.2", 2980 | "@rollup/rollup-linux-arm64-gnu": "4.21.2", 2981 | "@rollup/rollup-linux-arm64-musl": "4.21.2", 2982 | "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", 2983 | "@rollup/rollup-linux-riscv64-gnu": "4.21.2", 2984 | "@rollup/rollup-linux-s390x-gnu": "4.21.2", 2985 | "@rollup/rollup-linux-x64-gnu": "4.21.2", 2986 | "@rollup/rollup-linux-x64-musl": "4.21.2", 2987 | "@rollup/rollup-win32-arm64-msvc": "4.21.2", 2988 | "@rollup/rollup-win32-ia32-msvc": "4.21.2", 2989 | "@rollup/rollup-win32-x64-msvc": "4.21.2", 2990 | "fsevents": "~2.3.2" 2991 | } 2992 | }, 2993 | "node_modules/run-parallel": { 2994 | "version": "1.2.0", 2995 | "funding": [ 2996 | { 2997 | "type": "github", 2998 | "url": "https://github.com/sponsors/feross" 2999 | }, 3000 | { 3001 | "type": "patreon", 3002 | "url": "https://www.patreon.com/feross" 3003 | }, 3004 | { 3005 | "type": "consulting", 3006 | "url": "https://feross.org/support" 3007 | } 3008 | ], 3009 | "license": "MIT", 3010 | "dependencies": { 3011 | "queue-microtask": "^1.2.2" 3012 | } 3013 | }, 3014 | "node_modules/scheduler": { 3015 | "version": "0.23.2", 3016 | "license": "MIT", 3017 | "dependencies": { 3018 | "loose-envify": "^1.1.0" 3019 | } 3020 | }, 3021 | "node_modules/semver": { 3022 | "version": "7.6.3", 3023 | "dev": true, 3024 | "license": "ISC", 3025 | "bin": { 3026 | "semver": "bin/semver.js" 3027 | }, 3028 | "engines": { 3029 | "node": ">=10" 3030 | } 3031 | }, 3032 | "node_modules/shebang-command": { 3033 | "version": "2.0.0", 3034 | "license": "MIT", 3035 | "dependencies": { 3036 | "shebang-regex": "^3.0.0" 3037 | }, 3038 | "engines": { 3039 | "node": ">=8" 3040 | } 3041 | }, 3042 | "node_modules/shebang-regex": { 3043 | "version": "3.0.0", 3044 | "license": "MIT", 3045 | "engines": { 3046 | "node": ">=8" 3047 | } 3048 | }, 3049 | "node_modules/signal-exit": { 3050 | "version": "4.1.0", 3051 | "license": "ISC", 3052 | "engines": { 3053 | "node": ">=14" 3054 | }, 3055 | "funding": { 3056 | "url": "https://github.com/sponsors/isaacs" 3057 | } 3058 | }, 3059 | "node_modules/source-map-js": { 3060 | "version": "1.2.0", 3061 | "license": "BSD-3-Clause", 3062 | "engines": { 3063 | "node": ">=0.10.0" 3064 | } 3065 | }, 3066 | "node_modules/string-width": { 3067 | "version": "5.1.2", 3068 | "license": "MIT", 3069 | "dependencies": { 3070 | "eastasianwidth": "^0.2.0", 3071 | "emoji-regex": "^9.2.2", 3072 | "strip-ansi": "^7.0.1" 3073 | }, 3074 | "engines": { 3075 | "node": ">=12" 3076 | }, 3077 | "funding": { 3078 | "url": "https://github.com/sponsors/sindresorhus" 3079 | } 3080 | }, 3081 | "node_modules/string-width-cjs": { 3082 | "name": "string-width", 3083 | "version": "4.2.3", 3084 | "license": "MIT", 3085 | "dependencies": { 3086 | "emoji-regex": "^8.0.0", 3087 | "is-fullwidth-code-point": "^3.0.0", 3088 | "strip-ansi": "^6.0.1" 3089 | }, 3090 | "engines": { 3091 | "node": ">=8" 3092 | } 3093 | }, 3094 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 3095 | "version": "8.0.0", 3096 | "license": "MIT" 3097 | }, 3098 | "node_modules/string-width/node_modules/strip-ansi": { 3099 | "version": "7.1.0", 3100 | "license": "MIT", 3101 | "dependencies": { 3102 | "ansi-regex": "^6.0.1" 3103 | }, 3104 | "engines": { 3105 | "node": ">=12" 3106 | }, 3107 | "funding": { 3108 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 3109 | } 3110 | }, 3111 | "node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { 3112 | "version": "6.0.1", 3113 | "license": "MIT", 3114 | "engines": { 3115 | "node": ">=12" 3116 | }, 3117 | "funding": { 3118 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 3119 | } 3120 | }, 3121 | "node_modules/strip-ansi": { 3122 | "version": "6.0.1", 3123 | "license": "MIT", 3124 | "dependencies": { 3125 | "ansi-regex": "^5.0.1" 3126 | }, 3127 | "engines": { 3128 | "node": ">=8" 3129 | } 3130 | }, 3131 | "node_modules/strip-ansi-cjs": { 3132 | "name": "strip-ansi", 3133 | "version": "6.0.1", 3134 | "license": "MIT", 3135 | "dependencies": { 3136 | "ansi-regex": "^5.0.1" 3137 | }, 3138 | "engines": { 3139 | "node": ">=8" 3140 | } 3141 | }, 3142 | "node_modules/strip-json-comments": { 3143 | "version": "3.1.1", 3144 | "dev": true, 3145 | "license": "MIT", 3146 | "engines": { 3147 | "node": ">=8" 3148 | }, 3149 | "funding": { 3150 | "url": "https://github.com/sponsors/sindresorhus" 3151 | } 3152 | }, 3153 | "node_modules/sucrase": { 3154 | "version": "3.35.0", 3155 | "license": "MIT", 3156 | "dependencies": { 3157 | "@jridgewell/gen-mapping": "^0.3.2", 3158 | "commander": "^4.0.0", 3159 | "glob": "^10.3.10", 3160 | "lines-and-columns": "^1.1.6", 3161 | "mz": "^2.7.0", 3162 | "pirates": "^4.0.1", 3163 | "ts-interface-checker": "^0.1.9" 3164 | }, 3165 | "bin": { 3166 | "sucrase": "bin/sucrase", 3167 | "sucrase-node": "bin/sucrase-node" 3168 | }, 3169 | "engines": { 3170 | "node": ">=16 || 14 >=14.17" 3171 | } 3172 | }, 3173 | "node_modules/supports-color": { 3174 | "version": "7.2.0", 3175 | "dev": true, 3176 | "license": "MIT", 3177 | "dependencies": { 3178 | "has-flag": "^4.0.0" 3179 | }, 3180 | "engines": { 3181 | "node": ">=8" 3182 | } 3183 | }, 3184 | "node_modules/supports-preserve-symlinks-flag": { 3185 | "version": "1.0.0", 3186 | "license": "MIT", 3187 | "engines": { 3188 | "node": ">= 0.4" 3189 | }, 3190 | "funding": { 3191 | "url": "https://github.com/sponsors/ljharb" 3192 | } 3193 | }, 3194 | "node_modules/tabbable": { 3195 | "version": "6.2.0", 3196 | "license": "MIT" 3197 | }, 3198 | "node_modules/tailwind-merge": { 3199 | "version": "2.5.2", 3200 | "license": "MIT", 3201 | "funding": { 3202 | "type": "github", 3203 | "url": "https://github.com/sponsors/dcastil" 3204 | } 3205 | }, 3206 | "node_modules/tailwindcss": { 3207 | "version": "3.4.10", 3208 | "license": "MIT", 3209 | "dependencies": { 3210 | "@alloc/quick-lru": "^5.2.0", 3211 | "arg": "^5.0.2", 3212 | "chokidar": "^3.5.3", 3213 | "didyoumean": "^1.2.2", 3214 | "dlv": "^1.1.3", 3215 | "fast-glob": "^3.3.0", 3216 | "glob-parent": "^6.0.2", 3217 | "is-glob": "^4.0.3", 3218 | "jiti": "^1.21.0", 3219 | "lilconfig": "^2.1.0", 3220 | "micromatch": "^4.0.5", 3221 | "normalize-path": "^3.0.0", 3222 | "object-hash": "^3.0.0", 3223 | "picocolors": "^1.0.0", 3224 | "postcss": "^8.4.23", 3225 | "postcss-import": "^15.1.0", 3226 | "postcss-js": "^4.0.1", 3227 | "postcss-load-config": "^4.0.1", 3228 | "postcss-nested": "^6.0.1", 3229 | "postcss-selector-parser": "^6.0.11", 3230 | "resolve": "^1.22.2", 3231 | "sucrase": "^3.32.0" 3232 | }, 3233 | "bin": { 3234 | "tailwind": "lib/cli.js", 3235 | "tailwindcss": "lib/cli.js" 3236 | }, 3237 | "engines": { 3238 | "node": ">=14.0.0" 3239 | } 3240 | }, 3241 | "node_modules/tailwindcss-animate": { 3242 | "version": "1.0.7", 3243 | "license": "MIT", 3244 | "peerDependencies": { 3245 | "tailwindcss": ">=3.0.0 || insiders" 3246 | } 3247 | }, 3248 | "node_modules/text-table": { 3249 | "version": "0.2.0", 3250 | "dev": true, 3251 | "license": "MIT" 3252 | }, 3253 | "node_modules/thenify": { 3254 | "version": "3.3.1", 3255 | "license": "MIT", 3256 | "dependencies": { 3257 | "any-promise": "^1.0.0" 3258 | } 3259 | }, 3260 | "node_modules/thenify-all": { 3261 | "version": "1.6.0", 3262 | "license": "MIT", 3263 | "dependencies": { 3264 | "thenify": ">= 3.1.0 < 4" 3265 | }, 3266 | "engines": { 3267 | "node": ">=0.8" 3268 | } 3269 | }, 3270 | "node_modules/to-regex-range": { 3271 | "version": "5.0.1", 3272 | "license": "MIT", 3273 | "dependencies": { 3274 | "is-number": "^7.0.0" 3275 | }, 3276 | "engines": { 3277 | "node": ">=8.0" 3278 | } 3279 | }, 3280 | "node_modules/ts-api-utils": { 3281 | "version": "1.3.0", 3282 | "dev": true, 3283 | "license": "MIT", 3284 | "engines": { 3285 | "node": ">=16" 3286 | }, 3287 | "peerDependencies": { 3288 | "typescript": ">=4.2.0" 3289 | } 3290 | }, 3291 | "node_modules/ts-interface-checker": { 3292 | "version": "0.1.13", 3293 | "license": "Apache-2.0" 3294 | }, 3295 | "node_modules/tslib": { 3296 | "version": "2.7.0", 3297 | "license": "0BSD" 3298 | }, 3299 | "node_modules/type-check": { 3300 | "version": "0.4.0", 3301 | "dev": true, 3302 | "license": "MIT", 3303 | "dependencies": { 3304 | "prelude-ls": "^1.2.1" 3305 | }, 3306 | "engines": { 3307 | "node": ">= 0.8.0" 3308 | } 3309 | }, 3310 | "node_modules/type-fest": { 3311 | "version": "4.26.0", 3312 | "license": "(MIT OR CC0-1.0)", 3313 | "engines": { 3314 | "node": ">=16" 3315 | }, 3316 | "funding": { 3317 | "url": "https://github.com/sponsors/sindresorhus" 3318 | } 3319 | }, 3320 | "node_modules/typescript": { 3321 | "version": "5.5.4", 3322 | "dev": true, 3323 | "license": "Apache-2.0", 3324 | "bin": { 3325 | "tsc": "bin/tsc", 3326 | "tsserver": "bin/tsserver" 3327 | }, 3328 | "engines": { 3329 | "node": ">=14.17" 3330 | } 3331 | }, 3332 | "node_modules/typescript-eslint": { 3333 | "version": "8.4.0", 3334 | "dev": true, 3335 | "license": "MIT", 3336 | "dependencies": { 3337 | "@typescript-eslint/eslint-plugin": "8.4.0", 3338 | "@typescript-eslint/parser": "8.4.0", 3339 | "@typescript-eslint/utils": "8.4.0" 3340 | }, 3341 | "engines": { 3342 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 3343 | }, 3344 | "funding": { 3345 | "type": "opencollective", 3346 | "url": "https://opencollective.com/typescript-eslint" 3347 | }, 3348 | "peerDependenciesMeta": { 3349 | "typescript": { 3350 | "optional": true 3351 | } 3352 | } 3353 | }, 3354 | "node_modules/undici-types": { 3355 | "version": "6.19.8", 3356 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 3357 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 3358 | "dev": true, 3359 | "license": "MIT" 3360 | }, 3361 | "node_modules/update-browserslist-db": { 3362 | "version": "1.1.0", 3363 | "dev": true, 3364 | "funding": [ 3365 | { 3366 | "type": "opencollective", 3367 | "url": "https://opencollective.com/browserslist" 3368 | }, 3369 | { 3370 | "type": "tidelift", 3371 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3372 | }, 3373 | { 3374 | "type": "github", 3375 | "url": "https://github.com/sponsors/ai" 3376 | } 3377 | ], 3378 | "license": "MIT", 3379 | "dependencies": { 3380 | "escalade": "^3.1.2", 3381 | "picocolors": "^1.0.1" 3382 | }, 3383 | "bin": { 3384 | "update-browserslist-db": "cli.js" 3385 | }, 3386 | "peerDependencies": { 3387 | "browserslist": ">= 4.21.0" 3388 | } 3389 | }, 3390 | "node_modules/uri-js": { 3391 | "version": "4.4.1", 3392 | "dev": true, 3393 | "license": "BSD-2-Clause", 3394 | "dependencies": { 3395 | "punycode": "^2.1.0" 3396 | } 3397 | }, 3398 | "node_modules/use-callback-ref": { 3399 | "version": "1.3.2", 3400 | "license": "MIT", 3401 | "dependencies": { 3402 | "tslib": "^2.0.0" 3403 | }, 3404 | "engines": { 3405 | "node": ">=10" 3406 | }, 3407 | "peerDependencies": { 3408 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", 3409 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3410 | }, 3411 | "peerDependenciesMeta": { 3412 | "@types/react": { 3413 | "optional": true 3414 | } 3415 | } 3416 | }, 3417 | "node_modules/use-composed-ref": { 3418 | "version": "1.3.0", 3419 | "license": "MIT", 3420 | "peerDependencies": { 3421 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3422 | } 3423 | }, 3424 | "node_modules/use-isomorphic-layout-effect": { 3425 | "version": "1.1.2", 3426 | "license": "MIT", 3427 | "peerDependencies": { 3428 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3429 | }, 3430 | "peerDependenciesMeta": { 3431 | "@types/react": { 3432 | "optional": true 3433 | } 3434 | } 3435 | }, 3436 | "node_modules/use-latest": { 3437 | "version": "1.2.1", 3438 | "license": "MIT", 3439 | "dependencies": { 3440 | "use-isomorphic-layout-effect": "^1.1.1" 3441 | }, 3442 | "peerDependencies": { 3443 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3444 | }, 3445 | "peerDependenciesMeta": { 3446 | "@types/react": { 3447 | "optional": true 3448 | } 3449 | } 3450 | }, 3451 | "node_modules/use-sidecar": { 3452 | "version": "1.1.2", 3453 | "license": "MIT", 3454 | "dependencies": { 3455 | "detect-node-es": "^1.1.0", 3456 | "tslib": "^2.0.0" 3457 | }, 3458 | "engines": { 3459 | "node": ">=10" 3460 | }, 3461 | "peerDependencies": { 3462 | "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", 3463 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3464 | }, 3465 | "peerDependenciesMeta": { 3466 | "@types/react": { 3467 | "optional": true 3468 | } 3469 | } 3470 | }, 3471 | "node_modules/util-deprecate": { 3472 | "version": "1.0.2", 3473 | "license": "MIT" 3474 | }, 3475 | "node_modules/vite": { 3476 | "version": "5.4.3", 3477 | "dev": true, 3478 | "license": "MIT", 3479 | "dependencies": { 3480 | "esbuild": "^0.21.3", 3481 | "postcss": "^8.4.43", 3482 | "rollup": "^4.20.0" 3483 | }, 3484 | "bin": { 3485 | "vite": "bin/vite.js" 3486 | }, 3487 | "engines": { 3488 | "node": "^18.0.0 || >=20.0.0" 3489 | }, 3490 | "funding": { 3491 | "url": "https://github.com/vitejs/vite?sponsor=1" 3492 | }, 3493 | "optionalDependencies": { 3494 | "fsevents": "~2.3.3" 3495 | }, 3496 | "peerDependencies": { 3497 | "@types/node": "^18.0.0 || >=20.0.0", 3498 | "less": "*", 3499 | "lightningcss": "^1.21.0", 3500 | "sass": "*", 3501 | "sass-embedded": "*", 3502 | "stylus": "*", 3503 | "sugarss": "*", 3504 | "terser": "^5.4.0" 3505 | }, 3506 | "peerDependenciesMeta": { 3507 | "@types/node": { 3508 | "optional": true 3509 | }, 3510 | "less": { 3511 | "optional": true 3512 | }, 3513 | "lightningcss": { 3514 | "optional": true 3515 | }, 3516 | "sass": { 3517 | "optional": true 3518 | }, 3519 | "sass-embedded": { 3520 | "optional": true 3521 | }, 3522 | "stylus": { 3523 | "optional": true 3524 | }, 3525 | "sugarss": { 3526 | "optional": true 3527 | }, 3528 | "terser": { 3529 | "optional": true 3530 | } 3531 | } 3532 | }, 3533 | "node_modules/which": { 3534 | "version": "2.0.2", 3535 | "license": "ISC", 3536 | "dependencies": { 3537 | "isexe": "^2.0.0" 3538 | }, 3539 | "bin": { 3540 | "node-which": "bin/node-which" 3541 | }, 3542 | "engines": { 3543 | "node": ">= 8" 3544 | } 3545 | }, 3546 | "node_modules/word-wrap": { 3547 | "version": "1.2.5", 3548 | "dev": true, 3549 | "license": "MIT", 3550 | "engines": { 3551 | "node": ">=0.10.0" 3552 | } 3553 | }, 3554 | "node_modules/wrap-ansi": { 3555 | "version": "8.1.0", 3556 | "license": "MIT", 3557 | "dependencies": { 3558 | "ansi-styles": "^6.1.0", 3559 | "string-width": "^5.0.1", 3560 | "strip-ansi": "^7.0.1" 3561 | }, 3562 | "engines": { 3563 | "node": ">=12" 3564 | }, 3565 | "funding": { 3566 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3567 | } 3568 | }, 3569 | "node_modules/wrap-ansi-cjs": { 3570 | "name": "wrap-ansi", 3571 | "version": "7.0.0", 3572 | "license": "MIT", 3573 | "dependencies": { 3574 | "ansi-styles": "^4.0.0", 3575 | "string-width": "^4.1.0", 3576 | "strip-ansi": "^6.0.0" 3577 | }, 3578 | "engines": { 3579 | "node": ">=10" 3580 | }, 3581 | "funding": { 3582 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3583 | } 3584 | }, 3585 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3586 | "version": "4.2.3", 3587 | "license": "MIT", 3588 | "dependencies": { 3589 | "emoji-regex": "^8.0.0", 3590 | "is-fullwidth-code-point": "^3.0.0", 3591 | "strip-ansi": "^6.0.1" 3592 | }, 3593 | "engines": { 3594 | "node": ">=8" 3595 | } 3596 | }, 3597 | "node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex": { 3598 | "version": "8.0.0", 3599 | "license": "MIT" 3600 | }, 3601 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 3602 | "version": "6.2.1", 3603 | "license": "MIT", 3604 | "engines": { 3605 | "node": ">=12" 3606 | }, 3607 | "funding": { 3608 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3609 | } 3610 | }, 3611 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 3612 | "version": "7.1.0", 3613 | "license": "MIT", 3614 | "dependencies": { 3615 | "ansi-regex": "^6.0.1" 3616 | }, 3617 | "engines": { 3618 | "node": ">=12" 3619 | }, 3620 | "funding": { 3621 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 3622 | } 3623 | }, 3624 | "node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex": { 3625 | "version": "6.0.1", 3626 | "license": "MIT", 3627 | "engines": { 3628 | "node": ">=12" 3629 | }, 3630 | "funding": { 3631 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 3632 | } 3633 | }, 3634 | "node_modules/yaml": { 3635 | "version": "2.5.1", 3636 | "license": "ISC", 3637 | "bin": { 3638 | "yaml": "bin.mjs" 3639 | }, 3640 | "engines": { 3641 | "node": ">= 14" 3642 | } 3643 | }, 3644 | "node_modules/yocto-queue": { 3645 | "version": "0.1.0", 3646 | "dev": true, 3647 | "license": "MIT", 3648 | "engines": { 3649 | "node": ">=10" 3650 | }, 3651 | "funding": { 3652 | "url": "https://github.com/sponsors/sindresorhus" 3653 | } 3654 | } 3655 | } 3656 | } 3657 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gentlemanreact", 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 | "@mantine/core": "^7.12.2", 14 | "@mantine/hooks": "^7.12.2", 15 | "@radix-ui/react-icons": "^1.3.0", 16 | "@radix-ui/react-menubar": "^1.1.1", 17 | "@radix-ui/react-slot": "^1.1.0", 18 | "@tabler/icons-react": "^3.14.0", 19 | "axios": "^1.7.7", 20 | "class-variance-authority": "^0.7.0", 21 | "clsx": "^2.1.1", 22 | "lucide-react": "^0.439.0", 23 | "react": "^18.3.1", 24 | "react-dom": "^18.3.1", 25 | "react-router-dom": "^6.27.0", 26 | "tailwind-merge": "^2.5.2", 27 | "tailwindcss-animate": "^1.0.7" 28 | }, 29 | "devDependencies": { 30 | "@eslint/js": "^9.9.0", 31 | "@types/node": "^22.7.6", 32 | "@types/react": "^18.3.3", 33 | "@types/react-dom": "^18.3.0", 34 | "@vitejs/plugin-react-swc": "^3.5.0", 35 | "autoprefixer": "^10.4.20", 36 | "eslint": "^9.9.0", 37 | "eslint-plugin-react-hooks": "^5.1.0-rc.0", 38 | "eslint-plugin-react-refresh": "^0.4.9", 39 | "globals": "^15.9.0", 40 | "postcss": "^8.4.45", 41 | "tailwindcss": "^3.4.10", 42 | "typescript": "^5.5.3", 43 | "typescript-eslint": "^8.0.1", 44 | "vite": "^5.4.1" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gentleman-Programming/React-Desde-0-a-Avanzado/d8640cbde165b46f450bd3f227042acc8d150dcb/src/App.css -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import './App.css' 3 | 4 | interface Props { 5 | children: ReactNode 6 | } 7 | 8 | function App({ children }: Props) { 9 | 10 | return ( 11 | <> 12 |

Navbar

13 | {children} 14 |

Footer

15 | 16 | ) 17 | } 18 | 19 | export default App 20 | -------------------------------------------------------------------------------- /src/AppHookContainer.tsx: -------------------------------------------------------------------------------- 1 | 2 | import App from './App' 3 | import './App.css' 4 | import { AppRouter } from './AppRouter' 5 | import { ModalProvider } from './components/Modal/context' 6 | import { GlobalProvider } from './context/global.provider' 7 | import ErrorBoundary from './ErrorBoundary' 8 | 9 | function AppHookContainer() { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ) 21 | } 22 | 23 | export default AppHookContainer; 24 | -------------------------------------------------------------------------------- /src/AppRouter.tsx: -------------------------------------------------------------------------------- 1 | import { BrowserRouter, Navigate, Route } from 'react-router-dom' 2 | import { Login } from "./public/Login/Login" 3 | import { PrivateGuard } from "./guard/PrivateGuard" 4 | import { PrivateRouter } from "./private/PrivateRouter" 5 | import { RoutesWithNotFound } from './components/RoutesWithNotFound/RoutesWithNotFound' 6 | import { AppRoutes } from './models' 7 | 8 | export const AppRouter = () => { 9 | return ( 10 | 11 | 12 | } /> 13 | } /> 14 | }> 15 | } /> 16 | 17 | 18 | 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /src/ErrorBoundary.tsx: -------------------------------------------------------------------------------- 1 | import { Component, ErrorInfo, ReactNode } from "react"; 2 | 3 | interface ErrorBoundaryState { 4 | hasError: boolean; 5 | } 6 | 7 | interface ErrorBoundaryProps { 8 | children: ReactNode 9 | } 10 | 11 | class ErrorBoundary extends Component { 12 | constructor(props: ErrorBoundaryProps) { 13 | super(props) 14 | this.state = { hasError: false } 15 | } 16 | 17 | static getDerivedStateFromError(error: Error): ErrorBoundaryState { 18 | console.log("Derived Error", error) 19 | return { hasError: true } 20 | } 21 | 22 | componentDidCatch(error: Error, errorInfo: ErrorInfo): void { 23 | console.log('Error: ', error) 24 | console.log('Error Info: ', errorInfo) 25 | } 26 | 27 | render() { 28 | if (this.state.hasError) { 29 | return

Oops! I did it again ;)

30 | } 31 | 32 | return this.props.children 33 | } 34 | } 35 | 36 | export default ErrorBoundary; 37 | 38 | -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Button/Button.css: -------------------------------------------------------------------------------- 1 | .custom-button { 2 | color: inherit; 3 | background-color: grey; 4 | } 5 | 6 | .color-red { 7 | color: red 8 | } 9 | -------------------------------------------------------------------------------- /src/components/Button/Button.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react" 2 | import "./Button.css" 3 | import { useGlobalContext } from "../../context/global.context" 4 | 5 | interface Props { 6 | children: ReactNode, 7 | parentMethod: () => void 8 | } 9 | 10 | interface ChildrenProps { 11 | children: ReactNode 12 | } 13 | 14 | export const ColorRed = ({ children }: ChildrenProps) => { 15 | const { value } = useGlobalContext() 16 | 17 | return (
{value}:{children}
) 18 | } 19 | 20 | export const Button = ({ children, parentMethod }: Props) => { 21 | const { setValue } = useGlobalContext() 22 | 23 | const handleClick = () => { 24 | setValue(10) 25 | parentMethod() 26 | } 27 | 28 | return ( 29 | 32 | ) 33 | } 34 | -------------------------------------------------------------------------------- /src/components/ErrorBoundaryExamples/EffectExample.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react" 2 | 3 | export const EffectExample = () => { 4 | useEffect(() => { 5 | throw new Error("Ups") 6 | }, []) 7 | 8 | return
9 | } 10 | 11 | -------------------------------------------------------------------------------- /src/components/ErrorBoundaryExamples/PromiseError.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react" 2 | 3 | export const PromiseError = () => { 4 | const [data, setData] = useState(null) 5 | const [error, setError] = useState(null) 6 | 7 | useEffect(() => { 8 | const fetchData = async () => { 9 | try { 10 | throw new Error("La Promesa hizo puff") 11 | } catch (err) { 12 | if (err instanceof Error) { 13 | setError(err.message) 14 | } 15 | } 16 | } 17 | 18 | fetchData() 19 | }, []) 20 | 21 | if (error) { 22 | return
Algo salió mal y no me refiero a Guille: {error}
23 | } 24 | 25 | return
{data}
26 | } 27 | -------------------------------------------------------------------------------- /src/components/ErrorBoundaryExamples/UndefinedExample.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react" 2 | 3 | export const UndefinedExample = () => { 4 | const [obj] = useState<{ prop?: string }>({}) 5 | 6 | return
{obj.prop!.length}
7 | } 8 | 9 | -------------------------------------------------------------------------------- /src/components/ErrorBoundaryExamples/index.ts: -------------------------------------------------------------------------------- 1 | export * from './UndefinedExample' 2 | export * from './EffectExample' 3 | export * from './PromiseError' 4 | -------------------------------------------------------------------------------- /src/components/Form/Form.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react" 2 | 3 | interface Props { 4 | children: ReactNode 5 | } 6 | export const AppForm = ({ children }: Props) => { 7 | 8 | return ( 9 |
10 | {/* inputs */} 11 | {children} 12 |
13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /src/components/Modal/Modal.css: -------------------------------------------------------------------------------- 1 | .overlay { 2 | position: absolute; 3 | left: 0; 4 | top: 0; 5 | width: 100%; 6 | height: 100%; 7 | display: flex; 8 | flex-direction: column; 9 | align-content: center; 10 | justify-content: center; 11 | align-items: center; 12 | } 13 | 14 | .modal { 15 | background-color: black; 16 | padding: 16px; 17 | } 18 | -------------------------------------------------------------------------------- /src/components/Modal/Modal.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react" 2 | import { createPortal } from "react-dom" 3 | import { useModalContext } from "./context" 4 | import "./Modal.css" 5 | 6 | interface Props { 7 | children: React.ReactNode 8 | } 9 | 10 | const eventListener = "keydown"; 11 | 12 | export const Modal = ({ children }: Props) => { 13 | const modalRef = useRef(null) 14 | const { state, setState } = useModalContext(); 15 | 16 | const closeModal = () => { setState(false) } 17 | 18 | const modalRoot = document.getElementById("modal") 19 | 20 | const handleContentClick = (e: React.MouseEvent) => { 21 | e.stopPropagation() 22 | } 23 | 24 | useEffect(() => { 25 | const handleEsc = (e: KeyboardEvent) => { 26 | if (e.key === "Escape") { 27 | setState(false) 28 | } 29 | } 30 | if (state) { 31 | document.addEventListener(eventListener, handleEsc) 32 | } 33 | 34 | return () => { 35 | document.removeEventListener(eventListener, handleEsc) 36 | } 37 | }, [setState, state]) 38 | 39 | if (!state || !modalRoot) { 40 | return null; 41 | } 42 | 43 | return createPortal( 44 |
45 |
46 | {children} 47 | 48 |
49 |
, modalRoot) 50 | } 51 | -------------------------------------------------------------------------------- /src/components/Modal/context/ModalContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, ReactNode, useContext, useState } from "react"; 2 | 3 | const ModalContext = createContext<{ 4 | state: boolean; 5 | setState: React.Dispatch> 6 | }>({ 7 | state: false, 8 | setState: () => null 9 | }) 10 | 11 | const ModalProvider = ({ children }: { children: ReactNode }) => { 12 | const [state, setState] = useState(false) 13 | 14 | return {children} 15 | } 16 | 17 | 18 | export { 19 | ModalProvider, 20 | ModalContext 21 | } 22 | -------------------------------------------------------------------------------- /src/components/Modal/context/UseModalContext.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from "react"; 2 | import { ModalContext } from "./ModalContext"; 3 | 4 | export const useModalContext = () => { 5 | const context = useContext(ModalContext); 6 | 7 | if (!context) { 8 | throw new Error("Modal is being used outside it's provider") 9 | } 10 | 11 | return context; 12 | } 13 | -------------------------------------------------------------------------------- /src/components/Modal/context/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./ModalContext" 2 | export * from "./UseModalContext" 3 | -------------------------------------------------------------------------------- /src/components/RoutesWithNotFound/RoutesWithNotFound.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react" 2 | import { Navigate, Route, Routes } from "react-router-dom" 3 | 4 | interface Props { 5 | children: ReactNode 6 | } 7 | 8 | export const RoutesWithNotFound = ({ children }: Props) => { 9 | return ( 10 | 11 | {children} 12 | } /> 13 | Página no encontrada} /> 14 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /src/components/UseCallback/PhoneBook.tsx: -------------------------------------------------------------------------------- 1 | // objectivo: se utiliza para memorizar una instancia de una función 2 | // hace que un hijo no renderice 3 | 4 | import { memo, useCallback, useState } from "react"; 5 | 6 | // Ejemplo: 7 | // Supongamos que tenés un número de teléfono al que llamas con frecuencia 8 | // En vez de marcarlo continuamente lo vamos a almacenar en los contactos del teléfono 9 | // A menos el número cambie siempre utilizo el mismo contacto. 10 | 11 | interface Contact { 12 | id: number; 13 | name: string; 14 | phone: string; 15 | } 16 | 17 | interface ContactProps { 18 | contact: Contact 19 | onCall: (phone: string) => void 20 | } 21 | 22 | const ContactCard = memo(({ contact, onCall }: ContactProps) => { 23 | console.log(`Renderizando contacto ${contact.name}`) 24 | 25 | return ( 26 |
27 |

{contact.name}

28 |

Teléfono: {contact.phone}

29 | 30 |
31 | ) 32 | }) 33 | 34 | export const PhoneBook = () => { 35 | const [contacts, setContacts] = useState([{ 36 | id: 1, name: "Manzana", phone: "123-456-7890" 37 | }, 38 | { 39 | id: 2, name: "Pera", phone: "123-456-7890" 40 | }, 41 | { 42 | id: 3, name: "Leche", phone: "123-456-7890" 43 | } 44 | ]); 45 | 46 | const [log, setLog] = useState('') 47 | 48 | const makeCall = useCallback((name: string) => setLog(`Llamando al ${name}`), []) 49 | 50 | const addContact = () => { 51 | const newContact = { 52 | id: contacts.length + 1, 53 | name: `Contacto ${contacts.length + 1}`, 54 | phone: `${Math.floor(10000000000 + Math.random() * 9000000000)}`, 55 | } 56 | 57 | setContacts([...contacts, newContact]) 58 | } 59 | 60 | return ( 61 |
62 |

Agenda de Contacto

63 | {contacts.map(contact => ( 64 | 65 | ))} 66 | 67 |

{log}

68 |
69 | ) 70 | } 71 | -------------------------------------------------------------------------------- /src/components/UseMemo/ShoppingCart.tsx: -------------------------------------------------------------------------------- 1 | // objetivo: memorizar (cache) el resultado de ejecutar una función costosa, para evitar que se vuelva a llamar el método 2 | // controlar si el beneficio de memorizarlo es superior al de recalcularlo 3 | 4 | import { useMemo, useState } from "react"; 5 | 6 | // Ejemplo: 7 | // Tenemos una lista de compras y ya calculaste el costo total de hacer toda la compra 8 | // Si no agregamos nada ni tampoco cambio nada, cúal es el costo total ? 9 | 10 | interface Item { 11 | id: number; 12 | name: string; 13 | price: number; 14 | } 15 | 16 | export const ShoppingCart = () => { 17 | const [items, setItems] = useState([ 18 | { 19 | id: 1, name: "Manzana", price: 1.5 20 | }, 21 | 22 | { 23 | id: 2, name: "Pera", price: 2.0 24 | }, 25 | 26 | { 27 | id: 3, name: "Leche", price: 1.0 28 | } 29 | ]); 30 | 31 | const [discount, setDiscount] = useState(0) 32 | 33 | const totalCost = useMemo(() => 34 | items.reduce((total, item) => total + item.price, 0) 35 | , [items]) 36 | 37 | const finalCost = useMemo(() => totalCost - discount, [totalCost, discount]); 38 | 39 | const addItem = () => { 40 | const newItem = { 41 | id: items.length + 1, 42 | name: `Producto ${items.length + 1}`, 43 | price: Math.random() * 5 44 | } 45 | 46 | setItems([...items, newItem]) 47 | } 48 | 49 | return ( 50 |
51 |

Lista de Compras

52 | 53 |
    54 | { 55 | items.map(item => ( 56 |
  • 57 | {item.name}: ${item.price.toFixed(2)} 58 |
  • 59 | )) 60 | } 61 |
62 | 63 |

Costo Total: ${totalCost.toFixed(2)}

64 | 65 |

66 | Descuento: $ 67 | setDiscount(parseFloat(e.target.value) || 0)} /> 68 |

69 | 70 |

Costo Final: ${finalCost.toFixed(2)}

71 | 72 | 73 |
74 | ) 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/components/UseRef/BookReader.tsx: -------------------------------------------------------------------------------- 1 | // objetivo: nos permite crear una referencia mutable que persiste durante todo el ciclo de vida del componente 2 | // SIN causar un re - render 3 | // objetivo 2: hacer referencia a un elemento del DOM 4 | 5 | import { useRef, useState } from "react" 6 | 7 | // Ejemplo: 8 | // Un marcador de un libro que utilizamos para guardar la última posición de la lectura 9 | // NO modifica el contenido del libro 10 | 11 | export const BookReader = () => { 12 | const currentPageRef = useRef(1) 13 | const [currentPage, setCurrentPage] = useState(1) 14 | 15 | const nextPage = () => { 16 | currentPageRef.current += 1; 17 | console.log(`Avanzaste a la página ${currentPageRef.current}`) 18 | } 19 | 20 | const previousPage = () => { 21 | if (currentPageRef.current === 1) { 22 | console.log(`No se puede retroceder la página porque ya te encuentras en ${currentPageRef.current}`) 23 | return; 24 | } 25 | 26 | currentPageRef.current -= 1; 27 | console.log(`Retrocediste a la página ${currentPageRef.current}`) 28 | } 29 | 30 | const goToPage = (page: number) => { 31 | if (page < 1) { 32 | console.log(`No se puede saltar a un valor imposible`); 33 | return; 34 | } 35 | 36 | currentPageRef.current = page; 37 | setCurrentPage(page) 38 | console.log(`Saltaste a la página ${currentPageRef.current}`) 39 | } 40 | 41 | return ( 42 |
43 |

Lectura de libro

44 |

Página actual: {currentPageRef.current}

45 |

Página actual [ STATE ]: {currentPage}

46 | 47 | 48 | 49 |
50 | ) 51 | } 52 | -------------------------------------------------------------------------------- /src/components/UseRef/FocusInput.tsx: -------------------------------------------------------------------------------- 1 | import { useRef } from "react" 2 | 3 | export const FocusInput = () => { 4 | const inputRef = useRef(null) 5 | 6 | const handleButtonClick = () => { 7 | if (!inputRef.current) { 8 | console.log('No existe la referencia al elemento') 9 | return 10 | } 11 | 12 | inputRef.current.focus() 13 | } 14 | 15 | return ( 16 |
17 | 18 | 19 |
20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /src/components/UseRef/index.ts: -------------------------------------------------------------------------------- 1 | export * from './FocusInput' 2 | export * from './BookReader' 3 | -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./Button/Button.tsx" 2 | export * from './Form/Form.tsx' 3 | export * from './UseCallback/PhoneBook.tsx' 4 | export * from './UseRef' 5 | export * from './UseMemo/ShoppingCart.tsx' 6 | export * from "./Modal/Modal.tsx" 7 | -------------------------------------------------------------------------------- /src/context/global.context.ts: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from "react"; 2 | 3 | interface GlobalContextType { 4 | value: number | null 5 | setValue: React.Dispatch> 6 | } 7 | 8 | export const GlobalContext = createContext({ 9 | value: null, 10 | setValue: () => { } 11 | }) 12 | 13 | export const useGlobalContext = () => { 14 | const context = useContext(GlobalContext) 15 | 16 | if (!context.value && context.value !== 0) { 17 | throw new Error("GlobalContext must be used within a GlobalContextProvider") 18 | } 19 | 20 | return context; 21 | } 22 | 23 | -------------------------------------------------------------------------------- /src/context/global.provider.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode, useState } from "react" 2 | import { GlobalContext } from "./global.context" 3 | 4 | const EmptyGlobalState: number = 0 5 | 6 | interface GlobalProps { 7 | children: ReactNode 8 | } 9 | 10 | export const GlobalProvider = ({ children }: GlobalProps) => { 11 | const [value, setValue] = useState(EmptyGlobalState) 12 | 13 | return ( 14 | {children} 15 | ) 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/guard/PrivateGuard.tsx: -------------------------------------------------------------------------------- 1 | import { Navigate, Outlet } from "react-router-dom"; 2 | 3 | export const PrivateGuard = () => { 4 | const token = localStorage.getItem("token") 5 | 6 | return token ? : 7 | } 8 | 9 | -------------------------------------------------------------------------------- /src/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useFetch' 2 | -------------------------------------------------------------------------------- /src/hooks/useApi.ts: -------------------------------------------------------------------------------- 1 | import { UseApiCall } from "@/models"; 2 | import { useCallback, useEffect, useState } from "react"; 3 | 4 | type UseApiOptions

= { 5 | autoFetch?: boolean; 6 | params: P 7 | } 8 | 9 | 10 | type Data = T | null; 11 | type CustomError = Error | null; 12 | 13 | interface UseApiResult { 14 | loading: boolean; 15 | data: Data; 16 | error: CustomError; 17 | fetch: (param: P) => void; 18 | } 19 | 20 | export const useApi = (apiCall: (param: P) => UseApiCall, options?: UseApiOptions

): UseApiResult => { 21 | const [loading, setLoading] = useState(false) 22 | const [data, setData] = useState>(null) 23 | const [error, setError] = useState(null) 24 | 25 | const fetch = useCallback((param: P) => { 26 | const { call, controller } = apiCall(param); 27 | setLoading(true); 28 | 29 | call.then((response) => { 30 | setData(response.data); 31 | setError(null); 32 | }).catch((err) => { 33 | setError(err) 34 | }).finally(() => { 35 | setLoading(false) 36 | }) 37 | return () => controller.abort() 38 | }, [apiCall]) 39 | 40 | useEffect(() => { 41 | if (options?.autoFetch) { 42 | return fetch(options.params); 43 | } 44 | 45 | }, [fetch, options?.autoFetch, options?.params]) 46 | 47 | return { loading, data, error, fetch } 48 | } 49 | -------------------------------------------------------------------------------- /src/hooks/useFetch.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | type Data = T | null; 4 | type ErrorType = Error | null; 5 | 6 | interface Params { 7 | data: Data; 8 | loading: boolean; 9 | error: ErrorType; 10 | } 11 | 12 | export const useFetch = (url: string): Params => { 13 | const [data, setData] = useState>(null) 14 | const [loading, setLoading] = useState(true) 15 | const [error, setError] = useState(null) 16 | 17 | useEffect(() => { 18 | const controller = new AbortController(); 19 | 20 | setLoading(true) 21 | 22 | const fetchData = async () => { 23 | try { 24 | const response = await fetch(url, controller); 25 | 26 | if (!response.ok) { 27 | throw new Error("Error en la petición") 28 | } 29 | 30 | const jsonData: T = await response.json(); 31 | 32 | setData(jsonData) 33 | setError(null); 34 | } catch (err) { 35 | setError(err as Error) 36 | } finally { 37 | setLoading(false) 38 | } 39 | } 40 | 41 | fetchData(); 42 | 43 | return () => { 44 | controller.abort(); 45 | } 46 | 47 | }, [url]) 48 | 49 | return { data, loading, error } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | } 15 | 16 | a { 17 | font-weight: 500; 18 | color: #646cff; 19 | text-decoration: inherit; 20 | } 21 | a:hover { 22 | color: #535bf2; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | display: flex; 28 | place-items: center; 29 | min-width: 320px; 30 | min-height: 100vh; 31 | } 32 | 33 | h1 { 34 | font-size: 3.2em; 35 | line-height: 1.1; 36 | } 37 | 38 | button { 39 | border-radius: 8px; 40 | border: 1px solid transparent; 41 | padding: 0.6em 1.2em; 42 | font-size: 1em; 43 | font-weight: 500; 44 | font-family: inherit; 45 | background-color: #1a1a1a; 46 | cursor: pointer; 47 | transition: border-color 0.25s; 48 | } 49 | button:hover { 50 | border-color: #646cff; 51 | } 52 | button:focus, 53 | button:focus-visible { 54 | outline: 4px auto -webkit-focus-ring-color; 55 | } 56 | 57 | @media (prefers-color-scheme: light) { 58 | :root { 59 | color: #213547; 60 | background-color: #ffffff; 61 | } 62 | a:hover { 63 | color: #747bff; 64 | } 65 | button { 66 | background-color: #f9f9f9; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from "react"; 2 | import { createRoot } from "react-dom/client"; 3 | import "./index.css"; 4 | import { initAxios } from "./services/axios.service.ts"; 5 | import AppHookContainer from "./AppHookContainer.tsx"; 6 | 7 | initAxios(); 8 | 9 | createRoot(document.getElementById("root")!).render( 10 | 11 | 12 | , 13 | ); 14 | -------------------------------------------------------------------------------- /src/models/character.model.ts: -------------------------------------------------------------------------------- 1 | export interface Character { 2 | name: string; 3 | gender: string; 4 | status: string; 5 | } 6 | 7 | export const emptyCharacter: Character = { 8 | name: "", 9 | gender: "", 10 | status: "" 11 | } 12 | -------------------------------------------------------------------------------- /src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './user.model' 2 | export * from './character.model' 3 | export * from './useApi.model' 4 | export * from './routes.model' 5 | 6 | -------------------------------------------------------------------------------- /src/models/routes.model.ts: -------------------------------------------------------------------------------- 1 | export const AppRoutes = { 2 | login: '/login', 3 | private: { 4 | root: '/private', 5 | dashboard: '/dashboard', 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/models/useApi.model.ts: -------------------------------------------------------------------------------- 1 | import { AxiosResponse } from "axios"; 2 | 3 | export interface UseApiCall { 4 | call: Promise>, 5 | controller: AbortController 6 | } 7 | -------------------------------------------------------------------------------- /src/models/user.model.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | name: string 3 | lastName: string 4 | } 5 | -------------------------------------------------------------------------------- /src/private/Dashboard/Dashboard.tsx: -------------------------------------------------------------------------------- 1 | export const Dashboard = () => { 2 | return

Esto es el Dashboard !

3 | } 4 | -------------------------------------------------------------------------------- /src/private/PrivateRouter.tsx: -------------------------------------------------------------------------------- 1 | import { Navigate, Route, Routes } from "react-router-dom" 2 | import { Dashboard } from "./Dashboard/Dashboard" 3 | import { RoutesWithNotFound } from "@/components/RoutesWithNotFound/RoutesWithNotFound" 4 | import { AppRoutes } from "@/models" 5 | 6 | export const PrivateRouter = () => { 7 | return ( 8 | 9 | } /> 10 | } /> 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /src/public/Login/Login.tsx: -------------------------------------------------------------------------------- 1 | export const Login = () => { 2 | return

Esto es el Login !!!

3 | } 4 | -------------------------------------------------------------------------------- /src/services/api.service.ts: -------------------------------------------------------------------------------- 1 | const BASE_URL = "https://rickandmortyapi.com/api" 2 | import { Character, UseApiCall } from "@/models" 3 | import { loadAbort } from "../utilities" 4 | import axios from "axios" 5 | 6 | export const getCharacter = (id: number): UseApiCall => { 7 | const controller = loadAbort(); 8 | 9 | return { 10 | call: axios.get(`${BASE_URL}/character/${id}`, { signal: controller.signal }), 11 | controller 12 | }; 13 | } 14 | 15 | export const newCharacter = (character: Character): UseApiCall => { 16 | const controller = loadAbort(); 17 | 18 | return { 19 | call: axios.post(`${BASE_URL}/characters`, character, { signal: controller.signal }), 20 | controller 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /src/services/axios.service.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from "axios"; 2 | 3 | let axiosInstance: AxiosInstance; 4 | 5 | const createAxios = (baseURL: string) => { 6 | axiosInstance = axios.create({ baseURL }) 7 | } 8 | 9 | const setupInterceptors = () => { 10 | axiosInstance.interceptors.request.use( 11 | (config: InternalAxiosRequestConfig) => { 12 | const token = localStorage.get("token"); 13 | if (token) { 14 | config.headers.set(`Authorization Bearer: ${token}`) 15 | } 16 | console.log(`Request made to: ${config.url}`) 17 | return config; 18 | }, 19 | (error) => { 20 | return Promise.reject(error) 21 | } 22 | ); 23 | 24 | axiosInstance.interceptors.response.use( 25 | (response: AxiosResponse) => { 26 | console.log(`Response from: ${response.config.url}`, { 27 | data: response.data, 28 | status: response.status, 29 | }); 30 | return response; 31 | }, (error) => { 32 | if (error.response) { 33 | console.error(`Error response from: ${error.response.config.url}`) 34 | } { 35 | console.error(`Error: ${error.message}`) 36 | } 37 | return Promise.reject(error) 38 | } 39 | ) 40 | } 41 | 42 | 43 | export const initAxios = () => { 44 | createAxios('https://rickandmortyapi.com/api'); 45 | setupInterceptors(); 46 | return axiosInstance 47 | } 48 | -------------------------------------------------------------------------------- /src/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './share-value-children.service' 2 | -------------------------------------------------------------------------------- /src/services/share-value-children.service.ts: -------------------------------------------------------------------------------- 1 | export class SharedValueChildren { 2 | private value: string; 3 | 4 | constructor(value: string) { 5 | this.value = value; 6 | } 7 | 8 | getValue() { 9 | return this.value 10 | } 11 | 12 | setValue(value: string) { 13 | if (value.length < 1) { 14 | throw new Error("value has to be a string and has to have at least a character"); 15 | } 16 | this.value = value 17 | } 18 | } 19 | 20 | export const sharedValueChildren = new SharedValueChildren(""); 21 | -------------------------------------------------------------------------------- /src/utilities/index.ts: -------------------------------------------------------------------------------- 1 | export * from './loadAbort.utility' 2 | -------------------------------------------------------------------------------- /src/utilities/loadAbort.utility.ts: -------------------------------------------------------------------------------- 1 | export const loadAbort = () => { 2 | return new AbortController(); 3 | } 4 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 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 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "baseUrl": ".", 23 | "paths": { 24 | "@/*": ["./src/*"] 25 | } 26 | }, 27 | "include": ["src"] 28 | } 29 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.app.json" 6 | }, 7 | { 8 | "path": "./tsconfig.node.json" 9 | } 10 | ], 11 | "compilerOptions": { 12 | "baseUrl": ".", 13 | "paths": { 14 | "@": [ 15 | "src/*" 16 | ] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | import path from "path"; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | plugins: [react()], 8 | resolve: { 9 | alias: { 10 | '@': path.resolve(__dirname, 'src') 11 | } 12 | } 13 | }) 14 | --------------------------------------------------------------------------------