Matrice 4x4 : Polymorphisme Intrinsèque

Comment rendre la grille mathématiquement consciente de son environnement (CQI & Clamp)

Démo — Redimensionner pour voir

Réduis la fenêtre ou le panneau. Les lettres adaptent leur graisse automatiquement via clamp() + cqi.

Même dans un conteneur étroit, la géométrie ne s'effondre pas :

Animations

Survol → bold. Classes .black, .pulse, .breathe.

:hover

.black

.pulse

.breathe

Le Problème

Rappel de la V1 : L'épaisseur du trait de la lettre, ainsi que les espaces vides de la grille, sont calculés à partir d'une seule variable : --offset.

En mode "Ultra Black", nous poussons cette valeur à 21px. Sur une lettre affichée à 240px de large, cela représente environ 8.7% de l'espace total. La géométrie est stable, les trous s'évident correctement.

L'implosion : Sur un écran mobile, si l'on contraint la lettre à faire 160px de large, le --offset reste fixé à 21px. L'épaisseur représente soudainement plus de 13% de la boîte. L'espace mathématique vient à manquer. La somme de l'épaisseur des traits et des espaces vides (gap) devient supérieure à la largeur totale de la cellule.

Les coordonnées se percutent, l'axe X croise l'axe Y, et les points d'ancrage s'inversent. Résultat : les trous intérieurs s'effondrent sur eux-mêmes. La lettre est détruite.

Nous devons remplacer nos pixels morts par une unité proportionnelle.

La solution absolue est le CQI (Container Query Inline). Cette unité représente 1% de la largeur du conteneur le plus proche. Couplée à la fonction mathématique native clamp(), elle permet de définir une graisse fluide, avec des limites de sécurité strictes.

Le Concept

Quoi
L'utilisation de la propriété container-type pour définir un contexte de mesure, associée à l'unité cqi et à la fonction de limitation clamp(min, ideal, max).
Quand
Dès qu'une géométrie complexe, un espacement ou une typographie risque de se briser si elle n'évolue pas de manière strictement proportionnelle à la boîte qui la contient.
Comment
On transforme le composant en un conteneur physique, puis on remplace la valeur fixe en pixels par une formule clamp().
Pourquoi
Pour éradiquer définitivement les Media Queries (@media) de la logique du composant. Le composant devient un organisme autonome qui "sait" quelle taille il fait et comment il doit s'auto-dessiner pour survivre.

Le Code

/* 1. Déclaration du conteneur physique */
[data-matrice-char] {
  /* La lettre devient son propre référentiel de mesure */
  container-type: inline-size;

  /* 2. Le Garde-fou mathématique */
  --offset-light-min: 4px;
  --offset-light-ideal: 5cqi;
  --offset-light-max: 12px;

  --offset-light: clamp(
    var(--offset-light-min),
    var(--offset-light-ideal),
    var(--offset-light-max)
  );

  /* 3. Injection dans le moteur géométrique */
  --offset: var(--offset-light);

  /* 4. --glyph : la forme comme variable */
  /* clip-path: var(--glyph) sur ::after */
}

Explication

Sans JavaScript, et sans détecter la largeur de l'écran, le processus est autonome :

  1. Le navigateur mesure la largeur physique de [data-matrice-char].
  2. Il convertit : si la lettre fait 200px, 1cqi = 2px. Donc 5cqi = 10px.
  3. Le clamp() valide : 10px est entre 4px et 12px. ✓
  4. Il injecte 10px dans --offset.
  5. La grille recalcule ses 256 coordonnées.
  6. clip-path: var(--glyph) s'adapte sans jamais se briser.

Les Règles

Zéro Media Query Géométrique

Il est strictement interdit d'utiliser des @media (max-width: ...) pour modifier des proportions internes d'un composant complexe. Le redimensionnement géométrique doit être géré en interne via container-type / cqi.

Le principe de la borne (Clamp)

Ne déclare JAMAIS une valeur fluide (cqi, vw) de manière brute. Sécurise toujours avec clamp(min, fluide, max).

Indépendance du Viewport

Un composant doit pouvoir être placé dans une page entière ou dans une colonne de 150px de large et se comporter parfaitement dans les deux cas. C'est le design intrinsèque.

Puisque la forme de la lettre est stockée dans une variable abstraite (--glyph), pourquoi la restreindre à un seul calque 2D ? Dans la prochaine expérience : extrusions isométriques, superpositions de trames, effets bien crades :D