feat(quick-260921-pi9): Bilderrahmen-Widget - Diashow mit Grossansicht, Bildverwaltung in den Einstellungen

- picture-frame-config.ts: Eintragstyp als Vereinigung (upload | url) in EINER
  geordneten Liste, resolvePictureFrameConfig laesst alles ausser https weg
  (T-PI9-07), Intervall 0 oder 5..3600 s, pickNextIndex (Zufall nie dasselbe)
- dashboard-images-api.ts: Upload als FormData-Feld image ohne eigenen
  Content-Type, 413 -> deutsche Meldung, Proxy-Pfad fuer <img src>
- PictureFrameWidget: Leerzustand, <img referrerPolicy=no-referrer> (Browser
  laedt Fremdbilder, Server nie), object-contain/cover, Unterschrift-Streifen,
  Wechsel per Timer mit Raeumung, kaputte Bilder verlassen den Umlauf,
  Grossansicht nur ausserhalb des Bearbeitungsmodus mit Fokus-Rueckgabe und
  Pause des Wechsels; im Bearbeitungsmodus kein Knopf (Karte bleibt Griff)
- PictureFrameConfigForm im WidgetSettingsPanel: Ausschnitt, Intervall,
  Reihenfolge, Liste mit Vorschau/Unterschrift/Pfeilen/Entfernen (Upload wird
  auch serverseitig geloescht), Datei hochladen, https-Adresse hinzufuegen
- Registry (4x4 min, 8x8 Vorgabe), Katalog, Seite, Uebersetzungen de/en
  (widgets.pictureFrame, 28 Schluessel), bestehende Tests auf acht Typen

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-21 18:56:02 +02:00
parent 737974b653
commit c080580459
18 changed files with 1688 additions and 4 deletions
+30
View File
@@ -333,6 +333,36 @@
"stop": "Stop",
"reset": "Reset",
"lap": "Runde"
},
"pictureFrame": {
"name": "Bilderrahmen",
"description": "Bilder hochladen oder verlinken, als Diashow",
"empty": "Noch keine Bilder — über die Einstellungen hinzufügen",
"unavailable": "Bild nicht verfügbar",
"open": "Bild groß anzeigen",
"close": "Großansicht schließen",
"fitLabel": "Bildausschnitt",
"fitContain": "Ganz sichtbar",
"fitCover": "Formatfüllend",
"intervalLabel": "Wechselintervall",
"intervalOff": "Kein Wechsel",
"intervalSeconds": "{n} Sekunden",
"intervalMinutes": "{n} Minuten",
"orderLabel": "Reihenfolge der Bilder",
"orderSequence": "Reihenfolge",
"orderRandom": "Zufall",
"imagesLabel": "Bilder",
"captionPlaceholder": "Bildunterschrift (optional)",
"uploadButton": "Bild hochladen",
"uploadHint": "PNG, JPEG, GIF oder WebP, höchstens 5 MB, bis zu 30 Bilder",
"urlPlaceholder": "https://…",
"urlAddButton": "Webadresse hinzufügen",
"urlInvalid": "Bitte geben Sie eine vollständige https-Adresse ein.",
"removeButton": "Bild entfernen",
"moveUpButton": "Nach oben",
"moveDownButton": "Nach unten",
"limitReached": "Die Höchstzahl von 30 Bildern ist erreicht.",
"uploadFailed": "Das Bild konnte nicht hochgeladen werden."
}
},
"admin": {