enhancement
major
minor
major
minor
major
#29598
TL Views: image mit URL-/Ressourcen-Quelle, Seitenverhältnis, Füllmodus und überlagerten Inhalten; avatar mit Foto
Kontext
<image> zeigt ausschließlich BinaryData aus einem Kanal und hat keine Größenoptionen. Für Objektfotos in Karten und Detailansichten (Bild in festem Seitenverhältnis, beschnitten statt verzerrt, Abzeichen und Preis über dem Bild) reicht das nicht. Bildquellen sind in Anwendungen häufig URLs (externe Medienserver, CDN) oder statische Ressourcen der Webanwendung. <avatar> zeigt nur Initialen, kein Foto.
Erweiterung
<image> erhält:
- Quellen: neben BinaryData im Kanal auch einen String-Wert (URL) im Kanal sowie resource (Pfad einer statischen Ressource der Webanwendung);
- aspect-ratio (z. B. 4/3, 16/9), fit (cover, contain), width/`height`;
- lazy (verzögertes Laden außerhalb des sichtbaren Bereichs).
Inhalte über einem Bild (Abzeichen, Bildunterschrift) liefert ein neues generisches Container-Element <overlay>, das beliebige Inhalte übereinanderlegt; das Bild selbst bleibt ein Blatt-Element.
<avatar> erhält eine Bildquelle (Kanal mit BinaryData oder URL) und size; ohne Bild bleibt die Initialen-Darstellung.
Lösung
Bildquellen
Der Client sieht in jedem Fall nur eine URL: Für BinaryData ist das der Daten-Endpunkt des Controls (/react-api/data, mit Revisionsparameter), für einen String-Wert im Kanal die URL selbst, für resource der Ressourcenpfad hinter dem Kontextpfad der Anwendung. Der Unterschied liegt allein darin, wer die Bytes liefert: Eine externe URL lädt der Browser direkt (CDN-fähig), BinaryData streamt der Server. Das Bild wird als gewöhnliches <img src> mit loading="lazy" bei lazy="true" gerendert; der bisherige Blob-Download des Foto-Viewers entfällt.
Die Auflösung eines Kanalwerts (BinaryData mit Inhaltstyp image/* oder String-URL) in Client-Zustand ist ein gemeinsamer Baustein ImageSource in tl-layout-react, den Bild und Avatar teilen. Das Foto-Viewer-Control (ReactPhotoViewerControl/`TLPhotoViewer`, nur von <image> verwendet) heißt jetzt ReactImageControl/`TLImage` (CSS tlImage).
`<image>`
- input: Kanal mit BinaryData (image/*) oder String (URL); andere Werte zeigen nichts.
- resource: Pfad einer statischen Ressource der Webanwendung; allein die Bildquelle, zusammen mit input das Bild, solange der Kanal kein Bild enthält (Platzhalter).
- aspect-ratio (Breite/Höhe), fit (cover Standard, contain), width, height (CSS-Längen), lazy, css-class, alt.
Ohne Größenoption wird das Bild in natürlicher Größe angezeigt, begrenzt auf die verfügbare Breite (die frühere feste Obergrenze von 320px entfällt).
`<overlay>` und `<layer>`
<overlay> ist ein Container: Das erste Kind ist die Basis, jedes weitere Kind eine Ebene darüber. Die Basis gibt dem Overlay seine Höhe; die Breite bestimmt das umgebende Layout (eine relativ bemessene Basis füllt sie, eine Basis fester Breite braucht einen nicht dehnenden Container, z. B. <stack align="start">). Eine Ebene deckt die Basis ab, lässt Zeigerereignisse aber durch (pointer-events: none), sodass die Basis bedienbar bleibt; der Inhalt der Ebene empfängt Ereignisse. <layer position="…" css-class="…"> ist der optionale Wrapper einer Ebene mit Position (fill Standard, top-left, top, top-right, left, center, right, bottom-left, bottom, bottom-right); ein Kind ohne <layer> ist eine fill-Ebene. (Das Attribut heißt position, nicht anchor: anchor ist bereits der Tag des <anchor>-Elements und wäre im Kind-Container mehrdeutig.)
<overlay> <image input="photo" aspect-ratio="4/3" fit="cover" resource="/images/no-picture.svg"/> <layer position="top-left" css-class="estate-badge"><text label="…"/></layer> <layer position="bottom" css-class="estate-caption"><text input="price"/></layer> </overlay>
Position kommt aus dem Element, Aussehen (Pille, Verlauf) aus dem App-Stylesheet über die css-class der Ebene.
`<avatar>`
image: Kanal mit BinaryData oder URL; mit Bild wird das Foto kreisförmig beschnitten angezeigt, ohne Bild die Initialen. size: small, default, large, x-large.
Demo und Dokumentation
Seite „Bilder“ in tl-demo-react (demo/image-demo.view.xml: Foto eines gewählten Flow-Knotens mit Abzeichen und Bildunterschrift im <overlay>, Avatar mit Foto neben Avatar mit Initialen, cover neben contain, statische Ressource, eingegebene URL) sowie verzögert geladene Vorschaubilder in den Karten der Repeater-Demo (demo/repeater-card.view.xml). Abschnitt „Pictures“ in docs/faq/react-view-layer.md. Tests: TestImageElement, TestAvatarElement, TestOverlayElement in tl-layout-view.