Commit fb2e051f authored by Kourser's avatar Kourser
Browse files

Cent cinq symboles de plus, embarqués plutôt qu'appelés

Le dépôt public d'Excalidraw tient des centaines de bibliothèques ; le canevas
sait aller les chercher. Cinq d'entre elles sont désormais dans le produit —
topologie réseau, symboles de logigramme, services Azure, Kubernetes, AWS sans
serveur, logos techniques : 105 formes, 618 ko, à côté de nos 17.

── Embarquées, pour deux raisons

Une instance de crise doit fonctionner sans Internet. Une bibliothèque qu'il
faut aller chercher est une bibliothèque absente le jour où le lien tombe,
c'est-à-dire le jour où l'on s'en sert.

Et le bouton « Parcourir les bibliothèques » ouvre le dépôt public en lui
passant l'adresse de retour. Le canevas y met « origin + pathname » par
défaut — soit « /crises/<identifiant>/tableaux ». L'identifiant d'une crise
réelle partait donc chez un tiers, dans le référent, à chaque clic.
« libraryReturnUrl » est maintenant l'origine seule.

── Importées, et non lues au disque

L'API est empaquetée en un seul fichier par esbuild : « src » n'existe plus à
l'exécution. Un chemin relatif aurait marché en développement et laissé la
bibliothèque vide en production — le défaut le plus ingrat, celui qu'on ne voit
que chez l'exploitant.

── Ce qui a été écarté

« AWS Architecture Icons » pèse 3,8 Mo pour 249 symboles : au-delà du plafond
d'une bibliothèque, et bien au-delà de ce qu'un panneau plat laisse parcourir.
« GCP Icons » et le Kubernetes complet le sont pour la même raison ; les
variantes compactes des mêmes fournisseurs les remplacent. Une garantie vérifie
que ce qui est livré tient dans la moitié du plafond : la livraison écrit la
ligne sans passer par le contrôle de poids, et une bibliothèque livrée trop
lourde serait un piège — reçue, puis impossible à compléter.

── Attribution

Le dépôt est sous licence MIT, dont la clause tient en une phrase : on peut
reprendre, à condition de citer. ATTRIBUTION.md nomme chaque jeu, ses auteurs,
sa source et la date de reprise, et une garantie vérifie qu'aucun n'y manque.
Le dépôt ne déclare rien bibliothèque par bibliothèque, et certaines reprennent
l'iconographie de marques déposées : elles restent à leurs titulaires.

── Deux contrôles qui visaient nos formes et jugeaient celles d'autrui

Ils exigeaient un nom et une étiquette de texte sur chaque forme. C'est vrai
des nôtres, dessinées en primitives — sans le nom écrit dedans, dix rectangles
gris ne se distinguent pas. Les jeux repris dessinent des icônes et n'ont pas
tous de nom, le champ étant facultatif. L'exigence est désormais portée par les
seules formes qu'elle vise.

Co-Authored-By: default avatarClaude Opus 5 <noreply@anthropic.com>
parent 38938fbe
Loading
Loading
Loading
Loading
Loading
+2 −2
Changes for apps/api/src/domaine/bibliotheque.ts: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
import type { Sql } from "../db/client.js";
import { bibliothequeLivree } from "@kastell/shared";
import { formesLivrees } from "../donnees/bibliotheques/index.js";

/**
 * La bibliothèque de formes du tableau blanc (EF-1002a).
@@ -55,7 +55,7 @@ export async function lire(sql: Sql, organisationId: string): Promise<unknown[]>
    (i) => (i as { id?: unknown }).id));
  const fusion = [
    ...(b?.items ?? []),
    ...bibliothequeLivree().filter((f) => !deja.has(f["id"])),
    ...formesLivrees().filter((f) => !deja.has(f["id"])),
  ];
  await sql`
    insert into bibliotheque_tableau (organisation_id, items, livree_at)
+88 −0
Changes for apps/api/src/donnees/bibliotheques/ATTRIBUTION.md: 88 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Bibliothèques de formes reprises du dépôt public Excalidraw

Ces fichiers ne sont pas de nous. Ils viennent de
<https://libraries.excalidraw.com>, dont le dépôt
<https://github.com/excalidraw/excalidraw-libraries> est publié sous licence
MIT — dont la clause tient en une phrase : on peut reprendre, à condition de
citer. C'est ce que fait ce fichier.

Le dépôt ne déclare aucune licence bibliothèque par bibliothèque, et certaines
reprennent l'iconographie de marques déposées — Amazon, Microsoft, la Cloud
Native Computing Foundation. Les marques restent à leurs titulaires ; les
reprendre ici sert à décrire une infrastructure, pas à s'en réclamer.

## Pourquoi embarquées plutôt qu'appelées

Une instance de crise doit fonctionner sans Internet. Une bibliothèque qu'il
faut aller chercher est une bibliothèque absente le jour où le lien tombe,
c'est-à-dire le jour où l'on s'en sert.

Et le bouton « Parcourir les bibliothèques » d'Excalidraw ouvre le dépôt public
en lui passant l'adresse de retour, laquelle contient l'identifiant de la crise
en cours. Le nom de l'instance et l'identifiant d'une crise réelle n'ont rien à
faire chez un tiers.

## Ce qui est repris

### Topologie réseau

- Titre d'origine : Network topology icons
- Auteurs : dwelle
- Source : `dwelle/network-topology-icons.excalidrawlib`
- Fichier : `topologie-reseau.json` — 10 formes, 74 ko
- Repris le : 2026-09-10

### Symboles de logigramme

- Titre d'origine : Flow Chart Symbols
- Auteurs : Fin
- Source : `finfin/flow-chart-symbols.excalidrawlib`
- Fichier : `logigramme.json` — 15 formes, 30 ko
- Repris le : 2026-09-10

### Services Azure

- Titre d'origine : Azure cloud services icons
- Auteurs : Youri Tjang, bothzoli
- Source : `youritjang/azure-cloud-services.excalidrawlib`
- Fichier : `azure.json` — 19 formes, 77 ko
- Repris le : 2026-09-10

### Kubernetes

- Titre d'origine : Kubernetes Icons Set
- Auteurs : Lowess
- Source : `lowess/kubernetes-icons-set.excalidrawlib`
- Fichier : `kubernetes.json` — 19 formes, 99 ko
- Repris le : 2026-09-10

### AWS sans serveur

- Titre d'origine : AWS Serverless Icons v2
- Auteurs : slobodan
- Source : `stojanovic/aws-serverless-icons-v2.excalidrawlib`
- Fichier : `aws-serverless.json` — 24 formes, 186 ko
- Repris le : 2026-09-10

### Logos techniques

- Titre d'origine : Technology Logos
- Auteurs : Matthias Haeussler
- Source : `maeddes/technology-logos.excalidrawlib`
- Fichier : `logos-techniques.json` — 18 formes, 150 ko
- Repris le : 2026-09-10

## Ce qui a été écarté, et pourquoi

« AWS Architecture Icons » pèse 3,8 Mo pour 249 symboles : au-delà du plafond
d'une bibliothèque, et bien au-delà de ce qu'un panneau plat laisse parcourir.
« GCP Icons » (777 ko) et la version complète de Kubernetes (1 Mo) ont été
écartées pour la même raison. Les variantes compactes des mêmes fournisseurs
sont reprises à leur place.

## Mettre à jour

Rien n'est automatique, et c'est voulu : un jeu de symboles qui change tout
seul ferait qu'un tableau relu six mois plus tard ne ressemble plus à ce que la
cellule avait sous les yeux. Reprendre une version plus récente est une
décision, prise et notée ici.
+1 −0

File added.

Preview size limit exceeded, changes collapsed.

+1 −0

File added.

Preview size limit exceeded, changes collapsed.

+67 −0
Changes for apps/api/src/donnees/bibliotheques/index.ts: 67 added lines, 0 removed lines.
Original line number Diff line number Diff line
import { bibliothequeLivree } from "@kastell/shared";
import azure from "./azure.json" with { type: "json" };
import awsServerless from "./aws-serverless.json" with { type: "json" };
import kubernetes from "./kubernetes.json" with { type: "json" };
import logigramme from "./logigramme.json" with { type: "json" };
import logosTechniques from "./logos-techniques.json" with { type: "json" };
import topologie from "./topologie-reseau.json" with { type: "json" };

/**
 * Les formes posées dans la bibliothèque d'une organisation (EF-1002a).
 *
 * Deux origines. Les nôtres — un vocabulaire de crise dessiné en primitives,
 * décrit dans « packages/shared/src/tableaux.ts ». Et cinq jeux repris du dépôt
 * public d'Excalidraw, dont ATTRIBUTION.md dit d'où ils viennent et sous quelle
 * licence.
 *
 * ── Pourquoi embarquées, et non appelées ──────────────────────────────────
 *
 * Une instance de crise doit fonctionner sans Internet. Une bibliothèque qu'il
 * faut aller chercher est une bibliothèque absente le jour où le lien tombe,
 * c'est-à-dire le jour où l'on s'en sert.
 *
 * Et le bouton « Parcourir les bibliothèques » du canevas ouvre le dépôt public
 * en lui passant l'adresse de retour, laquelle contient l'identifiant de la
 * crise en cours. Le nom de l'instance et l'identifiant d'une crise réelle
 * n'ont rien à faire chez un tiers.
 *
 * ── Pourquoi importées, et non lues au disque ─────────────────────────────
 *
 * L'API est empaquetée en un seul fichier par esbuild : « src » n'existe plus
 * à l'exécution. Un chemin relatif marcherait en développement et laisserait
 * la bibliothèque vide en production — le défaut le plus ingrat, celui qu'on
 * ne voit que chez le client.
 */

/** Ce qu'un identifiant doit être pour qu'on puisse dédoublonner. */
interface Forme { id?: unknown }

const REPRISES: [string, unknown[]][] = [
  ["topologie-reseau", topologie as unknown[]],
  ["logigramme", logigramme as unknown[]],
  ["azure", azure as unknown[]],
  ["kubernetes", kubernetes as unknown[]],
  ["aws-serverless", awsServerless as unknown[]],
  ["logos-techniques", logosTechniques as unknown[]],
];

/**
 * Tout ce qui est livré, nos formes d'abord.
 *
 * L'ordre compte : le panneau du canevas est plat, et ce qu'une cellule pose
 * le plus souvent doit tomber sous les yeux avant cent symboles de
 * fournisseurs.
 *
 * Les identifiants sont préfixés par jeu. Deux dépôts distincts peuvent avoir
 * tiré le même, et une collision ferait disparaître une forme sans rien dire —
 * la bibliothèque s'ouvrirait simplement plus courte que prévu.
 */
export function formesLivrees(): Record<string, unknown>[] {
  const tout: Record<string, unknown>[] = [...bibliothequeLivree()];
  for (const [jeu, formes] of REPRISES) {
    for (const f of formes as Forme[]) {
      tout.push({ ...(f as Record<string, unknown>), id: `${jeu}:${String(f.id ?? "")}` });
    }
  }
  return tout;
}
Loading