From fd7a5a03ca331cdb81de93dde2561b5fa0c22dc7 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Thu, 22 Oct 2026 13:45:38 +0200 Subject: [PATCH] --- .../tag34/04_reusable-components.zip | Bin 0 -> 28656 bytes .../tag34/04_reusable-components/.gitignore | 24 + .../04_reusable-components/.oxlintrc.json | 8 + .../tag34/04_reusable-components/README.md | 16 + .../tag34/04_reusable-components/index.html | 13 + .../04_reusable-components/package-lock.json | 2256 +++++++++++++++++ .../tag34/04_reusable-components/package.json | 27 + .../04_reusable-components/public/favicon.svg | 1 + .../04_reusable-components/public/icons.svg | 24 + .../tag34/04_reusable-components/src/App.jsx | 18 + .../src/components/buttons/Button.css | 15 + .../src/components/buttons/Button.jsx | 45 + .../src/components/buttons/Button.module.css | 15 + .../src/components/buttons/Button.scss | 14 + .../tag34/04_reusable-components/src/main.jsx | 14 + .../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 | 32 + .../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/_header-main.scss | 15 + .../src/styles/05_modules/_index.scss | 6 + .../src/styles/05_modules/_logo-main.scss | 21 + .../src/styles/05_modules/_menu-main.scss | 20 + .../styles/05_modules/_product-manager.scss | 47 + .../src/styles/main.scss | 13 + .../04_reusable-components/vite.config.js | 7 + 35 files changed, 3071 insertions(+) create mode 100644 06_react/unterricht/tag34/04_reusable-components.zip create mode 100644 06_react/unterricht/tag34/04_reusable-components/.gitignore create mode 100644 06_react/unterricht/tag34/04_reusable-components/.oxlintrc.json create mode 100644 06_react/unterricht/tag34/04_reusable-components/README.md create mode 100644 06_react/unterricht/tag34/04_reusable-components/index.html create mode 100644 06_react/unterricht/tag34/04_reusable-components/package-lock.json create mode 100644 06_react/unterricht/tag34/04_reusable-components/package.json create mode 100644 06_react/unterricht/tag34/04_reusable-components/public/favicon.svg create mode 100644 06_react/unterricht/tag34/04_reusable-components/public/icons.svg create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/App.jsx create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.css create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.jsx create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.module.css create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/main.jsx create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/01_frameworks/_index.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_index.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_lato-v25-latin.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_colors.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_index.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_theme.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_typography.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/04_plugins/_index.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_button.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_chuck-norris-joke.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_header-main.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_index.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_logo-main.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_menu-main.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_product-manager.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/src/styles/main.scss create mode 100644 06_react/unterricht/tag34/04_reusable-components/vite.config.js diff --git a/06_react/unterricht/tag34/04_reusable-components.zip b/06_react/unterricht/tag34/04_reusable-components.zip new file mode 100644 index 0000000000000000000000000000000000000000..d397089b77c353d2000f0833815e21291008201a GIT binary patch literal 28656 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 literal 0 HcmV?d00001 diff --git a/06_react/unterricht/tag34/04_reusable-components/.gitignore b/06_react/unterricht/tag34/04_reusable-components/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06_react/unterricht/tag34/04_reusable-components/.oxlintrc.json b/06_react/unterricht/tag34/04_reusable-components/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/06_react/unterricht/tag34/04_reusable-components/README.md b/06_react/unterricht/tag34/04_reusable-components/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the Oxlint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/06_react/unterricht/tag34/04_reusable-components/index.html b/06_react/unterricht/tag34/04_reusable-components/index.html new file mode 100644 index 0000000..196c435 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/index.html @@ -0,0 +1,13 @@ + + + + + + + 04_reusable-components + + +
+ + + diff --git a/06_react/unterricht/tag34/04_reusable-components/package-lock.json b/06_react/unterricht/tag34/04_reusable-components/package-lock.json new file mode 100644 index 0000000..7b8c3b0 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/package-lock.json @@ -0,0 +1,2256 @@ +{ + "name": "04_reusable-components", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "04_reusable-components", + "version": "0.0.0", + "dependencies": { + "bootstrap": "^5.3.8", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-icons": "^5.7.0", + "sass-embedded": "^1.106.1", + "styled-components": "^6.6.0" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "oxlint": "^1.88.0", + "vite": "^8.3.4" + } + }, + "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==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.89.0.tgz", + "integrity": "sha512-Pflpba5F3gRAQ12sWglRxvWTHEdAusNDvmi4Y5N1T5SY1AGkM7AixOnET8qkrnLJ/F32qAlNokO6eCknT8tmnw==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.89.0.tgz", + "integrity": "sha512-dYmyD1x7LaPlb79vZWUcpTShk8dI9z1I+IubtqrBxWNJaDhQdPHwcsvg7q5StTU4xWyd9AwPfLaTYFZY8NZgtQ==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.89.0.tgz", + "integrity": "sha512-Z/oxOPiIqiS7fItRdxaaOEC+6GD3OpGi0IxoR0dMefzQHolsKLzScw2DNcu/5gUPok3tv+G9mslvYB5bo3i0qg==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.89.0.tgz", + "integrity": "sha512-eAjTkHSjAxrdCPJxO6y5sPQL5pYLKb2kvxZz9UU7tXnOZk9I/HLtkvx9S7GHY883k+AmL/eC7mqFt+w7WCwk0w==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.89.0.tgz", + "integrity": "sha512-0lNCA9Tl1n1FKpqy2/9ckp0kIuSrtJ/l9bMRgaEhOtM7TsOHshFuwOcvW8oA9teXLMOJT61LjEKWiaHDFGxF/w==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.89.0.tgz", + "integrity": "sha512-OTFEvi9W+JczaZD1Caj17SGCoW8H7TE+fvx0D7ATEWa1Lohn91UMxFQ6r145SiGy/yCxeIwptMys/RAM7gSVSQ==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.89.0.tgz", + "integrity": "sha512-fRxgNHvBLswj6MrhW2uBq5UDhPRQlCbHeq/Nf8yuG9zOxhDsXqX/mi2PX1axgsQxMm88el7HLiJAzglAnflYxw==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.89.0.tgz", + "integrity": "sha512-v9ENzHvwrQoYSWTtviH1pOYc7R9UovDxVofnck50cNmPihRRTcrg5X0UlRbLOZ7IVtxPOlh2hb7kDO+FpE8SfQ==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.89.0.tgz", + "integrity": "sha512-vfffe8mQ484AzVadlUOFpgL+JDwhvs9hrzxTgQP1FVfi4ZEUUYeffXlzC9dFV7Dgnu5s/KrNKvfmG6HxBd/ISQ==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.89.0.tgz", + "integrity": "sha512-Buonlp4hVS7RGNP5M7bPpGNQrenyzA2C64JcO/oz9C1c6dGOXJ7VEAnaiAMY7voou0JYyCJdvDVlFQc5DZX3DQ==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.89.0.tgz", + "integrity": "sha512-1eVwJJrJ3lYIPT+cm7BcBBZZXY6IQZP/oyonaruTor/MrVyWOpvnwt1oD5CLdsHg5aVBIxXodQSvt+1gK6ck5w==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.89.0.tgz", + "integrity": "sha512-fRQQsKUGShdEL5Fl9o9uhj3grkZbeXKLv0icQ5tspUCNYSDy8wzzEcP1WC2bKdTQ0rSszbKlO3iiHORxV22DLg==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.89.0.tgz", + "integrity": "sha512-dEtYjIy6+fHcjKklsmtmMkZRhwHr2UbzjmpvuPtQYSeN9awQ2hx5JLms5Wvri+8P/NZtD8v5hfgHALUql+/Ycg==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.89.0.tgz", + "integrity": "sha512-hqjwIj5KOYM8Wjef/p7IruNi1iByLhSzbMBk62y22P/E8q7Jj0Pp+DeUTKTRYyZYCDtU1wEGlnWOnttHbyNIww==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.89.0.tgz", + "integrity": "sha512-iAQN3e6o9UgUCcdGwqRx/jYcKbG3HK7ur3rH6lTqVcQeNGZ85AeWIg6cgn/edwFQ0ofEZZItMwkzyCVTahnvEA==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.89.0.tgz", + "integrity": "sha512-MNxjEByz3N/7Q4qFQuPWvc14TpN9LoD3pECEDsJTZbP/wyB7U+hduUXEl7QAbbgVezFwsb9sWtNUO6XVBndOhg==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.89.0.tgz", + "integrity": "sha512-xxe+i9wfuFso/VnoL4mfj0UlzE+cfCFiUB06vkXCMyQdgVVmItF5FfAF4tATAktSU6uHruWR+FjqvAT9cHZZzg==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.89.0.tgz", + "integrity": "sha512-saFy07cO94E664glwgLmKLI40HgTL1PY86y4T6+ud4niX4H0Kdqjcmqmjps7mQNdBytV5guGbXDdyQtRfeLbLA==", + "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.89.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.89.0.tgz", + "integrity": "sha512-hLFJ/o0f/dTJh/EW0vmcbREYSQO9tYgfiAAlsOkiLFiJuRRWvYtFELUXN5o2ijpSo/tlO1n+YlWN58tZwPG18A==", + "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==", + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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==", + "dev": 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/@types/stylis": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "license": "MIT" + }, + "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/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "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==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/color" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": 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==", + "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==", + "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==", + "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==", + "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==", + "license": "MIT", + "optional": true + }, + "node_modules/oxlint": { + "version": "1.89.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.89.0.tgz", + "integrity": "sha512-a25hkfo61okGPvJz432fRIPoxlKtNnOVy9w4rzrmGgNm4iVTPwpSQlmdqNWnp6p9QyyPVfAZRgnf5XvSBZFk/A==", + "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.89.0", + "@oxlint/binding-android-arm64": "1.89.0", + "@oxlint/binding-darwin-arm64": "1.89.0", + "@oxlint/binding-darwin-x64": "1.89.0", + "@oxlint/binding-freebsd-x64": "1.89.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.89.0", + "@oxlint/binding-linux-arm-musleabihf": "1.89.0", + "@oxlint/binding-linux-arm64-gnu": "1.89.0", + "@oxlint/binding-linux-arm64-musl": "1.89.0", + "@oxlint/binding-linux-ppc64-gnu": "1.89.0", + "@oxlint/binding-linux-riscv64-gnu": "1.89.0", + "@oxlint/binding-linux-riscv64-musl": "1.89.0", + "@oxlint/binding-linux-s390x-gnu": "1.89.0", + "@oxlint/binding-linux-x64-gnu": "1.89.0", + "@oxlint/binding-linux-x64-musl": "1.89.0", + "@oxlint/binding-openharmony-arm64": "1.89.0", + "@oxlint/binding-win32-arm64-msvc": "1.89.0", + "@oxlint/binding-win32-ia32-msvc": "1.89.0", + "@oxlint/binding-win32-x64-msvc": "1.89.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2003", + "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==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", + "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", + "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/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "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-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/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "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==", + "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==", + "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==", + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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==", + "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" + ], + "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" + ], + "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/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==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-components": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.6.0.tgz", + "integrity": "sha512-drKKsqvDBxVRn4ySU67iQ5nQBuo/1xyYeBfdhDde112PkqrS3+95KPnpDs5hFRcmrW+q6+gbyywYYYR14oWFtw==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "@types/stylis": "4.2.7", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "stylis": "4.3.6" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "css-to-react-native": ">= 3.2.0", + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-native": ">= 0.68.0" + }, + "peerDependenciesMeta": { + "css-to-react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "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==", + "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.0", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.1.0.tgz", + "integrity": "sha512-1LMf/x0kU0CKFSesh5DfYktvj1KhiqYi5LAh5HU2G4SkKk1TGDhsMFBOL47g/E+mNfYpgs365pVNlIYOIHPvlQ==", + "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==", + "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==", + "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==", + "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/tag34/04_reusable-components/package.json b/06_react/unterricht/tag34/04_reusable-components/package.json new file mode 100644 index 0000000..08d54f9 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/package.json @@ -0,0 +1,27 @@ +{ + "name": "04_reusable-components", + "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-icons": "^5.7.0", + "sass-embedded": "^1.106.1", + "styled-components": "^6.6.0" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "oxlint": "^1.88.0", + "vite": "^8.3.4" + } +} diff --git a/06_react/unterricht/tag34/04_reusable-components/public/favicon.svg b/06_react/unterricht/tag34/04_reusable-components/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/unterricht/tag34/04_reusable-components/public/icons.svg b/06_react/unterricht/tag34/04_reusable-components/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06_react/unterricht/tag34/04_reusable-components/src/App.jsx b/06_react/unterricht/tag34/04_reusable-components/src/App.jsx new file mode 100644 index 0000000..2161d04 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/App.jsx @@ -0,0 +1,18 @@ +import Button from './components/buttons/Button'; + +function App(props) { + // const { } = props; + + return ( +
+

Reusable Components

+
+ +
+ +
+ +
+ ); +} +export default App; diff --git a/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.css b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.css new file mode 100644 index 0000000..9765d3f --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.css @@ -0,0 +1,15 @@ +.btn-custom { + background-color: #f0f0f0; + color: #333; + border: 1px solid #ccc; + padding: 8px 16px; + border-radius: 0px; + margin: 3px; +} + +.btn-custom:hover, +.btn-custom:focus { + background-color: #e0e0e0; + color: #333; + border: 1px solid #ccc; +} diff --git a/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.jsx b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.jsx new file mode 100644 index 0000000..539528d --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.jsx @@ -0,0 +1,45 @@ +// CSS oder SCSS Import +//import './Button.css'; +//import './Button.scss'; + +// CSS Module Import +// import styles from './Button.module.css'; + +// import von Modul, welches SFC (Single File Component) ermöglicht. +// import styled from 'styled-components'; + +// const StyledButton = styled.button` +// color: #333; +// border: 1px solid #ccc; +// padding: 8px 16px; +// border-radius: 0px; +// margin: 3px; +// background-color: ${(props) => props.bgColor || '#f0f0f0'}; +// &:hover, +// &:focus { +// background-color: #e0e0e0; +// color: #333; +// border: 1px solid #ccc; +// } +// `; + +const Button = (props) => { + const { variant = 'secondary', children } = props; + + // component logic... + + return ; + + // Styled Component (SFC) + // return {children || 'Click Me'}; + + // CSS Module Import + // return ; + + // CSS import + // return ; + + // CSS Klassenzuweisung (classic) + // return ; +}; +export default Button; diff --git a/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.module.css b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.module.css new file mode 100644 index 0000000..9765d3f --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.module.css @@ -0,0 +1,15 @@ +.btn-custom { + background-color: #f0f0f0; + color: #333; + border: 1px solid #ccc; + padding: 8px 16px; + border-radius: 0px; + margin: 3px; +} + +.btn-custom:hover, +.btn-custom:focus { + background-color: #e0e0e0; + color: #333; + border: 1px solid #ccc; +} diff --git a/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.scss b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.scss new file mode 100644 index 0000000..d5fd70e --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/components/buttons/Button.scss @@ -0,0 +1,14 @@ +.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/tag34/04_reusable-components/src/main.jsx b/06_react/unterricht/tag34/04_reusable-components/src/main.jsx new file mode 100644 index 0000000..1d66d55 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/main.jsx @@ -0,0 +1,14 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +// CSS Bootstrap +// import 'bootstrap/dist/css/bootstrap.min.css'; +import './styles/main.scss'; + +import App from './App.jsx'; + +createRoot(document.getElementById('root')).render( + + + , +); diff --git a/06_react/unterricht/tag34/04_reusable-components/src/styles/01_frameworks/_index.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..42edceb --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss new file mode 100644 index 0000000..f46eba2 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/02_fonts/_index.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_index.scss new file mode 100644 index 0000000..d377888 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/02_fonts/_lato-v25-latin.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_lato-v25-latin.scss new file mode 100644 index 0000000..522cfda --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/02_fonts/_source-sans-3-v19-latin.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/02_fonts/_source-sans-3-v19-latin.scss new file mode 100644 index 0000000..b732c16 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/03_base/_colors.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_colors.scss new file mode 100644 index 0000000..a550f3d --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/03_base/_index.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_index.scss new file mode 100644 index 0000000..aaf4e12 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/03_base/_theme.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_theme.scss new file mode 100644 index 0000000..1c7e05a --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_theme.scss @@ -0,0 +1,32 @@ +@use 'typography' as *; + +// Allgemeine Formatierung +*, +html { + box-sizing: border-box; +} + +html, +body { + height: 100%; +} + +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/tag34/04_reusable-components/src/styles/03_base/_typography.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/03_base/_typography.scss new file mode 100644 index 0000000..7c9b095 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/04_plugins/_index.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/04_plugins/_index.scss new file mode 100644 index 0000000..bd5ba6a --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/04_plugins/toastify-1.12/_toastify.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/04_plugins/toastify-1.12/_toastify.scss new file mode 100644 index 0000000..e359a14 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/05_modules/_button.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_button.scss new file mode 100644 index 0000000..1660f6b --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/05_modules/_chuck-norris-joke.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_chuck-norris-joke.scss new file mode 100644 index 0000000..232b479 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/05_modules/_header-main.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_header-main.scss new file mode 100644 index 0000000..cb67561 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_header-main.scss @@ -0,0 +1,15 @@ +.header-main { + width: 100%; + height: 400px; + + // https://cssreference.io/property/background/ + background: black 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/tag34/04_reusable-components/src/styles/05_modules/_index.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_index.scss new file mode 100644 index 0000000..a508513 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_index.scss @@ -0,0 +1,6 @@ +@forward 'button'; +// @forward 'chuck-norris-joke'; +// @forward 'header-main'; +// @forward 'logo-main'; +// @forward 'menu-main'; +// @forward 'product-manager'; diff --git a/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_logo-main.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_logo-main.scss new file mode 100644 index 0000000..399bd12 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/05_modules/_menu-main.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_menu-main.scss new file mode 100644 index 0000000..df4627e --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/05_modules/_product-manager.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/05_modules/_product-manager.scss new file mode 100644 index 0000000..4f3ed4d --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/src/styles/main.scss b/06_react/unterricht/tag34/04_reusable-components/src/styles/main.scss new file mode 100644 index 0000000..297e74f --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/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/tag34/04_reusable-components/vite.config.js b/06_react/unterricht/tag34/04_reusable-components/vite.config.js new file mode 100644 index 0000000..9982072 --- /dev/null +++ b/06_react/unterricht/tag34/04_reusable-components/vite.config.js @@ -0,0 +1,7 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +})