From d823a35ac1c534bac7b52465d823f2e12ab0942e Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Wed, 28 Oct 2026 14:33:56 +0100 Subject: [PATCH] --- 06_react/uebungen/u19_chuck-norris-api.zip | Bin 0 -> 51292 bytes .../uebungen/u19_chuck-norris-api/.gitignore | 24 + .../u19_chuck-norris-api/.oxlintrc.json | 8 + .../uebungen/u19_chuck-norris-api/README.md | 16 + .../uebungen/u19_chuck-norris-api/index.html | 17 + .../u19_chuck-norris-api/package.json | 29 + .../u19_chuck-norris-api/public/favicon.svg | 1 + .../u19_chuck-norris-api/public/icons.svg | 24 + .../uebungen/u19_chuck-norris-api/src/App.jsx | 19 + .../u19_chuck-norris-api/src/assets/react.svg | 1 + .../u19_chuck-norris-api/src/assets/vite.svg | 1 + .../src/components/common/Badge.jsx | 22 + .../components/examples/ExampleUseContext.jsx | 18 + .../examples/ExampleUseEffectDidUpdate.jsx | 30 + .../examples/ExampleUseEffectMount.jsx | 24 + .../examples/ExampleUseEffectUnMount.jsx | 36 + .../src/components/examples/ExampleUseId.jsx | 21 + .../components/examples/ExampleUseReducer.jsx | 77 + .../components/examples/ExampleUseState.jsx | 36 + .../examples/theme-switcher/ThemeContext.jsx | 8 + .../examples/theme-switcher/ThemeProvider.jsx | 25 + .../src/components/footers/FooterMain.jsx | 78 + .../src/components/forms/FormContact.jsx | 159 + .../src/components/forms/FormNewsletter.jsx | 35 + .../src/components/headers/HeaderMain.jsx | 12 + .../src/components/icons/Logo.jsx | 48 + .../src/components/inputs/InputAmount.jsx | 61 + .../src/components/lists/ListTodo.jsx | 51 + .../src/components/lists/ListUser.jsx | 53 + .../src/components/logos/LogoMain.jsx | 15 + .../src/components/navs/Navbar.jsx | 110 + .../src/layouts/Layout.jsx | 20 + .../u19_chuck-norris-api/src/main.jsx | 18 + .../src/pages/AboutPage.jsx | 14 + .../src/pages/ApiPage.jsx | 20 + .../src/pages/ContactPage.jsx | 20 + .../src/pages/HomePage.jsx | 27 + .../src/pages/UserPage.jsx | 24 + .../src/pages/UserProfilePage.jsx | 19 + .../src/routes/Router.jsx | 79 + .../src/styles/01_frameworks/_index.scss | 3 + .../_gloria-hallelujah-v24-latin.scss | 8 + .../src/styles/02_fonts/_index.scss | 3 + .../src/styles/02_fonts/_lato-v25-latin.scss | 89 + .../02_fonts/_source-sans-3-v19-latin.scss | 143 + .../src/styles/03_base/_colors.scss | 13 + .../src/styles/03_base/_index.scss | 2 + .../src/styles/03_base/_theme.scss | 52 + .../src/styles/03_base/_typography.scss | 9 + .../src/styles/04_plugins/_index.scss | 7 + .../04_plugins/toastify-1.12/_toastify.scss | 88 + .../src/styles/05_modules/_button.scss | 17 + .../styles/05_modules/_chuck-norris-joke.scss | 38 + .../src/styles/05_modules/_footerMain.scss | 45 + .../src/styles/05_modules/_header-main.scss | 15 + .../src/styles/05_modules/_index.scss | 8 + .../src/styles/05_modules/_input-amount.scss | 27 + .../src/styles/05_modules/_logo-main.scss | 21 + .../src/styles/05_modules/_menu-main.scss | 20 + .../styles/05_modules/_product-manager.scss | 47 + .../u19_chuck-norris-api/src/styles/main.scss | 13 + .../src/utils/validators/validate.js | 39 + .../u19_chuck-norris-api/vite.config.js | 15 + .../02_react-api-with-hooks/package-lock.json | 2701 ----------------- .../src/components/lists/ListTodo.jsx | 48 +- .../src/components/lists/ListUser.jsx | 53 + .../src/pages/ApiPage.jsx | 3 + 67 files changed, 2120 insertions(+), 2707 deletions(-) create mode 100644 06_react/uebungen/u19_chuck-norris-api.zip create mode 100644 06_react/uebungen/u19_chuck-norris-api/.gitignore create mode 100644 06_react/uebungen/u19_chuck-norris-api/.oxlintrc.json create mode 100644 06_react/uebungen/u19_chuck-norris-api/README.md create mode 100644 06_react/uebungen/u19_chuck-norris-api/index.html create mode 100644 06_react/uebungen/u19_chuck-norris-api/package.json create mode 100644 06_react/uebungen/u19_chuck-norris-api/public/favicon.svg create mode 100644 06_react/uebungen/u19_chuck-norris-api/public/icons.svg create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/App.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/assets/react.svg create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/assets/vite.svg create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/common/Badge.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseContext.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectDidUpdate.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectMount.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectUnMount.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseId.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseReducer.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseState.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeContext.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeProvider.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/footers/FooterMain.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormContact.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormNewsletter.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/headers/HeaderMain.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/icons/Logo.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/inputs/InputAmount.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListTodo.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListUser.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/logos/LogoMain.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/components/navs/Navbar.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/layouts/Layout.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/main.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/pages/AboutPage.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/pages/ApiPage.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/pages/ContactPage.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/pages/HomePage.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/pages/UserPage.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/pages/UserProfilePage.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/routes/Router.jsx create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/01_frameworks/_index.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_index.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_lato-v25-latin.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_source-sans-3-v19-latin.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_colors.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_index.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_theme.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_typography.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/_index.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/toastify-1.12/_toastify.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_button.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_chuck-norris-joke.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_footerMain.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_header-main.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_index.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_input-amount.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_logo-main.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_menu-main.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_product-manager.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/styles/main.scss create mode 100644 06_react/uebungen/u19_chuck-norris-api/src/utils/validators/validate.js create mode 100644 06_react/uebungen/u19_chuck-norris-api/vite.config.js delete mode 100644 06_react/unterricht/tag38/02_react-api-with-hooks/package-lock.json create mode 100644 06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListUser.jsx diff --git a/06_react/uebungen/u19_chuck-norris-api.zip b/06_react/uebungen/u19_chuck-norris-api.zip new file mode 100644 index 0000000000000000000000000000000000000000..73ba511fdb014342ea577d3476c501a5f9a7d9d8 GIT binary patch literal 51292 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

Yb17 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 literal 0 HcmV?d00001 diff --git a/06_react/uebungen/u19_chuck-norris-api/.gitignore b/06_react/uebungen/u19_chuck-norris-api/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/.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/uebungen/u19_chuck-norris-api/.oxlintrc.json b/06_react/uebungen/u19_chuck-norris-api/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/.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/uebungen/u19_chuck-norris-api/README.md b/06_react/uebungen/u19_chuck-norris-api/README.md new file mode 100644 index 0000000..d937833 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/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/uebungen/u19_chuck-norris-api/index.html b/06_react/uebungen/u19_chuck-norris-api/index.html new file mode 100644 index 0000000..9b02b25 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/index.html @@ -0,0 +1,17 @@ + + + + + + + + Chuck Norris API + + +

Die Seite benötigt JS.

+ +
+ + + diff --git a/06_react/uebungen/u19_chuck-norris-api/package.json b/06_react/uebungen/u19_chuck-norris-api/package.json new file mode 100644 index 0000000..a002476 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/package.json @@ -0,0 +1,29 @@ +{ + "name": "u19-chuck-norris-api", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "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", + "react-router-dom": "^7.18.5", + "validator": "^13.15.35" + }, + "devDependencies": { + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^6.1.2", + "oxlint": "^1.90.0", + "sass-embedded": "^1.106.1", + "vite": "^8.3.5" + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/public/favicon.svg b/06_react/uebungen/u19_chuck-norris-api/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/uebungen/u19_chuck-norris-api/public/icons.svg b/06_react/uebungen/u19_chuck-norris-api/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06_react/uebungen/u19_chuck-norris-api/src/App.jsx b/06_react/uebungen/u19_chuck-norris-api/src/App.jsx new file mode 100644 index 0000000..8285606 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/App.jsx @@ -0,0 +1,19 @@ +import Navbar from './components/navs/Navbar'; +import Router from './routes/Router'; +import HeaderMain from './components/headers/HeaderMain'; +import FooterMain from './components/footers/FooterMain'; + +function App() { + return ( + <> + {/* */} + +
+ +
+ {/* */} + + ); +} + +export default App; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/assets/react.svg b/06_react/uebungen/u19_chuck-norris-api/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/06_react/uebungen/u19_chuck-norris-api/src/assets/vite.svg b/06_react/uebungen/u19_chuck-norris-api/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/common/Badge.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/common/Badge.jsx new file mode 100644 index 0000000..df1b229 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/common/Badge.jsx @@ -0,0 +1,22 @@ +const Badge = (props) => { + const { text = '', variant = 'secondary', color } = props; + // const inline = typeof color !== 'undefined' ? { backgroundColor: color } : ''; + + // if (color) { + // return ( + // + // {text} + // + // ); + // } else { + // return {text}; + // } + + return ( + + {text} + + ); +}; + +export default Badge; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseContext.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseContext.jsx new file mode 100644 index 0000000..66c0a02 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseContext.jsx @@ -0,0 +1,18 @@ +import { useContext } from 'react'; +import ThemeContext from './theme-switcher/ThemeContext'; + +const ExampleUseContext = (props) => { + // const { } = props; + + const theme = useContext(ThemeContext); + + return ( +
+

useContext

+

+ The theme of this component is: {theme} +

+
+ ); +}; +export default ExampleUseContext; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectDidUpdate.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectDidUpdate.jsx new file mode 100644 index 0000000..1250041 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectDidUpdate.jsx @@ -0,0 +1,30 @@ +import { useState, useEffect } from 'react'; +import { FaPlus } from 'react-icons/fa6'; +const ExampleUseEffectDidUpdate = (props) => { + // const { } = props; + + const [value, setValue] = useState(0); + + useEffect(() => { + // mount + console.log('first render and rerender: ', value); + + return () => { + // unmount + }; + }, [value]); // <-- wenn state sich ändert, wird useEffect erneut ausgeführt (did update) + + return ( +
+

The value is: {value}

+ +
+ ); +}; +export default ExampleUseEffectDidUpdate; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectMount.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectMount.jsx new file mode 100644 index 0000000..a29c2c1 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectMount.jsx @@ -0,0 +1,24 @@ +import { useEffect } from 'react'; + +const ExampleUseEffectMount = (props) => { + // const { } = props; + + console.log(document.querySelector('#box')); // null + useEffect(() => { + //mount + console.log(document.querySelector('#box')); //
// JSX Element liegt als gerendertes HTML vor. + + document.querySelector('#box').style.color = 'white'; + document.querySelector('#box').style.backgroundColor = '#2a2a2a'; + document.querySelector('#box').style.padding = '1rem'; + }, []); + + return ( +
+
+

Box was rendered

+
+
+ ); +}; +export default ExampleUseEffectMount; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectUnMount.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectUnMount.jsx new file mode 100644 index 0000000..112a639 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseEffectUnMount.jsx @@ -0,0 +1,36 @@ +import { useState, useEffect } from 'react'; + +const ExampleUseEffectUnMount = (props) => { + // const { } = props; + + const [timer, setTimer] = useState(0); + + useEffect(() => { + // mount + const interval = setInterval(() => { + setTimer((time) => time + 1); + }, 1000); + + window.addEventListener('resize', handleResize); + + return () => { + // cleanup - unmount + clearInterval(interval); + window.removeEventListener('resize', handleResize); + }; + }, []); // didupdate + + // EventHandler + const handleResize = (e) => { + // console.log('Event: ', e); + const { x, y, width: w, height: h } = document.body.getBoundingClientRect(); // window.outerWidth, + console.log({ x, y, w: parseInt(w), h: parseInt(h) }); + }; + + return ( +
+

Timer: {timer}

+
+ ); +}; +export default ExampleUseEffectUnMount; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseId.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseId.jsx new file mode 100644 index 0000000..90ec7f8 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseId.jsx @@ -0,0 +1,21 @@ +import { useId } from 'react'; +// import { v4 as uid} from 'uuid'; +const ExampleUseId = (props) => { + // const { } = props; + + const id = useId(); // _r_1 + // const id = uid(); // von uuid ⇨ 'b18794e8-5d0d-417c-b361-ba38e78411b4' + + return ( +
+

+ ID: {id} +

+
+ + +
+
+ ); +}; +export default ExampleUseId; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseReducer.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseReducer.jsx new file mode 100644 index 0000000..d44cb1a --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseReducer.jsx @@ -0,0 +1,77 @@ +import { useReducer } from 'react'; +import { FaPlus, FaMinus } from 'react-icons/fa6'; + +const initialState = { + counter: 0, + // more props.... +}; + +// Reducer Funktion verwaltet das state Objekt. Über diese Funktion lässt sich das "komplexere" state-Objekt gezielt verändern. +function reducer(state, action) { + // action Objekt hat immer folgende Eigenschaften: {type: 'ACTION_NAME', payload: changeValue } + const { type, payload = 1 } = action; + + switch (type) { + case 'INCREASE': + return { ...state, counter: state.counter + 1 }; + + case 'DECREASE': + return { ...state, counter: state.counter - 1 }; + case 'DOUBLE': + return { ...state, counter: state.counter * 2 }; + case 'INC_VALUE': + return { ...state, counter: state.counter + payload }; + default: + console.warn('Action Type not found'); + return state; + } +} + +const ExampleUseReducer = (props) => { + // const { } = props; + + // Hooks - Top Level + // const [counter, setCounter] = useState(0); + const [state, dispatch] = useReducer(reducer, initialState); + + const handleClick = (e) => { + const btn = e.currentTarget; + const label = btn.ariaLabel; // btn.getAttribute('aria-label') + switch (label.toLowerCase()) { + case 'increase': + dispatch({ type: 'INCREASE' }); + break; + case 'decrease': + dispatch({ type: 'DECREASE' }); + break; + case 'double': + dispatch({ type: 'DOUBLE' }); + break; + default: //nothing + } + }; + + const handleClickIncValue = (e) => { + dispatch({ type: 'INC_VALUE', payload: 5 }); + }; + + return ( +
+ Counter: {state.counter} + + + + +
+ ); +}; +export default ExampleUseReducer; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseState.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseState.jsx new file mode 100644 index 0000000..1a93578 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/ExampleUseState.jsx @@ -0,0 +1,36 @@ +import { useState } from 'react'; +import { FaPlus, FaMinus } from 'react-icons/fa6'; + +const ExampleUseState = (props) => { + // const { } = props; + const [counter, setCounter] = useState(0); + + const handleClick = (e) => { + const btn = e.currentTarget; + const label = btn.ariaLabel; // btn.getAttribute('aria-label') + switch (label.toLowerCase()) { + case 'increase': + setCounter(counter + 1); + break; + case 'decrease': + setCounter((prevState) => { + return prevState - 1; + }); + break; + default: //nothing + } + }; + + return ( +
+ Counter: {counter} + + +
+ ); +}; +export default ExampleUseState; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeContext.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeContext.jsx new file mode 100644 index 0000000..dda5e98 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeContext.jsx @@ -0,0 +1,8 @@ +import { createContext } from 'react'; + +export const THEME_DEFAULT_VALUE = 'light'; + +const ThemeContext = createContext(THEME_DEFAULT_VALUE); +// createContext -> JSX-Element mit value Attribut +// ... +export default ThemeContext; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeProvider.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeProvider.jsx new file mode 100644 index 0000000..fa141c5 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/examples/theme-switcher/ThemeProvider.jsx @@ -0,0 +1,25 @@ +import { useState } from 'react'; +import ThemeContext, { THEME_DEFAULT_VALUE } from './ThemeContext'; + +const ThemeProvider = (props) => { + const { children } = props; + + console.log(ThemeContext._currentValue); // 'light' <- _currentValue beinhaltet initialWert. Soll aber in production Umgebung nicht verwendet werden, da kein offizieller Standard. + + const [theme, setTheme] = useState(THEME_DEFAULT_VALUE); + + const handleToggleTheme = (e) => { + console.log('toggle theme'); + setTheme((prevState) => (prevState === 'light' ? 'dark' : 'light')); + }; + + return ( + + + {children} + + ); +}; +export default ThemeProvider; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/footers/FooterMain.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/footers/FooterMain.jsx new file mode 100644 index 0000000..5006bda --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/footers/FooterMain.jsx @@ -0,0 +1,78 @@ +const FooterMain = (props) => { + // const { } = props; + + return ( + + ); +}; +export default FooterMain; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormContact.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormContact.jsx new file mode 100644 index 0000000..9f2d181 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormContact.jsx @@ -0,0 +1,159 @@ +import { useState } from 'react'; +import validate from '../../utils/validators/validate'; + +const INITIAL_FORM_DATA = { + firstname: '', // + lastname: '', + email: '', + message: '', +}; + +const FormContact = (props) => { + // const { } = props; + + const [formData, setFormData] = useState(INITIAL_FORM_DATA); + + const [errors, setErrors] = useState({}); + + // EventHandlers ======= + const handleSubmit = (e) => { + e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. + + const form = e.currentTarget; + + const errors = validate(formData); + + if (Object.keys(errors).length === 0) { + console.log('Form submitted ....'); + // TODO: send over AJAX/Fetch + form.reset(); + setFormData(INITIAL_FORM_DATA); + setErrors({}); + } else { + console.warn('Form submit error'); + setErrors(errors); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + + setFormData((state) => ({ ...state, [name]: value })); + + // console.log({ [e.target.name]: e.target.value }); + // console.log('Formdata', formData); + }; + + const handleBlur = (e) => { + const { name, value } = e.target; + const validationErrors = validate({ ...formData, [name]: value }); + + setErrors((state) => { + const nextErrors = { ...state }; + + if (validationErrors[name]) { + nextErrors[name] = validationErrors[name]; + } else { + delete nextErrors[name]; + } + + return nextErrors; + }); + }; + + return ( +
+
+
+
+ + +
OK
+
{errors?.firstname}
+
+
+
+
+ + +
OK
+
{errors?.lastname}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.email}
+
+
+
+ +
+
+
+ + +
OK
+
{errors?.message}
+
+
+
+ +
+
+
+ +
+
+
+
+ ); +}; +export default FormContact; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormNewsletter.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormNewsletter.jsx new file mode 100644 index 0000000..d8c7ec7 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/forms/FormNewsletter.jsx @@ -0,0 +1,35 @@ +const FormNewsletter = (props) => { + // const { } = props; + + // EventHandler + const handleSubmit = (e) => { + e.preventDefault(); // Standardverhalten unterbinden + console.log('Event: ', e); + }; + + return ( +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ ); +}; +export default FormNewsletter; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/headers/HeaderMain.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/headers/HeaderMain.jsx new file mode 100644 index 0000000..acbddb2 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/headers/HeaderMain.jsx @@ -0,0 +1,12 @@ +import LogoMain from '../logos/LogoMain'; + +const HeaderMain = () => { + return ( +
+
+ +
+
+ ); +}; +export default HeaderMain; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/icons/Logo.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/icons/Logo.jsx new file mode 100644 index 0000000..dd3b6f0 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/icons/Logo.jsx @@ -0,0 +1,48 @@ +const Logo = () => { + return ( + + + + + + + + + ); +}; +export default Logo; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/inputs/InputAmount.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/inputs/InputAmount.jsx new file mode 100644 index 0000000..d6ac3f5 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/inputs/InputAmount.jsx @@ -0,0 +1,61 @@ +import { useState } from 'react'; +import { FaMinus, FaPlus } from 'react-icons/fa6'; + +const InputAmount = (props) => { + const [amount, setAmount] = useState(0); + + // const { } = props; + + // Eventhandler + const handleChange = (e) => { + const value = Number(e.target.value); // e.target.valueAsNumber + + // Guard + if (isNaN(value)) return; + + setAmount(value); + }; + const handleClick = (e) => { + console.log('Event: ', e); + console.log(e.currentTarget.name); + switch (e.currentTarget.name) { + case 'increase': + setAmount((prevState) => prevState + 1); + console.log('inc'); + break; + case 'decrease': + setAmount(amount - 1); + console.log('dec'); + break; + default: //nothing + } + }; + + return ( +
+
+ + + + + + + + +
+
+ ); +}; +export default InputAmount; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListTodo.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListTodo.jsx new file mode 100644 index 0000000..6ac253e --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListTodo.jsx @@ -0,0 +1,51 @@ +import { useEffect, useState } from 'react'; + +const ListTodo = (props) => { + // const { } = props; + + const [todos, setTodos] = useState([]); + + useEffect(() => { + fetch('https://dummyjson.com/todos/random/6') + .then((res) => { + if (!res.ok) { + throw new Error('HTTP-Request went wrong'); + } + return res.json(); // -> Promise HTTP-Response->Body + }) + .then((data) => { + setTodos(data); + }) + .catch((err) => { + console.error(err); + }); + + return () => { + // cleanup + }; + }, []); + + return ( +
    + {todos.length > 0 && + todos.map(({ completed, id, todo }, idx) => ( +
  • +
    + + +
    +
  • + ))} +
+ ); +}; +export default ListTodo; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListUser.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListUser.jsx new file mode 100644 index 0000000..ceb3878 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/lists/ListUser.jsx @@ -0,0 +1,53 @@ +import { useEffect, useState } from 'react'; +import axios from 'axios'; + +const ListUser = (props) => { + // const { } = props; + + const [users, setUsers] = useState([]); + + useEffect(() => { + const fetchUsers = async () => { + try { + const { data } = await axios.get('https://dummyjson.com/users?limit=5&select=firstName,lastName,age,email'); + + if (!data) throw Error('Something went wrong'); + setUsers(data.users); + } catch (error) { + console.error(error); + throw Error(`Error: ${error}`); + } + }; + + fetchUsers(); + + // axios + // .get('https://dummyjson.com/users?limit=10&select=firstName,lastName,age,email') + // .then(({ data }) => { + // setUsers(data.users); + // }) + // .catch((err) => { + // console.error(err); + // }); + + return () => {}; + }, []); + + return ( +
    + {users.length > 0 && + users.map(({ firstName, lastName, age, email }, idx) => ( +
  • +

    + Name: {firstName} {lastName} +
    + Age: {age} +
    + Email: {email} +

    +
  • + ))} +
+ ); +}; +export default ListUser; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/logos/LogoMain.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/logos/LogoMain.jsx new file mode 100644 index 0000000..2649b9e --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/logos/LogoMain.jsx @@ -0,0 +1,15 @@ +import Logo from '../icons/Logo'; + +// import Logo from '/logo-js.min.svg'; +const LogoMain = (props) => { + // const { } = props; + + return ( +
+ {/* JS Course */} + +
Firmen Slogan
+
+ ); +}; +export default LogoMain; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/components/navs/Navbar.jsx b/06_react/uebungen/u19_chuck-norris-api/src/components/navs/Navbar.jsx new file mode 100644 index 0000000..1dc0796 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/components/navs/Navbar.jsx @@ -0,0 +1,110 @@ +import { NavLink } from 'react-router-dom'; + +function Navbar() { + return ( + + ); +} + +export default Navbar; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/layouts/Layout.jsx b/06_react/uebungen/u19_chuck-norris-api/src/layouts/Layout.jsx new file mode 100644 index 0000000..8b55dbf --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/layouts/Layout.jsx @@ -0,0 +1,20 @@ +import { Outlet } from 'react-router-dom'; +import Navbar from '../components/navs/Navbar'; + +const Layout = (props) => { + // const { } = props; + + return ( + <> +
Header
+ +
+ +
+
+

© copyright 2026

+
+ + ); +}; +export default Layout; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/main.jsx b/06_react/uebungen/u19_chuck-norris-api/src/main.jsx new file mode 100644 index 0000000..672352b --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/main.jsx @@ -0,0 +1,18 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; + +import App from './App.jsx'; + +import 'bootstrap'; // js +import './styles/main.scss'; + +const root = createRoot(document.getElementById('root')); + +root.render( + + + + + , +); diff --git a/06_react/uebungen/u19_chuck-norris-api/src/pages/AboutPage.jsx b/06_react/uebungen/u19_chuck-norris-api/src/pages/AboutPage.jsx new file mode 100644 index 0000000..8112904 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/pages/AboutPage.jsx @@ -0,0 +1,14 @@ +function AboutPage() { + return ( +
+

About

+

+ sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id dolores minus iste + quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. Sit corporis + voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit +

+
+ ); +} + +export default AboutPage; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/pages/ApiPage.jsx b/06_react/uebungen/u19_chuck-norris-api/src/pages/ApiPage.jsx new file mode 100644 index 0000000..2715797 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/pages/ApiPage.jsx @@ -0,0 +1,20 @@ +import ListTodo from '../components/lists/ListTodo'; +import ListUser from '../components/lists/ListUser'; + +const ApiPage = (props) => { + // const { } = props; + + return ( +
+
+

APIs auslesen mit React

+

Users

+ +
+

Todos

+ +
+
+ ); +}; +export default ApiPage; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/pages/ContactPage.jsx b/06_react/uebungen/u19_chuck-norris-api/src/pages/ContactPage.jsx new file mode 100644 index 0000000..bfbe7be --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/pages/ContactPage.jsx @@ -0,0 +1,20 @@ +import FormContact from '../components/forms/FormContact'; + +function ContactPage() { + return ( +
+

Kontakt

+

+ Hast du Fragen? Schreib uns eine E-Mail: +
+ kontakt@example.com +
+

+ +
+ +
+ ); +} + +export default ContactPage; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/pages/HomePage.jsx b/06_react/uebungen/u19_chuck-norris-api/src/pages/HomePage.jsx new file mode 100644 index 0000000..6df6c75 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/pages/HomePage.jsx @@ -0,0 +1,27 @@ +function HomePage() { + return ( + <> +
+
+
+

Übung 19: Chuck Norris-Witze-API

+

+ Erstelle eine neue Komponente ChuckNorrisJokes.jsx im src/components-Ordner, die zufällige Chuck + Norris-Witze von{' '} + + https://api.chucknorris.io/jokes/random + {' '} + abruft und anzeigt. Verwende die fetch-API oder die axios-Bibliothek, um die Daten abzurufen. Behandle Lade- + und Fehlerzustände in der Komponente. +

+

+ Gestalte die Komponente so, dass sie einen Hintergrundgrafik enthält und der Witz in großer Schrift + angezeigt wird. Füge einen Button hinzu, um einen neuen Witz abzurufen. +

+
+
+ + ); +} + +export default HomePage; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/pages/UserPage.jsx b/06_react/uebungen/u19_chuck-norris-api/src/pages/UserPage.jsx new file mode 100644 index 0000000..3d35b61 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/pages/UserPage.jsx @@ -0,0 +1,24 @@ +import { Outlet } from 'react-router-dom'; + +const UserPage = (props) => { + // const { } = props; + + return ( +
+
+
+

User

+

The nested user site:

+
+
+
+ +
+
+

© copyright 2026

+
+
+
+ ); +}; +export default UserPage; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/pages/UserProfilePage.jsx b/06_react/uebungen/u19_chuck-norris-api/src/pages/UserProfilePage.jsx new file mode 100644 index 0000000..053f8ce --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/pages/UserProfilePage.jsx @@ -0,0 +1,19 @@ +import { useParams } from 'react-router-dom'; +import Badge from '../components/common/Badge'; + +function UserProfilePage() { + const { userId } = useParams(); + + return ( +
+

+ User Profile +

+

+ sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id dolores minus iste +

+
+ ); +} + +export default UserProfilePage; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/routes/Router.jsx b/06_react/uebungen/u19_chuck-norris-api/src/routes/Router.jsx new file mode 100644 index 0000000..2e86b9b --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/routes/Router.jsx @@ -0,0 +1,79 @@ +import { Navigate, Route, Routes } from 'react-router-dom'; +//import { createBrowserRouter, RouterProvider } from 'react-router-dom'; + +// Pages Komponenten +import HomePage from '../pages/HomePage'; +import AboutPage from '../pages/AboutPage'; +import ContactPage from '../pages/ContactPage'; +import UserProfilePage from '../pages/UserProfilePage'; +import UserPage from '../pages/UserPage'; +import ApiPage from '../pages/ApiPage'; + +// import Layout from '../layouts/Layout'; + +// Alternative Definition von Routes über "createBrowserRouter" mit Objekten +// const router = createBrowserRouter([ +// { path: '/', element: }, +// { path: '/about', element: }, +// { path: '/contact', element: }, +// ]); +// // App.jsx +// {/**/}; + +const checkAuth = () => { + const token = localStorage.getItem('token'); + return token && token === 'secret-token' ? true : false; +}; + +const ProtectedRoute = (props) => { + const { redirectTo = '/', children } = props; + + const isAuthenticated = checkAuth(); // => true | false // Authentication - Prüfung + + return isAuthenticated ? children : ; +}; + +const Router = () => { + // const { } = props; + + return ( + + {/* Static Routes */} + } /> + } /> + } /> + } /> + + {/* Dynamic Routes */} + Flights} /> + } /> + + {/* Nested Routes */} + {/* }> + } /> + } /> + } /> + */} + + }> + Index} /> + Profile} /> + Dashboard} /> + Settings} /> + + + {/* Protected Routes | Geschützte Routen */} + +
+

Admin Dashboard Page

+

Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero atque eveniet hic temporibus

+
+ + }>
+
+ ); +}; +export default Router; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/01_frameworks/_index.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/01_frameworks/_index.scss new file mode 100644 index 0000000..42edceb --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/01_frameworks/_index.scss @@ -0,0 +1,3 @@ +// Bootstrap 5.3.8 or 6 (6.0.0-alpha.1) straight from node_modules. +// @forward 'bootstrap/scss/bootstrap-grid' +@forward 'bootstrap/scss/bootstrap'; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss new file mode 100644 index 0000000..f46eba2 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_gloria-hallelujah-v24-latin.scss @@ -0,0 +1,8 @@ +// gloria-hallelujah-regular - latin +@font-face { + font-display: swap; + font-family: 'Gloria Hallelujah'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/gloria-hallelujah-v24-latin/gloria-hallelujah-v24-latin-regular.woff2') format('woff2'); +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_index.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_index.scss new file mode 100644 index 0000000..d377888 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_index.scss @@ -0,0 +1,3 @@ +// @forward 'gloria-hallelujah-v24-latin'; +// @forward 'lato-v25-latin'; +// @forward 'source-sans-3-v19-latin'; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_lato-v25-latin.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_lato-v25-latin.scss new file mode 100644 index 0000000..522cfda --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_lato-v25-latin.scss @@ -0,0 +1,89 @@ +// lato-100 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 100; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-100.woff2') format('woff2'); +} + +// lato-100italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 100; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-100italic.woff2') format('woff2'); +} + +// lato-300 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 300; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-300.woff2') format('woff2'); +} + +// lato-300italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 300; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-300italic.woff2') format('woff2'); +} + +// lato-regular - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-regular.woff2') format('woff2'); +} + +// lato-italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-italic.woff2') format('woff2'); +} + +// lato-700 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-700.woff2') format('woff2'); +} + +// lato-700italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 700; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-700italic.woff2') format('woff2'); +} + +// lato-900 - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 900; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-900.woff2') format('woff2'); +} + +// lato-900italic - latin +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 900; + src: url('../../assets/fonts/lato-v25-latin/lato-v25-latin-900italic.woff2') format('woff2'); +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_source-sans-3-v19-latin.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_source-sans-3-v19-latin.scss new file mode 100644 index 0000000..b732c16 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/02_fonts/_source-sans-3-v19-latin.scss @@ -0,0 +1,143 @@ +// source-sans-3-200 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 200; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2') format('woff2'); +} + +// source-sans-3-200italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 200; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2') format('woff2'); +} + +// source-sans-3-300 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 300; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2') format('woff2'); +} + +// source-sans-3-300italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 300; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2') format('woff2'); +} + +// source-sans-3-regular - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 400; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2') format('woff2'); +} + +// source-sans-3-italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 400; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2') format('woff2'); +} + +// source-sans-3-500 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 500; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2') format('woff2'); +} + +// source-sans-3-500italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 500; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2') format('woff2'); +} + +// source-sans-3-600 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 600; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2') format('woff2'); +} + +// source-sans-3-600italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 600; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2') format('woff2'); +} + +// source-sans-3-700 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 700; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2') format('woff2'); +} + +// source-sans-3-700italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 700; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2') format('woff2'); +} + +// source-sans-3-800 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 800; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2') format('woff2'); +} + +// source-sans-3-800italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 800; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2') format('woff2'); +} + +// source-sans-3-900 - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: normal; + font-weight: 900; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2') format('woff2'); +} + +// source-sans-3-900italic - latin +@font-face { + font-display: swap; + font-family: 'Source Sans 3'; + font-style: italic; + font-weight: 900; + src: url('../../assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2') format('woff2'); +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_colors.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_colors.scss new file mode 100644 index 0000000..a550f3d --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_colors.scss @@ -0,0 +1,13 @@ +/* Color Theme Swatches in Hex */ +$color-1: #5c4b51; +$color-2: #8cbeb2; +$color-3: #f2ebbf; +$color-4: #f3b562; +$color-5: #f06060; + +$color-red: $color-5; +$color-white: white; // falls weiß geändert wird z.B.: #f8f8f8 +$color-black: #101010; + +$color-dark-blue: #283e4a; +$linear-gradient-dark: linear-gradient(180deg, rgba(40, 62, 74, 1) 0%, rgba(24, 32, 38, 1) 100%); diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_index.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_index.scss new file mode 100644 index 0000000..aaf4e12 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_index.scss @@ -0,0 +1,2 @@ +// Variables (colors, typography) are pulled in by the partials that need them via @use. +@forward 'theme'; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_theme.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_theme.scss new file mode 100644 index 0000000..26b9863 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_theme.scss @@ -0,0 +1,52 @@ +@use 'typography' as *; + +// Allgemeine Formatierung +*, +html { + box-sizing: border-box; +} + +html, +body, +#root, +#app { + height: 100%; +} +// Sticky Footer +body, +#root, +#app { + display: flex; + flex-direction: column; +} + +main, +#main { + flex: 1 0 auto; +} + +body > footer, +.footer-main { + flex-shrink: 0; +} +// sticky end + +body { + margin: 0; + padding: 0; + font-family: $font-copy; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: $font-headline; + font-weight: 600; +} + +blockquote { + font-family: $font-quote; +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_typography.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_typography.scss new file mode 100644 index 0000000..7c9b095 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/03_base/_typography.scss @@ -0,0 +1,9 @@ +$fallback-serif: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif; +$fallback-sans-serif: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + +$font-headline: 'Lato', $fallback-serif; +$font-subclaim: $fallback-sans-serif; + +$font-menu: 'Source Sans 3', $fallback-sans-serif; +$font-copy: 'Source Sans 3', $fallback-sans-serif; +$font-quote: 'Gloria Hallelujah', $fallback-serif; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/_index.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/_index.scss new file mode 100644 index 0000000..bd5ba6a --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/_index.scss @@ -0,0 +1,7 @@ +// @use '@fortawesome/fontawesome-free/scss/variables' with ( +// $font-path: '@fa-webfonts' +// ); +// @use '@fortawesome/fontawesome-free/scss/fontawesome'; +// @use '@fortawesome/fontawesome-free/scss/solid'; + +// @use 'toastify-1.12/toastify'; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/toastify-1.12/_toastify.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/toastify-1.12/_toastify.scss new file mode 100644 index 0000000..e359a14 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/04_plugins/toastify-1.12/_toastify.scss @@ -0,0 +1,88 @@ +/*! + * Toastify js 1.12.0 + * https://github.com/apvarun/toastify-js + * @license MIT licensed + * + * Copyright (C) 2018 Varun A P + */ + +.toastify { + padding: 12px 20px; + color: #ffffff; + display: inline-block; + box-shadow: + 0 3px 6px -1px rgba(0, 0, 0, 0.12), + 0 10px 36px -4px rgba(77, 96, 232, 0.3); + background: -webkit-linear-gradient(315deg, #73a5ff, #5477f5); + background: linear-gradient(135deg, #73a5ff, #5477f5); + position: fixed; + opacity: 0; + transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1); + border-radius: 2px; + cursor: pointer; + text-decoration: none; + max-width: calc(50% - 20px); + z-index: 2147483647; +} + +.toastify.on { + opacity: 1; +} + +.toast-close { + background: transparent; + border: 0; + color: white; + cursor: pointer; + font-family: inherit; + font-size: 1em; + opacity: 0.4; + padding: 0 5px; +} + +.toastify-right { + right: 15px; +} + +.toastify-left { + left: 15px; +} + +.toastify-top { + top: -150px; +} + +.toastify-bottom { + bottom: -150px; +} + +.toastify-rounded { + border-radius: 25px; +} + +.toastify-avatar { + width: 1.5em; + height: 1.5em; + margin: -7px 5px; + border-radius: 2px; +} + +.toastify-center { + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + max-width: fit-content; + max-width: -moz-fit-content; +} + +@media only screen and (max-width: 360px) { + .toastify-right, + .toastify-left { + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + max-width: fit-content; + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_button.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_button.scss new file mode 100644 index 0000000..1660f6b --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_button.scss @@ -0,0 +1,17 @@ +button, +input { + &.btn-custom { + background-color: #f0f0f0; + color: #333; + border: 1px solid #ccc; + padding: 8px 16px; + border-radius: 0px; + margin: 3px; + &:hover, + &:focus { + background-color: #e0e0e0; + color: #333; + border: 1px solid #ccc; + } + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_chuck-norris-joke.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_chuck-norris-joke.scss new file mode 100644 index 0000000..232b479 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_chuck-norris-joke.scss @@ -0,0 +1,38 @@ +@use '../03_base/colors' as *; + +.chuck-norris-joke { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + min-height: calc(100vh - 3.5rem); // full screen below the navbar + background: #555 url('../../assets/img/concrete-bg.jpg') center no-repeat fixed; + background-size: cover; + + &::after { + content: ''; + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient(circle, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.8) 100%); + } + + > * { + position: relative; + z-index: 2; + } + + .joke-text { + color: $color-white; + text-align: center; + font-size: 3rem; + max-width: 80%; + padding: 2rem; + text-shadow: 2px 2px 5px rgba(black, 0.5); + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_footerMain.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_footerMain.scss new file mode 100644 index 0000000..fd73f7c --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_footerMain.scss @@ -0,0 +1,45 @@ +@use '../03_base/colors' as *; + +.footer-main { + background-color: $color-black; + background: $linear-gradient-dark; + padding: 3rem 0; + [class^='col'] { + color: $color-white; + a { + color: $color-white; + } + h2, + h3, + h4, + h5, + h6 { + font-size: 1.5rem; + color: $color-2; + padding: 0.5rem 0; + margin-bottom: 1rem; + letter-spacing: 2px; + } + } + // Mobile First + .row { + flex-direction: column; + > div { + &:nth-child(1) { + order: 3; + } + &:nth-child(2) { + order: 2; + } + &:nth-child(3) { + order: 1; + } + } + } + @media (min-width: 992px) { + // @include media-breakpoint-up(md) { + .row { + flex-direction: row; + } + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_header-main.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_header-main.scss new file mode 100644 index 0000000..2884477 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_header-main.scss @@ -0,0 +1,15 @@ +.m-header-main { + width: 100%; + height: 400px; + + // https://cssreference.io/property/background/ + background: #efefef url('../../assets/img/header-bg.webp') center no-repeat border-box; + background-size: cover; + + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + border: 20px solid rgba(white, 0.25); +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_index.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_index.scss new file mode 100644 index 0000000..484b0de --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_index.scss @@ -0,0 +1,8 @@ +@forward 'button'; +// @forward 'chuck-norris-joke'; +@forward 'footerMain'; +@forward 'header-main'; +@forward 'input-amount'; +@forward 'logo-main'; +// @forward 'menu-main'; +// @forward 'product-manager'; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_input-amount.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_input-amount.scss new file mode 100644 index 0000000..8701a7c --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_input-amount.scss @@ -0,0 +1,27 @@ +.m-input-amount { + .input-group { + .input-group-text { + padding: 0; + display: inline-block; + overflow: hidden; + button { + border-radius: 0; + } + } + input { + max-width: 85px; + text-align: center; + } + /* Für Chrome, Safari, Edge und Opera */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Für Firefox */ + input[type='number'] { + appearance: textfield; + } + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_logo-main.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_logo-main.scss new file mode 100644 index 0000000..399bd12 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_logo-main.scss @@ -0,0 +1,21 @@ +.logo-main { + margin: 0; + + img, + svg { + width: 320px; + height: auto; + max-width: 320px; + } + + figcaption { + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_menu-main.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_menu-main.scss new file mode 100644 index 0000000..df4627e --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_menu-main.scss @@ -0,0 +1,20 @@ +@use '../03_base/colors' as *; +@use '../03_base/typography' as *; + +// Main navigation = Bootstrap 6 navbar (see includes/menu-main.html). +// Only the look from frontend-gulp is added here: black bar, uppercase links. +.menu-main { + background-color: $color-black; + font-family: $font-menu; + + .nav-link { + text-transform: uppercase; + } +} + +// Mobile drawer: Bootstrap 6 alpha keeps it white although the navbar is dark +// (data-bs-theme="dark"), which leaves the light link text invisible. Give it the bar's colour. +.menu-main .drawer { + background-color: $color-black; + color: $color-white; +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_product-manager.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_product-manager.scss new file mode 100644 index 0000000..4f3ed4d --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/05_modules/_product-manager.scss @@ -0,0 +1,47 @@ +.product-manager { + .nav-products-actions { + ul { + padding: 0; + margin: 0; + list-style: none; + display: flex; + justify-content: flex-end; + + li { + button { + margin: 0.5rem 0 0.5rem 0.5rem; + } + } + } + } + + table { + .th-actions { + width: 200px; + } + .th-dragger { + width: 50px; + } + + td { + vertical-align: middle; + button { + margin: 0 2px; + } + } + + tbody:empty::after { + content: 'loading products...'; + width: max-content; + display: inline-block; + color: #999; + padding: 1rem; + } + tfoot .row > * { + margin-bottom: 0.5rem; + @media (min-width: 992px) { + margin-bottom: 0; + } + } + } +} diff --git a/06_react/uebungen/u19_chuck-norris-api/src/styles/main.scss b/06_react/uebungen/u19_chuck-norris-api/src/styles/main.scss new file mode 100644 index 0000000..297e74f --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/styles/main.scss @@ -0,0 +1,13 @@ +// Single stylesheet entry, linked in src/html/includes/head.html. +// Same folders as in frontend-gulp; @use instead of the deprecated @import. + +// 01 Frameworks +@use '01_frameworks' as *; +// 02 Fonts +@use '02_fonts' as *; +// 03 Base +@use '03_base' as *; +// 04 Plugins +@use '04_plugins' as *; +// 05 Modules +@use '05_modules' as *; diff --git a/06_react/uebungen/u19_chuck-norris-api/src/utils/validators/validate.js b/06_react/uebungen/u19_chuck-norris-api/src/utils/validators/validate.js new file mode 100644 index 0000000..9d778df --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/src/utils/validators/validate.js @@ -0,0 +1,39 @@ +import isEmail from 'validator/lib/isEmail'; +import isLength from 'validator/lib/isLength'; +import isEmpty from 'validator/lib/isEmpty'; + +const validate = (formData) => { + const errors = {}; + const firstname = formData.firstname.trim(); + const lastname = formData.lastname.trim(); + const email = formData.email.trim(); + const message = formData.message.trim(); + + if (isEmpty(firstname)) { + errors.firstname = 'Firstname is required'; + } else if (!isLength(firstname, { min: 2, max: 50 })) { + errors.firstname = 'Firstname must be between 2 and 50 characters'; + } + + if (isEmpty(lastname)) { + errors.lastname = 'Lastname is required'; + } else if (!isLength(lastname, { min: 2, max: 60 })) { + errors.lastname = 'Lastname must be between 2 and 60 characters'; + } + + if (isEmpty(email)) { + errors.email = 'Email is required'; + } else if (!isEmail(email)) { + errors.email = 'Email is invalid'; + } + + if (isEmpty(message)) { + errors.message = 'Message is required'; + } else if (!isLength(message, { min: 10, max: 1000 })) { + errors.message = 'Message must be between 10 and 1000 characters'; + } + + return errors; +}; + +export default validate; diff --git a/06_react/uebungen/u19_chuck-norris-api/vite.config.js b/06_react/uebungen/u19_chuck-norris-api/vite.config.js new file mode 100644 index 0000000..24ad103 --- /dev/null +++ b/06_react/uebungen/u19_chuck-norris-api/vite.config.js @@ -0,0 +1,15 @@ +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + css: { + preprocessorOptions: { + scss: { + quietDeps: true, // Unix + silenceDeprecations: ['color-functions', 'global-builtin', 'import', 'legacy-js-api', 'if-function'], + }, + }, + }, +}); diff --git a/06_react/unterricht/tag38/02_react-api-with-hooks/package-lock.json b/06_react/unterricht/tag38/02_react-api-with-hooks/package-lock.json deleted file mode 100644 index 3bd42f3..0000000 --- a/06_react/unterricht/tag38/02_react-api-with-hooks/package-lock.json +++ /dev/null @@ -1,2701 +0,0 @@ -{ - "name": "react-api-with-hooks", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react-api-with-hooks", - "version": "0.0.0", - "dependencies": { - "axios": "^1.21.0", - "bootstrap": "^5.3.8", - "joi": "^18.3.0", - "react": "^19.3.1", - "react-dom": "^19.3.1", - "react-hook-form": "^7.91.0", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.5", - "validator": "^13.15.35" - }, - "devDependencies": { - "@types/react": "^19.3.0", - "@types/react-dom": "^19.3.0", - "@vitejs/plugin-react": "^6.1.2", - "oxlint": "^1.90.0", - "sass-embedded": "^1.106.1", - "vite": "^8.3.5" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.16.0.tgz", - "integrity": "sha512-FWa0sPlqYGJgpTs6OxBRcL/AW4JT0OIO+W1ajerluoTVh8CV0B7XM1qsNCRgnkSCkRCgOICKHRQlY17jrsm0+Q==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@hapi/address": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", - "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^11.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@hapi/formula": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", - "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/hoek": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/pinpoint": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", - "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/tlds": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.7.tgz", - "integrity": "sha512-MgNjRwy9Ti92yVAixLmDc8dd1bJIKwO9qlWCfFQRwRmUEDPQHYn4G6hwPFvFGUTzAa0FsS+inMjLin7GnyBRhA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@hapi/topo": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", - "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.155.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", - "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/oxc-project" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.90.0.tgz", - "integrity": "sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.90.0.tgz", - "integrity": "sha512-OLbU9qsrV2Q8QxT2OEzOPdO8zCCpyI8qB+hDI8yr6RsYELtkf0FAZhJdfjM/RnLHKzt44HWwAPnk92vBtKofvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.90.0.tgz", - "integrity": "sha512-fBA4pWyVDARmNucQqpyFuPC49xYf1r+sX7dxPL5fNPQrSMLum39Sn56tZ9JPleWC7FzLPwSQ7plYYfirYBHF8A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.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==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.90.0.tgz", - "integrity": "sha512-MvYmpHyJqUJjEvkZbJHdwfdL45cGn8EVBkYmoXFiaYFW9suoD3dbJl5mBdpy0DVgdjlyddmldbRtk3cCgETadQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.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==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.90.0.tgz", - "integrity": "sha512-wFDdZWGpzIPFdJFjSLWnKB0TGzFriTKUIrl04iMqMyM9BBIJTuerfCHYa0WpDSjr5x3lcW/CHLyacSt886WpGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.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==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.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==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.90.0.tgz", - "integrity": "sha512-s7JFKRkGS8O7i2ZVODfuO++NC7sH6HDqpMn8lYxw91w0SXJOxnAVjQ8utvmDwLMMT0jaSkuOKuUYJDGDtu4sHQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.90.0.tgz", - "integrity": "sha512-b0GxrOQr5VONCkd7KLSqmP6b6nqZuTpuS8QPQHzltmqdXP5bY0Jl0CZ0QmlCTrS3ExaLYbioFYOARzNbYvcApQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.90.0.tgz", - "integrity": "sha512-iaJeShJtgUp8rZbt9YUdTAGOpmX5KogCLba17Jp1tWdJ3F4M3D2g2TKUyI1FMTHxKH9NNHuQcuC2kZRg6IV7yQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.90.0.tgz", - "integrity": "sha512-/aZoXnL5WBLCXuzfHqvEFXcm4iwYmr/cYByHDTXzLFzJdE5DC7bm6phpWqHv6BeqpVgY9IpBAxGDv2WEkl5JCg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.90.0.tgz", - "integrity": "sha512-SMhk7ozwoxYDKfYqGZCQEfULOKDneF9uhaoIf2neoDLWvNtjY9yVeL7YHmE5L9WdKvMpWNwwZxhenxBu6AgfOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.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==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.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==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", - "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", - "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", - "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", - "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", - "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", - "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", - "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", - "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", - "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", - "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", - "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", - "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", - "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", - "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", - "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", - "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", - "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.3.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.2.tgz", - "integrity": "sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.152.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/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/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/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/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/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", - "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "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/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, - "license": "MIT" - }, - "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/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/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/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/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-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/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/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", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/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", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "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/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", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/joi": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.3.1.tgz", - "integrity": "sha512-mV9M4Llh4va3NT90p7KBtQhoZqjs8xLX7EWYE4y/GG3yLF6REbIBEHSUb0UX1JXRht2w5tiLSsvmpYc5akiqIw==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/address": "^5.1.1", - "@hapi/formula": "^3.0.2", - "@hapi/hoek": "^11.0.7", - "@hapi/pinpoint": "^2.0.1", - "@hapi/tlds": "^1.1.1", - "@hapi/topo": "^6.0.2", - "@standard-schema/spec": "^1.1.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/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/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", - "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.90.0.tgz", - "integrity": "sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/oxc-project" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.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" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2005", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", - "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.20", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/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/react": { - "version": "19.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", - "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", - "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.28.0" - }, - "peerDependencies": { - "react": "^19.3.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.91.0.tgz", - "integrity": "sha512-5BEBUnCBwa28AFXYTYmOaB/+CSpJ/+CWVASHEvIGUzFdHyUiPHeRhG7r5hOZ8nZi0yP7pbHdFNXO/p31EKTJFQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.5.tgz", - "integrity": "sha512-dTgvcXDOrLPrlLHrcZAqWveiK1hMSqN+rGAJzegP8HtmNkfRxOoshGWBNX3ZJ0cZjOHkRdlUJtaIhZMLLyGyPw==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.5.tgz", - "integrity": "sha512-9HcfDMU6JJ/fp6gJZYGwNE6RknVGS4kBjH1HkNw959mCJi70TVwdipQWv2FEol9uGpi+SZTFtVpJPtEQfayeOw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.5" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", - "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.155.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.15", - "@rolldown/binding-android-arm64": "1.2.15", - "@rolldown/binding-darwin-arm64": "1.2.15", - "@rolldown/binding-darwin-x64": "1.2.15", - "@rolldown/binding-freebsd-x64": "1.2.15", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", - "@rolldown/binding-linux-arm64-gnu": "1.2.15", - "@rolldown/binding-linux-arm64-musl": "1.2.15", - "@rolldown/binding-linux-ppc64-gnu": "1.2.15", - "@rolldown/binding-linux-s390x-gnu": "1.2.15", - "@rolldown/binding-linux-x64-gnu": "1.2.15", - "@rolldown/binding-linux-x64-musl": "1.2.15", - "@rolldown/binding-openharmony-arm64": "1.2.15", - "@rolldown/binding-win32-arm64-msvc": "1.2.15", - "@rolldown/binding-win32-x64-msvc": "1.2.15" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.106.1.tgz", - "integrity": "sha512-kD+Gi66vycZcbJt+42NC4z4PXNMcCajVrJPhqoKKXy5cOBMmJQt052CxIBcRjwYXeImHYOpu/ydWWGZQIenl7A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.106.1.tgz", - "integrity": "sha512-OoaTjMm7PcQnCo/AZNSKM/KdAeaX57edhmOp2bH8hcGNph2VDIg404gOSMZxGKNL+lbc7Ng0S/IYLAbs0YmgfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.7.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.106.1", - "sass-embedded-android-arm": "1.106.1", - "sass-embedded-android-arm64": "1.106.1", - "sass-embedded-android-riscv64": "1.106.1", - "sass-embedded-android-x64": "1.106.1", - "sass-embedded-darwin-arm64": "1.106.1", - "sass-embedded-darwin-x64": "1.106.1", - "sass-embedded-linux-arm": "1.106.1", - "sass-embedded-linux-arm64": "1.106.1", - "sass-embedded-linux-musl-arm": "1.106.1", - "sass-embedded-linux-musl-arm64": "1.106.1", - "sass-embedded-linux-musl-riscv64": "1.106.1", - "sass-embedded-linux-musl-x64": "1.106.1", - "sass-embedded-linux-riscv64": "1.106.1", - "sass-embedded-linux-x64": "1.106.1", - "sass-embedded-unknown-all": "1.106.1", - "sass-embedded-win32-arm64": "1.106.1", - "sass-embedded-win32-x64": "1.106.1" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.106.1.tgz", - "integrity": "sha512-5jUnX+WVeovsbORYHBfPMiAtb5/qTnWpuLrlg0ZEjo4AKLjkM3gXkRCReYBEi/bLC3JhBcWWwG/yPqJwd8/lLw==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.106.1" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.106.1.tgz", - "integrity": "sha512-xtLTJzkh2/oGI0kZ787ef55zKzmk6UO6nsIMV8CE9n2qMG3JvyU91EU+BxjvknRR9BTVvbQOCLqW5j0psFOeAQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.106.1.tgz", - "integrity": "sha512-USQo5LkotweQnofhTCZYBtI35HkbIRUx+YfI6AvNN/Wr45ewCbUnTOYvQc+DLFFcm+g9cp64kLrySPdLbkuPzQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.106.1.tgz", - "integrity": "sha512-OyEAsl8q6xpZgsK4zupwfhVUYvjJaMPgILyXtx326DSPc5lKOwWpXa8rhI2H3eAB76xU61C/5RavIkH1iaqQeQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.106.1.tgz", - "integrity": "sha512-cczQbbtwex6mtaXS/8UwCSx6613EHiVLQNpkeVmk5oN08HpzPsWMoyzuGa2hdfh0by9mHXismdLk8fh9wdEQ+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.106.1.tgz", - "integrity": "sha512-j8p5iM8v0lGFwfO6sagHkrokD7/zlEkCpfRiBDzvW+FdD/JqOW1nemVz/CexHeeR28ULrUNnE1fKJ/FN9TjTEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.106.1.tgz", - "integrity": "sha512-WMszbY07IZ/GOaRlrMI3o+h7eiiOKBppLT+GSunSQsVcr2N4rlmM2rXlLsfub1praplLB4FWqMY1St8kLSjmZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.106.1.tgz", - "integrity": "sha512-EfhuxqURaMpP/eG4bg3fk4XZvRzMJBIw2iSVNRRbpwMOZLhDce8Eys95rTuOuU2R9/pHMwcVwpj/ZU3mZyLHog==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.106.1.tgz", - "integrity": "sha512-CBUcLDCBUiB6vlMO5VwtTywpapeE8cmr/UJ//xwNwByNGxc6JvoBru5XA1bhPquRjgNNMs90u89ybgap8gN31Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.106.1.tgz", - "integrity": "sha512-ToaDrOiunMuD64XLelRqjC0LWuEKt8q6vpqPsHdSN8T5paJWrAXP8EXMcuR/iIBigsssifAPym/MHEWLkLSTlg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.106.1.tgz", - "integrity": "sha512-yDUGDnNbPOoVaeEapLomFnwQkLQF4pveitqjq3J9Oi7qmg8mM/PXJYWOqCOq1ifXSbnnWppfuylUSkGTwnO1Hg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.106.1.tgz", - "integrity": "sha512-mQwiwXzfYlT/3Tb7TAvly9eoJc6Q6z+PC2e8mtuajr77DWAGa+8Ibte1umkG/F6o9jFNG8k752A4EAlSRTXfNg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.106.1.tgz", - "integrity": "sha512-GwVa+GJGeu8ACw06aGXz8uuc9rFXRJsceMHHi02fpuv3qsy2asMgy9xgN4GPVJLac4yjCBmf09sUUqWpOCrkzw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.106.1.tgz", - "integrity": "sha512-biV7fnrlTBAfl+bzIMTgGUHaW803NJti4XcKpX70ukOOKOgxsEwwvk21tI0w8VLKIyXFuLKM3TJxe3Ze1DR0tQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.106.1.tgz", - "integrity": "sha512-Ev2UktLmdFVvCFeSNyow0HNdxmNHqcXLRgEeesKpw4mtcuLN5HHocOJw9LrHiTbcpMPsfxgymS4jJBg43AptaA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.106.1.tgz", - "integrity": "sha512-uaeOeGCaHnhqpfZnjy5wGMcuyYbnDyXhzWCniGctqCj/Inlst4eDZaweowo+sJLExRvmToBhQ8seZyEvfGMQ4g==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.106.1" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.106.1.tgz", - "integrity": "sha512-EiDwpthGDIX25B4d5lVEYgxzqRSdSFoi8czHHesXFYinroDHmgTpqgv7MhYmGogTCvei3o8AahX2Wl1BanWJQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.106.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.106.1.tgz", - "integrity": "sha512-j3OIOIXrNqbggtWlht7M/mkYybmGeGtvP7FRUx0NTDC6yeRhc16QTOoHb+z8S6NO9x0frg8eQS+F5qF7+DCKBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", - "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", - "license": "MIT" - }, - "node_modules/set-cookie-parser": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.3.tgz", - "integrity": "sha512-irZHtTqurLna57KQG/s+fzOwv/J6XSH4cs8M/vsrY3uCaQ3S6+QJguAH0WdN47SXlk82voMZ4naWMQf8fdEoIg==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", - "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.1.1.tgz", - "integrity": "sha512-54zMOnH5qgjdKW8SGpCx3daSP+v+TtTfOxgPdhUE3P0hytMMpknZfP67S4JeRcx5IQRWJERz6890yO4dkTywww==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/validator": { - "version": "13.15.35", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", - "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", - "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.7", - "postcss": "^8.5.30", - "rolldown": "~1.2.14", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.7.1 || ^0.8.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListTodo.jsx b/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListTodo.jsx index 60e5628..6ac253e 100644 --- a/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListTodo.jsx +++ b/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListTodo.jsx @@ -1,14 +1,50 @@ +import { useEffect, useState } from 'react'; + const ListTodo = (props) => { // const { } = props; + const [todos, setTodos] = useState([]); + + useEffect(() => { + fetch('https://dummyjson.com/todos/random/6') + .then((res) => { + if (!res.ok) { + throw new Error('HTTP-Request went wrong'); + } + return res.json(); // -> Promise HTTP-Response->Body + }) + .then((data) => { + setTodos(data); + }) + .catch((err) => { + console.error(err); + }); + + return () => { + // cleanup + }; + }, []); + return (
    -
  • - - -
  • + {todos.length > 0 && + todos.map(({ completed, id, todo }, idx) => ( +
  • +
    + + +
    +
  • + ))}
); }; diff --git a/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListUser.jsx b/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListUser.jsx new file mode 100644 index 0000000..ceb3878 --- /dev/null +++ b/06_react/unterricht/tag38/02_react-api-with-hooks/src/components/lists/ListUser.jsx @@ -0,0 +1,53 @@ +import { useEffect, useState } from 'react'; +import axios from 'axios'; + +const ListUser = (props) => { + // const { } = props; + + const [users, setUsers] = useState([]); + + useEffect(() => { + const fetchUsers = async () => { + try { + const { data } = await axios.get('https://dummyjson.com/users?limit=5&select=firstName,lastName,age,email'); + + if (!data) throw Error('Something went wrong'); + setUsers(data.users); + } catch (error) { + console.error(error); + throw Error(`Error: ${error}`); + } + }; + + fetchUsers(); + + // axios + // .get('https://dummyjson.com/users?limit=10&select=firstName,lastName,age,email') + // .then(({ data }) => { + // setUsers(data.users); + // }) + // .catch((err) => { + // console.error(err); + // }); + + return () => {}; + }, []); + + return ( +
    + {users.length > 0 && + users.map(({ firstName, lastName, age, email }, idx) => ( +
  • +

    + Name: {firstName} {lastName} +
    + Age: {age} +
    + Email: {email} +

    +
  • + ))} +
+ ); +}; +export default ListUser; diff --git a/06_react/unterricht/tag38/02_react-api-with-hooks/src/pages/ApiPage.jsx b/06_react/unterricht/tag38/02_react-api-with-hooks/src/pages/ApiPage.jsx index 6a39dd3..2715797 100644 --- a/06_react/unterricht/tag38/02_react-api-with-hooks/src/pages/ApiPage.jsx +++ b/06_react/unterricht/tag38/02_react-api-with-hooks/src/pages/ApiPage.jsx @@ -1,4 +1,5 @@ import ListTodo from '../components/lists/ListTodo'; +import ListUser from '../components/lists/ListUser'; const ApiPage = (props) => { // const { } = props; @@ -7,6 +8,8 @@ const ApiPage = (props) => {

APIs auslesen mit React

+

Users

+

Todos