From c623e6f9d6f7c27936291a3ce32ce2766b499a09 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Wed, 28 Oct 2026 09:56:49 +0100 Subject: [PATCH] --- .../02_react-with-forms/package-lock.json | 2286 ----------------- .../unterricht/tag38/01_react-with-forms.zip | Bin 0 -> 43301 bytes .../tag38/01_react-with-forms/.gitignore | 24 + .../tag38/01_react-with-forms/.oxlintrc.json | 8 + .../tag38/01_react-with-forms/README.md | 16 + .../tag38/01_react-with-forms/index.html | 17 + .../tag38/01_react-with-forms/package.json | 29 + .../01_react-with-forms/public/favicon.svg | 1 + .../01_react-with-forms/public/icons.svg | 24 + .../tag38/01_react-with-forms/src/App.jsx | 28 + .../01_react-with-forms/src/assets/react.svg | 1 + .../01_react-with-forms/src/assets/vite.svg | 1 + .../src/components/common/Badge.jsx | 22 + .../src/components/footers/FooterMain.jsx | 78 + .../src/components/forms/FormContact.jsx | 159 ++ .../src/components/forms/FormNewsletter.jsx | 35 + .../forms/react-hook-form/FormContact.jsx | 132 + .../src/components/headers/HeaderMain.jsx | 12 + .../src/components/icons/Logo.jsx | 48 + .../src/components/inputs/InputAmount.jsx | 61 + .../src/components/logos/LogoMain.jsx | 15 + .../src/components/navs/Navbar.jsx | 99 + .../src/layouts/Layout.jsx | 20 + .../tag38/01_react-with-forms/src/main.jsx | 18 + .../src/pages/AboutPage.jsx | 14 + .../src/pages/ContactPage.jsx | 20 + .../src/pages/HomePage.jsx | 10 + .../src/pages/UserPage.jsx | 24 + .../src/pages/UserProfilePage.jsx | 19 + .../01_react-with-forms/src/routes/Router.jsx | 77 + .../src/styles/01_frameworks/_index.scss | 3 + .../_gloria-hallelujah-v24-latin.scss | 8 + .../src/styles/02_fonts/_index.scss | 3 + .../src/styles/02_fonts/_lato-v25-latin.scss | 89 + .../02_fonts/_source-sans-3-v19-latin.scss | 143 ++ .../src/styles/03_base/_colors.scss | 13 + .../src/styles/03_base/_index.scss | 2 + .../src/styles/03_base/_theme.scss | 52 + .../src/styles/03_base/_typography.scss | 9 + .../src/styles/04_plugins/_index.scss | 7 + .../04_plugins/toastify-1.12/_toastify.scss | 88 + .../src/styles/05_modules/_button.scss | 17 + .../styles/05_modules/_chuck-norris-joke.scss | 38 + .../src/styles/05_modules/_footerMain.scss | 45 + .../src/styles/05_modules/_header-main.scss | 15 + .../src/styles/05_modules/_index.scss | 8 + .../src/styles/05_modules/_input-amount.scss | 27 + .../src/styles/05_modules/_logo-main.scss | 21 + .../src/styles/05_modules/_menu-main.scss | 20 + .../styles/05_modules/_product-manager.scss | 47 + .../01_react-with-forms/src/styles/main.scss | 13 + .../src/utils/validators/validate.js | 37 + .../tag38/01_react-with-forms/vite.config.js | 15 + 53 files changed, 1732 insertions(+), 2286 deletions(-) delete mode 100644 06_react/unterricht/tag37/02_react-with-forms/package-lock.json create mode 100644 06_react/unterricht/tag38/01_react-with-forms.zip create mode 100644 06_react/unterricht/tag38/01_react-with-forms/.gitignore create mode 100644 06_react/unterricht/tag38/01_react-with-forms/.oxlintrc.json create mode 100644 06_react/unterricht/tag38/01_react-with-forms/README.md create mode 100644 06_react/unterricht/tag38/01_react-with-forms/index.html create mode 100644 06_react/unterricht/tag38/01_react-with-forms/package.json create mode 100644 06_react/unterricht/tag38/01_react-with-forms/public/favicon.svg create mode 100644 06_react/unterricht/tag38/01_react-with-forms/public/icons.svg create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/App.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/assets/react.svg create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/assets/vite.svg create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/common/Badge.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/footers/FooterMain.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormContact.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormNewsletter.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/headers/HeaderMain.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/icons/Logo.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/inputs/InputAmount.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/logos/LogoMain.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/components/navs/Navbar.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/layouts/Layout.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/main.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/pages/AboutPage.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/pages/ContactPage.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/pages/HomePage.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/pages/UserPage.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/pages/UserProfilePage.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/routes/Router.jsx create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/01_frameworks/_index.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_index.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_lato-v25-latin.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_colors.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_index.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_theme.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_typography.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/_index.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_button.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_chuck-norris-joke.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_footerMain.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_header-main.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_index.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_input-amount.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_logo-main.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_menu-main.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_product-manager.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/styles/main.scss create mode 100644 06_react/unterricht/tag38/01_react-with-forms/src/utils/validators/validate.js create mode 100644 06_react/unterricht/tag38/01_react-with-forms/vite.config.js diff --git a/06_react/unterricht/tag37/02_react-with-forms/package-lock.json b/06_react/unterricht/tag37/02_react-with-forms/package-lock.json deleted file mode 100644 index eba1c0e..0000000 --- a/06_react/unterricht/tag37/02_react-with-forms/package-lock.json +++ /dev/null @@ -1,2286 +0,0 @@ -{ - "name": "react-with-forms", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react-with-forms", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.3.1", - "react-dom": "^19.3.1", - "react-hook-form": "^7.91.0", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.5" - }, - "devDependencies": { - "@types/react": "^19.3.0", - "@types/react-dom": "^19.3.0", - "@vitejs/plugin-react": "^6.1.2", - "oxlint": "^1.90.0", - "sass-embedded": "^1.106.1", - "vite": "^8.3.5" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.16.0.tgz", - "integrity": "sha512-FWa0sPlqYGJgpTs6OxBRcL/AW4JT0OIO+W1ajerluoTVh8CV0B7XM1qsNCRgnkSCkRCgOICKHRQlY17jrsm0+Q==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@oxc-project/types": { - "version": "0.155.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", - "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/oxc-project" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.90.0.tgz", - "integrity": "sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.90.0.tgz", - "integrity": "sha512-RcKhz1ETMq+fazE9TKS2+5NIRGwigm/nW8egqF0LI+A8Yw2iW5r0E/C3XAPRiwIm/vcPiutIRIa6IQCIKhZsTQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.90.0.tgz", - "integrity": "sha512-PSrxMvP6mx+p1karZcUxLdy9lpaP+JWQPti4al9FgTaPhxE+pT/BjhGExloVVSWgZgIfOlLOjVyyq8BXlodhLQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.90.0.tgz", - "integrity": "sha512-OLbU9qsrV2Q8QxT2OEzOPdO8zCCpyI8qB+hDI8yr6RsYELtkf0FAZhJdfjM/RnLHKzt44HWwAPnk92vBtKofvw==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.90.0.tgz", - "integrity": "sha512-fBA4pWyVDARmNucQqpyFuPC49xYf1r+sX7dxPL5fNPQrSMLum39Sn56tZ9JPleWC7FzLPwSQ7plYYfirYBHF8A==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.90.0.tgz", - "integrity": "sha512-zhxH78eP2nR6/pGdhBc7MIfjhhcgATeu8fkmkFJbuzfk6Cj0FzBxyEhL85yDqrCybjx+G2YDzZGsxIO9kvO4Iw==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.90.0.tgz", - "integrity": "sha512-MvYmpHyJqUJjEvkZbJHdwfdL45cGn8EVBkYmoXFiaYFW9suoD3dbJl5mBdpy0DVgdjlyddmldbRtk3cCgETadQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.90.0.tgz", - "integrity": "sha512-L13Sy+Kg0nZhwTsToniqjUFPA2TuM6962qCZ5Wp5KeB517Tw7ApdLTTtlb+bF86fcZZa2EtvCVvAJxk4Dya/MQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.90.0.tgz", - "integrity": "sha512-wFDdZWGpzIPFdJFjSLWnKB0TGzFriTKUIrl04iMqMyM9BBIJTuerfCHYa0WpDSjr5x3lcW/CHLyacSt886WpGg==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.90.0.tgz", - "integrity": "sha512-FRywfn+MoKn8xpBSzgNwNVliSKRI2QXkxi/iF7o6FEQs8Bh8z2RpVTaFAcO3pchXjvB2eGNFIoLLQABIQ+u7VA==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.90.0.tgz", - "integrity": "sha512-IS2PaUgpc/qeLADTyhUNmdx3x4ijs9pjJdPKBYHaT+mAE7k3FsjnHPTjhpsak1b++h6CIPhv6WX9Z+y7Pw0voQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.90.0.tgz", - "integrity": "sha512-s7JFKRkGS8O7i2ZVODfuO++NC7sH6HDqpMn8lYxw91w0SXJOxnAVjQ8utvmDwLMMT0jaSkuOKuUYJDGDtu4sHQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.90.0.tgz", - "integrity": "sha512-b0GxrOQr5VONCkd7KLSqmP6b6nqZuTpuS8QPQHzltmqdXP5bY0Jl0CZ0QmlCTrS3ExaLYbioFYOARzNbYvcApQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.90.0.tgz", - "integrity": "sha512-iaJeShJtgUp8rZbt9YUdTAGOpmX5KogCLba17Jp1tWdJ3F4M3D2g2TKUyI1FMTHxKH9NNHuQcuC2kZRg6IV7yQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.90.0.tgz", - "integrity": "sha512-/aZoXnL5WBLCXuzfHqvEFXcm4iwYmr/cYByHDTXzLFzJdE5DC7bm6phpWqHv6BeqpVgY9IpBAxGDv2WEkl5JCg==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.90.0.tgz", - "integrity": "sha512-SMhk7ozwoxYDKfYqGZCQEfULOKDneF9uhaoIf2neoDLWvNtjY9yVeL7YHmE5L9WdKvMpWNwwZxhenxBu6AgfOg==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.90.0.tgz", - "integrity": "sha512-KBvR3A9fO7fCi2vCP8ifWvlia7tGEQV9NaYh+IGwa/7Groy48Mt/UaYqMK9/zOtAWl20BUCf6RPqzJ32fRw33Q==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.90.0.tgz", - "integrity": "sha512-+x42rDHQGbTCuT3EzpWAzhP3NoVPE/cJsG4gnrakOSg0olV+GCdMpPU23Nvrl3zZMnXxFZdTtDv4D3SuaA5ZeQ==", - "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.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.90.0.tgz", - "integrity": "sha512-30JiaFEBUB9peEOcvVM8ggo88SoN/IdSr9DW505JdBji/R6dM66gKEiG65hw6qcaF2f4mO0cEJ+RwRZprmun9g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", - "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", - "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", - "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", - "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", - "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", - "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", - "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", - "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", - "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", - "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", - "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", - "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", - "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", - "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", - "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.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", - "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", - "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.3.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", - "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", - "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.3.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.2.tgz", - "integrity": "sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==", - "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.152.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", - "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/color" - } - }, - "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/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": 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/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/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "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", - "optional": true, - "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", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.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.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", - "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", - "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/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.90.0.tgz", - "integrity": "sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/oxc-project" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.90.0", - "@oxlint/binding-android-arm64": "1.90.0", - "@oxlint/binding-darwin-arm64": "1.90.0", - "@oxlint/binding-darwin-x64": "1.90.0", - "@oxlint/binding-freebsd-x64": "1.90.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.90.0", - "@oxlint/binding-linux-arm-musleabihf": "1.90.0", - "@oxlint/binding-linux-arm64-gnu": "1.90.0", - "@oxlint/binding-linux-arm64-musl": "1.90.0", - "@oxlint/binding-linux-ppc64-gnu": "1.90.0", - "@oxlint/binding-linux-riscv64-gnu": "1.90.0", - "@oxlint/binding-linux-riscv64-musl": "1.90.0", - "@oxlint/binding-linux-s390x-gnu": "1.90.0", - "@oxlint/binding-linux-x64-gnu": "1.90.0", - "@oxlint/binding-linux-x64-musl": "1.90.0", - "@oxlint/binding-openharmony-arm64": "1.90.0", - "@oxlint/binding-win32-arm64-msvc": "1.90.0", - "@oxlint/binding-win32-ia32-msvc": "1.90.0", - "@oxlint/binding-win32-x64-msvc": "1.90.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2005", - "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.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", - "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", - "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.20", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", - "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", - "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.28.0" - }, - "peerDependencies": { - "react": "^19.3.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.91.0.tgz", - "integrity": "sha512-5BEBUnCBwa28AFXYTYmOaB/+CSpJ/+CWVASHEvIGUzFdHyUiPHeRhG7r5hOZ8nZi0yP7pbHdFNXO/p31EKTJFQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.5.tgz", - "integrity": "sha512-dTgvcXDOrLPrlLHrcZAqWveiK1hMSqN+rGAJzegP8HtmNkfRxOoshGWBNX3ZJ0cZjOHkRdlUJtaIhZMLLyGyPw==", - "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.5", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.5.tgz", - "integrity": "sha512-9HcfDMU6JJ/fp6gJZYGwNE6RknVGS4kBjH1HkNw959mCJi70TVwdipQWv2FEol9uGpi+SZTFtVpJPtEQfayeOw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.5" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", - "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.155.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.15", - "@rolldown/binding-android-arm64": "1.2.15", - "@rolldown/binding-darwin-arm64": "1.2.15", - "@rolldown/binding-darwin-x64": "1.2.15", - "@rolldown/binding-freebsd-x64": "1.2.15", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", - "@rolldown/binding-linux-arm64-gnu": "1.2.15", - "@rolldown/binding-linux-arm64-musl": "1.2.15", - "@rolldown/binding-linux-ppc64-gnu": "1.2.15", - "@rolldown/binding-linux-s390x-gnu": "1.2.15", - "@rolldown/binding-linux-x64-gnu": "1.2.15", - "@rolldown/binding-linux-x64-musl": "1.2.15", - "@rolldown/binding-openharmony-arm64": "1.2.15", - "@rolldown/binding-win32-arm64-msvc": "1.2.15", - "@rolldown/binding-win32-x64-msvc": "1.2.15" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.106.1.tgz", - "integrity": "sha512-kD+Gi66vycZcbJt+42NC4z4PXNMcCajVrJPhqoKKXy5cOBMmJQt052CxIBcRjwYXeImHYOpu/ydWWGZQIenl7A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.106.1.tgz", - "integrity": "sha512-OoaTjMm7PcQnCo/AZNSKM/KdAeaX57edhmOp2bH8hcGNph2VDIg404gOSMZxGKNL+lbc7Ng0S/IYLAbs0YmgfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.7.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.106.1", - "sass-embedded-android-arm": "1.106.1", - "sass-embedded-android-arm64": "1.106.1", - "sass-embedded-android-riscv64": "1.106.1", - "sass-embedded-android-x64": "1.106.1", - "sass-embedded-darwin-arm64": "1.106.1", - "sass-embedded-darwin-x64": "1.106.1", - "sass-embedded-linux-arm": "1.106.1", - "sass-embedded-linux-arm64": "1.106.1", - "sass-embedded-linux-musl-arm": "1.106.1", - "sass-embedded-linux-musl-arm64": "1.106.1", - "sass-embedded-linux-musl-riscv64": "1.106.1", - "sass-embedded-linux-musl-x64": "1.106.1", - "sass-embedded-linux-riscv64": "1.106.1", - "sass-embedded-linux-x64": "1.106.1", - "sass-embedded-unknown-all": "1.106.1", - "sass-embedded-win32-arm64": "1.106.1", - "sass-embedded-win32-x64": "1.106.1" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.106.1.tgz", - "integrity": "sha512-5jUnX+WVeovsbORYHBfPMiAtb5/qTnWpuLrlg0ZEjo4AKLjkM3gXkRCReYBEi/bLC3JhBcWWwG/yPqJwd8/lLw==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.106.1" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.106.1.tgz", - "integrity": "sha512-xtLTJzkh2/oGI0kZ787ef55zKzmk6UO6nsIMV8CE9n2qMG3JvyU91EU+BxjvknRR9BTVvbQOCLqW5j0psFOeAQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.106.1.tgz", - "integrity": "sha512-USQo5LkotweQnofhTCZYBtI35HkbIRUx+YfI6AvNN/Wr45ewCbUnTOYvQc+DLFFcm+g9cp64kLrySPdLbkuPzQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.106.1.tgz", - "integrity": "sha512-OyEAsl8q6xpZgsK4zupwfhVUYvjJaMPgILyXtx326DSPc5lKOwWpXa8rhI2H3eAB76xU61C/5RavIkH1iaqQeQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.106.1.tgz", - "integrity": "sha512-cczQbbtwex6mtaXS/8UwCSx6613EHiVLQNpkeVmk5oN08HpzPsWMoyzuGa2hdfh0by9mHXismdLk8fh9wdEQ+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.106.1.tgz", - "integrity": "sha512-j8p5iM8v0lGFwfO6sagHkrokD7/zlEkCpfRiBDzvW+FdD/JqOW1nemVz/CexHeeR28ULrUNnE1fKJ/FN9TjTEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.106.1.tgz", - "integrity": "sha512-WMszbY07IZ/GOaRlrMI3o+h7eiiOKBppLT+GSunSQsVcr2N4rlmM2rXlLsfub1praplLB4FWqMY1St8kLSjmZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.106.1.tgz", - "integrity": "sha512-EfhuxqURaMpP/eG4bg3fk4XZvRzMJBIw2iSVNRRbpwMOZLhDce8Eys95rTuOuU2R9/pHMwcVwpj/ZU3mZyLHog==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.106.1.tgz", - "integrity": "sha512-CBUcLDCBUiB6vlMO5VwtTywpapeE8cmr/UJ//xwNwByNGxc6JvoBru5XA1bhPquRjgNNMs90u89ybgap8gN31Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.106.1.tgz", - "integrity": "sha512-ToaDrOiunMuD64XLelRqjC0LWuEKt8q6vpqPsHdSN8T5paJWrAXP8EXMcuR/iIBigsssifAPym/MHEWLkLSTlg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.106.1.tgz", - "integrity": "sha512-yDUGDnNbPOoVaeEapLomFnwQkLQF4pveitqjq3J9Oi7qmg8mM/PXJYWOqCOq1ifXSbnnWppfuylUSkGTwnO1Hg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.106.1.tgz", - "integrity": "sha512-mQwiwXzfYlT/3Tb7TAvly9eoJc6Q6z+PC2e8mtuajr77DWAGa+8Ibte1umkG/F6o9jFNG8k752A4EAlSRTXfNg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.106.1.tgz", - "integrity": "sha512-GwVa+GJGeu8ACw06aGXz8uuc9rFXRJsceMHHi02fpuv3qsy2asMgy9xgN4GPVJLac4yjCBmf09sUUqWpOCrkzw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.106.1.tgz", - "integrity": "sha512-biV7fnrlTBAfl+bzIMTgGUHaW803NJti4XcKpX70ukOOKOgxsEwwvk21tI0w8VLKIyXFuLKM3TJxe3Ze1DR0tQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.106.1.tgz", - "integrity": "sha512-Ev2UktLmdFVvCFeSNyow0HNdxmNHqcXLRgEeesKpw4mtcuLN5HHocOJw9LrHiTbcpMPsfxgymS4jJBg43AptaA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.106.1.tgz", - "integrity": "sha512-uaeOeGCaHnhqpfZnjy5wGMcuyYbnDyXhzWCniGctqCj/Inlst4eDZaweowo+sJLExRvmToBhQ8seZyEvfGMQ4g==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.106.1" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.106.1.tgz", - "integrity": "sha512-EiDwpthGDIX25B4d5lVEYgxzqRSdSFoi8czHHesXFYinroDHmgTpqgv7MhYmGogTCvei3o8AahX2Wl1BanWJQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.106.1.tgz", - "integrity": "sha512-j3OIOIXrNqbggtWlht7M/mkYybmGeGtvP7FRUx0NTDC6yeRhc16QTOoHb+z8S6NO9x0frg8eQS+F5qF7+DCKBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", - "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", - "license": "MIT" - }, - "node_modules/set-cookie-parser": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.3.tgz", - "integrity": "sha512-irZHtTqurLna57KQG/s+fzOwv/J6XSH4cs8M/vsrY3uCaQ3S6+QJguAH0WdN47SXlk82voMZ4naWMQf8fdEoIg==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", - "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.1.1.tgz", - "integrity": "sha512-54zMOnH5qgjdKW8SGpCx3daSP+v+TtTfOxgPdhUE3P0hytMMpknZfP67S4JeRcx5IQRWJERz6890yO4dkTywww==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.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/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", - "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.7", - "postcss": "^8.5.30", - "rolldown": "~1.2.14", - "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.7.1 || ^0.8.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_react/unterricht/tag38/01_react-with-forms.zip b/06_react/unterricht/tag38/01_react-with-forms.zip new file mode 100644 index 0000000000000000000000000000000000000000..624e96f465c7dc128db60973f5d52a668a2528ef GIT binary patch literal 43301 zcmce;1yG*NvMr3ey9IZ5w_w5D-QC^YJrF#&YjAgWcMA@|C3t`f+50>9oO8cqXV?Dg zPu1jot0-o8R(G#i)7|sPN&thP0KEN!mC@At`Q@Mgp#b0m&@<@R8|fK1(zuv8n$j5C z*jqW!Ik`du0D@ct0s#E{MI}X80PyCh_2 zh@7>TQ+Njm>P0qKK&~5SWk-*#=(MVN?2k^5qUj<~KE}>66r2eHcQ_T;j|JJlfr>WS zjA4*gPck65Ux{dECrax_$bi{VH1B#`u{-BuO?k#M5BSk%0DiP-oyth-)7e~hVbx%0 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 + + + + + + + React with Forms + + + +
+ + + diff --git a/06_react/unterricht/tag38/01_react-with-forms/package.json b/06_react/unterricht/tag38/01_react-with-forms/package.json new file mode 100644 index 0000000..74e3126 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/package.json @@ -0,0 +1,29 @@ +{ + "name": "react-with-forms", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "bootstrap": "^5.3.8", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-hook-form": "^7.91.0", + "react-icons": "^5.7.0", + "react-router-dom": "^7.18.5", + "validator": "^13.15.35" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "oxlint": "^1.90.0", + "sass-embedded": "^1.106.1", + "vite": "^8.3.5" + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/public/favicon.svg b/06_react/unterricht/tag38/01_react-with-forms/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/unterricht/tag38/01_react-with-forms/public/icons.svg b/06_react/unterricht/tag38/01_react-with-forms/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/App.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/App.jsx new file mode 100644 index 0000000..38600c8 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/App.jsx @@ -0,0 +1,28 @@ +import Navbar from './components/navs/Navbar'; +import Router from './routes/Router'; +import HeaderMain from './components/headers/HeaderMain'; +import FooterMain from './components/footers/FooterMain'; +import { Navigate, useNavigate } from 'react-router-dom'; +import { useEffect } from 'react'; + +function App() { + // const navigate = useNavigate(); + + // useEffect(() => { + // navigate('/contact'); + // }, []); + + return ( + <> + + + +
+ +
+ + + ); +} + +export default App; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/assets/react.svg b/06_react/unterricht/tag38/01_react-with-forms/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/assets/vite.svg b/06_react/unterricht/tag38/01_react-with-forms/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/common/Badge.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/common/Badge.jsx new file mode 100644 index 0000000..df1b229 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/common/Badge.jsx @@ -0,0 +1,22 @@ +const Badge = (props) => { + const { text = '', variant = 'secondary', color } = props; + // const inline = typeof color !== 'undefined' ? { backgroundColor: color } : ''; + + // if (color) { + // return ( + // + // {text} + // + // ); + // } else { + // return {text}; + // } + + return ( + + {text} + + ); +}; + +export default Badge; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/footers/FooterMain.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/footers/FooterMain.jsx new file mode 100644 index 0000000..5006bda --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/footers/FooterMain.jsx @@ -0,0 +1,78 @@ +const FooterMain = (props) => { + // const { } = props; + + return ( + + ); +}; +export default FooterMain; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormContact.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormContact.jsx new file mode 100644 index 0000000..9f2d181 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormContact.jsx @@ -0,0 +1,159 @@ +import { useState } from 'react'; +import validate from '../../utils/validators/validate'; + +const INITIAL_FORM_DATA = { + firstname: '', // + lastname: '', + email: '', + message: '', +}; + +const FormContact = (props) => { + // const { } = props; + + const [formData, setFormData] = useState(INITIAL_FORM_DATA); + + const [errors, setErrors] = useState({}); + + // EventHandlers ======= + const handleSubmit = (e) => { + e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. + + const form = e.currentTarget; + + const errors = validate(formData); + + if (Object.keys(errors).length === 0) { + console.log('Form submitted ....'); + // TODO: send over AJAX/Fetch + form.reset(); + setFormData(INITIAL_FORM_DATA); + setErrors({}); + } else { + console.warn('Form submit error'); + setErrors(errors); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + setFormData((state) => ({ ...state, [name]: value })); + + // console.log({ [e.target.name]: e.target.value }); + // console.log('Formdata', formData); + }; + + const handleBlur = (e) => { + const { name, value } = e.target; + const validationErrors = validate({ ...formData, [name]: value }); + + setErrors((state) => { + const nextErrors = { ...state }; + + if (validationErrors[name]) { + nextErrors[name] = validationErrors[name]; + } else { + delete nextErrors[name]; + } + + return nextErrors; + }); + }; + + return ( +
+
+
+
+ + +
OK
+
{errors?.firstname}
+
+
+
+
+ + +
OK
+
{errors?.lastname}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.email}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.message}
+
+
+
+ +
+
+
+ +
+
+
+
+ ); +}; +export default FormContact; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormNewsletter.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormNewsletter.jsx new file mode 100644 index 0000000..d8c7ec7 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/FormNewsletter.jsx @@ -0,0 +1,35 @@ +const FormNewsletter = (props) => { + // const { } = props; + + // EventHandler + const handleSubmit = (e) => { + e.preventDefault(); // Standardverhalten unterbinden + console.log('Event: ', e); + }; + + return ( +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ ); +}; +export default FormNewsletter; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx new file mode 100644 index 0000000..5151368 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx @@ -0,0 +1,132 @@ +import { useState } from 'react'; +import { useForm } from 'react-hook-form'; +// import validate from '../../../utils/validators/validate'; + +const FormContact = (props) => { + // const { } = props; + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + // EventHandlers ======= + const onSubmit = (data) => { + console.log('submitted'); + console.log('Form data:', data); + + // fetch('/send', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json', + // }, + // body: JSON.stringify(data), + // }) + // .then((res) => res.json()) + // .then((data) => console.log(data)) + // .catch((err) => console.error(err)); + }; + + if (errors) { + console.log(errors); + } + + return ( +
+
+
+
+ + +
OK
+
{errors?.firstname?.message || 'Error'}
+
+
+
+
+ + +
OK
+
{errors?.lastname?.message}
+
+
+
+ +
+
+
+ + +
OK
+
Email is required
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.message?.message}
+
+
+
+ +
+
+
+ +
+
+
+
+ ); +}; +export default FormContact; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/headers/HeaderMain.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/headers/HeaderMain.jsx new file mode 100644 index 0000000..acbddb2 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/headers/HeaderMain.jsx @@ -0,0 +1,12 @@ +import LogoMain from '../logos/LogoMain'; + +const HeaderMain = () => { + return ( +
+
+ +
+
+ ); +}; +export default HeaderMain; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/icons/Logo.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/icons/Logo.jsx new file mode 100644 index 0000000..dd3b6f0 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/icons/Logo.jsx @@ -0,0 +1,48 @@ +const Logo = () => { + return ( + + + + + + + + + ); +}; +export default Logo; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/inputs/InputAmount.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/inputs/InputAmount.jsx new file mode 100644 index 0000000..d6ac3f5 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/inputs/InputAmount.jsx @@ -0,0 +1,61 @@ +import { useState } from 'react'; +import { FaMinus, FaPlus } from 'react-icons/fa6'; + +const InputAmount = (props) => { + const [amount, setAmount] = useState(0); + + // const { } = props; + + // Eventhandler + const handleChange = (e) => { + const value = Number(e.target.value); // e.target.valueAsNumber + + // Guard + if (isNaN(value)) return; + + setAmount(value); + }; + const handleClick = (e) => { + console.log('Event: ', e); + console.log(e.currentTarget.name); + switch (e.currentTarget.name) { + case 'increase': + setAmount((prevState) => prevState + 1); + console.log('inc'); + break; + case 'decrease': + setAmount(amount - 1); + console.log('dec'); + break; + default: //nothing + } + }; + + return ( +
+
+ + + + + + + + +
+
+ ); +}; +export default InputAmount; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/logos/LogoMain.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/logos/LogoMain.jsx new file mode 100644 index 0000000..2649b9e --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/logos/LogoMain.jsx @@ -0,0 +1,15 @@ +import Logo from '../icons/Logo'; + +// import Logo from '/logo-js.min.svg'; +const LogoMain = (props) => { + // const { } = props; + + return ( +
+ {/* JS Course */} + +
Firmen Slogan
+
+ ); +}; +export default LogoMain; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/components/navs/Navbar.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/components/navs/Navbar.jsx new file mode 100644 index 0000000..983afdb --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/components/navs/Navbar.jsx @@ -0,0 +1,99 @@ +import { NavLink } from 'react-router-dom'; + +function Navbar() { + return ( + + ); +} + +export default Navbar; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/layouts/Layout.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/layouts/Layout.jsx new file mode 100644 index 0000000..8b55dbf --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/layouts/Layout.jsx @@ -0,0 +1,20 @@ +import { Outlet } from 'react-router-dom'; +import Navbar from '../components/navs/Navbar'; + +const Layout = (props) => { + // const { } = props; + + return ( + <> +
Header
+ +
+ +
+
+

© copyright 2026

+
+ + ); +}; +export default Layout; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/main.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/main.jsx new file mode 100644 index 0000000..672352b --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/main.jsx @@ -0,0 +1,18 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; + +import App from './App.jsx'; + +import 'bootstrap'; // js +import './styles/main.scss'; + +const root = createRoot(document.getElementById('root')); + +root.render( + + + + + , +); diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/pages/AboutPage.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/pages/AboutPage.jsx new file mode 100644 index 0000000..8112904 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/pages/AboutPage.jsx @@ -0,0 +1,14 @@ +function AboutPage() { + return ( +
+

About

+

+ sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id dolores minus iste + quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. Sit corporis + voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit +

+
+ ); +} + +export default AboutPage; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/pages/ContactPage.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/pages/ContactPage.jsx new file mode 100644 index 0000000..d00ae27 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/pages/ContactPage.jsx @@ -0,0 +1,20 @@ +import FormContact from '../components/forms/react-hook-form/FormContact'; + +function ContactPage() { + return ( +
+

Kontakt

+

+ Hast du Fragen? Schreib uns eine E-Mail: +
+ kontakt@example.com +
+

+ +
+ +
+ ); +} + +export default ContactPage; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/pages/HomePage.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/pages/HomePage.jsx new file mode 100644 index 0000000..d4a4d32 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/pages/HomePage.jsx @@ -0,0 +1,10 @@ +function HomePage() { + return ( +
+

Home

+

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ad, voluptatibus.

+
+ ); +} + +export default HomePage; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/pages/UserPage.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/pages/UserPage.jsx new file mode 100644 index 0000000..3d35b61 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/pages/UserPage.jsx @@ -0,0 +1,24 @@ +import { Outlet } from 'react-router-dom'; + +const UserPage = (props) => { + // const { } = props; + + return ( +
+
+
+

User

+

The nested user site:

+
+
+
+ +
+
+

© copyright 2026

+
+
+
+ ); +}; +export default UserPage; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/pages/UserProfilePage.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/pages/UserProfilePage.jsx new file mode 100644 index 0000000..053f8ce --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/pages/UserProfilePage.jsx @@ -0,0 +1,19 @@ +import { useParams } from 'react-router-dom'; +import Badge from '../components/common/Badge'; + +function UserProfilePage() { + const { userId } = useParams(); + + return ( +
+

+ User Profile +

+

+ sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id dolores minus iste +

+
+ ); +} + +export default UserProfilePage; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/routes/Router.jsx b/06_react/unterricht/tag38/01_react-with-forms/src/routes/Router.jsx new file mode 100644 index 0000000..38f5bd2 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/routes/Router.jsx @@ -0,0 +1,77 @@ +import { Navigate, Route, Routes } from 'react-router-dom'; +//import { createBrowserRouter, RouterProvider } from 'react-router-dom'; + +// Pages Komponenten +import HomePage from '../pages/HomePage'; +import AboutPage from '../pages/AboutPage'; +import ContactPage from '../pages/ContactPage'; +import UserProfilePage from '../pages/UserProfilePage'; +import UserPage from '../pages/UserPage'; + +// import Layout from '../layouts/Layout'; + +// Alternative Definition von Routes über "createBrowserRouter" mit Objekten +// const router = createBrowserRouter([ +// { path: '/', element: }, +// { path: '/about', element: }, +// { path: '/contact', element: }, +// ]); +// // App.jsx +// {/**/}; + +const checkAuth = () => { + const token = localStorage.getItem('token'); + return token && token === 'secret-token' ? true : false; +}; + +const ProtectedRoute = (props) => { + const { redirectTo = '/', children } = props; + + const isAuthenticated = checkAuth(); // => true | false // Authentication - Prüfung + + return isAuthenticated ? children : ; +}; + +const Router = () => { + // const { } = props; + + return ( + + {/* Static Routes */} + } /> + } /> + } /> + + {/* Dynamic Routes */} + Flights} /> + } /> + + {/* Nested Routes */} + {/* }> + } /> + } /> + } /> + */} + + }> + Index} /> + Profile} /> + Dashboard} /> + Settings} /> + + + {/* Protected Routes | Geschützte Routen */} + +
+

Admin Dashboard Page

+

Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero atque eveniet hic temporibus

+
+ + }>
+
+ ); +}; +export default Router; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/01_frameworks/_index.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..42edceb --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/01_frameworks/_index.scss @@ -0,0 +1,3 @@ +// Bootstrap 5.3.8 or 6 (6.0.0-alpha.1) straight from node_modules. +// @forward 'bootstrap/scss/bootstrap-grid' +@forward 'bootstrap/scss/bootstrap'; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss new file mode 100644 index 0000000..f46eba2 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss @@ -0,0 +1,8 @@ +// gloria-hallelujah-regular - latin +@font-face { + font-display: swap; + font-family: 'Gloria Hallelujah'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/gloria-hallelujah-v24-latin/gloria-hallelujah-v24-latin-regular.woff2') format('woff2'); +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_index.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_index.scss new file mode 100644 index 0000000..d377888 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_index.scss @@ -0,0 +1,3 @@ +// @forward 'gloria-hallelujah-v24-latin'; +// @forward 'lato-v25-latin'; +// @forward 'source-sans-3-v19-latin'; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_lato-v25-latin.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_lato-v25-latin.scss new file mode 100644 index 0000000..522cfda --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_lato-v25-latin.scss @@ -0,0 +1,89 @@ +// lato-100 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 100; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-100.woff2') format('woff2'); +} + +// lato-100italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 100; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-100italic.woff2') format('woff2'); +} + +// lato-300 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 300; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-300.woff2') format('woff2'); +} + +// lato-300italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 300; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-300italic.woff2') format('woff2'); +} + +// lato-regular - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-regular.woff2') format('woff2'); +} + +// lato-italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-italic.woff2') format('woff2'); +} + +// lato-700 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-700.woff2') format('woff2'); +} + +// lato-700italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 700; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-700italic.woff2') format('woff2'); +} + +// lato-900 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 900; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-900.woff2') format('woff2'); +} + +// lato-900italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 900; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-900italic.woff2') format('woff2'); +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_source-sans-3-v19-latin.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_source-sans-3-v19-latin.scss new file mode 100644 index 0000000..b732c16 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/02_fonts/_source-sans-3-v19-latin.scss @@ -0,0 +1,143 @@ +// source-sans-3-200 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 200; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2') format('woff2'); +} + +// source-sans-3-200italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 200; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2') format('woff2'); +} + +// source-sans-3-300 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 300; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2') format('woff2'); +} + +// source-sans-3-300italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 300; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2') format('woff2'); +} + +// source-sans-3-regular - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2') format('woff2'); +} + +// source-sans-3-italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 400; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2') format('woff2'); +} + +// source-sans-3-500 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 500; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2') format('woff2'); +} + +// source-sans-3-500italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 500; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2') format('woff2'); +} + +// source-sans-3-600 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 600; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2') format('woff2'); +} + +// source-sans-3-600italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 600; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2') format('woff2'); +} + +// source-sans-3-700 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 700; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2') format('woff2'); +} + +// source-sans-3-700italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 700; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2') format('woff2'); +} + +// source-sans-3-800 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 800; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2') format('woff2'); +} + +// source-sans-3-800italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 800; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2') format('woff2'); +} + +// source-sans-3-900 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 900; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2') format('woff2'); +} + +// source-sans-3-900italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 900; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2') format('woff2'); +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_colors.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_colors.scss new file mode 100644 index 0000000..a550f3d --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_colors.scss @@ -0,0 +1,13 @@ +/* Color Theme Swatches in Hex */ +$color-1: #5c4b51; +$color-2: #8cbeb2; +$color-3: #f2ebbf; +$color-4: #f3b562; +$color-5: #f06060; + +$color-red: $color-5; +$color-white: white; // falls weiß geändert wird z.B.: #f8f8f8 +$color-black: #101010; + +$color-dark-blue: #283e4a; +$linear-gradient-dark: linear-gradient(180deg, rgba(40, 62, 74, 1) 0%, rgba(24, 32, 38, 1) 100%); diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_index.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_index.scss new file mode 100644 index 0000000..aaf4e12 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_index.scss @@ -0,0 +1,2 @@ +// Variables (colors, typography) are pulled in by the partials that need them via @use. +@forward 'theme'; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_theme.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_theme.scss new file mode 100644 index 0000000..26b9863 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_theme.scss @@ -0,0 +1,52 @@ +@use 'typography' as *; + +// Allgemeine Formatierung +*, +html { + box-sizing: border-box; +} + +html, +body, +#root, +#app { + height: 100%; +} +// Sticky Footer +body, +#root, +#app { + display: flex; + flex-direction: column; +} + +main, +#main { + flex: 1 0 auto; +} + +body > footer, +.footer-main { + flex-shrink: 0; +} +// sticky end + +body { + margin: 0; + padding: 0; + font-family: $font-copy; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: $font-headline; + font-weight: 600; +} + +blockquote { + font-family: $font-quote; +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_typography.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_typography.scss new file mode 100644 index 0000000..7c9b095 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/03_base/_typography.scss @@ -0,0 +1,9 @@ +$fallback-serif: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif; +$fallback-sans-serif: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + +$font-headline: 'Lato', $fallback-serif; +$font-subclaim: $fallback-sans-serif; + +$font-menu: 'Source Sans 3', $fallback-sans-serif; +$font-copy: 'Source Sans 3', $fallback-sans-serif; +$font-quote: 'Gloria Hallelujah', $fallback-serif; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/_index.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/_index.scss new file mode 100644 index 0000000..bd5ba6a --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/_index.scss @@ -0,0 +1,7 @@ +// @use '@fortawesome/fontawesome-free/scss/variables' with ( +// $font-path: '@fa-webfonts' +// ); +// @use '@fortawesome/fontawesome-free/scss/fontawesome'; +// @use '@fortawesome/fontawesome-free/scss/solid'; + +// @use 'toastify-1.12/toastify'; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/toastify-1.12/_toastify.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/toastify-1.12/_toastify.scss new file mode 100644 index 0000000..e359a14 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/04_plugins/toastify-1.12/_toastify.scss @@ -0,0 +1,88 @@ +/*! + * Toastify js 1.12.0 + * https://github.com/apvarun/toastify-js + * @license MIT licensed + * + * Copyright (C) 2018 Varun A P + */ + +.toastify { + padding: 12px 20px; + color: #ffffff; + display: inline-block; + box-shadow: + 0 3px 6px -1px rgba(0, 0, 0, 0.12), + 0 10px 36px -4px rgba(77, 96, 232, 0.3); + background: -webkit-linear-gradient(315deg, #73a5ff, #5477f5); + background: linear-gradient(135deg, #73a5ff, #5477f5); + position: fixed; + opacity: 0; + transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1); + border-radius: 2px; + cursor: pointer; + text-decoration: none; + max-width: calc(50% - 20px); + z-index: 2147483647; +} + +.toastify.on { + opacity: 1; +} + +.toast-close { + background: transparent; + border: 0; + color: white; + cursor: pointer; + font-family: inherit; + font-size: 1em; + opacity: 0.4; + padding: 0 5px; +} + +.toastify-right { + right: 15px; +} + +.toastify-left { + left: 15px; +} + +.toastify-top { + top: -150px; +} + +.toastify-bottom { + bottom: -150px; +} + +.toastify-rounded { + border-radius: 25px; +} + +.toastify-avatar { + width: 1.5em; + height: 1.5em; + margin: -7px 5px; + border-radius: 2px; +} + +.toastify-center { + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + max-width: fit-content; + max-width: -moz-fit-content; +} + +@media only screen and (max-width: 360px) { + .toastify-right, + .toastify-left { + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + max-width: fit-content; + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_button.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_button.scss new file mode 100644 index 0000000..1660f6b --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_button.scss @@ -0,0 +1,17 @@ +button, +input { + &.btn-custom { + background-color: #f0f0f0; + color: #333; + border: 1px solid #ccc; + padding: 8px 16px; + border-radius: 0px; + margin: 3px; + &:hover, + &:focus { + background-color: #e0e0e0; + color: #333; + border: 1px solid #ccc; + } + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_chuck-norris-joke.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_chuck-norris-joke.scss new file mode 100644 index 0000000..232b479 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_chuck-norris-joke.scss @@ -0,0 +1,38 @@ +@use '../03_base/colors' as *; + +.chuck-norris-joke { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + min-height: calc(100vh - 3.5rem); // full screen below the navbar + background: #555 url('../../assets/img/concrete-bg.jpg') center no-repeat fixed; + background-size: cover; + + &::after { + content: ''; + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient(circle, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.8) 100%); + } + + > * { + position: relative; + z-index: 2; + } + + .joke-text { + color: $color-white; + text-align: center; + font-size: 3rem; + max-width: 80%; + padding: 2rem; + text-shadow: 2px 2px 5px rgba(black, 0.5); + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_footerMain.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_footerMain.scss new file mode 100644 index 0000000..fd73f7c --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_footerMain.scss @@ -0,0 +1,45 @@ +@use '../03_base/colors' as *; + +.footer-main { + background-color: $color-black; + background: $linear-gradient-dark; + padding: 3rem 0; + [class^='col'] { + color: $color-white; + a { + color: $color-white; + } + h2, + h3, + h4, + h5, + h6 { + font-size: 1.5rem; + color: $color-2; + padding: 0.5rem 0; + margin-bottom: 1rem; + letter-spacing: 2px; + } + } + // Mobile First + .row { + flex-direction: column; + > div { + &:nth-child(1) { + order: 3; + } + &:nth-child(2) { + order: 2; + } + &:nth-child(3) { + order: 1; + } + } + } + @media (min-width: 992px) { + // @include media-breakpoint-up(md) { + .row { + flex-direction: row; + } + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_header-main.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_header-main.scss new file mode 100644 index 0000000..2884477 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_header-main.scss @@ -0,0 +1,15 @@ +.m-header-main { + width: 100%; + height: 400px; + + // https://cssreference.io/property/background/ + background: #efefef url('../../assets/img/header-bg.webp') center no-repeat border-box; + background-size: cover; + + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + border: 20px solid rgba(white, 0.25); +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_index.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_index.scss new file mode 100644 index 0000000..484b0de --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_index.scss @@ -0,0 +1,8 @@ +@forward 'button'; +// @forward 'chuck-norris-joke'; +@forward 'footerMain'; +@forward 'header-main'; +@forward 'input-amount'; +@forward 'logo-main'; +// @forward 'menu-main'; +// @forward 'product-manager'; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_input-amount.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_input-amount.scss new file mode 100644 index 0000000..8701a7c --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_input-amount.scss @@ -0,0 +1,27 @@ +.m-input-amount { + .input-group { + .input-group-text { + padding: 0; + display: inline-block; + overflow: hidden; + button { + border-radius: 0; + } + } + input { + max-width: 85px; + text-align: center; + } + /* Für Chrome, Safari, Edge und Opera */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Für Firefox */ + input[type='number'] { + appearance: textfield; + } + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_logo-main.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_logo-main.scss new file mode 100644 index 0000000..399bd12 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_logo-main.scss @@ -0,0 +1,21 @@ +.logo-main { + margin: 0; + + img, + svg { + width: 320px; + height: auto; + max-width: 320px; + } + + figcaption { + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_menu-main.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_menu-main.scss new file mode 100644 index 0000000..df4627e --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_menu-main.scss @@ -0,0 +1,20 @@ +@use '../03_base/colors' as *; +@use '../03_base/typography' as *; + +// Main navigation = Bootstrap 6 navbar (see includes/menu-main.html). +// Only the look from frontend-gulp is added here: black bar, uppercase links. +.menu-main { + background-color: $color-black; + font-family: $font-menu; + + .nav-link { + text-transform: uppercase; + } +} + +// Mobile drawer: Bootstrap 6 alpha keeps it white although the navbar is dark +// (data-bs-theme="dark"), which leaves the light link text invisible. Give it the bar's colour. +.menu-main .drawer { + background-color: $color-black; + color: $color-white; +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_product-manager.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_product-manager.scss new file mode 100644 index 0000000..4f3ed4d --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/05_modules/_product-manager.scss @@ -0,0 +1,47 @@ +.product-manager { + .nav-products-actions { + ul { + padding: 0; + margin: 0; + list-style: none; + display: flex; + justify-content: flex-end; + + li { + button { + margin: 0.5rem 0 0.5rem 0.5rem; + } + } + } + } + + table { + .th-actions { + width: 200px; + } + .th-dragger { + width: 50px; + } + + td { + vertical-align: middle; + button { + margin: 0 2px; + } + } + + tbody:empty::after { + content: 'loading products...'; + width: max-content; + display: inline-block; + color: #999; + padding: 1rem; + } + tfoot .row > * { + margin-bottom: 0.5rem; + @media (min-width: 992px) { + margin-bottom: 0; + } + } + } +} diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/styles/main.scss b/06_react/unterricht/tag38/01_react-with-forms/src/styles/main.scss new file mode 100644 index 0000000..297e74f --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/styles/main.scss @@ -0,0 +1,13 @@ +// Single stylesheet entry, linked in src/html/includes/head.html. +// Same folders as in frontend-gulp; @use instead of the deprecated @import. + +// 01 Frameworks +@use '01_frameworks' as *; +// 02 Fonts +@use '02_fonts' as *; +// 03 Base +@use '03_base' as *; +// 04 Plugins +@use '04_plugins' as *; +// 05 Modules +@use '05_modules' as *; diff --git a/06_react/unterricht/tag38/01_react-with-forms/src/utils/validators/validate.js b/06_react/unterricht/tag38/01_react-with-forms/src/utils/validators/validate.js new file mode 100644 index 0000000..d8395a4 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/src/utils/validators/validate.js @@ -0,0 +1,37 @@ +import validator from 'validator'; + +const validate = (formData) => { + const errors = {}; + const firstname = formData.firstname.trim(); + const lastname = formData.lastname.trim(); + const email = formData.email.trim(); + const message = formData.message.trim(); + + if (validator.isEmpty(firstname)) { + errors.firstname = 'Firstname is required'; + } else if (!validator.isLength(firstname, { min: 2, max: 50 })) { + errors.firstname = 'Firstname must be between 2 and 50 characters'; + } + + if (validator.isEmpty(lastname)) { + errors.lastname = 'Lastname is required'; + } else if (!validator.isLength(lastname, { min: 2, max: 60 })) { + errors.lastname = 'Lastname must be between 2 and 60 characters'; + } + + if (validator.isEmpty(email)) { + errors.email = 'Email is required'; + } else if (!validator.isEmail(email)) { + errors.email = 'Email is invalid'; + } + + if (validator.isEmpty(message)) { + errors.message = 'Message is required'; + } else if (!validator.isLength(message, { min: 10, max: 1000 })) { + errors.message = 'Message must be between 10 and 1000 characters'; + } + + return errors; +}; + +export default validate; diff --git a/06_react/unterricht/tag38/01_react-with-forms/vite.config.js b/06_react/unterricht/tag38/01_react-with-forms/vite.config.js new file mode 100644 index 0000000..24ad103 --- /dev/null +++ b/06_react/unterricht/tag38/01_react-with-forms/vite.config.js @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + css: { + preprocessorOptions: { + scss: { + quietDeps: true, // Unix + silenceDeprecations: ['color-functions', 'global-builtin', 'import', 'legacy-js-api', 'if-function'], + }, + }, + }, +});