From e2da42e1818f9ac608bbd0a1da7b92b3db57198a Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Fri, 21 Aug 2026 11:02:52 +0200 Subject: [PATCH] --- .../.gitignore | 24 + .../README.md | 17 + .../typescript-task-manager-template/Todo.md | 84 + .../assets/index.html | 16 + .../assets/js/bundle.js | 2 + .../package.json | 19 + .../src/taskManager.ts | 16 + .../src/tests/taskManager.test.ts | 160 + 06_js-debug/faq/getRandomInt.js | 13 + .../u15_product-sales-table/.eslintrc.cjs | 18 + .../u15_product-sales-table/README.md | 10 + .../u15_product-sales-table/index.html | 12 + .../u15_product-sales-table/package-lock.json | 2660 ++++++++++++++++ .../u15_product-sales-table/package.json | 28 + .../u15_product-sales-table/public/vite.svg | 1 + .../u15_product-sales-table/src/App.tsx | 42 + .../src/components/Table.tsx | 32 + .../src/components/TableRow.tsx | 25 + .../u15_product-sales-table/src/index.css | 187 ++ .../src/lib/datatypes.ts | 8 + .../src/lib/db/sales.json | 115 + .../u15_product-sales-table/src/main.tsx | 10 + .../u15_product-sales-table/src/vite-env.d.ts | 1 + .../u15_product-sales-table/tsconfig.app.json | 27 + .../u15_product-sales-table/tsconfig.json | 11 + .../tsconfig.node.json | 13 + .../u15_product-sales-table/vite.config.ts | 7 + .../u16_lexifind-exercise/.eslintrc.cjs | 18 + .../uebungen/u16_lexifind-exercise/README.md | 10 + .../uebungen/u16_lexifind-exercise/index.html | 13 + .../u16_lexifind-exercise/package-lock.json | 2744 +++++++++++++++++ .../u16_lexifind-exercise/package.json | 30 + .../public/LexiFind.webp | Bin 0 -> 2986 bytes .../src/components/FavoriteWord.tsx | 52 + .../src/components/Header.tsx | 42 + .../src/components/Icons.tsx | 46 + .../src/components/Searchbar.tsx | 59 + .../src/components/SourceFooter.tsx | 51 + .../src/components/WordDefinitions.tsx | 66 + .../src/components/WordHero.tsx | 74 + .../u16_lexifind-exercise/src/index.css | 430 +++ .../src/lib/constants.ts | 5 + .../src/lib/datatypes.ts | 22 + .../u16_lexifind-exercise/src/main.tsx | 24 + .../src/pages/favorites.tsx | 46 + .../u16_lexifind-exercise/src/pages/root.tsx | 66 + .../u16_lexifind-exercise/src/vite-env.d.ts | 1 + .../u16_lexifind-exercise/tsconfig.app.json | 27 + .../u16_lexifind-exercise/tsconfig.json | 11 + .../u16_lexifind-exercise/tsconfig.node.json | 13 + .../u16_lexifind-exercise/vite.config.ts | 7 + .../uebungen/uebungen-15-16-js-debug.zip | Bin 0 -> 52461 bytes .../assets/js/modules/Counter.js | 4 +- .../01_counter/webseite-html-js/index.html | 2 +- .../src/components/heros/Hero.scss | 1 + .../tag49/01_demo-form-bug/assets/js/main.js | 57 + .../tag49/01_demo-form-bug/index.html | 41 + .../tag49/01_demo-form-bug/package-lock.json | 644 ++++ .../tag49/01_demo-form-bug/package.json | 14 + .../unterricht/tag49/02_debug-sources.zip | Bin 0 -> 4636 bytes .../02_debug-sources/assets/css/main.css | 15 + .../tag49/02_debug-sources/assets/js/main.js | 191 ++ .../tag49/02_debug-sources/index.html | 70 + .../tag49/02_debug-sources/package-lock.json | 644 ++++ .../tag49/02_debug-sources/package.json | 14 + .../tag49/03_debug-vscode/.vscode/launch.json | 15 + .../tag49/03_debug-vscode/index.html | 20 + .../tag49/03_debug-vscode/package-lock.json | 27 + .../tag49/03_debug-vscode/package.json | 14 + .../tag49/03_debug-vscode/sum-array.js | 13 + .../unterricht/tag49/04_lexifind-starter.zip | Bin 0 -> 30550 bytes .../tag49/04_lexifind-starter/.eslintrc.cjs | 18 + .../04_lexifind-starter/.vscode/launch.json | 15 + .../tag49/04_lexifind-starter/README.md | 10 + .../tag49/04_lexifind-starter/index.html | 13 + .../04_lexifind-starter/package-lock.json | 2660 ++++++++++++++++ .../tag49/04_lexifind-starter/package.json | 28 + .../04_lexifind-starter/public/LexiFind.webp | Bin 0 -> 2986 bytes .../tag49/04_lexifind-starter/src/App.tsx | 59 + .../src/components/Header.tsx | 35 + .../src/components/Searchbar.tsx | 44 + .../src/components/SourceFooter.tsx | 51 + .../src/components/WordDefinitions.tsx | 66 + .../src/components/WordHero.tsx | 63 + .../tag49/04_lexifind-starter/src/index.css | 337 ++ .../04_lexifind-starter/src/lib/constants.ts | 5 + .../04_lexifind-starter/src/lib/datatypes.ts | 22 + .../tag49/04_lexifind-starter/src/main.tsx | 10 + .../04_lexifind-starter/src/vite-env.d.ts | 1 + .../04_lexifind-starter/tsconfig.app.json | 27 + .../tag49/04_lexifind-starter/tsconfig.json | 11 + .../04_lexifind-starter/tsconfig.node.json | 13 + .../tag49/04_lexifind-starter/vite.config.ts | 7 + .../tag49/05_state-up-lifting/.gitignore | 24 + .../tag49/05_state-up-lifting/.oxlintrc.json | 8 + .../tag49/05_state-up-lifting/README.md | 16 + .../tag49/05_state-up-lifting/index.html | 13 + .../05_state-up-lifting/package-lock.json | 1316 ++++++++ .../tag49/05_state-up-lifting/package.json | 23 + .../05_state-up-lifting/public/favicon.svg | 1 + .../05_state-up-lifting/public/icons.svg | 24 + .../tag49/05_state-up-lifting/src/App.css | 184 ++ .../tag49/05_state-up-lifting/src/App.jsx | 106 + .../05_state-up-lifting/src/assets/hero.png | Bin 0 -> 13057 bytes .../05_state-up-lifting/src/assets/react.svg | 1 + .../05_state-up-lifting/src/assets/vite.svg | 1 + .../src/components/Counter.jsx | 22 + .../tag49/05_state-up-lifting/src/index.css | 111 + .../tag49/05_state-up-lifting/src/main.jsx | 10 + .../tag49/05_state-up-lifting/vite.config.js | 7 + .../tag50/01_shop-vitest/.eslintrc.cjs | 18 + .../unterricht/tag50/01_shop-vitest/README.md | 10 + .../tag50/01_shop-vitest/index.html | 12 + .../tag50/01_shop-vitest/package.json | 29 + .../tag50/01_shop-vitest/public/vite.svg | 1 + .../src/components/CategorySection.tsx | 77 + .../01_shop-vitest/src/components/Footer.tsx | 55 + .../01_shop-vitest/src/components/Header.tsx | 53 + .../01_shop-vitest/src/components/Hero.tsx | 23 + .../src/components/ImageGallery.tsx | 85 + .../src/components/ProductList.tsx | 24 + .../src/components/ProductListCard.tsx | 72 + .../tag50/01_shop-vitest/src/index.css | 798 +++++ .../tag50/01_shop-vitest/src/lib/datatypes.ts | 45 + .../tag50/01_shop-vitest/src/lib/helpers.ts | 16 + .../tag50/01_shop-vitest/src/main.tsx | 39 + .../01_shop-vitest/src/pages/accessories.tsx | 88 + .../tag50/01_shop-vitest/src/pages/men.tsx | 83 + .../01_shop-vitest/src/pages/product.tsx | 207 ++ .../tag50/01_shop-vitest/src/pages/root.tsx | 43 + .../tag50/01_shop-vitest/src/pages/women.tsx | 89 + .../tag50/01_shop-vitest/src/vite-env.d.ts | 1 + .../tag50/01_shop-vitest/tsconfig.app.json | 27 + .../tag50/01_shop-vitest/tsconfig.json | 11 + .../tag50/01_shop-vitest/tsconfig.node.json | 13 + .../tag50/01_shop-vitest/vite.config.ts | 7 + webseite-gulp-ts/frontend/assets/css/main.css | 29 +- .../frontend/assets/map/main.css.map | 2 +- .../frontend/dev/scss/03_base/_utils.scss | 10 + .../dev/scss/05_modules/_menu-main.scss | 20 +- 140 files changed, 16542 insertions(+), 8 deletions(-) create mode 100644 04_typescript/projects/typescript-task-manager-template/.gitignore create mode 100644 04_typescript/projects/typescript-task-manager-template/README.md create mode 100644 04_typescript/projects/typescript-task-manager-template/Todo.md create mode 100644 04_typescript/projects/typescript-task-manager-template/assets/index.html create mode 100644 04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js create mode 100644 04_typescript/projects/typescript-task-manager-template/package.json create mode 100644 04_typescript/projects/typescript-task-manager-template/src/taskManager.ts create mode 100644 04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts create mode 100644 06_js-debug/faq/getRandomInt.js create mode 100644 06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs create mode 100644 06_js-debug/uebungen/u15_product-sales-table/README.md create mode 100644 06_js-debug/uebungen/u15_product-sales-table/index.html create mode 100644 06_js-debug/uebungen/u15_product-sales-table/package-lock.json create mode 100644 06_js-debug/uebungen/u15_product-sales-table/package.json create mode 100644 06_js-debug/uebungen/u15_product-sales-table/public/vite.svg create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/App.tsx create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/index.css create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/main.tsx create mode 100644 06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts create mode 100644 06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json create mode 100644 06_js-debug/uebungen/u15_product-sales-table/tsconfig.json create mode 100644 06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json create mode 100644 06_js-debug/uebungen/u15_product-sales-table/vite.config.ts create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/README.md create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/index.html create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/package.json create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/public/LexiFind.webp create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/index.css create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json create mode 100644 06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts create mode 100644 06_js-debug/uebungen/uebungen-15-16-js-debug.zip create mode 100644 06_js-debug/unterricht/tag49/01_demo-form-bug/assets/js/main.js create mode 100644 06_js-debug/unterricht/tag49/01_demo-form-bug/index.html create mode 100644 06_js-debug/unterricht/tag49/01_demo-form-bug/package-lock.json create mode 100644 06_js-debug/unterricht/tag49/01_demo-form-bug/package.json create mode 100644 06_js-debug/unterricht/tag49/02_debug-sources.zip create mode 100644 06_js-debug/unterricht/tag49/02_debug-sources/assets/css/main.css create mode 100644 06_js-debug/unterricht/tag49/02_debug-sources/assets/js/main.js create mode 100644 06_js-debug/unterricht/tag49/02_debug-sources/index.html create mode 100644 06_js-debug/unterricht/tag49/02_debug-sources/package-lock.json create mode 100644 06_js-debug/unterricht/tag49/02_debug-sources/package.json create mode 100644 06_js-debug/unterricht/tag49/03_debug-vscode/.vscode/launch.json create mode 100644 06_js-debug/unterricht/tag49/03_debug-vscode/index.html create mode 100644 06_js-debug/unterricht/tag49/03_debug-vscode/package-lock.json create mode 100644 06_js-debug/unterricht/tag49/03_debug-vscode/package.json create mode 100644 06_js-debug/unterricht/tag49/03_debug-vscode/sum-array.js create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter.zip create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/.eslintrc.cjs create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/.vscode/launch.json create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/README.md create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/index.html create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/package-lock.json create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/package.json create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/public/LexiFind.webp create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/App.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Header.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Searchbar.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/SourceFooter.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordDefinitions.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordHero.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/index.css create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/constants.ts create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/datatypes.ts create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/main.tsx create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/src/vite-env.d.ts create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.app.json create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.json create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.node.json create mode 100644 06_js-debug/unterricht/tag49/04_lexifind-starter/vite.config.ts create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/.gitignore create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/.oxlintrc.json create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/README.md create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/index.html create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/package-lock.json create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/package.json create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/public/favicon.svg create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/public/icons.svg create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.css create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.jsx create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/hero.png create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/react.svg create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/vite.svg create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/components/Counter.jsx create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/index.css create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/src/main.jsx create mode 100644 06_js-debug/unterricht/tag49/05_state-up-lifting/vite.config.js create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/.eslintrc.cjs create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/README.md create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/index.html create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/package.json create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/public/vite.svg create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/CategorySection.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Footer.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Header.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Hero.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ImageGallery.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductList.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductListCard.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/index.css create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/datatypes.ts create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/helpers.ts create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/main.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/accessories.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/men.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/product.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/root.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/women.tsx create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/src/vite-env.d.ts create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/tsconfig.app.json create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/tsconfig.json create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/tsconfig.node.json create mode 100644 06_js-debug/unterricht/tag50/01_shop-vitest/vite.config.ts diff --git a/04_typescript/projects/typescript-task-manager-template/.gitignore b/04_typescript/projects/typescript-task-manager-template/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/04_typescript/projects/typescript-task-manager-template/README.md b/04_typescript/projects/typescript-task-manager-template/README.md new file mode 100644 index 0000000..601f2df --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/README.md @@ -0,0 +1,17 @@ +## License and terms of use + +© Web Professional Institute Inc. All rights reserved. + +This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. + +**Usage Restrictions:** + +- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. +- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. +- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. + +**Agreement & Rights:** + +As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. + +For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/04_typescript/projects/typescript-task-manager-template/Todo.md b/04_typescript/projects/typescript-task-manager-template/Todo.md new file mode 100644 index 0000000..9c7b756 --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/Todo.md @@ -0,0 +1,84 @@ +## Projektarbeit 1: Aufgaben-Management-System + +In dieser Projektarbeit entwickelst du ein Aufgabenmanagementsystem, mit dem Studierende der Informatik ihre Teamprojekte effizient verwalten können. Ein Team benötigt ein System, mit dem es Aufgaben wie das Design der Benutzeroberfläche, die Programmierung des Backends oder die Erstellung der Dokumentation nachverfolgen und Deadlines und Prioritäten im Auge behalten kann. + +Du erstellst mit Hilfe von TypeScript ein vereinfachtes Aufgabenverwaltungssystem, mit dem die Teammitglieder Aufgaben hinzufügen, aktualisieren, löschen, filtern und überfällige Aufgaben finden können. + +In dieser Projektarbeit wirst du zeigen, dass du das Typsystem von TypeScript verstehst, einschließlich Union Types, Type Annotations, Type Assertions, Interfaces und Literal Types. Du wirst auch mit Funktionen, Objekten und Arrays arbeiten, um die benötigten Funktionen zu implementieren. + +root/ +│ +├── assets/ +│ ├── js/ +│ │ └── bundle.js // Bundled JavaScript file after running "npm run ts" +│ └── index.html // Main HTML file to view your JavaScript code +│ +├── src/ +│ ├── tests/ +│ │ └── taskManager.test.ts // Test file to check your code (DO NOT MODIFY) +│ └── taskManager.ts // Solve the task in this file only (ADD YOUR CODE HERE) +│ +├── .gitignore // Ignore files for git +│ +└── package.json // Project metadata and dependencies + +**Anforderungen** + +1. Definiere ein Task Interface: + +- id: Ein eindeutiger Identifikator (Nummer). +- title: Ein String, der den Titel der Aufgabe darstellt. +- description: Ein optionaler String mit der Aufgabenbeschreibung. +- status: Ein Union Type, der aus den folgenden String Literals bestehen kann: 'not-started', 'in-progress', 'completed'. +- priority: Ein Union Type, der die Priorität der Aufgabe darstellt. Er sollte 'low', 'medium', oder 'high' akzeptieren. +- dueDate: Ein Datum, das als String im Format YYYY-MM-DD dargestellt wird. + +2. Tasks hinzufügen: Erstelle eine Funktion, um dem System eine neue Aufgabe hinzuzufügen. + +- Akzeptiere ein task Objekt (mit title, priority, dueDate und optional description). +- Erstelle automatisch eine eindeutige id für jede Aufgabe. +- Setze den Standardstatus auf 'not-started'. +- Füge die neue Aufgabe zu einer internen Aufgabenliste hinzu (z. B. einem Array). +- Gib das erstellte Task-Objekt mit der generierten id zurück. + +3. Tasks aktualisieren: Erstelle eine Funktion, um den Status und die Priorität einer bestehenden Aufgabe zu aktualisieren. Verwende bei Bedarf Type Assertions, um sicherzustellen, dass nur gültige Werte aktualisiert werden. + +- Die Funktion sollte ein Objekt als Parameter akzeptieren, das mindestens eine `id` (number) enthält und optional `status` und/oder `priority` Eigenschaften. +- Verwende Union Types für `status` und `priority`, um nur gültige Werte zu akzeptieren. +- Finde die Aufgabe über ihre id. +- Aktualisiere die status und/oder priority der Aufgabe, wenn gültige Werte angegeben sind. +- Gib die aktualisierte Aufgabe zurück oder undefined, wenn die Aufgabe nicht gefunden wird. + +4. Tasks löschen: Erstelle eine Funktion, die es Teammitgliedern ermöglicht, eine Aufgabe über ihre id zu löschen. + +- Die Funktion sollte true zurückgeben, wenn die Aufgabe erfolgreich gelöscht wurde, oder false, wenn die Aufgabe nicht gefunden werden konnte. + +5. Tasks abrufen und filtern: Erstelle eine Funktion, mit der du alle Aufgaben abrufen oder nach ihrem Status filtern kannst (z. B. nur Aufgaben in Bearbeitung anzeigen). + +- Wenn ein bestimmter Status (z. B. 'in-progress') angegeben wird, sollte die Funktion nur Aufgaben mit diesem Status zurückgeben. +- Wenn kein Status angegeben wird, werden alle Aufgaben zurückgegeben. + +6. Überfällige Tasks finden: Erstelle eine Funktion, um Aufgaben zu finden, die überfällig sind. + +- Eine Aufgabe gilt als überfällig, wenn ihr dueDate früher als das aktuelle Datum ist und ihr Status nicht 'completed' lautet. + +7. Static Type-Checking: Implementiere Static Type-Checking, um sicherzustellen, dass hinzugefügte oder aktualisierte Tasks mit der Task-Interface/dem Task-Typ übereinstimmen. Stelle sicher, dass falsche oder fehlende Eigenschaften bereits beim Kompilieren erkannt werden, um zu verhindern, dass ungültige Daten verarbeitet werden. + +8. Export des tasks Arrays: Exportiere das interne tasks Array, damit es in den Tests verwendet werden kann. Das Array sollte direkt exportiert werden (nicht als Funktion), da die Tests `tasks.map()` verwenden. + +**Wichtige Hinweise** + +Du erhältst Zugang zu einer vorgefertigten **Testdatei**, mit der du die Kernfunktionen deines taskManager.ts Moduls testen kannst. + +Die Testdatei wird: + +- Aufgaben hinzufügen. +- Aktualisiere den Status und die Prioritäten der Aufgaben. +- Aufgaben löschen. +- Aufgaben basierend auf ihrem Status abrufen. +- Überfällige Aufgaben finden. +- Edge Cases testen, z. B. das Aktualisieren oder Löschen nicht existierender Aufgaben. + +**Du solltest die Testdatei nicht verändern**. Du kannst sie öffnen und dir den Code ansehen, um dir ein Bild von den Parametern der Funktionen zu machen. Die Datei dient dazu, deinen Code während der Entwicklung zu testen, aber du musst alle angebotenen Tests bestehen, indem du nur deine Implementierung in `taskManager.ts` verwendest. Du kannst die Namen der Funktionen in `taskManager.ts` ändern, aber es ist deine Aufgabe, die Exportfunktionen so beizubehalten, wie du sie in der Datei findest. + +Du kannst die Testfälle mit verschiedenen Befehlen ausführen. Der empfohlene Befehl ist `npm run test`, der die Tests in Node.js ausführt. Alternativ kannst du mit `npm run ts-build` ein Bundle für den Browser erstellen und dann die Datei `assets/index.html` im Browser öffnen. Für eine kontinuierliche Entwicklung bietet sich `npm run test:watch` an, der Tests automatisch bei Änderungen ausführt. Die Ergebnisse der Testfälle werden in der Konsole ausgegeben. diff --git a/04_typescript/projects/typescript-task-manager-template/assets/index.html b/04_typescript/projects/typescript-task-manager-template/assets/index.html new file mode 100644 index 0000000..347cdab --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/assets/index.html @@ -0,0 +1,16 @@ + + + + + + Assignment 01: Task Manager + + + + +
+

Task Manager

+

Open the console to see the output

+
+ + diff --git a/04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js b/04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js new file mode 100644 index 0000000..8afef30 --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js @@ -0,0 +1,2 @@ +(() => { +})(); diff --git a/04_typescript/projects/typescript-task-manager-template/package.json b/04_typescript/projects/typescript-task-manager-template/package.json new file mode 100644 index 0000000..6736f92 --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/package.json @@ -0,0 +1,19 @@ +{ + "name": "ts-assignment-task-manager", + "version": "1.1.0", + "main": "src/taskManager.ts", + "scripts": { + "ts": "npx esbuild src/taskManager.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts", + "ts-build": "npx esbuild src/tests/taskManager.test.ts --bundle --outfile=assets/js/test-bundle.js --loader:.ts=ts", + "build:test": "npx esbuild src/tests/taskManager.test.ts --bundle --platform=node --outfile=dist/test-bundle.js", + "run:test": "node dist/test-bundle.js", + "test": "npm run build:test && npm run run:test", + "test:watch": "npx nodemon --watch src --ext ts --exec \"npm run test\"" + }, + "author": "", + "license": "SEE LICENSE IN README.md", + "description": "", + "dependencies": { + "esbuild": "^0.25.12" + } +} diff --git a/04_typescript/projects/typescript-task-manager-template/src/taskManager.ts b/04_typescript/projects/typescript-task-manager-template/src/taskManager.ts new file mode 100644 index 0000000..af604bb --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/src/taskManager.ts @@ -0,0 +1,16 @@ +let nextTaskId = 1; // Initialize the task ID counter (it has to be a number) + +const tasks = () => {}; + +const addTask = () => {}; + +const updateTask = () => {}; + +const deleteTask = () => {}; + +const getTasks = () => {}; + +const findOverdueTasks = () => {}; + +// Uncomment the following code. Otherwise, the tests will fail. Make sure that the names of your functions are the same as in the commented code. +export { tasks, addTask, updateTask, deleteTask, getTasks, findOverdueTasks }; diff --git a/04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts b/04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts new file mode 100644 index 0000000..51989af --- /dev/null +++ b/04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts @@ -0,0 +1,160 @@ +/* +This is a test file for the `taskManager` module. It is designed to test the core functionality that you have implemented in the `taskManager.ts` module. + +IMPORTANT: +- DO NOT MODIFY this file. +- After implementing the `taskManager` module, you should be able to run this file by using the command `npm run test` or `npm run ts-build`. +- Once the project is built, open the `index.html` file located in the `assets` folder in your browser to see the output of the test cases in the browser's console. + +The test file will: +- Add tasks. +- Update task statuses and priorities. +- Delete tasks. +- Fetch tasks based on their status. +- Find overdue tasks. +- Test edge cases, such as updating or deleting non-existing tasks. + +EXPECTED BEHAVIOR: +- This file should run successfully without any modifications. +- Ensure that your implementation in the `taskManager.ts` module meets the requirements of these tests. + +DO NOT MODIFY this file. You should aim to pass all the tests provided here by only working on the `taskManager.ts` module. +*/ + +import { + tasks, + addTask, + updateTask, + deleteTask, + getTasks, + findOverdueTasks, +} from '../taskManager'; + +// ===== 1. Adding tasks ===== +console.warn('=== Adding Tasks ==='); +const task1 = addTask({ + title: 'Task 1', + priority: 'high', + dueDate: '2024-10-10', + description: 'This is a high priority task.', +}); +console.log('Added Task 1 (ID should be 1):'); +console.log(task1); + +const task2 = addTask({ + title: 'Task 2', + priority: 'medium', + dueDate: '2024-10-15', +}); +console.log('Added Task 2 (ID should be 2):'); +console.log(task2); + +const task3 = addTask({ + title: 'Task 3', + priority: 'low', + dueDate: '2024-09-30', + description: 'Low priority task, overdue.', +}); +console.log('Added Task 3 (ID should be 3):'); +console.log(task3); + +const task4 = addTask({ + title: 'Task 4', + priority: 'high', + dueDate: '2024-12-01', + description: 'Upcoming high priority task.', +}); +console.log('Added Task 4 (ID should be 4):'); +console.log(task4); + +const task5 = addTask({ + title: 'Task 5', + priority: 'medium', + dueDate: '2024-09-25', + description: 'Overdue medium task.', +}); +console.log('Added Task 5 (ID should be 5):'); +console.log(task5); + +// ===== 2. Fetching all tasks ===== +console.warn('=== Fetching All Tasks ==='); +console.log('Expecting 5 tasks:'); +console.log(getTasks()); + +// ===== 3. Updating a task's status and priority ===== +console.warn('=== Updating Task 1 Status and Priority ==='); +const updatedTask1 = updateTask({ + id: task1.id, + status: 'in-progress', + priority: 'medium', +}); +console.log( + 'Updated Task 1 (status should be "in-progress", priority should be "medium"):' +); +console.log(updatedTask1); + +console.warn('=== Updating Task 3 to Completed ==='); +const updatedTask3 = updateTask({ + id: task3.id, + status: 'completed', +}); +console.log('Updated Task 3 (status should be "completed"):'); +console.log(updatedTask3); + +// ===== 4. Deleting a task ===== +console.warn('=== Deleting Task 2 ==='); +const isDeleted = deleteTask(task2.id); +console.log('Task 2 deleted (should return true):'); +console.log(isDeleted); +console.log( + 'Fetching all tasks after deletion (Task 2 should no longer be in the list):' +); +console.log(getTasks()); + +// ===== 5. Fetching tasks with a specific status ===== +console.warn('=== Fetching In-progress Tasks ==='); +console.log('Expecting 1 in-progress task (Task 1):'); +console.log(getTasks('in-progress')); + +// ===== 6. Fetching overdue tasks ===== +console.warn('=== Fetching Overdue Tasks ==='); +console.log( + 'Expecting 3 overdue tasks (Task 1, Task 4, and Task 5, Task 3 is completed):' +); +console.log(findOverdueTasks()); + +// ===== 7. Edge Case: Updating a task that doesn't exist ===== +console.warn('=== Attempting to Update a Non-existing Task ==='); +const updateNonExistingTask = updateTask({ + id: 999, + status: 'completed', +}); +console.log('Trying to update non-existing task (should return undefined):'); +console.log(updateNonExistingTask); + +// ===== 8. Edge Case: Deleting a task that doesn't exist ===== +console.warn('=== Attempting to Delete a Non-existing Task ==='); +const deleteNonExistingTask = deleteTask(999); +console.log('Trying to delete non-existing task (should return false):'); +console.log(deleteNonExistingTask); + +// ===== 9. Adding and Fetching Tasks After Deletion ===== +console.warn('=== Adding a New Task After Deletion ==='); +const task6 = addTask({ + title: 'Task 6', + priority: 'low', + dueDate: '2024-11-05', +}); +console.log('Added Task 6 (ID should be 6):'); +console.log(task6); + +console.warn('=== Fetching All Tasks After Adding Task 6 ==='); +console.log('Expecting 5 tasks (Task 6 should be added):'); +console.log(getTasks()); + +// ===== 10. Verifying if Task IDs are auto-incremented correctly ===== +console.warn('=== Verifying Task ID Continuity ==='); +console.log('Task 6 ID (should be 6):'); +console.log(task6.id); +console.log('All Task IDs (should be [1, 3, 4, 5, 6]):'); +console.log(tasks.map((t) => t.id)); diff --git a/06_js-debug/faq/getRandomInt.js b/06_js-debug/faq/getRandomInt.js new file mode 100644 index 0000000..7ff46b0 --- /dev/null +++ b/06_js-debug/faq/getRandomInt.js @@ -0,0 +1,13 @@ +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); +console.log(getRandomInt(2, 6)); diff --git a/06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs b/06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/README.md b/06_js-debug/uebungen/u15_product-sales-table/README.md new file mode 100644 index 0000000..6ddbf24 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/README.md @@ -0,0 +1,10 @@ +# Frontend Class: Debugging Product Sales Table Exercise + +Install the dependencies and devDependencies and start the server. + +```bash +npm install +npm run dev +``` + +This will start the server on http://localhost:5173 diff --git a/06_js-debug/uebungen/u15_product-sales-table/index.html b/06_js-debug/uebungen/u15_product-sales-table/index.html new file mode 100644 index 0000000..d07d7e9 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/index.html @@ -0,0 +1,12 @@ + + + + + + Product Sales Table + + +
+ + + diff --git a/06_js-debug/uebungen/u15_product-sales-table/package-lock.json b/06_js-debug/uebungen/u15_product-sales-table/package-lock.json new file mode 100644 index 0000000..b20964a --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/package-lock.json @@ -0,0 +1,2660 @@ +{ + "name": "product-sales-table", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "product-sales-table", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "^6.0.3", + "vite": "^8.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.67.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.16.tgz", + "integrity": "sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.412", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", + "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", + "dev": true, + "license": "ISC" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", + "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", + "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/package.json b/06_js-debug/uebungen/u15_product-sales-table/package.json new file mode 100644 index 0000000..7e734cc --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/package.json @@ -0,0 +1,28 @@ +{ + "name": "product-sales-table", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "^6.0.3", + "vite": "^8.2.2" + } +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/public/vite.svg b/06_js-debug/uebungen/u15_product-sales-table/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/App.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/App.tsx new file mode 100644 index 0000000..acb21c0 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/App.tsx @@ -0,0 +1,42 @@ +import { useState, useEffect } from 'react'; + +import Table from './components/Table'; + +function App() { + const [salesData, setSalesData] = useState(null); + + const fetchSalesData = async () => { + const response = await fetch('./src/lib/db/sales.json'); + const data = await response.json(); + setSalesData(data); + }; + + useEffect(() => { + fetchSalesData(); + }, []); + + return ( +
+
+
+
+

Product Sales

+

+ A table of product sales data for the current month. +

+
+
+ +
+
+
+ {salesData && } + + + + + + ); +} + +export default App; diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx new file mode 100644 index 0000000..ce5e545 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx @@ -0,0 +1,32 @@ +import TableRow from './TableRow'; +import { Product } from '../lib/datatypes'; + +const Table = ({ salesData }: { salesData: Product[] }) => { + return ( +
+ + + + + + + + + + + + + {salesData.length > 0 && + salesData.map( + (product) => + // Aro + // wenn product == null (böse json datei :) wird trotzdem versucht auf die id zuzugreifen + // ==> Fehler... + product && , + )} + +
IDProductCodeQuantityPriceProfit
+ ); +}; + +export default Table; diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx new file mode 100644 index 0000000..6d8cb32 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx @@ -0,0 +1,25 @@ +import { Product } from '../lib/datatypes'; + +const TableRow = ({ product }: { product: Product }) => { + const { + id, + product: productName, + productCode, + quantity, + price, + profit, + } = product; + + return ( + + {id} + {productName} + {productCode} + {quantity} + ${price.toFixed(2)} + ${profit.toFixed(2)} + + ); +}; + +export default TableRow; diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/index.css b/06_js-debug/uebungen/u15_product-sales-table/src/index.css new file mode 100644 index 0000000..011e5ce --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/index.css @@ -0,0 +1,187 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +*, +html, +body { + margin: 0; + padding: 0; + color: #171717; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; +} + +button { + border: none; +} + +.screen-reader-text { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +/* ===== App Component ===== */ +main { + max-width: 80rem; /* 1280px */ + margin: 0 auto; + padding: 3rem 0.75rem; /* 48px 12px */ +} + +.wrapper { + padding: 0 1rem; /* 0 16px */ +} + +.header-container { + display: block; +} + +.header-title-wrapper { + display: block; +} + +.title { + font-size: 1rem; /* 16px */ + line-height: 1.5rem; /* 24px */ + line-height: 1.5rem; /* 24px */ + font-weight: 600; + color: #111827; +} + +.subtitle { + margin-top: 0.5rem; /* 8px */ + font-size: 0.875rem; /* 14px */ + line-height: 1.25rem; /* 20px */ + color: #374151; +} + +.table-wrapper { + display: flow-root; + margin-top: 2rem; /* 32px */ +} + +.table-container { + margin: -0.5rem -1rem; /* -8px -16px */ + overflow-x: auto; +} + +.table-box { + display: inline-block; + min-width: 100%; + padding: 0.5rem 0 /* 8px 0 */; + vertical-align: middle; +} + +/* ===== Table Component ===== */ +table { + min-width: 100%; + border-collapse: collapse; +} + +th { + white-space: nowrap; + padding-top: 0.875rem /* 14px */; + padding-bottom: 0.875rem /* 14px */; + padding-left: 1rem /* 16px */; + padding-right: 0.75rem /* 12px */; + text-align: left; + font-weight: 600; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + color: #111827; +} + +tbody { + background-color: white; +} + +thead tr { + border-bottom: 1px solid #d1d5db; +} + +tbody tr { + border-bottom: 1px solid #e5e7eb; +} + +.id-column { + white-space: nowrap; + padding-top: 0.5rem /* 8px */; + padding-bottom: 0.5rem /* 8px */; + padding-left: 1rem /* 16px */; + padding-right: 0.75rem /* 12px */; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + color: #6b7280; +} + +.product-info-column { + white-space: nowrap; + padding: 0.5rem /* 8px */; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + font-weight: 500; + color: #111827; +} + +.product-num-column { + white-space: nowrap; + padding: 0.5rem /* 8px */; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + color: #6b7280; +} + +/* ===== Breakpoints ===== */ +@media (min-width: 640px) { + .wrapper { + padding: 0 1.5rem; /* 0 24px */ + } + + .header-container { + display: flex; + align-items: center; + } + + .header-title-wrapper { + flex: 1 1 auto; + } + + .table-container { + margin: -0.5rem -1.5rem; /* -8px -24px */ + } + + .table-box { + padding: 0.5rem 1.5rem /* 8px 24px */; + } + + th { + padding-left: 0px; + } + + .id-column { + padding-left: 0px; + } +} + +@media (min-width: 1024px) { + .wrapper { + padding: 0 2rem; /* 0 32px */ + } + + .table-container { + margin: -0.5rem -2rem; /* -8px -32px */ + } + + .table-box { + padding: 0.5rem 2rem /* 8px 32px */; + } +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts b/06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts new file mode 100644 index 0000000..b00b7e3 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts @@ -0,0 +1,8 @@ +export interface Product { + id: number; + product: string; + productCode: string; + quantity: number; + price: number; + profit: number; +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json b/06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json new file mode 100644 index 0000000..ac3c54e --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json @@ -0,0 +1,115 @@ +[ + { + "id": 1, + "product": "Laptop", + "productCode": "LPT", + "quantity": 352, + "price": 1200.0, + "profit": 200.0 + }, + { + "id": 2, + "product": "Smartphone", + "productCode": "SPH", + "quantity": 500, + "price": 800.0, + "profit": 123.0 + }, + { + "id": 3, + "product": "Headphones", + "productCode": "HDP", + "quantity": 432, + "price": 150.0, + "profit": 50.0 + }, + { + "id": 4, + "product": "Keyboard", + "productCode": "KBD", + "quantity": 431, + "price": 75.0, + "profit": 25.0 + }, + null, + { + "id": 6, + "product": "Monitor", + "productCode": "MNT", + "quantity": 234, + "price": 300.0, + "profit": 50.0 + }, + { + "id": 7, + "product": "Tablet", + "productCode": "TBL", + "quantity": 68, + "price": 350.0, + "profit": 100.0 + }, + { + "id": 8, + "product": "Printer", + "productCode": "PRT", + "quantity": 642, + "price": 200.0, + "profit": 50.0 + }, + { + "id": 9, + "product": "Webcam", + "productCode": "WCM", + "quantity": 123, + "price": 90.0, + "profit": 20.0 + }, + { + "id": 10, + "product": "Desk Lamp", + "productCode": "DLP", + "quantity": 1921, + "price": 30.0, + "profit": 5.0 + }, + { + "id": 11, + "product": "Chair", + "productCode": "CHR", + "quantity": 4854, + "price": 120.0, + "profit": 20.0 + }, + { + "id": 12, + "product": "External Hard Drive", + "productCode": "EHD", + "quantity": 483, + "price": 100.0, + "profit": 20.0 + }, + { + "id": 13, + "product": "USB-C Adapter", + "productCode": "USC", + "quantity": 10239, + "price": 19.99, + "profit": 5.0 + }, + { + "id": 14, + "product": "Smart Watch", + "productCode": "SWT", + "quantity": 483, + "price": 199.99, + "profit": 50.0 + }, + { + "id": 15, + "product": "Speakers", + "productCode": "SPK", + "quantity": 394, + "price": 85.0, + "profit": 20.0 + } +] diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/main.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts b/06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json new file mode 100644 index 0000000..d739292 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.json b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json new file mode 100644 index 0000000..3afdd6e --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/06_js-debug/uebungen/u15_product-sales-table/vite.config.ts b/06_js-debug/uebungen/u15_product-sales-table/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/06_js-debug/uebungen/u15_product-sales-table/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs b/06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/README.md b/06_js-debug/uebungen/u16_lexifind-exercise/README.md new file mode 100644 index 0000000..7613900 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/README.md @@ -0,0 +1,10 @@ +# Frontend Class: LexiFind Exercise Starter + +Install the dependencies and devDependencies and start the server. + +```bash +npm install +npm run dev +``` + +This will start the server on http://localhost:5173 diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/index.html b/06_js-debug/uebungen/u16_lexifind-exercise/index.html new file mode 100644 index 0000000..70b3ea2 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/index.html @@ -0,0 +1,13 @@ + + + + + + + LexiFind - Your Personal Dictionary + + +
+ + + diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json b/06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json new file mode 100644 index 0000000..66b0f62 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json @@ -0,0 +1,2744 @@ +{ + "name": "lexifind-webmaster-exercise", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lexifind-webmaster-exercise", + "version": "0.0.0", + "dependencies": { + "@types/react-router-dom": "^5.3.3", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "^6.0.3", + "vite": "^8.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.67.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.16.tgz", + "integrity": "sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.412", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", + "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", + "dev": true, + "license": "ISC" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", + "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", + "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-router": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/package.json b/06_js-debug/uebungen/u16_lexifind-exercise/package.json new file mode 100644 index 0000000..2369395 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/package.json @@ -0,0 +1,30 @@ +{ + "name": "lexifind-webmaster-exercise", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@types/react-router-dom": "^5.3.3", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "^6.0.3", + "vite": "^8.2.2" + } +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/public/LexiFind.webp b/06_js-debug/uebungen/u16_lexifind-exercise/public/LexiFind.webp new file mode 100644 index 0000000000000000000000000000000000000000..1bda48b619675b706e13c78e0a808924d08375a0 GIT binary patch literal 2986 zcmbuAWmpsJ8plToyyPU5o`fT%Ys6@nq%^(E$K9x>{z|W=f!(i?Nv#pnyyi zKz`8y0HM=)ZI(Q zJ0T8Ltl5q*hktge>D1-MhjMWaJJS?2t=~SS=lv(J=7S}we&s%_W0A}goL4T+i?EHWvz>^|B}bt3H(#9HB~mlYa>a4 zHFn1B$b3N~QF`1VNz9D@mVM;qq)8eC57jiPiCl;c4HT~We>X+^^X1q)>o{j!X>N}S zl|IY3OLdOBvt@wMiitmy8UgSmi( zw0tLpg+j&slQ^7V{PQ^Hu32b+@%h_f6bs^|{i;{)lpT``1~HhgGguLSU2aZ6%GZ7G z%_r$Mvz&d=!h)CnM)JEhx8imdPWW%}T-V9P3=}J z@dnS~m5Y@|WB+Vq5UpMMuxgBQ6Nlr_?{1A<;GCE9KC=3SzkuLP`kUkh%zw)o03ecx zhwBj(SNfYrtP?qU1emv@QpWC`mMnUq!bv|fSKW_&^&kx?WvR0T0pc6ZsEHy1?YIvQ z%6QR7wg{y!y}l{x+iNi2!Ja=K{SgE7amSpx)oQqqUDKGdgcWK!3-14rh`D{+KZx~; zx9ewFrx5;>Alfji?X&M@oc&$NS3C2MK7Ob%g51-q-EB2#Wy4!|N!Hp%<+Wvxjwxs& z5m;ZA_hIHOo*{)rQgj3s(szXyEB z*6xLsG&@;kcjit4V@zq+KPnbUU0*ATsypSj!~q<`f(Sa;*DtRNpst@ zUr=%>)0a6HVuB2KlF^Kj!{Ez&cUs{T-gHL00?Pl5vM9ya6&a{{?Q39zzOuvinYD@w zDq#(AMhD!CL-~xi)w$wak!yAC$rVD?Rk%PEiQVfz87TXHg^ZXuoABY;u2nH{DEQJD zHL^T~>fVBxBn#3DGZ2?scP+klM%)A#{@RKOrOm7+E>0-2X7Gg>mn`2&h~Mcrk8w|U z^=!wlW^k%aZ|=TX?^I|DqMHsPQc10qE29ZX2}>s-kgGzTO|-8ci5)pVk5g6{NX@{~ zcCifDlweTZX_oAD5aY!yQ{5NklbRreo1ugJooch5j?0CE+UGK7&!}xdS97aIx6LuC z1SMHP;?tK`j`q{{e+2I-yu{k=)6A(MW2xVzg6H2-88NBWB!%oysG4&~379adtp%CwBz zJs5AT8vCtiAPU|Mm)u-a?W>cG4D?w=4XB28KzrtRUp9p(VOk+QK1_X`=VFT2_W10z+w^jDN;;_iU&F~A@cR7o>5 zIUvHF&clYgt?2%K)z_o)4m@U6MLsfg`zN~oZM*8EzZah{UoZ9>Gb|;v>H9Fzd(Mz* zBvFwqeRu+nbT{Fl&i3pI=hDHO8>w@rvRV2mov>Frr;flr=f7)LLbe-@{nxxkhbulv zlltdG@;Js^t5M???mVOP7Y-kD_4!bf8>P>Elg5Rqnf}sQM_p|;ASE5U36e^p+dP3+ z&bHz@rjqfOAAxJ>tj!fm+0FuFD3+T^ulZ_U7o{i!I@sQEevCt%8wAve1cSK z8b=)=XYCNCpykmQ@Sd-T?j}pft*v1d#YwxQ5_vnd5apKIvz6*_E}QaPzL#C1racF# z&L~vt`AI z3=Uu%`Ni(4TA`ue(w861G%C8j*YvC`@&vo``i#i{cS4SlDV;f7YP}2B4q0d}Jt_Z& zOcb{oK1^K}a)c*?em}2^Mymr1^{e(pV;A1(%y=2Vrk6exb!LVhSH;R(ZK2|vrL4x&-1vQv*{bNs0{1n4@isFOcO@})=0KAziRm7>`CBa1rQ_}n#tm`^>AU< z@LtYQHOyjF4f)tT?A-mJiVHLVaF0|LW}vY8T7Jp-*POSu2IOFZa93K iy2ylxa!uJEk3ND=l|9nnM(wV|)(w$mq;Jo~)&C1va=~!` literal 0 HcmV?d00001 diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx new file mode 100644 index 0000000..29093a0 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx @@ -0,0 +1,52 @@ +import { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; + +import { HeartFilled, HeartIcon } from './Icons'; + +interface FavoriteWordProps { + word: string; +} + +const FavoriteWord: React.FC = ({ word }) => { + const [isFavorite, setIsFavorite] = useState(false); + + const toggleFavorite = () => { + const favorites = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); + + if (favorites.includes(word)) { + const filteredFavorites = favorites.filter((item: string) => item !== word); + localStorage.setItem('favoriteWords', JSON.stringify(filteredFavorites)); + } else { + favorites.push(word); + localStorage.setItem('favoriteWords', JSON.stringify(favorites)); + } + setIsFavorite(!isFavorite); + }; + + // [x] Missing useEffect + useEffect(() => { + const favoriteWords = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); + setIsFavorite(favoriteWords.includes(word)); + }, [word]); + + return ( +
+ +

{word}

+ + + +
+ ); +}; + +export default FavoriteWord; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx new file mode 100644 index 0000000..84b2d7d --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +import { SERIF_FONTS, SANS_SERIF_FONTS } from '../lib/constants'; + +interface HeaderProps { + font: string; + setFont: React.Dispatch>; +} + +const Header: React.FC = ({ font, setFont }) => { + return ( +
+ + LexiFind Logo + LexiFind + + +
+ + Favorites + +
+ + +
+ ); +}; + +export default Header; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx new file mode 100644 index 0000000..9fff78a --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx @@ -0,0 +1,46 @@ +export function HeartIcon(props: React.SVGProps) { + return ( + + + + ); +} + +export function HeartFilled(props: React.SVGProps) { + return ( + + + + ); +} + +export function PlayIcon(props: React.SVGProps) { + return ( + + + + ); +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx new file mode 100644 index 0000000..cab05bf --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx @@ -0,0 +1,59 @@ +import React from 'react'; + +interface SearchbarProps { + word: string; + setWord: React.Dispatch>; + handleSubmit: (e: React.FormEvent) => void; +} + +const Searchbar: React.FC = ({ + word, + setWord, + handleSubmit, +}) => { + return ( +
+
+ + +
+ setWord(e.target.value)} + /> + +
+
+
+ ); +}; + +function SearchIcon(props: React.SVGProps) { + return ( + + + + ); +} + +export default Searchbar; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx new file mode 100644 index 0000000..8cbdc03 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx @@ -0,0 +1,51 @@ +import React from 'react'; + +interface SourceFooterProps { + source: string; +} + +const SourceFooter: React.FC = ({ source }) => { + return ( + <> +
+ +
+

Source

+ + +
+ + ); +}; + +function BoxArrowUpRightIcon(props: React.SVGProps) { + return ( + + + + + ); +} + +export default SourceFooter; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx new file mode 100644 index 0000000..ba6bcfd --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { Meaning, WordData } from '../lib/datatypes'; + +interface WordDefinitionsProps { + wordData: WordData; +} + +const WordDefinitions: React.FC = ({ wordData }) => { + return ( +
+ {wordData.meanings.map((meaning: any, index: number) => ( + + ))} +
+ ); +}; + +interface WordDefinitionBlockProps { + data: Meaning; +} + +const WordDefinitionBlock: React.FC = ({ data }) => { + const { partOfSpeech, definitions, synonyms } = data; + + return ( +
+
+

{partOfSpeech}

+
+
+ +
+

Meaning

+ +
    + {definitions.map((definition: any, index: number) => ( +
  • + {definition.definition}{' '} + {definition.example && ( + + "{definition.example}" + + )} +
  • + ))} +
+
+ + {synonyms.length > 0 && ( +
+

Synonyms

+ +
    + {synonyms.map((synonym: string, index: number) => ( +
  • + {synonym} +
  • + ))} +
+
+ )} +
+ ); +}; + +export default WordDefinitions; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx new file mode 100644 index 0000000..fc40c93 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx @@ -0,0 +1,74 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { PlayIcon, HeartIcon, HeartFilled } from './Icons'; +import { Phonetic } from '../lib/datatypes'; + +interface WordHeroProps { + data: { + word: string; + phonetics: Phonetic[]; + }; +} + +const WordHero: React.FC = ({ data }) => { + const { word, phonetics } = data; + + const [isFavorite, setIsFavorite] = useState(false); + + const americanEnglishPhonetic = phonetics.find((phonetic) => phonetic.audio?.includes('-us')); + const finalPhonetic = americanEnglishPhonetic || phonetics[0]; + + const audioRef = useRef(null); + + const playAudio = () => { + if (audioRef.current) { + audioRef.current.play(); + } + }; + + const toggleFavorite = () => { + const favorites = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); + + if (favorites.includes(word)) { + const filteredFavorites = favorites.filter((item: string) => item !== word); + localStorage.setItem('favoriteWords', JSON.stringify(filteredFavorites)); + } else { + favorites.push(word); + localStorage.setItem('favoriteWords', JSON.stringify(favorites)); + } + + setIsFavorite(!isFavorite); + }; + + useEffect(() => { + const favoriteWords = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); + setIsFavorite(favoriteWords.includes(word)); + }, [word]); + + return ( +
+
+ + +

{word}

+ {finalPhonetic?.text &&

{finalPhonetic.text}

} +
+ + {finalPhonetic?.audio && ( +
+ + +
+ )} +
+ ); +}; + +export default WordHero; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/index.css b/06_js-debug/uebungen/u16_lexifind-exercise/src/index.css new file mode 100644 index 0000000..c684563 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/index.css @@ -0,0 +1,430 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +*, +html, +body { + margin: 0; + padding: 0; + color: #171717; +} + +button { + border: none; +} + +a { + text-decoration: none; +} + +.screen-reader-text { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.heart-icon-btn { + background-color: transparent; + margin-right: auto; + cursor: pointer; +} + +.heart-icon-unfilled { + width: 2rem; /* 32px */ + height: 2rem; /* 32px */ + stroke: #9333ea; + background-color: transparent; +} + +.heart-icon-filled { + width: 2rem; /* 32px */ + height: 2rem; /* 32px */ + fill: #9333ea; + background-color: transparent; +} + +/* ===== App Component ===== */ +.app-wrapper { + margin: 0 auto; + max-width: 42rem; /* 672px */ + padding: 3.5rem 1.5rem; /* 56px 24px */ +} + +/* ===== Header Component ===== */ +.header-container { + display: flex; + align-items: center; + justify-content: space-between; +} + +.header-logo-wrapper { + display: flex; + align-items: center; +} + +.header-logo-img { + height: 2.5rem; /* 40px */ +} + +.header-logo-text { + font-family: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; + font-size: 1.875rem; /* 30px */ + line-height: 2.25rem; /* 36px */ + font-weight: 600; + margin-left: 1rem; /* 16px */ + color: #262626; +} + +.header-select { + border-radius: 0.375rem; /* 6px */ + border-width: 0px; + padding: 0.625rem 0.5rem; /* 10px 8px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + outline: 2px solid transparent; + outline-offset: 2px; + color: #262626; +} + +.header-select:focus { + outline-color: #9333ea; +} + +.header-link-text { + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + text-decoration: none; + color: #262626; +} + +.header-link-text:hover { + color: #9333ea; +} + +/* ===== Searchbar Component ===== */ +.searchbar-wrapper { + margin-top: 4rem; /* 64px */ +} + +.searchbar-container { + position: relative; + margin-top: 0.5rem; /* 8px */ + border-radius: 0.75rem; /* 12px */ + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); +} + +.searchbar-input { + display: block; + width: 100%; + border-radius: 0.75rem; /* 12px */ + border-width: 0px; + padding: 1.25rem 0 1.25rem 1.5rem; /* 20px 0 20px 24px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + font-weight: 600; + outline-style: solid; + outline: 2px solid transparent; + outline-color: #f5f5f5; + color: #171717; + background-color: #f5f5f5; +} + +.searchbar-input:focus { + outline-color: #9333ea; +} + +.searchbar-input::placeholder { + color: #737373; +} + +.searchbar-magnifying-glass { + position: absolute; + top: 0px; + bottom: 0px; + right: 0px; + display: flex; + align-items: center; + border-top-right-radius: 0.75rem; /* 12px */ + border-bottom-right-radius: 0.75rem; /* 12px */ + padding-left: 1rem; /* 16px */ + padding-right: 1rem; /* 16px */ + outline: 2px solid transparent; + outline-offset: 2px; + background-color: transparent; +} + +.searchbar-icon { + width: 1.5rem; /* 24px */ + height: 1.5rem; /* 24px */ + fill: #6b21a8; +} + +/* ===== WordHero Component ===== */ +.wordhero-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 4rem; /* 64px */ +} + +.wordhero-word-container { + display: flex; + flex-direction: column; +} + +.wordhero-word { + font-size: 3.75rem; /* 60px */ + line-height: 1; + font-weight: 600; + color: #262626; +} + +.wordhero-word-phonetic { + font-size: 1.5rem; /* 24px */ + line-height: 2rem; /* 32px */ + margin-top: 0.75rem; /* 12px */ + margin-bottom: 0.75rem; /* 12px */ + color: #9333ea; +} + +.wordhero-play-btn { + display: flex; + align-items: center; + border-radius: 9999px; + padding: 1.25rem; /* 20px */ + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + color: white; + background-color: #e9d5ff; +} + +.wordhero-play-btn:hover { + background-color: #d8b4fe; +} + +.wordhero-play-btn:focus { + outline: 2px solid transparent; + outline-color: #9333ea; +} + +.wordhero-play-icon { + height: 2.5rem; /* 40px */ + width: 2.5rem; /* 40px */ + fill: #9333ea; +} + +/* ===== WordDefinitions Component ===== */ +.word-definitions-wrapper { + display: flex; + flex-direction: column; + gap: 2rem; /* 32px */ + margin-top: 4rem; /* 64px */ +} + +.word-block-wrapper { + display: flex; + flex-direction: column; + gap: 3.5rem; /* 56px */ +} + +.word-block-category-container { + display: flex; + align-items: center; + gap: 0.5rem; /* 8px */ +} + +.word-block-category-name { + padding-right: 0.75rem; /* 12px */ + font-size: 1.5rem; /* 24px */ + line-height: 2rem; /* 32px */ + font-weight: 600; + color: #262626; +} + +.word-block-category-divider { + height: 1px; + width: 100%; + background-color: #d4d4d4; +} + +.word-block-meaning-container { + display: flex; + flex-direction: column; + row-gap: 1rem; /* 16px */ +} + +.word-block-meaning-title { + font-size: 1.25rem; /* 20px */ + line-height: 1.75rem; /* 28px */ + font-weight: 400; + color: #737373; +} + +.word-block-meaning-list { + display: flex; + flex-direction: column; + padding-left: 1rem; /* 16px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + row-gap: 2rem; /* 32px */ + color: #262626; +} + +.word-block-meaning-list-item::marker { + padding-left: 2.5rem; /* 40px */ + color: #9333ea; +} + +.word-block-meaning-list-item-example { + display: block; + margin-top: 0.5rem; /* 8px */ + color: #9333ea; +} + +.word-block-synonyms-container { + display: flex; + align-items: baseline; + column-gap: 2rem; /* 32px */ +} + +.word-block-synonyms-title { + font-size: 1.25rem; /* 20px */ + line-height: 1.75rem; /* 28px */ + font-weight: 400; + color: #737373; +} + +.word-block-synonyms-list { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; /* 8px */ +} + +.word-block-synonyms-list-item { + list-style: none; + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + font-weight: 600; + color: #9333ea; +} + +/* ===== SourceFooter Component ===== */ +.footer-divider { + margin-top: 2.5rem; /* 40px */ + margin-bottom: 2.5rem; /* 40px */ + height: 1px; + background-color: #e5e5e5; +} + +.footer-wrapper { + display: flex; + align-items: baseline; + gap: 1rem; /* 16px */ + font-size: 0.875rem; /* 14px */ + line-height: 1.25rem; /* 20px */ +} + +.footer-title { + font-weight: 400; + color: #737373; +} + +.footer-link-wrapper { + display: flex; + text-decoration: underline; + color: #262626; +} + +.footer-link-icon { + margin-left: 0.5rem; /* 8px */ + height: 1rem; /* 16px */ + width: 1rem; /* 16px */ + fill: #262626; +} + +/* ===== Favorites Page ===== */ +.favorites-list { + margin-top: 1rem; /* 16px */ + border-top-width: 2px; + border-bottom-width: 0px; + border-color: rgb(229 229 229); +} + +.favorites-text { + margin-top: 4rem; /* 64px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + color: #525252; +} + +.favorites-item { + list-style: none; + padding: 0.5rem 0; /* Add some padding to each item */ +} + +.favorites-item.with-divider { + border-top: 1px solid #e5e5e5; /* Add divider */ +} + +/* ===== Favorite Word ===== */ +.fave-word-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + padding: 2.5rem 0; /* 40px 0 */ +} + +.fave-word-link { + background-color: #e9d5ff; + padding: 0.5rem 0.875rem; /* 8px 14px */ + border-radius: 0.375rem; /* 6px */ + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); +} + +.fave-word-link:hover { + background-color: #d8b4fe; +} + +.fave-word-link:focus { + outline: 2px solid #9333ea; +} + +.fave-word-link p { + font-size: 1.25rem; /* 20px */ + line-height: 1.75rem; /* 28px */ + font-weight: 500; + color: #262626; +} + +.fave-icon-btn { + background-color: transparent; + cursor: pointer; +} + +/* ===== Breakpoints ===== */ +@media (min-width: 640px) { + .searchbar-input { + line-height: 1.5rem; /* 24px */ + } +} + +@media (min-width: 768px) { + .word-block-meaning-list { + padding-left: 2.5rem; /* 40px */ + } +} + +@media (min-width: 1024px) { + .app-wrapper { + padding: 3.5rem 0.5rem; /* 56px 8px */ + } +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts b/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts new file mode 100644 index 0000000..76a8a8d --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts @@ -0,0 +1,5 @@ +export const SERIF_FONTS = + 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif'; + +export const SANS_SERIF_FONTS = + 'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts b/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts new file mode 100644 index 0000000..1387f74 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts @@ -0,0 +1,22 @@ +export interface Phonetic { + text?: string; + audio?: string; +} + +export interface Definition { + definition: string; + example?: string; +} + +export interface Meaning { + partOfSpeech: string; + definitions: Definition[]; + synonyms: string[]; +} + +export interface WordData { + word: string; + phonetics: Phonetic[]; + meanings: Meaning[]; + sourceUrls: string[]; +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx new file mode 100644 index 0000000..448bae6 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; + +import Root from './pages/root.tsx'; +import Favorites from './pages/favorites.tsx'; +import { createBrowserRouter, RouterProvider } from 'react-router-dom'; + +const router = createBrowserRouter([ + { + path: '/', + element: , + }, + { + path: '/favorites', + element: , + }, +]); + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + +); diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx new file mode 100644 index 0000000..580c8c0 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx @@ -0,0 +1,46 @@ +import { useState, useEffect } from 'react'; + +import Header from '../components/Header'; +import FavoriteWord from '../components/FavoriteWord'; + +import { SERIF_FONTS } from '../lib/constants'; + +function Favorites() { + const [font, setFont] = useState(SERIF_FONTS); + const [favoriteWords, setFavoriteWords] = useState([]); + + useEffect(() => { + const loadedFavorites = JSON.parse( + localStorage.getItem('favoriteWords') || '[]' + ); + setFavoriteWords(loadedFavorites); + }, []); + + return ( +
+
+ + {favoriteWords.length > 0 ? ( +
    + {favoriteWords.map((word, index) => ( +
  • 0 ? 'with-divider' : ''}`} + key={index} + > + +
  • + ))} +
+ ) : ( +

No favorite words added yet.

+ )} +
+ ); +} + +export default Favorites; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx new file mode 100644 index 0000000..a196c3e --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx @@ -0,0 +1,66 @@ +import React, { useState, useEffect } from 'react'; +import { useSearchParams } from 'react-router-dom'; + +import { WordData } from '../lib/datatypes'; + +import Header from '../components/Header'; +import Searchbar from '../components/Searchbar'; +import WordHero from '../components/WordHero'; +import WordDefinitions from '../components/WordDefinitions'; +import SourceFooter from '../components/SourceFooter'; + +import { SERIF_FONTS } from '../lib/constants'; + +function Root() { + const [params] = useSearchParams(); + + const [font, setFont] = useState(SERIF_FONTS); + const [word, setWord] = useState(params.get('word') || 'course'); // /?word=WERT + const [wordData, setWordData] = useState(null); + + const fetchData = async () => { + try { + const url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; + const response = await fetch(url); + const data = await response.json(); + + setWordData(data[0]); + } catch (error: unknown) { + if (error instanceof Error) { + console.error(error.message); + } + console.error(error); + } + }; + + const handleSubmit = async (e: React.SyntheticEvent) => { + e.preventDefault(); + fetchData(); + }; + + useEffect(() => { + fetchData(); + }, []); + + return ( +
+
+ + + + {wordData && ( +
+ + + +
+ )} +
+ ); +} + +export default Root; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts b/06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json new file mode 100644 index 0000000..d739292 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json new file mode 100644 index 0000000..3afdd6e --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts b/06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/06_js-debug/uebungen/uebungen-15-16-js-debug.zip b/06_js-debug/uebungen/uebungen-15-16-js-debug.zip new file mode 100644 index 0000000000000000000000000000000000000000..20d41ce575f42f2cf8a365dd0e269374212688c7 GIT binary patch literal 52461 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 B)29Fc literal 0 HcmV?d00001 diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js index 61c783c..82e6341 100644 --- a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js @@ -5,8 +5,8 @@ const Counter = (elOrSelector = null) => { // TODO: forEach for string selector const module = elOrSelector || document.querySelector(elOrSelector); - const countEl = module.querySelector('input[id^="count"]'); - const btnEl = module.querySelector('button[id^="incrementButton"]'); + const countEl = module.querySelector('.input-count'); + const btnEl = module.querySelector('.button-increment'); // 'button[id^="incrementButton"]' const id = v4(); diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html index 7d39900..adc5799 100644 --- a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html @@ -41,7 +41,7 @@ readonly aria-label="Counter" />
- +
diff --git a/06_js-debug/unterricht/tag48/01_counter/website-app-react/src/components/heros/Hero.scss b/06_js-debug/unterricht/tag48/01_counter/website-app-react/src/components/heros/Hero.scss index ccc5a51..ddb02bf 100644 --- a/06_js-debug/unterricht/tag48/01_counter/website-app-react/src/components/heros/Hero.scss +++ b/06_js-debug/unterricht/tag48/01_counter/website-app-react/src/components/heros/Hero.scss @@ -2,6 +2,7 @@ width: 100%; height: 40vh; + // Mobile First background: tomato url('https://dummyimage.com/900x450/f90/000.jpg') center no-repeat; background-size: cover; diff --git a/06_js-debug/unterricht/tag49/01_demo-form-bug/assets/js/main.js b/06_js-debug/unterricht/tag49/01_demo-form-bug/assets/js/main.js new file mode 100644 index 0000000..e040173 --- /dev/null +++ b/06_js-debug/unterricht/tag49/01_demo-form-bug/assets/js/main.js @@ -0,0 +1,57 @@ +'use strict'; + +(() => { + // ===== DOM ===== + const DOM = { + calculateForm: document.querySelector('#calculateForm'), + firstNumberInput: document.querySelector('#firstNumber'), + secondNumberInput: document.querySelector('#secondNumber'), + result: document.querySelector('#result'), + }; + + // console.log(DOM); + + // ===== INIT ===== + const init = () => { + DOM.calculateForm.noValidate = true; // DOM.calculateForm.setAttribute('novalidate',''); + DOM.calculateForm.addEventListener('submit', handleFormSubmit); + }; + + // ===== EVENT HANDLERS ===== + function handleFormSubmit(e) { + e.preventDefault(); + + if (hasInputsEmptyValues(DOM.firstNumberInput, DOM.secondNumberInput)) { + alert('Please enter a number in both fields'); + return; + } + + const num1 = getNumberValue(DOM.firstNumberInput); + const num2 = getNumberValue(DOM.secondNumberInput); + + const sum = add(num1, num2); + + displayResult(sum); + DOM.calculateForm.reset(); + } + + // ===== FUNCTIONS ===== + const hasInputsEmptyValues = (inputOne, inputTwo) => { + // if (inputOne.value === '' || inputTwo.value === '') { + // return true; + // } else { + // return false; + // } + return inputOne.value === '' || inputTwo.value === ''; + }; + + const getNumberValue = (input) => Number(input.value); + const add = (a, b) => Number(a) + Number(b); + + const displayResult = (result) => { + DOM.result.textContent = result; + }; + + // ===== CALL INIT ===== + init(); +})(); diff --git a/06_js-debug/unterricht/tag49/01_demo-form-bug/index.html b/06_js-debug/unterricht/tag49/01_demo-form-bug/index.html new file mode 100644 index 0000000..bdb9c27 --- /dev/null +++ b/06_js-debug/unterricht/tag49/01_demo-form-bug/index.html @@ -0,0 +1,41 @@ + + + + + + Debugging Demo + + + + +
+

Debugging Demo

+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
Result:
+
+ + diff --git a/06_js-debug/unterricht/tag49/01_demo-form-bug/package-lock.json b/06_js-debug/unterricht/tag49/01_demo-form-bug/package-lock.json new file mode 100644 index 0000000..403cb02 --- /dev/null +++ b/06_js-debug/unterricht/tag49/01_demo-form-bug/package-lock.json @@ -0,0 +1,644 @@ +{ + "name": "01_demo-form-bug", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "01_demo-form-bug", + "version": "1.0.0", + "devDependencies": { + "http-server": "^14.1.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/06_js-debug/unterricht/tag49/01_demo-form-bug/package.json b/06_js-debug/unterricht/tag49/01_demo-form-bug/package.json new file mode 100644 index 0000000..99c7f07 --- /dev/null +++ b/06_js-debug/unterricht/tag49/01_demo-form-bug/package.json @@ -0,0 +1,14 @@ +{ + "name": "01_demo-form-bug", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "npx http-server -c-1 -p 3000" + }, + "keywords": [], + "type": "module", + "devDependencies": { + "http-server": "^14.1.1" + } +} diff --git a/06_js-debug/unterricht/tag49/02_debug-sources.zip b/06_js-debug/unterricht/tag49/02_debug-sources.zip new file mode 100644 index 0000000000000000000000000000000000000000..64608dc171a4f0eac5878c40b8a313e751dc6fb6 GIT binary patch literal 4636 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 { + // === DOM & VARS ======= + const DOM = { + btnLottoDraw: document.querySelector('.button-lotto-draw'), + btnWordCounter: document.querySelector('.button-word-counter'), + btnGetStudents: document.querySelector('.button-get-students'), + lottoNumbers: document.querySelector('.lotto-numbers'), + content: document.querySelector('.content'), + calculateForm: document.querySelector('#calculateForm'), + firstNumberInput: document.querySelector('#firstNumber'), + secondNumberInput: document.querySelector('#secondNumber'), + result: document.querySelector('#result'), + sectionStudents: document.querySelector('.section-students'), + }; + + const names = ['Adel (Admin)', 'Ersin', 'Kahleel (Admin)', 'Andreas', 'Philippe (Admin)']; + + // if (text === true) { + // console.log('Error'); + // } + + // console.log(DOM); + + // === INIT ============= + const init = () => { + // EventListener + DOM.btnLottoDraw.addEventListener('click', onClickLottoNumbers); + DOM.btnWordCounter.addEventListener('click', onClickWordCounter); + DOM.calculateForm.addEventListener('submit', handleFormSubmit); + DOM.btnGetStudents.addEventListener('click', onClickGetStudents); + }; + + // === EVENTHANDLER ===== + const onClickLottoNumbers = (e) => { + const lottoNumbers = getLottoNumbers(); + console.log(lottoNumbers); + createLottoNumbers(lottoNumbers); + }; + + const onClickGetStudents = (e) => { + const students = getAdmins(); + createStudents(students); + }; + + const onClickWordCounter = (e) => { + const text = DOM.content.innerText; + const words = getWordOccurance(text); + console.log(words); + }; + + const handleFormSubmit = (e) => { + e.preventDefault(); + + if (checkIfInputsAreEmpty(DOM.firstNumberInput, DOM.secondNumberInput)) { + alert('Please enter a number in both fields'); + return; + } + + const num1 = getNumberValue(DOM.firstNumberInput); + const num2 = getNumberValue(DOM.secondNumberInput); + + // console.log(num1, typeof num1); + // console.log(num2, typeof num2); + + const sum = add(num1, num2); + + displayResult(sum); + + DOM.calculateForm.reset(); + }; + + // === XHR/FETCH ======== + + // === FUNCTIONS ======== + function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + const getLottoNumbers = (sorted = true) => { + const lottoNumbers = []; + const MAX_DRAW = 6; + + while (lottoNumbers.length < MAX_DRAW) { + const lottoNumber = getRandomInt(1, 49); + console.log(lottoNumber); + if (!lottoNumbers.includes(lottoNumber)) { + lottoNumbers.push(lottoNumber); + } else { + console.log(`Found duplicate: ${lottoNumber}.`); + } + } + + if (sorted) { + lottoNumbers.sort((a, b) => a - b); + } + + return lottoNumbers; + }; + + const createLottoNumbers = (numbers = []) => { + DOM.lottoNumbers.innerHTML = ''; + numbers.forEach((n) => { + const ballEl = document.createElement('span'); + ballEl.classList.add('lotto-ball'); + ballEl.textContent = String(n); + DOM.lottoNumbers.appendChild(ballEl); + }); + }; + + const getWordOccurance = (text = '') => { + const wordObj = text + .toLowerCase() + .replace(/[^\w\s]/g, '') + .split(/\s+/) + .filter((word) => word !== '') + .reduce((obj, word) => { + obj[word] = (obj[word] || 0) + 1; + return obj; + }, {}); + + return wordObj; + // create Regexp: Alles was keine Wort-zeichen oder Leerzeichen ist + + // Expected Output + // { + // "do": 1, + // "you": 9, + // } + }; + + function checkIfInputsAreEmpty(inputOne, inputTwo) { + if (inputOne.value && inputTwo.value) { + return false; + } else { + return true; + } + } + + function getNumberValue(input) { + return Number(input.value); + } + + function add(a, b) { + return Number(a) + Number(b); + } + + function displayResult(result) { + DOM.result.textContent = result; + } + + const isAdmin = (name) => { + return name.trim().endsWith('(Admin)'); + }; + + // [x]: Bug finden + const getAdmins = () => { + const adminNames = [...names].sort((a, b) => { + if (isAdmin(a) && isAdmin(b)) return a > b ? 1 : -1; + if (isAdmin(a)) { + return -1; + } + if (isAdmin(b)) { + return 1; + } + + return a > b ? 1 : -1; + }); + return adminNames; + }; + + const createStudents = (items = []) => { + DOM.sectionStudents.innerHTML = ''; + const ulEl = document.createElement('ul'); + ulEl.classList.add('list-group', 'list-students'); + + items.forEach((str) => { + const liEl = document.createElement('li'); + liEl.classList.add('list-group-item', 'list-item-student'); + liEl.textContent = str; + ulEl.appendChild(liEl); + }); + + DOM.sectionStudents.appendChild(ulEl); + }; + + init(); +})(); diff --git a/06_js-debug/unterricht/tag49/02_debug-sources/index.html b/06_js-debug/unterricht/tag49/02_debug-sources/index.html new file mode 100644 index 0000000..b545978 --- /dev/null +++ b/06_js-debug/unterricht/tag49/02_debug-sources/index.html @@ -0,0 +1,70 @@ + + + + + + Lotto Ziehung und Wörter zählen + + + + + +
+
+

Lotto Ziehung und Wörter zählen

+
+ +

Lotto Ziehung

+
+ +
+

Wörter zählen

+
+

+ Do you see any Teletubbies in here? Do you see a slender plastic tag clipped to my shirt with my name + printed on it? Do you see a little Asian child with a blank expression on his face sitting outside on a + mechanical helicopter that shakes when you put quarters in it? No? Well, that's what you see at a toy store. + And you must think you're in a toy store, because you're here shopping for an infant named Jeb. Now that + there is the Tec-9, a crappy spray gun from South Miami. This gun is advertised as the most popular gun in + American crime. Do you believe that shit? It actually says that in the little book that comes with it: the + most popular gun in American crime. Like they're actually proud of that shit. +

+
+ +
+

Teilnehmer auslesen

+
+ + +
+
+

Debugging Demo

+
+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
Result:
+
+
+ + diff --git a/06_js-debug/unterricht/tag49/02_debug-sources/package-lock.json b/06_js-debug/unterricht/tag49/02_debug-sources/package-lock.json new file mode 100644 index 0000000..4ff5f1f --- /dev/null +++ b/06_js-debug/unterricht/tag49/02_debug-sources/package-lock.json @@ -0,0 +1,644 @@ +{ + "name": "02_debug-sources", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "02_debug-sources", + "version": "1.0.0", + "devDependencies": { + "http-server": "^14.1.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/06_js-debug/unterricht/tag49/02_debug-sources/package.json b/06_js-debug/unterricht/tag49/02_debug-sources/package.json new file mode 100644 index 0000000..e492410 --- /dev/null +++ b/06_js-debug/unterricht/tag49/02_debug-sources/package.json @@ -0,0 +1,14 @@ +{ + "name": "02_debug-sources", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "npx http-server -c-1 -p 3000" + }, + "keywords": [], + "type": "commonjs", + "devDependencies": { + "http-server": "^14.1.1" + } +} diff --git a/06_js-debug/unterricht/tag49/03_debug-vscode/.vscode/launch.json b/06_js-debug/unterricht/tag49/03_debug-vscode/.vscode/launch.json new file mode 100644 index 0000000..cb48b6c --- /dev/null +++ b/06_js-debug/unterricht/tag49/03_debug-vscode/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": ["/**"], + "program": "${file}" + } + ] +} diff --git a/06_js-debug/unterricht/tag49/03_debug-vscode/index.html b/06_js-debug/unterricht/tag49/03_debug-vscode/index.html new file mode 100644 index 0000000..2414093 --- /dev/null +++ b/06_js-debug/unterricht/tag49/03_debug-vscode/index.html @@ -0,0 +1,20 @@ + + + + + + JS Debug + + + + +
+
+

JS Debug

+
+
+ + + diff --git a/06_js-debug/unterricht/tag49/03_debug-vscode/package-lock.json b/06_js-debug/unterricht/tag49/03_debug-vscode/package-lock.json new file mode 100644 index 0000000..5c146c5 --- /dev/null +++ b/06_js-debug/unterricht/tag49/03_debug-vscode/package-lock.json @@ -0,0 +1,27 @@ +{ + "name": "03_debug-vscode", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "03_debug-vscode", + "version": "1.0.0", + "dependencies": { + "chalk": "^6.0.0" + } + }, + "node_modules/chalk": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-6.0.0.tgz", + "integrity": "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + } + } +} diff --git a/06_js-debug/unterricht/tag49/03_debug-vscode/package.json b/06_js-debug/unterricht/tag49/03_debug-vscode/package.json new file mode 100644 index 0000000..5a83a8e --- /dev/null +++ b/06_js-debug/unterricht/tag49/03_debug-vscode/package.json @@ -0,0 +1,14 @@ +{ + "name": "03_debug-vscode", + "version": "1.0.0", + "description": "", + "main": "sum-array.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "type": "module", + "dependencies": { + "chalk": "^6.0.0" + } +} diff --git a/06_js-debug/unterricht/tag49/03_debug-vscode/sum-array.js b/06_js-debug/unterricht/tag49/03_debug-vscode/sum-array.js new file mode 100644 index 0000000..61b7018 --- /dev/null +++ b/06_js-debug/unterricht/tag49/03_debug-vscode/sum-array.js @@ -0,0 +1,13 @@ +import color from 'chalk'; // node spezific module + +function sumArray(arr) { + let sum = 0; + + for (let i = 0; i < arr.length; i++) { + sum += arr[i]; + } + + return sum; +} + +console.log(color.magenta(sumArray([1, 2, 3, 4, 5]))); diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter.zip b/06_js-debug/unterricht/tag49/04_lexifind-starter.zip new file mode 100644 index 0000000000000000000000000000000000000000..578b33f959c971f22e182199de793f7bdf443dbd GIT binary patch literal 30550 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 literal 0 HcmV?d00001 diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/.eslintrc.cjs b/06_js-debug/unterricht/tag49/04_lexifind-starter/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/.vscode/launch.json b/06_js-debug/unterricht/tag49/04_lexifind-starter/.vscode/launch.json new file mode 100644 index 0000000..7cd7b79 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/README.md b/06_js-debug/unterricht/tag49/04_lexifind-starter/README.md new file mode 100644 index 0000000..3e5f98a --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/README.md @@ -0,0 +1,10 @@ +# Frontend Class: LexiFind Starter Template + +Install the dependencies and devDependencies and start the server. + +```bash +npm install +npm run dev +``` + +This will start the server on http://localhost:5173 diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/index.html b/06_js-debug/unterricht/tag49/04_lexifind-starter/index.html new file mode 100644 index 0000000..70b3ea2 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/index.html @@ -0,0 +1,13 @@ + + + + + + + LexiFind - Your Personal Dictionary + + +
+ + + diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/package-lock.json b/06_js-debug/unterricht/tag49/04_lexifind-starter/package-lock.json new file mode 100644 index 0000000..fe7ba2c --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/package-lock.json @@ -0,0 +1,2660 @@ +{ + "name": "lexifind-webmaster", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lexifind-webmaster", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "~6.0.3", + "vite": "^8.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.67.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.67.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz", + "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.411", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.411.tgz", + "integrity": "sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==", + "dev": true, + "license": "ISC" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", + "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", + "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/package.json b/06_js-debug/unterricht/tag49/04_lexifind-starter/package.json new file mode 100644 index 0000000..772724e --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/package.json @@ -0,0 +1,28 @@ +{ + "name": "lexifind-webmaster", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "~6.0.3", + "vite": "^8.2.2" + } +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/public/LexiFind.webp b/06_js-debug/unterricht/tag49/04_lexifind-starter/public/LexiFind.webp new file mode 100644 index 0000000000000000000000000000000000000000..1bda48b619675b706e13c78e0a808924d08375a0 GIT binary patch literal 2986 zcmbuAWmpsJ8plToyyPU5o`fT%Ys6@nq%^(E$K9x>{z|W=f!(i?Nv#pnyyi zKz`8y0HM=)ZI(Q zJ0T8Ltl5q*hktge>D1-MhjMWaJJS?2t=~SS=lv(J=7S}we&s%_W0A}goL4T+i?EHWvz>^|B}bt3H(#9HB~mlYa>a4 zHFn1B$b3N~QF`1VNz9D@mVM;qq)8eC57jiPiCl;c4HT~We>X+^^X1q)>o{j!X>N}S zl|IY3OLdOBvt@wMiitmy8UgSmi( zw0tLpg+j&slQ^7V{PQ^Hu32b+@%h_f6bs^|{i;{)lpT``1~HhgGguLSU2aZ6%GZ7G z%_r$Mvz&d=!h)CnM)JEhx8imdPWW%}T-V9P3=}J z@dnS~m5Y@|WB+Vq5UpMMuxgBQ6Nlr_?{1A<;GCE9KC=3SzkuLP`kUkh%zw)o03ecx zhwBj(SNfYrtP?qU1emv@QpWC`mMnUq!bv|fSKW_&^&kx?WvR0T0pc6ZsEHy1?YIvQ z%6QR7wg{y!y}l{x+iNi2!Ja=K{SgE7amSpx)oQqqUDKGdgcWK!3-14rh`D{+KZx~; zx9ewFrx5;>Alfji?X&M@oc&$NS3C2MK7Ob%g51-q-EB2#Wy4!|N!Hp%<+Wvxjwxs& z5m;ZA_hIHOo*{)rQgj3s(szXyEB z*6xLsG&@;kcjit4V@zq+KPnbUU0*ATsypSj!~q<`f(Sa;*DtRNpst@ zUr=%>)0a6HVuB2KlF^Kj!{Ez&cUs{T-gHL00?Pl5vM9ya6&a{{?Q39zzOuvinYD@w zDq#(AMhD!CL-~xi)w$wak!yAC$rVD?Rk%PEiQVfz87TXHg^ZXuoABY;u2nH{DEQJD zHL^T~>fVBxBn#3DGZ2?scP+klM%)A#{@RKOrOm7+E>0-2X7Gg>mn`2&h~Mcrk8w|U z^=!wlW^k%aZ|=TX?^I|DqMHsPQc10qE29ZX2}>s-kgGzTO|-8ci5)pVk5g6{NX@{~ zcCifDlweTZX_oAD5aY!yQ{5NklbRreo1ugJooch5j?0CE+UGK7&!}xdS97aIx6LuC z1SMHP;?tK`j`q{{e+2I-yu{k=)6A(MW2xVzg6H2-88NBWB!%oysG4&~379adtp%CwBz zJs5AT8vCtiAPU|Mm)u-a?W>cG4D?w=4XB28KzrtRUp9p(VOk+QK1_X`=VFT2_W10z+w^jDN;;_iU&F~A@cR7o>5 zIUvHF&clYgt?2%K)z_o)4m@U6MLsfg`zN~oZM*8EzZah{UoZ9>Gb|;v>H9Fzd(Mz* zBvFwqeRu+nbT{Fl&i3pI=hDHO8>w@rvRV2mov>Frr;flr=f7)LLbe-@{nxxkhbulv zlltdG@;Js^t5M???mVOP7Y-kD_4!bf8>P>Elg5Rqnf}sQM_p|;ASE5U36e^p+dP3+ z&bHz@rjqfOAAxJ>tj!fm+0FuFD3+T^ulZ_U7o{i!I@sQEevCt%8wAve1cSK z8b=)=XYCNCpykmQ@Sd-T?j}pft*v1d#YwxQ5_vnd5apKIvz6*_E}QaPzL#C1racF# z&L~vt`AI z3=Uu%`Ni(4TA`ue(w861G%C8j*YvC`@&vo``i#i{cS4SlDV;f7YP}2B4q0d}Jt_Z& zOcb{oK1^K}a)c*?em}2^Mymr1^{e(pV;A1(%y=2Vrk6exb!LVhSH;R(ZK2|vrL4x&-1vQv*{bNs0{1n4@isFOcO@})=0KAziRm7>`CBa1rQ_}n#tm`^>AU< z@LtYQHOyjF4f)tT?A-mJiVHLVaF0|LW}vY8T7Jp-*POSu2IOFZa93K iy2ylxa!uJEk3ND=l|9nnM(wV|)(w$mq;Jo~)&C1va=~!` literal 0 HcmV?d00001 diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/App.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/App.tsx new file mode 100644 index 0000000..30ae33c --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/App.tsx @@ -0,0 +1,59 @@ +import React, { useState, useEffect } from 'react'; +import { WordData } from './lib/datatypes'; + +import Header from './components/Header'; +import Searchbar from './components/Searchbar'; +import WordHero from './components/WordHero'; +import WordDefinitions from './components/WordDefinitions'; +import SourceFooter from './components/SourceFooter'; + +import { SERIF_FONTS } from './lib/constants'; + +function App() { + const [font, setFont] = useState(SERIF_FONTS); + const [word, setWord] = useState('course'); + const [wordData, setWordData] = useState(null); + + const fetchData = async () => { + try { + const url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; + const response = await fetch(url); + const data = await response.json(); + + setWordData(data[0]); + } catch (error) { + console.error(error); + } + }; + + const handleSubmit = async (e: React.SyntheticEvent) => { + e.preventDefault(); + fetchData(); + }; + + useEffect(() => { + fetchData(); + }, []); // kein did update, sonst wird fetch bei jeder Buchstabeeingabe erneut ausgeführt + + return ( +
+
+ + + + {wordData && ( +
+ + + +
+ )} +
+ ); +} + +export default App; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Header.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Header.tsx new file mode 100644 index 0000000..4c8e1e3 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Header.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import { SERIF_FONTS, SANS_SERIF_FONTS } from '../lib/constants'; + +interface HeaderProps { + font: string; + setFont: React.Dispatch>; +} + +const Header: React.FC = ({ font, setFont }) => { + return ( +
+
+ LexiFind Logo + LexiFind +
+ + +
+ ); +}; + +export default Header; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Searchbar.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Searchbar.tsx new file mode 100644 index 0000000..19c6191 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/Searchbar.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +interface SearchbarProps { + word: string; + setWord: React.Dispatch>; + handleSubmit: (e: React.FormEvent) => void; +} + +const Searchbar: React.FC = ({ word, setWord, handleSubmit }) => { + return ( +
+
+ + +
+ setWord(e.target.value)} + /> + +
+
+
+ ); +}; + +function SearchIcon(props: React.SVGProps) { + return ( + + + + ); +} + +export default Searchbar; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/SourceFooter.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/SourceFooter.tsx new file mode 100644 index 0000000..8cbdc03 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/SourceFooter.tsx @@ -0,0 +1,51 @@ +import React from 'react'; + +interface SourceFooterProps { + source: string; +} + +const SourceFooter: React.FC = ({ source }) => { + return ( + <> +
+ +
+

Source

+ + +
+ + ); +}; + +function BoxArrowUpRightIcon(props: React.SVGProps) { + return ( + + + + + ); +} + +export default SourceFooter; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordDefinitions.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordDefinitions.tsx new file mode 100644 index 0000000..ba6bcfd --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordDefinitions.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { Meaning, WordData } from '../lib/datatypes'; + +interface WordDefinitionsProps { + wordData: WordData; +} + +const WordDefinitions: React.FC = ({ wordData }) => { + return ( +
+ {wordData.meanings.map((meaning: any, index: number) => ( + + ))} +
+ ); +}; + +interface WordDefinitionBlockProps { + data: Meaning; +} + +const WordDefinitionBlock: React.FC = ({ data }) => { + const { partOfSpeech, definitions, synonyms } = data; + + return ( +
+
+

{partOfSpeech}

+
+
+ +
+

Meaning

+ +
    + {definitions.map((definition: any, index: number) => ( +
  • + {definition.definition}{' '} + {definition.example && ( + + "{definition.example}" + + )} +
  • + ))} +
+
+ + {synonyms.length > 0 && ( +
+

Synonyms

+ +
    + {synonyms.map((synonym: string, index: number) => ( +
  • + {synonym} +
  • + ))} +
+
+ )} +
+ ); +}; + +export default WordDefinitions; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordHero.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordHero.tsx new file mode 100644 index 0000000..acbddf0 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/components/WordHero.tsx @@ -0,0 +1,63 @@ +import React, { useRef } from 'react'; +import { Phonetic } from '../lib/datatypes'; + +interface WordHeroProps { + data: { + word: string; + phonetics: Phonetic[]; + }; +} + +const WordHero: React.FC = ({ data }) => { + const { word, phonetics } = data; + + const americanEnglishPhonetic = phonetics.find((phonetic) => + phonetic.audio?.includes('-us') + ); + const finalPhonetic = americanEnglishPhonetic || phonetics[0]; + + const audioRef = useRef(null); + + const playAudio = () => { + if (audioRef.current) { + audioRef.current.play(); + } + }; + + return ( +
+
+

{word}

+ {finalPhonetic?.text && ( +

{finalPhonetic.text}

+ )} +
+ + {finalPhonetic?.audio && ( +
+ + +
+ )} +
+ ); +}; + +function PlayIcon(props: React.SVGProps) { + return ( + + + + ); +} + +export default WordHero; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/index.css b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/index.css new file mode 100644 index 0000000..ef83e0e --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/index.css @@ -0,0 +1,337 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +*, +html, +body { + margin: 0; + padding: 0; + color: #171717; +} + +button { + border: none; +} + +.screen-reader-text { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +/* ===== App Component ===== */ +.app-wrapper { + margin: 0 auto; + max-width: 42rem; /* 672px */ + padding: 3.5rem 1.5rem; /* 56px 24px */ +} + +/* ===== Header Component ===== */ +.header-container { + display: flex; + align-items: center; + justify-content: space-between; +} + +.header-logo-wrapper { + display: flex; + align-items: center; +} + +.header-logo-img { + height: 2.5rem; /* 40px */ +} + +.header-logo-text { + font-family: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; + font-size: 1.875rem; /* 30px */ + line-height: 2.25rem; /* 36px */ + font-weight: 600; + margin-left: 1rem; /* 16px */ + color: #262626; +} + +.header-select { + border-radius: 0.375rem; /* 6px */ + border-width: 0px; + padding: 0.625rem 0.5rem; /* 10px 8px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + outline: 2px solid transparent; + outline-offset: 2px; + color: #262626; +} + +.header-select:focus { + outline-color: #9333ea; +} + +/* ===== Searchbar Component ===== */ +.searchbar-wrapper { + margin-top: 4rem; /* 64px */ +} + +.searchbar-container { + position: relative; + margin-top: 0.5rem; /* 8px */ + border-radius: 0.75rem; /* 12px */ + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); +} + +.searchbar-input { + display: block; + width: 100%; + border-radius: 0.75rem; /* 12px */ + border-width: 0px; + padding: 1.25rem 0 1.25rem 1.5rem; /* 20px 0 20px 24px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + font-weight: 600; + outline-style: solid; + outline: 2px solid transparent; + outline-color: #f5f5f5; + color: #171717; + background-color: #f5f5f5; +} + +.searchbar-input:focus { + outline-color: #9333ea; +} + +.searchbar-input::placeholder { + color: #737373; +} + +.searchbar-magnifying-glass { + position: absolute; + top: 0px; + bottom: 0px; + right: 0px; + display: flex; + align-items: center; + border-top-right-radius: 0.75rem; /* 12px */ + border-bottom-right-radius: 0.75rem; /* 12px */ + padding-left: 1rem; /* 16px */ + padding-right: 1rem; /* 16px */ + outline: 2px solid transparent; + outline-offset: 2px; + background-color: transparent; +} + +.searchbar-icon { + width: 1.5rem; /* 24px */ + height: 1.5rem; /* 24px */ + fill: #6b21a8; +} + +/* ===== WordHero Component ===== */ +.wordhero-wrapper { + display: flex; + align-items: top; + justify-content: space-between; + margin-top: 4rem; /* 64px */ +} + +.wordhero-word-container { + display: flex; + flex-direction: column; +} + +.wordhero-word { + font-size: 3.75rem; /* 60px */ + line-height: 1; + font-weight: 600; + color: #262626; +} + +.wordhero-word-phonetic { + font-size: 1.5rem; /* 24px */ + line-height: 2rem; /* 32px */ + margin-top: 0.75rem; /* 12px */ + margin-bottom: 0.75rem; /* 12px */ + color: #9333ea; +} + +.wordhero-play-btn { + display: flex; + align-items: center; + border-radius: 9999px; + padding: 1.25rem; /* 20px */ + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + color: white; + background-color: #e9d5ff; +} + +.wordhero-play-btn:hover { + background-color: #d8b4fe; +} + +.wordhero-play-btn:focus { + outline: 2px solid transparent; + outline-color: #9333ea; +} + +.wordhero-play-icon { + height: 2.5rem; /* 40px */ + width: 2.5rem; /* 40px */ + fill: #9333ea; +} + +/* ===== WordDefinitions Component ===== */ +.word-definitions-wrapper { + display: flex; + flex-direction: column; + gap: 2rem; /* 32px */ + margin-top: 4rem; /* 64px */ +} + +.word-block-wrapper { + display: flex; + flex-direction: column; + gap: 3.5rem; /* 56px */ +} + +.word-block-category-container { + display: flex; + align-items: center; + gap: 0.5rem; /* 8px */ +} + +.word-block-category-name { + padding-right: 0.75rem; /* 12px */ + font-size: 1.5rem; /* 24px */ + line-height: 2rem; /* 32px */ + font-weight: 600; + color: #262626; +} + +.word-block-category-divider { + height: 1px; + width: 100%; + background-color: #d4d4d4; +} + +.word-block-meaning-container { + display: flex; + flex-direction: column; + row-gap: 1rem; /* 16px */ +} + +.word-block-meaning-title { + font-size: 1.25rem; /* 20px */ + line-height: 1.75rem; /* 28px */ + font-weight: 400; + color: #737373; +} + +.word-block-meaning-list { + display: flex; + flex-direction: column; + padding-left: 1rem; /* 16px */ + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + row-gap: 2rem; /* 32px */ + color: #262626; +} + +.word-block-meaning-list-item::marker { + padding-left: 2.5rem; /* 40px */ + color: #9333ea; +} + +.word-block-meaning-list-item-example { + display: block; + margin-top: 0.5rem; /* 8px */ + color: #9333ea; +} + +.word-block-synonyms-container { + display: flex; + align-items: baseline; + column-gap: 2rem; /* 32px */ +} + +.word-block-synonyms-title { + font-size: 1.25rem; /* 20px */ + line-height: 1.75rem; /* 28px */ + font-weight: 400; + color: #737373; +} + +.word-block-synonyms-list { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; /* 8px */ +} + +.word-block-synonyms-list-item { + list-style: none; + font-size: 1.125rem; /* 18px */ + line-height: 1.75rem; /* 28px */ + font-weight: 600; + color: #9333ea; +} + +/* ===== SourceFooter Component ===== */ +.footer-divider { + margin-top: 2.5rem; /* 40px */ + margin-bottom: 2.5rem; /* 40px */ + height: 1px; + background-color: #e5e5e5; +} + +.footer-wrapper { + display: flex; + align-items: baseline; + gap: 1rem; /* 16px */ + font-size: 0.875rem; /* 14px */ + line-height: 1.25rem; /* 20px */ +} + +.footer-title { + font-weight: 400; + color: #737373; +} + +.footer-link-wrapper { + display: flex; + text-decoration: underline; + color: #262626; +} + +.footer-link-icon { + margin-left: 0.5rem; /* 8px */ + height: 1rem; /* 16px */ + width: 1rem; /* 16px */ + fill: #262626; +} + +/* ===== Breakpoints ===== */ + +@media (min-width: 640px) { + .searchbar-input { + line-height: 1.5rem; /* 24px */ + } +} + +@media (min-width: 768px) { + .word-block-meaning-list { + padding-left: 2.5rem; /* 40px */ + } +} + +@media (min-width: 1024px) { + .app-wrapper { + padding: 3.5rem 0.5rem; /* 56px 8px */ + } +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/constants.ts b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/constants.ts new file mode 100644 index 0000000..76a8a8d --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/constants.ts @@ -0,0 +1,5 @@ +export const SERIF_FONTS = + 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif'; + +export const SANS_SERIF_FONTS = + 'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'; diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/datatypes.ts b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/datatypes.ts new file mode 100644 index 0000000..1387f74 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/lib/datatypes.ts @@ -0,0 +1,22 @@ +export interface Phonetic { + text?: string; + audio?: string; +} + +export interface Definition { + definition: string; + example?: string; +} + +export interface Meaning { + partOfSpeech: string; + definitions: Definition[]; + synonyms: string[]; +} + +export interface WordData { + word: string; + phonetics: Phonetic[]; + meanings: Meaning[]; + sourceUrls: string[]; +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/main.tsx b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/src/vite-env.d.ts b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.app.json b/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.app.json new file mode 100644 index 0000000..d739292 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.json b/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.node.json b/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.node.json new file mode 100644 index 0000000..3afdd6e --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/06_js-debug/unterricht/tag49/04_lexifind-starter/vite.config.ts b/06_js-debug/unterricht/tag49/04_lexifind-starter/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/06_js-debug/unterricht/tag49/04_lexifind-starter/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/.gitignore b/06_js-debug/unterricht/tag49/05_state-up-lifting/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/.oxlintrc.json b/06_js-debug/unterricht/tag49/05_state-up-lifting/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/README.md b/06_js-debug/unterricht/tag49/05_state-up-lifting/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the Oxlint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/index.html b/06_js-debug/unterricht/tag49/05_state-up-lifting/index.html new file mode 100644 index 0000000..a1a8920 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/index.html @@ -0,0 +1,13 @@ + + + + + + + 05_state-up-lifting + + +
+ + + diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/package-lock.json b/06_js-debug/unterricht/tag49/05_state-up-lifting/package-lock.json new file mode 100644 index 0000000..31e32ef --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/package-lock.json @@ -0,0 +1,1316 @@ +{ + "name": "05_state-up-lifting", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "05_state-up-lifting", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.4", + "oxlint": "^1.75.0", + "vite": "^8.2.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.79.0.tgz", + "integrity": "sha512-TebFaaMklO/RXzTv7PucaCq9l3X6D1gA+C8H6K4njtjFOV+zWE9MKLpulcJZN9bzytbUbQIY0mZuz12nQ5Kv4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.79.0.tgz", + "integrity": "sha512-KqqnOtAVgNsPPF0YSodkFZA1O80jcKoCZCTu3bgsszxA+MrMP9TLzfXitKjEj1FmrPprKDMdRDMmY3weESO9sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.79.0.tgz", + "integrity": "sha512-BVC2nsMzqQzRDPc5RhixkZ+m1p7iH4bxRRvqkbwDXX0PlQKm1BPy8J8cRjnAFafOq2QzI+BfO3vE8w2GZ3CBag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.79.0.tgz", + "integrity": "sha512-p6Lm+snmhGuLKL1+CpCV8L6ijkE/qJzK2H2jG9+eKJT0n31RbY4FLsdhexekgP3bLpw4Kgde+9DZuDZQ4yIInA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.79.0.tgz", + "integrity": "sha512-qDMm0dXZnoHyRqSL4N4xUq82T4sqK5cbKSjvd/dF/YbMUXc2R1wEPf+vmA5S0qUmi0nwXfNbjXBtZaIqzQLIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.79.0.tgz", + "integrity": "sha512-2od7s0nuKPzqyUZAWk9KkCyGg7eI9dwFPZg+20lB15fKFkVZ0c9ZFxqPfiBAyDTlTkh9stPI0t+JlPCqMbItVA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.79.0.tgz", + "integrity": "sha512-ZOQUjkzDnvlhSE3+tWC3YXx94MMl+sYMlwH+u1+YGApGHOJP/YAc8ZBRFOXZ6eOBmxtXAWuS/fBcdZr8qqNO1A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.79.0.tgz", + "integrity": "sha512-lu158FR4nGqGeRS3BQvtG85wRgU/Fy4MD5Cxp1hzJXizGiLo6u2742wJSCDKh8cFcZntvX7fcxlq4mMmfryH1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.79.0.tgz", + "integrity": "sha512-mbpKQeE2aflTjddaHK7MP8KP/OFbUM++lt5M635ENM8IyIdK0jm2t9pb+2v9mVVIvhF6TqA4l7F79Pll1mi+uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.79.0.tgz", + "integrity": "sha512-WpGNua7gaxaHnpSDeog2ji8IDHn/QLPl9LPzwkR/FvVv58vT5BcXjRXnU+wbu3N75cpeha8CdC7ho/U2OIsB4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.79.0.tgz", + "integrity": "sha512-tK1E93A5LVzISg4ngpKJnfTs7EqtIUceGI7MQ4GyDjJiLi8wPCkEyKlj2xkyKWZ1yzkDJyLHTBJ5/iFWRdnJvg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.79.0.tgz", + "integrity": "sha512-qhQvUIrngXivA2A9pQ+xPCychztn/5qUv7yS3gDwXv3w7Rag+eTeeXWmRyx+t7XsW5x6LuY/8AsTq36UgFIblg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.79.0.tgz", + "integrity": "sha512-sv6AaVgU/eE6u+6WFiQVDcPPwTxP6IJMSB9k701W2r/r6Tx465e8vPvVyRxquNH4Vy6KwRNu90mVbxXJN8+5gg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.79.0.tgz", + "integrity": "sha512-iFZL02deziHslb3jEX9KdqlAkYoo4fGyotchKDzdfK1f5mxlIBeiQeHhvK3iFpuEJSB4ma/qeFn9oxPiwnhUPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.79.0.tgz", + "integrity": "sha512-3DtZR2raqObnh7wXZoFYFd0Fw7skBvcb3f7A+/lkEiDuh8hrE6vv9b/62Qxao1a9/OeHLw/FcXlXzgsW9wTRFg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.79.0.tgz", + "integrity": "sha512-Oatt4GuA1WJkqzk2ozx4HrWROOi7opV3AKDw/U8qDIqeTqzsjn5K2x3REJMNjU3/KU/Bkq96Zi3CknaiDTaC/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.79.0.tgz", + "integrity": "sha512-NAgZr9Qp8nIA9rpo0JEvwiabTF/2UVqBNnupBG9X4kxXcQoScJUTi+qHhvabb9s/thgj5wQ4XcIaJvb+ZMgoKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.79.0.tgz", + "integrity": "sha512-+KyXjIvcpaXmWW/j9NNY5yWjrIVxaX18VyIheQy3jwc2GSYgpCr7MGI/HxIGQ/shAL5IWEKbhsqoMpAO5Stiog==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.79.0.tgz", + "integrity": "sha512-mEelcCMMBS57sIXh2veGMNy+pQwuGtcMxHxGIZWQ5Ba9pJ5jCCUFOZB9E2JhBaxGsURe+WGe0zJp4RVre52gpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oxlint": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.79.0.tgz", + "integrity": "sha512-hVJ9hq9m2unPS+Of4eJJgCPdIeCC+3DHEUX3tkmrPJr3OK2hz7PhXwgC+ZP71ZcYu8cCDEtQrqLxWNvxBppBVg==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.79.0", + "@oxlint/binding-android-arm64": "1.79.0", + "@oxlint/binding-darwin-arm64": "1.79.0", + "@oxlint/binding-darwin-x64": "1.79.0", + "@oxlint/binding-freebsd-x64": "1.79.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.79.0", + "@oxlint/binding-linux-arm-musleabihf": "1.79.0", + "@oxlint/binding-linux-arm64-gnu": "1.79.0", + "@oxlint/binding-linux-arm64-musl": "1.79.0", + "@oxlint/binding-linux-ppc64-gnu": "1.79.0", + "@oxlint/binding-linux-riscv64-gnu": "1.79.0", + "@oxlint/binding-linux-riscv64-musl": "1.79.0", + "@oxlint/binding-linux-s390x-gnu": "1.79.0", + "@oxlint/binding-linux-x64-gnu": "1.79.0", + "@oxlint/binding-linux-x64-musl": "1.79.0", + "@oxlint/binding-openharmony-arm64": "1.79.0", + "@oxlint/binding-win32-arm64-msvc": "1.79.0", + "@oxlint/binding-win32-ia32-msvc": "1.79.0", + "@oxlint/binding-win32-x64-msvc": "1.79.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/package.json b/06_js-debug/unterricht/tag49/05_state-up-lifting/package.json new file mode 100644 index 0000000..68e855e --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/package.json @@ -0,0 +1,23 @@ +{ + "name": "05_state-up-lifting", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.4", + "oxlint": "^1.75.0", + "vite": "^8.2.0" + } +} diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/public/favicon.svg b/06_js-debug/unterricht/tag49/05_state-up-lifting/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/public/icons.svg b/06_js-debug/unterricht/tag49/05_state-up-lifting/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.css b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.jsx b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.jsx new file mode 100644 index 0000000..3a00151 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/App.jsx @@ -0,0 +1,106 @@ +import { useState } from 'react'; +import reactLogo from './assets/react.svg'; +import viteLogo from './assets/vite.svg'; +import heroImg from './assets/hero.png'; +import './App.css'; +import Counter from './components/Counter'; + +function App() { + // let count = 10; + + const [count, setCount] = useState(10); + + return ( + <> +
+
+ + React logo + Vite logo +
+
+

Get started - Count: {count}

+ + { + setCount(value); + }} + /> +
+
+ +
+ +
+
+ +

Documentation

+

Your questions, answered

+ +
+
+ +

Connect with us

+

Join the Vite community

+ +
+
+ +
+
+ + ); +} + +export default App; diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/hero.png b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/react.svg b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/vite.svg b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/components/Counter.jsx b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/components/Counter.jsx new file mode 100644 index 0000000..f3ff3af --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/components/Counter.jsx @@ -0,0 +1,22 @@ +import { useState } from 'react'; + +const Counter = (props) => { + const { count } = props; + // const [count, setCount] = useState(0); + + const handleClick = () => { + props.handleCount(count + 1); // state up lifting + + // setCount((prevState) => prevState + 1); + }; + + return ( +
+

Count: {count}

+ +
+ ); +}; +export default Counter; diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/index.css b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/index.css new file mode 100644 index 0000000..2c84af0 --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/index.css @@ -0,0 +1,111 @@ +:root { + --text: #6b6375; + --text-h: #08060d; + --bg: #fff; + --border: #e5e4e7; + --code-bg: #f4f3ec; + --accent: #aa3bff; + --accent-bg: rgba(170, 59, 255, 0.1); + --accent-border: rgba(170, 59, 255, 0.5); + --social-bg: rgba(244, 243, 236, 0.5); + --shadow: + rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; + + --sans: system-ui, 'Segoe UI', Roboto, sans-serif; + --heading: system-ui, 'Segoe UI', Roboto, sans-serif; + --mono: ui-monospace, Consolas, monospace; + + font: 18px/145% var(--sans); + letter-spacing: 0.18px; + color-scheme: light dark; + color: var(--text); + background: var(--bg); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: 16px; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #9ca3af; + --text-h: #f3f4f6; + --bg: #16171d; + --border: #2e303a; + --code-bg: #1f2028; + --accent: #c084fc; + --accent-bg: rgba(192, 132, 252, 0.15); + --accent-border: rgba(192, 132, 252, 0.5); + --social-bg: rgba(47, 48, 58, 0.5); + --shadow: + rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; + } + + #social .button-icon { + filter: invert(1) brightness(2); + } +} + +body { + margin: 0; +} + +#root { + width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: var(--text-h); +} + +h1 { + font-size: 56px; + letter-spacing: -1.68px; + margin: 32px 0; + @media (max-width: 1024px) { + font-size: 36px; + margin: 20px 0; + } +} +h2 { + font-size: 24px; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: 20px; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: 15px; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/src/main.jsx b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/main.jsx new file mode 100644 index 0000000..b9a1a6d --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/06_js-debug/unterricht/tag49/05_state-up-lifting/vite.config.js b/06_js-debug/unterricht/tag49/05_state-up-lifting/vite.config.js new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/06_js-debug/unterricht/tag49/05_state-up-lifting/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/.eslintrc.cjs b/06_js-debug/unterricht/tag50/01_shop-vitest/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/README.md b/06_js-debug/unterricht/tag50/01_shop-vitest/README.md new file mode 100644 index 0000000..7d128c6 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/README.md @@ -0,0 +1,10 @@ +# Frontend Class: VogueJunction Starter Template + +Install the dependencies and devDependencies and start the server. + +```bash +npm install +npm run dev +``` + +This will start the server on http://localhost:5173 diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/index.html b/06_js-debug/unterricht/tag50/01_shop-vitest/index.html new file mode 100644 index 0000000..6574d3c --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/index.html @@ -0,0 +1,12 @@ + + + + + + Vogue Junction + + +
+ + + diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/package.json b/06_js-debug/unterricht/tag50/01_shop-vitest/package.json new file mode 100644 index 0000000..6691021 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/package.json @@ -0,0 +1,29 @@ +{ + "name": "01_shop-vitest", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.8.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.4", + "typescript": "^6.0.3", + "vite": "^8.2.2" + } +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/public/vite.svg b/06_js-debug/unterricht/tag50/01_shop-vitest/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/CategorySection.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/CategorySection.tsx new file mode 100644 index 0000000..4fb8862 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/CategorySection.tsx @@ -0,0 +1,77 @@ +import React from 'react'; + +type CategorySectionProps = { + categories: { + imgSrc: string; + imgAlt: string; + href: string; + linkText: string; + }[]; +}; + +import { Link } from 'react-router-dom'; + +const CategorySection: React.FC = ({ categories }) => { + return ( +
+
+

+ Explore by Category +

+ +
+ + {categories[0].imgAlt} + + +
+ ); +}; + +export default CategorySection; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Footer.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Footer.tsx new file mode 100644 index 0000000..86ea22e --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Footer.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +type NavigationItem = { + name: string; + href: string; +}; + +const navigationItems: NavigationItem[] = [ + { + name: 'Home', + href: '/', + }, + { + name: 'Women', + href: '/women', + }, + { + name: 'Men', + href: '/men', + }, + { + name: 'Accessories', + href: '/accessories', + }, +]; + +type FooterProps = { + navigation?: NavigationItem[]; +}; + +const Footer: React.FC = ({ navigation = navigationItems }) => { + return ( +
+
+
+ {navigation.map((item) => ( + + {item.name} + + ))} +
+ +
+

+ © {new Date().getFullYear()} Vogue Junction, Inc. All rights + reserved. +

+
+
+
+ ); +}; + +export default Footer; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Header.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Header.tsx new file mode 100644 index 0000000..ae21fd5 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Header.tsx @@ -0,0 +1,53 @@ +import { Link } from 'react-router-dom'; + +const Header = () => { + return ( +
+ {/* Mobile Header */} +
+
+ +
Vogue Junction
+ +
+ +
+ + Women + + + Men + + + Accessories + +
+
+ + {/* Desktop Header */} +
+
+ +
Vogue Junction
+ + +
+ + Women + + + Men + + + Accessories + +
+
+
+ +
+
+ ); +}; + +export default Header; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Hero.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Hero.tsx new file mode 100644 index 0000000..afa8772 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/Hero.tsx @@ -0,0 +1,23 @@ +import React from 'react'; + +type HeroProps = { + companyName?: string; +}; + +const Hero: React.FC = ({ companyName = 'Vogue Junction' }) => { + return ( +
+
+

Welcome to the world of {companyName}!

+

+ Discover a diverse collection of stylish products for everyone. From + trendy apparel and accessories to timeless classics, we offer + something for every taste and occasion. Shop now and elevate your + style! +

+
+
+ ); +}; + +export default Hero; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ImageGallery.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ImageGallery.tsx new file mode 100644 index 0000000..7fc4dac --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ImageGallery.tsx @@ -0,0 +1,85 @@ +import React, { useState, useEffect } from 'react'; +import { Product } from '../lib/datatypes'; + +type ImageGalleryProps = { + product: Product; +}; + +const ImageGallery: React.FC = ({ + product, +}: { + product: Product; +}) => { + const [selectedImage, setSelectedImage] = useState(product.images[0]); + const [selectedIndex, setSelectedIndex] = useState(0); + + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'ArrowRight') { + setSelectedIndex((prevIndex) => { + const nextIndex = (prevIndex + 1) % product.images.length; + setSelectedImage(product.images[nextIndex]); + return nextIndex; + }); + } + + if (event.key === 'ArrowLeft') { + setSelectedIndex((prevIndex) => { + const nextIndex = + (prevIndex - 1 + product.images.length) % product.images.length; + setSelectedImage(product.images[nextIndex]); + return nextIndex; + }); + } + }; + + useEffect(() => { + window.addEventListener('keydown', handleKeyDown); + + return () => { + window.removeEventListener('keydown', handleKeyDown); + }; + }, [product.images]); + + return ( +
+ {/* Image selector */} +
+
+ {product.images.map((image, index) => ( + + ))} +
+
+ + {/* Main Image Display */} +
+ {product.title} +
+
+ ); +}; + +export default ImageGallery; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductList.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductList.tsx new file mode 100644 index 0000000..17f7234 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductList.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { Product } from '../lib/datatypes'; + +import ProductListCard from './ProductListCard'; + +type ProductListProps = { + data: Product[]; +}; + +const ProductList: React.FC = ({ data }) => { + return ( +
+

Products

+ +
+ {data.map((product) => ( + + ))} +
+
+ ); +}; + +export default ProductList; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductListCard.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductListCard.tsx new file mode 100644 index 0000000..396b8ba --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/components/ProductListCard.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { Product } from '../lib/datatypes'; + +import { Link } from 'react-router-dom'; + +const ProductListCard = ({ product }: { product: Product }) => { + const { id, title, price, rating, stock, thumbnail } = product; + + return ( +
+
+ {title} +
+ +
+

+ +

+ +
+

+ {Math.round(rating)} out of 5 stars +

+ +
+ {[0, 1, 2, 3, 4].map((ratingNumber) => ( + ratingNumber ? '#1e293b' : '#e5e7eb', + }} + aria-hidden="true" + /> + ))} +
+ +

{stock} in stock

+
+ +

+ {Number(price).toLocaleString('en-US', { + style: 'currency', + currency: 'USD', + })} +

+
+
+ ); +}; + +export default ProductListCard; + +function StarIcon(props: React.SVGProps) { + return ( + + + + ); +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/index.css b/06_js-debug/unterricht/tag50/01_shop-vitest/src/index.css new file mode 100644 index 0000000..a483ad3 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/index.css @@ -0,0 +1,798 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +*, +html, +body { + margin: 0; + padding: 0; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + color: #0f172a; +} + +button { + background-color: transparent; + border: none; +} + +a { + text-decoration: none; + color: inherit; +} + +header { + position: relative; + width: 100%; +} + +footer { + border: 1px solid #e5e7eb; + border-top-width: 1px; + margin-top: 3.5rem /* 56px */; +} + +.screen-reader-text { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.star-icons { + height: 1.25rem /* 20px */; + width: 1.25rem /* 20px */; + flex-shrink: 0; +} + +/* ===== Header Component ===== */ +.logo-text { + font-size: 1.25rem /* 20px */; + line-height: 1.75rem /* 28px */; + font-weight: 600; + color: #1f2937; +} + +.header-container { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem 1rem; /* 24px 16px */ + max-width: 80rem; /* 1280px */ + margin: 0 auto; +} + +.mobile-header-wrapper { + display: block; +} + +.mobile-header-links-container { + display: flex; + justify-content: center; + gap: 1.5rem; /* 24px */ + padding-bottom: 1rem /* 16px */; +} + +.mobile-header-logo-link { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; /* 16px */ + width: 100%; +} + +.desktop-header-wrapper { + display: none; +} + +.desktop-header-logo-link { + display: flex; + align-items: center; + gap: 1rem; /* 16px */ +} + +.desktop-header-links-container { + position: absolute; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 1.5rem; /* 24px */ +} + +.header-link-text { + padding: 0.5rem /* 8px */; + color: #1f2937; +} + +.header-link-text:hover { + color: #4b5563; +} + +.header-border { + border-bottom-width: 2px; + width: 100%; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + border-color: #f3f4f6; +} + +/* ===== Hero Component ===== */ +.hero-wrapper { + max-width: 42rem /* 672px */; + margin: 0 auto; + padding: 6rem 1rem; /* 96px 16px */ +} + +.hero-text-container { + text-align: center; +} + +.hero-title { + font-size: 2.25rem /* 36px */; + line-height: 2.5rem /* 40px */; + font-weight: 700; + letter-spacing: -0.025em; + color: #111827; +} + +.hero-subtitle { + margin-top: 2.5rem /* 40px */; + font-size: 1.125rem /* 18px */; + line-height: 2rem /* 32px */; + color: #4b5563; +} + +/* ===== CategorySection Component ===== */ +.category-section-wrapper { + margin: 0 auto; + max-width: 80rem /* 1280px */; + padding: 2.5rem 1rem; /* 40px 16px */ +} + +.category-section-title { + font-size: 1.5rem /* 24px */; + line-height: 2rem /* 32px */; + font-weight: 700; + letter-spacing: -0.025em; + color: #111827; +} + +.category-section-grid-wrapper { + margin-top: 1.5rem /* 24px */; + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + row-gap: 1.5rem /* 24px */; +} + +.category-section-grid-main { + position: relative; + overflow: hidden; + border-radius: 0.5rem /* 8px */; + aspect-ratio: 1 / 2; + width: 100%; + height: 100%; + max-height: 250px; +} + +.category-section-grid-main:hover { + opacity: 0.85; +} + +.category-section-grid-main-img { + height: 100%; + width: 100%; + object-fit: cover; + object-position: top; + filter: grayscale(100%); +} + +.category-section-gradient-bg { + position: absolute; + bottom: 0; + z-index: 100; + height: 100%; + width: 100%; + background: linear-gradient(to bottom, transparent, black); + opacity: 0.5; +} + +.category-section-cta-container { + position: absolute; + z-index: 100; + bottom: 0; + display: flex; + align-items: flex-end; + padding: 1.5rem /* 24px */; +} + +.category-section-cta-title { + font-weight: 600; + color: white; +} + +.category-section-cta-span { + position: absolute; + inset: 0px; + z-index: 100; +} + +.category-section-cta { + margin-top: 0.25rem /* 4px */; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + color: white; +} + +.category-section-categories-container { + position: relative; + aspect-ratio: 1 / 2; + overflow: hidden; + border-radius: 0.5rem /* 8px */; + height: 100%; + width: 100%; + max-height: 250px; +} + +.category-section-categories-container:hover { + opacity: 0.85; +} + +.category-section-categories-img { + height: 100%; + width: 100%; + object-fit: cover; + object-position: center; + filter: grayscale(100%); +} + +.category-section-categories-cta-container { + position: absolute; + z-index: 100; + bottom: 0; + display: flex; + align-items: flex-end; + padding: 1.5rem; /* 24px */ +} + +/* ===== Footer Component ===== */ +.footer-wrapper { + margin: 0 auto; + max-width: 80rem /* 1280px */; + padding: 3rem 1.5rem; /* 48px 24px */ +} + +.footer-links-container { + display: flex; + justify-content: center; + gap: 1.5rem; /* 24px */ +} + +.footer-links-text { + color: #9ca3af; +} + +.footer-links-text:hover { + color: #4b5563; +} + +.footer-copyright { + margin-top: 2rem /* 32px */; +} + +.footer-copyright-text { + text-align: center; + font-size: 0.75rem /* 12px */; + line-height: 1rem /* 16px */; + line-height: 1.25rem /* 20px */; + color: #6b7280; +} + +/* ===== ProductList Component ===== */ +.products-list { + margin: 0 -1px; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +/* ===== ProductListCard Component ===== */ +.product-card-container { + position: relative; + padding: 1rem; +} + +.product-card-img-wrapper { + aspect-ratio: 1 / 1; + overflow: hidden; + border-radius: 0.5rem /* 8px */; + background-color: white; +} + +.product-card-container:hover .product-card-img-wrapper { + opacity: 0.75; +} + +.product-card-img { + height: 100%; + width: 100%; + object-fit: cover; + object-position: center; +} + +.product-card-info-box { + padding-bottom: 1rem /* 16px */; + padding-top: 2.5rem /* 40px */; + text-align: center; +} + +.product-card-name { + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + font-weight: 500; + color: #111827; +} + +.product-card-name-span { + position: absolute; + inset: 0px; +} + +.product-card-desc-box { + margin-top: 0.75rem /* 12px */; + display: flex; + flex-direction: column; + align-items: center; +} + +.product-card-ratings-wrapper { + display: flex; + align-items: center; +} + +.product-card-stock { + margin-top: 0.25rem /* 4px */; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + color: #6b7280; +} + +.product-card-price { + margin-top: 1rem /* 16px */; + font-size: 1rem /* 16px */; + line-height: 1.5rem /* 24px */; + font-weight: 500; + color: #111827; +} + +/* ===== ImageGallery Component ===== */ +.image-gallery-wrapper { + display: flex; + flex-direction: column-reverse; +} + +.image-selector-wrapper { + margin-left: auto; + margin-right: auto; + margin-top: 1.5rem /* 24px */; + display: none; + width: 100%; + max-width: 42rem /* 672px */; +} + +.image-selector-container { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +} + +.image-selector-btn { + position: relative; + display: flex; + height: 6rem /* 96px */; + cursor: pointer; + align-items: center; + justify-content: center; + border-radius: 0.375rem /* 6px */; + background-color: white; + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + font-weight: 500; + text-transform: uppercase; + color: #111827; +} + +.image-selector-btn:hover { + background-color: #f9fafb; +} + +.image-selector-img-wrapper { + position: absolute; + inset: 0px; + display: flex; + overflow: hidden; + border-radius: 0.375rem /* 6px */; +} + +.image-selector-img { + height: 100%; + width: 100%; + object-fit: cover; + object-position: center; +} + +.image-selector-main-img-wrapper { + aspect-ratio: 1 / 1; + width: 100%; +} + +.image-selector-main-img { + height: 100%; + width: 100%; + object-fit: cover; + object-position: center; +} + +/* ===== Category Page ===== */ +.category-page-wrapper { + padding: 3.5rem 0; /* 56px 0 */ +} + +.category-page-container { + margin: 0 auto; + max-width: 80rem /* 1280px */; + overflow: hidden; + padding: 0 1rem; /* 0 16px */ +} + +.category-page-header { + display: flex; + justify-content: space-between; + align-items: top; +} + +.category-page-header-title { + font-size: 1.5rem /* 24px */; + line-height: 2rem /* 32px */; + font-weight: 700; + letter-spacing: -0.025em; + color: #111827; + margin-bottom: 2rem /* 32px */; +} + +.category-page-select { + margin: 0.5rem 0; /* 8px 0 */ + display: block; + width: 11rem /* 176px */; + border: 1px solid #d1d5db; + border-radius: 0.375rem /* 6px */; + padding-top: 0.5rem /* 8px */; + padding-bottom: 0.5rem /* 8px */; + color: #0f172a; +} + +.category-page-select:focus { + border: 1px solid #1e293b; +} + +.category-page-products-wrapper { + margin-top: 2.5rem /* 40px */; +} + +/* ===== Single Product Page ===== */ +.back-button-wrapper { + margin: 0 auto; + max-width: 42rem /* 672px */; + padding-left: 1rem /* 16px */; + padding-right: 1rem /* 16px */; + padding-top: 2rem /* 32px */; +} + +.back-button { + display: flex; + align-items: center; + margin-bottom: 1rem /* 16px */; + font-weight: 500; + margin-top: 1.5rem /* 24px */; +} + +.back-button-icon { + height: 1.5rem /* 24px */; + width: 1.5rem /* 24px */; + stroke: #1e293b; +} + +.back-button-icon-span { + margin-left: 0.75rem /* 12px */; + font-size: 1rem /* 16px */; + line-height: 1.5rem /* 24px */; +} + +.product-page-wrapper { + margin: 0 auto; + max-width: 42rem /* 672px */; + padding: 2.5rem 1rem; /* 40px 16px */ +} + +.product-page-container { + display: block; +} + +.product-page-info-container { + margin-top: 2.5rem /* 40px */; + padding-left: 1rem /* 16px */; + padding-right: 1rem /* 16px */; +} + +.product-page-info-title { + font-size: 1.875rem /* 30px */; + line-height: 2.25rem /* 36px */; + font-weight: 700; + letter-spacing: -0.025em; + color: #111827; +} + +.product-page-mt-3 { + margin-top: 0.75rem /* 12px */; +} + +.product-page-mt-6 { + margin-top: 1.5rem /* 24px */; +} + +.product-page-text { + font-size: 0.875rem /* 14px */; + line-height: 1.25rem /* 20px */; + color: #6b7280; +} + +.product-page-info-price { + font-size: 1.875rem /* 30px */; + line-height: 2.25rem /* 36px */; + letter-spacing: -0.025em; + color: #111827; +} + +.product-page-info-rating-container { + display: flex; + align-items: center; +} + +.product-page-description { + font-size: 1rem /* 16px */; + line-height: 1.5rem /* 24px */; + line-height: 2; + color: #374151; +} + +.product-page-tags-container { + display: flex; + align-items: center; + gap: 0.5rem; /* 8px */ +} + +.product-page-tag { + font-size: 0.75rem /* 12px */; + line-height: 1rem /* 16px */; + font-weight: 500; + text-transform: uppercase; + padding: 0.25rem 0.5rem; + border-radius: 9999px; + background-color: #1e293b; + color: white; +} + +.product-page-reviews-wrapper { + margin-top: 3.5rem /* 56px */; +} + +.product-page-reviews-title { + font-size: 1.5rem /* 24px */; + line-height: 2rem /* 32px */; + font-weight: 500; + color: #111827; +} + +.product-page-reviews-container { + display: flex; + flex-direction: column; + gap: 1.25rem /* 20px */; + margin-top: 0.5rem /* 8px */; +} + +.product-page-ratings-box { + display: flex; + align-items: center; +} + +.product-page-reviews-text-box { + display: flex; + align-items: center; + gap: 1rem; /* 16px */ + margin-top: 0.5rem /* 8px */; +} + +.product-page-reviews-comment { + margin-top: 0.5rem /* 8px */; + font-size: 1.125rem /* 18px */; + line-height: 1.75rem /* 28px */; + color: #374151; +} + +/* ===== Breakpoints ===== */ +@media (min-width: 640px) { + .desktop-header-container { + padding: 1.5rem 2rem; /* 24px 32px */ + } + + .hero-wrapper { + padding: 6rem 2rem; /* 96px 32px */ + } + + .hero-title { + font-size: 3.75rem /* 60px */; + line-height: 1; + } + + .category-section-wrapper { + padding: 2.5rem 1.5rem; /* 40px 24px */ + } + + .category-section-grid-wrapper { + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-rows: repeat(2, minmax(0, 1fr)); + column-gap: 1.5rem /* 24px */; + grid-row: span 2 / span 2; + } + + .category-section-grid-main { + aspect-ratio: 1 / 1; + grid-row: span 2 / span 2; + max-height: 100%; + } + + .category-section-grid-main-img { + object-position: center; + } + + .category-section-categories-container { + position: relative; + max-height: 300px; + } + + .category-section-categories-img { + position: absolute; + inset: 0px; + height: 100%; + width: 100%; + } + + .category-section-categories-cta-container { + position: absolute; + inset: 0px; + } + + .category-page-container { + padding: 0 1.5rem; /* 0 24px */ + } + + .products-list { + margin: 0; + } + + .product-card-container { + padding: 1.5rem; + } + + .back-button-wrapper { + padding-left: 1.5rem /* 24px */; + padding-right: 1.5rem /* 24px */; + } + + .product-page-wrapper { + padding: 2.5rem 1.5rem; /* 40px 24px */ + } + + .image-selector-wrapper { + display: block; + } + + .image-selector-main-img { + border-radius: 0.5rem /* 8px */; + } + + .product-page-info-container { + margin-top: 4rem /* 64px */; + padding-left: 0px; + padding-right: 0px; + } +} + +@media (min-width: 768px) { + footer { + margin-top: 5rem; /* 80px */ + } + + .mobile-header-wrapper { + display: none; + } + + .desktop-header-wrapper { + display: block; + } + + .logo-text { + font-size: 1.5rem /* 24px */; + line-height: 2rem /* 32px */; + } + + .footer-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + padding: 3rem 2rem; /* 48px 32px */ + } + + .footer-links-container { + order: 2; + } + + .footer-copyright { + order: 1; + margin-top: 0; + } + + .products-list { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +@media (min-width: 1024px) { + footer { + margin-top: 6rem; /* 96px */ + } + + .category-section-wrapper { + padding: 2.5rem 2rem /* 40px 32px */; + } + + .category-page-container { + padding: 0 2rem; /* 0 32px */ + } + + .products-list { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .back-button-wrapper { + max-width: 80rem /* 1280px */; + padding-left: 2rem /* 32px */; + padding-right: 2rem /* 32px */; + } + + .product-page-wrapper { + padding: 2.5rem 2rem; /* 40px 32px */ + max-width: 80rem /* 1280px */; + } + + .product-page-container { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: center; + column-gap: 2rem /* 32px */; + } + + .image-selector-wrapper { + max-width: none; + } + + .product-page-info-container { + margin-top: 0px; + } +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/datatypes.ts b/06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/datatypes.ts new file mode 100644 index 0000000..f0e5483 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/datatypes.ts @@ -0,0 +1,45 @@ +export interface Product { + id: number; + title: string; + description: string; + category: string; + price: number; + discountPercentage: number; + rating: number; + stock: number; + tags: string[]; + brand: string; + sku: string; + weight: number; + dimensions: Dimensions; + warrantyInformation: string; + shippingInformation: string; + availabilityStatus: string; + reviews: Review[]; + returnPolicy: string; + minimumOrderQuantity: number; + meta: Meta; + images: string[]; + thumbnail: string; +} + +export interface Dimensions { + width: number; + height: number; + depth: number; +} + +export interface Review { + rating: number; + comment: string; + date: Date; + reviewerName: string; + reviewerEmail: string; +} + +export interface Meta { + createdAt: Date; + updatedAt: Date; + barcode: string; + qrCode: string; +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/helpers.ts b/06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/helpers.ts new file mode 100644 index 0000000..593e340 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/lib/helpers.ts @@ -0,0 +1,16 @@ +import { Product } from './datatypes'; + +export const fetchProductsByCategory = async ( + category: string +): Promise => { + try { + const response = await fetch( + `https://dummyjson.com/products/category/${category}` + ); + const data = await response.json(); + return data.products; + } catch (error) { + console.error(`Failed to fetch products for category ${category}:`, error); + return []; + } +}; diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/main.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/main.tsx new file mode 100644 index 0000000..bad3489 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/main.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; + +import { createBrowserRouter, RouterProvider } from 'react-router-dom'; +import Homepage from './pages/root'; +import WomenProducts from './pages/women'; +import MenProducts from './pages/men'; +import AccessoryProducts from './pages/accessories'; +import ProductPage from './pages/product'; + +const router = createBrowserRouter([ + { + path: '/', + element: , + }, + { + path: '/women', + element: , + }, + { + path: '/men', + element: , + }, + { + path: '/accessories', + element: , + }, + { + path: '/products/:productId', + element: , + }, +]); + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + +); diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/accessories.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/accessories.tsx new file mode 100644 index 0000000..d5e9033 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/accessories.tsx @@ -0,0 +1,88 @@ +import { useState, useEffect } from 'react'; + +import Header from '../components/Header'; +import ProductList from '../components/ProductList'; +import Footer from '../components/Footer'; + +import { Product } from '../lib/datatypes'; +import { fetchProductsByCategory } from '../lib/helpers'; + +export default function AccessoryProducts() { + const [products, setProducts] = useState([]); + const [selectedCategory, setSelectedCategory] = useState('all'); + + const categories = [ + 'all', + 'mobile-accessories', + 'sports-accessories', + 'kitchen-accessories', + ]; + + const fetchProducts = async () => { + try { + const fetchedProducts = + selectedCategory === 'all' + ? await Promise.all(categories.slice(1).map(fetchProductsByCategory)) + : await fetchProductsByCategory(selectedCategory); + + const allProducts = Array.isArray(fetchedProducts) + ? fetchedProducts.flat() + : fetchedProducts; + + setProducts(allProducts); + } catch (error) { + console.error('Failed to fetch products:', error); + } + }; + + useEffect(() => { + fetchProducts(); + }, [selectedCategory]); + + return ( +
+
+ +
+
+
+

+ Accessories +

+ +
+ + +
+
+ +
+ {products && } +
+
+
+ +
+
+ ); +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/men.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/men.tsx new file mode 100644 index 0000000..710cc0b --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/men.tsx @@ -0,0 +1,83 @@ +import { useState, useEffect } from 'react'; + +import Header from '../components/Header'; +import ProductList from '../components/ProductList'; +import Footer from '../components/Footer'; + +import { Product } from '../lib/datatypes'; +import { fetchProductsByCategory } from '../lib/helpers'; + +export default function MenProducts() { + const [products, setProducts] = useState([]); + const [selectedCategory, setSelectedCategory] = useState('all'); + + const categories = ['all', 'mens-shirts', 'mens-shoes', 'mens-watches']; + + const fetchProducts = async () => { + try { + const fetchedProducts = + selectedCategory === 'all' + ? await Promise.all(categories.slice(1).map(fetchProductsByCategory)) + : await fetchProductsByCategory(selectedCategory); + + const allProducts = Array.isArray(fetchedProducts) + ? fetchedProducts.flat() + : fetchedProducts; + + setProducts(allProducts); + } catch (error) { + console.error('Failed to fetch products:', error); + } + }; + + useEffect(() => { + fetchProducts(); + }, [selectedCategory]); + + return ( +
+
+ +
+
+
+

+ Men Products +

+ +
+ + +
+
+ +
+ {products && } +
+
+
+ +
+
+ ); +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/product.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/product.tsx new file mode 100644 index 0000000..8a64599 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/product.tsx @@ -0,0 +1,207 @@ +import { useState, useEffect } from 'react'; +import { Product, Review } from '../lib/datatypes'; + +import { useParams, useNavigate } from 'react-router-dom'; + +import Header from '../components/Header'; +import ImageGallery from '../components/ImageGallery'; +import Footer from '../components/Footer'; + +const ProductPage = () => { + const { productId } = useParams<{ productId: string }>(); + const [product, setProduct] = useState(null); + + const fetchProduct = async () => { + try { + const productRes = await fetch( + `https://dummyjson.com/products/${productId}` + ); + const productData = await productRes.json(); + setProduct(productData); + } catch (error) { + console.error('Failed to fetch products:', error); + } + }; + + useEffect(() => { + fetchProduct(); + }, [productId]); + + if (!product) { + return null; + } + + return ( +
+
+ +
+ + +
+
+ + + {/* Product info */} +
+

{product.title}

+ +
+

Product information

+ +

+ {Number(product.price).toLocaleString('en-US', { + style: 'currency', + currency: 'USD', + })} +

+ + {/* Rating */} +
+

Rating

+ +
+
+ {[0, 1, 2, 3, 4].map((rating) => ( + rating ? '#1e293b' : '#e5e7eb', + }} + aria-hidden="true" + /> + ))} +
+

+ {product.rating} out of 5 stars +

+
+
+ + {/* Availability */} +
+

{product.stock} in stock

+
+ + {/* Description */} +
+

Description

+ +

+ {product.description} +

+
+ + {/* Tags */} +
+

Tags

+
+ {product.tags.map((tag) => ( + + {tag} + + ))} +
+
+
+
+ + +
+
+
+ +
+
+ ); +}; + +export default ProductPage; + +function BackButton() { + const navigate = useNavigate(); + + return ( +
+ +
+ ); +} + +function Reviews({ reviews }: { reviews: Review[] }) { + return ( +
+

Reviews

+ +
+ {reviews.map((review, index) => ( +
+
+ {[0, 1, 2, 3, 4].map((rating) => ( + rating ? '#1e293b' : '#e5e7eb', + }} + aria-hidden="true" + /> + ))} +
+ +
+

{review.reviewerName}

+ +

+ {new Date(review.date).toLocaleDateString()} +

+
+ +

{review.comment}

+
+ ))} +
+
+ ); +} + +function ChevronRightIcon(props: React.SVGProps) { + return ( + + + + ); +} + +function StarIcon(props: React.SVGProps) { + return ( + + + + ); +} diff --git a/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/root.tsx b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/root.tsx new file mode 100644 index 0000000..cf40e02 --- /dev/null +++ b/06_js-debug/unterricht/tag50/01_shop-vitest/src/pages/root.tsx @@ -0,0 +1,43 @@ +import Header from '../components/Header'; +import Hero from '../components/Hero'; +import CategorySection from '../components/CategorySection'; +import Footer from '../components/Footer'; + +const categories = [ + { + imgSrc: + 'https://images.unsplash.com/photo-1530011940847-04cba36df39f?q=80&w=1920', + imgAlt: + 'Two female models sitting on a bed. Photo by Billie (@billiebodybrand) on Unsplash.', + href: '/women', + linkText: 'Women Clothing', + }, + { + imgSrc: + 'https://images.unsplash.com/photo-1595909315417-2edd382a56dc?q=80&w=1920', + imgAlt: + 'Jumping rope, smartphone, sports bra, a pair of sneakers, and a water bottle. Photo by erica steeves on Unsplash.', + href: '/accessories', + linkText: 'Accessories', + }, + { + imgSrc: + 'https://images.unsplash.com/photo-1467779009031-53938b78ca38?q=80&w=1920', + imgAlt: 'Group of men sitting in a van. Photo by Luke Porter on Unsplash.', + href: '/men', + linkText: 'Men Clothing', + }, +]; + +export default function Root() { + return ( + <> +
+
+ + +
+