From 70a9d3ca08647bfdfab8204256bca206b8e8e87a Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Fri, 7 Aug 2026 11:24:07 +0200 Subject: [PATCH] --- ...-javascript-cafe-template-gkontra-main.zip | Bin 0 -> 2595 bytes .../.gitignore | 24 + .../Aufgabgenstellung.md | 23 + .../README.md | 17 + .../index.js | 33 + .../Aufgabenstellung-alkoholtester.md | 140 ++ 05_react/uebungen/u08_badge-2/src/App.jsx | 8 +- .../u08_badge-2/src/components/Badge.jsx | 11 + .../u09_react-icons/package-lock.json | 16 +- .../uebungen/u09_react-icons/package.json | 3 +- .../src/components/inputs/InputAmount.jsx | 10 +- .../u10_input-price/package-lock.json | 16 +- .../uebungen/u10_input-price/package.json | 3 +- 05_react/uebungen/u10_input-price/src/App.jsx | 5 + .../src/components/inputs/InputPrice.jsx | 36 + .../src/styles/05_modules/_index.scss | 1 + .../src/styles/05_modules/_inputPrice.scss | 6 + .../u11_footer-main/package-lock.json | 16 +- .../uebungen/u11_footer-main/package.json | 3 +- 05_react/uebungen/u11_footer-main/src/App.jsx | 10 +- .../src/components/footers/FooterMain.jsx | 38 + .../src/styles/05_modules/_footer-main.scss | 25 +- .../src/styles/05_modules/_index.scss | 2 +- .../tag39/02_reusable-components/src/App.jsx | 8 +- .../src/components/buttons/Button.jsx | 26 +- .../tag40/01_reusable-components-2/.gitignore | 24 + .../01_reusable-components-2/.oxlintrc.json | 8 + .../tag40/01_reusable-components-2/README.md | 16 + .../tag40/01_reusable-components-2/index.html | 13 + .../package-lock.json | 2148 +++++++++++++++++ .../01_reusable-components-2/package.json | 25 + .../public/favicon.svg | 1 + .../01_reusable-components-2/public/icons.svg | 24 + .../01_reusable-components-2/src/App.jsx | 24 + .../src/assets/react.svg | 1 + .../src/assets/vite.svg | 1 + .../src/components/footers/FooterMain.jsx | 38 + .../src/components/headers/HeaderMain.jsx | 12 + .../01_reusable-components-2/src/main.jsx | 13 + .../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 | 44 + .../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 | 7 + .../src/styles/05_modules/_inputAmount.scss | 29 + .../src/styles/05_modules/_logo-main.scss | 14 + .../src/styles/05_modules/_menu-main.scss | 60 + .../styles/05_modules/_product-manager.scss | 37 + .../src/styles/main.scss | 16 + .../01_reusable-components-2/vite.config.js | 15 + 273 files changed, 26737 insertions(+), 38 deletions(-) create mode 100644 03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main.zip create mode 100644 03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore create mode 100644 03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md create mode 100644 03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md create mode 100644 03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js create mode 100644 03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md create mode 100644 05_react/uebungen/u08_badge-2/src/components/Badge.jsx create mode 100644 05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx create mode 100644 05_react/uebungen/u10_input-price/src/styles/05_modules/_inputPrice.scss create mode 100644 05_react/uebungen/u11_footer-main/src/components/footers/FooterMain.jsx create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/.gitignore create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/.oxlintrc.json create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/README.md create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/index.html create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/package-lock.json create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/package.json create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/public/favicon.svg create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/public/icons.svg create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/App.jsx create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/assets/react.svg create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/assets/vite.svg create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/components/footers/FooterMain.jsx create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/components/headers/HeaderMain.jsx create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/main.jsx create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_forms.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_functions.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_grid.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_helpers.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_images.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_list-group.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_maps.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_mixins.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_modal.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_nav.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_navbar.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_offcanvas.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_pagination.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_placeholders.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_popover.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_progress.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_reboot.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_root.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_spinners.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_tables.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_toasts.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_tooltip.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_transitions.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_type.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_utilities.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_variables-dark.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_variables.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-grid.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-reboot.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap-utilities.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/bootstrap.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_floating-labels.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-check.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-control.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-range.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-select.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_form-text.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_input-group.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_labels.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/forms/_validation.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_clearfix.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_color-bg.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_colored-links.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_focus-ring.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_icon-link.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_position.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_ratio.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_stacks.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_stretched-link.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_text-truncation.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_visually-hidden.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/helpers/_vr.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_alert.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_backdrop.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_banner.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_border-radius.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_box-shadow.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_breakpoints.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_buttons.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_caret.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_clearfix.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_color-mode.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_color-scheme.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_container.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_deprecate.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_forms.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_gradients.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_grid.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_image.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_list-group.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_lists.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_pagination.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_reset-text.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_resize.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_table-variants.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_text-truncate.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_transition.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_utilities.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/mixins/_visually-hidden.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/jasmine.js create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_auto-import-of-variables-dark.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_box-shadow.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_color-contrast.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_color-modes.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_media-query-color-mode-full.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/mixins/_utilities.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/sass-true/register.js create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/sass-true/runner.js create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/tests/utilities/_api.test.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/utilities/_api.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/vendor/_rfs.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/base/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/base/animations.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/base/generic.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/base/minireset.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/base/skeleton.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/breadcrumb.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/card.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/dropdown.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/menu.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/message.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/modal.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/navbar.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/pagination.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/panel.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/components/tabs.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/block.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/box.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/button.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/content.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/delete.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/icon.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/image.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/loader.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/notification.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/progress.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/table.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/tag.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/elements/title.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/checkbox-radio.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/file.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/input-textarea.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/select.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/shared.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/form/tools.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/grid/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/grid/columns.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/grid/grid.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/aspect-ratio.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/border.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/color.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/flexbox.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/float.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/gap.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/other.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/overflow.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/position.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/spacing.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/typography.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/helpers/visibility.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/container.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/footer.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/hero.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/level.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/media.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/layout/section.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/themes/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/themes/dark.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/themes/light.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/themes/setup.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/controls.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/css-variables.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/derived-variables.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/extends.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/functions.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/initial-variables.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bulma-1.04/utilities/mixins.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/02_fonts/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/02_fonts/_playfair-display-v40-latin.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/03_base/_colors.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/03_base/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/03_base/_theme.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/03_base/_typography.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/03_base/_utils.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/03_base/_variables.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/foundation/animations.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/draggable.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/fade.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/rtl.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/modifiers/ttb.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/container.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/list.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/pagination.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/progress.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/root.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/slide.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/spinner.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/sr.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/toggle.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/core/object/objects/track.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/foundation/colors.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/foundation/mixins.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/nav.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/rtl.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/modifiers/ttb.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/arrow.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/pagination.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/progress.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/slide.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/template/default/object/objects/toggle.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/themes/default/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/themes/sea-green/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/arrow.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/themes/sea-green/object/objects/root.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/splide-4.1.4/themes/skyblue/index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_button.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_footer-main.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_header-main.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_index.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_inputAmount.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_logo-main.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_menu-main.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/05_modules/_product-manager.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/src/styles/main.scss create mode 100644 05_react/unterricht/tag40/01_reusable-components-2/vite.config.js diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main.zip b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main.zip new file mode 100644 index 0000000000000000000000000000000000000000..abe1320f0babaf3868e8ed919e6cbe4b4ee91ae4 GIT binary patch literal 2595 zcmbuBc{J2*8^^~orck4@WRwxYi@}V2spb)5J2J%BLSyDfGN!?xNSG*jEn{twWk|>x z5s?rn#MB@r31jIIvb`I_jT^SzMu0w=Q`K*#ai(2@`FB~_tMtR zUp`+83bYk;(jS2*2I9#CfQUGW55)Tu{Jbbs1Oe{>AgF*3g@mU92v6@*WU3z?;e+=g ztJ>LuL0oA0g%jAX!dt!wyV(rCzrHEFy7>%#Nm#|xi|XY`KII2|Ljacg+ndz{UxmhG zlM`X_jocE>&~QV-E!#qu0k4Rc$-?{gISg5y>yFc1%%&?k*l#(J$qs)36m&JS1lG<7 z2L|>Y7m8w#R zKwUzM3Fi6Z8)REK3NjlKG_B%NNVwV;C1B&)i<1lxmGsUm7+ss={;U1wP{SlEZV;%O z7X;G(CHpqUzZqE?tN0MVxsS5#i0@Gos-IMHa=P?TK_A}eqa(G?7hUAy8+iSQJ7t>b z(@pv)bMCxq?liG~Bz!`&YQ@^lCF3Gwd0H6)pcwfrD5chj3P0BBy0KeruIf$*E&#dP zDvKs}+0Xs#fJ{ccye}suB{FrqbM3ZQrhLAJ1l3=m>4WtAbnvWMuIGd2LQxvynLPZu zrc06uD)czV6oJSHFoS$wVC13sBlZFeWBB^mA)AQfgl)}0cp_ax=?b8GICL+M&t4_eu77nwAu?57EG%p&Ys-HSTnb(IdA}OMo_B*a=gI@N=vr^RG zBP-_N$ABjd#qoTX{9DV*iseEikxzSoUXe@;zI3@EH-BpBUh}S$TBp;M{lqSvoFtbh zV*+|;d;2hVtnG?zhIZSFn-lDYypFMH-srwurI_WR8S=EQ_@u8$gs29!5PM#ljw9Fi z;`l5gne;V>7Y&7u@L65^_7wEQ%nhYD2}rg6y_v?EA+Z3DjWarTl1V|Gb+5BW+VsNm z;NlK%*TK>qRULNwPeayOPYWFyUFv(!O9rV=Kho0*1O2sOHTk1p^*kVuu^(>&T&ncFg(0YTL?=|MNSVaj5o}R+&(ziy>`s|8%WUoYCuJw^pwHpQ5 zrEYY6(hN*Lc{m5oZaFtQTU*yQTh&f8Y+6ttmaz7AFEUm{arz(#ggFy9vbxOwe)#A+ z&bF{|_@F@Lo#XCB0!35QHrfZd1KWfG;JJe#SQ23jPGa7C_Sc+HmW@enlzT0-a zE%NfLSIVNYB7YJpo%z-SV?R!XTriQ>$%2e=RE@uAP}sdAJ?khYrv|+v z_*g7v3Z_yqxifYBKd6qain|iFvZH`ZR*Fjwj?f{gqzx{+JV_KciuxG9XyD4R_m;Wh z@hLpg-wHBswM`|zxbx_mt78NST7DNos?8qg@l`fwwaBz6IteW?&C#0QBQt{f=$+3M+{bo=~4tstc8Acm_M*7c0*!`KKO`8HLp z5PzkN!!&!?ICQlQ?HaV#_mx-Q)RDdM7m^WS9BUXdlV-d-&Xt#PX_=cOOi7F|Wt+?2 zPMK7AHY;<{1G#OKG*NZTKI7Et2J`g1-67WU_3!y|Hl67j_XtNJmZ)M9uC)3oXB1U^?h#qNf*wT%bvE`GdoI2vpyz&*& zcutYa$F%myhP#$J$(;?ghEc-D=KzB@R(z9`P<`>&ij3*qOeaof@BusYfu;d(cc)6R z9^yoQFCpcAvAkS}rKQRHB>mQYeTiNFK1}jChztqB^}RHvIh|g+iRlYvz8V4tRdRZ! z+%S*xp@|7`iMaS>uZ_mRU8|yVSgF+R2OFE)jB9gy{qLOcXJioinjHSG)bL->Kj((e z1g=ehe;)bw&HW?s$6@=OxOFox{5i~eR22o2(Q`>`x(stJ-5CK5lT^B%V{Q*&~ BMb7{L literal 0 HcmV?d00001 diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore new file mode 100644 index 0000000..54f07af --- /dev/null +++ b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.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? \ No newline at end of file diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md new file mode 100644 index 0000000..8e321f8 --- /dev/null +++ b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md @@ -0,0 +1,23 @@ +## JavaScript Cafe + +Willkommen beim JavaScript Cafe! Als Entwickler bist du verantwortlich für die Erstellung eines Moduls, das dem Cafe-Manager hilft, die Daten der Speisekarte effizient zu analysieren und zu verwalten. Die Speisekarte ist in verschiedene Kategorien unterteilt (z.B. Getränke, Gebäck), die jeweils mehrere Artikel mit spezifischen Details enthalten. + +In dem Starter-Code ist ein mehrdimensionales Array, das die Speisekarte des Cafés darstellt. Jede Kategorie enthält mehrere Artikel, die jeweils mit einem Namen und einem Preis versehen sind. + +**Die Aufgaben sind** + +1. Liste alle Menüpunkte auf: + +- Schreib eine rekursive Funktion listMenuItems, die das Array menu bekommt und ein flaches Array mit den Namen aller Einträge zurückgibt. + +2. Eintragsdetails destrukturieren: + +- Nutze die Destrukturierung innerhalb der Funktion listMenuItems, um den Namen und den Preis jedes Eintrags herauszuziehen. + +3. Durchschnittlichen Preis berechnen: + +- Nachdem du alle Menüeinträge aufgelistet hast, berechne den Durchschnittspreis für alle Einträge. + +4. Artikel nach Kategorie suchen: + +- Schreib eine Funktion findItemsByCategory, die das Menü-Array und einen Kategorienamen nimmt und ein Array mit allen Einträgen dieser Kategorie zurückgibt. \ No newline at end of file diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md new file mode 100644 index 0000000..601f2df --- /dev/null +++ b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md @@ -0,0 +1,17 @@ +## License and terms of use + +© Web Professional Institute Inc. All rights reserved. + +This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. + +**Usage Restrictions:** + +- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. +- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. +- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. + +**Agreement & Rights:** + +As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. + +For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js new file mode 100644 index 0000000..442ef2f --- /dev/null +++ b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js @@ -0,0 +1,33 @@ +'use strict'; +(() => { + // === DOM & VARS ======= + const DOM = {}; + + // === DATA ============= + const menu = [ + { + category: 'Beverages', + items: [ + { name: 'Coffee', price: 3.5 }, + { name: 'Tea', price: 2.5 }, + { name: 'Juice', price: 4 }, + ], + }, + { + category: 'Pastries', + items: [ + { name: 'Croissant', price: 2.75 }, + { name: 'Muffin', price: 2.5 }, + { name: 'Bagel', price: 2.25 }, + ], + }, + { + category: 'Sandwiches', + items: [ + { name: 'Ham Sandwich', price: 5.5 }, + { name: 'Veggie Sandwich', price: 5 }, + { name: 'Turkey Sandwich', price: 6 }, + ], + }, + ]; +})(); diff --git a/03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md b/03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md new file mode 100644 index 0000000..e4f41af --- /dev/null +++ b/03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md @@ -0,0 +1,140 @@ +# Projektarbeit 2: Fahrtüchtigkeitstester + + +## Einleitung +Dein Auftraggeber arbeitet an einer App, die es Anwendern erlaubt, eine grobe Einschätzung ihres jeweiligen Blutalkoholgehalts vorzunehmen. Die Anwendung hat natürlich keine Rechtsverbindlichkeit — möglicherweise hält sie jedoch manch angetrunkenen Partygast davon ab, sich ans Steuer zu setzen, um Schlangenlinien zu erproben und Schafe zu überfahren. Mit Sicherheit wird die App der Hit auf der nächsten Party. + +Das Ganze funktioniert folgendermaßen: Anwender geben zunächst ihr Gewicht in der App an und loggen danach bei Bedarf Getränke ein. Die App errechnet daraus den geschätzten aktuellen Blutalkoholgehalt (EBAC) und gibt diesen in Promille aus — inkl. eines Warnhinweises zur Fahrtauglichkeit. + +Der mobile Client ist bereits fertig. Deine Aufgabe besteht nun darin, den Kern der Anwendung zu entwickeln, die später auf dem Server laufen soll. Du bekommst fertige JSON-Datensätze geliefert, kannst dich aber nicht unbedingt darauf verlassen, dass sie komplett fehlerfrei sind und der Spezifikation entsprechen. Um Fehler zu vermeiden, müssen die Datensätze zunächst auf ihre Richtigkeit überprüft, d. h. validiert werden. Erst anschließend kümmerst du dich um die eigentliche Berechnung des Blutalkoholgehalts und die Ausgabe einer Empfehlung. + +## Technologien +Setze JavaScript – ECMAScript 2015 (ES6) oder neuer ein. Externe JavaScript-Bibliotheken (oder aus Drittquellen übernommener Code) sind nicht zugelassen. Überprüft wird die Aufgabe im aktuellen Chrome-Browser. + +## Arbeitsschritt 1: Validierung entstandener Datensätze +Die mobile App produziert Datensätze nach folgendem Format: + +- Es handelt sich um ein Objekt mit den Keys weight und drinks. +- Der Value von weight ist eine positive Zahl. +- Der Value von drinks ist ein Array. +- Das drinks-Array enthält seinerseits Objekte — es können beliebig viele sein. +- Die Objekte im drinks-Array haben die Keys type und amount. +- Der Value von type ist ein String. +- Der Value von amount ist eine positive Ganzzahl. + +## Beispiel + +Jemand, der 89,5 Kilogramm wiegt und 5 Gläser Wein, dann 3 Flaschen Bier und später noch mal 2 Gläser Wein getrunken hat … dem ist vermutlich ziemlich übel. Außerdem erhält er den nachfolgenden Datensatz (oder zumindest einen inhaltlich vergleichbaren): + +```js +{ + weight: 89.5, + drinks: [ + {type: "wine", amount: 5}, + {type: "beer", amount: 3}, + {type: "wine", amount: 2}, + ] +} +``` +​ + +Schreibe eine Funktion validateRecords, die einen Datensatz entgegennimmt und Fehler feststellt, wenn der Datensatz von folgenden Vorgaben abweicht: + +- Der Datensatz hat das korrekte Format (siehe Auflistung oben). +- Die benötigten Keys sind in den Objekten vorhanden. Es spielt dabei keine Rolle, in welcher Reihenfolge die Keys hinterlegt sind, d. h. {weight: …, drinks: …} ist genauso korrekt wie {drinks: …, weight: …} +- Die Anzahl der Keys ist nicht festgelegt, d. h. es dürfen neben den verlangten Keys noch weitere vorhanden sein. +- Das Gewicht enthält eine valide (positive) Zahl (62.5 wäre beispielsweise zulässig). +- Die Anzahl der Flaschen oder Gläser ist eine valide (positive) Ganzzahl (1.5 Flaschen wären beispielsweise nicht zulässig). +- Deine Funktion validateRecords soll ein Array zurückliefern, das alle gefundenen Fehler enthält. Gib das Array zur Kontrolle aus — jeweils eine Zeile pro Fehlermeldung. + +**Beispiel** + +```js +{ + weight: "sixty", + drinks: [ + {type: "wine", amount: 2.5}, + {type: "beer", amount: 3} + ] +} +{ + weight: "sixty", + drinks: [ + {type: "wine", amount: 2.5}, + {type: "beer", amount: 3} + ] +} +// > ['sixty is not a valid weight', +// '2.5 is not a valid number of bottles or glasses'] +``` +​ + +## Arbeitsschritt 2: Berechnung des Blutalkoholgehalts + +Schreibe eine Funktion bloodAlcoholContentFor, die einen Datensatz (wie in Teil 1 beschrieben) entgegennimmt, den Blutalkoholgehalt berechnet und anschließend in Promille zurückgibt. Gib den berechneten Wert anschließend in der Konsole aus. + +Hier sind die Formeln, die du benötigst: + +Die sogenannte Widmark-Formel für den EBAC in % (estimated peak blood alcohol concentration – Blutalkoholgehalt; siehe https://en.wikipedia.org/wiki/Blood_alcohol_content). + +```js +ebac = (0.806 * Anzahl der Standarddrinks * 1.2) / (0.5 * Gewicht) +``` + +Beachte, dass es sich hier um eine vereinfachte Formel handelt — Geschlecht und Zeitraum werden nicht beachtet. + +Zur Berechnung des EBACs benötigst du neben dem Gewicht die Anzahl der Standarddrinks. Deswegen musst du zunächst die Menge des reinen Alkohols im Datensatz berechnen und diese dann in eine Anzahl von Standarddrinks umrechnen. Dazu dient folgende Formel: + +```js +Anzahl der Standarddrinks = Alkoholmenge in L * 1000 / STANDARD_DRINK_ALCOHOL_CONTENT +``` + +Hier noch die Formeln zur Berechnung der Alkoholmenge: + +```js +Alkoholmenge im Wein = Anzahl der Gläser * WINE_GLASS_SIZE * WINE_ALC_PERCENTAGE / 100 +Alkoholmenge im Bier = Anzahl der Flaschen * BEER_BOTTLE_SIZE * BEER_ALC_PERCENTAGE / 100 +``` + +Außerdem gelten folgende (vereinfachte) Vorgaben: + +```js +const WINE_GLASS_SIZE = 0.2; +const WINE_ALC_PERCENTAGE = 14; +const BEER_BOTTLE_SIZE = 0.7; +const BEER_ALC_PERCENTAGE = 5; +const STANDARD +const WINE_GLASS_SIZE = 0.2; +const WINE_ALC_PERCENTAGE = 14; +const BEER_BOTTLE_SIZE = 0.7; +const BEER_ALC_PERCENTAGE = 5; +const STANDARD_DRINK_ALCOHOL_CONTENT = 17; +``` +​ +Denke auch daran, für die Ausgabe den EBAC von % in Promille umzurechnen. + +## Arbeitsschritt 3: Ausgabe der Empfehlung + +Gib eine Bemerkung zum übergebenen Datensatz in der Konsole aus. Die Bemerkung soll sich dabei am berechneten Blutalkoholgehalt orientieren. Ein Beispiel zeigt die folgende Tabelle. Du kannst aber natürlich eigene Werte und eigene Texte verwenden. Wichtig ist, dass du wenigstens fünf Abstufungen unterscheidest. + +BAC in Promille | Ausgabe +--- | --- +bis 0.29 | Sie sind vermutlich noch fahrtüchtig. Diese Angabe ist nicht rechtsverbindlich! +ab 0.3 | Sie haben vermutlich schon Konzentrationsschwierigkeiten. Sie sollten nicht mehr fahren. +ab 0.6 | Fahren Sie nicht, das könnte Sie sonst den Führerschein kosten. Denken Sie auch an die armen Schafe. +ab 1.0 | Wie viele Handys halten Sie in der Hand? +ab 5.0 | Sie sind vermutlich tot — oder haben sich vertippt. + + +**Hinweise** + +Du musst die Daten nicht vom Anwender per Prompt, Formular oder ähnlichem erfragen. Gehe einfach davon aus, dass du die JSON-Daten fertig geliefert bekommst. + +Die in der Aufgabe genannten Angaben zur API sind grundsätzlich verpflichtend. D. h. du verwendest die in der Aufgabenstellung genannten Funktionsnamen, Argumente, Argumentnamen, Rückgabewerte, usw. Dazu gehört auch der beschriebene Aufbau der JSON-Datensätze. + +**Tipps zur Vorgehensweise** +Schreibe nicht den kompletten Validierungscode innerhalb von validateRecords. Entwickle stattdessen kleinere Funktionen, die Teile der Funktionalität erledigen. + +Selbstverständlich kannst du die Implementierung der verlangten Funktionen jederzeit wieder in weitere Funktionen unterteilen. + +Schreibe kleine Einzelfunktionen, z. B. zur Berechnung der Alkoholmenge in einem Weindatensatz. Diese sollten auch jede Formel als eigene Funktion repräsentieren. \ No newline at end of file diff --git a/05_react/uebungen/u08_badge-2/src/App.jsx b/05_react/uebungen/u08_badge-2/src/App.jsx index c0fa506..895c371 100644 --- a/05_react/uebungen/u08_badge-2/src/App.jsx +++ b/05_react/uebungen/u08_badge-2/src/App.jsx @@ -1,12 +1,16 @@ +import Badge from './components/Badge'; + function App() { return (

Badges

- {/* + - */} + + +
); diff --git a/05_react/uebungen/u08_badge-2/src/components/Badge.jsx b/05_react/uebungen/u08_badge-2/src/components/Badge.jsx new file mode 100644 index 0000000..23cedae --- /dev/null +++ b/05_react/uebungen/u08_badge-2/src/components/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/u09_react-icons/package-lock.json b/05_react/uebungen/u09_react-icons/package-lock.json index b21b523..50d89af 100644 --- a/05_react/uebungen/u09_react-icons/package-lock.json +++ b/05_react/uebungen/u09_react-icons/package-lock.json @@ -1,16 +1,17 @@ { - "name": "02_reusable-components", + "name": "u09_react-icons", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "02_reusable-components", + "name": "u09_react-icons", "version": "0.0.0", "dependencies": { "bootstrap": "^5.3.8", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" }, "devDependencies": { "@types/react": "^19.2.17", @@ -1622,6 +1623,15 @@ "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/readdirp": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", diff --git a/05_react/uebungen/u09_react-icons/package.json b/05_react/uebungen/u09_react-icons/package.json index 01f1691..5249605 100644 --- a/05_react/uebungen/u09_react-icons/package.json +++ b/05_react/uebungen/u09_react-icons/package.json @@ -12,7 +12,8 @@ "dependencies": { "bootstrap": "^5.3.8", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" }, "devDependencies": { "@types/react": "^19.2.17", diff --git a/05_react/uebungen/u09_react-icons/src/components/inputs/InputAmount.jsx b/05_react/uebungen/u09_react-icons/src/components/inputs/InputAmount.jsx index d18889e..4d5993e 100644 --- a/05_react/uebungen/u09_react-icons/src/components/inputs/InputAmount.jsx +++ b/05_react/uebungen/u09_react-icons/src/components/inputs/InputAmount.jsx @@ -1,3 +1,5 @@ +import { FaMinus, FaPlus } from 'react-icons/fa6'; +// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig const InputAmount = (props) => { // const { } = props; @@ -5,14 +7,14 @@ const InputAmount = (props) => {
- -
diff --git a/05_react/uebungen/u10_input-price/package-lock.json b/05_react/uebungen/u10_input-price/package-lock.json index b21b523..77714cb 100644 --- a/05_react/uebungen/u10_input-price/package-lock.json +++ b/05_react/uebungen/u10_input-price/package-lock.json @@ -1,16 +1,17 @@ { - "name": "02_reusable-components", + "name": "u10_input-price", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "02_reusable-components", + "name": "u10_input-price", "version": "0.0.0", "dependencies": { "bootstrap": "^5.3.8", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" }, "devDependencies": { "@types/react": "^19.2.17", @@ -1622,6 +1623,15 @@ "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/readdirp": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", diff --git a/05_react/uebungen/u10_input-price/package.json b/05_react/uebungen/u10_input-price/package.json index ab03f91..1f437f1 100644 --- a/05_react/uebungen/u10_input-price/package.json +++ b/05_react/uebungen/u10_input-price/package.json @@ -12,7 +12,8 @@ "dependencies": { "bootstrap": "^5.3.8", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" }, "devDependencies": { "@types/react": "^19.2.17", diff --git a/05_react/uebungen/u10_input-price/src/App.jsx b/05_react/uebungen/u10_input-price/src/App.jsx index 81a856f..834248c 100644 --- a/05_react/uebungen/u10_input-price/src/App.jsx +++ b/05_react/uebungen/u10_input-price/src/App.jsx @@ -1,4 +1,5 @@ import InputAmount from './components/inputs/InputAmount'; +import InputPrice from './components/inputs/InputPrice'; function App(props) { // const { } = props; @@ -6,6 +7,10 @@ function App(props) { return (
+ + + +
); } diff --git a/05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx b/05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx new file mode 100644 index 0000000..8591343 --- /dev/null +++ b/05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx @@ -0,0 +1,36 @@ +import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; + +const InputPrice = (props) => { + const { currency = '$' } = props; + + return ( +
+
+ {currency === '$' && ( + + + + )} + + {currency === '€' && ( + + + + )} + {currency === '¥' && ( + + + + )} +
+
+ ); +}; +export default InputPrice; diff --git a/05_react/uebungen/u10_input-price/src/styles/05_modules/_index.scss b/05_react/uebungen/u10_input-price/src/styles/05_modules/_index.scss index ae3ecda..8bc376b 100644 --- a/05_react/uebungen/u10_input-price/src/styles/05_modules/_index.scss +++ b/05_react/uebungen/u10_input-price/src/styles/05_modules/_index.scss @@ -5,3 +5,4 @@ // @import 'product-manager'; @import 'button'; @import 'inputAmount'; +@import 'inputPrice'; diff --git a/05_react/uebungen/u10_input-price/src/styles/05_modules/_inputPrice.scss b/05_react/uebungen/u10_input-price/src/styles/05_modules/_inputPrice.scss new file mode 100644 index 0000000..1d46019 --- /dev/null +++ b/05_react/uebungen/u10_input-price/src/styles/05_modules/_inputPrice.scss @@ -0,0 +1,6 @@ +.m-input-price { + max-width: 200px; + input { + text-align: center; + } +} diff --git a/05_react/uebungen/u11_footer-main/package-lock.json b/05_react/uebungen/u11_footer-main/package-lock.json index b21b523..e697a16 100644 --- a/05_react/uebungen/u11_footer-main/package-lock.json +++ b/05_react/uebungen/u11_footer-main/package-lock.json @@ -1,16 +1,17 @@ { - "name": "02_reusable-components", + "name": "u11_footer-main", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "02_reusable-components", + "name": "u11_footer-main", "version": "0.0.0", "dependencies": { "bootstrap": "^5.3.8", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" }, "devDependencies": { "@types/react": "^19.2.17", @@ -1622,6 +1623,15 @@ "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/readdirp": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", diff --git a/05_react/uebungen/u11_footer-main/package.json b/05_react/uebungen/u11_footer-main/package.json index 111f9d0..097f36b 100644 --- a/05_react/uebungen/u11_footer-main/package.json +++ b/05_react/uebungen/u11_footer-main/package.json @@ -12,7 +12,8 @@ "dependencies": { "bootstrap": "^5.3.8", "react": "^19.2.8", - "react-dom": "^19.2.8" + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" }, "devDependencies": { "@types/react": "^19.2.17", diff --git a/05_react/uebungen/u11_footer-main/src/App.jsx b/05_react/uebungen/u11_footer-main/src/App.jsx index 81a856f..345cc74 100644 --- a/05_react/uebungen/u11_footer-main/src/App.jsx +++ b/05_react/uebungen/u11_footer-main/src/App.jsx @@ -1,12 +1,16 @@ +import FooterMain from './components/footers/FooterMain'; import InputAmount from './components/inputs/InputAmount'; function App(props) { // const { } = props; return ( -
- -
+ <> +
+ +
+ + ); } diff --git a/05_react/uebungen/u11_footer-main/src/components/footers/FooterMain.jsx b/05_react/uebungen/u11_footer-main/src/components/footers/FooterMain.jsx new file mode 100644 index 0000000..6c746be --- /dev/null +++ b/05_react/uebungen/u11_footer-main/src/components/footers/FooterMain.jsx @@ -0,0 +1,38 @@ +const FooterMain = (props) => { + // const { } = props; + + return ( +
+
+
+
+
+

Address

+
+
+
+
+

Links

+ +
+
+
+
+

Socials

+
+
+
+
+
+ ); +}; +export default FooterMain; diff --git a/05_react/uebungen/u11_footer-main/src/styles/05_modules/_footer-main.scss b/05_react/uebungen/u11_footer-main/src/styles/05_modules/_footer-main.scss index a0aeac3..e171af5 100644 --- a/05_react/uebungen/u11_footer-main/src/styles/05_modules/_footer-main.scss +++ b/05_react/uebungen/u11_footer-main/src/styles/05_modules/_footer-main.scss @@ -1,8 +1,8 @@ -.footer-main { +.m-footer-main { background: $color-dark-blue; // Fallback für ältere Browser background: $linear-gradient-dark; - padding: 2rem 0; - .col { + padding: 3rem 0; + [class^='col'] { color: $color-white; h2, h3, @@ -15,4 +15,23 @@ letter-spacing: 2px; } } + + .row { + flex-direction: column; + > div { + &:nth-child(1) { + order: 2; + } + &:nth-child(2) { + order: 1; + } + } + } + + // @media (min-width:576px) { + @include media-breakpoint-up(sm) { + .row { + flex-direction: row; + } + } } diff --git a/05_react/uebungen/u11_footer-main/src/styles/05_modules/_index.scss b/05_react/uebungen/u11_footer-main/src/styles/05_modules/_index.scss index ae3ecda..4cea0f1 100644 --- a/05_react/uebungen/u11_footer-main/src/styles/05_modules/_index.scss +++ b/05_react/uebungen/u11_footer-main/src/styles/05_modules/_index.scss @@ -1,4 +1,4 @@ -// @import 'footer-main'; +@import 'footer-main'; // @import 'header-main'; // @import 'logo-main'; // @import 'menu-main'; diff --git a/05_react/unterricht/tag39/02_reusable-components/src/App.jsx b/05_react/unterricht/tag39/02_reusable-components/src/App.jsx index 89d7515..ed95d4b 100644 --- a/05_react/unterricht/tag39/02_reusable-components/src/App.jsx +++ b/05_react/unterricht/tag39/02_reusable-components/src/App.jsx @@ -1,4 +1,4 @@ -// import Button from './components/buttons/Button'; +import Button from './components/buttons/Button'; import InputAmount from './components/inputs/InputAmount'; function App(props) { @@ -6,11 +6,11 @@ function App(props) { return (
- + {/* */} - {/* + - */} +
); } diff --git a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx b/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx index 1b33420..1cab98d 100644 --- a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx +++ b/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx @@ -1,8 +1,13 @@ -// import './Button.scss'; +// css import +// import './Button.css'; +// CSS Module import // import styles from './Button.module.css'; -// Button.jsx +// SASS Import - benötigt sass compiler (npm install sass -D oder npm install sass-embedded -D) +// import './Button.scss'; + +// import von Modul, welches SFC (Single File Component) ermöglicht import styled from 'styled-components'; // styled-components, JSS, Emotion - ermöglichen CSS in JS und somit SFC (Single File Components) @@ -26,22 +31,25 @@ const Button = (props) => { return ; + // style-components - Komponente // return ( - // + // // {props.children || 'Click Me'} // // ); - // return ( - // - // ); - + // CSS Module // return ( // // ); + + // CSS Klassenzuweisung (classic) + // return ( + // + // ); }; export default Button; diff --git a/05_react/unterricht/tag40/01_reusable-components-2/.gitignore b/05_react/unterricht/tag40/01_reusable-components-2/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/.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/tag40/01_reusable-components-2/.oxlintrc.json b/05_react/unterricht/tag40/01_reusable-components-2/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/.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/tag40/01_reusable-components-2/README.md b/05_react/unterricht/tag40/01_reusable-components-2/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/index.html b/05_react/unterricht/tag40/01_reusable-components-2/index.html new file mode 100644 index 0000000..3b88ded --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/index.html @@ -0,0 +1,13 @@ + + + + + + + 01_reusable-components-2 + + +
+ + + diff --git a/05_react/unterricht/tag40/01_reusable-components-2/package-lock.json b/05_react/unterricht/tag40/01_reusable-components-2/package-lock.json new file mode 100644 index 0000000..59d9792 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/package-lock.json @@ -0,0 +1,2148 @@ +{ + "name": "01_reusable-components-2", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "01_reusable-components-2", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.4", + "oxlint": "^1.75.0", + "sass-embedded": "^1.100.0", + "vite": "^8.2.0" + } + }, + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", + "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", + "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", + "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", + "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", + "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", + "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", + "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", + "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", + "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", + "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", + "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", + "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", + "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", + "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", + "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", + "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", + "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", + "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", + "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.77.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", + "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", + "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/@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/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/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.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "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.77.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", + "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", + "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.77.0", + "@oxlint/binding-android-arm64": "1.77.0", + "@oxlint/binding-darwin-arm64": "1.77.0", + "@oxlint/binding-darwin-x64": "1.77.0", + "@oxlint/binding-freebsd-x64": "1.77.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", + "@oxlint/binding-linux-arm-musleabihf": "1.77.0", + "@oxlint/binding-linux-arm64-gnu": "1.77.0", + "@oxlint/binding-linux-arm64-musl": "1.77.0", + "@oxlint/binding-linux-ppc64-gnu": "1.77.0", + "@oxlint/binding-linux-riscv64-gnu": "1.77.0", + "@oxlint/binding-linux-riscv64-musl": "1.77.0", + "@oxlint/binding-linux-s390x-gnu": "1.77.0", + "@oxlint/binding-linux-x64-gnu": "1.77.0", + "@oxlint/binding-linux-x64-musl": "1.77.0", + "@oxlint/binding-openharmony-arm64": "1.77.0", + "@oxlint/binding-win32-arm64-msvc": "1.77.0", + "@oxlint/binding-win32-ia32-msvc": "1.77.0", + "@oxlint/binding-win32-x64-msvc": "1.77.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/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/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/tag40/01_reusable-components-2/package.json b/05_react/unterricht/tag40/01_reusable-components-2/package.json new file mode 100644 index 0000000..af7e71d --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/package.json @@ -0,0 +1,25 @@ +{ + "name": "01_reusable-components-2", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.4", + "oxlint": "^1.75.0", + "sass-embedded": "^1.100.0", + "vite": "^8.2.0" + } +} diff --git a/05_react/unterricht/tag40/01_reusable-components-2/public/favicon.svg b/05_react/unterricht/tag40/01_reusable-components-2/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05_react/unterricht/tag40/01_reusable-components-2/public/icons.svg b/05_react/unterricht/tag40/01_reusable-components-2/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/App.jsx b/05_react/unterricht/tag40/01_reusable-components-2/src/App.jsx new file mode 100644 index 0000000..6c88042 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/src/App.jsx @@ -0,0 +1,24 @@ +import HeaderMain from './components/headers/HeaderMain'; +import FooterMain from './components/footers/FooterMain'; + +function App(props) { + // const { } = props; + + return ( + <> + +
+
+

Site

+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Enim, delectus debitis. A, nostrum dolores + aspernatur earum asperiores illum libero ab quasi unde distinctio nobis amet rem eveniet fuga! Nulla, + architecto! +

+
+
+ + + ); +} +export default App; diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/assets/react.svg b/05_react/unterricht/tag40/01_reusable-components-2/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/assets/vite.svg b/05_react/unterricht/tag40/01_reusable-components-2/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag40/01_reusable-components-2/src/components/footers/FooterMain.jsx new file mode 100644 index 0000000..6c746be --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/src/components/footers/FooterMain.jsx @@ -0,0 +1,38 @@ +const FooterMain = (props) => { + // const { } = props; + + return ( +
+
+
+
+
+

Address

+
+
+
+
+

Links

+ +
+
+
+
+

Socials

+
+
+
+
+
+ ); +}; +export default FooterMain; diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag40/01_reusable-components-2/src/components/headers/HeaderMain.jsx new file mode 100644 index 0000000..f99ae1c --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/src/components/headers/HeaderMain.jsx @@ -0,0 +1,12 @@ +const HeaderMain = (props) => { + // const { } = props; + + return ( +
+
+

Logo

+
+
+ ); +}; +export default HeaderMain; diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/main.jsx b/05_react/unterricht/tag40/01_reusable-components-2/src/main.jsx new file mode 100644 index 0000000..4f28fd8 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/src/main.jsx @@ -0,0 +1,13 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +// import von 'main'-Datei +import './styles/main.scss'; + +import App from './App.jsx'; + +createRoot(document.getElementById('root')).render( + + + , +); diff --git a/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..dcefbc9 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss new file mode 100644 index 0000000..e9f267f --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss new file mode 100644 index 0000000..cc3d269 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss new file mode 100644 index 0000000..b8252ff --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss new file mode 100644 index 0000000..78e1252 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss new file mode 100644 index 0000000..caa4518 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss new file mode 100644 index 0000000..dcebe6a --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss new file mode 100644 index 0000000..5ebf6b1 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss new file mode 100644 index 0000000..d53c96f --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss new file mode 100644 index 0000000..83b3138 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag40/01_reusable-components-2/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss new file mode 100644 index 0000000..587ebb4 --- /dev/null +++ b/05_react/unterricht/tag40/01_reusable-components-2/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 +// +// `