// © 2026 TechnoLibre (http://www.technolibre.ca) // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) // Les désignations stables de l'interface (contrainte 16) : la liste fermée // des attributs data-… que src/interface pose — gabarit ou script d'un // composant, code d'un module —, et par lesquels les épreuves atteignent un // élément sans lire sa classe ni son texte traduit. // test/sources_interface.test.js la compare au code dans les deux sens : un // attribut posé hors de la liste se relève, une entrée que rien ne pose // aussi. Un attribut nouveau entre ici avec le code qui le pose. // // Chaque entrée : attribut → { porteur, valeurs }. porteur dit l'élément qui // le porte ; valeurs vaut null quand la valeur se calcule — un identifiant, // un code, une clé —, sinon la liste fermée des valeurs littérales que le // code écrit, '' pour un attribut posé sans valeur. Une liste fermée ne vaut // que pour un attribut dont chaque pose est littérale ; la garde le vérifie. // Le module est pur : il se lit sous node comme dans le navigateur. // [attribut, porteur, valeurs], dans l'ordre des attributs. const ENTREES = [ ['data-affichee', 'import : la valeur affichée d’une cellule de l’aperçu', ['']], ['data-annonce-planche', 'badges : l’annonce de la planche, avant de produire', ['']], ['data-annonces', 'événement : la zone des annonces à côté de la tête', ['']], ['data-apercu', 'import : l’aperçu d’un fichier ou d’un collage', ['']], ['data-attente-demonstration', 'accueil : le message d’une démonstration cliquée pendant un chargement', ['']], ['data-autre', 'accueil : le choix d’un autre dossier de travail', ['']], ['data-autre-chemin', 'accueil : le chemin de l’autre dossier de travail', ['']], ['data-avancement', 'génération : la barre d’avancement', ['']], ['data-avertissement', 'un avertissement, par son code', null], ['data-bandeau', 'le bandeau d’application', ['']], ['data-bandeau-plan', 'plan : le bandeau au-dessus de la surface', ['']], ['data-bloc', 'à propos : le bloc de version à copier', ['']], ['data-cartouche', 'aperçu : le cartouche de repérage d’une page du plan imprimé', ['']], ['data-case', 'qualité : une case d’une grille de graphique, par « ligne:colonne »', null], ['data-cellule', 'import : une cellule de l’aperçu, par son champ', null], ['data-champ', 'un champ de saisie ou un sélecteur, par son nom', null], ['data-chargement', 'accueil : le signe d’un calcul en cours', ['']], ['data-chargement-liste', 'accueil : l’annonce du calcul des colonnes de la liste', ['']], ['data-chargement-section', 'événement : l’attente d’une section chargée à part, par son nom', null], ['data-chemin-planche', 'badges : le chemin de la planche produite, ou son nom téléchargé', ['']], ['data-choix-siege', 'plan : un siège offert par le panneau d’une table, par son rang', null], ['data-cible', 'la cible d’une commande : section, groupe, colonne, vue imprimée ou papier', null], ['data-cible-redondance', 'propositions : le champ de la cible de redondance', ['']], ['data-classement', 'propositions : les lignes classées', ['']], ['data-coeurs', 'génération : le réglage des cœurs de calcul', ['']], ['data-coeurs-disponibles', 'génération : la valeur automatique des cœurs', ['']], ['data-collage', 'import : l’origine collage de l’aperçu', ['']], ['data-colonne', 'une colonne d’un tableau, par son nom', null], ['data-colonnes', 'import : l’association des colonnes', ['']], ['data-contenu', 'aperçu : la zone de contenu d’une feuille imprimée', ['']], ['data-commande', 'un bouton de commande, par son nom', null], ['data-compte', 'import : un compte du rapport, par son nom', null], ['data-compte-pire', 'qualité : le compte du pire, ou de la ligne, sous un pourcentage, dans le même composant', ['']], ['data-conflit', 'participants : une ligne de conflit d’un groupe', ['']], ['data-conflit-personne', 'participants : les règles d’une personne en conflit', ['']], ['data-conflits', 'participants : les conflits d’un groupe, par sa clé', null], ['data-conversion', 'plan : une conversion offerte par une liste de travail', null], ['data-corbeille', 'accueil : la corbeille', ['']], ['data-corbeille-dossier', 'accueil : un dossier de la corbeille', null], ['data-course', 'qualité : la ligne de tête de la performance du calcul', ['']], ['data-critere', 'propositions : un nom de la phrase de l’ordre, par le critère qui classe sa valeur, objectifs et animateurs compris', null], ['data-defaut', 'tables : le réglage du défaut de places', ['']], ['data-demonstration', 'accueil : une démonstration, par sa clé', null], ['data-derive', 'événement : un placement en dérive, par son identifiant', null], ['data-dernier-changement', 'qualité : la phrase du dernier changement de la performance du calcul', ['']], ['data-dessin-differe', 'qualité : le d’un graphique dont les marques attendent d’approcher de la zone visible, posé sans valeur', null], ['data-devient', 'import : ce que devient une ligne', ['']], ['data-donnee', 'diagnostic : une donnée nommée dans une phrase', ['']], ['data-dossier', 'accueil : le dossier de travail montré', ['']], ['data-dossier-travail', 'accueil : le bloc du dossier de travail', ['']], ['data-doublon', 'un doublon : base de la liste, ou ligne de l’aperçu', null], ['data-doublons', 'import : les doublons de l’aperçu', ['']], ['data-duree', 'génération : la durée estimée', ['']], ['data-echec-section', 'événement : la phrase d’une section chargée à part qui ne s’est pas chargée, par son nom', null], ['data-ecran', 'un écran de l’application', ['accueil', 'apercu', 'apropos', 'evenement', 'recuperation']], ['data-encodage', 'import : l’encodage nommé', ['']], ['data-enonce', 'un énoncé : diagnostic, ou défaut des tables', null], ['data-enregistre', 'import : le chemin des refus enregistrés', ['']], ['data-entete', 'import : la ligne d’en-tête lue', ['']], ['data-entete-liste', 'aperçu : l’en-tête d’une liste imprimée — titre et têtes de colonnes —, répété sur chaque feuille', ['']], ['data-equite', 'qualité : les trois nombres d’une colonne de la diversité par animateur, par sa grandeur', ['appartenances', 'etiquettes']], ['data-estimation', 'génération : l’estimation de la durée', ['']], ['data-etat', 'événement : un état du plan dans la tête', null], ['data-etat-table', 'tables : l’état d’une table', ['']], ['data-etendue', 'propositions : l’étendue d’une page du classement', ['']], ['data-etiquettes', 'participants : les étiquettes de la fiche, leurs pastilles et leur saisie', ['']], ['data-evenement', 'accueil : une ligne de la liste, par sa base', null], ['data-evidence', 'plan : la personne mise en évidence', null], ['data-fantome', 'plan : le fantôme d’une personne glissée', ['']], ['data-fautive', 'événement : une proposition fautive', null], ['data-feuille', 'aperçu : une feuille du document imprimé, une page, par son rang', null], ['data-fiche', 'participants : la fiche d’une personne', null], ['data-filigrane', 'aperçu : le filigrane BROUILLON d’une feuille', ['']], ['data-fichier', 'import : le fichier lu', ['']], ['data-focus-initial', 'plan : le siège qui reçoit le focus à l’ouverture du panneau', null], ['data-fusion', 'import : un groupe d’orthographes fondu', ['']], ['data-fusions', 'import : les groupes d’orthographes', ['']], ['data-fusions-etiquettes', 'import : les étiquettes fondues, à part des appartenances', ['']], ['data-graphique', 'qualité : le d’un graphique, par son nom', null], ['data-groupe', 'participants : l’en-tête d’un groupe, par sa clé', null], ['data-groupe-compte', 'participants : le compte d’un groupe', ['']], ['data-groupe-conflits', 'participants : la marque de conflit d’un groupe', ['']], ['data-groupe-etat', 'participants : l’état replié ou déplié d’un groupe', ['']], ['data-groupe-libelle', 'participants : le libellé d’un groupe', ['']], ['data-groupe-ligne', 'participants : le groupe qui compte une ligne', null], ['data-historique', 'événement : la commande de l’historique', ['']], ['data-homonyme', 'import : une ligne homonyme', null], ['data-impression', 'aperçu : le document imprimé', ['']], ['data-hors-classement', 'propositions : les lignes hors classement', ['']], ['data-issue', 'génération : l’issue de la dernière génération', ['']], ['data-jamais-servies', 'qualité : la liste des personnes jamais servies, ou sa phrase quand elle est vide', ['']], ['data-jumeau', 'qualité : un tableau jumeau ouvert, par son rang dans le jumeau', null], ['data-legende', 'plan : la légende des conflits', ['']], ['data-legende-etiquettes', 'participants : la légende des étiquettes', ['']], ['data-legende-pastille', 'plan : la pastille de la légende', ['']], ['data-legende-regle', 'plan : une entrée de la légende, par sa règle', null], ['data-ligne', 'import : une ligne de l’aperçu, par son rang', null], ['data-ligne-graphique', 'qualité : une ligne de barres, par l’identifiant de ce qu’elle porte', null], ['data-ligne-imprimee', 'aperçu : une ligne d’une liste imprimée, par son rang dans la liste', null], ['data-lignes', 'import : le tableau des lignes', ['']], ['data-liste', 'plan : la liste de noms d’une table', null], ['data-liste-imprimee', 'aperçu : une liste imprimée — l’accueil, ou une table —, par son rang dans le document', null], ['data-liste-travail', 'plan : une liste de travail', ['pressentis', 'titres']], ['data-marque', 'une marque porteuse d’information, par son nom au registre', null], ['data-meilleure', 'la meilleure proposition : accueil ou génération', ['']], ['data-meilleure-collisions', 'génération : les collisions de la meilleure proposition', ['']], ['data-meilleure-id', 'l’identifiant de la meilleure proposition', ['']], ['data-meilleure-libelle-id', 'génération : le libellé de l’identifiant de la meilleure', ['']], ['data-meilleure-vide', 'génération : la meilleure absente', ['']], ['data-mention', 'aperçu : une mention d’une page du plan imprimé — disposition relative, listes hors d’échelle', ['listes', 'relative']], ['data-menu', 'plan : le menu d’une personne', null], ['data-mode', 'événement : la barre, la tête et la surface de l’événement, par son mode', null], ['data-mode-libelle', 'le libellé de mode', ['bandeau', 'barre']], ['data-mode-objectifs', 'génération : le groupe du choix du mode des objectifs', ['']], ['data-motif', 'import : le motif d’une ligne refusée', ['']], ['data-multiligne', 'import : une ligne sur plusieurs lignes de texte', null], ['data-nature-import', 'import : le choix de la nature du fichier', ['']], ['data-niveau', 'participants : le niveau d’un groupe ou d’un sélecteur', null], ['data-nom-imprime', 'aperçu : le nom entier d’une personne sur une liste imprimée', ['']], ['data-nombre', 'import : un nombre affiché', ['']], ['data-objectif', 'tables : l’objectif d’une table, par sa table, et son tour pour un tour désigné', null], ['data-ordre', 'propositions : la phrase de l’ordre', ['']], ['data-orthographe', 'import : une orthographe d’un groupe', ['']], ['data-pages', 'propositions : une nav des pages du classement, haut ou bas', null], ['data-paire', 'qualité : une ligne du tableau des paires répétées, par « a:b » des identifiants', null], ['data-palier', 'génération : un palier de l’éditeur des priorités, par son index', null], ['data-panneau', 'plan : un panneau', ['place', 'table']], ['data-panneau-diagnostic', 'plan : le panneau du diagnostic', ['']], ['data-papier', 'le papier de la machine : la question, ou le papier choisi', ['choisi', 'question']], ['data-participant', 'une personne, par son identifiant', null], ['data-partie', 'plan : une partie d’une ligne de liste ou du fantôme', null], ['data-pastille', 'plan : la pastille d’une table', null], ['data-phrase', 'une phrase : diagnostic ou défaut des tables', ['']], ['data-phrase-qualite', 'qualité : la phrase d’un cas de la page, par son code', null], ['data-pied', 'aperçu : le pied d’une feuille imprimée', ['']], ['data-place-fixe', 'événement : la place fixe de la barre de l’événement', ['']], ['data-place-vide', 'aperçu : une place vide de la feuille par table', ['']], ['data-plan', 'plan : le du plan', ['']], ['data-plancher-objectifs', 'diagnostic : la phrase d’un plancher des objectifs, par la valeur que le mode compare', null], ['data-poignee', 'plan : la poignée d’une table', null], ['data-point-releve', 'qualité : un point de relevé d’un petit multiple, par ses mouvements évalués', null], ['data-portee', 'tables : la portée d’un objectif, tous pour la soirée, tour pour un tour désigné', ['tous', 'tour']], ['data-position-tables', 'qualité : un bouton radio du sélecteur du mélange des tables, par sa position', ['sieges', 'assis', 'doublons']], ['data-pourcentage', 'qualité : un pourcentage rendu, que suit son compte', ['']], ['data-priorite', 'génération : un critère de l’éditeur des priorités, par son nom', null], ['data-priorites', 'génération : la liste des paliers de l’éditeur des priorités', ['']], ['data-proposition', 'propositions : une ligne, par son identifiant', null], ['data-question', 'une question posée : dossier de travail ou durée longue', null], ['data-rang', 'qualité : la désignation de la cible pointée d’un graphique, par son rang à partir de 1', null], ['data-rapport', 'import : le rapport', ['']], ['data-refus', 'un refus, par son code ou sa place', null], ['data-refus-realigner', 'tables : le refus du réalignement', ['']], ['data-refusees', 'import : les lignes refusées', ['']], ['data-reglages', 'génération : les réglages', ['']], ['data-regle-objectifs', 'tables : la règle par défaut des objectifs', ['']], ['data-remede', 'diagnostic : un remède', ['']], ['data-repere', 'qualité : le tracé d’un repère — plafond, borne ou règle à 100 % (cent) —, par son genre', null], ['data-reserve', 'plan : la réserve d’un tour', null], ['data-retenu', 'propositions : la ligne du retenu', null], ['data-rubrique-rencontres', 'participants : la rubrique « Rencontres » de la fiche', ['']], ['data-secours', 'récupération : une source de secours', null], ['data-segment', 'qualité : un segment de barre, par son genre', null], ['data-section', 'une section de l’événement', ['badges', 'diagnostic', 'generation', 'import', 'participants', 'plan', 'propositions', 'qualite', 'tables']], ['data-separateur', 'import : le séparateur nommé', ['']], ['data-serie', 'qualité : le tracé d’une série, serie1 ou serie2', null], ['data-siege', 'plan : un siège, par sa table et son numéro', null], ['data-sieges-retires', 'tables : les sièges retirés', ['']], ['data-signalement', 'accueil : un signalement d’une ligne', null], ['data-socle', 'plan : le socle d’une pastille', ['']], ['data-soiree-objectifs', 'qualité : la soirée des objectifs, en texte', ['']], ['data-source', 'plan : le placement montré, dans la barre de vue', ['']], ['data-source-qualite', 'qualité : la ligne de source, le placement que la page mesure', ['']], ['data-support-rompu', 'événement : le message du support rompu', ['']], ['data-surface', 'plan : la surface du plan', ['']], ['data-table', 'une table, par son identifiant', null], ['data-table-panneau', 'plan : la table d’un panneau', null], ['data-terme', 'un terme expliqué par une infobulle', null], ['data-texte', 'import : le texte d’une ligne', ['']], ['data-theme', ' : le thème, clair ou sombre, que pose le script d’App', null], ['data-theme-choix', 'le bandeau : un choix de thème', null], ['data-titre', 'plan : un titre non pourvu d’une liste de travail', null], ['data-tours', 'tables : le réglage du nombre de tours', ['']], ['data-tuile', 'qualité : une tuile de l’en-tête chiffré, par le nom de sa colonne', null], ['data-valides', 'import : le compte des lignes valides', ['']], ['data-verrou', 'événement : le verrou d’une autre séance', ['']], ['data-verrou-depuis', 'événement : l’instant du verrou', ['']], ['data-verrou-seance', 'événement : la séance du verrou', ['']], ['data-version', 'accueil : la version affichée', ['']], ['data-vue', 'plan : le groupe de la vue', ['']], ['data-vue-impression', 'aperçu : la vue du document imprimé — plan, accueil ou tables', null], [ 'data-vue-qualite', 'qualité : le
qui enveloppe la carte d’une vue', ['entete', 'profil', 'collisions', 'tables', 'paires', 'objectifs', 'animateurs', 'diversite', 'performance'], ], ]; // La Map des entrées, gelée : Object.freeze ne gèle pas le contenu d'une // Map, et ses modificateurs lèvent ici. function geler(carte) { for (const nom of ['set', 'delete', 'clear']) { Object.defineProperty(carte, nom, { value: () => { throw new TypeError(`DESIGNATIONS est gelée : ${nom} refusé`); }, }); } return Object.freeze(carte); } /** Les désignations stables : attribut → { porteur, valeurs }, gelées. */ export const DESIGNATIONS = geler( new Map( ENTREES.map(([attribut, porteur, valeurs]) => [ attribut, Object.freeze({ porteur, valeurs: valeurs === null ? null : Object.freeze([...valeurs]) }), ]), ), );