Framework graphique solarpunk
Une tessera est la pièce unitaire d'un vitrail : un morceau de verre serti dans le plomb. Tout ce que l'outil produit est fait de ça. Une description en quinze lignes de YAML devient un SVG, puis un thème web, un VectorDrawable Android, une illustration imprimable.
Le principe
Tessera n'est pas une banque d'images. C'est une grammaire de style, un
vocabulaire de motifs et de rôles de couleur, et des générateurs
déterministes. Même source et même seed donnent la même image,
au bit près, ce qui permet à un humain de reproduire et à un agent d'itérer.
Un LLM ne sait pas dessiner, mais il écrit très bien du YAML qui respecte un schéma. Un humain écrit le même fichier.
Uniquement ce qu'un VectorDrawable Android sait représenter :
des path, des remplissages, des dégradés à deux arrêts. Ni
filtre, ni masque, ni texte.
Web, Android, raster. Chaque sortie embarque sa source : une image retrouvée dans dix ans se régénère.
La grammaire
Sept règles, chacune tirée d'une référence précise plutôt que d'un goût général. Elles contraignent la façon de dessiner, pas seulement le rendu.
check.papier, crépusculeLa palette
Les couleurs sont décrites en OKLCH, où deux teintes de même clarté se
lisent comme également claires. Un site, une application ou une icône ne
référence jamais leaf : elle référence ok.
Changer de schéma ne change donc aucun fichier consommateur.
L'accessibilité
Le contraste contre le fond, que la section précédente mesure, est la couche la plus superficielle. La vraie question n'est pas « ce texte se lit-il sur ce fond » mais « ces deux choses qui veulent dire des choses différentes se distinguent-elles l'une de l'autre ».
L'œil ne mesure pas une longueur d'onde : il compare trois
réponses de cônes, que le cerveau recombine en une clarté et deux axes,
rouge–vert et bleu–jaune. Il manque un cône ? Ce n'est pas une
couleur qui disparaît, c'est un axe entier. Les quatre rôles de
statut ci-dessous sont simulés en direct, avec les matrices de Viénot,
Brettel et Mollon appliquées en sRGB linéaire — le même calcul que
tessera palette check.
Un statut est un glyphe et une couleur, jamais une couleur seule.
Ce n'est pas une précaution, c'est un résultat. Le plomb
doit garder 4,5 de contraste contre chaque pièce de verre, ce qui interdit
les remplissages sous l ≈ 0,60 ; il reste environ 0,30 de
plage de clarté. Quatre rôles séparés de 0,12 chacun en réclament 0,36.
Ça ne rentre pas — et sans vision des couleurs, la clarté est tout ce qui
reste. Aucun choix de couleurs ne répare ça, donc la forme porte ce que la
couleur ne peut pas porter. C'est aussi la seconde vie du schéma
paper : une interface lisible à une encre est une
interface lisible sans vision des couleurs.
Les icônes
Une icône n'est pas un chemin SVG écrit à la main, mais une composition
de motifs : stem, leaf, sun,
hex, wave, soil. C'est ce qui garantit
le style quel que soit l'auteur, humain ou agent. Le même fichier donne les
deux styles.
style pane — l'illustration
style line — l'interface
Les sources
# palette.yaml
name: tessera
space: oklch
default_scheme: noon
dark_scheme: dusk
colors:
sun: { l: 0.860, c: 0.150, h: 85 }
leaf: { l: 0.620, c: 0.140, h: 140 }
lead: { l: 0.220, c: 0.020, h: 280 }
linen: { l: 0.960, c: 0.015, h: 85 }
schemes:
noon:
bg: linen
text: soil
outline: lead
accent: sun
ok: leaf
# ... les douze rôles
# icons/seedling.yaml
name: seedling
grid: 32
lead: 3
bleed: 1.5
motifs:
- soil: { y: 28, width: 16 }
- stem:
from: [16, 28]
to: [16, 12]
whip: 0.15
- leaf:
at: [16, 16]
dir: left
size: 7
fill: ok
- sun: { at: [24, 7], r: 4, fill: accent }
tags: [nature, growth, start]
Les sorties
| Objet | Web | Android | Raster et impression |
|---|---|---|---|
| palette | tessera.css, palette.json |
colors.xml, objet Compose |
tessera.gpl, planche de couleurs |
| icon | SVG, sprite <symbol> |
VectorDrawable | PNG de 24 à 512 px |
| pattern | SVG <pattern> |
tuile par densité | JPG grande taille, métadonnées embarquées |
L'état
Le binaire lit palette.yaml, le valide et en dérive le CSS,
le JSON, la palette GIMP et la planche de revue. Vingt-deux tests, dont ceux
qui épinglent les hexadécimaux et les ratios affichés sur cette page.
check a refusé la palette de la spécification le lendemain de
son écriture, sur trois points réels : sun hors du gamut
sRGB, water trop sombre pour que le plomb reste visible, et une
règle de contraste insatisfiable. C'est l'argument pour écrire les règles
avant les dessins : une palette qui a l'air juste ne l'est pas.
check, build. Faite.line : le vocabulaire de motifs, lint, VectorDrawable, vingt icônes de base.pane : remplissages par rôle, ressources Android et Compose.schema : un agent produit une icône depuis une phrase.Ce qui reste ouvert
Le vocabulaire de motifs est-il assez expressif pour vingt icônes
d'interface sans recourir à l'échappatoire path ? Si
path dépasse un tiers des icônes, le vocabulaire est trop
court. Cela ne se tranche pas sur le papier : la v0.2 le mesure en
dessinant.
Sous quelle licence les icônes et les patterns ? CC0 laisse tout prendre, y compris fermer un dérivé. CC BY-SA protège le commun mais pose à chaque application la question de l'œuvre dérivée. Les assets étant générés, la valeur est dans le générateur, pas dans le PNG.