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": "Lap"
},
"pictureFrame": {
"name": "Picture frame",
"description": "Upload or link images as a slideshow",
"empty": "No images yet — add some in the settings",
"unavailable": "Image not available",
"open": "Show image enlarged",
"close": "Close enlarged view",
"fitLabel": "Image fit",
"fitContain": "Fully visible",
"fitCover": "Fill the frame",
"intervalLabel": "Change interval",
"intervalOff": "No change",
"intervalSeconds": "{n} seconds",
"intervalMinutes": "{n} minutes",
"orderLabel": "Image order",
"orderSequence": "In order",
"orderRandom": "Random",
"imagesLabel": "Images",
"captionPlaceholder": "Caption (optional)",
"uploadButton": "Upload image",
"uploadHint": "PNG, JPEG, GIF or WebP, at most 5 MB, up to 30 images",
"urlPlaceholder": "https://…",
"urlAddButton": "Add web address",
"urlInvalid": "Please enter a complete https address.",
"removeButton": "Remove image",
"moveUpButton": "Move up",
"moveDownButton": "Move down",
"limitReached": "The maximum of 30 images has been reached.",
"uploadFailed": "The image could not be uploaded."
}
},
"admin": {