This commit is contained in:
Philippe Torrel
2026-09-15 09:42:21 +02:00
parent beb3c1bda2
commit ee8cc31e77
22 changed files with 546 additions and 70 deletions
+299 -64
View File
@@ -1,11 +1,15 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Übung optional 01: Kontaktformular</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<main>
<div class="container py-5">
@@ -19,79 +23,310 @@
Eingabefeldern (for und id).
</p>
</div>
<div class="container py-5">
<h1>Kontakt</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Amet, iste?</p>
<form class="form-contact">
<div class="row">
<!-- .col>.mb-3>label.form-label -->
<div class="col-12 col-md-6">
<div class="mb-3">
<label for="input-firstname" class="form-label">First name:</label>
<input
type="text"
name="firstname"
id="input-firstname"
class="form-control input-firstname"
required />
</div>
</div>
<!-- ▲ /col ▲ -->
<!-- .col>.mb-3>label.form-label -->
<div class="col-12 col-md-6">
<div class="mb-3">
<label for="input-lastname" class="form-label">Last name:</label>
<input type="text" name="lastname" id="input-lastname" class="form-control input-lastname" required />
</div>
</div>
<!-- ▲ /col ▲ -->
</div>
<!-- .row>.col>.mb-3>label.form-label+input:email.form-control -->
<div class="row">
<div class="col">
<div class="mb-3">
<label for="input-email" class="form-label">E-mail</label>
<input type="email" name="email" id="input-email" class="form-control input-email" required />
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="mb-3">
<label for="input-subject" class="form-label">Subject</label>
<input type="text" name="subject" id="input-subject" class="form-control input-subject" />
</div>
</div>
</div>
<!-- .row>.col>.mb-3>label.form-label+textarea.form-control -->
<div class="row">
<div class="col">
<div class="mb-3">
<label for="textarea-message" class="form-label">Message</label>
<textarea
name="message"
id="textarea-message"
cols="12"
rows="8"
class="form-control textarea-message"></textarea>
</div>
<h1>Kontakt</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Amet, iste?</p>
<form class="form-contact">
<!-- Anrede -->
<fieldset class="mb-3">
<legend class="form-label">Anrede</legend>
<div class="form-check form-check-inline">
<input type="radio" class="form-check-input" name="gender" id="input-radio-f" value="f" required />
<label for="input-radio-f" class="form-check-label">Frau</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" class="form-check-input" name="gender" id="input-radio-m" value="m" required />
<label for="input-radio-m" class="form-check-label">Herr</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" class="form-check-input" name="gender" id="input-radio-d" value="d" required />
<label for="input-radio-d" class="form-check-label">Divers</label>
</div>
</fieldset>
<!-- Vorname / Nachname -->
<div class="row">
<div class="col-12 col-md-6">
<div class="mb-3">
<label for="input-firstname" class="form-label">Vorname</label>
<input
type="text"
name="firstname"
id="input-firstname"
class="form-control"
autocomplete="given-name"
required />
</div>
</div>
<!-- .row>.col>.mb-3>button:submit.btn.btn-dark.button-submit -->
<div class="row">
<div class="col">
<div class="mb-3">
<button type="submit" class="btn btn-dark button-submit">Send</button>
</div>
<div class="col-12 col-md-6">
<div class="mb-3">
<label for="input-lastname" class="form-label">Nachname</label>
<input
type="text"
name="lastname"
id="input-lastname"
class="form-control"
autocomplete="family-name"
required />
</div>
</div>
</form>
</div>
</div>
<!-- Adresse -->
<div class="row">
<div class="col-12 col-md-8">
<div class="mb-3">
<label for="input-street" class="form-label">Straße</label>
<input
type="text"
name="street"
id="input-street"
class="form-control"
placeholder="Musterstraße"
autocomplete="address-line1"
required />
</div>
</div>
<div class="col-12 col-md-4">
<div class="mb-3">
<label for="input-house-number" class="form-label">Hausnummer</label>
<input
type="text"
name="house-number"
id="input-house-number"
class="form-control"
placeholder="12a"
required />
</div>
</div>
</div>
<!-- PLZ / Stadt -->
<div class="row">
<div class="col-12 col-md-4">
<div class="mb-3">
<label for="input-zip" class="form-label">Postleitzahl</label>
<input
type="text"
name="zip"
id="input-zip"
class="form-control"
placeholder="12345"
autocomplete="postal-code"
required />
</div>
</div>
<div class="col-12 col-md-8">
<div class="mb-3">
<label for="input-city" class="form-label">Ort</label>
<input
type="text"
name="city"
id="input-city"
class="form-control"
placeholder="Musterstadt"
autocomplete="address-level2"
required />
</div>
</div>
</div>
<!-- Land / Bundesland / Kanton -->
<div class="row">
<div class="col-12 col-md-6">
<div class="mb-3">
<label for="select-country" class="form-label">Land</label>
<select name="country" id="select-country" class="form-select" autocomplete="country" required>
<option value="" selected disabled>Bitte Land auswählen</option>
<option value="de">Deutschland</option>
<option value="at">Österreich</option>
<option value="ch">Schweiz</option>
</select>
</div>
</div>
<div class="col-12 col-md-6">
<div class="mb-3">
<label for="select-state" id="label-state" class="form-label">Bundesland / Kanton</label>
<select name="state" id="select-state" class="form-select" disabled required>
<option value="" selected disabled>Bitte zuerst ein Land auswählen</option>
</select>
</div>
</div>
</div>
<!-- E-Mail -->
<div class="row">
<div class="col-12">
<div class="mb-3">
<label for="input-email" class="form-label">E-Mail</label>
<input type="email" name="email" id="input-email" class="form-control" autocomplete="email" required />
</div>
</div>
</div>
<!-- Betreff -->
<div class="row">
<div class="col-12">
<div class="mb-3">
<label for="input-subject" class="form-label">Betreff</label>
<input type="text" name="subject" id="input-subject" class="form-control" />
</div>
</div>
</div>
<!-- Nachricht -->
<div class="row">
<div class="col-12">
<div class="mb-3">
<label for="textarea-message" class="form-label">Nachricht</label>
<textarea name="message" id="textarea-message" rows="8" class="form-control"></textarea>
</div>
</div>
</div>
<!-- Button -->
<div class="row">
<div class="col-12">
<button type="submit" class="btn btn-dark">Senden</button>
</div>
</div>
</form>
</div>
</main>
<script>
'use strict';
const countryEl = document.querySelector('#select-country');
const stateEl = document.querySelector('#select-state');
const stateLabelEl = document.querySelector('#label-state');
const germany = [
'Baden-Württemberg',
'Bayern',
'Berlin',
'Brandenburg',
'Bremen',
'Hamburg',
'Hessen',
'Mecklenburg-Vorpommern',
'Niedersachsen',
'Nordrhein-Westfalen',
'Rheinland-Pfalz',
'Saarland',
'Sachsen',
'Sachsen-Anhalt',
'Schleswig-Holstein',
'Thüringen',
];
const austria = [
'Burgenland',
'Kärnten',
'Niederösterreich',
'Oberösterreich',
'Salzburg',
'Steiermark',
'Tirol',
'Vorarlberg',
'Wien',
];
const switzerland = [
'Aargau',
'Appenzell Ausserrhoden',
'Appenzell Innerrhoden',
'Basel-Landschaft',
'Basel-Stadt',
'Bern',
'Freiburg',
'Genf',
'Glarus',
'Graubünden',
'Jura',
'Luzern',
'Neuenburg',
'Nidwalden',
'Obwalden',
'Schaffhausen',
'Schwyz',
'Solothurn',
'St. Gallen',
'Tessin',
'Thurgau',
'Uri',
'Waadt',
'Wallis',
'Zug',
'Zürich',
];
countryEl.addEventListener('change', () => {
const country = countryEl.value;
let regions;
stateEl.innerHTML = '';
stateEl.disabled = false;
if (country === 'de') {
regions = germany;
stateLabelEl.textContent = 'Bundesland';
} else if (country === 'at') {
regions = austria;
stateLabelEl.textContent = 'Bundesland';
} else if (country === 'ch') {
regions = switzerland;
stateLabelEl.textContent = 'Kanton';
}
const firstOption = document.createElement('option');
firstOption.textContent = 'Bitte auswählen';
firstOption.value = '';
firstOption.disabled = true;
firstOption.selected = true;
stateEl.appendChild(firstOption);
regions.forEach((region) => {
const option = document.createElement('option');
option.textContent = region;
option.value = region;
stateEl.appendChild(option);
});
});
</script>
</body>
</html>
@@ -23,11 +23,11 @@
// let taxRate;
// if (productCategory === 'books') {
// taxRate = 1.07;
// } else {
// taxRate = 1.19;
// }
// if (productCategory === 'books') {
// taxRate = 1.07;
// } else {
// taxRate = 1.19;
// }
// Ternärer Operator
const taxRate = (productCategory === 'books') ? 1.07 : 1.19; // prettier-ignore
@@ -11943,6 +11943,118 @@ textarea.form-control-lg {
font-weight: 900;
src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 200;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 200;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 300;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 300;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 400;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 400;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 500;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 500;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 600;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 600;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 700;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 700;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 800;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 800;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: normal;
font-weight: 900;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "Source Sans 3";
font-style: italic;
font-weight: 900;
src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2") format("woff2");
}
/* Color Theme Swatches in Hex */
*,
html {
File diff suppressed because one or more lines are too long
@@ -1 +1,2 @@
@import 'playfair-display-v40-latin';
@import 'source-sans-3-v19-latin';
@@ -0,0 +1,128 @@
// source-sans-3-200 - latin
@font-face {
font-display: swap;
font-family: 'Source Sans 3';
font-style: normal;
font-weight: 200;
src: url('../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('../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('../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('../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('../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('../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('../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('../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('../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('../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('../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('../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('../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('../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('../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('../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2') format('woff2');
}