From d918c197ae81cdd20f6331ade1e4f4520c168605 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Fri, 6 Nov 2026 11:28:45 +0100 Subject: [PATCH] --- 06_react/unterricht/tag41-44/README.md | 1 + .../tag45/01_react-app-with-tests/.gitignore | 24 + .../01_react-app-with-tests/.oxlintrc.json | 8 + .../tag45/01_react-app-with-tests/README.md | 16 + .../tag45/01_react-app-with-tests/index.html | 13 + .../01_react-app-with-tests/package-lock.json | 1146 ++++++----- .../01_react-app-with-tests/package.json | 37 + .../public/favicon.svg | 1 + .../01_react-app-with-tests/public/icons.svg | 24 + .../tag45/01_react-app-with-tests/src/App.jsx | 20 + .../src/assets/react.svg | 1 + .../src/assets/vite.svg | 1 + .../src/components/buttons/Button.jsx | 24 + .../components/examples/ExampleComponent.jsx | 10 + .../components/examples/ExampleUserList.jsx | 19 + .../__test__/ExampleComponent.test.jsx | 20 + .../src/components/forms/FormContact.jsx | 99 + .../01_react-app-with-tests/src/main.jsx | 14 + .../src/styles/abstracts/_colors.scss | 14 + .../src/styles/abstracts/_index.scss | 3 + .../src/styles/abstracts/_typography.scss | 9 + .../src/styles/abstracts/_variables.scss | 0 .../src/styles/base/_index.scss | 2 + .../src/styles/base/_theme.scss | 53 + .../src/styles/base/_utils.scss | 0 .../src/styles/components/_button.scss | 13 + .../src/styles/components/_footer-main.scss | 59 + .../src/styles/components/_header-main.scss | 85 + .../src/styles/components/_index.scss | 11 + .../src/styles/components/_inputAmount.scss | 29 + .../src/styles/components/_inputPrice.scss | 5 + .../src/styles/components/_logo-main.scss | 14 + .../src/styles/components/_menu-main.scss | 62 + .../src/styles/components/_nav-main.scss | 8 + .../src/styles/components/_nav-social.scss | 75 + .../styles/components/_product-manager.scss | 37 + .../styles/components/_table-products.scss | 13 + .../src/styles/fonts/_index.scss | 2 + .../fonts/_playfair-display-v40-latin.scss | 96 + .../fonts/_source-sans-3-v19-latin.scss | 134 ++ .../src/styles/icons/_index.scss | 1 + .../styles/icons/fontawesome-7.3.0/index.scss | 1 + .../src/styles/libraries/_index.scss | 3 + .../libraries/bootstrap-5.3.8/_accordion.scss | 153 ++ .../libraries/bootstrap-5.3.8/_alert.scss | 68 + .../libraries/bootstrap-5.3.8/_badge.scss | 38 + .../bootstrap-5.3.8/_breadcrumb.scss | 40 + .../bootstrap-5.3.8/_button-group.scss | 147 ++ .../libraries/bootstrap-5.3.8/_buttons.scss | 216 ++ .../libraries/bootstrap-5.3.8/_card.scss | 238 +++ .../libraries/bootstrap-5.3.8/_carousel.scss | 226 +++ .../libraries/bootstrap-5.3.8/_close.scss | 66 + .../bootstrap-5.3.8/_containers.scss | 41 + .../libraries/bootstrap-5.3.8/_dropdown.scss | 250 +++ .../libraries/bootstrap-5.3.8/_forms.scss | 9 + .../libraries/bootstrap-5.3.8/_functions.scss | 302 +++ .../libraries/bootstrap-5.3.8/_grid.scss | 39 + .../libraries/bootstrap-5.3.8/_helpers.scss | 12 + .../libraries/bootstrap-5.3.8/_images.scss | 42 + .../bootstrap-5.3.8/_list-group.scss | 199 ++ .../libraries/bootstrap-5.3.8/_maps.scss | 174 ++ .../libraries/bootstrap-5.3.8/_mixins.scss | 42 + .../libraries/bootstrap-5.3.8/_modal.scss | 240 +++ .../libraries/bootstrap-5.3.8/_nav.scss | 197 ++ .../libraries/bootstrap-5.3.8/_navbar.scss | 289 +++ .../libraries/bootstrap-5.3.8/_offcanvas.scss | 147 ++ .../bootstrap-5.3.8/_pagination.scss | 109 + .../bootstrap-5.3.8/_placeholders.scss | 51 + .../libraries/bootstrap-5.3.8/_popover.scss | 196 ++ .../libraries/bootstrap-5.3.8/_progress.scss | 68 + .../libraries/bootstrap-5.3.8/_reboot.scss | 617 ++++++ .../libraries/bootstrap-5.3.8/_root.scss | 187 ++ .../libraries/bootstrap-5.3.8/_spinners.scss | 86 + .../libraries/bootstrap-5.3.8/_tables.scss | 171 ++ .../libraries/bootstrap-5.3.8/_toasts.scss | 73 + .../libraries/bootstrap-5.3.8/_tooltip.scss | 119 ++ .../bootstrap-5.3.8/_transitions.scss | 27 + .../libraries/bootstrap-5.3.8/_type.scss | 106 + .../libraries/bootstrap-5.3.8/_utilities.scss | 806 ++++++++ .../bootstrap-5.3.8/_variables-dark.scss | 102 + .../libraries/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 + .../libraries/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 ++++ .../styles/libraries/bulma-1.04/_index.scss | 10 + .../libraries/bulma-1.04/base/_index.scss | 6 + .../libraries/bulma-1.04/base/animations.scss | 15 + .../libraries/bulma-1.04/base/generic.scss | 240 +++ .../libraries/bulma-1.04/base/minireset.scss | 92 + .../libraries/bulma-1.04/base/skeleton.scss | 114 ++ .../bulma-1.04/components/_index.scss | 13 + .../bulma-1.04/components/breadcrumb.scss | 139 ++ .../libraries/bulma-1.04/components/card.scss | 162 ++ .../bulma-1.04/components/dropdown.scss | 188 ++ .../libraries/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 ++ .../libraries/bulma-1.04/components/tabs.scss | 273 +++ .../libraries/bulma-1.04/elements/_index.scss | 16 + .../libraries/bulma-1.04/elements/block.scss | 6 + .../libraries/bulma-1.04/elements/box.scss | 59 + .../libraries/bulma-1.04/elements/button.scss | 659 +++++++ .../bulma-1.04/elements/content.scss | 289 +++ .../libraries/bulma-1.04/elements/delete.scss | 6 + .../libraries/bulma-1.04/elements/icon.scss | 67 + .../libraries/bulma-1.04/elements/image.scss | 64 + .../libraries/bulma-1.04/elements/loader.scss | 15 + .../bulma-1.04/elements/notification.scss | 105 + .../bulma-1.04/elements/progress.scss | 115 ++ .../libraries/bulma-1.04/elements/table.scss | 261 +++ .../libraries/bulma-1.04/elements/tag.scss | 219 ++ .../libraries/bulma-1.04/elements/title.scss | 130 ++ .../libraries/bulma-1.04/form/_index.scss | 9 + .../bulma-1.04/form/checkbox-radio.scss | 36 + .../libraries/bulma-1.04/form/file.scss | 330 ++++ .../bulma-1.04/form/input-textarea.scss | 115 ++ .../libraries/bulma-1.04/form/select.scss | 144 ++ .../libraries/bulma-1.04/form/shared.scss | 178 ++ .../libraries/bulma-1.04/form/tools.scss | 352 ++++ .../libraries/bulma-1.04/grid/_index.scss | 5 + .../libraries/bulma-1.04/grid/columns.scss | 961 +++++++++ .../libraries/bulma-1.04/grid/grid.scss | 209 ++ .../libraries/bulma-1.04/helpers/_index.scss | 15 + .../bulma-1.04/helpers/aspect-ratio.scss | 12 + .../libraries/bulma-1.04/helpers/border.scss | 15 + .../libraries/bulma-1.04/helpers/color.scss | 344 ++++ .../libraries/bulma-1.04/helpers/flexbox.scss | 62 + .../libraries/bulma-1.04/helpers/float.scss | 28 + .../libraries/bulma-1.04/helpers/gap.scss | 24 + .../libraries/bulma-1.04/helpers/other.scss | 19 + .../bulma-1.04/helpers/overflow.scss | 21 + .../bulma-1.04/helpers/position.scss | 19 + .../libraries/bulma-1.04/helpers/spacing.scss | 64 + .../bulma-1.04/helpers/typography.scss | 174 ++ .../bulma-1.04/helpers/visibility.scss | 221 +++ .../libraries/bulma-1.04/layout/_index.scss | 9 + .../bulma-1.04/layout/container.scss | 59 + .../libraries/bulma-1.04/layout/footer.scss | 23 + .../libraries/bulma-1.04/layout/hero.scss | 273 +++ .../libraries/bulma-1.04/layout/level.scss | 107 + .../libraries/bulma-1.04/layout/media.scss | 106 + .../libraries/bulma-1.04/layout/section.scss | 38 + .../libraries/bulma-1.04/themes/_index.scss | 36 + .../libraries/bulma-1.04/themes/dark.scss | 57 + .../libraries/bulma-1.04/themes/light.scss | 147 ++ .../libraries/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/main.scss | 6 + .../src/styles/plugins/_index.scss | 4 + .../core/foundation/animations.scss | 9 + .../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 + .../plugins/toastify-1.12/_toastify.scss | 88 + .../src/tests/Button.test.jsx | 22 + .../src/tests/ExampleComponent.test.jsx | 21 + .../src/tests/ExampleUserList.test.jsx | 7 + .../src/tests/FormContact.test.jsx | 82 + .../src/tests/config/setup.js | 14 + .../01_react-app-with-tests/vite.config.js | 25 + 264 files changed, 25254 insertions(+), 460 deletions(-) create mode 100644 06_react/unterricht/tag41-44/README.md create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/.gitignore create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/.oxlintrc.json create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/README.md create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/index.html rename 06_react/unterricht/{tag40 => tag45}/01_react-app-with-tests/package-lock.json (76%) create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/package.json create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/public/favicon.svg create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/public/icons.svg create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/App.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/assets/react.svg create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/assets/vite.svg create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/components/buttons/Button.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_colors.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_typography.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_variables.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_theme.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_utils.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_button.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_footer-main.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_header-main.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputAmount.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputPrice.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_logo-main.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_menu-main.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-main.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-social.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_product-manager.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_table-products.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_playfair-display-v40-latin.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_source-sans-3-v19-latin.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/fontawesome-7.3.0/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_accordion.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_alert.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_badge.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_breadcrumb.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_button-group.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_buttons.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_card.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_carousel.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_close.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_containers.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_dropdown.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_forms.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_functions.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_grid.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_helpers.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_images.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_list-group.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_maps.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_mixins.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_modal.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_nav.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_navbar.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_offcanvas.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_pagination.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_placeholders.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_popover.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_progress.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_reboot.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_root.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_spinners.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_tables.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_toasts.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_tooltip.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_transitions.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_type.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_utilities.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_variables-dark.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_variables.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/bootstrap-grid.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/bootstrap-reboot.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/bootstrap-utilities.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/bootstrap.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_floating-labels.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_form-check.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_form-control.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_form-range.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_form-select.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_form-text.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_input-group.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_labels.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/forms/_validation.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_clearfix.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_color-bg.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_colored-links.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_focus-ring.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_icon-link.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_position.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_ratio.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_stacks.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_stretched-link.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_text-truncation.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_visually-hidden.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/helpers/_vr.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_alert.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_backdrop.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_banner.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_border-radius.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_box-shadow.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_breakpoints.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_buttons.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_caret.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_clearfix.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_color-mode.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_color-scheme.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_container.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_deprecate.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_forms.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_gradients.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_grid.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_image.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_list-group.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_lists.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_pagination.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_reset-text.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_resize.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_table-variants.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_text-truncate.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_transition.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_utilities.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/mixins/_visually-hidden.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/jasmine.js create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/mixins/_auto-import-of-variables-dark.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/mixins/_box-shadow.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/mixins/_color-contrast.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/mixins/_color-modes.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/mixins/_media-query-color-mode-full.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/mixins/_utilities.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/sass-true/register.js create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/sass-true/runner.js create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/tests/utilities/_api.test.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/utilities/_api.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/vendor/_rfs.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/base/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/base/animations.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/base/generic.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/base/minireset.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/base/skeleton.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/breadcrumb.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/card.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/dropdown.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/menu.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/message.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/modal.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/navbar.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/pagination.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/panel.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/components/tabs.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/block.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/box.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/button.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/content.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/delete.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/icon.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/image.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/loader.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/notification.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/progress.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/table.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/tag.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/elements/title.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/checkbox-radio.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/file.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/input-textarea.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/select.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/shared.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/form/tools.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/grid/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/grid/columns.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/grid/grid.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/aspect-ratio.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/border.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/color.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/flexbox.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/float.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/gap.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/other.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/overflow.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/position.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/spacing.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/typography.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/helpers/visibility.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/container.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/footer.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/hero.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/level.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/media.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/layout/section.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/themes/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/themes/dark.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/themes/light.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/themes/setup.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/controls.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/css-variables.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/derived-variables.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/extends.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/functions.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/initial-variables.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bulma-1.04/utilities/mixins.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/main.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/_index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/foundation/animations.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/modifiers/draggable.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/modifiers/fade.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/modifiers/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/modifiers/rtl.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/modifiers/ttb.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/container.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/list.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/pagination.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/progress.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/root.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/slide.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/spinner.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/sr.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/toggle.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/core/object/objects/track.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/foundation/colors.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/foundation/mixins.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/modifiers/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/modifiers/nav.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/modifiers/rtl.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/modifiers/ttb.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/objects/arrow.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/objects/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/objects/pagination.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/objects/progress.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/objects/slide.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/template/default/object/objects/toggle.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/themes/default/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/themes/sea-green/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/themes/sea-green/object/objects/arrow.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/themes/sea-green/object/objects/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/themes/sea-green/object/objects/root.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/splide-4.1.4/themes/skyblue/index.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/styles/plugins/toastify-1.12/_toastify.scss create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/tests/Button.test.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/tests/ExampleComponent.test.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/tests/ExampleUserList.test.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/tests/FormContact.test.jsx create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/src/tests/config/setup.js create mode 100644 06_react/unterricht/tag45/01_react-app-with-tests/vite.config.js diff --git a/06_react/unterricht/tag41-44/README.md b/06_react/unterricht/tag41-44/README.md new file mode 100644 index 0000000..aaa8722 --- /dev/null +++ b/06_react/unterricht/tag41-44/README.md @@ -0,0 +1 @@ +# Class: JavaScript/TypeScript Debugging & Testing \ No newline at end of file diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/.gitignore b/06_react/unterricht/tag45/01_react-app-with-tests/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/.oxlintrc.json b/06_react/unterricht/tag45/01_react-app-with-tests/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/README.md b/06_react/unterricht/tag45/01_react-app-with-tests/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the Oxlint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/index.html b/06_react/unterricht/tag45/01_react-app-with-tests/index.html new file mode 100644 index 0000000..8d2cd7a --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/index.html @@ -0,0 +1,13 @@ + + + + + + + react-app-with-tests + + +
+ + + diff --git a/06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json b/06_react/unterricht/tag45/01_react-app-with-tests/package-lock.json similarity index 76% rename from 06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json rename to 06_react/unterricht/tag45/01_react-app-with-tests/package-lock.json index 907affe..d89f50e 100644 --- a/06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json +++ b/06_react/unterricht/tag45/01_react-app-with-tests/package-lock.json @@ -8,6 +8,7 @@ "name": "02_react-app-with-tests", "version": "0.0.0", "dependencies": { + "axios": "^1.21.0", "bootstrap": "^5.3.8", "react": "^19.3.1", "react-dom": "^19.3.1", @@ -19,13 +20,14 @@ "@testing-library/user-event": "^14.6.8", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "@vitejs/plugin-react": "^6.1.2", - "@vitest/ui": "^5.0.5", - "jsdom": "^30.1.3", - "oxlint": "^1.90.0", - "sass-embedded": "^1.107.1", - "vite": "^8.3.5", - "vitest": "^5.0.5" + "@vitejs/plugin-react": "^6.2.1", + "@vitest/ui": "^5.1.0", + "axios-mock-adapter": "^2.1.0", + "jsdom": "^31.0.0", + "oxlint": "^1.91.0", + "sass-embedded": "^1.108.0", + "vite": "^8.3.6", + "vitest": "^5.1.0" } }, "node_modules/@adobe/css-tools": { @@ -35,39 +37,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@asamuzakjp/css-color": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-7.1.9.tgz", - "integrity": "sha512-vZ6JQVq8Ivgz6b/IBlAf90wZviXdluY13cQOPO+nJHbmXwGrPl2GcpqUY7a55/8ZVdfONXpCFMpRijOBCHNlcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^3.4.3", - "@csstools/css-color-parser": "^4.2.6", - "@csstools/css-parser-algorithms": "^4.0.2", - "@csstools/css-tokenizer": "^4.0.2", - "lru-cache": "^11.5.3" - }, - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-10.0.5.tgz", - "integrity": "sha512-EgmJ7oEaGQECTn3H3wmnQpEy4hKY66VvM7VQndwPIQob3p877BgbyOUE3EX0LgXQCciF2H8KMdR+RznqjMNOLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bidi-js": "^1.1.0", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.5.3" - }, - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -96,175 +65,22 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", - "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", + "version": "7.29.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.13.tgz", + "integrity": "sha512-v+oN26xP4YIlQsbQ/CbTH1WG5m/l/DjKKZNy/Kp3f/AFvbgt7Em/D0FeMM3O2hX0YzeN2M16W8lOpyhIkfCBcQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@bramus/specificity": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.3.tgz", - "integrity": "sha512-0GEz8qJWokkUVYQYRukmkSHIFNoBH8QTreeHrAFbvz1XFYc3Y+puhMs8PQ5x8GNugiC2l5jvDBXKLbBIByeSBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.2.1" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, "node_modules/@bufbuild/protobuf": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.16.0.tgz", - "integrity": "sha512-FWa0sPlqYGJgpTs6OxBRcL/AW4JT0OIO+W1ajerluoTVh8CV0B7XM1qsNCRgnkSCkRCgOICKHRQlY17jrsm0+Q==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.17.0.tgz", + "integrity": "sha512-hcPkSz6D7MiTU/5VBBhK+kxaYDoOdQ6yJRFJ3kS8Nydp+VZXfg1vrpABKPNod8bXMufsVCmiUJVIKFzCzta4uw==", "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.2.tgz", - "integrity": "sha512-grhRy3OKmniaAEKXMjua5z/EODX0MSqBGjunw8+j/3HQjOnahs2AGhvEOIYVUWcU6ScApbhLhVrQTX8XqrMrow==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.3.tgz", - "integrity": "sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.2", - "@csstools/css-tokenizer": "^4.0.2" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.7.tgz", - "integrity": "sha512-zgm9yjQz5iJB4VL8RyVwd71TWB8Q89FSxt/NzXoWqPSkEBOVtn9L6vAPtSc9hpKfB0Awo/AL2VKFHjYetBLFHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.2", - "@csstools/css-calc": "^3.4.3" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.2", - "@csstools/css-tokenizer": "^4.0.2" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.2.tgz", - "integrity": "sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.2" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.16.tgz", - "integrity": "sha512-LsDbJPP/B8cPasUJyTA5S99F7C4G93ngW8hUluXz8CFeOaaRnBPtBiIlvgcPYU0HmHNz8CXg+1vwFrIB4F6Dgw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.2.tgz", - "integrity": "sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, "node_modules/@exodus/bytes": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", @@ -322,9 +138,9 @@ } }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.90.0.tgz", - "integrity": "sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.91.0.tgz", + "integrity": "sha512-eOqJUUS1MCqIoUUxMIkuwaqIdKaHr1SXYA0CQI95UUrF8jwQylQH33bBmnqhZfvWXKlRB2Ylx/+Sbk/ctEqzZQ==", "cpu": [ "arm" ], @@ -339,9 +155,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.90.0.tgz", - "integrity": "sha512-RcKhz1ETMq+fazE9TKS2+5NIRGwigm/nW8egqF0LI+A8Yw2iW5r0E/C3XAPRiwIm/vcPiutIRIa6IQCIKhZsTQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.91.0.tgz", + "integrity": "sha512-vIJU4lRxK0EhbBt+iR3rkq3pio4I+V5Gshwjei3plNjN+CIq0WxWHzYVI06J9KN8Ar3hyNSFtzJAjVRLZOYpjg==", "cpu": [ "arm64" ], @@ -356,9 +172,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.90.0.tgz", - "integrity": "sha512-PSrxMvP6mx+p1karZcUxLdy9lpaP+JWQPti4al9FgTaPhxE+pT/BjhGExloVVSWgZgIfOlLOjVyyq8BXlodhLQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.91.0.tgz", + "integrity": "sha512-tLy76MurwAOpQt5QVMkJUgexBSWhB7qdvAYb14bc0xntZS6f55aKicbZoxZ/QlmAbnrdlXeD5+IjwY8EZ9RWTg==", "cpu": [ "arm64" ], @@ -373,9 +189,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.90.0.tgz", - "integrity": "sha512-OLbU9qsrV2Q8QxT2OEzOPdO8zCCpyI8qB+hDI8yr6RsYELtkf0FAZhJdfjM/RnLHKzt44HWwAPnk92vBtKofvw==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.91.0.tgz", + "integrity": "sha512-zPeMmjAqm5vXxbTp/JqYuc9gGSbUuEaeCAkFHB4TCRLTlfJGD//Fkx03YvZHCHZJ7ideLiiLcae+3f2I27qnaA==", "cpu": [ "x64" ], @@ -390,9 +206,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.90.0.tgz", - "integrity": "sha512-fBA4pWyVDARmNucQqpyFuPC49xYf1r+sX7dxPL5fNPQrSMLum39Sn56tZ9JPleWC7FzLPwSQ7plYYfirYBHF8A==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.91.0.tgz", + "integrity": "sha512-psOR9+xGMXn0hj4KY5M2kjSQ1n0TCMdYbPOraoV0iQyl7mw2oBBYGUM2+ma40m1YLVrktTBOta4FjrmcOHDhrg==", "cpu": [ "x64" ], @@ -407,9 +223,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.90.0.tgz", - "integrity": "sha512-zhxH78eP2nR6/pGdhBc7MIfjhhcgATeu8fkmkFJbuzfk6Cj0FzBxyEhL85yDqrCybjx+G2YDzZGsxIO9kvO4Iw==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.91.0.tgz", + "integrity": "sha512-1PNA1j4ETxawvxfz6ueDxWgQgWkXPbv44DWZmC7LR07GqojGFDOwWbosOT6/AYiJr7zMXEhn2dPWMkyFFOFpUQ==", "cpu": [ "arm" ], @@ -424,9 +240,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.90.0.tgz", - "integrity": "sha512-MvYmpHyJqUJjEvkZbJHdwfdL45cGn8EVBkYmoXFiaYFW9suoD3dbJl5mBdpy0DVgdjlyddmldbRtk3cCgETadQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.91.0.tgz", + "integrity": "sha512-jcNePVpca37lTbHmiPMnVbPAAW0rH9kAoDjsDv6vESEX9pzazIR1q5SyYuc1rQzdjHtc2VVCDN9jDh6tHcOHyA==", "cpu": [ "arm" ], @@ -441,9 +257,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.90.0.tgz", - "integrity": "sha512-L13Sy+Kg0nZhwTsToniqjUFPA2TuM6962qCZ5Wp5KeB517Tw7ApdLTTtlb+bF86fcZZa2EtvCVvAJxk4Dya/MQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.91.0.tgz", + "integrity": "sha512-TJi78UX6R+9qZ23ZKtzN6adfW83bjY0NXsCRMBRH6H7IizaMXmZbdRAtjedMkx77bT46YQH0csawsY9lwha8MA==", "cpu": [ "arm64" ], @@ -461,9 +277,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.90.0.tgz", - "integrity": "sha512-wFDdZWGpzIPFdJFjSLWnKB0TGzFriTKUIrl04iMqMyM9BBIJTuerfCHYa0WpDSjr5x3lcW/CHLyacSt886WpGg==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.91.0.tgz", + "integrity": "sha512-OowlLroUTzKq5OBvbu6iegch8SJ2DivXFCukzPWURwvcJhMj7/P0CUGH5qrDlxT1Kh48dcxqYqrvE8qK6xTLKQ==", "cpu": [ "arm64" ], @@ -481,9 +297,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.90.0.tgz", - "integrity": "sha512-FRywfn+MoKn8xpBSzgNwNVliSKRI2QXkxi/iF7o6FEQs8Bh8z2RpVTaFAcO3pchXjvB2eGNFIoLLQABIQ+u7VA==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.91.0.tgz", + "integrity": "sha512-QF/5Ge8yGpWg5s4awMNHfVKh1WOmk591Qg082i6CHenXYBa+W1E5RwWZXaKUOw4Ko7CCjqg3TfBc0AzhnqblYg==", "cpu": [ "ppc64" ], @@ -501,9 +317,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.90.0.tgz", - "integrity": "sha512-IS2PaUgpc/qeLADTyhUNmdx3x4ijs9pjJdPKBYHaT+mAE7k3FsjnHPTjhpsak1b++h6CIPhv6WX9Z+y7Pw0voQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.91.0.tgz", + "integrity": "sha512-dXlsKlNhzJQX1nageGKnvWe1D7uTng249hQM80CG/YPZ8F/VZHbxVLhImgurdWBOmu86XOemValLjrW6QIOM/Q==", "cpu": [ "riscv64" ], @@ -521,9 +337,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.90.0.tgz", - "integrity": "sha512-s7JFKRkGS8O7i2ZVODfuO++NC7sH6HDqpMn8lYxw91w0SXJOxnAVjQ8utvmDwLMMT0jaSkuOKuUYJDGDtu4sHQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.91.0.tgz", + "integrity": "sha512-tznkj5VrWNRUfymkaLcJetgMLbP9suL5ob/m7j0Fdbnm5u3Li/Ezo/YcBixiuwdL1sg0oGpyTe86It0J6T+Lxg==", "cpu": [ "riscv64" ], @@ -541,9 +357,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.90.0.tgz", - "integrity": "sha512-b0GxrOQr5VONCkd7KLSqmP6b6nqZuTpuS8QPQHzltmqdXP5bY0Jl0CZ0QmlCTrS3ExaLYbioFYOARzNbYvcApQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.91.0.tgz", + "integrity": "sha512-sNvfLiUYQkVsLNUgIW24AEYTHSd2zZ1vAxXssPdjuQHTtCpRvQihYri6d5z5FY7w/QrcnB5+g9E+/sqmZq8tfA==", "cpu": [ "s390x" ], @@ -561,9 +377,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.90.0.tgz", - "integrity": "sha512-iaJeShJtgUp8rZbt9YUdTAGOpmX5KogCLba17Jp1tWdJ3F4M3D2g2TKUyI1FMTHxKH9NNHuQcuC2kZRg6IV7yQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.91.0.tgz", + "integrity": "sha512-eA25ETvimhUZ89y5BcunNY7yv7qwG2I7V7dFQAU+mIEqZ57gBCXdIERl0yXOEt43zjsw0yK2gRKTc+twF706wQ==", "cpu": [ "x64" ], @@ -581,9 +397,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.90.0.tgz", - "integrity": "sha512-/aZoXnL5WBLCXuzfHqvEFXcm4iwYmr/cYByHDTXzLFzJdE5DC7bm6phpWqHv6BeqpVgY9IpBAxGDv2WEkl5JCg==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.91.0.tgz", + "integrity": "sha512-4hZ4Z9K+OkcTpAHDoUTMg/8MModbM0aocrl9KnGzp9h5iKqjrXraEUZorYoVCT7xoK93CAHXgTndxRBrOjH/fA==", "cpu": [ "x64" ], @@ -601,9 +417,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.90.0.tgz", - "integrity": "sha512-SMhk7ozwoxYDKfYqGZCQEfULOKDneF9uhaoIf2neoDLWvNtjY9yVeL7YHmE5L9WdKvMpWNwwZxhenxBu6AgfOg==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.91.0.tgz", + "integrity": "sha512-gtqn4b0kLpGe46Qh7NHiR86wZpd+TLaesO106s7V3RG33r63VB94LW5qPKEDJX64osh3xfjnPFn1M0484bC7wQ==", "cpu": [ "arm64" ], @@ -618,9 +434,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.90.0.tgz", - "integrity": "sha512-KBvR3A9fO7fCi2vCP8ifWvlia7tGEQV9NaYh+IGwa/7Groy48Mt/UaYqMK9/zOtAWl20BUCf6RPqzJ32fRw33Q==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.91.0.tgz", + "integrity": "sha512-KQItBdsyHN28U3z/bEek6h9pvG3Uqv564QYO8K1bE/V7YRZgpHlRnfNKVPHkk4sfYKyPzEjCgW80QkImOLvJog==", "cpu": [ "arm64" ], @@ -635,9 +451,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.90.0.tgz", - "integrity": "sha512-+x42rDHQGbTCuT3EzpWAzhP3NoVPE/cJsG4gnrakOSg0olV+GCdMpPU23Nvrl3zZMnXxFZdTtDv4D3SuaA5ZeQ==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.91.0.tgz", + "integrity": "sha512-XFKqbbsQVmTgw+CyBKuzSZtAa45viom1naFfulKmkTFdDyDaBQaBqEz5J61TI8iwBynU+F8q7qPD+9mplZRhEg==", "cpu": [ "ia32" ], @@ -652,9 +468,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.90.0.tgz", - "integrity": "sha512-30JiaFEBUB9peEOcvVM8ggo88SoN/IdSr9DW505JdBji/R6dM66gKEiG65hw6qcaF2f4mO0cEJ+RwRZprmun9g==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.91.0.tgz", + "integrity": "sha512-DmpK0PthG66Bcz5Y4JqNbzXltzyLQtg3ofYpd25+ejm7kQYUM78VL1uIP/ZFct2781mwUyBX37LatFPCTVp35A==", "cpu": [ "x64" ], @@ -1425,9 +1241,9 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.2.tgz", - "integrity": "sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.2.1.tgz", + "integrity": "sha512-9KyWCij3r0+qLG3Q62vBmv0VyevmYibAtxaCIVK9o0k6CXgaajZRIe8tpfchQcdZArJ5b/7OrIz4W3b2uxVRDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1437,9 +1253,9 @@ "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0 || ^0.3.0", "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.152.0", + "oxc-transform-react": ">=0.152.0 <0.157.0", "vite": "^8.0.0" }, "peerDependenciesMeta": { @@ -1455,14 +1271,14 @@ } }, "node_modules/@vitest/mocker": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.5.tgz", - "integrity": "sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.1.0.tgz", + "integrity": "sha512-5umB9/jlWcqVS6fsrFmv5Gdnpu6wAUio/lEOwAmvB7v+lFo/IW2B9FhAD0p19GCULTgMzLCdUmuCDCnAzWgppQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.31", - "@vitest/spy": "5.0.5", + "@vitest/spy": "5.1.0", "estree-walker": "^3.0.3", "magic-string": "^1.4.3" }, @@ -1483,9 +1299,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-5.0.5.tgz", - "integrity": "sha512-24sSdIlMA9DVPXnYiB9siwU0bTd887Y9jX3+vabztCSsvHwo7ipvJ/a2L3Rljw8+2rK1f5fCj3h5U9I/Jsqgbw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-5.1.0.tgz", + "integrity": "sha512-IRx5mc30CrFzyMNni6SZKQ1r53kv049Mcvvk0WbWcD6PUz/bFjG4zYv0KosQAeonPpGp5WxqYBMqdSOfJfvVWw==", "dev": true, "license": "MIT", "dependencies": { @@ -1496,9 +1312,9 @@ } }, "node_modules/@vitest/spy": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.5.tgz", - "integrity": "sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.1.0.tgz", + "integrity": "sha512-2DPO5OMHWKrBngC+fCmTQqemNF0gidRhp3lxbBmRhW+M1XJrfgPpqNqWVevXtn2f2ufD5ZaR1B6B641aAlcX5A==", "dev": true, "license": "MIT", "funding": { @@ -1506,13 +1322,13 @@ } }, "node_modules/@vitest/ui": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-5.0.5.tgz", - "integrity": "sha512-dCoGUOdgmCaSB2g+WQ/spPCBkytAWdNUkFSXY4z+eYp2d8JEOY8v0uDRaJTG9qf/kTlTVZ4CuYMYMz/f1HS/qQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-5.1.0.tgz", + "integrity": "sha512-00S3x4NRmqIBUiTVWF9/xLaA9EP9KeKv0+1sBO7e2Y4luBISlW+2ttnhlk/zjbTqEvVhJWCCo7MXzu6zNbefqQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "5.0.5", + "@vitest/utils": "5.1.0", "fflate": "^0.8.3", "flatted": "^3.4.4", "pathe": "^2.0.3", @@ -1523,17 +1339,17 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "5.0.5" + "vitest": "5.1.0" } }, "node_modules/@vitest/utils": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-5.0.5.tgz", - "integrity": "sha512-/rBu7gzLDQI/SC79Tn98b5DwOgaHU/Gt4I9OVeP3YofzNaYtbImRCOJQmT1S6vOJg9gEIlWC+r3QxKkjuSa1nQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-5.1.0.tgz", + "integrity": "sha512-V+qgCwkvVw+s1t1S5TaoBHsLi5Sz/YmohCMoOu0mZ8ZQst2bKhRYARAQucWpVg8D0mv0x5MHcWXY5QdOsoiGBQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "5.0.5", + "@vitest/pretty-format": "5.1.0", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.2.0" }, @@ -1541,6 +1357,18 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1586,14 +1414,63 @@ "node": ">=12" } }, - "node_modules/bidi-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.1.0.tgz", - "integrity": "sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.21.0.tgz", + "integrity": "sha512-YCzXMB53Q9PZBsh7yN7wtapit4WepwcHS2fP8QhGsBxSz5YtgYobV7GGlWlAJi+RxfU77GQTQi2DSLUma42EYA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios-mock-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-2.1.0.tgz", + "integrity": "sha512-AZUe4OjECGCNNssH8SOdtneiQELsqTsat3SQQCWLPjN436/H+L9AjWfV7bF+Zg/YL9cgbhrz5671hoh+Tbn98w==", "dev": true, "license": "MIT", "dependencies": { - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "node_modules/bcp-47": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.2.tgz", + "integrity": "sha512-wsv86UuNFuPnVieKLyECTT+CP1WSAHeoIg5P3xu2kA9Z+7fVPoKt7dxzSeEhtJel0AI+NW3fIW3KtTKQKUCngg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/bootstrap": { @@ -1615,6 +1492,19 @@ "@popperjs/core": "^2.11.8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/chai": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", @@ -1653,6 +1543,18 @@ "url": "https://opencollective.com/color" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1660,20 +1562,6 @@ "dev": true, "license": "MIT" }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -1702,6 +1590,23 @@ "node": "^22.14.0 || >=24.0.0" } }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/decimal.js": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", @@ -1709,6 +1614,15 @@ "dev": true, "license": "MIT" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1737,10 +1651,24 @@ "license": "MIT", "peer": true }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/entities": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", - "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-9.0.0.tgz", + "integrity": "sha512-oJFNDJg3kTPwAD1cNn2+WmUq4wFoo09npc3Ydf1D7ED4smRiWrsKnaLxykrTWgyGEcusc87P5dxlAleol9kpkg==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -1750,6 +1678,24 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", @@ -1757,6 +1703,33 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1777,6 +1750,13 @@ "node": ">=12.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -1809,6 +1789,42 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.2.tgz", + "integrity": "sha512-/kVP2U8z596Ia0gwFrwyIeo74ta5aVmSeU1FfAUMAmcEP5EP7zydmag3SLiN64NaRKef3lxsq7i/g7ltJQDGow==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1824,6 +1840,64 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1834,6 +1908,45 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-encoding-sniffer": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-7.0.0.tgz", @@ -1847,6 +1960,19 @@ "node": "^22.13.0 || >=24.0.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/immutable": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", @@ -1864,6 +1990,67 @@ "node": ">=8" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1905,41 +2092,39 @@ "peer": true }, "node_modules/jsdom": { - "version": "30.1.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.1.3.tgz", - "integrity": "sha512-hQMUPvRgN7KxsfIytDQji7bimuJeRQa6Qo5+iuiZQk5CafeRxLIA10/cG5YCBFNpD9RO3oqIiN4CO1Y44kxqXg==", + "version": "31.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-31.0.0.tgz", + "integrity": "sha512-xAkhD9z1eyFC5+QUi9K24CaZJgdCQ2GOGLW1GdVDoQvkp/AxEH9TQ0pAplPOlIiV92hfcgnFOADZypbjgbBT6Q==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^7.1.3", - "@asamuzakjp/dom-selector": "^10.0.3", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.15", "@exodus/bytes": "^1.16.0", - "css-tree": "^3.2.1", + "bcp-47": "^2.1.2", + "bcp-47-match": "^2.0.3", "data-urls": "^8.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^7.0.0", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.5.3", - "parse5": "^8.0.1", + "parse5": "^8.1.0", + "parse5-parser-stream": "^8.1.0", "saxes": "^6.0.0", "tough-cookie": "^6.0.2", - "undici": "^8.12.1", + "undici": "^8.12.3", "w3c-xmlserializer": "^6.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^17.2.0", + "whatwg-url": "^17.3.0", "xml-name-validator": "^5.0.0" }, "engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "canvas": "^3.2.3" + "@napi-rs/canvas": "^1.0.13" }, "peerDependenciesMeta": { - "canvas": { + "@napi-rs/canvas": { "optional": true } } @@ -2248,12 +2433,35 @@ "@jridgewell/sourcemap-codec": "^1.6.0" } }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/min-indent": { "version": "1.0.1", @@ -2275,6 +2483,12 @@ "node": ">=10" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", @@ -2317,9 +2531,9 @@ } }, "node_modules/oxlint": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.90.0.tgz", - "integrity": "sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.91.0.tgz", + "integrity": "sha512-vjy/cBZcEFcYh3dbxUoQK+bjc+QaY3ZWo86aJkZ5YAwp/HyiqP7dTdNgbvcIVJafhAH5sZbTqBp4sZcicEZngA==", "dev": true, "license": "MIT", "bin": { @@ -2332,25 +2546,25 @@ "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.90.0", - "@oxlint/binding-android-arm64": "1.90.0", - "@oxlint/binding-darwin-arm64": "1.90.0", - "@oxlint/binding-darwin-x64": "1.90.0", - "@oxlint/binding-freebsd-x64": "1.90.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.90.0", - "@oxlint/binding-linux-arm-musleabihf": "1.90.0", - "@oxlint/binding-linux-arm64-gnu": "1.90.0", - "@oxlint/binding-linux-arm64-musl": "1.90.0", - "@oxlint/binding-linux-ppc64-gnu": "1.90.0", - "@oxlint/binding-linux-riscv64-gnu": "1.90.0", - "@oxlint/binding-linux-riscv64-musl": "1.90.0", - "@oxlint/binding-linux-s390x-gnu": "1.90.0", - "@oxlint/binding-linux-x64-gnu": "1.90.0", - "@oxlint/binding-linux-x64-musl": "1.90.0", - "@oxlint/binding-openharmony-arm64": "1.90.0", - "@oxlint/binding-win32-arm64-msvc": "1.90.0", - "@oxlint/binding-win32-ia32-msvc": "1.90.0", - "@oxlint/binding-win32-x64-msvc": "1.90.0" + "@oxlint/binding-android-arm-eabi": "1.91.0", + "@oxlint/binding-android-arm64": "1.91.0", + "@oxlint/binding-darwin-arm64": "1.91.0", + "@oxlint/binding-darwin-x64": "1.91.0", + "@oxlint/binding-freebsd-x64": "1.91.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.91.0", + "@oxlint/binding-linux-arm-musleabihf": "1.91.0", + "@oxlint/binding-linux-arm64-gnu": "1.91.0", + "@oxlint/binding-linux-arm64-musl": "1.91.0", + "@oxlint/binding-linux-ppc64-gnu": "1.91.0", + "@oxlint/binding-linux-riscv64-gnu": "1.91.0", + "@oxlint/binding-linux-riscv64-musl": "1.91.0", + "@oxlint/binding-linux-s390x-gnu": "1.91.0", + "@oxlint/binding-linux-x64-gnu": "1.91.0", + "@oxlint/binding-linux-x64-musl": "1.91.0", + "@oxlint/binding-openharmony-arm64": "1.91.0", + "@oxlint/binding-win32-arm64-msvc": "1.91.0", + "@oxlint/binding-win32-ia32-msvc": "1.91.0", + "@oxlint/binding-win32-x64-msvc": "1.91.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2005", @@ -2366,13 +2580,26 @@ } }, "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.1.0.tgz", + "integrity": "sha512-sq3qBFpee5jeocbFbO48VHlGr8sT7mbXS0vxlKN6sottBtJzrOG3998sr0llSZcQAGgfpdmEYAIZE0P9z0dE8w==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^8.0.0" + "entities": "^9.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-8.1.0.tgz", + "integrity": "sha512-58MPfNTA+DsIzro41rU94xghnu/h2N4yEPdPdGPlZVHM/QvA5jlVGYVo7IzlHbFLHYx3cZUnr9s9HBrA0tEYyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -2450,6 +2677,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2527,16 +2763,6 @@ "node": ">=8" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rolldown": { "version": "1.2.16", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.16.tgz", @@ -2582,9 +2808,9 @@ } }, "node_modules/sass": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.107.1.tgz", - "integrity": "sha512-aJ1/LvxOOb04YhmiBjzZn3jVwdHKol+OVhoMV6fFl02fF9T3i+5Mg9l/CnzqtM+NX5Jn5o3lAbs/ZJivTCLHfQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.108.0.tgz", + "integrity": "sha512-9HwnefouIfwY+XuA1rS5xOhALH5vsoe3SzYICG3MEwpkMbE7tpuh5ytZFRXUKPYkxY7lKdIbqxl+DxQGo8jwQQ==", "dev": true, "license": "MIT", "optional": true, @@ -2604,9 +2830,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.107.1.tgz", - "integrity": "sha512-DpU0lgDxNE2H7iycTfvvmig1NZ92SqO63D1PPRI8sBniHdpEOzxQno71YRXvEDQgPkaJ7mnljwX16s80AqydaQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.108.0.tgz", + "integrity": "sha512-F72wK29zJaTGjrwZogHDi+nRMYe8lEOtWzok9CVDjVdnBhbDu5TLFJ1a52/en3EDdFGj1HjrI/wwFT3E3u4eTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2625,30 +2851,30 @@ "node": ">=20.19.0" }, "optionalDependencies": { - "sass-embedded-all-unknown": "1.107.1", - "sass-embedded-android-arm": "1.107.1", - "sass-embedded-android-arm64": "1.107.1", - "sass-embedded-android-riscv64": "1.107.1", - "sass-embedded-android-x64": "1.107.1", - "sass-embedded-darwin-arm64": "1.107.1", - "sass-embedded-darwin-x64": "1.107.1", - "sass-embedded-linux-arm": "1.107.1", - "sass-embedded-linux-arm64": "1.107.1", - "sass-embedded-linux-musl-arm": "1.107.1", - "sass-embedded-linux-musl-arm64": "1.107.1", - "sass-embedded-linux-musl-riscv64": "1.107.1", - "sass-embedded-linux-musl-x64": "1.107.1", - "sass-embedded-linux-riscv64": "1.107.1", - "sass-embedded-linux-x64": "1.107.1", - "sass-embedded-unknown-all": "1.107.1", - "sass-embedded-win32-arm64": "1.107.1", - "sass-embedded-win32-x64": "1.107.1" + "sass-embedded-all-unknown": "1.108.0", + "sass-embedded-android-arm": "1.108.0", + "sass-embedded-android-arm64": "1.108.0", + "sass-embedded-android-riscv64": "1.108.0", + "sass-embedded-android-x64": "1.108.0", + "sass-embedded-darwin-arm64": "1.108.0", + "sass-embedded-darwin-x64": "1.108.0", + "sass-embedded-linux-arm": "1.108.0", + "sass-embedded-linux-arm64": "1.108.0", + "sass-embedded-linux-musl-arm": "1.108.0", + "sass-embedded-linux-musl-arm64": "1.108.0", + "sass-embedded-linux-musl-riscv64": "1.108.0", + "sass-embedded-linux-musl-x64": "1.108.0", + "sass-embedded-linux-riscv64": "1.108.0", + "sass-embedded-linux-x64": "1.108.0", + "sass-embedded-unknown-all": "1.108.0", + "sass-embedded-win32-arm64": "1.108.0", + "sass-embedded-win32-x64": "1.108.0" } }, "node_modules/sass-embedded-all-unknown": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.107.1.tgz", - "integrity": "sha512-8JVe87KQHSu/uMmcbcRa33AVDdwf0FSCR1tqA9fTaLrsqpgApD2YgqFr7KKCYTNRVSwzqAKdDaD2YJgx/siuVQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.108.0.tgz", + "integrity": "sha512-QJXGw8zPjuWgvo5ASY15xldo/ZWB/aKDFb/0OMj57hUNMb6dvL6xEihn8Jc1xWLscQH7BWc7q3Vs3fOOwUsx2w==", "cpu": [ "!arm", "!arm64", @@ -2659,13 +2885,13 @@ "license": "MIT", "optional": true, "dependencies": { - "sass": "1.107.1" + "sass": "1.108.0" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.107.1.tgz", - "integrity": "sha512-qst7MmgqFwAHjbDN9Z+zjwMqmPM6RGu5ynXJFZmEmkkjCoQQX8DHUZhNCc2bASeLk/wyz1/9RCziUcJ6kn+E5w==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.108.0.tgz", + "integrity": "sha512-dsuky1EE7wvvIl02S9xTuEEY9+Mc1ypuZbPxy2XfBGHapgPh43k5Sg632HJZ3H84FOCAWHZ/zyFmhDkMvRdwIA==", "cpu": [ "arm" ], @@ -2680,9 +2906,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.107.1.tgz", - "integrity": "sha512-tk1uq03Jqba2OuktUuIVQ0eSERB4oCcYiZ88wdzX1edWT/Yc7c4x6ECl2+7zqXec6SGIUDZlI86nurN5fTJLHA==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.108.0.tgz", + "integrity": "sha512-+yCynl1pBAEfv80Vc51KAlGwPVeu4rrNO8vhTWLBvT3nhkA4yzZqHRfWIKRhpiyeWbfJyKbePj9e3ko1y918Tw==", "cpu": [ "arm64" ], @@ -2697,9 +2923,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.107.1.tgz", - "integrity": "sha512-WzBSIg44+XP15kc+G2qtpfYBm0BtxjuC/X11eEg2L5Ihw45DoBtSLkpkSpLd9tvxDJOiTK3AHd1/iv5oGNvibg==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.108.0.tgz", + "integrity": "sha512-UI3m/tKz9aXcaWBWLWyVj503GsCYI1NSMzXtaWzfjB2hGAhd6D5kdExFoBn4LggX6X4if6PbOBZx6bed9T0kug==", "cpu": [ "riscv64" ], @@ -2714,9 +2940,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.107.1.tgz", - "integrity": "sha512-K6YN7kqj9aBLmraVDiPIHF7U8qoD9E/6AJIVwj1Y5H0EgPjGOsv1sYu9Uy6SBLvWGg4dsydhbPU7VC+hTGWk9A==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.108.0.tgz", + "integrity": "sha512-dUZZ8CnBBbhXsyZ5wd9hBzIriNZ7Ifff4+YE9+AZ+B09v4elhStPS7AlOT14JeYVJjGbNXhbxCfe3T7KZ6gGhw==", "cpu": [ "x64" ], @@ -2731,9 +2957,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.107.1.tgz", - "integrity": "sha512-okhyzPI4cLNwa/xRIWbpkRGKmebaNp1+15V5PxVsQbzd8c+dn7eZje2Vf5CWxv9jRZ0nJgM1K/F61Wwb0w8Tyg==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.108.0.tgz", + "integrity": "sha512-Szzt9gF7x4IENOW7qslyCciXipKNk9YSesLqhJr79LZMrRIMpkPo9BeDfQDJlZ9WMDGHCL2JXfxR10BKWX4+Hw==", "cpu": [ "arm64" ], @@ -2748,9 +2974,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.107.1.tgz", - "integrity": "sha512-hMMcxMxTiWoMaCfEvZqofN2l/yW++S0ANdVA3uHbVYO1LeRf9MrOWlOkJCjsbJO5FvfZdKGUxq/hc/5FKX9PXQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.108.0.tgz", + "integrity": "sha512-DWNGSd7yHD0zg4esDQk5cwaJef85SeVXZBINt/63UvaYRhzMcUYB/E1mBcGv+wV/bN9cWI7YHILZrrbgkOQDsw==", "cpu": [ "x64" ], @@ -2765,9 +2991,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.107.1.tgz", - "integrity": "sha512-k/UIsseDf63xo5qwV1kZgTmJtFlBAKLQf3xb++NmQPv7zvdOZxJ/MVUd1cuDx7vuanVKhM+U6R1mW2GuQxEGHA==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.108.0.tgz", + "integrity": "sha512-6ReA1J1WJl0WjN+ffmfh1qtJt7phF5r8rkyQzWy06NK8aunJRnb+Syd2Wx2N+0LbEXqqYKmyILnEeiXkAsuqRQ==", "cpu": [ "arm" ], @@ -2783,9 +3009,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.107.1.tgz", - "integrity": "sha512-cDeuJi63cL2cfr9OZoB2z1jd7Omhdgbj7zBxawZ62NFLe/gYVgeUsHbkB0rh1xbsuMJ9nOu9Mu6bkw8N0XnigQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.108.0.tgz", + "integrity": "sha512-GE6oESJuGtLYbifeK7r0AJ2LKOiM8doCmI1hYfVbyG2SqGV0vdEEo1P156PJy07TaDoal4zOLViQ4a+S1VgTkA==", "cpu": [ "arm64" ], @@ -2801,9 +3027,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.107.1.tgz", - "integrity": "sha512-jshFSmPp7/tq3zV5l7KEDWuZKN6aewTnKMkWzgXN4oiBvRKFWAeQqG2Acn+gjMwtrvY0aRGZxrgreJGwRmFZlg==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.108.0.tgz", + "integrity": "sha512-oOWV5mlrmk54/7tluqifbPQUkNcJ/A7Zp0wVFTvrPu6mu5QVks5yWHyT4uNkk8MNNdvPqHr3OvKg4qGDbXXxgw==", "cpu": [ "arm" ], @@ -2819,9 +3045,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.107.1.tgz", - "integrity": "sha512-Pr7kApBThIJjKG7FkGIsFvYrhj8aCu7kEuov7WiK3ExUiv5m+Vz8eYzjqIEGGCAyVIGMuuvHCvPmuMUynPZ1CA==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.108.0.tgz", + "integrity": "sha512-VqTP2WROzT1qtHP08YV4JYebA/N9KYRWTWp42MRnpvZu7ZrPlsIWV0whLY/XHhOOvtQOj6nKP+X9QXi+FEU+yA==", "cpu": [ "arm64" ], @@ -2837,9 +3063,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.107.1.tgz", - "integrity": "sha512-5oJVR7xt0yQnIlW/1Xz+H5Bl2Tix5Gl4qrlrVvUCzfdFUWBwLSZi6KlabjC41UjRisandO3nxHXPZeI1T99krQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.108.0.tgz", + "integrity": "sha512-8z0jeVucmMj3a5RG0yDHfdfnQtC260XHsuRybNTFUNgrTk7SZksCvECS7f3NvFkqLXHVizonzBJbQwjSnRGbIw==", "cpu": [ "riscv64" ], @@ -2855,9 +3081,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.107.1.tgz", - "integrity": "sha512-ntHvwls0ImF6p9qgZBuIF+BKIZ+6FqrRKZn0JhiFzb48y5o/V0mre6YEmdq8YcYVxPrGaU+Ajk96lpTE7gUC8w==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.108.0.tgz", + "integrity": "sha512-zRy5k4IACKRsElljiuJ/5ZDXgIe2TI5B3lEe16XgfZvbfdPAsBrrtm735CbVeWn5Unnwdo8PatHbZG7qH2QBpQ==", "cpu": [ "x64" ], @@ -2873,9 +3099,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.107.1.tgz", - "integrity": "sha512-m8zLEdUPafxCAXtqx5FgBylIlPaUcb4eBx1lE8ENp/kaqqTMmaapofl+YWFI8xII3id+4rePZBipR142vHnNpQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.108.0.tgz", + "integrity": "sha512-ioEI9Kjeq7r0bXOYvwdoiV2viu8kSgWgF/Z7eEHWuYPBG+hHgvO8L2FqVIeTcVLDawVjtIjRB1ND5m41HKjisw==", "cpu": [ "riscv64" ], @@ -2891,9 +3117,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.107.1.tgz", - "integrity": "sha512-ix29w9TrUrvpzjOir+Ndx3RH5VLJncjq6CMystVUVbx5rpYyyaSzciOm5NKF227ifivhuhWYOFPCkq1NedmXfQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.108.0.tgz", + "integrity": "sha512-bf1UD1+Nl9yoyjPWIsNKx6Q+5TM7IKSb3LGKkI/GGbkkI7dtfXDuEX4K8raAe7vyl6YwsOuk5CIqLC8keJGGiQ==", "cpu": [ "x64" ], @@ -2909,9 +3135,9 @@ } }, "node_modules/sass-embedded-unknown-all": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.107.1.tgz", - "integrity": "sha512-7JKs9q+V/kyVBesAjMa8hXx/qk6/cGKq/7cPSZoAWGu6oHx41wiJVfkZVAYt+fOFRHFXQunIKxIR9ZV7nA63PA==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.108.0.tgz", + "integrity": "sha512-8LekO+SieJSup8RR4iZlXEPiIC5+LAla6qdbezTgnEiFeE6TlnRUJC4ymwlgNVSuW439lIZxzEslE1gdQMlluw==", "dev": true, "license": "MIT", "optional": true, @@ -2922,13 +3148,13 @@ "!win32" ], "dependencies": { - "sass": "1.107.1" + "sass": "1.108.0" } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.107.1.tgz", - "integrity": "sha512-/DmYPuToDvhsT4Oz1RQuOvQuYFzhcjzAfxjwhRPdWXxGO1OR8+BhbxyXqOUMpMLwgFT9Du3GPjD1yvy8BXnTZQ==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.108.0.tgz", + "integrity": "sha512-thH2piu717tsswAUNzR5oUvCN99F1JhjgOposze0xD5RfVNrNZk91FKokOJS04raf564x0JieOe7zF7iwsemIA==", "cpu": [ "arm64" ], @@ -2943,9 +3169,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.107.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.107.1.tgz", - "integrity": "sha512-B25UYFtuhnYiqvfLNlJZyDp2xV7T0aT9nueE2w+QhDPM/wCZyeQfj1dgMgq0HYBwEybgx0oLuxomgTqplmQ+eg==", + "version": "1.108.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.108.0.tgz", + "integrity": "sha512-zrkPoApM8srP2ZStPxy9S/+LFfRpbxGsCSKNQMNUSXNfntQhMApejlSmcqryS3tJnp65RE/VnOEfLQIYy4c8nw==", "cpu": [ "x64" ], @@ -3063,9 +3289,9 @@ } }, "node_modules/tinybench": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.2.tgz", - "integrity": "sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.3.tgz", + "integrity": "sha512-Al01C2JIBnO2CXCAPbpAl6sUiOZHeThGtHYNTa51JRw9PyWOCdr+9Ong05R4qg/Sk3+H645E8ov1h2c58ityNw==", "dev": true, "license": "MIT", "engines": { @@ -3166,16 +3392,16 @@ } }, "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==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.9.1.tgz", + "integrity": "sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==", "dev": true, "license": "0BSD" }, "node_modules/undici": { - "version": "8.12.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.12.3.tgz", - "integrity": "sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==", + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.12.4.tgz", + "integrity": "sha512-8Mx+uNKKER2bA4AdtedkqRbwUCIJFr2nJckXRe5yrDqzePqwLP7VNcctN8/XdmDSbF7mS+jJKIszlL+vbam1VA==", "dev": true, "license": "MIT", "engines": { @@ -3190,16 +3416,16 @@ "license": "MIT" }, "node_modules/vite": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", - "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.6.tgz", + "integrity": "sha512-UI7dK29NnS54Fk+mmo7o+jI6U8Fp7hDl+X5Q1k45WH+d4dSlbLVUETGQ+hfkNgvLQGyoElPj837nZyv4MBc0VA==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", - "postcss": "^8.5.30", - "rolldown": "~1.2.14", + "postcss": "^8.5.32", + "rolldown": "~1.2.16", "tinyglobby": "^0.2.17" }, "bin": { @@ -3268,14 +3494,14 @@ } }, "node_modules/vitest": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.5.tgz", - "integrity": "sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.1.0.tgz", + "integrity": "sha512-MzmNFnrwa8v8lF1bLxw3UJ4EREwVOVb75VqJZmUDRjJ6EluK/x9th7qTbaeDk41WxE1GxWqmTXcdsfobfH5sOA==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/mocker": "5.0.5", + "@vitest/mocker": "5.1.0", "chai": "^6.3.0", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", @@ -3301,12 +3527,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "5.0.5", - "@vitest/browser-preview": "5.0.5", + "@vitest/browser-playwright": "5.1.0", + "@vitest/browser-preview": "5.1.0", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", - "@vitest/coverage-istanbul": "5.0.5", - "@vitest/coverage-v8": "5.0.5", - "@vitest/ui": "5.0.5", + "@vitest/coverage-istanbul": "5.1.0", + "@vitest/coverage-v8": "5.1.0", + "@vitest/ui": "5.1.0", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/package.json b/06_react/unterricht/tag45/01_react-app-with-tests/package.json new file mode 100644 index 0000000..189ff10 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/package.json @@ -0,0 +1,37 @@ +{ + "name": "02_react-app-with-tests", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "test": "vitest", + "test:watch": "vitest --watch", + "test:ui": "npx vitest --ui", + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.21.0", + "bootstrap": "^5.3.8", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-icons": "^5.7.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^7.0.1", + "@testing-library/react": "^16.3.3", + "@testing-library/user-event": "^14.6.8", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.2.1", + "@vitest/ui": "^5.1.0", + "axios-mock-adapter": "^2.1.0", + "jsdom": "^31.0.0", + "oxlint": "^1.91.0", + "sass-embedded": "^1.108.0", + "vite": "^8.3.6", + "vitest": "^5.1.0" + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/public/favicon.svg b/06_react/unterricht/tag45/01_react-app-with-tests/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/public/icons.svg b/06_react/unterricht/tag45/01_react-app-with-tests/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/App.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/App.jsx new file mode 100644 index 0000000..c1cf993 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/App.jsx @@ -0,0 +1,20 @@ +import Button from './components/buttons/Button'; +import ExampleUserList from './components/examples/ExampleUserList'; +import FormContact from './components/forms/FormContact'; + +function App(props) { + // const { } = props; + + return ( +
+

Testing in React

+
+ +
+
+ ); +} +export default App; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/assets/react.svg b/06_react/unterricht/tag45/01_react-app-with-tests/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/assets/vite.svg b/06_react/unterricht/tag45/01_react-app-with-tests/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/components/buttons/Button.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/buttons/Button.jsx new file mode 100644 index 0000000..c85ec48 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/buttons/Button.jsx @@ -0,0 +1,24 @@ +import { useState } from 'react'; +import { FaArrowPointer } from 'react-icons/fa6'; +const Button = (props) => { + // const { } = props; + + const [isClicked, setIsClicked] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const handleClick = (e) => { + setIsClicked(true); + // const btn = e.currentTarget; + // const span = btn.querySelector('span'); + // span.textContent = 'Clicked'; + }; + + return ( + + ); +}; +export default Button; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx new file mode 100644 index 0000000..6dc28ae --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx @@ -0,0 +1,10 @@ +const ExampleComponent = (props) => { + // const { } = props; + + return ( + <> +

Hello World

+ + ); +}; +export default ExampleComponent; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx new file mode 100644 index 0000000..4565619 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx @@ -0,0 +1,19 @@ +import axios from 'axios'; +import { useEffect, useState } from 'react'; + +const ExampleUserList = (props) => { + const [users, setUsers] = useState([]); + useEffect(() => { + axios.get('https://dummyjson.com/users?limit=3').then((response) => setUsers(response.data.users)); + }, []); + return ( + + ); +}; +export default ExampleUserList; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx new file mode 100644 index 0000000..396664d --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx @@ -0,0 +1,20 @@ +import { render, screen } from '@testing-library/react'; +import ExampleComponent from '../ExampleComponent'; + +// import nicht notwendig ( Findet automatisch durch globale Setting statt) +import { test, it, expect } from 'vitest'; + +// Test case +// it('should render correctly and contains text "Hello World"', () => {}) +test('Component renders correctly and contains text "Hello World"', () => { + // AAA - Arrange, Act, Assert + // Arrange + render(); + + const element = screen.getByText(/Hello World/i); + + // Act - Assert + expect(element).toBeInTheDocument(); +}); + +// console.log(document.querySelector('p').textContent.includes('Hello World')); // => true diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx new file mode 100644 index 0000000..b0d12f6 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx @@ -0,0 +1,99 @@ +import { useState } from 'react'; + +const FormContact = (props) => { + const [formData, setFormData] = useState({ + firstname: '', + lastname: '', + email: '', + message: '', + }); + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData({ ...formData, [name]: value }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log('Form Data:', formData); + }; + + return ( +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+ ); +}; +export default FormContact; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx b/06_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx new file mode 100644 index 0000000..6897480 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx @@ -0,0 +1,14 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import 'bootstrap'; +// import 'bootstrap/dist/css/bootstrap.min.css'; +import './styles/main.scss'; + +import App from './App.jsx'; + +createRoot(document.getElementById('root')).render( + + + , +); diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_colors.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_colors.scss new file mode 100644 index 0000000..452a8e5 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_colors.scss @@ -0,0 +1,14 @@ +/* Color Theme Swatches in Hex */ +$color-1: #5c4b51; +$color-2: #8cbeb2; +$color-3: #f2ebbf; +$color-4: #f3b562; +$color-5: #f06060; + +$color-red: $color-5; +$color-white: white; // falls weiß geändert wird z.B.: #f8f8f8 + +$color-dark-blue: #283e4a; +$linear-gradient-dark: linear-gradient(180deg, rgba(40, 62, 74, 1) 0%, rgba(24, 32, 38, 1) 100%); + +$color-link: $color-2; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_index.scss new file mode 100644 index 0000000..2201c9a --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_index.scss @@ -0,0 +1,3 @@ +@forward 'colors'; +@forward 'typography'; +@forward 'variables'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_typography.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_typography.scss new file mode 100644 index 0000000..f633381 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_typography.scss @@ -0,0 +1,9 @@ +$fallback-serif: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif; +$fallback-sans-serif: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + +$font-headline: 'Playfair Display', $fallback-serif; +$font-subclaim: $fallback-sans-serif; + +$font-menu: $fallback-sans-serif; +$font-copy: 'Source Sans 3', $fallback-sans-serif; +$font-quote: $fallback-serif; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_variables.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/abstracts/_variables.scss new file mode 100644 index 0000000..e69de29 diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_index.scss new file mode 100644 index 0000000..26fa81a --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_index.scss @@ -0,0 +1,2 @@ +@forward 'theme'; +@forward 'utils'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_theme.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_theme.scss new file mode 100644 index 0000000..d3e0ab2 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_theme.scss @@ -0,0 +1,53 @@ +@use '../abstracts' as *; + +// Allgemeine Formatierungen für die ganze Webanwendung + +*, +html { + box-sizing: border-box; +} + +html, +body, +#root { + height: 100%; + padding: 0; + margin: 0; +} + +body { + font-family: $font-copy; +} + +// Sticky footer +body, +#root { + display: flex; + flex-direction: column; +} + +main, +#main { + flex: 1 0 auto; +} + +body > footer, +.footer-main { + flex-shrink: 0; +} +// /Sticky footer + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: $font-headline; + font-weight: 700; +} + +a { + color: $color-link; + text-decoration: none; +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_utils.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/base/_utils.scss new file mode 100644 index 0000000..e69de29 diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_button.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_button.scss new file mode 100644 index 0000000..f91b983 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_button.scss @@ -0,0 +1,13 @@ +.btn-custom { + &:hover, + &:focus { + background-color: #e0e0e0; + color: #333; + border: 1px solid #ccc; + } + background-color: steelblue; + color: white; + border: 1px solid #ccc; + padding: 8px 16px; + border-radius: 0px; +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_footer-main.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_footer-main.scss new file mode 100644 index 0000000..b2a2a52 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_footer-main.scss @@ -0,0 +1,59 @@ +@use '../abstracts' as *; + +.m-footer-main { + background: $color-dark-blue; // Fallback für ältere Browser + background: $linear-gradient-dark; + padding: 3rem 0; + [class^='col'] { + color: $color-white; + + display: flex; + justify-content: center; + @media (min-width: 768px) { + justify-content: flex-start; + } + h2, + h3, + h4, + h5 { + font-size: 1.5rem; + color: $color-5; + padding: 0.5rem 0; + margin-bottom: 1rem; + letter-spacing: 2px; + text-align: center; + } + } + + @media (min-width: 576px) { + h1, + h2, + h3, + h4, + h5, + h6 { + text-align: left; + } + } + + .row { + flex-direction: column; + > div { + &:nth-child(1) { + order: 3; + } + &:nth-child(2) { + order: 2; + } + &:nth-child(3) { + order: 1; + } + } + } + + @media (min-width: 576px) { + .row { + flex-direction: row-reverse; + } + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_header-main.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_header-main.scss new file mode 100644 index 0000000..f810d50 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_header-main.scss @@ -0,0 +1,85 @@ +@use '../abstracts' as *; + +.header-main { + position: relative; + + width: 100%; + min-height: 400px; + .content-box { + position: relative; + z-index: 2; + display: flex; + justify-content: center; + align-items: center; + width: auto; + margin: 0 auto; + height: 100%; + max-width: 360px; + max-height: 380px; + } + + background: $color-3 url('/img/header-bg.jpg') center no-repeat; + background-size: cover; + + &--min { + height: 150px; + background-color: $color-2; + display: flex; + justify-content: center; + align-items: center; + .content-box { + figure { + width: 150px; + } + } + } + + .splide { + position: absolute; + z-index: 1; + height: 100%; + width: 100%; + top: 0; + overflow: hidden; + .splide__track { + height: 100%; + .splide__slide img { + object-fit: cover; + width: 100%; + height: 100%; + } + .splider-content { + &::after { + content: ''; + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.2); + } + + height: 100%; + padding: 0; + } + } + } + + // .content-box { + // figure { + // width: 280px; + // figcaption { + // position: absolute; + // clip: rect(1px, 1px, 1px, 1px); + // clip-path: inset(0 0 99.9% 99.9%); + // overflow: hidden; + // height: 1px; + // width: 1px; + + // padding: 0; + // border: 0; + // } + // } + // } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_index.scss new file mode 100644 index 0000000..6e3f1d3 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_index.scss @@ -0,0 +1,11 @@ +@forward 'button'; +@forward 'footer-main'; +@forward 'header-main'; +@forward 'inputAmount'; +@forward 'inputPrice'; +@forward 'logo-main'; +@forward 'nav-main'; +@forward 'nav-social'; +@forward 'table-products'; +// @forward 'menu-main'; +// @forward 'product-manager'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputAmount.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputAmount.scss new file mode 100644 index 0000000..928b429 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputAmount.scss @@ -0,0 +1,29 @@ +// Input Amount Component +.m-input-amount { + .input-group { + .input-group-text { + padding: 0; + display: inline-block; + overflow: hidden; + button { + border-radius: 0; + } + } + } + .input-amount { + max-width: 80px; + text-align: center; + } + + /* Chrome, Safari, Edge, Opera */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Firefox */ + input[type='number'] { + appearance: textfield; + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputPrice.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputPrice.scss new file mode 100644 index 0000000..a72534a --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_inputPrice.scss @@ -0,0 +1,5 @@ +.m-input-price { + .input-price { + max-width: 120px; + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_logo-main.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_logo-main.scss new file mode 100644 index 0000000..9d5cce9 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_logo-main.scss @@ -0,0 +1,14 @@ +figure.logo-main { + width: 280px; + figcaption { + position: absolute; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(0 0 99.9% 99.9%); + overflow: hidden; + height: 1px; + width: 1px; + + padding: 0; + border: 0; + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_menu-main.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_menu-main.scss new file mode 100644 index 0000000..63103a0 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_menu-main.scss @@ -0,0 +1,62 @@ +@use '../abstracts' as *; + +.menu-main { + background-color: $color-5; + + ul { + padding: 0; + margin: 0; + list-style: none; + } + + ul ul { + display: none; // TODO: change to not visible + } + ul > li:hover, + ul > li:focus, + ul > li:focus-within { + ul { + display: block; + } + } + + ul.list { + display: flex; + + justify-content: center; + li { + a { + display: inline-block; + text-decoration: none; + text-transform: uppercase; + color: $color-white; + padding: 0.5rem 1rem; + transition: all 0.4s ease-out; + &:hover, + &:focus { + background-color: $color-white; + color: $color-5; + } + } + } + } + + ul.sublist { + position: absolute; + background-color: rgba($color-5, 0.8); + li { + a { + display: inline-block; + background-color: $color-5; + color: $color-white; + padding: 0.5rem 1rem; + transition: all 0.4s ease-out; + &:hover, + &:focus { + background-color: $color-white; + color: $color-5; + } + } + } + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-main.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-main.scss new file mode 100644 index 0000000..2ba6a93 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-main.scss @@ -0,0 +1,8 @@ +@use '../abstracts' as *; + +.m-nav-main { + .navbar-nav .nav-link.active, + .navbar-nav .nav-link.show { + color: $color-5; + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-social.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-social.scss new file mode 100644 index 0000000..def42a0 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_nav-social.scss @@ -0,0 +1,75 @@ +@use 'sass:color'; +@use '../abstracts' as *; + +.nav-social { + ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + justify-content: flex-start; + align-items: center; + li { + a { + color: $color-white; + display: inline-block; + padding: 0.5rem; + margin: 3px; + background-color: color.scale($color-dark-blue, $lightness: 10%); + // background-color: lighten($color-dark-blue, 5%); // deprecated + border-radius: 50%; + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + text-decoration: none; + transition: all 0.4s ease-out; + &:hover, + &:focus { + background-color: color.scale($color-dark-blue, $lightness: 20%); + } + + &[aria-label='Youtube'] { + &:hover, + &:focus { + background-color: #f00; + } + } + &[aria-label='Meta'] { + &:hover, + &:focus { + background-color: #0064e0; + } + } + &[aria-label^='X '] { + &:hover, + &:focus { + background-color: #000; + } + } + &[aria-label^='X '] { + &:hover, + &:focus { + background-color: #000; + } + } + &[aria-label^='Instagram'] { + &:hover, + &:focus { + // background: linear-gradient( + // 9deg, + // rgba(254, 218, 117, 1) 10%, + // rgba(250, 126, 30, 1) 30%, + // rgba(239, 100, 57, 1) 43%, + // rgba(214, 41, 118, 1) 55%, + // rgba(150, 47, 191, 1) 67%, + // rgba(79, 91, 213, 1) 81% + // ); + background-color: #405de6; + } + } + } + } + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_product-manager.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_product-manager.scss new file mode 100644 index 0000000..906cc1b --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_product-manager.scss @@ -0,0 +1,37 @@ +.product-manager { + .nav-products-actions { + margin: 1rem 0; + display: flex; + justify-content: flex-end; + .list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + gap: 1rem; + } + } + + table { + .th-actions { + width: 200px; + } + tbody { + td { + vertical-align: middle; + button { + margin: 3px; + } + } + } + + tfoot { + .row > * { + margin-bottom: 1rem; + @media (min-width: 992px) { + margin-bottom: 0; + } + } + } + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_table-products.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_table-products.scss new file mode 100644 index 0000000..f384994 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/components/_table-products.scss @@ -0,0 +1,13 @@ +.m-table-products { + table { + tr { + td { + vertical-align: middle; + input, + .input-group { + margin-bottom: 0 !important; + } + } + } + } +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_index.scss new file mode 100644 index 0000000..6bb01ea --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_index.scss @@ -0,0 +1,2 @@ +// @forward 'playfair-display-v40-latin'; +// @forward 'source-sans-3-v19-latin'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_playfair-display-v40-latin.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_playfair-display-v40-latin.scss new file mode 100644 index 0000000..a410d7c --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_playfair-display-v40-latin.scss @@ -0,0 +1,96 @@ +// playfair-display-regular - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: normal; + font-weight: 400; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2') format('woff2'); +} +// playfair-display-italic - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: italic; + font-weight: 400; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2') format('woff2'); +} +// playfair-display-500 - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: normal; + font-weight: 500; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-500.woff2') format('woff2'); +} +// playfair-display-500italic - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: italic; + font-weight: 500; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2') format('woff2'); +} +// playfair-display-600 - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: normal; + font-weight: 600; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-600.woff2') format('woff2'); +} +// playfair-display-600italic - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: italic; + font-weight: 600; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2') format('woff2'); +} +// playfair-display-700 - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: normal; + font-weight: 700; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-700.woff2') format('woff2'); +} +// playfair-display-700italic - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: italic; + font-weight: 700; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2') format('woff2'); +} +// playfair-display-800 - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: normal; + font-weight: 800; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-800.woff2') format('woff2'); +} +// playfair-display-800italic - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: italic; + font-weight: 800; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2') format('woff2'); +} +// playfair-display-900 - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: normal; + font-weight: 900; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-900.woff2') format('woff2'); +} +// playfair-display-900italic - latin +@font-face { + font-display: swap; + font-family: 'Playfair Display'; + font-style: italic; + font-weight: 900; + src: url('./playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2') format('woff2'); +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_source-sans-3-v19-latin.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_source-sans-3-v19-latin.scss new file mode 100644 index 0000000..b8a2b40 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/fonts/_source-sans-3-v19-latin.scss @@ -0,0 +1,134 @@ +// source-sans-3-200 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 200; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2') format('woff2'); +} + +// source-sans-3-200italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 200; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2') format('woff2'); +} + +// source-sans-3-300 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 300; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2') format('woff2'); +} + +// source-sans-3-300italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 300; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2') format('woff2'); +} + +// source-sans-3-regular - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 400; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2') format('woff2'); +} + +// source-sans-3-italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 400; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2') format('woff2'); +} +// source-sans-3-500 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 500; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2') format('woff2'); +} +// source-sans-3-500italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 500; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2') format('woff2'); +} + +// source-sans-3-600 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 600; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2') format('woff2'); +} +// source-sans-3-600italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 600; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2') format('woff2'); +} +// source-sans-3-700 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 700; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2') format('woff2'); +} +// source-sans-3-700italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 700; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2') format('woff2'); +} +// source-sans-3-800 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 800; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2') format('woff2'); +} +// source-sans-3-800italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 800; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2') format('woff2'); +} +// source-sans-3-900 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 900; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2') format('woff2'); +} +// source-sans-3-900italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 900; + src: url('./source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2') format('woff2'); +} diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/_index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/_index.scss new file mode 100644 index 0000000..f8043dc --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/_index.scss @@ -0,0 +1 @@ +@forward 'fontawesome-7.3.0/index.scss'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/fontawesome-7.3.0/index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/fontawesome-7.3.0/index.scss new file mode 100644 index 0000000..703a9e5 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/icons/fontawesome-7.3.0/index.scss @@ -0,0 +1 @@ +@import 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.3.0/css/all.min.css'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/_index.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/_index.scss new file mode 100644 index 0000000..ffb1c8f --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/_index.scss @@ -0,0 +1,3 @@ +// @forward 'bootstrap-5.3.8/bootstrap-grid'; +@forward 'bootstrap-5.3.8/bootstrap'; +// @forward 'bulma-1.04/index'; diff --git a/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_accordion.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_accordion.scss new file mode 100644 index 0000000..e9f267f --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_alert.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_badge.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_badge.scss new file mode 100644 index 0000000..cc3d269 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_breadcrumb.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_breadcrumb.scss new file mode 100644 index 0000000..b8252ff --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_button-group.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_button-group.scss new file mode 100644 index 0000000..78e1252 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_buttons.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_buttons.scss new file mode 100644 index 0000000..caa4518 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_card.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_card.scss new file mode 100644 index 0000000..dcebe6a --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_carousel.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_carousel.scss new file mode 100644 index 0000000..5ebf6b1 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_close.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_close.scss new file mode 100644 index 0000000..d53c96f --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_containers.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_containers.scss new file mode 100644 index 0000000..83b3138 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_dropdown.scss b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/bootstrap-5.3.8/_dropdown.scss new file mode 100644 index 0000000..587ebb4 --- /dev/null +++ b/06_react/unterricht/tag45/01_react-app-with-tests/src/styles/libraries/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 +// +// `