From 42356cfd3151b43fe41ef545d345732debed6f4a Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Tue, 13 Oct 2026 13:47:13 +0200 Subject: [PATCH] --- .../o02_website-with-plugins/README.md | 4 +- .../o02_website-with-plugins/README.pdf | Bin 110662 -> 110111 bytes 05_typescript/.vscode/extensions.json | 15 + 05_typescript/.vscode/marp-theme.css | 332 ++++++++++++ 05_typescript/.vscode/settings.json | 33 ++ 05_typescript/.vscode/snippets.code-snippets | 73 +++ 05_typescript/agenda.md | 505 ++++++++++++++++++ .../linksammlung.md | 0 8 files changed, 960 insertions(+), 2 deletions(-) create mode 100644 05_typescript/.vscode/extensions.json create mode 100644 05_typescript/.vscode/marp-theme.css create mode 100644 05_typescript/.vscode/settings.json create mode 100644 05_typescript/.vscode/snippets.code-snippets create mode 100644 05_typescript/agenda.md rename {04_browser-api => 05_typescript}/linksammlung.md (100%) diff --git a/04_browser-api/uebungen/o02_website-with-plugins/README.md b/04_browser-api/uebungen/o02_website-with-plugins/README.md index 6b78232..9caf630 100644 --- a/04_browser-api/uebungen/o02_website-with-plugins/README.md +++ b/04_browser-api/uebungen/o02_website-with-plugins/README.md @@ -2,8 +2,8 @@ ## 1. Optimierung vom ProduktManager -- 1. Positionen sollen an die API gesendet werden und gespeichert werden. -- 2. Refactoring vom Modul +1. Positionen sollen an die API gesendet werden und gespeichert werden. +2. Refactoring vom Modul: - Optimierung der Übergabeparameter: Element oder Selector (CSS Selektion als String) kann übergeben werden. Tipp: `module instanceof HTMLElement` - Die Wiederholungen der Fetch Anfragen in eine `api.request` Methode zusammenfassen diff --git a/04_browser-api/uebungen/o02_website-with-plugins/README.pdf b/04_browser-api/uebungen/o02_website-with-plugins/README.pdf index fdc8bf8b51341998716a88b67493494ba5356956..15e9d7d7d9443e3044a2a6b69069001eae5e0788 100644 GIT binary patch delta 22991 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 delta 23316 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 Y=|ZH=7C|!H;3F3_*ZTD))}~zl1AZ5>lmGw# diff --git a/05_typescript/.vscode/extensions.json b/05_typescript/.vscode/extensions.json new file mode 100644 index 0000000..bb659e6 --- /dev/null +++ b/05_typescript/.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/05_typescript/.vscode/marp-theme.css b/05_typescript/.vscode/marp-theme.css new file mode 100644 index 0000000..90ea8da --- /dev/null +++ b/05_typescript/.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/05_typescript/.vscode/settings.json b/05_typescript/.vscode/settings.json new file mode 100644 index 0000000..5035cdb --- /dev/null +++ b/05_typescript/.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/05_typescript/.vscode/snippets.code-snippets b/05_typescript/.vscode/snippets.code-snippets new file mode 100644 index 0000000..259f93d --- /dev/null +++ b/05_typescript/.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/05_typescript/agenda.md b/05_typescript/agenda.md new file mode 100644 index 0000000..fab089e --- /dev/null +++ b/05_typescript/agenda.md @@ -0,0 +1,505 @@ +--- +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: Vite vs Gulp** +- **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" + +**Übungen:** + +Übungen 4 - 9 + +--- + +### Tag 30 + +**Inhalt:** + +- Typescript "more Types" + - Interface, as statement, literale +- Typescript Narrowing with Guards + - truthiness, equality, in-operator, type-predicate +- TS Funktionen und Objekte + +**Übungen:** + +Übungen 10 - 19 diff --git a/04_browser-api/linksammlung.md b/05_typescript/linksammlung.md similarity index 100% rename from 04_browser-api/linksammlung.md rename to 05_typescript/linksammlung.md