From 3188718f5e923235348330702558721d465bae77 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Wed, 12 Aug 2026 09:54:03 +0200 Subject: [PATCH] --- 05_react/uebungen/u17_validator.zip | Bin 0 -> 286639 bytes 05_react/uebungen/u17_validator/.gitignore | 24 + .../uebungen/u17_validator/.oxlintrc.json | 8 + 05_react/uebungen/u17_validator/README.md | 16 + 05_react/uebungen/u17_validator/index.html | 14 + .../uebungen/u17_validator/package-lock.json | 2237 +++++++++++++++++ 05_react/uebungen/u17_validator/package.json | 27 + .../uebungen/u17_validator/public/favicon.svg | 1 + .../uebungen/u17_validator/public/icons.svg | 24 + 05_react/uebungen/u17_validator/src/App.jsx | 19 + .../u17_validator/src/assets/hero.png | Bin 0 -> 13057 bytes .../u17_validator/src/assets/react.svg | 1 + .../u17_validator/src/assets/vite.svg | 1 + .../src/components/common/Badge.jsx | 11 + .../src/components/forms/FormContact.jsx | 141 ++ .../src/components/navs/Navbar.jsx | 44 + 05_react/uebungen/u17_validator/src/main.jsx | 21 + .../u17_validator/src/pages/AboutPage.jsx | 34 + .../u17_validator/src/pages/ContactPage.jsx | 32 + .../u17_validator/src/pages/HomePage.jsx | 10 + .../u17_validator/src/pages/UserPage.jsx | 25 + .../src/pages/UserProfilePage.jsx | 18 + .../u17_validator/src/routes/Router.jsx | 61 + .../src/styles/01_frameworks/_index.scss | 3 + .../bootstrap-5.3.8/_accordion.scss | 153 ++ .../01_frameworks/bootstrap-5.3.8/_alert.scss | 68 + .../01_frameworks/bootstrap-5.3.8/_badge.scss | 38 + .../bootstrap-5.3.8/_breadcrumb.scss | 40 + .../bootstrap-5.3.8/_button-group.scss | 147 ++ .../bootstrap-5.3.8/_buttons.scss | 216 ++ .../01_frameworks/bootstrap-5.3.8/_card.scss | 238 ++ .../bootstrap-5.3.8/_carousel.scss | 226 ++ .../01_frameworks/bootstrap-5.3.8/_close.scss | 66 + .../bootstrap-5.3.8/_containers.scss | 41 + .../bootstrap-5.3.8/_dropdown.scss | 250 ++ .../01_frameworks/bootstrap-5.3.8/_forms.scss | 9 + .../bootstrap-5.3.8/_functions.scss | 302 +++ .../01_frameworks/bootstrap-5.3.8/_grid.scss | 39 + .../bootstrap-5.3.8/_helpers.scss | 12 + .../bootstrap-5.3.8/_images.scss | 42 + .../bootstrap-5.3.8/_list-group.scss | 199 ++ .../01_frameworks/bootstrap-5.3.8/_maps.scss | 174 ++ .../bootstrap-5.3.8/_mixins.scss | 42 + .../01_frameworks/bootstrap-5.3.8/_modal.scss | 240 ++ .../01_frameworks/bootstrap-5.3.8/_nav.scss | 197 ++ .../bootstrap-5.3.8/_navbar.scss | 289 +++ .../bootstrap-5.3.8/_offcanvas.scss | 147 ++ .../bootstrap-5.3.8/_pagination.scss | 109 + .../bootstrap-5.3.8/_placeholders.scss | 51 + .../bootstrap-5.3.8/_popover.scss | 196 ++ .../bootstrap-5.3.8/_progress.scss | 68 + .../bootstrap-5.3.8/_reboot.scss | 617 +++++ .../01_frameworks/bootstrap-5.3.8/_root.scss | 187 ++ .../bootstrap-5.3.8/_spinners.scss | 86 + .../bootstrap-5.3.8/_tables.scss | 171 ++ .../bootstrap-5.3.8/_toasts.scss | 73 + .../bootstrap-5.3.8/_tooltip.scss | 119 + .../bootstrap-5.3.8/_transitions.scss | 27 + .../01_frameworks/bootstrap-5.3.8/_type.scss | 106 + .../bootstrap-5.3.8/_utilities.scss | 806 ++++++ .../bootstrap-5.3.8/_variables-dark.scss | 102 + .../bootstrap-5.3.8/_variables.scss | 1753 +++++++++++++ .../bootstrap-5.3.8/bootstrap-grid.scss | 62 + .../bootstrap-5.3.8/bootstrap-reboot.scss | 10 + .../bootstrap-5.3.8/bootstrap-utilities.scss | 19 + .../bootstrap-5.3.8/bootstrap.scss | 52 + .../forms/_floating-labels.scss | 97 + .../bootstrap-5.3.8/forms/_form-check.scss | 189 ++ .../bootstrap-5.3.8/forms/_form-control.scss | 214 ++ .../bootstrap-5.3.8/forms/_form-range.scss | 91 + .../bootstrap-5.3.8/forms/_form-select.scss | 80 + .../bootstrap-5.3.8/forms/_form-text.scss | 11 + .../bootstrap-5.3.8/forms/_input-group.scss | 132 + .../bootstrap-5.3.8/forms/_labels.scss | 36 + .../bootstrap-5.3.8/forms/_validation.scss | 12 + .../bootstrap-5.3.8/helpers/_clearfix.scss | 3 + .../bootstrap-5.3.8/helpers/_color-bg.scss | 7 + .../helpers/_colored-links.scss | 30 + .../bootstrap-5.3.8/helpers/_focus-ring.scss | 5 + .../bootstrap-5.3.8/helpers/_icon-link.scss | 25 + .../bootstrap-5.3.8/helpers/_position.scss | 36 + .../bootstrap-5.3.8/helpers/_ratio.scss | 26 + .../bootstrap-5.3.8/helpers/_stacks.scss | 15 + .../helpers/_stretched-link.scss | 15 + .../helpers/_text-truncation.scss | 7 + .../helpers/_visually-hidden.scss | 8 + .../bootstrap-5.3.8/helpers/_vr.scss | 8 + .../bootstrap-5.3.8/mixins/_alert.scss | 18 + .../bootstrap-5.3.8/mixins/_backdrop.scss | 14 + .../bootstrap-5.3.8/mixins/_banner.scss | 7 + .../mixins/_border-radius.scss | 78 + .../bootstrap-5.3.8/mixins/_box-shadow.scss | 24 + .../bootstrap-5.3.8/mixins/_breakpoints.scss | 127 + .../bootstrap-5.3.8/mixins/_buttons.scss | 70 + .../bootstrap-5.3.8/mixins/_caret.scss | 69 + .../bootstrap-5.3.8/mixins/_clearfix.scss | 9 + .../bootstrap-5.3.8/mixins/_color-mode.scss | 21 + .../bootstrap-5.3.8/mixins/_color-scheme.scss | 7 + .../bootstrap-5.3.8/mixins/_container.scss | 11 + .../bootstrap-5.3.8/mixins/_deprecate.scss | 10 + .../bootstrap-5.3.8/mixins/_forms.scss | 163 ++ .../bootstrap-5.3.8/mixins/_gradients.scss | 47 + .../bootstrap-5.3.8/mixins/_grid.scss | 151 ++ .../bootstrap-5.3.8/mixins/_image.scss | 16 + .../bootstrap-5.3.8/mixins/_list-group.scss | 26 + .../bootstrap-5.3.8/mixins/_lists.scss | 7 + .../bootstrap-5.3.8/mixins/_pagination.scss | 10 + .../bootstrap-5.3.8/mixins/_reset-text.scss | 17 + .../bootstrap-5.3.8/mixins/_resize.scss | 6 + .../mixins/_table-variants.scss | 24 + .../mixins/_text-truncate.scss | 8 + .../bootstrap-5.3.8/mixins/_transition.scss | 26 + .../bootstrap-5.3.8/mixins/_utilities.scss | 97 + .../mixins/_visually-hidden.scss | 38 + .../bootstrap-5.3.8/tests/jasmine.js | 16 + .../_auto-import-of-variables-dark.test.scss | 7 + .../tests/mixins/_box-shadow.test.scss | 188 ++ .../tests/mixins/_color-contrast.test.scss | 139 + .../tests/mixins/_color-modes.test.scss | 69 + .../_media-query-color-mode-full.test.scss | 8 + .../tests/mixins/_utilities.test.scss | 393 +++ .../tests/sass-true/register.js | 14 + .../bootstrap-5.3.8/tests/sass-true/runner.js | 17 + .../tests/utilities/_api.test.scss | 75 + .../bootstrap-5.3.8/utilities/_api.scss | 47 + .../bootstrap-5.3.8/vendor/_rfs.scss | 348 +++ .../01_frameworks/bulma-1.04/_index.scss | 10 + .../01_frameworks/bulma-1.04/base/_index.scss | 6 + .../bulma-1.04/base/animations.scss | 15 + .../bulma-1.04/base/generic.scss | 240 ++ .../bulma-1.04/base/minireset.scss | 92 + .../bulma-1.04/base/skeleton.scss | 114 + .../bulma-1.04/components/_index.scss | 13 + .../bulma-1.04/components/breadcrumb.scss | 139 + .../bulma-1.04/components/card.scss | 162 ++ .../bulma-1.04/components/dropdown.scss | 188 ++ .../bulma-1.04/components/menu.scss | 165 ++ .../bulma-1.04/components/message.scss | 183 ++ .../bulma-1.04/components/modal.scss | 164 ++ .../bulma-1.04/components/navbar.scss | 799 ++++++ .../bulma-1.04/components/pagination.scss | 379 +++ .../bulma-1.04/components/panel.scss | 218 ++ .../bulma-1.04/components/tabs.scss | 273 ++ .../bulma-1.04/elements/_index.scss | 16 + .../bulma-1.04/elements/block.scss | 6 + .../bulma-1.04/elements/box.scss | 59 + .../bulma-1.04/elements/button.scss | 659 +++++ .../bulma-1.04/elements/content.scss | 289 +++ .../bulma-1.04/elements/delete.scss | 6 + .../bulma-1.04/elements/icon.scss | 67 + .../bulma-1.04/elements/image.scss | 64 + .../bulma-1.04/elements/loader.scss | 15 + .../bulma-1.04/elements/notification.scss | 105 + .../bulma-1.04/elements/progress.scss | 115 + .../bulma-1.04/elements/table.scss | 261 ++ .../bulma-1.04/elements/tag.scss | 219 ++ .../bulma-1.04/elements/title.scss | 130 + .../01_frameworks/bulma-1.04/form/_index.scss | 9 + .../bulma-1.04/form/checkbox-radio.scss | 36 + .../01_frameworks/bulma-1.04/form/file.scss | 330 +++ .../bulma-1.04/form/input-textarea.scss | 115 + .../01_frameworks/bulma-1.04/form/select.scss | 144 ++ .../01_frameworks/bulma-1.04/form/shared.scss | 178 ++ .../01_frameworks/bulma-1.04/form/tools.scss | 352 +++ .../01_frameworks/bulma-1.04/grid/_index.scss | 5 + .../bulma-1.04/grid/columns.scss | 961 +++++++ .../01_frameworks/bulma-1.04/grid/grid.scss | 209 ++ .../bulma-1.04/helpers/_index.scss | 15 + .../bulma-1.04/helpers/aspect-ratio.scss | 12 + .../bulma-1.04/helpers/border.scss | 15 + .../bulma-1.04/helpers/color.scss | 344 +++ .../bulma-1.04/helpers/flexbox.scss | 62 + .../bulma-1.04/helpers/float.scss | 28 + .../01_frameworks/bulma-1.04/helpers/gap.scss | 24 + .../bulma-1.04/helpers/other.scss | 19 + .../bulma-1.04/helpers/overflow.scss | 21 + .../bulma-1.04/helpers/position.scss | 19 + .../bulma-1.04/helpers/spacing.scss | 64 + .../bulma-1.04/helpers/typography.scss | 174 ++ .../bulma-1.04/helpers/visibility.scss | 221 ++ .../bulma-1.04/layout/_index.scss | 9 + .../bulma-1.04/layout/container.scss | 59 + .../bulma-1.04/layout/footer.scss | 23 + .../01_frameworks/bulma-1.04/layout/hero.scss | 273 ++ .../bulma-1.04/layout/level.scss | 107 + .../bulma-1.04/layout/media.scss | 106 + .../bulma-1.04/layout/section.scss | 38 + .../bulma-1.04/themes/_index.scss | 36 + .../01_frameworks/bulma-1.04/themes/dark.scss | 57 + .../bulma-1.04/themes/light.scss | 147 ++ .../bulma-1.04/themes/setup.scss | 174 ++ .../bulma-1.04/utilities/_index.scss | 7 + .../bulma-1.04/utilities/controls.scss | 85 + .../bulma-1.04/utilities/css-variables.scss | 502 ++++ .../utilities/derived-variables.scss | 112 + .../bulma-1.04/utilities/extends.scss | 34 + .../bulma-1.04/utilities/functions.scss | 310 +++ .../utilities/initial-variables.scss | 157 ++ .../bulma-1.04/utilities/mixins.scss | 462 ++++ .../src/styles/02_fonts/_index.scss | 3 + .../02_fonts/_playfair-display-v40-latin.scss | 96 + .../02_fonts/_source-sans-3-v19-latin.scss | 134 + .../src/styles/03_base/_colors.scss | 12 + .../src/styles/03_base/_index.scss | 5 + .../src/styles/03_base/_theme.scss | 46 + .../src/styles/03_base/_typography.scss | 9 + .../src/styles/03_base/_utils.scss | 0 .../src/styles/03_base/_variables.scss | 0 .../src/styles/04_plugins/_index.scss | 4 + .../core/foundation/animations.scss | 9 + .../04_plugins/splide-4.1.4/core/index.scss | 3 + .../core/object/modifiers/draggable.scss | 8 + .../core/object/modifiers/fade.scss | 18 + .../core/object/modifiers/index.scss | 4 + .../core/object/modifiers/rtl.scss | 5 + .../core/object/modifiers/ttb.scss | 9 + .../core/object/objects/container.scss | 6 + .../core/object/objects/index.scss | 10 + .../core/object/objects/list.scss | 17 + .../core/object/objects/pagination.scss | 26 + .../core/object/objects/progress.scss | 7 + .../core/object/objects/root.scss | 9 + .../core/object/objects/slide.scss | 14 + .../core/object/objects/spinner.scss | 21 + .../splide-4.1.4/core/object/objects/sr.scss | 12 + .../core/object/objects/toggle.scss | 22 + .../core/object/objects/track.scss | 7 + .../template/default/foundation/colors.scss | 8 + .../template/default/foundation/mixins.scss | 27 + .../splide-4.1.4/template/default/index.scss | 13 + .../default/object/modifiers/index.scss | 3 + .../default/object/modifiers/nav.scss | 37 + .../default/object/modifiers/rtl.scss | 28 + .../default/object/modifiers/ttb.scss | 54 + .../default/object/objects/arrow.scss | 105 + .../default/object/objects/index.scss | 5 + .../default/object/objects/pagination.scss | 80 + .../default/object/objects/progress.scss | 13 + .../default/object/objects/slide.scss | 42 + .../default/object/objects/toggle.scss | 19 + .../splide-4.1.4/themes/default/index.scss | 1 + .../splide-4.1.4/themes/sea-green/index.scss | 52 + .../sea-green/object/objects/arrow.scss | 17 + .../sea-green/object/objects/index.scss | 3 + .../themes/sea-green/object/objects/root.scss | 3 + .../splide-4.1.4/themes/skyblue/index.scss | 37 + .../04_plugins/toastify-1.12/_toastify.scss | 88 + .../src/styles/05_modules/_button.scss | 13 + .../src/styles/05_modules/_footer-main.scss | 37 + .../src/styles/05_modules/_header-main.scss | 83 + .../src/styles/05_modules/_index.scss | 8 + .../src/styles/05_modules/_inputAmount.scss | 29 + .../src/styles/05_modules/_logo-main.scss | 14 + .../src/styles/05_modules/_menu-main.scss | 60 + .../src/styles/05_modules/_nav-menu.scss | 6 + .../styles/05_modules/_product-manager.scss | 37 + .../u17_validator/src/styles/main.scss | 16 + .../src/utils/validators/validate.js | 28 + .../uebungen/u17_validator/vite.config.js | 15 + .../src/routes/Router.jsx | 7 + .../tag42/02_react-with-forms/src/App.jsx | 5 +- .../src/components/forms/FormContact.jsx | 141 ++ .../src/pages/ContactPage.jsx | 4 +- .../src/utils/validators/validate.js | 29 + .../tag43/01_react-with-forms/.gitignore | 24 + .../tag43/01_react-with-forms/.oxlintrc.json | 8 + .../tag43/01_react-with-forms/README.md | 16 + .../tag43/01_react-with-forms/index.html | 14 + .../01_react-with-forms/package-lock.json | 2237 +++++++++++++++++ .../tag43/01_react-with-forms/package.json | 27 + .../01_react-with-forms/public/favicon.svg | 1 + .../01_react-with-forms/public/icons.svg | 24 + .../tag43/01_react-with-forms/src/App.jsx | 22 + .../01_react-with-forms/src/assets/hero.png | Bin 0 -> 13057 bytes .../01_react-with-forms/src/assets/react.svg | 1 + .../01_react-with-forms/src/assets/vite.svg | 1 + .../src/components/common/Badge.jsx | 11 + .../src/components/forms/FormContact.jsx | 141 ++ .../src/components/navs/Navbar.jsx | 44 + .../tag43/01_react-with-forms/src/main.jsx | 21 + .../src/pages/AboutPage.jsx | 34 + .../src/pages/ContactPage.jsx | 16 + .../src/pages/HomePage.jsx | 10 + .../src/pages/UserPage.jsx | 25 + .../src/pages/UserProfilePage.jsx | 18 + .../01_react-with-forms/src/routes/Router.jsx | 61 + .../src/styles/01_frameworks/_index.scss | 3 + .../bootstrap-5.3.8/_accordion.scss | 153 ++ .../01_frameworks/bootstrap-5.3.8/_alert.scss | 68 + .../01_frameworks/bootstrap-5.3.8/_badge.scss | 38 + .../bootstrap-5.3.8/_breadcrumb.scss | 40 + .../bootstrap-5.3.8/_button-group.scss | 147 ++ .../bootstrap-5.3.8/_buttons.scss | 216 ++ .../01_frameworks/bootstrap-5.3.8/_card.scss | 238 ++ .../bootstrap-5.3.8/_carousel.scss | 226 ++ .../01_frameworks/bootstrap-5.3.8/_close.scss | 66 + .../bootstrap-5.3.8/_containers.scss | 41 + .../bootstrap-5.3.8/_dropdown.scss | 250 ++ .../01_frameworks/bootstrap-5.3.8/_forms.scss | 9 + .../bootstrap-5.3.8/_functions.scss | 302 +++ .../01_frameworks/bootstrap-5.3.8/_grid.scss | 39 + .../bootstrap-5.3.8/_helpers.scss | 12 + .../bootstrap-5.3.8/_images.scss | 42 + .../bootstrap-5.3.8/_list-group.scss | 199 ++ .../01_frameworks/bootstrap-5.3.8/_maps.scss | 174 ++ .../bootstrap-5.3.8/_mixins.scss | 42 + .../01_frameworks/bootstrap-5.3.8/_modal.scss | 240 ++ .../01_frameworks/bootstrap-5.3.8/_nav.scss | 197 ++ .../bootstrap-5.3.8/_navbar.scss | 289 +++ .../bootstrap-5.3.8/_offcanvas.scss | 147 ++ .../bootstrap-5.3.8/_pagination.scss | 109 + .../bootstrap-5.3.8/_placeholders.scss | 51 + .../bootstrap-5.3.8/_popover.scss | 196 ++ .../bootstrap-5.3.8/_progress.scss | 68 + .../bootstrap-5.3.8/_reboot.scss | 617 +++++ .../01_frameworks/bootstrap-5.3.8/_root.scss | 187 ++ .../bootstrap-5.3.8/_spinners.scss | 86 + .../bootstrap-5.3.8/_tables.scss | 171 ++ .../bootstrap-5.3.8/_toasts.scss | 73 + .../bootstrap-5.3.8/_tooltip.scss | 119 + .../bootstrap-5.3.8/_transitions.scss | 27 + .../01_frameworks/bootstrap-5.3.8/_type.scss | 106 + .../bootstrap-5.3.8/_utilities.scss | 806 ++++++ .../bootstrap-5.3.8/_variables-dark.scss | 102 + .../bootstrap-5.3.8/_variables.scss | 1753 +++++++++++++ .../bootstrap-5.3.8/bootstrap-grid.scss | 62 + .../bootstrap-5.3.8/bootstrap-reboot.scss | 10 + .../bootstrap-5.3.8/bootstrap-utilities.scss | 19 + .../bootstrap-5.3.8/bootstrap.scss | 52 + .../forms/_floating-labels.scss | 97 + .../bootstrap-5.3.8/forms/_form-check.scss | 189 ++ .../bootstrap-5.3.8/forms/_form-control.scss | 214 ++ .../bootstrap-5.3.8/forms/_form-range.scss | 91 + .../bootstrap-5.3.8/forms/_form-select.scss | 80 + .../bootstrap-5.3.8/forms/_form-text.scss | 11 + .../bootstrap-5.3.8/forms/_input-group.scss | 132 + .../bootstrap-5.3.8/forms/_labels.scss | 36 + .../bootstrap-5.3.8/forms/_validation.scss | 12 + .../bootstrap-5.3.8/helpers/_clearfix.scss | 3 + .../bootstrap-5.3.8/helpers/_color-bg.scss | 7 + .../helpers/_colored-links.scss | 30 + .../bootstrap-5.3.8/helpers/_focus-ring.scss | 5 + .../bootstrap-5.3.8/helpers/_icon-link.scss | 25 + .../bootstrap-5.3.8/helpers/_position.scss | 36 + .../bootstrap-5.3.8/helpers/_ratio.scss | 26 + .../bootstrap-5.3.8/helpers/_stacks.scss | 15 + .../helpers/_stretched-link.scss | 15 + .../helpers/_text-truncation.scss | 7 + .../helpers/_visually-hidden.scss | 8 + .../bootstrap-5.3.8/helpers/_vr.scss | 8 + .../bootstrap-5.3.8/mixins/_alert.scss | 18 + .../bootstrap-5.3.8/mixins/_backdrop.scss | 14 + .../bootstrap-5.3.8/mixins/_banner.scss | 7 + .../mixins/_border-radius.scss | 78 + .../bootstrap-5.3.8/mixins/_box-shadow.scss | 24 + .../bootstrap-5.3.8/mixins/_breakpoints.scss | 127 + .../bootstrap-5.3.8/mixins/_buttons.scss | 70 + .../bootstrap-5.3.8/mixins/_caret.scss | 69 + .../bootstrap-5.3.8/mixins/_clearfix.scss | 9 + .../bootstrap-5.3.8/mixins/_color-mode.scss | 21 + .../bootstrap-5.3.8/mixins/_color-scheme.scss | 7 + .../bootstrap-5.3.8/mixins/_container.scss | 11 + .../bootstrap-5.3.8/mixins/_deprecate.scss | 10 + .../bootstrap-5.3.8/mixins/_forms.scss | 163 ++ .../bootstrap-5.3.8/mixins/_gradients.scss | 47 + .../bootstrap-5.3.8/mixins/_grid.scss | 151 ++ .../bootstrap-5.3.8/mixins/_image.scss | 16 + .../bootstrap-5.3.8/mixins/_list-group.scss | 26 + .../bootstrap-5.3.8/mixins/_lists.scss | 7 + .../bootstrap-5.3.8/mixins/_pagination.scss | 10 + .../bootstrap-5.3.8/mixins/_reset-text.scss | 17 + .../bootstrap-5.3.8/mixins/_resize.scss | 6 + .../mixins/_table-variants.scss | 24 + .../mixins/_text-truncate.scss | 8 + .../bootstrap-5.3.8/mixins/_transition.scss | 26 + .../bootstrap-5.3.8/mixins/_utilities.scss | 97 + .../mixins/_visually-hidden.scss | 38 + .../bootstrap-5.3.8/tests/jasmine.js | 16 + .../_auto-import-of-variables-dark.test.scss | 7 + .../tests/mixins/_box-shadow.test.scss | 188 ++ .../tests/mixins/_color-contrast.test.scss | 139 + .../tests/mixins/_color-modes.test.scss | 69 + .../_media-query-color-mode-full.test.scss | 8 + .../tests/mixins/_utilities.test.scss | 393 +++ .../tests/sass-true/register.js | 14 + .../bootstrap-5.3.8/tests/sass-true/runner.js | 17 + .../tests/utilities/_api.test.scss | 75 + .../bootstrap-5.3.8/utilities/_api.scss | 47 + .../bootstrap-5.3.8/vendor/_rfs.scss | 348 +++ .../01_frameworks/bulma-1.04/_index.scss | 10 + .../01_frameworks/bulma-1.04/base/_index.scss | 6 + .../bulma-1.04/base/animations.scss | 15 + .../bulma-1.04/base/generic.scss | 240 ++ .../bulma-1.04/base/minireset.scss | 92 + .../bulma-1.04/base/skeleton.scss | 114 + .../bulma-1.04/components/_index.scss | 13 + .../bulma-1.04/components/breadcrumb.scss | 139 + .../bulma-1.04/components/card.scss | 162 ++ .../bulma-1.04/components/dropdown.scss | 188 ++ .../bulma-1.04/components/menu.scss | 165 ++ .../bulma-1.04/components/message.scss | 183 ++ .../bulma-1.04/components/modal.scss | 164 ++ .../bulma-1.04/components/navbar.scss | 799 ++++++ .../bulma-1.04/components/pagination.scss | 379 +++ .../bulma-1.04/components/panel.scss | 218 ++ .../bulma-1.04/components/tabs.scss | 273 ++ .../bulma-1.04/elements/_index.scss | 16 + .../bulma-1.04/elements/block.scss | 6 + .../bulma-1.04/elements/box.scss | 59 + .../bulma-1.04/elements/button.scss | 659 +++++ .../bulma-1.04/elements/content.scss | 289 +++ .../bulma-1.04/elements/delete.scss | 6 + .../bulma-1.04/elements/icon.scss | 67 + .../bulma-1.04/elements/image.scss | 64 + .../bulma-1.04/elements/loader.scss | 15 + .../bulma-1.04/elements/notification.scss | 105 + .../bulma-1.04/elements/progress.scss | 115 + .../bulma-1.04/elements/table.scss | 261 ++ .../bulma-1.04/elements/tag.scss | 219 ++ .../bulma-1.04/elements/title.scss | 130 + .../01_frameworks/bulma-1.04/form/_index.scss | 9 + .../bulma-1.04/form/checkbox-radio.scss | 36 + .../01_frameworks/bulma-1.04/form/file.scss | 330 +++ .../bulma-1.04/form/input-textarea.scss | 115 + .../01_frameworks/bulma-1.04/form/select.scss | 144 ++ .../01_frameworks/bulma-1.04/form/shared.scss | 178 ++ .../01_frameworks/bulma-1.04/form/tools.scss | 352 +++ .../01_frameworks/bulma-1.04/grid/_index.scss | 5 + .../bulma-1.04/grid/columns.scss | 961 +++++++ .../01_frameworks/bulma-1.04/grid/grid.scss | 209 ++ .../bulma-1.04/helpers/_index.scss | 15 + .../bulma-1.04/helpers/aspect-ratio.scss | 12 + .../bulma-1.04/helpers/border.scss | 15 + .../bulma-1.04/helpers/color.scss | 344 +++ .../bulma-1.04/helpers/flexbox.scss | 62 + .../bulma-1.04/helpers/float.scss | 28 + .../01_frameworks/bulma-1.04/helpers/gap.scss | 24 + .../bulma-1.04/helpers/other.scss | 19 + .../bulma-1.04/helpers/overflow.scss | 21 + .../bulma-1.04/helpers/position.scss | 19 + .../bulma-1.04/helpers/spacing.scss | 64 + .../bulma-1.04/helpers/typography.scss | 174 ++ .../bulma-1.04/helpers/visibility.scss | 221 ++ .../bulma-1.04/layout/_index.scss | 9 + .../bulma-1.04/layout/container.scss | 59 + .../bulma-1.04/layout/footer.scss | 23 + .../01_frameworks/bulma-1.04/layout/hero.scss | 273 ++ .../bulma-1.04/layout/level.scss | 107 + .../bulma-1.04/layout/media.scss | 106 + .../bulma-1.04/layout/section.scss | 38 + .../bulma-1.04/themes/_index.scss | 36 + .../01_frameworks/bulma-1.04/themes/dark.scss | 57 + .../bulma-1.04/themes/light.scss | 147 ++ .../bulma-1.04/themes/setup.scss | 174 ++ .../bulma-1.04/utilities/_index.scss | 7 + .../bulma-1.04/utilities/controls.scss | 85 + .../bulma-1.04/utilities/css-variables.scss | 502 ++++ .../utilities/derived-variables.scss | 112 + .../bulma-1.04/utilities/extends.scss | 34 + .../bulma-1.04/utilities/functions.scss | 310 +++ .../utilities/initial-variables.scss | 157 ++ .../bulma-1.04/utilities/mixins.scss | 462 ++++ .../src/styles/02_fonts/_index.scss | 3 + .../02_fonts/_playfair-display-v40-latin.scss | 96 + .../02_fonts/_source-sans-3-v19-latin.scss | 134 + .../src/styles/03_base/_colors.scss | 12 + .../src/styles/03_base/_index.scss | 5 + .../src/styles/03_base/_theme.scss | 46 + .../src/styles/03_base/_typography.scss | 9 + .../src/styles/03_base/_utils.scss | 0 .../src/styles/03_base/_variables.scss | 0 .../src/styles/04_plugins/_index.scss | 4 + .../core/foundation/animations.scss | 9 + .../04_plugins/splide-4.1.4/core/index.scss | 3 + .../core/object/modifiers/draggable.scss | 8 + .../core/object/modifiers/fade.scss | 18 + .../core/object/modifiers/index.scss | 4 + .../core/object/modifiers/rtl.scss | 5 + .../core/object/modifiers/ttb.scss | 9 + .../core/object/objects/container.scss | 6 + .../core/object/objects/index.scss | 10 + .../core/object/objects/list.scss | 17 + .../core/object/objects/pagination.scss | 26 + .../core/object/objects/progress.scss | 7 + .../core/object/objects/root.scss | 9 + .../core/object/objects/slide.scss | 14 + .../core/object/objects/spinner.scss | 21 + .../splide-4.1.4/core/object/objects/sr.scss | 12 + .../core/object/objects/toggle.scss | 22 + .../core/object/objects/track.scss | 7 + .../template/default/foundation/colors.scss | 8 + .../template/default/foundation/mixins.scss | 27 + .../splide-4.1.4/template/default/index.scss | 13 + .../default/object/modifiers/index.scss | 3 + .../default/object/modifiers/nav.scss | 37 + .../default/object/modifiers/rtl.scss | 28 + .../default/object/modifiers/ttb.scss | 54 + .../default/object/objects/arrow.scss | 105 + .../default/object/objects/index.scss | 5 + .../default/object/objects/pagination.scss | 80 + .../default/object/objects/progress.scss | 13 + .../default/object/objects/slide.scss | 42 + .../default/object/objects/toggle.scss | 19 + .../splide-4.1.4/themes/default/index.scss | 1 + .../splide-4.1.4/themes/sea-green/index.scss | 52 + .../sea-green/object/objects/arrow.scss | 17 + .../sea-green/object/objects/index.scss | 3 + .../themes/sea-green/object/objects/root.scss | 3 + .../splide-4.1.4/themes/skyblue/index.scss | 37 + .../04_plugins/toastify-1.12/_toastify.scss | 88 + .../src/styles/05_modules/_button.scss | 13 + .../src/styles/05_modules/_footer-main.scss | 37 + .../src/styles/05_modules/_header-main.scss | 83 + .../src/styles/05_modules/_index.scss | 8 + .../src/styles/05_modules/_inputAmount.scss | 29 + .../src/styles/05_modules/_logo-main.scss | 14 + .../src/styles/05_modules/_menu-main.scss | 60 + .../src/styles/05_modules/_nav-menu.scss | 6 + .../styles/05_modules/_product-manager.scss | 37 + .../01_react-with-forms/src/styles/main.scss | 16 + .../src/utils/validators/validate.js | 29 + .../tag43/01_react-with-forms/vite.config.js | 15 + 522 files changed, 53678 insertions(+), 2 deletions(-) create mode 100644 05_react/uebungen/u17_validator.zip create mode 100644 05_react/uebungen/u17_validator/.gitignore create mode 100644 05_react/uebungen/u17_validator/.oxlintrc.json create mode 100644 05_react/uebungen/u17_validator/README.md create mode 100644 05_react/uebungen/u17_validator/index.html create mode 100644 05_react/uebungen/u17_validator/package-lock.json create mode 100644 05_react/uebungen/u17_validator/package.json create mode 100644 05_react/uebungen/u17_validator/public/favicon.svg create mode 100644 05_react/uebungen/u17_validator/public/icons.svg create mode 100644 05_react/uebungen/u17_validator/src/App.jsx create mode 100644 05_react/uebungen/u17_validator/src/assets/hero.png create mode 100644 05_react/uebungen/u17_validator/src/assets/react.svg create mode 100644 05_react/uebungen/u17_validator/src/assets/vite.svg create mode 100644 05_react/uebungen/u17_validator/src/components/common/Badge.jsx create mode 100644 05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx create mode 100644 05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx create mode 100644 05_react/uebungen/u17_validator/src/main.jsx create mode 100644 05_react/uebungen/u17_validator/src/pages/AboutPage.jsx create mode 100644 05_react/uebungen/u17_validator/src/pages/ContactPage.jsx create mode 100644 05_react/uebungen/u17_validator/src/pages/HomePage.jsx create mode 100644 05_react/uebungen/u17_validator/src/pages/UserPage.jsx create mode 100644 05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx create mode 100644 05_react/uebungen/u17_validator/src/routes/Router.jsx create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_forms.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_functions.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_grid.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_helpers.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_images.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_list-group.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_maps.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_mixins.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_modal.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_nav.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_navbar.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_offcanvas.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_pagination.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_placeholders.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_popover.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_progress.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_reboot.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_root.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_spinners.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_tables.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_toasts.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_tooltip.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_transitions.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_type.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_utilities.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_variables-dark.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_variables.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-grid.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-reboot.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-utilities.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_floating-labels.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-check.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-control.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-range.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-select.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-text.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_input-group.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_labels.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/forms/_validation.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_clearfix.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_color-bg.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_colored-links.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_focus-ring.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_icon-link.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_position.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_ratio.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_stacks.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_stretched-link.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_text-truncation.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_visually-hidden.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_vr.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_alert.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_backdrop.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_banner.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_border-radius.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_box-shadow.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_breakpoints.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_buttons.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_caret.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_clearfix.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_color-mode.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_color-scheme.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_container.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_deprecate.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_forms.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_gradients.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_grid.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_image.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_list-group.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_lists.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_pagination.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_reset-text.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_resize.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_table-variants.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_text-truncate.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_transition.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_utilities.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_visually-hidden.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/jasmine.js create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_auto-import-of-variables-dark.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_box-shadow.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_color-contrast.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_color-modes.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_media-query-color-mode-full.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_utilities.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/sass-true/register.js create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/sass-true/runner.js create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/tests/utilities/_api.test.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/utilities/_api.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/vendor/_rfs.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/base/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/base/animations.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/base/generic.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/base/minireset.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/base/skeleton.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/breadcrumb.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/card.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/dropdown.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/menu.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/message.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/modal.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/navbar.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/pagination.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/panel.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/components/tabs.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/block.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/box.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/button.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/content.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/delete.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/icon.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/image.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/loader.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/notification.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/progress.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/table.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/tag.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/elements/title.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/checkbox-radio.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/file.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/input-textarea.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/select.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/shared.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/form/tools.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/grid/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/grid/columns.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/grid/grid.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/aspect-ratio.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/border.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/color.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/flexbox.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/float.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/gap.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/other.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/overflow.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/position.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/spacing.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/typography.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/helpers/visibility.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/container.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/footer.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/hero.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/level.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/media.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/layout/section.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/themes/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/themes/dark.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/themes/light.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/themes/setup.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/controls.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/css-variables.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/derived-variables.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/extends.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/functions.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/initial-variables.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/01_frameworks/bulma-1.04/utilities/mixins.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/02_fonts/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/02_fonts/_playfair-display-v40-latin.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/03_base/_colors.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/03_base/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/03_base/_theme.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/03_base/_typography.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/03_base/_utils.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/03_base/_variables.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/foundation/animations.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/draggable.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/fade.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/rtl.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/ttb.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/container.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/list.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/pagination.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/progress.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/root.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/slide.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/spinner.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/sr.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/toggle.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/core/object/objects/track.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/foundation/colors.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/foundation/mixins.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/nav.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/rtl.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/ttb.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/arrow.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/pagination.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/progress.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/slide.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/toggle.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/themes/default/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/themes/sea-green/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/arrow.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/root.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/splide-4.1.4/themes/skyblue/index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_button.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_footer-main.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_header-main.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_index.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_inputAmount.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_logo-main.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_menu-main.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_nav-menu.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/05_modules/_product-manager.scss create mode 100644 05_react/uebungen/u17_validator/src/styles/main.scss create mode 100644 05_react/uebungen/u17_validator/src/utils/validators/validate.js create mode 100644 05_react/uebungen/u17_validator/vite.config.js create mode 100644 05_react/unterricht/tag42/02_react-with-forms/src/components/forms/FormContact.jsx create mode 100644 05_react/unterricht/tag42/02_react-with-forms/src/utils/validators/validate.js create mode 100644 05_react/unterricht/tag43/01_react-with-forms/.gitignore create mode 100644 05_react/unterricht/tag43/01_react-with-forms/.oxlintrc.json create mode 100644 05_react/unterricht/tag43/01_react-with-forms/README.md create mode 100644 05_react/unterricht/tag43/01_react-with-forms/index.html create mode 100644 05_react/unterricht/tag43/01_react-with-forms/package-lock.json create mode 100644 05_react/unterricht/tag43/01_react-with-forms/package.json create mode 100644 05_react/unterricht/tag43/01_react-with-forms/public/favicon.svg create mode 100644 05_react/unterricht/tag43/01_react-with-forms/public/icons.svg create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/App.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/assets/hero.png create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/assets/react.svg create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/assets/vite.svg create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/components/common/Badge.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/components/forms/FormContact.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/main.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/pages/UserPage.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_forms.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_functions.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_grid.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_helpers.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_images.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_list-group.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_maps.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_mixins.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_modal.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_nav.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_navbar.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_offcanvas.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_pagination.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_placeholders.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_popover.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_progress.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_reboot.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_root.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_spinners.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_tables.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_toasts.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_tooltip.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_transitions.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_type.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_utilities.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_variables-dark.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_variables.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-grid.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-reboot.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-utilities.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_floating-labels.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-check.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-control.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-range.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-select.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-text.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_input-group.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_labels.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/forms/_validation.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_clearfix.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_color-bg.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_colored-links.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_focus-ring.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_icon-link.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_position.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_ratio.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_stacks.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_stretched-link.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_text-truncation.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_visually-hidden.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_vr.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_alert.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_backdrop.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_banner.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_border-radius.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_box-shadow.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_breakpoints.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_buttons.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_caret.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_clearfix.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_color-mode.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_color-scheme.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_container.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_deprecate.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_forms.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_gradients.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_grid.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_image.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_list-group.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_lists.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_pagination.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_reset-text.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_resize.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_table-variants.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_text-truncate.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_transition.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_utilities.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_visually-hidden.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/jasmine.js create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_auto-import-of-variables-dark.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_box-shadow.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_color-contrast.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_color-modes.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_media-query-color-mode-full.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_utilities.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/sass-true/register.js create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/sass-true/runner.js create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/tests/utilities/_api.test.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/utilities/_api.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/vendor/_rfs.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/base/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/base/animations.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/base/generic.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/base/minireset.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/base/skeleton.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/breadcrumb.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/card.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/dropdown.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/menu.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/message.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/modal.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/navbar.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/pagination.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/panel.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/components/tabs.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/block.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/box.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/button.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/content.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/delete.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/icon.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/image.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/loader.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/notification.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/progress.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/table.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/tag.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/elements/title.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/checkbox-radio.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/file.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/input-textarea.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/select.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/shared.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/form/tools.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/grid/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/grid/columns.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/grid/grid.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/aspect-ratio.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/border.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/color.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/flexbox.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/float.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/gap.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/other.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/overflow.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/position.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/spacing.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/typography.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/helpers/visibility.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/container.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/footer.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/hero.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/level.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/media.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/layout/section.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/themes/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/themes/dark.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/themes/light.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/themes/setup.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/controls.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/css-variables.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/derived-variables.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/extends.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/functions.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/initial-variables.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bulma-1.04/utilities/mixins.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/02_fonts/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/02_fonts/_playfair-display-v40-latin.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/03_base/_colors.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/03_base/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/03_base/_theme.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/03_base/_typography.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/03_base/_utils.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/03_base/_variables.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/foundation/animations.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/draggable.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/fade.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/rtl.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/ttb.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/container.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/list.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/pagination.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/progress.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/root.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/slide.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/spinner.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/sr.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/toggle.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/core/object/objects/track.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/foundation/colors.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/foundation/mixins.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/nav.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/rtl.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/ttb.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/arrow.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/pagination.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/progress.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/slide.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/toggle.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/themes/default/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/themes/sea-green/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/arrow.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/root.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/splide-4.1.4/themes/skyblue/index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_button.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_footer-main.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_header-main.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_index.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_inputAmount.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_logo-main.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_menu-main.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_nav-menu.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/05_modules/_product-manager.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/styles/main.scss create mode 100644 05_react/unterricht/tag43/01_react-with-forms/src/utils/validators/validate.js create mode 100644 05_react/unterricht/tag43/01_react-with-forms/vite.config.js diff --git a/05_react/uebungen/u17_validator.zip b/05_react/uebungen/u17_validator.zip new file mode 100644 index 0000000000000000000000000000000000000000..6f4c494f340d4495eccb65a9e9d7d7db29f8f54e GIT binary patch literal 286639 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
Pnn`>jn>H1YjWTC9s^b+f-4k94jf@P0+P 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 z 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
Qdcg!ZXYH9a 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 ae7vZjFt}y{VV1xw0ax&Ux~D<+2>%C{7yb4C literal 0 HcmV?d00001 diff --git a/05_react/uebungen/u17_validator/.gitignore b/05_react/uebungen/u17_validator/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/05_react/uebungen/u17_validator/.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/05_react/uebungen/u17_validator/.oxlintrc.json b/05_react/uebungen/u17_validator/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/05_react/uebungen/u17_validator/.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/05_react/uebungen/u17_validator/README.md b/05_react/uebungen/u17_validator/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/05_react/uebungen/u17_validator/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/05_react/uebungen/u17_validator/index.html b/05_react/uebungen/u17_validator/index.html new file mode 100644 index 0000000..3c74f77 --- /dev/null +++ b/05_react/uebungen/u17_validator/index.html @@ -0,0 +1,14 @@ + + + + + + + + u17_validator + + +

+ + + diff --git a/05_react/uebungen/u17_validator/package-lock.json b/05_react/uebungen/u17_validator/package-lock.json new file mode 100644 index 0000000..94c1f11 --- /dev/null +++ b/05_react/uebungen/u17_validator/package-lock.json @@ -0,0 +1,2237 @@ +{ + "name": "02_react-with-forms", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "02_react-with-forms", + "version": "0.0.0", + "dependencies": { + "bootstrap": "^5.3.8", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.0.5", + "oxlint": "^1.78.0", + "sass-embedded": "^1.100.0", + "vite": "^8.2.1" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz", + "integrity": "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@oxc-project/types": { + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.78.0.tgz", + "integrity": "sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.78.0.tgz", + "integrity": "sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.78.0.tgz", + "integrity": "sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.78.0.tgz", + "integrity": "sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.78.0.tgz", + "integrity": "sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.78.0.tgz", + "integrity": "sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.78.0.tgz", + "integrity": "sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.78.0.tgz", + "integrity": "sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.78.0.tgz", + "integrity": "sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.78.0.tgz", + "integrity": "sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.78.0.tgz", + "integrity": "sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.78.0.tgz", + "integrity": "sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.78.0.tgz", + "integrity": "sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.78.0.tgz", + "integrity": "sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.78.0.tgz", + "integrity": "sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.78.0.tgz", + "integrity": "sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.78.0.tgz", + "integrity": "sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.78.0.tgz", + "integrity": "sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.78.0.tgz", + "integrity": "sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "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", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/oxlint": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.78.0.tgz", + "integrity": "sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.78.0", + "@oxlint/binding-android-arm64": "1.78.0", + "@oxlint/binding-darwin-arm64": "1.78.0", + "@oxlint/binding-darwin-x64": "1.78.0", + "@oxlint/binding-freebsd-x64": "1.78.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.78.0", + "@oxlint/binding-linux-arm-musleabihf": "1.78.0", + "@oxlint/binding-linux-arm64-gnu": "1.78.0", + "@oxlint/binding-linux-arm64-musl": "1.78.0", + "@oxlint/binding-linux-ppc64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-musl": "1.78.0", + "@oxlint/binding-linux-s390x-gnu": "1.78.0", + "@oxlint/binding-linux-x64-gnu": "1.78.0", + "@oxlint/binding-linux-x64-musl": "1.78.0", + "@oxlint/binding-openharmony-arm64": "1.78.0", + "@oxlint/binding-win32-arm64-msvc": "1.78.0", + "@oxlint/binding-win32-ia32-msvc": "1.78.0", + "@oxlint/binding-win32-x64-msvc": "1.78.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-icons": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", + "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-router": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rolldown": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.143.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sass": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", + "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", + "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.5.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": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.100.0", + "sass-embedded-android-arm": "1.100.0", + "sass-embedded-android-arm64": "1.100.0", + "sass-embedded-android-riscv64": "1.100.0", + "sass-embedded-android-x64": "1.100.0", + "sass-embedded-darwin-arm64": "1.100.0", + "sass-embedded-darwin-x64": "1.100.0", + "sass-embedded-linux-arm": "1.100.0", + "sass-embedded-linux-arm64": "1.100.0", + "sass-embedded-linux-musl-arm": "1.100.0", + "sass-embedded-linux-musl-arm64": "1.100.0", + "sass-embedded-linux-musl-riscv64": "1.100.0", + "sass-embedded-linux-musl-x64": "1.100.0", + "sass-embedded-linux-riscv64": "1.100.0", + "sass-embedded-linux-x64": "1.100.0", + "sass-embedded-unknown-all": "1.100.0", + "sass-embedded-win32-arm64": "1.100.0", + "sass-embedded-win32-x64": "1.100.0" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", + "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.100.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", + "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", + "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", + "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", + "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", + "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", + "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", + "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", + "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", + "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", + "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", + "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", + "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", + "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", + "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", + "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.100.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", + "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", + "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", + "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "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/05_react/uebungen/u17_validator/package.json b/05_react/uebungen/u17_validator/package.json new file mode 100644 index 0000000..1d599bd --- /dev/null +++ b/05_react/uebungen/u17_validator/package.json @@ -0,0 +1,27 @@ +{ + "name": "u17_validator", + "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.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.0.5", + "oxlint": "^1.78.0", + "sass-embedded": "^1.100.0", + "vite": "^8.2.1" + } +} diff --git a/05_react/uebungen/u17_validator/public/favicon.svg b/05_react/uebungen/u17_validator/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/05_react/uebungen/u17_validator/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05_react/uebungen/u17_validator/public/icons.svg b/05_react/uebungen/u17_validator/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/05_react/uebungen/u17_validator/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/05_react/uebungen/u17_validator/src/App.jsx b/05_react/uebungen/u17_validator/src/App.jsx new file mode 100644 index 0000000..665428c --- /dev/null +++ b/05_react/uebungen/u17_validator/src/App.jsx @@ -0,0 +1,19 @@ +import { Navigate } from 'react-router-dom'; +import Router from './routes/Router'; + +// components +import Navbar from './components/navs/Navbar'; + +function App() { + return ( + <> + + +
+ +
+ + ); +} + +export default App; diff --git a/05_react/uebungen/u17_validator/src/assets/hero.png b/05_react/uebungen/u17_validator/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/05_react/uebungen/u17_validator/src/assets/react.svg b/05_react/uebungen/u17_validator/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05_react/uebungen/u17_validator/src/assets/vite.svg b/05_react/uebungen/u17_validator/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/05_react/uebungen/u17_validator/src/components/common/Badge.jsx b/05_react/uebungen/u17_validator/src/components/common/Badge.jsx new file mode 100644 index 0000000..23cedae --- /dev/null +++ b/05_react/uebungen/u17_validator/src/components/common/Badge.jsx @@ -0,0 +1,11 @@ +const Badge = (props) => { + const { text = '', variant = 'secondary', color = '' } = props; + + return ( + + {text} + + ); + // {text}; +}; +export default Badge; diff --git a/05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx b/05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx new file mode 100644 index 0000000..0e4caa8 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx @@ -0,0 +1,141 @@ +import { useState } from 'react'; +import validate from '../../utils/validators/validate'; + +const FormContact = (props) => { + // const { } = props; + + const [formData, setFormData] = useState({ + firstname: '', // + lastname: '', + email: '', + message: '', + }); + + const [errors, setErrors] = useState({}); + + // EventHandlers ======= + const handleSubmit = (e) => { + e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. + + const form = e.currentTarget; + + const errors = validate(formData); + + if (Object.keys(errors).length === 0) { + console.log('Form submitted ....'); + // TODO: send over AJAX/Fetch + form.reset(); + setFormData({ + firstname: '', // + lastname: '', + email: '', + message: '', + }); + setErrors({}); + } else { + console.warn('Form submit error'); + setErrors(errors); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + setFormData((state) => ({ ...state, [name]: value })); + + // console.log({ [e.target.name]: e.target.value }); + // console.log('Formdata', formData); + }; + + return ( +
+
+
+
+ + +
OK
+
{errors?.firstname}
+
+
+
+
+ + +
OK
+
{errors?.lastname}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.email}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.message}
+
+
+
+ +
+
+
+ +
+
+
+
+ ); +}; +export default FormContact; diff --git a/05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx b/05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx new file mode 100644 index 0000000..bc70c62 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx @@ -0,0 +1,44 @@ +import { NavLink } from 'react-router-dom'; + +const Navbar = (props) => { + return ( + + ); +}; + +export default Navbar; diff --git a/05_react/uebungen/u17_validator/src/main.jsx b/05_react/uebungen/u17_validator/src/main.jsx new file mode 100644 index 0000000..1f95cf7 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/main.jsx @@ -0,0 +1,21 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import { BrowserRouter } from 'react-router-dom'; + +import App from './App.jsx'; + +// JS import +import 'bootstrap'; +// import 'bootstrap/dist/css/bootstrap.min.css'; +import './styles/main.scss'; + +const root = createRoot(document.getElementById('root')); + +root.render( + + + + + , +); diff --git a/05_react/uebungen/u17_validator/src/pages/AboutPage.jsx b/05_react/uebungen/u17_validator/src/pages/AboutPage.jsx new file mode 100644 index 0000000..0fbfc09 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/pages/AboutPage.jsx @@ -0,0 +1,34 @@ +const AboutPage = (props) => { + return ( +
+

About

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id + dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. + Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit + enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa + autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis + fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam + amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat + animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic + aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor + minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore + praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis + doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas + obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, + laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum + architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis + beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate + odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at + dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus + optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus + consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus + iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis + maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, + eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum +

+
+ ); +}; + +export default AboutPage; diff --git a/05_react/uebungen/u17_validator/src/pages/ContactPage.jsx b/05_react/uebungen/u17_validator/src/pages/ContactPage.jsx new file mode 100644 index 0000000..a1a78e7 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/pages/ContactPage.jsx @@ -0,0 +1,32 @@ +import FormContact from '../components/forms/FormContact'; + +const ContactPage = (props) => { + // const { } = props; + + return ( +
+

Contact

+

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui +

+ + +
+
+

Übung 17: Formularvalidierung über validator

+

+ Erweitere das Kontaktformular, um die Eingaben des Benutzers mit der validator-Bibliothek zu validieren. Die + validator-Bibliothek bietet eine Vielzahl von Funktionen zur Validierung von Eingaben, z.B. für + E-Mail-Adressen, URLs, Zahlen usw. +

+
    +
  • Installiere die validator-Bibliothek.
  • +
  • Verwende die isEmail-Funktion, um die E-Mail-Adresse des Benutzers zu validieren.
  • +
  • Überprüfe die Länge der Eingaben für firstname, lastname und message.
  • +
  • Zeige entsprechende Fehlermeldungen an, wenn die Eingaben ungültig sind.
  • +
+
+
+ ); +}; +export default ContactPage; diff --git a/05_react/uebungen/u17_validator/src/pages/HomePage.jsx b/05_react/uebungen/u17_validator/src/pages/HomePage.jsx new file mode 100644 index 0000000..dbe58d5 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/pages/HomePage.jsx @@ -0,0 +1,10 @@ +const HomePage = (props) => { + return ( +
+

Home

+

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

+
+ ); +}; + +export default HomePage; diff --git a/05_react/uebungen/u17_validator/src/pages/UserPage.jsx b/05_react/uebungen/u17_validator/src/pages/UserPage.jsx new file mode 100644 index 0000000..7e837b9 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/pages/UserPage.jsx @@ -0,0 +1,25 @@ +import { Outlet } from 'react-router-dom'; + +const UserPage = (props) => { + // const { } = props; + + return ( +
+
+
+

User

+

The nestes user site:

+
+
+
+ +
+
+
+

© 2026 IA Donkey Fabric

+
+
+
+ ); +}; +export default UserPage; diff --git a/05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx b/05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx new file mode 100644 index 0000000..48c2d60 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx @@ -0,0 +1,18 @@ +import { useParams } from 'react-router-dom'; +import Badge from '../components/common/Badge'; + +const UserProfilePage = (props) => { + // const { } = props; + + const { userId } = useParams(); + + return ( +
+

+ User Profile +

+

Lorem ipsum dolor

+
+ ); +}; +export default UserProfilePage; diff --git a/05_react/uebungen/u17_validator/src/routes/Router.jsx b/05_react/uebungen/u17_validator/src/routes/Router.jsx new file mode 100644 index 0000000..e9472b9 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/routes/Router.jsx @@ -0,0 +1,61 @@ +import { Routes, Route, Navigate } from 'react-router-dom'; + +import About from '../pages/AboutPage'; +import Home from '../pages/HomePage'; +import Contact from '../pages/ContactPage'; +import UserProfilePage from '../pages/UserProfilePage'; +import UserPage from '../pages/UserPage'; + +// Prinzip einer geschützen Route-Komponente + +const checkAuth = () => { + // localStorage.setItem('token', 'secret-token'); + const token = localStorage.getItem('token'); + return token && token === 'secret-token' ? true : false; +}; + +const ProtectedRoute = (props) => { + const { redirectTo = '/', children } = props; + + const isAuthenticated = checkAuth(); // true | false // Authentication -Prüfung + + return isAuthenticated ? <>{children} : ; +}; + +const Router = (props) => { + // const { } = props; + + return ( + + {/* Static Routes */} + } /> + } /> + } /> + + {/* Dynamic Routes */} + Flights} /> + } /> + + {/* Nested Routes | Verschachtelte Routen */} + }> + Index} /> + Profile} /> + Dashboard} /> + + + {/* Protected Routes | Geschützte Routen */} + +
+

Admin Dashboard Page

+

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ad, ex?

+
+ + }>
+
+ ); +}; + +export default Router; diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..dcefbc9 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss @@ -0,0 +1,3 @@ +// @import 'bootstrap-5.3.8/bootstrap-grid'; +@import 'bootstrap-5.3.8/bootstrap'; +// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss new file mode 100644 index 0000000..e9f267f --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss @@ -0,0 +1,153 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + > .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + > .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + // stylelint-disable selector-max-class + > .accordion-collapse, + > .accordion-header .accordion-button, + > .accordion-header .accordion-button.collapsed { + @include border-radius(0); + } + // stylelint-enable selector-max-class + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss new file mode 100644 index 0000000..cc3d269 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss @@ -0,0 +1,38 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + // scss-docs-start badge-css-vars + --#{$prefix}badge-padding-x: #{$badge-padding-x}; + --#{$prefix}badge-padding-y: #{$badge-padding-y}; + @include rfs($badge-font-size, --#{$prefix}badge-font-size); + --#{$prefix}badge-font-weight: #{$badge-font-weight}; + --#{$prefix}badge-color: #{$badge-color}; + --#{$prefix}badge-border-radius: #{$badge-border-radius}; + // scss-docs-end badge-css-vars + + display: inline-block; + padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); + @include font-size(var(--#{$prefix}badge-font-size)); + font-weight: var(--#{$prefix}badge-font-weight); + line-height: 1; + color: var(--#{$prefix}badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(var(--#{$prefix}badge-border-radius)); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss new file mode 100644 index 0000000..b8252ff --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss @@ -0,0 +1,40 @@ +.breadcrumb { + // scss-docs-start breadcrumb-css-vars + --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; + --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; + --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; + @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); + --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; + --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; + --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; + --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; + --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; + // scss-docs-end breadcrumb-css-vars + + display: flex; + flex-wrap: wrap; + padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); + margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); + @include font-size(var(--#{$prefix}breadcrumb-font-size)); + list-style: none; + background-color: var(--#{$prefix}breadcrumb-bg); + @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: var(--#{$prefix}breadcrumb-item-padding-x); + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: var(--#{$prefix}breadcrumb-item-padding-x); + color: var(--#{$prefix}breadcrumb-divider-color); + content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: var(--#{$prefix}breadcrumb-item-active-color); + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss new file mode 100644 index 0000000..78e1252 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss @@ -0,0 +1,147 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + // The top radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss new file mode 100644 index 0000000..caa4518 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss @@ -0,0 +1,216 @@ +// +// Base styles +// + +.btn { + // scss-docs-start btn-css-vars + --#{$prefix}btn-padding-x: #{$btn-padding-x}; + --#{$prefix}btn-padding-y: #{$btn-padding-y}; + --#{$prefix}btn-font-family: #{$btn-font-family}; + @include rfs($btn-font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-font-weight: #{$btn-font-weight}; + --#{$prefix}btn-line-height: #{$btn-line-height}; + --#{$prefix}btn-color: #{$btn-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-width: #{$btn-border-width}; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-border-radius: #{$btn-border-radius}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; + --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; + --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); + // scss-docs-end btn-css-vars + + display: inline-block; + padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); + font-family: var(--#{$prefix}btn-font-family); + @include font-size(var(--#{$prefix}btn-font-size)); + font-weight: var(--#{$prefix}btn-font-weight); + line-height: var(--#{$prefix}btn-line-height); + color: var(--#{$prefix}btn-color); + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); + @include border-radius(var(--#{$prefix}btn-border-radius)); + @include gradient-bg(var(--#{$prefix}btn-bg)); + @include box-shadow(var(--#{$prefix}btn-box-shadow)); + @include transition($btn-transition); + + &:hover { + color: var(--#{$prefix}btn-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}btn-hover-bg); + border-color: var(--#{$prefix}btn-hover-border-color); + } + + .btn-check + &:hover { + // override for the checkbox/radio buttons + color: var(--#{$prefix}btn-color); + background-color: var(--#{$prefix}btn-bg); + border-color: var(--#{$prefix}btn-border-color); + } + + &:focus-visible { + color: var(--#{$prefix}btn-hover-color); + @include gradient-bg(var(--#{$prefix}btn-hover-bg)); + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:focus-visible + & { + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:checked + &, + :not(.btn-check) + &:active, + &:first-child:active, + &.active, + &.show { + color: var(--#{$prefix}btn-active-color); + background-color: var(--#{$prefix}btn-active-bg); + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-active-border-color); + @include box-shadow(var(--#{$prefix}btn-active-shadow)); + + &:focus-visible { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + } + + .btn-check:checked:focus-visible + & { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + color: var(--#{$prefix}btn-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}btn-disabled-bg); + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-disabled-border-color); + opacity: var(--#{$prefix}btn-disabled-opacity); + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @if $color == "light" { + @include button-variant( + $value, + $value, + $hover-background: shade-color($value, $btn-hover-bg-shade-amount), + $hover-border: shade-color($value, $btn-hover-border-shade-amount), + $active-background: shade-color($value, $btn-active-bg-shade-amount), + $active-border: shade-color($value, $btn-active-border-shade-amount) + ); + } @else if $color == "dark" { + @include button-variant( + $value, + $value, + $hover-background: tint-color($value, $btn-hover-bg-tint-amount), + $hover-border: tint-color($value, $btn-hover-border-tint-amount), + $active-background: tint-color($value, $btn-active-bg-tint-amount), + $active-border: tint-color($value, $btn-active-border-tint-amount) + ); + } @else { + @include button-variant($value, $value); + } + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + --#{$prefix}btn-font-weight: #{$font-weight-normal}; + --#{$prefix}btn-color: #{$btn-link-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-active-color: #{$btn-link-hover-color}; + --#{$prefix}btn-active-border-color: transparent; + --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; + --#{$prefix}btn-disabled-border-color: transparent; + --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows + --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; + + text-decoration: $link-decoration; + @if $enable-gradients { + background-image: none; + } + + &:hover, + &:focus-visible { + text-decoration: $link-hover-decoration; + } + + &:focus-visible { + color: var(--#{$prefix}btn-color); + } + + &:hover { + color: var(--#{$prefix}btn-hover-color); + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss new file mode 100644 index 0000000..dcebe6a --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss @@ -0,0 +1,238 @@ +// +// Base styles +// + +.card { + // scss-docs-start card-css-vars + --#{$prefix}card-spacer-y: #{$card-spacer-y}; + --#{$prefix}card-spacer-x: #{$card-spacer-x}; + --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; + --#{$prefix}card-title-color: #{$card-title-color}; + --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; + --#{$prefix}card-border-width: #{$card-border-width}; + --#{$prefix}card-border-color: #{$card-border-color}; + --#{$prefix}card-border-radius: #{$card-border-radius}; + --#{$prefix}card-box-shadow: #{$card-box-shadow}; + --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; + --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; + --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; + --#{$prefix}card-cap-bg: #{$card-cap-bg}; + --#{$prefix}card-cap-color: #{$card-cap-color}; + --#{$prefix}card-height: #{$card-height}; + --#{$prefix}card-color: #{$card-color}; + --#{$prefix}card-bg: #{$card-bg}; + --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; + --#{$prefix}card-group-margin: #{$card-group-margin}; + // scss-docs-end card-css-vars + + position: relative; + display: flex; + flex-direction: column; + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 + height: var(--#{$prefix}card-height); + color: var(--#{$prefix}body-color); + word-wrap: break-word; + background-color: var(--#{$prefix}card-bg); + background-clip: border-box; + border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + @include border-radius(var(--#{$prefix}card-border-radius)); + @include box-shadow(var(--#{$prefix}card-box-shadow)); + + > hr { + margin-right: 0; + margin-left: 0; + } + + > .list-group { + border-top: inherit; + border-bottom: inherit; + + &:first-child { + border-top-width: 0; + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); + } + + &:last-child { + border-bottom-width: 0; + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); + } + } + + // Due to specificity of the above selector (`.card > .list-group`), we must + // use a child selector here to prevent double borders. + > .card-header + .list-group, + > .list-group + .card-footer { + border-top: 0; + } +} + +.card-body { + // Enable `flex-grow: 1` for decks and groups so that card blocks take up + // as much space as possible, ensuring footers are aligned to the bottom. + flex: 1 1 auto; + padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); + color: var(--#{$prefix}card-color); +} + +.card-title { + margin-bottom: var(--#{$prefix}card-title-spacer-y); + color: var(--#{$prefix}card-title-color); +} + +.card-subtitle { + margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list + margin-bottom: 0; + color: var(--#{$prefix}card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link { + &:hover { + text-decoration: if($link-hover-decoration == underline, none, null); + } + + + .card-link { + margin-left: var(--#{$prefix}card-spacer-x); + } +} + +// +// Optional textual caps +// + +.card-header { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + margin-bottom: 0; // Removes the default margin-bottom of + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:first-child { + @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); + } +} + +.card-footer { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:last-child { + @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); + } +} + + +// +// Header navs +// + +.card-header-tabs { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + border-bottom: 0; + + .nav-link.active { + background-color: var(--#{$prefix}card-bg); + border-bottom-color: var(--#{$prefix}card-bg); + } +} + +.card-header-pills { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list +} + +// Card image +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--#{$prefix}card-img-overlay-padding); + @include border-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch +} + +.card-img, +.card-img-top { + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-bottom { + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); +} + + +// +// Card groups +// + +.card-group { + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + margin-bottom: var(--#{$prefix}card-group-margin); + } + + @include media-breakpoint-up(sm) { + display: flex; + flex-flow: row wrap; + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + flex: 1 0 0; + margin-bottom: 0; + + + .card { + margin-left: 0; + border-left: 0; + } + + // Handle rounded corners + @if $enable-rounded { + &:not(:last-child) { + @include border-end-radius(0); + + > .card-img-top, + > .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-right-radius: 0; + } + > .card-img-bottom, + > .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-right-radius: 0; + } + } + + &:not(:first-child) { + @include border-start-radius(0); + + > .card-img-top, + > .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-left-radius: 0; + } + > .card-img-bottom, + > .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-left-radius: 0; + } + } + } + } + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss new file mode 100644 index 0000000..5ebf6b1 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss @@ -0,0 +1,226 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + filter: var(--#{$prefix}carousel-control-icon-filter); + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: var(--#{$prefix}carousel-indicator-active-bg); + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) * .5; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) * .5; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: var(--#{$prefix}carousel-caption-color); + text-align: center; +} + +// Dark mode carousel + +@mixin carousel-dark() { + --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; + --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; + --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; +} + +.carousel-dark { + @include carousel-dark(); +} + +:root, +[data-bs-theme="light"] { + --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; + --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; + --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; +} + +@if $enable-dark-mode { + @include color-mode(dark, true) { + @include carousel-dark(); + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss new file mode 100644 index 0000000..d53c96f --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss @@ -0,0 +1,66 @@ +// Transparent background and border properties included for button version. +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +.btn-close { + // scss-docs-start close-css-vars + --#{$prefix}btn-close-color: #{$btn-close-color}; + --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; + --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; + --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; + --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; + --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; + --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; + // scss-docs-end close-css-vars + + box-sizing: content-box; + width: $btn-close-width; + height: $btn-close-height; + padding: $btn-close-padding-y $btn-close-padding-x; + color: var(--#{$prefix}btn-close-color); + background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + filter: var(--#{$prefix}btn-close-filter); + border: 0; // for button elements + @include border-radius(); + opacity: var(--#{$prefix}btn-close-opacity); + + // Override
's hover style + &:hover { + color: var(--#{$prefix}btn-close-color); + text-decoration: none; + opacity: var(--#{$prefix}btn-close-hover-opacity); + } + + &:focus { + outline: 0; + box-shadow: var(--#{$prefix}btn-close-focus-shadow); + opacity: var(--#{$prefix}btn-close-focus-opacity); + } + + &:disabled, + &.disabled { + pointer-events: none; + user-select: none; + opacity: var(--#{$prefix}btn-close-disabled-opacity); + } +} + +@mixin btn-close-white() { + --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; +} + +.btn-close-white { + @include btn-close-white(); +} + +:root, +[data-bs-theme="light"] { + --#{$prefix}btn-close-filter: #{$btn-close-filter}; +} + +@if $enable-dark-mode { + @include color-mode(dark, true) { + @include btn-close-white(); + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss new file mode 100644 index 0000000..83b3138 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss @@ -0,0 +1,41 @@ +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +@if $enable-container-classes { + // Single container class with breakpoint max-widths + .container, + // 100% wide container at all breakpoints + .container-fluid { + @include make-container(); + } + + // Responsive containers that are 100% wide until a breakpoint + @each $breakpoint, $container-max-width in $container-max-widths { + .container-#{$breakpoint} { + @extend .container-fluid; + } + + @include media-breakpoint-up($breakpoint, $grid-breakpoints) { + %responsive-container-#{$breakpoint} { + max-width: $container-max-width; + } + + // Extend each breakpoint which is smaller or equal to the current breakpoint + $extend-breakpoint: true; + + @each $name, $width in $grid-breakpoints { + @if ($extend-breakpoint) { + .container#{breakpoint-infix($name, $grid-breakpoints)} { + @extend %responsive-container-#{$breakpoint}; + } + + // Once the current breakpoint is reached, stop extending + @if ($breakpoint == $name) { + $extend-breakpoint: false; + } + } + } + } + } +} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss new file mode 100644 index 0000000..587ebb4 --- /dev/null +++ b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss @@ -0,0 +1,250 @@ +// The dropdown wrapper (`
`) +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; + + // Generate the caret automatically + @include caret(); +} + +// The dropdown menu +.dropdown-menu { + // scss-docs-start dropdown-css-vars + --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; + --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; + --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; + --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; + --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; + @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); + --#{$prefix}dropdown-color: #{$dropdown-color}; + --#{$prefix}dropdown-bg: #{$dropdown-bg}; + --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; + --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; + --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; + --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; + --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; + --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; + --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; + --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; + --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; + --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; + --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; + --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; + --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; + --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; + --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; + --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; + --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; + // scss-docs-end dropdown-css-vars + + position: absolute; + z-index: var(--#{$prefix}dropdown-zindex); + display: none; // none by default, but block on "open" of the menu + min-width: var(--#{$prefix}dropdown-min-width); + padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); + margin: 0; // Override default margin of ul + @include font-size(var(--#{$prefix}dropdown-font-size)); + color: var(--#{$prefix}dropdown-color); + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + list-style: none; + background-color: var(--#{$prefix}dropdown-bg); + background-clip: padding-box; + border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); + @include border-radius(var(--#{$prefix}dropdown-border-radius)); + @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); + + &[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--#{$prefix}dropdown-spacer); + } + + @if $dropdown-padding-y == 0 { + > .dropdown-item:first-child, + > li:first-child .dropdown-item { + @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + > .dropdown-item:last-child, + > li:last-child .dropdown-item { + @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + + } +} + +// scss-docs-start responsive-breakpoints +// We deliberately hardcode the `bs-` prefix because we check +// this custom property in JS to determine Popper's positioning + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .dropdown-menu#{$infix}-start { + --bs-position: start; + + &[data-bs-popper] { + right: auto; + left: 0; + } + } + + .dropdown-menu#{$infix}-end { + --bs-position: end; + + &[data-bs-popper] { + right: 0; + left: auto; + } + } + } +} +// scss-docs-end responsive-breakpoints + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// Just add .dropup after the standard .dropdown class and you're set. +.dropup { + .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(up); + } +} + +.dropend { + .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(end); + &::after { + vertical-align: 0; + } + } +} + +.dropstart { + .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(start); + &::before { + vertical-align: 0; + } + } +} + + +// Dividers (basically an `
`) within the dropdown +.dropdown-divider { + height: 0; + margin: var(--#{$prefix}dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); + opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element +} + +// Links, buttons, and more within the dropdown menu +// +// `
+
+ + + + ); +}; +export default FormContact; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx index 277924f..fc53e25 100644 --- a/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx +++ b/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx @@ -1,3 +1,5 @@ +import FormContact from '../components/forms/FormContact'; + const ContactPage = (props) => { // const { } = props; @@ -6,8 +8,8 @@ const ContactPage = (props) => {

Contact

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui - facilis! Officia eaque nihil sunt mollitia nulla debitis! Eaque fugiat est dolores nemo? Odit.

+ ); }; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/utils/validators/validate.js b/05_react/unterricht/tag42/02_react-with-forms/src/utils/validators/validate.js new file mode 100644 index 0000000..97b4829 --- /dev/null +++ b/05_react/unterricht/tag42/02_react-with-forms/src/utils/validators/validate.js @@ -0,0 +1,29 @@ +const validate = (formData) => { + const errors = {}; + + const emailRegEx = new RegExp( + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + ); + + if (!formData.firstname) { + errors.firstname = 'Firstname is required'; + } + + if (!formData.lastname) { + errors.lastname = 'Lastname is required'; + } + + if (!formData.email) { + errors.email = 'Email is required'; + } else if (!emailRegEx.test(formData.email)) { + errors.email = 'Email is invalid'; + } + + if (!formData.message) { + errors.message = 'Message is required'; + } + + return errors; +}; + +export default validate; diff --git a/05_react/unterricht/tag43/01_react-with-forms/.gitignore b/05_react/unterricht/tag43/01_react-with-forms/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/.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/05_react/unterricht/tag43/01_react-with-forms/.oxlintrc.json b/05_react/unterricht/tag43/01_react-with-forms/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/.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/05_react/unterricht/tag43/01_react-with-forms/README.md b/05_react/unterricht/tag43/01_react-with-forms/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/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/05_react/unterricht/tag43/01_react-with-forms/index.html b/05_react/unterricht/tag43/01_react-with-forms/index.html new file mode 100644 index 0000000..414c033 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/index.html @@ -0,0 +1,14 @@ + + + + + + + + 01_react-with-forms + + +
+ + + diff --git a/05_react/unterricht/tag43/01_react-with-forms/package-lock.json b/05_react/unterricht/tag43/01_react-with-forms/package-lock.json new file mode 100644 index 0000000..1f28a88 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/package-lock.json @@ -0,0 +1,2237 @@ +{ + "name": "01_react-with-forms", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "01_react-with-forms", + "version": "0.0.0", + "dependencies": { + "bootstrap": "^5.3.8", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.0.5", + "oxlint": "^1.78.0", + "sass-embedded": "^1.100.0", + "vite": "^8.2.1" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz", + "integrity": "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@oxc-project/types": { + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.78.0.tgz", + "integrity": "sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.78.0.tgz", + "integrity": "sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.78.0.tgz", + "integrity": "sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.78.0.tgz", + "integrity": "sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.78.0.tgz", + "integrity": "sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.78.0.tgz", + "integrity": "sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.78.0.tgz", + "integrity": "sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.78.0.tgz", + "integrity": "sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.78.0.tgz", + "integrity": "sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.78.0.tgz", + "integrity": "sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.78.0.tgz", + "integrity": "sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.78.0.tgz", + "integrity": "sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.78.0.tgz", + "integrity": "sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.78.0.tgz", + "integrity": "sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.78.0.tgz", + "integrity": "sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.78.0.tgz", + "integrity": "sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.78.0.tgz", + "integrity": "sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.78.0.tgz", + "integrity": "sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==", + "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.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.78.0.tgz", + "integrity": "sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", + "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.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "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", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/oxlint": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.78.0.tgz", + "integrity": "sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.78.0", + "@oxlint/binding-android-arm64": "1.78.0", + "@oxlint/binding-darwin-arm64": "1.78.0", + "@oxlint/binding-darwin-x64": "1.78.0", + "@oxlint/binding-freebsd-x64": "1.78.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.78.0", + "@oxlint/binding-linux-arm-musleabihf": "1.78.0", + "@oxlint/binding-linux-arm64-gnu": "1.78.0", + "@oxlint/binding-linux-arm64-musl": "1.78.0", + "@oxlint/binding-linux-ppc64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-musl": "1.78.0", + "@oxlint/binding-linux-s390x-gnu": "1.78.0", + "@oxlint/binding-linux-x64-gnu": "1.78.0", + "@oxlint/binding-linux-x64-musl": "1.78.0", + "@oxlint/binding-openharmony-arm64": "1.78.0", + "@oxlint/binding-win32-arm64-msvc": "1.78.0", + "@oxlint/binding-win32-ia32-msvc": "1.78.0", + "@oxlint/binding-win32-x64-msvc": "1.78.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-icons": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", + "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-router": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rolldown": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.143.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sass": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", + "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", + "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.5.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": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.100.0", + "sass-embedded-android-arm": "1.100.0", + "sass-embedded-android-arm64": "1.100.0", + "sass-embedded-android-riscv64": "1.100.0", + "sass-embedded-android-x64": "1.100.0", + "sass-embedded-darwin-arm64": "1.100.0", + "sass-embedded-darwin-x64": "1.100.0", + "sass-embedded-linux-arm": "1.100.0", + "sass-embedded-linux-arm64": "1.100.0", + "sass-embedded-linux-musl-arm": "1.100.0", + "sass-embedded-linux-musl-arm64": "1.100.0", + "sass-embedded-linux-musl-riscv64": "1.100.0", + "sass-embedded-linux-musl-x64": "1.100.0", + "sass-embedded-linux-riscv64": "1.100.0", + "sass-embedded-linux-x64": "1.100.0", + "sass-embedded-unknown-all": "1.100.0", + "sass-embedded-win32-arm64": "1.100.0", + "sass-embedded-win32-x64": "1.100.0" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", + "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.100.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", + "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", + "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", + "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", + "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", + "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", + "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", + "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", + "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", + "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", + "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", + "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", + "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", + "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", + "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": "glibc", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", + "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.100.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", + "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", + "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", + "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "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/05_react/unterricht/tag43/01_react-with-forms/package.json b/05_react/unterricht/tag43/01_react-with-forms/package.json new file mode 100644 index 0000000..9755714 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/package.json @@ -0,0 +1,27 @@ +{ + "name": "01_react-with-forms", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "bootstrap": "^5.3.8", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.0.5", + "oxlint": "^1.78.0", + "sass-embedded": "^1.100.0", + "vite": "^8.2.1" + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/public/favicon.svg b/05_react/unterricht/tag43/01_react-with-forms/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05_react/unterricht/tag43/01_react-with-forms/public/icons.svg b/05_react/unterricht/tag43/01_react-with-forms/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/App.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/App.jsx new file mode 100644 index 0000000..25db3ae --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/App.jsx @@ -0,0 +1,22 @@ +import { Navigate, useNavigate } from 'react-router-dom'; +import Router from './routes/Router'; + +// components +import Navbar from './components/navs/Navbar'; + +function App() { + const navigate = useNavigate(); + + // navigate('/contact'); // funktioniert, aber mit useEffect() + return ( + <> + + +
+ +
+ + ); +} + +export default App; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/assets/hero.png b/05_react/unterricht/tag43/01_react-with-forms/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/assets/react.svg b/05_react/unterricht/tag43/01_react-with-forms/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/assets/vite.svg b/05_react/unterricht/tag43/01_react-with-forms/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/common/Badge.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/components/common/Badge.jsx new file mode 100644 index 0000000..23cedae --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/components/common/Badge.jsx @@ -0,0 +1,11 @@ +const Badge = (props) => { + const { text = '', variant = 'secondary', color = '' } = props; + + return ( + + {text} + + ); + // {text}; +}; +export default Badge; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/FormContact.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/FormContact.jsx new file mode 100644 index 0000000..0df4460 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/FormContact.jsx @@ -0,0 +1,141 @@ +import { useState } from 'react'; +import validate from '../../utils/validators/validate'; + +const FormContact = (props) => { + // const { } = props; + + const [formData, setFormData] = useState({ + firstname: '', // + lastname: '', + email: '', + message: '', + }); + + const [errors, setErrors] = useState({}); + + // EventHandlers ======= + const handleSubmit = (e) => { + e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. + + const form = e.currentTarget; + + const errors = validate(formData); + + if (Object.keys(errors).length === 0) { + console.log('Form submitted ....'); + // TODO: send over AJAX/Fetch + form.reset(); + setFormData({ + firstname: '', // + lastname: '', + email: '', + message: '', + }); + setErrors({}); + } else { + console.warn('Form submit error'); + setErrors(errors); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + setFormData((state) => ({ ...state, [name]: value })); + + // console.log({ [e.target.name]: e.target.value }); + // console.log('Formdata', formData); + }; + + return ( +
+
+
+
+ + +
OK
+
{errors?.firstname || 'Error'}
+
+
+
+
+ + +
OK
+
{errors?.lastname}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.email}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.message}
+
+
+
+ +
+
+
+ +
+
+
+
+ ); +}; +export default FormContact; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx new file mode 100644 index 0000000..bc70c62 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx @@ -0,0 +1,44 @@ +import { NavLink } from 'react-router-dom'; + +const Navbar = (props) => { + return ( + + ); +}; + +export default Navbar; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/main.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/main.jsx new file mode 100644 index 0000000..1f95cf7 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/main.jsx @@ -0,0 +1,21 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import { BrowserRouter } from 'react-router-dom'; + +import App from './App.jsx'; + +// JS import +import 'bootstrap'; +// import 'bootstrap/dist/css/bootstrap.min.css'; +import './styles/main.scss'; + +const root = createRoot(document.getElementById('root')); + +root.render( + + + + + , +); diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx new file mode 100644 index 0000000..0fbfc09 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx @@ -0,0 +1,34 @@ +const AboutPage = (props) => { + return ( +
+

About

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id + dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. + Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit + enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa + autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis + fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam + amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat + animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic + aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor + minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore + praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis + doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas + obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, + laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum + architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis + beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate + odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at + dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus + optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus + consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus + iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis + maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, + eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum +

+
+ ); +}; + +export default AboutPage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx new file mode 100644 index 0000000..fc53e25 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx @@ -0,0 +1,16 @@ +import FormContact from '../components/forms/FormContact'; + +const ContactPage = (props) => { + // const { } = props; + + return ( +
+

Contact

+

+ Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui +

+ +
+ ); +}; +export default ContactPage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx new file mode 100644 index 0000000..dbe58d5 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx @@ -0,0 +1,10 @@ +const HomePage = (props) => { + return ( +
+

Home

+

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

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

User

+

The nestes user site:

+
+
+
+ +
+
+
+

© 2026 IA Donkey Fabric

+
+
+
+ ); +}; +export default UserPage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx new file mode 100644 index 0000000..48c2d60 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx @@ -0,0 +1,18 @@ +import { useParams } from 'react-router-dom'; +import Badge from '../components/common/Badge'; + +const UserProfilePage = (props) => { + // const { } = props; + + const { userId } = useParams(); + + return ( +
+

+ User Profile +

+

Lorem ipsum dolor

+
+ ); +}; +export default UserProfilePage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx new file mode 100644 index 0000000..e9472b9 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx @@ -0,0 +1,61 @@ +import { Routes, Route, Navigate } from 'react-router-dom'; + +import About from '../pages/AboutPage'; +import Home from '../pages/HomePage'; +import Contact from '../pages/ContactPage'; +import UserProfilePage from '../pages/UserProfilePage'; +import UserPage from '../pages/UserPage'; + +// Prinzip einer geschützen Route-Komponente + +const checkAuth = () => { + // localStorage.setItem('token', 'secret-token'); + const token = localStorage.getItem('token'); + return token && token === 'secret-token' ? true : false; +}; + +const ProtectedRoute = (props) => { + const { redirectTo = '/', children } = props; + + const isAuthenticated = checkAuth(); // true | false // Authentication -Prüfung + + return isAuthenticated ? <>{children} : ; +}; + +const Router = (props) => { + // const { } = props; + + return ( + + {/* Static Routes */} + } /> + } /> + } /> + + {/* Dynamic Routes */} + Flights} /> + } /> + + {/* Nested Routes | Verschachtelte Routen */} + }> + Index} /> + Profile} /> + Dashboard} /> + + + {/* Protected Routes | Geschützte Routen */} + +
+

Admin Dashboard Page

+

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ad, ex?

+
+ + }>
+
+ ); +}; + +export default Router; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..dcefbc9 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss @@ -0,0 +1,3 @@ +// @import 'bootstrap-5.3.8/bootstrap-grid'; +@import 'bootstrap-5.3.8/bootstrap'; +// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss new file mode 100644 index 0000000..e9f267f --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss @@ -0,0 +1,153 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + > .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + > .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + // stylelint-disable selector-max-class + > .accordion-collapse, + > .accordion-header .accordion-button, + > .accordion-header .accordion-button.collapsed { + @include border-radius(0); + } + // stylelint-enable selector-max-class + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss new file mode 100644 index 0000000..cc3d269 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss @@ -0,0 +1,38 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + // scss-docs-start badge-css-vars + --#{$prefix}badge-padding-x: #{$badge-padding-x}; + --#{$prefix}badge-padding-y: #{$badge-padding-y}; + @include rfs($badge-font-size, --#{$prefix}badge-font-size); + --#{$prefix}badge-font-weight: #{$badge-font-weight}; + --#{$prefix}badge-color: #{$badge-color}; + --#{$prefix}badge-border-radius: #{$badge-border-radius}; + // scss-docs-end badge-css-vars + + display: inline-block; + padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); + @include font-size(var(--#{$prefix}badge-font-size)); + font-weight: var(--#{$prefix}badge-font-weight); + line-height: 1; + color: var(--#{$prefix}badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(var(--#{$prefix}badge-border-radius)); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss new file mode 100644 index 0000000..b8252ff --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss @@ -0,0 +1,40 @@ +.breadcrumb { + // scss-docs-start breadcrumb-css-vars + --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; + --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; + --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; + @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); + --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; + --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; + --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; + --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; + --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; + // scss-docs-end breadcrumb-css-vars + + display: flex; + flex-wrap: wrap; + padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); + margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); + @include font-size(var(--#{$prefix}breadcrumb-font-size)); + list-style: none; + background-color: var(--#{$prefix}breadcrumb-bg); + @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: var(--#{$prefix}breadcrumb-item-padding-x); + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: var(--#{$prefix}breadcrumb-item-padding-x); + color: var(--#{$prefix}breadcrumb-divider-color); + content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: var(--#{$prefix}breadcrumb-item-active-color); + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss new file mode 100644 index 0000000..78e1252 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss @@ -0,0 +1,147 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + // The top radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss new file mode 100644 index 0000000..caa4518 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss @@ -0,0 +1,216 @@ +// +// Base styles +// + +.btn { + // scss-docs-start btn-css-vars + --#{$prefix}btn-padding-x: #{$btn-padding-x}; + --#{$prefix}btn-padding-y: #{$btn-padding-y}; + --#{$prefix}btn-font-family: #{$btn-font-family}; + @include rfs($btn-font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-font-weight: #{$btn-font-weight}; + --#{$prefix}btn-line-height: #{$btn-line-height}; + --#{$prefix}btn-color: #{$btn-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-width: #{$btn-border-width}; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-border-radius: #{$btn-border-radius}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; + --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; + --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); + // scss-docs-end btn-css-vars + + display: inline-block; + padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); + font-family: var(--#{$prefix}btn-font-family); + @include font-size(var(--#{$prefix}btn-font-size)); + font-weight: var(--#{$prefix}btn-font-weight); + line-height: var(--#{$prefix}btn-line-height); + color: var(--#{$prefix}btn-color); + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); + @include border-radius(var(--#{$prefix}btn-border-radius)); + @include gradient-bg(var(--#{$prefix}btn-bg)); + @include box-shadow(var(--#{$prefix}btn-box-shadow)); + @include transition($btn-transition); + + &:hover { + color: var(--#{$prefix}btn-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}btn-hover-bg); + border-color: var(--#{$prefix}btn-hover-border-color); + } + + .btn-check + &:hover { + // override for the checkbox/radio buttons + color: var(--#{$prefix}btn-color); + background-color: var(--#{$prefix}btn-bg); + border-color: var(--#{$prefix}btn-border-color); + } + + &:focus-visible { + color: var(--#{$prefix}btn-hover-color); + @include gradient-bg(var(--#{$prefix}btn-hover-bg)); + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:focus-visible + & { + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:checked + &, + :not(.btn-check) + &:active, + &:first-child:active, + &.active, + &.show { + color: var(--#{$prefix}btn-active-color); + background-color: var(--#{$prefix}btn-active-bg); + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-active-border-color); + @include box-shadow(var(--#{$prefix}btn-active-shadow)); + + &:focus-visible { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + } + + .btn-check:checked:focus-visible + & { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + color: var(--#{$prefix}btn-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}btn-disabled-bg); + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-disabled-border-color); + opacity: var(--#{$prefix}btn-disabled-opacity); + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @if $color == "light" { + @include button-variant( + $value, + $value, + $hover-background: shade-color($value, $btn-hover-bg-shade-amount), + $hover-border: shade-color($value, $btn-hover-border-shade-amount), + $active-background: shade-color($value, $btn-active-bg-shade-amount), + $active-border: shade-color($value, $btn-active-border-shade-amount) + ); + } @else if $color == "dark" { + @include button-variant( + $value, + $value, + $hover-background: tint-color($value, $btn-hover-bg-tint-amount), + $hover-border: tint-color($value, $btn-hover-border-tint-amount), + $active-background: tint-color($value, $btn-active-bg-tint-amount), + $active-border: tint-color($value, $btn-active-border-tint-amount) + ); + } @else { + @include button-variant($value, $value); + } + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + --#{$prefix}btn-font-weight: #{$font-weight-normal}; + --#{$prefix}btn-color: #{$btn-link-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-active-color: #{$btn-link-hover-color}; + --#{$prefix}btn-active-border-color: transparent; + --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; + --#{$prefix}btn-disabled-border-color: transparent; + --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows + --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; + + text-decoration: $link-decoration; + @if $enable-gradients { + background-image: none; + } + + &:hover, + &:focus-visible { + text-decoration: $link-hover-decoration; + } + + &:focus-visible { + color: var(--#{$prefix}btn-color); + } + + &:hover { + color: var(--#{$prefix}btn-hover-color); + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss new file mode 100644 index 0000000..dcebe6a --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss @@ -0,0 +1,238 @@ +// +// Base styles +// + +.card { + // scss-docs-start card-css-vars + --#{$prefix}card-spacer-y: #{$card-spacer-y}; + --#{$prefix}card-spacer-x: #{$card-spacer-x}; + --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; + --#{$prefix}card-title-color: #{$card-title-color}; + --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; + --#{$prefix}card-border-width: #{$card-border-width}; + --#{$prefix}card-border-color: #{$card-border-color}; + --#{$prefix}card-border-radius: #{$card-border-radius}; + --#{$prefix}card-box-shadow: #{$card-box-shadow}; + --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; + --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; + --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; + --#{$prefix}card-cap-bg: #{$card-cap-bg}; + --#{$prefix}card-cap-color: #{$card-cap-color}; + --#{$prefix}card-height: #{$card-height}; + --#{$prefix}card-color: #{$card-color}; + --#{$prefix}card-bg: #{$card-bg}; + --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; + --#{$prefix}card-group-margin: #{$card-group-margin}; + // scss-docs-end card-css-vars + + position: relative; + display: flex; + flex-direction: column; + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 + height: var(--#{$prefix}card-height); + color: var(--#{$prefix}body-color); + word-wrap: break-word; + background-color: var(--#{$prefix}card-bg); + background-clip: border-box; + border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + @include border-radius(var(--#{$prefix}card-border-radius)); + @include box-shadow(var(--#{$prefix}card-box-shadow)); + + > hr { + margin-right: 0; + margin-left: 0; + } + + > .list-group { + border-top: inherit; + border-bottom: inherit; + + &:first-child { + border-top-width: 0; + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); + } + + &:last-child { + border-bottom-width: 0; + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); + } + } + + // Due to specificity of the above selector (`.card > .list-group`), we must + // use a child selector here to prevent double borders. + > .card-header + .list-group, + > .list-group + .card-footer { + border-top: 0; + } +} + +.card-body { + // Enable `flex-grow: 1` for decks and groups so that card blocks take up + // as much space as possible, ensuring footers are aligned to the bottom. + flex: 1 1 auto; + padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); + color: var(--#{$prefix}card-color); +} + +.card-title { + margin-bottom: var(--#{$prefix}card-title-spacer-y); + color: var(--#{$prefix}card-title-color); +} + +.card-subtitle { + margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list + margin-bottom: 0; + color: var(--#{$prefix}card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link { + &:hover { + text-decoration: if($link-hover-decoration == underline, none, null); + } + + + .card-link { + margin-left: var(--#{$prefix}card-spacer-x); + } +} + +// +// Optional textual caps +// + +.card-header { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + margin-bottom: 0; // Removes the default margin-bottom of + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:first-child { + @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); + } +} + +.card-footer { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:last-child { + @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); + } +} + + +// +// Header navs +// + +.card-header-tabs { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + border-bottom: 0; + + .nav-link.active { + background-color: var(--#{$prefix}card-bg); + border-bottom-color: var(--#{$prefix}card-bg); + } +} + +.card-header-pills { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list +} + +// Card image +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--#{$prefix}card-img-overlay-padding); + @include border-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch +} + +.card-img, +.card-img-top { + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-bottom { + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); +} + + +// +// Card groups +// + +.card-group { + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + margin-bottom: var(--#{$prefix}card-group-margin); + } + + @include media-breakpoint-up(sm) { + display: flex; + flex-flow: row wrap; + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + flex: 1 0 0; + margin-bottom: 0; + + + .card { + margin-left: 0; + border-left: 0; + } + + // Handle rounded corners + @if $enable-rounded { + &:not(:last-child) { + @include border-end-radius(0); + + > .card-img-top, + > .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-right-radius: 0; + } + > .card-img-bottom, + > .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-right-radius: 0; + } + } + + &:not(:first-child) { + @include border-start-radius(0); + + > .card-img-top, + > .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-left-radius: 0; + } + > .card-img-bottom, + > .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-left-radius: 0; + } + } + } + } + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss new file mode 100644 index 0000000..5ebf6b1 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss @@ -0,0 +1,226 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + filter: var(--#{$prefix}carousel-control-icon-filter); + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: var(--#{$prefix}carousel-indicator-active-bg); + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) * .5; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) * .5; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: var(--#{$prefix}carousel-caption-color); + text-align: center; +} + +// Dark mode carousel + +@mixin carousel-dark() { + --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; + --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; + --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; +} + +.carousel-dark { + @include carousel-dark(); +} + +:root, +[data-bs-theme="light"] { + --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; + --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; + --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; +} + +@if $enable-dark-mode { + @include color-mode(dark, true) { + @include carousel-dark(); + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss new file mode 100644 index 0000000..d53c96f --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss @@ -0,0 +1,66 @@ +// Transparent background and border properties included for button version. +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +.btn-close { + // scss-docs-start close-css-vars + --#{$prefix}btn-close-color: #{$btn-close-color}; + --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; + --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; + --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; + --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; + --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; + --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; + // scss-docs-end close-css-vars + + box-sizing: content-box; + width: $btn-close-width; + height: $btn-close-height; + padding: $btn-close-padding-y $btn-close-padding-x; + color: var(--#{$prefix}btn-close-color); + background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + filter: var(--#{$prefix}btn-close-filter); + border: 0; // for button elements + @include border-radius(); + opacity: var(--#{$prefix}btn-close-opacity); + + // Override
's hover style + &:hover { + color: var(--#{$prefix}btn-close-color); + text-decoration: none; + opacity: var(--#{$prefix}btn-close-hover-opacity); + } + + &:focus { + outline: 0; + box-shadow: var(--#{$prefix}btn-close-focus-shadow); + opacity: var(--#{$prefix}btn-close-focus-opacity); + } + + &:disabled, + &.disabled { + pointer-events: none; + user-select: none; + opacity: var(--#{$prefix}btn-close-disabled-opacity); + } +} + +@mixin btn-close-white() { + --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; +} + +.btn-close-white { + @include btn-close-white(); +} + +:root, +[data-bs-theme="light"] { + --#{$prefix}btn-close-filter: #{$btn-close-filter}; +} + +@if $enable-dark-mode { + @include color-mode(dark, true) { + @include btn-close-white(); + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss new file mode 100644 index 0000000..83b3138 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss @@ -0,0 +1,41 @@ +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +@if $enable-container-classes { + // Single container class with breakpoint max-widths + .container, + // 100% wide container at all breakpoints + .container-fluid { + @include make-container(); + } + + // Responsive containers that are 100% wide until a breakpoint + @each $breakpoint, $container-max-width in $container-max-widths { + .container-#{$breakpoint} { + @extend .container-fluid; + } + + @include media-breakpoint-up($breakpoint, $grid-breakpoints) { + %responsive-container-#{$breakpoint} { + max-width: $container-max-width; + } + + // Extend each breakpoint which is smaller or equal to the current breakpoint + $extend-breakpoint: true; + + @each $name, $width in $grid-breakpoints { + @if ($extend-breakpoint) { + .container#{breakpoint-infix($name, $grid-breakpoints)} { + @extend %responsive-container-#{$breakpoint}; + } + + // Once the current breakpoint is reached, stop extending + @if ($breakpoint == $name) { + $extend-breakpoint: false; + } + } + } + } + } +} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss new file mode 100644 index 0000000..587ebb4 --- /dev/null +++ b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss @@ -0,0 +1,250 @@ +// The dropdown wrapper (`
`) +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; + + // Generate the caret automatically + @include caret(); +} + +// The dropdown menu +.dropdown-menu { + // scss-docs-start dropdown-css-vars + --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; + --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; + --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; + --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; + --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; + @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); + --#{$prefix}dropdown-color: #{$dropdown-color}; + --#{$prefix}dropdown-bg: #{$dropdown-bg}; + --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; + --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; + --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; + --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; + --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; + --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; + --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; + --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; + --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; + --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; + --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; + --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; + --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; + --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; + --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; + --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; + --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; + // scss-docs-end dropdown-css-vars + + position: absolute; + z-index: var(--#{$prefix}dropdown-zindex); + display: none; // none by default, but block on "open" of the menu + min-width: var(--#{$prefix}dropdown-min-width); + padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); + margin: 0; // Override default margin of ul + @include font-size(var(--#{$prefix}dropdown-font-size)); + color: var(--#{$prefix}dropdown-color); + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + list-style: none; + background-color: var(--#{$prefix}dropdown-bg); + background-clip: padding-box; + border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); + @include border-radius(var(--#{$prefix}dropdown-border-radius)); + @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); + + &[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--#{$prefix}dropdown-spacer); + } + + @if $dropdown-padding-y == 0 { + > .dropdown-item:first-child, + > li:first-child .dropdown-item { + @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + > .dropdown-item:last-child, + > li:last-child .dropdown-item { + @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + + } +} + +// scss-docs-start responsive-breakpoints +// We deliberately hardcode the `bs-` prefix because we check +// this custom property in JS to determine Popper's positioning + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .dropdown-menu#{$infix}-start { + --bs-position: start; + + &[data-bs-popper] { + right: auto; + left: 0; + } + } + + .dropdown-menu#{$infix}-end { + --bs-position: end; + + &[data-bs-popper] { + right: 0; + left: auto; + } + } + } +} +// scss-docs-end responsive-breakpoints + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// Just add .dropup after the standard .dropdown class and you're set. +.dropup { + .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(up); + } +} + +.dropend { + .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(end); + &::after { + vertical-align: 0; + } + } +} + +.dropstart { + .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(start); + &::before { + vertical-align: 0; + } + } +} + + +// Dividers (basically an `
`) within the dropdown +.dropdown-divider { + height: 0; + margin: var(--#{$prefix}dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); + opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element +} + +// Links, buttons, and more within the dropdown menu +// +// `