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.
176 lines
3.2 KiB
CSS
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);
|
|
}
|
|
}
|