From 72ee23c15892d60e5e1d57050066f8756e342d62 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Fri, 23 Oct 2026 11:21:52 +0200 Subject: [PATCH] --- .../tag34/04_reusable-components.zip | Bin 28656 -> 0 bytes .../tag35/01_reusable-components/.gitignore | 24 +++ .../01_reusable-components/.oxlintrc.json | 8 + .../tag35/01_reusable-components/README.md | 16 ++ .../tag35/01_reusable-components/index.html | 13 ++ .../01_reusable-components}/package-lock.json | 68 +++++++-- .../tag35/01_reusable-components/package.json | 27 ++++ .../01_reusable-components/public/favicon.svg | 1 + .../01_reusable-components/public/icons.svg | 24 +++ .../public/logo-js.min.svg | 8 + .../tag35/01_reusable-components/src/App.jsx | 25 +++ .../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 ++ .../src/components/headers/HeaderMain.jsx | 12 ++ .../src/components/icons/Logo.jsx | 48 ++++++ .../src/components/inputs/InputAmount.jsx | 26 ++++ .../src/components/logos/LogoMain.jsx | 15 ++ .../tag35/01_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 | 7 + .../src/styles/05_modules/_input-amount.scss | 27 ++++ .../src/styles/05_modules/_logo-main.scss | 21 +++ .../src/styles/05_modules/_menu-main.scss | 20 +++ .../styles/05_modules/_product-manager.scss | 47 ++++++ .../src/styles/main.scss | 13 ++ .../01_reusable-components/vite.config.js | 15 ++ 41 files changed, 1025 insertions(+), 10 deletions(-) delete mode 100644 06_react/unterricht/tag34/04_reusable-components.zip create mode 100644 06_react/unterricht/tag35/01_reusable-components/.gitignore create mode 100644 06_react/unterricht/tag35/01_reusable-components/.oxlintrc.json create mode 100644 06_react/unterricht/tag35/01_reusable-components/README.md create mode 100644 06_react/unterricht/tag35/01_reusable-components/index.html rename 06_react/unterricht/{tag34/04_reusable-components => tag35/01_reusable-components}/package-lock.json (98%) create mode 100644 06_react/unterricht/tag35/01_reusable-components/package.json create mode 100644 06_react/unterricht/tag35/01_reusable-components/public/favicon.svg create mode 100644 06_react/unterricht/tag35/01_reusable-components/public/icons.svg create mode 100644 06_react/unterricht/tag35/01_reusable-components/public/logo-js.min.svg create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/App.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.css create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.module.css create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/headers/HeaderMain.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/icons/Logo.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/inputs/InputAmount.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/components/logos/LogoMain.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/main.jsx create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/01_frameworks/_index.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_index.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_lato-v25-latin.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_colors.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_index.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_theme.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_typography.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/04_plugins/_index.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_button.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_chuck-norris-joke.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_header-main.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_index.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_input-amount.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_logo-main.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_menu-main.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_product-manager.scss create mode 100644 06_react/unterricht/tag35/01_reusable-components/src/styles/main.scss create mode 100644 06_react/unterricht/tag35/01_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 deleted file mode 100644 index d397089b77c353d2000f0833815e21291008201a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28656 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 diff --git a/06_react/unterricht/tag35/01_reusable-components/.gitignore b/06_react/unterricht/tag35/01_reusable-components/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/.oxlintrc.json b/06_react/unterricht/tag35/01_reusable-components/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/README.md b/06_react/unterricht/tag35/01_reusable-components/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/index.html b/06_react/unterricht/tag35/01_reusable-components/index.html new file mode 100644 index 0000000..196c435 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/package-lock.json similarity index 98% rename from 06_react/unterricht/tag34/04_reusable-components/package-lock.json rename to 06_react/unterricht/tag35/01_reusable-components/package-lock.json index 7b8c3b0..68ea610 100644 --- a/06_react/unterricht/tag34/04_reusable-components/package-lock.json +++ b/06_react/unterricht/tag35/01_reusable-components/package-lock.json @@ -1,32 +1,33 @@ { - "name": "04_reusable-components", - "version": "0.0.0", + "name": "reusable-components", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "04_reusable-components", - "version": "0.0.0", + "name": "reusable-components", + "version": "0.1.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" + "oxlint": "^1.89.0", + "sass-embedded": "^1.106.1", + "vite": "^8.3.5" } }, "node_modules/@bufbuild/protobuf": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.16.0.tgz", "integrity": "sha512-FWa0sPlqYGJgpTs6OxBRcL/AW4JT0OIO+W1ajerluoTVh8CV0B7XM1qsNCRgnkSCkRCgOICKHRQlY17jrsm0+Q==", + "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@emotion/is-prop-valid": { @@ -405,6 +406,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -443,6 +445,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -463,6 +466,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -483,6 +487,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -503,6 +508,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -523,6 +529,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": [ "glibc" ], @@ -546,6 +553,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": [ "musl" ], @@ -569,6 +577,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -592,6 +601,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -615,6 +625,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -638,6 +649,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -661,6 +673,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -681,6 +694,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1073,6 +1087,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1089,6 +1104,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", + "dev": true, "license": "MIT", "funding": { "type": "opencollective", @@ -1125,7 +1141,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8" @@ -1168,6 +1184,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1177,12 +1194,14 @@ "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, "license": "MIT" }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -1193,6 +1212,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1498,6 +1518,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, "license": "MIT", "optional": true }, @@ -1561,7 +1582,7 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -1639,6 +1660,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -1687,6 +1709,7 @@ "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -1696,6 +1719,7 @@ "version": "1.106.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.106.1.tgz", "integrity": "sha512-kD+Gi66vycZcbJt+42NC4z4PXNMcCajVrJPhqoKKXy5cOBMmJQt052CxIBcRjwYXeImHYOpu/ydWWGZQIenl7A==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1717,6 +1741,7 @@ "version": "1.106.1", "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.106.1.tgz", "integrity": "sha512-OoaTjMm7PcQnCo/AZNSKM/KdAeaX57edhmOp2bH8hcGNph2VDIg404gOSMZxGKNL+lbc7Ng0S/IYLAbs0YmgfA==", + "dev": true, "license": "MIT", "dependencies": { "@bufbuild/protobuf": "^2.5.0", @@ -1764,6 +1789,7 @@ "!riscv64", "!x64" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1777,6 +1803,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1793,6 +1820,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1809,6 +1837,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1825,6 +1854,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1841,6 +1871,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1857,6 +1888,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1873,6 +1905,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": "glibc", "license": "MIT", "optional": true, @@ -1890,6 +1923,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": "glibc", "license": "MIT", "optional": true, @@ -1907,6 +1941,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": "musl", "license": "MIT", "optional": true, @@ -1924,6 +1959,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": "musl", "license": "MIT", "optional": true, @@ -1941,6 +1977,7 @@ "cpu": [ "riscv64" ], + "dev": true, "libc": "musl", "license": "MIT", "optional": true, @@ -1958,6 +1995,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": "musl", "license": "MIT", "optional": true, @@ -1975,6 +2013,7 @@ "cpu": [ "riscv64" ], + "dev": true, "libc": "glibc", "license": "MIT", "optional": true, @@ -1992,6 +2031,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": "glibc", "license": "MIT", "optional": true, @@ -2006,6 +2046,7 @@ "version": "1.106.1", "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.106.1.tgz", "integrity": "sha512-uaeOeGCaHnhqpfZnjy5wGMcuyYbnDyXhzWCniGctqCj/Inlst4eDZaweowo+sJLExRvmToBhQ8seZyEvfGMQ4g==", + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2025,6 +2066,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2041,6 +2083,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2060,7 +2103,7 @@ "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, + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -2113,6 +2156,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -2128,6 +2172,7 @@ "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==", + "dev": true, "license": "MIT", "dependencies": { "sync-message-port": "^1.0.0" @@ -2140,6 +2185,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "dev": true, "license": "MIT", "engines": { "node": ">=16.0.0" @@ -2166,12 +2212,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, "license": "MIT" }, "node_modules/vite": { diff --git a/06_react/unterricht/tag35/01_reusable-components/package.json b/06_react/unterricht/tag35/01_reusable-components/package.json new file mode 100644 index 0000000..7a728d4 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/package.json @@ -0,0 +1,27 @@ +{ + "name": "reusable-components", + "private": true, + "version": "0.1.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", + "styled-components": "^6.6.0" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "sass-embedded": "^1.106.1", + "oxlint": "^1.89.0", + "vite": "^8.3.5" + } +} diff --git a/06_react/unterricht/tag35/01_reusable-components/public/favicon.svg b/06_react/unterricht/tag35/01_reusable-components/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/unterricht/tag35/01_reusable-components/public/icons.svg b/06_react/unterricht/tag35/01_reusable-components/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06_react/unterricht/tag35/01_reusable-components/public/logo-js.min.svg b/06_react/unterricht/tag35/01_reusable-components/public/logo-js.min.svg new file mode 100644 index 0000000..4acd335 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/public/logo-js.min.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/06_react/unterricht/tag35/01_reusable-components/src/App.jsx b/06_react/unterricht/tag35/01_reusable-components/src/App.jsx new file mode 100644 index 0000000..b835297 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/App.jsx @@ -0,0 +1,25 @@ +import Button from './components/buttons/Button'; +import HeaderMain from './components/headers/HeaderMain'; +import InputAmount from './components/inputs/InputAmount'; + +function App(props) { + // const { } = props; + + return ( + <> + +
+

Reusable Components

+ + +
+ +
+ +
+ +
+ + ); +} +export default App; diff --git a/06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.css b/06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.css new file mode 100644 index 0000000..9765d3f --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/components/buttons/Button.jsx b/06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.jsx new file mode 100644 index 0000000..539528d --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/components/buttons/Button.module.css b/06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.module.css new file mode 100644 index 0000000..9765d3f --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/components/buttons/Button.scss b/06_react/unterricht/tag35/01_reusable-components/src/components/buttons/Button.scss new file mode 100644 index 0000000..d5fd70e --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/components/headers/HeaderMain.jsx b/06_react/unterricht/tag35/01_reusable-components/src/components/headers/HeaderMain.jsx new file mode 100644 index 0000000..acbddb2 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/components/headers/HeaderMain.jsx @@ -0,0 +1,12 @@ +import LogoMain from '../logos/LogoMain'; + +const HeaderMain = () => { + return ( +
+
+ +
+
+ ); +}; +export default HeaderMain; diff --git a/06_react/unterricht/tag35/01_reusable-components/src/components/icons/Logo.jsx b/06_react/unterricht/tag35/01_reusable-components/src/components/icons/Logo.jsx new file mode 100644 index 0000000..dd3b6f0 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/components/icons/Logo.jsx @@ -0,0 +1,48 @@ +const Logo = () => { + return ( + + + + + + + + + ); +}; +export default Logo; diff --git a/06_react/unterricht/tag35/01_reusable-components/src/components/inputs/InputAmount.jsx b/06_react/unterricht/tag35/01_reusable-components/src/components/inputs/InputAmount.jsx new file mode 100644 index 0000000..652c779 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/components/inputs/InputAmount.jsx @@ -0,0 +1,26 @@ +import { FaMinus, FaPlus } from 'react-icons/fa6'; + +const InputAmount = (props) => { + // const { } = props; + + return ( +
+
+ + + + + + + +
+
+ ); +}; +export default InputAmount; diff --git a/06_react/unterricht/tag35/01_reusable-components/src/components/logos/LogoMain.jsx b/06_react/unterricht/tag35/01_reusable-components/src/components/logos/LogoMain.jsx new file mode 100644 index 0000000..2649b9e --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/components/logos/LogoMain.jsx @@ -0,0 +1,15 @@ +import Logo from '../icons/Logo'; + +// import Logo from '/logo-js.min.svg'; +const LogoMain = (props) => { + // const { } = props; + + return ( +
+ {/* JS Course */} + +
Firmen Slogan
+
+ ); +}; +export default LogoMain; diff --git a/06_react/unterricht/tag35/01_reusable-components/src/main.jsx b/06_react/unterricht/tag35/01_reusable-components/src/main.jsx new file mode 100644 index 0000000..1d66d55 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/01_frameworks/_index.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..42edceb --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss new file mode 100644 index 0000000..f46eba2 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/02_fonts/_index.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_index.scss new file mode 100644 index 0000000..d377888 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/02_fonts/_lato-v25-latin.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/02_fonts/_lato-v25-latin.scss new file mode 100644 index 0000000..522cfda --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/02_fonts/_source-sans-3-v19-latin.scss b/06_react/unterricht/tag35/01_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/tag35/01_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/tag35/01_reusable-components/src/styles/03_base/_colors.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_colors.scss new file mode 100644 index 0000000..a550f3d --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/03_base/_index.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_index.scss new file mode 100644 index 0000000..aaf4e12 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/03_base/_theme.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_theme.scss new file mode 100644 index 0000000..1c7e05a --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/03_base/_typography.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/03_base/_typography.scss new file mode 100644 index 0000000..7c9b095 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/04_plugins/_index.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/04_plugins/_index.scss new file mode 100644 index 0000000..bd5ba6a --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/04_plugins/toastify-1.12/_toastify.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/04_plugins/toastify-1.12/_toastify.scss new file mode 100644 index 0000000..e359a14 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/05_modules/_button.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_button.scss new file mode 100644 index 0000000..1660f6b --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/05_modules/_chuck-norris-joke.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_chuck-norris-joke.scss new file mode 100644 index 0000000..232b479 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/05_modules/_header-main.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_header-main.scss new file mode 100644 index 0000000..2884477 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_header-main.scss @@ -0,0 +1,15 @@ +.m-header-main { + width: 100%; + height: 400px; + + // https://cssreference.io/property/background/ + background: #efefef url('../../assets/img/header-bg.webp') center no-repeat border-box; + background-size: cover; + + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + border: 20px solid rgba(white, 0.25); +} diff --git a/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_index.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_index.scss new file mode 100644 index 0000000..594a29d --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_index.scss @@ -0,0 +1,7 @@ +@forward 'button'; +// @forward 'chuck-norris-joke'; +@forward 'header-main'; +@forward 'input-amount'; +@forward 'logo-main'; +// @forward 'menu-main'; +// @forward 'product-manager'; diff --git a/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_input-amount.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_input-amount.scss new file mode 100644 index 0000000..8701a7c --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_input-amount.scss @@ -0,0 +1,27 @@ +.m-input-amount { + .input-group { + .input-group-text { + padding: 0; + display: inline-block; + overflow: hidden; + button { + border-radius: 0; + } + } + input { + max-width: 85px; + text-align: center; + } + /* Für Chrome, Safari, Edge und Opera */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Für Firefox */ + input[type='number'] { + appearance: textfield; + } + } +} diff --git a/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_logo-main.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_logo-main.scss new file mode 100644 index 0000000..399bd12 --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/05_modules/_menu-main.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_menu-main.scss new file mode 100644 index 0000000..df4627e --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/05_modules/_product-manager.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/05_modules/_product-manager.scss new file mode 100644 index 0000000..4f3ed4d --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/src/styles/main.scss b/06_react/unterricht/tag35/01_reusable-components/src/styles/main.scss new file mode 100644 index 0000000..297e74f --- /dev/null +++ b/06_react/unterricht/tag35/01_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/tag35/01_reusable-components/vite.config.js b/06_react/unterricht/tag35/01_reusable-components/vite.config.js new file mode 100644 index 0000000..24ad103 --- /dev/null +++ b/06_react/unterricht/tag35/01_reusable-components/vite.config.js @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + css: { + preprocessorOptions: { + scss: { + quietDeps: true, // Unix + silenceDeprecations: ['color-functions', 'global-builtin', 'import', 'legacy-js-api', 'if-function'], + }, + }, + }, +});