Média
Un composant présentant une version résumée d'une fiche, capable d'afficher sa miniature, son titre, son résumé et d'autres informations. Ce composant propose également un lien vers la fiche complète.
Classes du composant
Modificateurs de disposition
media--horizontal: Présentation avec la photo à gauche et les détails à droitemedia--vertical: Présentation avec la photo au-dessus et les détails en dessous
Note : ces deux classes peuvent être omises, notamment dans le cas où il n'y a pas de photo du tout.
Orientation
Horizontal

Titre du média
Sous-Titre du média
Une description plus longue de ce que représente le média
Vertical

Titre du média
Sous-Titre du média
Une description plus longue de ce que représente le média
Sans image
Titre du média
Sous-Titre du média
Une description plus longue de ce que représente le média
Sans sous-titre

Une description plus longue de ce que représente le média
Sans résumé

Titre du média
Sous-Titre du média
Avec contenu injecté
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="kuik" uri="kuik" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--@elvariable id="mediaViewModel" type="fr.kosmos.web.kore.attributes.DefaultMedia"--%>
<kuik:heading size="lg" skin="a" title="Orientation" level="3" />
<kuik:heading size="lg" skin="a" title="Horizontal" level="4" />
<div>
<kuik:media media="${mediaViewModel}" orientation="horizontal"/>
</div>
<kuik:heading size="lg" skin="a" title="Vertical" level="4" />
<div>
<kuik:media media="${mediaViewModel}" orientation="vertical"/>
</div>
<kuik:heading size="lg" skin="a" title="Sans image" level="3" />
<c:set var="backup" value="${mediaViewModel.image}"/>
<c:set target="${mediaViewModel}" property="image" value="${null}"/>
<div>
<kuik:media media="${mediaViewModel}" orientation="vertical"/>
</div>
<c:set target="${mediaViewModel}" property="image" value="${backup}"/>
<kuik:heading size="lg" skin="a" title="Sans sous-titre" level="3" />
<c:set var="backup" value="${mediaViewModel.subtitle}"/>
<c:set target="${mediaViewModel}" property="subtitle" value=""/>
<div>
<kuik:media media="${mediaViewModel}" orientation="vertical" imgClasses="u-media-cover u-rounded-xl u-ratio-1-1"/>
</div>
<c:set target="${mediaViewModel}" property="subtitle" value="${backup}"/>
<kuik:heading size="lg" skin="a" title="Sans résumé" level="3" />
<c:set var="backup" value="${mediaViewModel.summary}"/>
<c:set target="${mediaViewModel}" property="summary" value=""/>
<div>
<kuik:media media="${mediaViewModel}" orientation="vertical" imgClasses="u-media-contain u-rounded-xs"/>
</div>
<c:set target="${mediaViewModel}" property="summary" value="${backup}"/>
<kuik:heading size="lg" skin="a" title="Avec contenu injecté" level="3" />
<div>
<kuik:media media="${mediaViewModel}" orientation="vertical">
<kuik:media-image image="${mediaViewModel.image}" imgClasses="u-media-contain u-rounded-xs" />
<kuik:media-content>
<div class="media__content">
<div class="media__thematics">
<ul class="list list--inlined">
<li class="list__item"><kuik:cartouche class="u-valign-top" priority="primary" size="md">Actualité</kuik:cartouche></li>
<li class="list__item"><kuik:cartouche class="u-valign-top" priority="primary" size="md">Étudiant</kuik:cartouche></li>
</ul>
</div>
<a class="media__link" href="<c:out value="${pageScope.media.link}" />"><kuik:heading class="media__title" title="${pageScope.media.title}" level="3" /></a>
<p class="media__subtitle">${pageScope.media.subtitle}</p>
<kuik:date class="media__date" date="12 Décembre 2024"/>
<kuik:place>Nantes</kuik:place>
<p class="media__summary"><c:out value="${pageScope.media.summary}" escapeXml="false"/></p>
<p class="media__infos">Mis à jour le<time class="media__infos-value">17 Septembre 2024</time></p>
</div>
</kuik:media-content>
</kuik:media>
</div>
Container query
Horizontal
Cet exemple est demandé en horizontal mais si le parent est pas assez large on le met en vertical

Titre du média
Sous-Titre du média
Une description plus longue de ce que représente le média

Titre du média
Sous-Titre du média
Une description plus longue de ce que représente le média

Titre du média
Sous-Titre du média
Une description plus longue de ce que représente le média
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="kuik" uri="kuik" %>
<%@ taglib prefix="resources" uri="resources" %>
<%--@elvariable id="mediaViewModel" type="fr.kosmos.web.kore.attributes.DefaultMedia"--%>
<kuik:heading size="lg" skin="a" title="Container query" level="3"/>
<kuik:heading size="lg" skin="a" title="Horizontal" level="4"/>
<p>Cet exemple est demandé en horizontal mais si le parent est pas assez large on le met en vertical</p>
<div class="js-resizable-container">
Largeur du container : <output class="js-resizable-current"></output>
<div class="u-vspacer-sm"></div>
<kuik:media media="${mediaViewModel}" orientation="horizontal"/>
</div>
<div class="js-resizable-container">
Largeur du container : <output class="js-resizable-current"></output>
<div class="u-vspacer-sm"></div>
<kuik:media media="${mediaViewModel}" orientation="horizontal" imgClasses="u-media-cover u-rounded-xs"/>
</div>
<div class="js-resizable-container">
Largeur du container : <output class="js-resizable-current"></output>
<div class="u-vspacer-sm"></div>
<kuik:media media="${mediaViewModel}" orientation="horizontal" imgClasses="u-media-contain u-rounded-xl u-ratio-1-1"/>
</div>
<resources:addScript path="/static/js/resizable-container.js" type="module"/>
| Name | Type | Required | Description |
|---|---|---|---|
| media | fr.kosmos.web.kore.attributes.interfaces.Media | true | |
| orientation | fr.kosmos.web.kore.attributes.Orientation | false | Orientation du média |
| size | java.lang.String | false | Taille (défaut : sm) |
| imgClasses | java.lang.String | false | Classes appliquées au tag img (si présent) |
<%@ tag pageEncoding="UTF-8" trimDirectiveWhitespaces="true" dynamic-attributes="dynattrs" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="kuik" uri="kuik" %>
<%@ attribute name="media" required="true" type="fr.kosmos.web.kore.attributes.interfaces.Media" %>
<%@ attribute name="orientation" required="false" type="fr.kosmos.web.kore.attributes.Orientation" description="Orientation du média" %>
<%@ attribute name="size" required="false" type="java.lang.String" description="Taille (défaut : sm)" %>
<%@ attribute name="imgClasses" required="false" type="java.lang.String" description="Classes appliquées au tag img (si présent)" %>
<c:if test="${not empty pageScope.media}">
<c:if test="${empty pageScope.size}">
<c:set var="size" value="sm"/>
</c:if>
<c:set var="classesSize" value="media--${pageScope.size}"/>
<c:if test="${empty pageScope.orientation}">
<c:set var="orientation" value="horizontal"/>
</c:if>
<c:if test="${empty pageScope.media.image}">
<c:set var="orientation" value="vertical"/>
</c:if>
<c:set var="classesOrientation" value="media--${pageScope.orientation}"/>
<c:set var="classes" value="media ${pageScope.classesOrientation}"/>
<c:set var="attributes">
<c:forEach items="${dynattrs}" var="a">
<c:choose>
<c:when test="${a.key == 'class'}">
<c:set value="${classes} ${a.value}" var="classes"/>
</c:when>
<c:otherwise>${a.key}="${a.value}" </c:otherwise>
</c:choose>
</c:forEach>
</c:set>
<div class="${pageScope.classes}" ${pageScope.styleAttribute} ${pageScope.attributes}>
<jsp:doBody var="body"/>
<c:choose>
<c:when test="${not empty pageScope.body}">
${pageScope.body}
</c:when>
<c:otherwise>
<kuik:media-image image="${pageScope.media.image}" imgClasses="${pageScope.imgClasses}"/>
<kuik:media-content media="${pageScope.media}"/>
</c:otherwise>
</c:choose>
</div>
</c:if>
@use 'mixins/mixins-customizables' as custom;
$prefix: 'media';
$prefix-title: 'media-title';
$prefix-content: 'media-content';
.media {
--media-img-size: 1fr;
--media-content-size: 2fr;
@include custom.component($prefix, true);
display: grid;
}
.media__content {
@include custom.component($prefix-content, true);
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.media__title {
@include custom.component($prefix-title, true);
--links-visited: currentcolor;
--links-hover: currentcolor;
--links: currentcolor;
margin: var(--space-0);
}
.media__subtitle {
font-size: var(--font-size-30); // FIXME: variables ?
font-weight: var(--font-weight-700);
margin: var(--space-0);
}
.media__link {
text-decoration: none;
}
.media__summary {
margin: var(--space-0);
}
.media--vertical {
grid-auto-flow: row;
grid-auto-rows: min-content;
}
*:has(> .media--horizontal) {
container-name: mediaresponsive;
container-type: inline-size;
}
.media--horizontal {
@container mediaresponsive (width >= 30rem) {
&:has(> .media__illustration) {
grid-template-columns: var(--media-img-size) var(--media-content-size);
}
}
@container mediaresponsive (width < 30rem) {
grid-auto-flow: row;
grid-auto-rows: auto;
}
}
.media--sm, .media--md, .media--lg, .media--xl {
@include custom.component($prefix);
.media__title {
@include custom.component($prefix-title);
}
.media__content {
@include custom.component($prefix-content);
}
}
package fr.kosmos.web.kore.attributes.interfaces;
import fr.kosmos.web.kore.attributes.DefaultImage;
/**
* Modèle de média.
*/
public interface Media {
void setTitle(String title);
String getLink();
void setLink(String link);
Image getImage();
void setImage(DefaultImage image);
String getSummary();
void setSummary(String summary);
}