diff --git a/06_react.zip b/06_react.zip
new file mode 100644
index 0000000..f8c3916
Binary files /dev/null and b/06_react.zip differ
diff --git a/06_react/.vscode/extensions.json b/06_react/.vscode/extensions.json
new file mode 100644
index 0000000..bb659e6
--- /dev/null
+++ b/06_react/.vscode/extensions.json
@@ -0,0 +1,15 @@
+{
+ "recommendations": [
+ "kamikillerto.vscode-colorize",
+ "sleistner.vscode-fileutils",
+ "bierner.github-markdown-preview",
+ "bradgashler.htmltagwrap",
+ "zhuangtongfa.material-theme",
+ "techer.open-in-browser",
+ "esbenp.prettier-vscode",
+ "pdconsec.vscode-print",
+ "vscode-icons-team.vscode-icons",
+ "formulahendry.auto-rename-tag",
+ "tomoki1207.pdf"
+ ]
+}
diff --git a/06_react/.vscode/marp-theme.css b/06_react/.vscode/marp-theme.css
new file mode 100644
index 0000000..90ea8da
--- /dev/null
+++ b/06_react/.vscode/marp-theme.css
@@ -0,0 +1,332 @@
+/* @theme marp-theme */
+
+@charset "UTF-8";
+/*!
+ * Marp Dracula theme.
+ * @theme marp-theme
+ * @author Daniel Nicolas Gisolfi & modified by Philippe Botzek
+ *
+ * @auto-scaling true
+ * @size 4:3 960px 720px
+ * @size 16:9 1280px 720px
+ */
+
+@import url('https://fonts.googleapis.com/css?family=Lato:400,900|IBM+Plex+Sans:400,700');
+
+:root {
+ --dracula-background: #282a36;
+ --dracula-current-line: #44475a;
+ --dracula-foreground: #f8f8f2;
+ --dracula-comment: #6272a4;
+ --dracula-cyan: #8be9fd;
+ --dracula-green: #50fa7b;
+ --dracula-orange: #ffb86c;
+ --dracula-pink: #ff79c6;
+ --dracula-purple: #bd93f9;
+ --dracula-red: #ff5555;
+ --dracula-yellow: #f1fa8c;
+}
+
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: var(--dracula-background);
+}
+
+/* Dracula Foreground */
+.hljs,
+.hljs-subst,
+.hljs-typing,
+.hljs-variable,
+.hljs-template-variable {
+ color: var(--dracula-foreground);
+}
+
+/* Dracula Comment */
+.hljs-comment,
+.hljs-quote,
+.hljs-deletion {
+ color: var(--dracula-comment);
+}
+
+/* Dracula Cyan */
+.hljs-meta .hljs-doctag,
+.hljs-built_in,
+.hljs-selector-tag,
+.hljs-section,
+.hljs-link,
+.hljs-class {
+ color: var(--dracula-cyan);
+}
+
+/* Dracula Green */
+.hljs-title {
+ color: var(--dracula-green);
+}
+
+/* Dracula Orange */
+.hljs-params {
+ color: var(--dracula-orange);
+}
+
+/* Dracula Pink */
+.hljs-keyword {
+ color: var(--dracula-pink);
+}
+
+/* Dracula Purple */
+.hljs-literal,
+.hljs-number {
+ color: var(--dracula-purple);
+}
+
+/* Dracula Red */
+.hljs-regexp {
+ color: var(--dracula-red);
+}
+
+/* Dracula Yellow */
+.hljs-string,
+.hljs-name,
+.hljs-type,
+.hljs-attr,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-addition,
+.hljs-template-tag {
+ color: var(--dracula-yellow);
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-title,
+.hljs-section,
+.hljs-doctag,
+.hljs-type,
+.hljs-name,
+.hljs-strong {
+ font-weight: bold;
+}
+
+.hljs-params,
+.hljs-emphasis {
+ font-style: italic;
+}
+
+svg[data-marp-fitting='svg'] {
+ max-height: 580px;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin: 0.5em 0 0 0;
+ color: var(--dracula-pink);
+}
+h1 strong,
+h2 strong,
+h3 strong,
+h4 strong,
+h5 strong,
+h6 strong {
+ font-weight: inherit;
+}
+
+h1 {
+ font-size: 1.8em;
+}
+
+h2 {
+ font-size: 1.5em;
+}
+
+h3 {
+ font-size: 1.3em;
+}
+
+h4 {
+ font-size: 1.1em;
+}
+
+h5 {
+ font-size: 1em;
+}
+
+h6 {
+ font-size: 0.9em;
+}
+
+p,
+blockquote {
+ margin: 1em 0 0 0;
+}
+
+ul > li,
+ol > li {
+ margin: 0.3em 0 0 0;
+ color: var(--dracula-cyan);
+}
+ul > li > p,
+ol > li > p {
+ margin: 0.6em 0 0 0;
+}
+
+code {
+ display: inline-block;
+ font-family: 'IBM Plex Mono', monospace;
+ font-size: 0.8em;
+ letter-spacing: 0;
+ margin: -0.1em 0.15em;
+ padding: 0.1em 0.2em;
+ vertical-align: baseline;
+ color: var(--dracula-green);
+}
+
+pre {
+ display: block;
+ margin: 1em 0 0 0;
+ min-height: 1em;
+ overflow: visible;
+}
+pre code {
+ box-sizing: border-box;
+ margin: 0;
+ min-width: 100%;
+ padding: 0.5em;
+ font-size: 0.7em;
+}
+pre code svg[data-marp-fitting='svg'] {
+ max-height: calc(580px - 1em);
+}
+
+blockquote {
+ margin: 1em 0 0 0;
+ padding: 0 1em;
+ position: relative;
+ color: var(--dracula-orange);
+}
+blockquote::after,
+blockquote::before {
+ content: '“';
+ display: block;
+ font-family: 'Times New Roman', serif;
+ font-weight: bold;
+ position: absolute;
+ color: var(--dracula-green);
+}
+blockquote::before {
+ top: 0;
+ left: 0;
+}
+blockquote::after {
+ right: 0;
+ bottom: 0;
+ transform: rotate(180deg);
+}
+blockquote > *:first-child {
+ margin-top: 0;
+}
+
+mark {
+ background: transparent;
+}
+
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ margin: 1em 0 0 0;
+}
+table th,
+table td {
+ padding: 0.2em 0.4em;
+ border-width: 1px;
+ border-style: solid;
+}
+
+section {
+ font-size: 35px;
+ font-family: 'IBM Plex Sans';
+ line-height: 1.35;
+ letter-spacing: 1.25px;
+ padding: 70px;
+ color: var(--dracula-foreground);
+ background-color: var(--dracula-background);
+}
+section > *:first-child,
+section > header:first-child + * {
+ margin-top: 0;
+}
+section a,
+section mark {
+ color: var(--dracula-red);
+}
+section code {
+ background: var(--dracula-current-line);
+ color: var(--dracula-current-green);
+}
+section h1 strong,
+section h2 strong,
+section h3 strong,
+section h4 strong,
+section h5 strong,
+section h6 strong {
+ color: var(--dracula-current-line);
+}
+section pre > code {
+ background: var(--dracula-current-line);
+}
+section header,
+section footer,
+section section::after,
+section blockquote::before,
+section blockquote::after {
+ color: var(--dracula-comment);
+}
+section table th,
+section table td {
+ border-color: var(--dracula-current-line);
+}
+section table thead th {
+ background: var(--dracula-current-line);
+ color: var(--dracula-yellow);
+}
+section table tbody > tr:nth-child(even) td,
+section table tbody > tr:nth-child(even) th {
+ background: var(--dracula-current-line);
+}
+
+header,
+footer,
+section::after {
+ box-sizing: border-box;
+ font-size: 66%;
+ height: 70px;
+ line-height: 50px;
+ overflow: hidden;
+ padding: 10px 25px;
+ position: absolute;
+ color: var(--dracula-comment);
+}
+
+header {
+ left: 0;
+ right: 0;
+ top: 0;
+}
+
+footer {
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+section::after {
+ right: 0;
+ bottom: 0;
+ font-size: 80%;
+}
diff --git a/06_react/.vscode/settings.json b/06_react/.vscode/settings.json
new file mode 100644
index 0000000..5035cdb
--- /dev/null
+++ b/06_react/.vscode/settings.json
@@ -0,0 +1,33 @@
+{
+ "terminal.explorerKind": "external",
+ "terminal.external.osxExec": "iTerm.app",
+ "terminal.external.windowsExec": "wt.exe",
+ "workbench.iconTheme": "vscode-icons",
+ "workbench.colorTheme": "One Dark Pro",
+ "prettier.printWidth": 120,
+ "prettier.singleQuote": true,
+ "editor.hover.enabled": "on",
+ "editor.wordWrap": "on",
+ "explorer.confirmDelete": false,
+ "explorer.confirmDragAndDrop": false,
+ "editor.quickSuggestionsDelay": 600,
+ "editor.tabSize": 2,
+ "editor.formatOnSave": true,
+ "emmet.includeLanguages": {
+ "javascript": "javascriptreact",
+ "ejs": "html"
+ },
+ "html.format.unformatted": "wbr,%",
+ "files.associations": {
+ "*.ejs": "html"
+ },
+ "editor.fontFamily": "'MesloLGS NF', Hack, Consolas, 'Courier New', monospace",
+ "oneDarkPro.markdownStyle": false,
+ "explorer.compactFolders": false,
+ "workbench.editor.labelFormat": "short",
+ "editor.hover.delay": 800,
+ "editor.bracketPairColorization.enabled": true,
+ "editor.guides.bracketPairs": "active",
+ "markdown.marp.themes": ["./.vscode/marp-theme.css"],
+ "markdown-preview-github-styles.colorTheme": "light"
+}
diff --git a/06_react/.vscode/snippets.code-snippets b/06_react/.vscode/snippets.code-snippets
new file mode 100644
index 0000000..259f93d
--- /dev/null
+++ b/06_react/.vscode/snippets.code-snippets
@@ -0,0 +1,73 @@
+{
+ "Output HTML Element": {
+ "scope": "html",
+ "prefix": "output",
+ "body": ["
"],
+ "description": "generate a div Element with output alert and alert secondary class"
+ },
+ "Bootstrap html": {
+ "scope": "html",
+ "prefix": "!bs",
+ "body": [
+ "",
+ "",
+ "\t",
+ "\t\t",
+ "\t\t",
+ "\t\t$0",
+ "\t\t",
+ "\t",
+ "\t",
+ "\t\t",
+ "\t\t\t",
+ "\t\t\t\t
$0
",
+ "\t\t\t",
+ "\t\t",
+ "\t\t",
+ "\t",
+ ""
+ ],
+ "description": "Generate HTML with Bootstrap CDN and script-tag"
+ },
+ "$ und $$ helper function": {
+ "scope": "javascript,typescript",
+ "prefix": "$$$",
+ "body": [
+ "const $ = (qs) => document.querySelector(qs);",
+ "const $$ = (qs) => Array.from(document.querySelectorAll(qs));"
+ ],
+ "description": "$ and $$ shorthand helper function"
+ },
+
+ "JavaScript Dateivorlage": {
+ "scope": "javascript,typescript",
+ "prefix": "vjs",
+ "body": [
+ "'use strict';",
+ "",
+ "(() => {",
+ "",
+ "\t// === DOM & VARS =======",
+ "\tconst DOM = {};",
+ "",
+ "\t// === INIT =============",
+ "\tconst init = () => {",
+ "",
+ "\t}",
+ "",
+ "\t// === EVENTHANDLER =====",
+ "",
+ "\t// === XHR/FETCH ========",
+ "",
+ "\t// === FUNCTIONS ========",
+ "",
+ "\tinit();",
+ "",
+ "})();"
+ ],
+ "description": "JavaScript Dateivorlage"
+ }
+}
diff --git a/06_react/agenda.md b/06_react/agenda.md
new file mode 100644
index 0000000..3afe23c
--- /dev/null
+++ b/06_react/agenda.md
@@ -0,0 +1,588 @@
+---
+marp: true
+theme: default
+---
+
+## JavaScript Grundlagen Teil 1.
+
+---
+
+#### Tag 01
+
+**Inhalt:**
+
+- Vorstellungsrunde
+- Einrichtung der IDE
+- Tools für die Webentwicklung (Emmet, Markdown, VS-Code, Co-Pilot)
+- Arbeiten mit VSCode
+- Konsolenausgaben mit `console.log()`
+
+**Übungen:**
+
+- Übungen: 1 - 3, Content Factory
+
+---
+
+#### Tag 02
+
+**Inhalt:**
+
+- Dialogfenster in JS `prompt()`, `alert()`, `confirm()`
+- Kommentare in JS
+- Rechnen in JS
+- Datentyp String, Number, Boolean
+- literal und typeof
+- Prioritätsreihenfolge
+
+**Übungen:**
+
+Übung 3 - 6 (Content-Factory bis 1.3.3)
+
+---
+
+#### Tag 03
+
+**Inhalt:**
+
+- Variablen und Konstanten in JS
+- Zusammengesetzte Zuweisungsoperatoren
+- Increment & Decrement
+- Strings verketten mit +
+- Escape-Notation
+- Implizite und explizite Typkonvertierung
+
+**Übungen:**
+
+Übung 7 - 12
+
+---
+
+#### Tag 04
+
+**Inhalt:**
+
+- Escape-Notation
+- Implizite und explizite Typkonvertierung
+- NaN - Paradoxon
+- Math Object
+- Number.toFixed()
+- isNaN
+- Lexikographische Vergleiche
+
+**Übungen:**
+
+Übung 14 - 18
+
+---
+
+#### Tag 05
+
+**Inhalt:**
+
+- Repetition der Inhalte
+- Relationale Operatoren & Vergleichoperatoren
+- **Exkurs: Webseitenstruktur + SASS HTML-Formularfelder**
+- 1:1 Meeting
+
+**Übungen:**
+
+Übung Kontaktformular mit HTML und BS,
+Lektion 10 erarbeiten
+
+---
+
+#### Tag 06
+
+**Inhalt:**
+
+- **Exkurs: HTML Formularfelder mit BS**
+- if else Verzweigung und ternärer Operator
+
+**Übungen:**
+
+Übung 19 - 21 + Kontaktformular
+
+---
+
+#### Tag 07
+
+**Inhalt:**
+
+- logische Operatoren UND und ODER
+- unärer Operator (!)
+- String Methoden
+- Funktionen in JS + mit Übergabeparameter + mit Rückgabewerten
+
+**Übungen:**
+
+Übung 22 - 31
+
+---
+
+#### Tag 08
+
+**Inhalt:**
+
+- Funktionen mit Rückgabewerten
+- Guards, Restparameter, Defaulparameter
+- Array Part 1
+
+**Übungen:**
+
+Übung 32 - 38
+
+---
+
+#### Tag 09
+
+**Inhalt:**
+
+- Array Methoden toSorted, toReversed, toSpliced
+- toSorted, toReversed
+- Array sort mit "compare function"
+- Array: Higher Order Funktionen Part (sort map, forEach, reduce, some, every)
+
+**Übungen:**
+
+Übung 39 - 45 + optionale Übung
+
+---
+
+#### Tag 10
+
+**Inhalt:**
+
+- Array.find und Array.findIndex
+- Alle Array Higher Order Funktionen im Überblick
+- local scoping
+- Git SCM und Windows Terminal einrichten
+
+**Übungen:**
+
+Übung 46 - 48
+
+---
+
+## JavaScript für Fortgeschrittene
+
+---
+
+#### Tag 11
+
+**Inhalt:**
+
+- **Exkurs: Schleifen**
+- Einführung in JS für Fortgeschrittene
+- Objekte in JS
+
+**Übungen:**
+
+Projektarbeit
+Abschlussquiz - JS Grundlagen
+
+---
+
+#### Tag 12
+
+**Inhalt:**
+
+- Destructuring von Objekten und Arrays
+- Rekursion
+
+**Übungen:**
+
+Übung 01 - 09
+
+---
+
+#### Tag 13
+
+**Inhalt:**
+
+- Promises
+- Callback-Hell
+- Promise Aufbau
+- Promise in Funktionen
+- File System von Node
+- commonjs vs esm
+
+**Übungen:**
+
+Übung 10 - 11
+
+---
+
+#### Tag 14
+
+**Inhalt:**
+
+- util promisify
+- Promise.all()
+- async await
+- Mehrdimensionale Arrays
+- Chess-Beispiel
+
+**Übungen:**
+
+Übung 12 - 19
+
+---
+
+#### Tag 15
+
+**Inhalt:**
+
+- Wiederholung der Inhalte
+- Arbeiten mit Fetch API
+- **Exkurs: Switch Case Abfragen**
+- **Exkurs: Statische Webseite mit Sass und HTML**
+- **Exkurs: Versionierung mit Github Part (SSH)**
+- 1:1 Meeting
+
+**Übungen:**
+
+Übung 20 - 24
+
+---
+
+#### Tag 15
+
+**Inhalt:**
+
+- Wiederholung der Inhalte
+- Promise.all()
+- **Exkurs: Switch Case Abfragen**
+- **Exkurs: Statische Webseite mit Sass und HTML**
+- 1:1 Meeting
+
+**Übungen:**
+
+Übung 20 - 24
+
+
+---
+
+#### Tag 16
+
+**Inhalt:**
+
+- **Exkurs: Statische Webseite mit Sass und HTML Part II**
+- Node Module: HTTP-Server, npm-run-all und SVGO
+
+**Übungen:**
+
+Projektarbeit + Wetter API Key besorgen
+
+---
+
+#### Tag 17
+
+**Inhalt:**
+
+- XML-HttpRequest und AJAX mit jQuery
+- Node Module für die Projekt-Entwicklungsumgebung
+- Wetter API auslesen
+- fetch in der Praxis: Joke API auslesen
+- Was ist Node.js? (Wiederholung)
+
+**Übungen:**
+
+Projektarbeit
+Übungen Public API auslesen
+
+---
+
+#### Tag 18
+
+**Inhalt:**
+
+- Node Standardbib (fs, zlib (stream), Crypto)
+- Import vs. require (Teil II)
+- NPM Befehle
+- Abschluss von JS für Fortgeschrittene
+- Projektvorstellung 1 + 2 JS Advanced
+
+
+**Übungen:**
+
+Übungen 25 - 31
+
+---
+
+# JavaScript und das Document Object Model (DOM)
+
+---
+
+
+#### Tag 19
+
+- Einführung in JS DOM
+- DOM Selection (querySelector, querySelectorAll, $ & $$ Helper)
+- CSS Selektoren
+- Typ-, Attribut-, Kombinator- und Pseudoklassen - Selektoren
+
+
+**Übungen:**
+
+Übungen 01 - 05
+
+---
+
+#### Tag 20
+
+**Inhalt:**
+
+- Chat Gestaltung (DOMTokenList Objekt)
+- Defer & Async
+- JS Dateien auslagern
+- Optimierung von Projektstruktur
+- **Exkurs: Projektstruktur mit Gulp**
+
+**Übungen:**
+
+Übung 06 - 07
+
+---
+
+#### Tag 21
+
+**Inhalt:**
+
+- **Exkurs: Projektstruktur mit Gulp Part II**
+- Events in JS MouseEvent, KeyboardEvent
+- Projekt: Newsboard
+
+
+**Übungen:**
+
+Übung 08 - 9
+
+---
+
+#### Tag 22
+
+**Inhalt:**
+
+- HTML Element Progress
+- IDL-Attribut vs. Content-Attribut
+- HTML Attribute mit boolescher Zuweisung
+- Tooltip: HTML erweitern mit Data-Attribut
+- Dataset Attribut, DOMStringMap Objekt
+- getComputedStyle, Attribute mit boolscher Zuweisung
+
+**Übungen:**
+
+Übung 10 - 14
+
+---
+
+#### Tag 23
+
+**Inhalt:**
+
+- DOM Creation - Elemente erstellen
+- createElement() & appendChild()
+- Projekt: Produktmanager Part I
+- DOM Creation Befehle
+- Entfernen von Elementen
+
+**Übungen:**
+
+Übung 15 - 17
+**Projektarbeit / Content Factory**
+
+---
+
+#### Tag 24
+
+**Inhalt:**
+
+- Import von Modulen in JS (Browserseitig)
+- Separation of Concerns
+- Projekt: Produktmanager final
+- DOM Traversal Befehle & alle DOM Bereiche
+- insertBefore(), appendChild(), append(), prepend(), before(), after()
+- Refactoring von Produktmanager mit Template
+- JS DOM Projektvorstellung
+
+**Übungen:**
+
+Übung 18 + optionale Übungen
+**Projektarbeit / Content Factory**
+
+---
+
+#### Tag 25
+
+**Inhalt:**
+
+- **Exkurs: Weitere Events: Drag and Drop**
+- **Rest API erstellen mit Express**
+- **Exkurs: DOM Inhalte über REST API mit Express Part I**
+- CRUD - Create - (Read) - Update - Delete
+- **Routing in JS**
+- Abschlussquiz JS DOM
+- **1:1 Meeting**
+
+**Übungen:**
+
+Projekte
+
+---
+
+## BROWSER API
+
+---
+
+#### Tag 26
+
+**Inhalt:**
+
+- **Exkurs: DOM Inhalte mit REST API Express**
+- **Erweiterung Frontend um REST API**
+- CRUD - (Create - Read) - Update - Delete
+- BREAD - Browse - Read - Edit - Add - Delete
+- Verwendung von Modulen (Modal von BS, Toastify, Splide)
+
+**Übungen**
+
+Projekte & optionale Übungen
+
+---
+
+#### Tag 27
+
+- **Exkurs: Gulp Build Prozess**
+- **SASS 7 on 1 mit Bootstrap 6**
+- **Projektfinalisierung Express + REST API**
+- Einführung in Typescript
+
+
+---
+
+### Tag 28
+
+**Inhalt:**
+
+- Typescript Grundlagen
+- Typescript Annotationen
+- Typescript "more Types"
+
+**Übungen:**
+
+Übungen 1 - 5
+
+---
+
+### Tag 29
+
+**Inhalt:**
+
+- Typescript Annotationen
+- Primitive Types, Object, Union Types
+- type statement vs interface
+- Type Assertion with as and <>
+- Typescript "more Types"
+- Interface, as statement
+
+**Übungen:**
+
+Übungen 4 - 9
+
+---
+
+### Tag 30
+
+**Inhalt:**
+
+- Typescript literale
+- Projektvorstellung
+- **Exkurs: Vite vs Gulp**
+- **Produktmanager Refactoring mit Bootstrap 6**
+
+**Übungen:**
+
+Übungen 10 - 11
+Projekt 1: TaskManager
+
+---
+
+### Tag 31
+
+**Inhalt:**
+
+- Narrowing with Guards
+ - truthiness, equality, in-operator, type-predicate
+- TS Funktionen und Objekte
+
+**Übungen:**
+
+Übungen 12 - 21
+
+---
+
+### Tag 32
+
+**Inhalt:**
+
+- TS Funktionen und Objekte Part II
+- Vorstellung Projekt 2
+- Abschluss TypeScript Grundlagen
+
+**Übungen:**
+
+Übungen 22 - 31
+Projektarbeit
+
+---
+
+# Einführung in React
+
+---
+
+
+### Tag 33
+
+**Inhalt:**
+
+- Einführung in REACT
+- VDOM von REACT
+- ES6 Module mit ohne Bundler
+- Build Tools im Vergleich & Einführung in Vite
+
+**Übungen:**
+
+Übung 01 - 03
+
+---
+
+### Tag 34
+
+**Inhalt:**
+
+- Build Tools im Vergleich & Einführung in Vite
+- Beispiele der Gestaltungsmöglichkeiten in Frameworks
+- Layout & wiederverwendbare Komponenten
+- EventHandler in React
+
+**Übungen:**
+
+Übung 04 - 07
+
+---
+
+### Tag 35
+
+**Inhalt:**
+
+- Layout & wiederverwendbare Komponenten Part II
+- EventHandler in React `onSubmit`, `onChange`, `onClick`
+- Hooks in React.
+- **Optimierung vom ProduktManager über KI**
+- **ProduktManager wird in TS migriert**
+- 1:1 Meeting
+
+
+**Übungen:**
+
+Übung 08 - 11
diff --git a/05_typescript/linksammlung.md b/06_react/linksammlung.md
similarity index 100%
rename from 05_typescript/linksammlung.md
rename to 06_react/linksammlung.md