diff --git a/medias_fonctions.php b/medias_fonctions.php
index ee57551511867e032478c2b9fb38995b2fceca37..4ecee05cdacb09158d080097b489f27345b99a06 100644
--- a/medias_fonctions.php
+++ b/medias_fonctions.php
@@ -414,3 +414,145 @@ function medias_trouver_modele_emb($extension, $mime_type, $modele_base='file')
 
 	return $modele_base;
 }
+
+
+/**
+ * Liste les classes standards des modèles de documents SPIP.
+ *
+ * @note
+ *     le nomage au pluriel est historique.
+ *     préférer au singulier pour toute nouvelle classe.
+ * 
+ * @param int $id_document
+ * @param string $media
+ * @param array $env
+ * @param array $get
+ * @return string
+ */
+function filtre_medias_modele_document_standard_classes_dist($Pile, $id_document, $media) {
+	$env = $Pile[0];
+	$var = $Pile['vars'] ?? [];
+
+	$s  = 'spip_document_';
+	
+	$classes = [];
+	$classes[] = $s . $id_document;
+	$classes[] = 'spip_documents';
+	$classes[] = $s . $media;
+	if (!empty($env['align'])) {
+		$classes[] = 'spip_documents_' . $env['align'];
+	} elseif ($media === 'image') {
+		$classes[] = 'spip_documents_center';
+	}
+	if (!empty($var['legende'])) {
+		$classes[] = $s . '--legende';
+	}
+	if (!empty($env['class'])) {
+		$classes[] = $env['class'];
+	}
+	return implode(" ", $classes);
+}
+
+
+/**
+ * Liste les attributs data standards des modèles de documents SPIP.
+ *
+ * @param int $id_document
+ * @param string $media
+ * @param array $env
+ * @param array $get
+ * @return string
+ */
+function filtre_medias_modele_document_standard_attributs_dist($Pile, $id_document, $media) {
+	$env = $Pile[0];
+	$var = $Pile['vars'] ?? [];
+	$attrs = [];
+
+	if (!empty($var['legende'])) {
+		$len = spip_strlen(textebrut($var['legende']));
+		// des x. "x" = 32 caratères, "xx" => 64, "xxx" => 128, etc...
+		$lenx = medias_str_repeat_log($len, 2, "x", 4);
+		$attrs['data-legende-len'] = $len;
+		$attrs['data-legende-lenx'] = $lenx;
+	}
+
+	$res = "";
+	foreach($attrs as $attr => $value) {
+		$res .= "$attr=\"" . attribut_html($value) . "\""; 
+	};
+	return $res;
+}
+
+
+/**
+ * Retourne une chaine répétée d'autant de fois le logarithme
+ *
+ * @example medias_str_repeat_log(124, 2)
+ * 
+ *     Avec $base = 2 et $remove = 0
+ * 
+ *     0 => 
+ *     2 => x
+ *     4 => xx
+ *     8 => xxx
+ *     16 => xxxx
+ *     32 => xxxxx
+ *     64 => xxxxxx
+ * 
+ * @example medias_str_repeat_log(124, 2, "x", 4)
+ * 
+ *     Avec $base = 2 et $remove = 4
+ * 
+ *     0 => 
+ *     2 => 
+ *     4 => 
+ *     8 => 
+ *     16 => 
+ *     32 => x
+ *     64 => xx
+ * 
+ * @note 
+ *     L'inverse (nb caractères => valeur) est donc `pow($base, $nb_char)`
+ * 
+ *     En partant du nombre de "x" on retrouve la fourchette du nombre de départ.
+ *     Si $base = 2 et $remove = 4 :
+ * 
+ *    - "xxx" = 2 ^ (strlen("xxx") + 4) = 2 ^ (3 + 4) = 128
+ *    - "xxxxx" = 2 ^ (5 + 4) = 512
+ 
+ *     x = 32,
+ *     xx = 64
+ *     xxx = 128
+ *     xxxx = 256
+ *     xxxxx = 512 
+ *     ...
+ * 
+ *     Ce qui veut dire que "xxx" provient d'une valeur entre 128 et 255.
+ * 
+ * @note
+ *     C'est surtout utile pour une sélection en CSS (car CSS ne permet pas de sélecteur "lower than" ou "greater than") :
+ * 
+ *    ```spip
+ *    <div class='demo' attr-demo-pad='[(#TEXTE|textebrut|spip_strlen|medias_attr_pad_log)]'>...</div>`
+ *    ```
+ * 
+ *    ```css
+ *    .demo[attr-demo-pad^="xxxx"] {
+ *       // le contenu fait au moins 256 caractères
+ *    }
+ *    .demo:not([attr-demo-pad^="xxxx"]) {
+ *       // le contenu fait au moins 256 caractères
+ *    }
+ *    ```
+ * 
+ * @param float $num 
+ * @param float $log
+ * @param string $pad_string
+ * @param int $remove : Nombre de caractères à enlever.
+ * 
+ * @return string Des x
+ */
+function medias_str_repeat_log($num, $base = 2, $string = "x", $remove = 0) {
+	$pad = str_repeat($string, (int)log($num, $base));
+	return substr($pad, $remove);
+}
diff --git a/modeles/audio.html b/modeles/audio.html
index 6aaeb5ea1f406b0dfeeda09ed63c161103655ceb..5d47a565a1bd5db0b1ecfc4a0268a5820f0877a6 100644
--- a/modeles/audio.html
+++ b/modeles/audio.html
@@ -7,7 +7,11 @@
 [(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})]
 #SET{largeur,#ENV{largeur, #LARGEUR|?{#LARGEUR,400}}|max{120}}
 #SET{duree,#ENV{duree,#DUREE}}[(#SET{duree,[(#GET{duree}|intval|?{[(#GET{duree}|intval)],''})]})]
-<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_audio[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})]'[ style='width:(#GET{largeur})px;']>
+<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{audio})]"[ 
+  style='width:(#GET{largeur})px;'][
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{audio})
+]>
 	[(#LOGO_DOCUMENT{vignette}|image_reduire{#GET{largeur},0}|vider_attribut{class})]
   <div class="audio-wrapper"[ style='width:(#GET{largeur})px;max-width:100%;']>
   	<audio class="mejs mejs-#ID_DOCUMENT [ mejs-(#ENV{skin})]"
diff --git a/modeles/file.html b/modeles/file.html
index 9c379f2d5d49a970d224f9f8378fb2ad9cda7b59..de2fb7f43e47b0bf87bfa1f3eb85a31e8f8484e0 100644
--- a/modeles/file.html
+++ b/modeles/file.html
@@ -25,7 +25,11 @@
 [(#SET{title,[(#TYPE_DOCUMENT) - [(#TAILLE|taille_en_octets)]]})]
 [(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})]
 [(#MEDIA|=={image}|oui) #SET{title,#TITRE|sinon{#GET{title}}]
-<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_file[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})][ (#ENV{class})] spip_lien_ok' [ style='width:(#GET{width}|max{120})px;']>
+<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{file}) ]spip_lien_ok"[ 
+  style='width:(#GET{width}|max{120})px;'][ 
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{file})
+]>
 [<a href="(#GET{url})"[
 	class="(#ENV{lien_class})"] title='[(#GET{title}|attribut_html)]'[
 	(#ENV{lien}|?{'',type="#MIME_TYPE"})]>]<img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='' />[(#GET{url}|?{</a>})]
diff --git a/modeles/file_emb_application.html b/modeles/file_emb_application.html
index b31b976e84d41e1c73a91924d0ad83fe6ed8b330..d0d4528fb21d28c3917a209969ccb0d646127638 100644
--- a/modeles/file_emb_application.html
+++ b/modeles/file_emb_application.html
@@ -5,14 +5,17 @@
 - #GET{hauteur} et #GET{largeur} correspondent prioritairement a #ENV,
   puis #LARGEUR/HAUTEUR sauf si il y a un controleur
 ]
-[(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})]
 #SET{hauteur,#ENV{hauteur,#HAUTEUR}} #SET{largeur,#ENV{largeur,#LARGEUR}}
 [(#ENV{controls}=={PlayButton}|?{#SET{hauteur,25},''})][
  (#ENV{controls}=={PlayButton}|?{#SET{largeur,40},''})][
  (#ENV{controls}=={PositionSlider}|?{#SET{hauteur,25},''})][
  (#ENV{controls}=={PositionSlider}|?{#SET{largeur,#GET{largeur}|moins{40}},''})
 ][(#ENV{controls,''}|non)
-<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_application[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})]'>
+[(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})]
+<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{application})]"[
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{application})
+]>
 ][(#EXTENSION|=={swf}|oui)
 <object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' 
  codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=#ENV{version,'6,0,0,0'}' 
diff --git a/modeles/file_emb_text.html b/modeles/file_emb_text.html
index 34aa3641c8b693427656a2fdc64bc9f60a7d4cc9..7f603e9ec124a37c3469993e8df0cb72234ec256 100644
--- a/modeles/file_emb_text.html
+++ b/modeles/file_emb_text.html
@@ -1,7 +1,9 @@
 <BOUCLE_text (DOCUMENTS types_documents) {id_document=#ENV{id,#ENV{id_document}}} {tout}
 >[(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})][(#REM)
-][<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_text[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})]'
-><pre>(#FICHIER|contenu_document{#ENV{charset,auto}}|echapper_tags)</pre>
+][<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{text})]"[ 
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{text})
+]><pre>(#FICHIER|contenu_document{#ENV{charset,auto}}|echapper_tags)</pre>
 [(#GET{legende})
 ]</figure>
 ]</BOUCLE_text>
diff --git a/modeles/file_emb_text_csv.html b/modeles/file_emb_text_csv.html
index eb2dd0f2f0a38e9f57b64ac57763bd8da6d52866..e15694fdf1d428941a354e2cf31f318b0ff09a1f 100644
--- a/modeles/file_emb_text_csv.html
+++ b/modeles/file_emb_text_csv.html
@@ -1,6 +1,9 @@
 <BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}
 >[(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})][(#REM)
-]<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_text[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})]'>
+]<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{text})]"[ 
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{text})
+]>
 [(#FICHIER|contenu_document{#ENV{charset,auto}}|appliquer_filtre{#MIME_TYPE})]
 [(#GET{legende}
 ]</figure>
diff --git a/modeles/file_emb_text_html.html b/modeles/file_emb_text_html.html
index 2fc854cb146133ab2df1d19bb45761066b6c3552..34eba39bff4caa8f25a66991b6caa038de469f5a 100644
--- a/modeles/file_emb_text_html.html
+++ b/modeles/file_emb_text_html.html
@@ -1,7 +1,9 @@
 <BOUCLE_texthtml (DOCUMENTS types_documents) {id_document=#ID} {tout}
 >[(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})][(#REM)
-][<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_text_html[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})]'
-><object data="(#URL_DOCUMENT)" width="100%" height="400"><a href="#URL_DOCUMENT">#FICHIER</a></object>
+][<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{text_html})]"[ 
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{text_html})
+]><object data="(#URL_DOCUMENT)" width="100%" height="400"><a href="#URL_DOCUMENT">#FICHIER</a></object>
 [(#GET{legende})
 ]</figure>
 ]</BOUCLE_texthtml>
diff --git a/modeles/image.html b/modeles/image.html
index d415b007dd9947fafacd1f080c7e3f9a4c274183..29a89d7e70e1eff761772c3c0f688c8eaa28a0c5 100644
--- a/modeles/image.html
+++ b/modeles/image.html
@@ -11,7 +11,11 @@
 [(#SET{image,#GET{image}|inserer_attribut{alt,#ENV{alt,#ALT}|sinon{''}}})]
 [(#SET{legende,#INCLURE{fond=modeles/document_legende, env}|trim})]
 #SET{largeur,#GET{image}|largeur}
-<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_image[ spip_documents_(#ENV{align}|sinon{center})][ (#GET{legende}|?{spip_document--legende})][ (#ENV{class})] spip_lien_ok'[ style='width:(#GET{largeur})px;']>
+<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{image}) ]spip_lien_ok"[ 
+  style='width:(#GET{largeur})px;'][
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{image})
+]>
 [<a href="(#ENV{lien})"[ class="(#ENV{lien_class}|concat{#GET{autolien}|?{' mediabox'}})"]>]
 [(#ENV{lien}|non|et{#GET{autolien}})<a href="#URL_DOCUMENT" class="mediabox" type="#MIME_TYPE">]
 		#GET{image}
diff --git a/modeles/video.html b/modeles/video.html
index 7f6a21465cc4a87157b0ae754fa0a2fbdd2327aa..5fb1a70dd9983bc34e7fa5cb4d50bdefcfdedfa2 100644
--- a/modeles/video.html
+++ b/modeles/video.html
@@ -9,7 +9,11 @@
 #SET{largeur,#ENV{largeur, #LARGEUR|?{#LARGEUR,480}}|max{120}}
 #SET{hauteur,#ENV{hauteur, #HAUTEUR|?{#HAUTEUR,300}}|max{75}}
 #SET{duree,#ENV{duree,#DUREE}}[(#SET{duree,[(#GET{duree}|intval|?{[(#GET{duree}|intval)],''})]})]
-<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_video[ spip_documents_(#ENV{align})][ (#GET{legende}|?{spip_document--legende})]'[ style='width:(#GET{largeur})px;']>
+<figure 
+  class="[(#ID_DOCUMENT|medias_modele_document_standard_classes{video})]"[ 
+  style='width:(#GET{largeur})px;'][ 
+  (#ID_DOCUMENT|medias_modele_document_standard_attributs{video})
+]>
 <div class="video-intrinsic-wrapper" style='height:0;width:#GET{largeur}px;max-width:100%;padding-bottom:[(#GET{hauteur}|div{#GET{largeur}}|mult{100}|round{2})]%;position:relative;'>
 	<div class="video-wrapper" style="position: absolute;top:0;left:0;width:100%;height:100%;">
 		<video class="mejs mejs-#ID_DOCUMENT[ mejs-(#ENV{skin})]"