Files
eventmap/css/form.css
dapelza 10f9170d61 Phase 3: Formular zum Anlegen und Bearbeiten
Neues Modal (js/ui/form.js) mit allen Feldern aus anforderung.md
Abschnitt 6: Name, Kategorie, Kurz-/Volltext-Beschreibung, Adresse, Ort,
Koordinaten, Altersgruppe, Kosten, Oeffnungszeiten, Aufenthaltsdauer,
Ausstattungs-Checkboxen, Indoor/Outdoor, Bild-URL, Website, Tags.

Validierung: Pflichtfelder (Name, Kategorie, Koordinaten), Koordinaten-
Bereichspruefung, Alter min<=max, Bild-/Website-URL nur http/https.
Fehler erscheinen inline je Feld (aria-invalid/aria-describedby), erstes
fehlerhaftes Feld wird fokussiert.

EventMap.ui.openPlaceForm(place) dient als Einstiegspunkt: ohne Argument
zum Neuanlegen, mit Place-Objekt zum Bearbeiten. Speichern aktualisiert
den Store mit neuer Array-Referenz (Karte/Liste reagieren automatisch)
und persistiert nach LocalStorage.

Verdrahtung: neuer "+ Neues Ausflugsziel hinzufuegen"-Button in der
Karten-Toolbar; der bisherige Bearbeiten-Platzhalter in der
Detailansicht (js/ui/detail.js) oeffnet jetzt das Formular vorausgefuellt
mit dem aktuell angezeigten Ausflugsziel.
2026-07-24 11:43:01 +02:00

176 lines
3.2 KiB
CSS

/* Formular-Modal zum Anlegen/Bearbeiten eines Ausflugsziels (Phase 3):
Vollbild auf Mobile, zentriertes Panel ab 1024px (siehe Breakpoint in
css/responsive.css). Struktur wird von js/ui/form.js in
#place-form-modal eingehängt. Grundgerüst analog zu css/detail.css. */
.place-form-modal {
position: fixed;
inset: 0;
z-index: 2100;
}
.place-form-modal[hidden] {
display: none;
}
.place-form-modal__backdrop {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.55);
}
.place-form-modal__panel {
position: relative;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
background: var(--color-surface);
overflow-y: auto;
}
.place-form-modal__close {
position: absolute;
top: var(--space-sm);
right: var(--space-sm);
z-index: 1;
width: 36px;
height: 36px;
border: none;
border-radius: 50%;
background: rgba(0, 0, 0, 0.55);
color: #fff;
font-size: 1rem;
line-height: 1;
cursor: pointer;
}
.place-form__title {
padding: var(--space-lg) var(--space-lg) 0;
font-size: 1.3rem;
font-weight: 700;
}
.place-form {
padding: var(--space-md) var(--space-lg) var(--space-lg);
display: flex;
flex-direction: column;
gap: var(--space-lg);
}
.place-form__section {
display: flex;
flex-direction: column;
gap: var(--space-md);
border: none;
border-top: 1px solid var(--color-border);
padding: var(--space-md) 0 0;
margin: 0;
}
.place-form__section:first-of-type {
border-top: none;
padding-top: 0;
}
.place-form__section-label {
padding: 0;
font-size: 0.85rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.02em;
color: var(--color-text-muted);
}
.place-form__row {
display: flex;
flex-wrap: wrap;
gap: var(--space-md);
}
.place-form__row .form-field {
flex: 1 1 160px;
}
.form-field {
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.form-field__label {
font-size: 0.85rem;
font-weight: 600;
}
.form-field__required {
color: var(--color-danger);
}
.form-field input,
.form-field select,
.form-field textarea {
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
padding: var(--space-sm);
font: inherit;
background: var(--color-surface);
color: var(--color-text);
width: 100%;
}
.form-field textarea {
resize: vertical;
min-height: 80px;
}
.form-field input[aria-invalid='true'],
.form-field select[aria-invalid='true'],
.form-field textarea[aria-invalid='true'] {
border-color: var(--color-danger);
}
.form-field__error {
color: var(--color-danger);
font-size: 0.8rem;
}
.form-field__error[hidden] {
display: none;
}
.place-form__checkbox-group {
display: flex;
flex-wrap: wrap;
gap: var(--space-md);
}
.form-checkbox {
display: flex;
align-items: center;
gap: var(--space-xs);
font-size: 0.9rem;
cursor: pointer;
}
.place-form__actions {
display: flex;
flex-wrap: wrap;
gap: var(--space-sm);
padding-top: var(--space-md);
border-top: 1px solid var(--color-border);
}
@media (min-width: 1024px) {
.place-form-modal__panel {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: min(720px, 90vw);
height: min(90vh, 960px);
border-radius: var(--radius-md);
box-shadow: var(--shadow-card);
}
}