# Leçon 8 — Les commandes étendues (catalogue complet)

Source : https://docs.berkios.online/reference/cent-nouvelles-commandes/ · Section : Référence · Documentation officielle BERKIOS (https://docs.berkios.online)


Ces commandes complètent celles de la [leçon 4](https://docs.berkios.online/studio/commandes-et-calculs/) pour écrire des applications généralistes (formulaires, calculs, listes, dates, exports) **sans JavaScript**. Elles fonctionnent dans le code des composants (aperçu du Studio et mode Application), en français comme en anglais.

> Ce fichier est généré par `node scripts/generate-commands-doc.mjs` à partir du catalogue réel : il ne peut pas diverger du code. Un test vérifie que toutes les commandes y figurent.

## Conventions

- **Cible** : un composant (id, nom ou libellé), une variable `$nom` ou une position `brique.x`. Les commandes « en place » (`majuscules`, `arrondir`…) modifient la cible ; les autres écrivent dans la cible **Résultat** donnée en dernier argument (ou en premier pour `somme`, `minimum`, `concatener`…).
- **Valeur** : un composant, une variable ou un texte. Dans un texte, `{Composant}` et `{$variable}` sont remplacés par leur valeur. Un nombre écrit sans guillemets (`2`, `-1`, `2,5`) est toujours un nombre.
- **Booléens** : `true` / `false`, comme une case à cocher. Exemple : `est-email "Courriel" "$ok"` puis `verifier "$ok" = "true" "Courriel invalide"`.
- **Listes** : éléments séparés par des virgules (`pomme, poire, kiwi`). Les décimaux d'une liste s'écrivent avec un point : `liste-ajouter` convertit `49,5` en `49.5` et remplace toute autre virgule par une espace.
- **Dates** : `AAAA-MM-JJ` (champ date) ; `JJ/MM/AAAA` est aussi lu. **Nombres** : la virgule et le point décimaux sont acceptés ; les résultats utilisent le point (sauf `formater-nombre`, `monnaie`).
- **Expressions régulières** (`correspond`) : dans un texte entre guillemets, écrivez `\\d` pour obtenir `\d`, ou préférez `[0-9]`.
- **Erreurs** : une commande invalide s'arrête avec un message `Script : ligne N — …` ; `quitter` arrête sans erreur. `repeter` et `sauf-si` n'acceptent pas une autre commande de contrôle (`si`, `sauf-si`, `repeter`) à l'intérieur.
- **Sécurité** : aucun `eval`, aucun JavaScript libre. Les commandes d'interface et de système passent par l'hôte du Studio ; ailleurs elles échouent avec « non pris en charge ici ».
- **Application Flutter** : depuis la v0.7.77, ces commandes s'exécutent aussi dans l'application générée (voir la [leçon 7](https://docs.berkios.online/studio/limites-runtime/) pour les différences : `imprimer` et `audio` non pris en charge, `telecharger` écrit dans Téléchargements).

## Texte (39)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `majuscules "Cible"` | `uppercase` | Met le texte en majuscules. |
| `minuscules "Cible"` | `lowercase` | Met le texte en minuscules. |
| `capitaliser "Cible"` | `capitalize` | Première lettre de chaque mot en majuscule. |
| `nettoyer "Cible"` | `trim` | Supprime les espaces inutiles (début, fin, doublons). |
| `longueur "Source" "Résultat"` | `length` | Nombre de caractères du texte. |
| `remplacer "Cible" "ancien" "nouveau"` | `replace` | Remplace toutes les occurrences d'un texte. |
| `concatener "Résultat" "A" "B" …` | `concaténer`, `concat` | Assemble plusieurs valeurs dans le résultat. |
| `sous-texte "Source" début [longueur] "Résultat"` | `substring` | Extrait une partie du texte (début à partir de 1). |
| `tronquer "Cible" nombre ["…"]` | `truncate` | Raccourcit le texte et ajoute une marque. |
| `remplir-gauche "Cible" largeur ["0"]` | `padstart` | Complète à gauche jusqu'à la largeur voulue (ex. 7 → 007). |
| `inverser "Cible"` | `reverse` | Inverse l'ordre des caractères. |
| `contient "Source" "texte" "Résultat"` | `contains` | true si le texte contient la recherche (sans tenir compte de la casse). |
| `commence-par "Source" "texte" "Résultat"` | `startswith` | true si le texte commence par la recherche. |
| `finit-par "Source" "texte" "Résultat"` | `endswith` | true si le texte finit par la recherche. |
| `position-de "Source" "texte" "Résultat"` | `indexof` | Position (à partir de 1) de la première occurrence ; 0 si absent. |
| `partie "Source" "séparateur" n "Résultat"` | `part` | Nième morceau d'un texte découpé par un séparateur (n à partir de 1). |
| `compter-texte "Source" "texte" "Résultat"` | `countof` | Nombre d'occurrences d'un texte. |
| `remplir-droite "Cible" largeur ["0"]` | `padend` | Complète à droite jusqu'à la largeur voulue (ex. 7 → 700). |
| `centrer-texte "Cible" largeur [" "]` | `center` | Centre le texte dans la largeur voulue. |
| `repeter-texte "Cible" n` | `repeat-text` | Répète le texte n fois (0 à 1000). |
| `phrase "Cible"` | `sentence-case` | Minuscules, sauf la première lettre en majuscule. |
| `inverser-casse "Cible"` | `swap-case` | Échange majuscules et minuscules. |
| `nettoyer-debut "Cible"` | `trim-start` | Supprime les espaces au début du texte. |
| `nettoyer-fin "Cible"` | `trim-end` | Supprime les espaces à la fin du texte. |
| `retirer-espaces "Cible"` | `remove-spaces` | Supprime toutes les espaces du texte. |
| `sans-accents "Cible"` | `remove-accents` | Remplace les lettres accentuées par leur forme simple (é → e). |
| `slug "Cible"` | `slugify` | Transforme le texte en identifiant d'adresse (Café de Paris → cafe-de-paris). |
| `compter-mots "Source" "Résultat"` | `wordcount` | Nombre de mots du texte. |
| `compter-lignes "Source" "Résultat"` | `linecount` | Nombre de lignes du texte (0 si vide). |
| `derniere-position "Source" "texte" "Résultat"` | `last-indexof` | Position (à partir de 1) de la dernière occurrence ; 0 si absent. |
| `avant-texte "Source" "séparateur" "Résultat"` | `text-before` | Texte situé avant la première occurrence du séparateur (vide si absent). |
| `apres-texte "Source" "séparateur" "Résultat"` | `text-after` | Texte situé après la première occurrence du séparateur (vide si absent). |
| `entre-textes "Source" "début" "fin" "Résultat"` | `text-between` | Texte compris entre deux repères (vide si l'un manque). |
| `supprimer-texte "Cible" "motif"` | `remove-text` | Supprime toutes les occurrences d'un texte. |
| `inserer-texte "Cible" position "texte"` | `insert-text` | Insère un texte à une position (à partir de 1). |
| `caractere-de "Source" n "Résultat"` | `char-at` | Nième caractère du texte (à partir de 1 ; vide si hors texte). |
| `code-caractere "Source" "Résultat"` | `char-code` | Code Unicode du premier caractère. |
| `caractere-code "Résultat" code` | `from-char-code` | Caractère correspondant à un code Unicode. |
| `initiales "Source" "Résultat"` | `initials` | Initiales des mots (Jean-Pierre Dupont → JPD). |

## Nombres et calculs (96)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `arrondir "Cible" [décimales]` | `round` | Arrondit à N décimales (0 par défaut). |
| `plancher "Cible"` | `floor` | Arrondit à l'entier inférieur. |
| `plafond "Cible"` | `ceil` | Arrondit à l'entier supérieur. |
| `absolu "Cible"` | `abs` | Valeur absolue. |
| `racine "Cible"` | `sqrt` | Racine carrée. |
| `puissance "Cible" exposant` | `power` | Élève la valeur à une puissance. |
| `modulo "Cible" diviseur` | `mod` | Reste de la division. |
| `minimum "Résultat" "A" "B" …` | `min` | Plus petite des valeurs. |
| `maximum "Résultat" "A" "B" …` | `max` | Plus grande des valeurs. |
| `somme "Résultat" "A" "B" …` | `sum` | Additionne les valeurs. |
| `moyenne "Résultat" "A" "B" …` | `average`, `avg` | Moyenne des valeurs. |
| `produit "Résultat" "A" "B" …` | `product` | Multiplie les valeurs. |
| `pourcentage "Résultat" "Partie" "Total" [décimales]` | `percent` | Partie / Total × 100. |
| `pourcent-de "Résultat" "Valeur" taux` | `percentof` | Calcule taux % d'une valeur (ex. TVA, remise). |
| `borner "Cible" minimum maximum` | `clamp` | Force la valeur à rester entre deux bornes. |
| `aleatoire "Résultat" [minimum maximum]` | `aléatoire`, `random` | Nombre entier au hasard (1 à 100 par défaut). |
| `separer-milliers "Cible" [" "]` | `séparer-milliers`, `thousands` | Groupe les chiffres par milliers (1234567 → 1 234 567). |
| `monnaie "Cible" "EUR" ["fr-FR"]` | `currency` | Met en forme un montant (devise ISO : EUR, USD, CDF…). |
| `entier "Cible"` | `integer` | Supprime la partie décimale. |
| `pgcd-multiple "Résultat" "A" "B"` | `gcd-multiple` | Plus grand commun diviseur. |
| `factorielle "Cible"` | `factorial` | Factorielle d'un entier de 0 à 170. |
| `formater-nombre "Cible" décimales` | `formatnumber` | Affiche toujours N décimales (2 → 12,50). |
| `signe-nombre "Cible"` | `sign` | Signe du nombre : −1, 0 ou 1. |
| `racine-cubique "Cible"` | `cube-root` | Racine cubique (négatifs acceptés). |
| `exponentielle "Cible"` | `exp` | e puissance la valeur. |
| `logarithme-neperien "Cible"` | `ln` | Logarithme népérien (valeur strictement positive). |
| `logarithme "Cible"` | `log10` | Logarithme décimal (valeur strictement positive). |
| `sinus "Cible"` | `sin` | Sinus d'un angle en degrés. |
| `cosinus "Cible"` | `cos` | Cosinus d'un angle en degrés. |
| `tangente "Cible"` | `tan` | Tangente d'un angle en degrés. |
| `hypotenuse "Résultat" "A" "B"` | `hypot` | Longueur de l'hypoténuse : √(A² + B²). |
| `ppcm "Résultat" "A" "B" …` | `lcm` | Plus petit commun multiple d'entiers non nuls. |
| `fibonacci "Résultat" n` | `fibo` | Nième terme de la suite de Fibonacci (n de 0 à 78). |
| `mediane "Résultat" "A" "B" …` | `median` | Médiane des valeurs. |
| `ecart-type "Résultat" "A" "B" …` | `stddev` | Écart type (population) des valeurs. |
| `variance "Résultat" "A" "B" …` | `variance-values` | Variance (population) des valeurs. |
| `arrondir-a "Cible" pas` | `round-to` | Arrondit au multiple le plus proche (ex. pas 0,05). |
| `interpoler "Résultat" "A" "B" t` | `lerp` | Valeur entre A et B : A + (B − A) × t (t de 0 à 1). |
| `variation "Résultat" "Ancien" "Nouveau" [décimales]` | `percent-change` | Variation en % entre deux valeurs. |
| `remise "Résultat" "Prix" pourcentage` | `discount` | Prix après une remise en % (2 décimales). |
| `ajouter-taxe "Résultat" "HT" taux` | `add-tax` | Prix toutes taxes comprises à partir du prix hors taxe (2 décimales). |
| `retirer-taxe "Résultat" "TTC" taux` | `remove-tax` | Prix hors taxe à partir du prix TTC (2 décimales). |
| `interets-composes "Résultat" "Capital" taux annees [periodes]` | `compound-interest` | Capital final avec intérêts composés (taux annuel en %, 2 décimales). |
| `mensualite "Résultat" "Capital" taux_annuel mois` | `loan-payment` | Mensualité d'un prêt à taux fixe (2 décimales). |
| `changer-base "Résultat" "Valeur" base_source base_cible` | `change-base` | Convertit un entier d'une base (2 à 36) à une autre. |
| `en-romain "Résultat" n` | `to-roman` | Écrit un entier de 1 à 3999 en chiffres romains. |
| `tronquer-nombre "Cible" [décimales]` | `trunc` | Supprime les décimales sans arrondir. |
| `arrondir-superieur "Cible" [décimales]` | `round-up` | Arrondit en s'éloignant de zéro. |
| `arrondir-inferieur "Cible" [décimales]` | `round-down` | Arrondit vers zéro. |
| `entier-valide "Résultat" "Valeur"` | `is-integer-value` | Retourne vrai si la valeur est un entier. |
| `est-pair-nombre "Résultat" "Valeur"` | `is-even-number` | Teste si un entier est pair. |
| `est-impair-nombre "Résultat" "Valeur"` | `is-odd-number` | Teste si un entier est impair. |
| `est-premier-nombre "Résultat" "Valeur"` | `is-prime-number` | Teste si un entier est premier. |
| `pgcd "Résultat" "A" "B" …` | `gcd` | Plus grand commun diviseur des entiers. |
| `factorielle-avancee "Résultat" n` | `factorial-extra` | Calcule n! pour 0 ≤ n ≤ 170. |
| `combinaison "Résultat" n k` | `n-choose-k` | Calcule le nombre de combinaisons C(n,k). |
| `arrangements "Résultat" n k` | `n-permute-k` | Calcule le nombre d'arrangements P(n,k). |
| `aleatoire-intervalle "Résultat" minimum maximum` | `random-int-extra` | Entier aléatoire inclusif entre minimum et maximum. |
| `aleatoire-reel "Résultat" minimum maximum` | `random-real-extra` | Nombre réel aléatoire dans [minimum, maximum). |
| `minimum-borne "Cible" minimum` | `clamp-min` | Impose une valeur minimale. |
| `maximum-borne "Cible" maximum` | `clamp-max` | Impose une valeur maximale. |
| `changer-echelle "Résultat" valeur min1 max1 min2 max2` | `map-range` | Transpose linéairement une valeur d'un intervalle vers un autre. |
| `degres-en-radians-nombre "Cible"` | `degrees-to-radians-number` | Convertit les degrés en radians. |
| `radians-en-degres-nombre "Cible"` | `radians-to-degrees-number` | Convertit les radians en degrés. |
| `arcsinus "Cible"` | `asin` | Arcsinus en degrés. |
| `arccosinus "Cible"` | `acos` | Arccosinus en degrés. |
| `arctangente "Cible"` | `atan` | Arctangente en degrés. |
| `sinus-hyperbolique "Cible"` | `sinh` | Sinus hyperbolique. |
| `cosinus-hyperbolique "Cible"` | `cosh` | Cosinus hyperbolique. |
| `tangente-hyperbolique "Cible"` | `tanh` | Tangente hyperbolique. |
| `logarithme-binaire "Cible"` | `log2` | Logarithme en base 2. |
| `logarithme-base "Résultat" valeur base` | `log-base` | Logarithme dans une base quelconque. |
| `exponentielle-moins-un "Cible"` | `expm1` | Calcule e^x − 1 avec précision près de zéro. |
| `logarithme-plus-un "Cible"` | `log1p` | Calcule ln(1+x) avec précision près de zéro. |
| `distance-3d "Résultat" x y z` | `hypot3` | Norme euclidienne en trois dimensions. |
| `distance-nombres "Résultat" A B` | `numeric-distance` | Distance absolue entre deux nombres. |
| `moyenne-ponderee "Résultat" valeur poids valeur poids …` | `weighted-mean` | Moyenne pondérée à partir de paires valeur/poids. |
| `percentile "Résultat" taux "A" "B" …` | `percentile-value` | Percentile par interpolation linéaire (taux 0 à 100). |
| `quartile "Résultat" rang "A" "B" …` | `quartile-value` | Quartile 0, 1, 2 ou 3. |
| `etendue "Résultat" "A" "B" …` | `range` | Écart entre la plus grande et la plus petite valeur. |
| `compter-nombres "Résultat" "A" "B" …` | `count-numbers` | Compte les arguments numériques valides. |
| `somme-si "Résultat" seuil "A" "B" …` | `sum-if` | Additionne les valeurs supérieures ou égales au seuil. |
| `compter-si "Résultat" seuil "A" "B" …` | `count-if` | Compte les valeurs supérieures ou égales au seuil. |
| `produit-si "Résultat" seuil "A" "B" …` | `product-if` | Multiplie les valeurs supérieures ou égales au seuil. |
| `somme-carres "Résultat" "A" "B" …` | `sum-squares` | Somme les carrés des valeurs. |
| `somme-carres-ecarts "Résultat" "A" "B" …` | `sum-squared-diffs` | Somme les carrés des écarts à la moyenne. |
| `moyenne-geometrique "Résultat" "A" "B" …` | `geometric-mean` | Moyenne géométrique des valeurs positives. |
| `moyenne-harmonique "Résultat" "A" "B" …` | `harmonic-mean` | Moyenne harmonique des valeurs positives. |
| `variance-echantillon "Résultat" "A" "B" …` | `sample-variance` | Variance d'échantillon (division par n−1). |
| `ecart-type-echantillon "Résultat" "A" "B" …` | `sample-stddev` | Écart type d'échantillon. |
| `covariance "Résultat" "A1" "A2" … "B1" "B2" …` | `covariance-value` | Covariance population de deux séries de même taille. |
| `correlation "Résultat" "A1" "A2" … "B1" "B2" …` | `correlation-value` | Coefficient de corrélation de Pearson. |
| `loi-normale-densite "Résultat" x moyenne ecart-type` | `normal-pdf` | Densité de probabilité normale. |
| `loi-normale-cdf "Résultat" x moyenne ecart-type` | `normal-cdf` | Fonction de répartition normale (approximation). |
| `partie-entiere "Cible"` | `integer-part` | Extrait la partie entière vers zéro. |
| `partie-decimale "Cible"` | `fractional-part` | Extrait la partie décimale signée. |

## Logique, variables et contrôle (18)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `copier "Source" "Cible"` | `copy` | Copie une valeur vers une cible. |
| `echanger "A" "B"` | `échanger`, `swap` | Échange les valeurs de deux cibles. |
| `par-defaut "Cible" "valeur"` | `par-défaut`, `default` | Donne une valeur si la cible est vide. |
| `est-vide "Source" "Résultat"` | `isempty` | true si la valeur est vide. |
| `est-nombre "Source" "Résultat"` | `isnumber` | true si la valeur est un nombre. |
| `choisir "Résultat" "Gauche" > "Droite" "si vrai" "si faux"` | `choose` | Place l'une de deux valeurs selon une condition. |
| `sauf-si "Cible" = "x" alors commande …` | `unless` | Exécute la commande seulement si la condition est fausse. |
| `repeter 3 [fois] commande …` | `répéter`, `repeat` | Répète une commande N fois (1000 maximum). |
| `pendant-que "Cible" < "Valeur" alors commande …` | `tant-que`, `while` | Répète une commande tant que la condition reste vraie (1000 itérations maximum). |
| `pour-chaque "$element" dans "pomme,poire" alors commande …` | `foreach` | Exécute une commande pour chaque élément d’une liste séparée par des virgules. |
| `verifier "Cible" >= 0 ["message d'erreur"]` | `vérifier`, `assert` | Arrête le script avec un message si la condition est fausse. |
| `attendre 500 [ms\|s]` | `wait`, `pause` | Attend avant la commande suivante (60 s maximum). |
| `journal "texte"` | `log` | Écrit un message dans la console de développement. |
| `inverser-booleen "Cible"` | `negate` | Inverse true / false (accepte aussi vrai, faux, oui, non, 1, 0). |
| `premier-non-vide "Résultat" "A" "B" …` | `coalesce` | Première valeur non vide parmi celles indiquées. |
| `comparer "A" "B" "Résultat"` | `compare` | −1, 0 ou 1 selon que A est inférieur, égal ou supérieur à B (nombres ou texte). |
| `chercher-cle "Résultat" "Source" "a=1, b=2" ["défaut"]` | `lookup` | Cherche la valeur associée à une clé dans une table « clé=valeur ». |
| `incrementer-modulo "Cible" pas modulo` | `increment-mod` | Ajoute un pas puis revient à 0 au bout du modulo (compteur circulaire). |

## Dates et heure (22)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `maintenant "Résultat" ["JJ/MM/AAAA HH:mm"]` | `now` | Date et heure actuelles (AAAA-MM-JJ HH:mm:ss par défaut). |
| `aujourdhui "Résultat"` | `aujourd'hui`, `today` | Date du jour (AAAA-MM-JJ). |
| `heure "Résultat"` | `time` | Heure actuelle (HH:mm:ss). |
| `ajouter-jours "Date" n` | `adddays` | Ajoute (ou retire, si négatif) des jours à une date. |
| `ajouter-mois "Date" n` | `addmonths` | Ajoute des mois à une date (jour ramené à la fin du mois si besoin). |
| `ecart-jours "Début" "Fin" "Résultat"` | `écart-jours`, `diffdays` | Nombre de jours entre deux dates (négatif si la fin précède le début). |
| `jour-semaine "Date" "Résultat" [en]` | `weekday` | Nom du jour de la semaine (français, ou anglais avec « en »). |
| `formater-date "Cible" "JJ/MM/AAAA"` | `formatdate` | Change le format d'une date (AAAA, MM, JJ, HH, mm, ss). |
| `age "Naissance" "Résultat"` | `âge` | Âge en années complètes à partir d'une date de naissance. |
| `horodatage "Résultat"` | `timestamp` | Secondes écoulées depuis 1970 (identifiant temporel). |
| `ajouter-annees "Date" n` | `add-years` | Ajoute (ou retire) des années à une date ; le 29 février devient le 28 si besoin. |
| `debut-mois "Date"` | `start-of-month` | Premier jour du mois de la date. |
| `fin-mois "Date"` | `end-of-month` | Dernier jour du mois de la date. |
| `debut-semaine "Date"` | `start-of-week` | Lundi de la semaine de la date. |
| `jours-dans-mois "Date" "Résultat"` | `days-in-month` | Nombre de jours du mois de la date. |
| `numero-semaine "Date" "Résultat"` | `week-number` | Numéro de semaine ISO (1 à 53). |
| `jour-annee "Date" "Résultat"` | `day-of-year` | Rang du jour dans l'année (1 à 366). |
| `trimestre "Date" "Résultat"` | `quarter` | Trimestre de la date (1 à 4). |
| `nom-mois "Date" "Résultat" [en]` | `month-name` | Nom du mois (français, ou anglais avec « en »). |
| `ecart-mois "Début" "Fin" "Résultat"` | `diff-months` | Nombre de mois entiers entre deux dates (négatif si la fin précède le début). |
| `ajouter-jours-ouvres "Date" n` | `add-business-days` | Ajoute (ou retire) des jours ouvrés, week-ends exclus. |
| `prochain-jour "Date" "lundi"` | `next-weekday` | Date du prochain jour de la semaine demandé (strictement après la date). |

## Listes (29)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `liste-ajouter "Liste" "élément"` | `listadd` | Ajoute un élément à la fin de la liste. |
| `liste-retirer "Liste" "élément"` | `listremove` | Retire la première occurrence d'un élément. |
| `liste-taille "Liste" "Résultat"` | `listcount` | Nombre d'éléments de la liste. |
| `liste-element "Liste" n "Résultat"` | `liste-élément`, `listget` | Lit le Nième élément (à partir de 1 ; −1 = dernier). |
| `liste-trier "Liste" [decroissant]` | `listsort` | Trie la liste (nombres ou texte). |
| `liste-unique "Liste"` | `listunique` | Supprime les doublons. |
| `liste-inverser "Liste"` | `listreverse` | Inverse l'ordre des éléments. |
| `liste-joindre "Liste" "séparateur" "Résultat"` | `listjoin` | Assemble les éléments avec un séparateur (ex. " - "). |
| `liste-contient "Liste" "élément" "Résultat"` | `listcontains` | true si l'élément est dans la liste. |
| `liste-somme "Liste" "Résultat"` | `listsum` | Somme des nombres de la liste. |
| `liste-max "Liste" "Résultat"` | `listmax` | Plus grand nombre de la liste. |
| `liste-min "Liste" "Résultat"` | `listmin` | Plus petit nombre de la liste. |
| `liste-melanger "Liste"` | `liste-mélanger`, `listshuffle` | Mélange les éléments au hasard. |
| `liste-position "Liste" "élément" "Résultat"` | `list-indexof` | Position (à partir de 1) d'un élément ; 0 si absent. |
| `liste-inserer "Liste" n "élément"` | `list-insert` | Insère un élément à la position n (à partir de 1). |
| `liste-modifier "Liste" n "élément"` | `list-set` | Remplace le Nième élément de la liste. |
| `liste-retirer-position "Liste" n` | `list-removeat` | Retire le Nième élément de la liste. |
| `liste-premier "Liste" "Résultat"` | `list-first` | Premier élément de la liste (vide si elle est vide). |
| `liste-dernier "Liste" "Résultat"` | `list-last` | Dernier élément de la liste (vide si elle est vide). |
| `liste-extraire "Liste" début nombre` | `list-slice` | Ne garde que « nombre » éléments à partir de la position « début ». |
| `liste-prendre "Liste" n` | `list-take` | Garde les n premiers éléments. |
| `liste-sauter "Liste" n` | `list-skip` | Retire les n premiers éléments. |
| `liste-moyenne "Liste" "Résultat"` | `list-average` | Moyenne des nombres de la liste. |
| `liste-garder "Liste" "texte"` | `list-keep` | Ne garde que les éléments contenant le texte. |
| `liste-ecarter "Liste" "texte"` | `list-drop` | Retire les éléments contenant le texte. |
| `liste-fusionner "Liste" "Autre"` | `list-merge` | Ajoute à la liste les éléments d'une autre liste. |
| `liste-commun "Liste" "Autre"` | `list-common` | Ne garde que les éléments présents aussi dans l'autre liste. |
| `liste-difference "Liste" "Autre"` | `list-diff` | Retire les éléments présents dans l'autre liste. |
| `liste-compter "Liste" "élément" "Résultat"` | `list-countof` | Nombre d'occurrences d'un élément. |

## Validation de saisie (16)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `est-email "Source" "Résultat"` | `isemail` | true si la valeur ressemble à une adresse e-mail. |
| `est-url "Source" "Résultat"` | `isurl` | true si la valeur est une adresse http(s) valide. |
| `est-date "Source" "Résultat"` | `isdate` | true si la valeur est une date réelle (29/02/2023 → false). |
| `correspond "Source" "motif" "Résultat"` | `matches` | true si le texte correspond à une expression régulière (motif de 200 caractères max). |
| `est-entre "Source" minimum maximum "Résultat"` | `isbetween` | true si le nombre est compris entre deux bornes (incluses). |
| `obligatoire "Champ1" "Champ2" …` | `required` | Arrête le script si un champ est vide. |
| `est-entier "Source" "Résultat"` | `is-integer` | true si la valeur est un nombre entier. |
| `est-pair "Source" "Résultat"` | `is-even` | true si la valeur est un entier pair. |
| `est-impair "Source" "Résultat"` | `is-odd` | true si la valeur est un entier impair. |
| `est-premier "Source" "Résultat"` | `is-prime` | true si la valeur est un nombre premier (jusqu'à 10¹²). |
| `est-alphabetique "Source" "Résultat"` | `is-alpha` | true si la valeur ne contient que des lettres. |
| `est-telephone "Source" "Résultat"` | `is-phone` | true si la valeur ressemble à un numéro de téléphone (8 à 15 chiffres, + facultatif). |
| `est-ip "Source" "Résultat"` | `is-ip` | true si la valeur est une adresse IPv4. |
| `est-couleur-hexa "Source" "Résultat"` | `is-hex-color` | true si la valeur est une couleur #RGB ou #RRGGBB. |
| `est-bissextile "Source" "Résultat"` | `is-leap-year` | true si l'année (ou la date) est bissextile. |
| `est-week-end "Date" "Résultat"` | `is-weekend` | true si la date tombe un samedi ou un dimanche. |

## Encodage et identifiants (11)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `encoder-base64 "Cible"` | `base64encode` | Encode le texte en Base64. |
| `decoder-base64 "Cible"` | `décoder-base64`, `base64decode` | Décode un texte Base64. |
| `encoder-url "Cible"` | `urlencode` | Encode le texte pour une adresse web. |
| `decoder-url "Cible"` | `décoder-url`, `urldecode` | Décode un texte d'adresse web. |
| `identifiant "Résultat"` | `uuid` | Identifiant unique universel (UUID v4). |
| `empreinte "Source" "Résultat"` | `hash` | Empreinte SHA-256 d'un texte (64 caractères hexadécimaux). |
| `encoder-html "Cible"` | `html-encode` | Remplace & < > " ' par leurs entités HTML. |
| `decoder-html "Cible"` | `html-decode` | Transforme les entités HTML courantes en caractères. |
| `rot13 "Cible"` | `rot-13` | Chiffrement ROT13 des lettres A–Z (appliquer deux fois redonne le texte). |
| `somme-controle "Source" "Résultat"` | `crc-32` | Somme de contrôle CRC-32 du texte (8 chiffres hexadécimaux). |
| `cesar "Cible" decalage` | `caesar` | Chiffrement de César : décale les lettres A–Z de n rangs (négatif accepté). |

## Conversion d'unités (1)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `convertir "Valeur" "km" "mi" "Résultat"` | `convert` | Convertit des unités (longueur, masse, volume, durée, surface, vitesse, données, température). |

## Interface (8)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `basculer-barre-laterale` | `basculer-barre-latérale`, `toggle-sidebar`, `toggle-sidebar-navigation` | Affiche ou masque la barre latérale du shell et agrandit automatiquement la zone de contenu. |
| `activer "Cible"` | `enable` | Rend un composant utilisable. |
| `desactiver "Cible"` | `désactiver`, `disable` | Rend un composant inutilisable (grisé). |
| `focaliser "Cible"` | `focus` | Place le curseur dans un champ. |
| `cocher "Case"` | `check` | Coche une case. |
| `decocher "Case"` | `décocher`, `uncheck` | Décoche une case. |
| `couleur "Cible" "#ff0000" [fond]` | `color` | Change la couleur du texte (ou du fond avec « fond »). |
| `animer "Cible" secousse\|secousse-verticale\|pulsation\|fondu\|fondu-entree\|rebond\|rotation\|zoom\|glisser-gauche\|glisser-droite\|glisser-haut\|glisser-bas` | `animate` | Anime un composant ciblé par son identifiant, son nom ou son libellé. |

## Système et fichiers (7)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `copier-presse-papiers "Source"` | `clipboard` | Copie une valeur dans le presse-papiers. |
| `telecharger "nom.txt" "Source"` | `télécharger`, `download` | Enregistre une valeur dans un fichier texte (.txt, .csv, .json…). |
| `dossier-supprimer-virtuel "Dossier"` | `delete-virtual-folder` | Supprime récursivement un dossier et son contenu dans l'espace virtuel de l'application. Ne touche jamais au disque. |
| `imprimer` | `print` | Ouvre la boîte d'impression. |
| `confirmer "Question ?" "Résultat"` | `confirm` | Pose une question Oui/Non ; le résultat vaut true ou false. |
| `demander "Question" "Résultat" ["valeur par défaut"]` | `ask` | Demande une saisie à l'utilisateur (vide si annulé). |
| `oublier "clé"` | `forget` | Supprime une valeur mémorisée avec « stocker ». |

## Fichiers sur disque (7)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `ouvrir-dossier-autorise "$chemin"` | `authorize-external-folder-native` | Ouvre un sélecteur natif pour autoriser un dossier externe. Les chemins absolus situés dans ce dossier seront accessibles jusqu'à la fermeture de l'application. |
| `lire-url-texte "https://exemple.org/rapport.txt" "$contenu"` | `read-url-native` | Lit le contenu texte d'une URL HTTP/HTTPS publique (limite de 10 Mio, délai de 15 secondes, dépend des règles CORS du serveur). |
| `disque-lire "chemin/relatif.txt" "$resultat"` | `workspace-read` | Lit un fichier texte existant dans le répertoire de travail autorisé de BERKIOS. Le chemin est relatif au répertoire de travail. |
| `disque-ecrire "chemin/relatif.txt" "contenu"` | `workspace-write` | Écrit un fichier UTF-8 dans le répertoire de travail autorisé. Crée les dossiers parents si nécessaire. |
| `disque-lister "dossier" "$resultat"` | `workspace-list` | Liste les fichiers et sous-dossiers du répertoire de travail, un élément par ligne. |
| `disque-dossier-creer "dossier/sous-dossier"` | `workspace-mkdir` | Crée un dossier dans le répertoire de travail autorisé. |
| `disque-dossier-supprimer "dossier/sous-dossier"` | `workspace-rmdir` | Supprime récursivement un dossier du répertoire de travail. Le répertoire de travail lui-même ne peut jamais être supprimé. |

## Appareil natif (2)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `niveau-batterie "$niveau"` | `batterie-niveau`, `battery-level` | Lit le niveau de batterie (0–100 %) dans une application Flutter générée ; non disponible dans l’aperçu Web du Studio. |
| `etat-batterie "$etat"` | `état-batterie`, `batterie-etat`, `battery-state` | Lit l’état de batterie (charge, décharge, pleine ou branchée) dans une application Flutter générée. |

## Canevas de jeu (jeux 2D, bibliothèque MyGame) (13)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `canevas-effacer "Canevas" ["#ffffff"]` | `canvas-clear` | Commence une nouvelle image : vide le tampon de dessin et le remplit avec la couleur de fond (transparent par défaut). |
| `canevas-rect "Canevas" x y largeur hauteur "#535353" [contour [épaisseur]]` | `canevas-rectangle`, `canvas-rect` | Dessine un rectangle plein (ou son contour avec « contour »). |
| `canevas-ligne "Canevas" x1 y1 x2 y2 "#535353" [épaisseur]` | `canvas-line` | Trace une ligne. |
| `canevas-cercle "Canevas" x y rayon "#535353" [contour [épaisseur]]` | `canvas-circle` | Dessine un disque (ou un cercle avec « contour »). |
| `canevas-texte "Canevas" x y "Texte" [taille] ["#535353"] [gauche\|centre\|droite]` | `canvas-text` | Écrit un texte à chasse fixe ({Composant} et {$variable} sont remplacés). |
| `canevas-sprite "Canevas" x y "..##/.####/..##." [échelle] ["#535353"]` | `canvas-sprite` | Dessine une image en pixels : lignes séparées par « / », « . » ou espace = transparent, tout autre caractère = pixel plein. |
| `canevas-afficher "Canevas"` | `canvas-present` | Affiche l'image dessinée depuis le dernier « canevas-effacer » (double tampon : pas de scintillement). |
| `solitaire-new "Canevas" [1\|3]` | `solitaire-new` | Initialise et dessine une partie Klondike. |
| `solitaire-draw "Canevas"` | `solitaire-draw` | Pioche ou recycle la défausse. |
| `solitaire-move "Canevas" source index offset destination index` | `solitaire-move` | Utilisez les interactions par coordonnées pour déplacer les cartes. |
| `solitaire-undo "Canevas"` | `solitaire-undo` | Annule le dernier coup. |
| `solitaire-render "Canevas"` | `solitaire-render` | Redessine le plateau Klondike. |
| `solitaire-tap "Canevas" x y` | `solitaire-tap` | Traite les clics sur la pioche, les cartes et les fondations. |

## Couleurs (6)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `rgb-en-hexa "Résultat" rouge vert bleu` | `rgb-to-hex` | Couleur #rrggbb à partir de trois composantes de 0 à 255. |
| `hexa-en-rgb "Source" "Résultat"` | `hex-to-rgb` | Composantes « r, g, b » d'une couleur #RGB ou #RRGGBB. |
| `eclaircir-couleur "Cible" pourcent` | `lighten` | Éclaircit une couleur en la mélangeant avec du blanc. |
| `assombrir-couleur "Cible" pourcent` | `darken` | Assombrit une couleur en la mélangeant avec du noir. |
| `melanger-couleurs "Résultat" "Couleur1" "Couleur2" [pourcent]` | `mix-colors` | Mélange deux couleurs (pourcent = part de la seconde, 50 par défaut). |
| `couleur-lisible "Source" "Résultat"` | `readable-text-color` | Noir ou blanc, selon ce qui se lit le mieux sur la couleur de fond. |

## Interface avancée (29)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `naviguer-vers "Route" [parametres]` | `navigate-to` | Navigue vers une route. |
| `fermer ["Interface"]` | `close` | Ferme l'interface nommée (ex. fermer "interface_1") ; sans argument, ferme l'interface courante. |
| `redimensionner ["Interface"] largeur hauteur` | `resize` | Change la largeur et la hauteur de l'interface (en pixels). |
| `geometrie ["Interface"] largeur hauteur [x y]` | `géométrie`, `geometry` | Définit par le code la taille (largeur × hauteur) et, en option, la position (x y) de l'interface. |
| `plein-ecran ["Interface"] [vrai\|faux\|basculer]` | `plein-écran`, `fullscreen` | Active, désactive ou bascule le plein écran de l'interface (sans option : active). |
| `naviguer-retour` | `navigate-back` | Revient à la route précédente. |
| `parametre-route "Nom" "Résultat"` | `route-param` | Lit un paramètre de route. |
| `dialogue-ouvrir "Titre" "Contenu"` | `dialog-open` | Ouvre une modale. |
| `dialogue-fermer` | `dialog-close` | Ferme la modale active. |
| `menu-contextuel "Cible" "Options"` | `context-menu` | Affiche un menu contextuel. |
| `onglet-activer "Onglet"` | `tab-activate` | Active un onglet. |
| `tableau-ligne-selectionner "Tableau" "Index"` | `table-row-select` | Sélectionne une ligne. |
| `tableau-colonne-trier "Tableau" "Colonne"` | `table-sort` | Trie par colonne. |
| `tableau-filtrer "Tableau" "Colonne" "Valeur"` | `table-filter` | Filtre un tableau. |
| `grille-donnees "Cible" "JSON"` | `data-grid` | Configure une grille de données JSON. |
| `graphique-afficher "Cible" barres\|courbes "JSON"` | `chart-show` | Affiche un graphique à barres ou courbes. |
| `carte-afficher "Cible" "JSON"` | `map-show` | Affiche une carte. |
| `kanban "Cible" "JSON"` | `kanban-board` | Configure un tableau Kanban. |
| `calendrier-afficher "Cible" "JSON"` | `calendar-show` | Affiche un calendrier. |
| `drag-drop "Source" "Destination"` | `drag-and-drop` | Déplace un élément par glisser-déposer. |
| `tooltip "Cible" "Texte"` | `tooltip-show` | Définit une infobulle. |
| `toast "Message" [type]` | `toast-notification` | Affiche une notification temporaire. |
| `etat-chargement "Cible" vrai\|faux` | `loading-state` | Active ou désactive l’état de chargement. |
| `skeleton "Cible" vrai\|faux` | `skeleton-toggle` | Active ou désactive un squelette de chargement. |
| `pagination "Cible" "Page" "Taille"` | `pagination-configure` | Configure la pagination. |
| `accessibilite-verifier "Cible"` | `accessibility-check` | Vérifie l’accessibilité. |
| `contraste-verifier "Cible"` | `contrast-check` | Vérifie le contraste. |
| `theme-changer clair\|sombre\|systeme` | `theme-change` | Change le thème. |
| `responsive-verifier "Cible"` | `responsive-check` | Vérifie le comportement responsive. |

## Classeur Excel (34)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `feuille-activer "Feuille"` | `sheet-activate` | Affiche la feuille (son interface) et en fait la feuille active pour les références sans nom de feuille (VBA : Sheets("X").Activate). |
| `feuille-visibilite "Feuille" visible\|masquee\|tres-masquee` | `feuille-visibilité`, `sheet-visibility` | Affiche ou masque une feuille (VBA : Sheets("X").Visible = …) ; « tres-masquee » = xlSheetVeryHidden. |
| `feuille-imprimer` | `sheet-print` | Imprime la feuille active (sa zone d'impression seulement, sans l'interface du Studio ni le bouton Berkios AI) (VBA : ActiveSheet.PrintOut). |
| `feuille-exporter-pdf "Fichier.pdf"` | `sheet-export-pdf` | Exporte la feuille active en PDF — uniquement sa zone d'impression, sous le nom du fichier indiqué (VBA : ExportAsFixedFormat xlTypePDF). |
| `cellule-ecrire "Réf" valeur` | `cellule-écrire`, `cell-write` | Écrit une valeur dans une cellule : « G7 » (feuille active) ou « FACTURE!G7 » (VBA : Range("G7") = …). |
| `cellule-lire "Réf" "Résultat"` | `cell-read` | Lit la valeur d'une cellule dans la cible (VBA : x = Range("G7").Value). |
| `cellule-vider "Plage"` | `cell-clear` | Vide le contenu d'une cellule ou d'une plage « G7:G10 » (VBA : ClearContents). |
| `cellule-selectionner "Réf"` | `cellule-sélectionner`, `cell-select` | Place la sélection sur une cellule (VBA : Range("G9").Select). |
| `cellule-decaler "Réf" lignes colonnes "Résultat"` | `cellule-décaler`, `cell-offset` | Adresse de la cellule décalée de N lignes / M colonnes (VBA : cellule.Offset(0, 1)). |
| `table-compter "Table" "Colonne" "Résultat"` | `table-count` | Nombre de valeurs numériques d'une colonne de tableau (VBA : WorksheetFunction.Count). |
| `table-maximum "Table" "Colonne" "Résultat"` | `table-max` | Plus grande valeur d'une colonne de tableau (VBA : WorksheetFunction.Max). |
| `table-minimum "Table" "Colonne" "Résultat"` | `table-min` | Plus petite valeur d'une colonne de tableau (VBA : WorksheetFunction.Min). |
| `table-somme "Table" "Colonne" "Résultat"` | `table-sum` | Somme d'une colonne de tableau (VBA : WorksheetFunction.Sum). |
| `table-moyenne "Table" "Colonne" "Résultat"` | `table-average` | Moyenne d'une colonne de tableau (VBA : WorksheetFunction.Average). |
| `table-ligne-ajouter "Table" "Résultat"` | `table-row-add` | Ajoute une ligne vide à la fin du tableau ; le résultat identifie la ligne (VBA : ListRows.Add). |
| `table-cellule-ecrire "Table" "Ligne" colonne valeur` | `table-cellule-écrire`, `table-cell-write` | Écrit dans une colonne (numéro à partir de 1, ou nom) de la ligne identifiée par table-ligne-ajouter (VBA : ligne.Range(1, 2) = …). |
| `table-chercher "Table" "Colonne" valeur "Résultat"` | `table-find` | Adresse de la première cellule de la colonne égale à la valeur (sans tenir compte de la casse), vide si absente (VBA : Range.Find(…, Lookat:=xlWhole) puis Is Nothing). |
| `ligne-supprimer "Réf"` | `row-delete` | Supprime la ligne entière de la cellule indiquée (VBA : cellule.EntireRow.Delete). |
| `enregistrement-prochaine-ligne "Feuille" "Résultat"` | `record-next` | Numéro de la prochaine ligne libre de la feuille, sous le dernier enregistrement (VBA : Cells(Rows.Count, 1).End(xlUp).Row + 1). |
| `enregistrement-compter "Feuille" "Résultat"` | `record-count` | Nombre d'enregistrements (lignes de données sous la ligne d'en-têtes) de la feuille. |
| `enregistrement-chercher "Feuille" "Résultat" "Colonne" valeur ["Colonne2" valeur2 …]` | `record-find` | Numéro de la première ligne dont les colonnes valent les valeurs données (casse, accents et espaces ignorés), vide si aucune : sert à détecter un doublon (VBA : CountIf / Range.Find). |
| `enregistrement-ajouter "Feuille" "Résultat" "Colonne" valeur ["Colonne2" valeur2 …]` | `record-add` | Écrit une nouvelle ligne sous le dernier enregistrement (formules des colonnes non données recopiées, totaux étendus) ; le résultat est son numéro de ligne. |
| `enregistrement-ajouter-unique "Feuille" "Résultat" "ColonneUnique" valeur ["Colonne2" valeur2 …]` | `record-add-unique` | Comme enregistrement-ajouter, mais refuse (erreur « Doublon ») si la première colonne donnée contient déjà cette valeur. |
| `enregistrement-modifier "Feuille" ligne "Colonne" valeur ["Colonne2" valeur2 …]` | `record-update` | Modifie les colonnes données de la ligne indiquée (numéro obtenu par enregistrement-chercher) ; les autres cellules sont conservées. |
| `enregistrement-supprimer "Feuille" ligne` | `record-delete` | Supprime la ligne indiquée : les lignes du dessous remontent et les formules sont ajustées (VBA : Rows(n).Delete). |
| `table-trier "Table" "Colonne" croissant\|decroissant` | `xl-table-sort` | Trie le tableau sur une colonne (nom, numéro ou cellule d'en-tête « B9 ») (VBA : Range.Sort). |
| `table-filtrer "Table" colonne valeur` | `xl-table-filter` | Filtre le tableau : ne garde que les lignes dont la colonne (numéro ou nom) égale la valeur (VBA : AutoFilter champ, critère). |
| `table-filtre-effacer "Table"` | `table-filter-clear` | Retire le filtre du tableau et réaffiche toutes les lignes (VBA : AutoFilter.ShowAllData). |
| `classeur-enregistrer` | `workbook-save` | Enregistre le classeur (VBA : ThisWorkbook.Save). |
| `classeur-chemin "Résultat"` | `workbook-path` | Dossier du classeur (VBA : ThisWorkbook.Path). |
| `application-quitter` | `application-quit` | Ferme l'application (VBA : Application.Quit). |
| `application-visible vrai\|faux` | `app-visible` | Affiche ou cache la fenêtre de l'application (VBA : Application.Visible = …). |
| `application-option "barre-formule\|barre-etat\|ruban\|onglets" vrai\|faux` | `app-option` | Affiche ou masque un élément de l'environnement (VBA : DisplayFormulaBar, DisplayStatusBar, ExecuteExcel4Macro "SHOW.TOOLBAR…"). |
| `interface-fermer` | `interface-close` | Ferme l'interface courante (VBA : Unload Me) ; l'événement « quand fermeture » reçoit $modefermeture = 1. |

## Sécurité & identité (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `masquer-identifiant "Source" "Résultat"` | `mask-identifier` | Masque une partie d’un identifiant. |
| `valider-email-strict "Source" "Résultat"` | `validate-email-strict` | Vérifie la structure d’une adresse e-mail. |
| `normaliser-telephone "Source" "Résultat"` | `normalize-phone` | Conserve les chiffres et un éventuel + initial. |
| `force-mot-de-passe "Source" "Résultat"` | `password-strength` | Évalue la robustesse indicative d’un mot de passe. |
| `generer-code "Résultat" [longueur]` | `generate-code` | Génère un code alphanumérique aléatoire. |
| `anonymiser-texte "Source" "Résultat"` | `redact-text` | Remplace les séquences numériques longues par des astérisques. |
| `valider-url "Source" "Résultat"` | `validate-url` | Vérifie une URL HTTP ou HTTPS. |
| `extraire-domaine "Source" "Résultat"` | `extract-domain` | Extrait le domaine d’une adresse URL ou e-mail. |
| `generer-identifiant "Résultat"` | `generate-uuid` | Génère un identifiant UUID v4. |
| `egalite-securisee "A" "B" "Résultat"` | `secure-equal` | Compare deux chaînes sans arrêt au premier caractère différent. |

## Géographie & cartographie (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `valider-latitude "Source" "Résultat"` | `validate-latitude` | Vérifie une latitude entre -90 et 90. |
| `valider-longitude "Source" "Résultat"` | `validate-longitude` | Vérifie une longitude entre -180 et 180. |
| `distance-haversine "Lat1" "Lon1" "Lat2" "Lon2" "Résultat"` | `haversine-distance` | Calcule une distance approximative en kilomètres. |
| `degres-en-radians "Source" "Résultat"` | `degrees-to-radians` | Convertit les degrés en radians. |
| `radians-en-degres "Source" "Résultat"` | `radians-to-degrees` | Convertit les radians en degrés. |
| `direction-cardinale "Azimut" "Résultat"` | `cardinal-direction` | Convertit un azimut en direction cardinale. |
| `formater-coordonnees "Latitude" "Longitude" "Résultat"` | `format-coordinates` | Formate une paire de coordonnées. |
| `quadrant-coordonnees "Latitude" "Longitude" "Résultat"` | `coordinate-quadrant` | Indique les hémisphères Nord/Sud et Est/Ouest. |
| `aire-rectangle "Largeur" "Hauteur" "Résultat"` | `rectangle-area` | Calcule l’aire d’un rectangle. |
| `perimetre-rectangle "Largeur" "Hauteur" "Résultat"` | `rectangle-perimeter` | Calcule le périmètre d’un rectangle. |

## Santé & laboratoire (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `indice-masse-corporelle "PoidsKg" "TailleM" "Résultat"` | `body-mass-index` | Calcule l’IMC sans produire de diagnostic. |
| `surface-corporelle "PoidsKg" "TailleCm" "Résultat"` | `body-surface-area` | Estime la surface corporelle avec Mosteller. |
| `temperature-fahrenheit "Celsius" "Résultat"` | `convert-celsius-fahrenheit` | Convertit Celsius en Fahrenheit. |
| `temperature-celsius "Fahrenheit" "Résultat"` | `convert-fahrenheit-celsius` | Convertit Fahrenheit en Celsius. |
| `calculer-debit "VolumeMl" "DureeHeures" "Résultat"` | `calculate-flow-rate` | Calcule un débit ml/h ; vérifier par un professionnel. |
| `convertir-mg-g "SourceMg" "Résultat"` | `mg-to-g` | Convertit les milligrammes en grammes. |
| `convertir-g-mg "SourceG" "Résultat"` | `g-to-mg` | Convertit les grammes en milligrammes. |
| `dans-intervalle "Valeur" "Min" "Max" "Résultat"` | `in-reference-range` | Teste l’appartenance à un intervalle fourni. |
| `age-en-annees "DateNaissance" "Résultat"` | `age-in-years` | Calcule l’âge révolu depuis AAAA-MM-JJ. |
| `pression-format "Systolique" "Diastolique" "Résultat"` | `format-blood-pressure` | Formate une valeur systolique/diastolique sans interprétation clinique. |

## Finance & comptabilité (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `calculer-tva "Base" "Taux" "Résultat"` | `calculate-vat` | Calcule le montant de TVA. |
| `prix-hors-taxe "TTC" "Taux" "Résultat"` | `price-before-tax` | Retrouve le montant HT depuis TTC et un taux. |
| `prix-ttc "HT" "Taux" "Résultat"` | `price-with-tax` | Calcule un prix toutes taxes comprises. |
| `appliquer-remise "Prix" "Taux" "Résultat"` | `apply-discount` | Applique une remise en pourcentage. |
| `taux-marge "Cout" "Vente" "Résultat"` | `margin-rate` | Calcule le taux de marge sur coût. |
| `coefficient-multiplicateur "Cout" "Vente" "Résultat"` | `markup-factor` | Calcule le coefficient de vente. |
| `interet-simple "Capital" "Taux" "Annees" "Résultat"` | `simple-interest` | Calcule un intérêt simple. |
| `capitalise "Capital" "Taux" "Periodes" "Résultat"` | `annual-compound` | Calcule un capital avec intérêts composés annuels. |
| `mensualite-simple "Capital" "Mois" "Résultat"` | `monthly-installment` | Estime une mensualité sans intérêts. |
| `solde-debit-credit "Debit" "Credit" "Résultat"` | `debit-credit-balance` | Calcule débit moins crédit. |

## Sciences & statistiques (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `stat-mediane "Résultat" valeur1 valeur2 …` | `stat-median` | Calcule la médiane des valeurs. |
| `variance-population "Résultat" valeur1 valeur2 …` | `population-variance` | Calcule la variance de population. |
| `ecart-type-population "Résultat" valeur1 valeur2 …` | `population-standard-deviation` | Calcule l’écart-type de population. |
| `etendue-statistique "Résultat" valeur1 valeur2 …` | `statistical-range` | Calcule max moins min. |
| `score-z "Valeur" "Moyenne" "EcartType" "Résultat"` | `z-score` | Calcule un score z. |
| `interpolation-lineaire "X" "X1" "Y1" "X2" "Y2" "Résultat"` | `linear-interpolation` | Interpole linéairement entre deux points. |
| `sinus-degres "Angle" "Résultat"` | `sine-degrees` | Sinus d’un angle exprimé en degrés. |
| `cosinus-degres "Angle" "Résultat"` | `cosine-degrees` | Cosinus d’un angle exprimé en degrés. |
| `logarithme-naturel "Source" "Résultat"` | `natural-log` | Calcule le logarithme naturel. |
| `exponentielle-naturelle "Source" "Résultat"` | `natural-exponential` | Calcule l’exponentielle. |

## Réseau & API (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `encoder-parametre-url "Source" "Résultat"` | `url-encode` | Encode une valeur pour un paramètre URL. |
| `decoder-parametre-url "Source" "Résultat"` | `url-decode` | Décode une valeur URL. |
| `encoder-base64-texte "Cible"` | `base64-text-encode` | Encode du texte en Base64 UTF-8. |
| `decoder-base64-texte "Cible"` | `base64-text-decode` | Décode du Base64 UTF-8. |
| `extraire-parametre-url "URL" "Nom" "Résultat"` | `url-query-param` | Lit un paramètre de query string. |
| `extraire-hote-url "URL" "Résultat"` | `url-host` | Extrait l’hôte d’une URL. |
| `extraire-chemin-url "URL" "Résultat"` | `url-path` | Extrait le chemin d’une URL. |
| `joindre-url "Base" "Chemin" "Résultat"` | `join-url` | Assemble une URL sans double slash intermédiaire. |
| `valider-json "Source" "Résultat"` | `validate-json` | Vérifie qu’un texte est un JSON valide. |
| `formater-json "Source" "Résultat"` | `pretty-json` | Formate un JSON avec indentation. |

## Documents & publication (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `document-compter-mots "Source" "Résultat"` | `document-word-count` | Compte les mots d’un texte. |
| `document-compter-lignes "Source" "Résultat"` | `document-line-count` | Compte les lignes d’un texte. |
| `compter-phrases "Source" "Résultat"` | `sentence-count` | Compte les phrases selon la ponctuation usuelle. |
| `creer-slug "Source" "Résultat"` | `create-slug` | Transforme un titre en slug URL. |
| `echapper-csv "Source" "Résultat"` | `escape-csv` | Échappe un champ CSV entre guillemets. |
| `echapper-markdown "Source" "Résultat"` | `escape-markdown` | Échappe les caractères Markdown principaux. |
| `retirer-html "Source" "Résultat"` | `strip-html` | Retire les balises HTML et décode les espaces usuels. |
| `normaliser-paragraphes "Source" "Résultat"` | `normalize-paragraphs` | Uniformise les retours à la ligne et espaces. |
| `document-initiales "Source" "Résultat"` | `document-initials` | Extrait les initiales des mots. |
| `temps-lecture "Source" "Résultat"` | `reading-time` | Estime le temps de lecture à 200 mots/minute. |

## Commerce & logistique (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `generer-reference-produit "Nom" "Résultat"` | `generate-sku` | Construit une référence produit courte à partir du nom. |
| `valider-ean13 "Source" "Résultat"` | `validate-ean13` | Vérifie la clé de contrôle EAN-13. |
| `valider-quantite "Source" "Résultat"` | `validate-quantity` | Vérifie une quantité non négative. |
| `stock-apres-mouvement "Stock" "Entree" "Sortie" "Résultat"` | `stock-after-movement` | Calcule le stock après entrées et sorties. |
| `total-commande "Resultat" prix1 quantite1 prix2 quantite2 …` | `order-total` | Calcule le total de paires prix/quantité. |
| `nombre-colis "Quantite" "ParColis" "Résultat"` | `package-count` | Calcule le nombre de colis nécessaires. |
| `poids-total "PoidsUnitaire" "Quantite" "Résultat"` | `total-weight` | Calcule le poids total. |
| `volume-colis "Longueur" "Largeur" "Hauteur" "Résultat"` | `package-volume` | Calcule le volume cubique. |
| `seuil-reapprovisionnement "VenteJour" "DelaiJours" "StockSecurite" "Résultat"` | `reorder-threshold` | Calcule un seuil de réapprovisionnement. |
| `benefice-brut "Ventes" "Cout" "Résultat"` | `gross-profit` | Calcule le bénéfice brut. |

## Éducation & pédagogie (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `convertir-note "Note" "Sur" "Bareme" "Résultat"` | `convert-grade` | Convertit une note vers un autre barème. |
| `moyenne-notes "Résultat" note1 note2 …` | `grade-average` | Calcule une moyenne de notes. |
| `mention-note "NoteSur20" "Résultat"` | `grade-mention` | Attribue une mention indicative sur 20. |
| `admis-ou-echec "Note" "Seuil" "Résultat"` | `pass-or-fail` | Teste si une note atteint le seuil. |
| `rang-simple "Note" "ListeNotes" "Résultat"` | `simple-rank` | Calcule le rang d’une note dans une liste séparée par virgules. |
| `progression-pedagogique "Faits" "Total" "Résultat"` | `learning-progress` | Calcule un taux de progression. |
| `trimestre-date "Date" "Résultat"` | `date-trimester` | Détermine le trimestre civil d’une date. |
| `semaine-annee "Date" "Résultat"` | `week-of-year` | Retourne le numéro ISO de semaine. |
| `jours-entre-dates "Date1" "Date2" "Résultat"` | `days-between-dates` | Nombre de jours entre deux dates ISO. |
| `note-lettre "NoteSur100" "Résultat"` | `letter-grade` | Convertit une note sur 100 en lettre A-F. |

## Agriculture & environnement (10)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `rendement-hectare "RecolteKg" "SurfaceHa" "Résultat"` | `yield-per-hectare` | Calcule le rendement en kg/ha. |
| `densite-semis "Graines" "SurfaceM2" "Résultat"` | `seeding-density` | Calcule le nombre de graines par m². |
| `taux-humidite "MasseHumide" "MasseSeche" "Résultat"` | `moisture-rate` | Calcule l’humidité sur base humide en pourcentage. |
| `pluie-millimetres "SurfaceM2" "HauteurMm" "Résultat"` | `rainfall-volume` | Estime le volume de pluie en litres. |
| `dose-engrais "DoseKgHa" "SurfaceHa" "Résultat"` | `fertilizer-dose` | Calcule la masse totale d’engrais. |
| `plants-par-rang "LongueurM" "EspacementCm" "Résultat"` | `plants-per-row` | Estime le nombre de plants par rang. |
| `classer-ph "ValeurPH" "Résultat"` | `classify-ph` | Classe un pH en acide, neutre ou basique. |
| `co2-facteur-emission "MasseKg" "Facteur" "Résultat"` | `co2-emission-factor` | Multiplie une masse par un facteur d’émission fourni. |
| `besoin-eau-plante "LitresParM2" "SurfaceM2" "Résultat"` | `plant-water-need` | Calcule un besoin d’eau total. |
| `taux-perte-recolte "RecolteInitiale" "RecoltePerdue" "Résultat"` | `harvest-loss-rate` | Calcule le taux de perte en pourcentage. |

## Génération aléatoire (Randomy) (50)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `graine-aleatoire ["valeur"]` | `random-seed` | Fixe la graine du générateur (entier ou texte, comme random.seed) : la suite de tirages devient reproductible. Sans valeur, graine du système. |
| `etat-aleatoire "Résultat"` | `random-getstate` | Écrit l'état complet du générateur (équivalent de random.getstate) pour le restaurer plus tard. |
| `restaurer-etat-aleatoire "Etat"` | `random-setstate` | Restaure un état produit par etat-aleatoire (random.setstate) : les tirages suivants sont rejoués à l'identique. |
| `flottant-aleatoire "Résultat"` | `random-float` | Nombre décimal dans [0, 1[ sur 53 bits (random.random). |
| `bits-aleatoires "Résultat" nombre-de-bits` | `random-bits` | Entier de k bits aléatoires, de 1 à 8192 bits (random.getrandbits). |
| `octets-aleatoires "Résultat" nombre-d-octets` | `random-bytes` | Octets aléatoires écrits en hexadécimal, de 0 à 4096 octets (random.randbytes). |
| `pile-ou-face "Résultat"` | `coin-flip` | Écrit « pile » ou « face ». |
| `entier-aleatoire "Résultat" minimum maximum` | `random-int` | Entier de minimum à maximum, bornes incluses (random.randint) ; erreur si l'intervalle est vide. |
| `intervalle-aleatoire "Résultat" fin  \|  "Résultat" début fin [pas]` | `random-range` | Entier pris dans range(début, fin, pas), fin exclue (random.randrange). |
| `entier-sous "Résultat" borne` | `random-below` | Entier de 0 à borne − 1 (borne ≥ 1). |
| `binomiale-aleatoire "Résultat" [n] [p]` | `random-binomial` | Nombre de succès sur n essais de probabilité p (random.binomialvariate ; n = 1 et p = 0,5 par défaut). |
| `booleen-aleatoire "Résultat" [probabilité]` | `random-bool` | true avec la probabilité donnée (0 à 1, 0,5 par défaut), sinon false. |
| `reel-aleatoire "Résultat" a b` | `random-uniform` | Nombre décimal uniforme entre a et b (random.uniform). |
| `triangulaire-aleatoire "Résultat" [minimum] [maximum] [mode]` | `random-triangular` | Loi triangulaire (random.triangular ; 0, 1 et milieu par défaut). |
| `gauss-aleatoire "Résultat" [mu] [sigma]` | `random-gauss` | Loi normale, méthode de Box-Muller (random.gauss ; mu = 0, sigma = 1 par défaut). |
| `normale-aleatoire "Résultat" [mu] [sigma]` | `random-normalvariate` | Loi normale, méthode de Kinderman-Monahan (random.normalvariate). |
| `lognormale-aleatoire "Résultat" mu sigma` | `random-lognormvariate` | Loi log-normale (random.lognormvariate). |
| `exponentielle-aleatoire "Résultat" [lambda]` | `random-expovariate` | Loi exponentielle de taux lambda, non nul (random.expovariate ; 1 par défaut). |
| `gamma-aleatoire "Résultat" alpha beta` | `random-gammavariate` | Loi gamma, alpha et beta > 0 (random.gammavariate). |
| `beta-aleatoire "Résultat" alpha beta` | `random-betavariate` | Loi bêta sur [0, 1], alpha et beta > 0 (random.betavariate). |
| `pareto-aleatoire "Résultat" alpha` | `random-paretovariate` | Loi de Pareto (random.paretovariate). |
| `weibull-aleatoire "Résultat" alpha beta` | `random-weibullvariate` | Loi de Weibull : échelle alpha, forme beta (random.weibullvariate). |
| `vonmises-aleatoire "Résultat" mu kappa` | `random-vonmisesvariate` | Loi de von Mises, angle en radians entre 0 et 2π (random.vonmisesvariate). |
| `choix-aleatoire "Résultat" "a, b, c"` | `random-choice` | Un élément pris au hasard dans la liste (random.choice). |
| `choix-multiples-aleatoires "Résultat" "a, b, c" k ["poids"]` | `random-choices` | k éléments tirés avec remise, poids facultatifs séparés par des virgules (random.choices). |
| `echantillon-aleatoire "Résultat" "a, b, c" k` | `random-sample` | k éléments distincts tirés sans remise (random.sample). |
| `melanger-aleatoire "Liste"` | `random-shuffle` | Mélange la liste en place avec la graine courante (random.shuffle) ; contrairement à liste-melanger, le résultat est reproductible. |
| `echantillon-intervalle "Résultat" début fin k` | `random-sample-range` | k entiers distincts de début à fin (bornes incluses), dans l'ordre du tirage. |
| `permutation-aleatoire "Résultat" n` | `random-permutation` | Les entiers de 1 à n dans un ordre aléatoire (n ≤ 10 000). |
| `tirer-element "Liste" "Résultat"` | `draw-item` | Retire un élément au hasard de la liste et l'écrit dans le résultat (tirage sans remise, ex. tombola). |
| `melanger-texte "Cible"` | `shuffle-text` | Mélange les caractères du texte. |
| `liste-entiers-aleatoires "Résultat" n minimum maximum` | `random-int-list` | Liste de n entiers tirés avec remise entre minimum et maximum. |
| `lancer-de "Résultat" [faces]` | `roll-die` | Lance un dé (6 faces par défaut). |
| `lancer-des "Résultat" "2d6+3"` | `roll-dice` | Lance des dés en notation NdF±M et écrit le total (1 à 100 dés). |
| `tirer-carte "Résultat"` | `draw-card` | Tire une carte d'un jeu de 52 cartes (ex. « Dame de cœur »). |
| `tirage-loto "Résultat" k maximum` | `lottery-draw` | k numéros distincts de 1 à maximum, triés (ex. 6 parmi 49). |
| `choix-pondere "Résultat" "a, b, c" "1, 2, 7"` | `weighted-choice` | Un élément choisi selon des poids (un poids par élément). |
| `lettres-aleatoires "Résultat" n [minuscules\|majuscules\|mixtes]` | `random-letters` | Suite de n lettres sans accent. |
| `chiffres-aleatoires "Résultat" n` | `random-digits` | Suite de n chiffres, zéros initiaux conservés. |
| `chaine-aleatoire "Résultat" n ["alphabet"]` | `random-string` | Texte de n caractères tirés dans l'alphabet donné (lettres et chiffres par défaut). |
| `hexa-aleatoire "Résultat" n` | `random-hex` | Suite de n chiffres hexadécimaux. |
| `nom-aleatoire "Résultat"` | `random-name` | Prénom et nom fictifs, pour des données de démonstration. |
| `uuid-reproductible "Résultat"` | `seeded-uuid` | UUID v4 tiré avec la graine courante (reproductible ; pour un identifiant imprévisible, utiliser generer-identifiant). |
| `couleur-aleatoire "Résultat"` | `random-color` | Couleur hexadécimale #rrggbb. |
| `ip-aleatoire "Résultat"` | `random-ipv4` | Adresse IPv4 d'allure publique (réseaux privés, loopback et multicast exclus), pour des données de test. |
| `date-aleatoire "Résultat" "début" "fin"` | `random-date` | Date entre deux dates incluses (AAAA-MM-JJ). |
| `heure-aleatoire "Résultat" ["HH:mm" "HH:mm"]` | `random-time` | Heure HH:mm, éventuellement entre deux heures données (toute la journée par défaut). |
| `entier-securise "Résultat" minimum maximum` | `secure-int` | Entier tiré avec le générateur cryptographique du système : non reproductible, insensible à la graine. |
| `jeton-aleatoire "Résultat" [octets]` | `secure-token` | Jeton hexadécimal cryptographique (16 octets par défaut), non reproductible. |
| `mot-de-passe-aleatoire "Résultat" [longueur]` | `random-password` | Mot de passe cryptographique de 8 à 128 caractères (16 par défaut) avec minuscule, majuscule, chiffre et symbole. |

## Entrées / Sorties (input / output) (12)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `entree "Question" "Résultat" [texte\|entier\|nombre\|date] ["défaut"]` | `entrée`, `input` | Demande une saisie typée (redemandée tant qu'elle est invalide) ; vide si annulé. |
| `entree-entier "Question" "Résultat" ["défaut"]` | `entrée-entier`, `input-int` | Demande un nombre entier. |
| `entree-nombre "Question" "Résultat" ["défaut"]` | `entrée-nombre`, `input-number` | Demande un nombre (virgule ou point décimal). |
| `entree-date "Question" "Résultat" ["défaut"]` | `entrée-date`, `input-date` | Demande une date et la renvoie au format AAAA-MM-JJ. |
| `entree-oui-non "Question" "Résultat"` | `entrée-oui-non`, `input-yesno` | Pose une question oui/non ; le résultat vaut true ou false. |
| `entree-choix "Question" "Résultat" "a\|b\|c"` | `entrée-choix`, `input-choice` | Demande une valeur parmi une liste de choix séparés par \| (redemandée si absente de la liste). |
| `sortie "Texte"` | `output` | Affiche un message de sortie. |
| `sortie-erreur "Texte"` | `output-error` | Affiche un message d'erreur. |
| `sortie-succes "Texte"` | `sortie-succès`, `output-success` | Affiche un message de réussite. |
| `sortie-ajouter "Cible" "Texte"` | `output-append` | Ajoute une ligne à la fin du texte d'un composant (journal, console). |
| `sortie-effacer "Cible"` | `output-clear` | Vide le texte d'un composant de sortie. |
| `sortie-formater "Modèle %1 %2" "Résultat" valeur1 valeur2…` | `output-format` | Compose un texte : %1, %2… sont remplacés par les valeurs ; %% donne un %. |

## API REST (moteur EasyAPI) (19)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `api-creer "Nom" ["/prefixe"] ["1.0.0"]` | `api-create` | Commence la définition d'une API REST (efface la précédente et ses données d'essai) ; préfixe /api et version 1.0.0 par défaut. |
| `api-ressource "produits" "nom:texte*, prix:nombre, sku:texte*!"` | `api-resource` | Déclare une ressource et ses 6 routes (liste, lecture, création, remplacement, modification, suppression) avec validation. Types : texte, nombre, entier, booleen, date, email ; * = obligatoire, ! = unique. |
| `api-route "GET" "/salut/:nom" "Bonjour {nom}" [statut] [public]` | `api-add-route` | Ajoute une route personnalisée. La réponse est du JSON si elle commence par { ou [, sinon du texte ; {param}, {query.x}, {body.x}, {method}, {path} et {date} sont remplacés à chaque requête. |
| `api-serveur ["https://api.monsite.com"]` | `api-base` | Désigne un serveur d'API distant : api-appeler envoie alors ses requêtes (HTTP) à ce serveur au lieu d'appeler l'API d'essai du Studio. Sans argument : retour à l'API locale. Le même script sert ainsi à l'essai et à la production. |
| `api-donnees "produits" '[{"nom":"Stylo","sku":"A1"}]'` | `api-seed` | Insère des enregistrements de démonstration (tableau JSON) dans une ressource, validés comme par POST ; tout ou rien. |
| `api-securiser [oui\|non]` | `api-secure` | Exige une clé d'API (en-tête X-API-Key ou Authorization: Bearer) pour toute requête, sauf /health, /openapi.json et les routes « public ». |
| `api-cle "nom" "lecture\|ecriture\|admin" "Résultat"` | `api-key` | Crée une clé d'API et écrit son secret (affiché une seule fois ; jamais exporté). lecture = GET, ecriture = + POST/PUT/PATCH/DELETE. |
| `api-cors "https://monsite.com, https://app.monsite.com"` | `api-set-cors` | Autorise des origines navigateur précises (jamais de joker implicite ; « * » doit être écrit). Sans argument : aucune origine. |
| `api-limite 120` | `api-rate-limit` | Limite le nombre de requêtes par minute et par client (0 = aucune) ; au-delà : 429 avec Retry-After. |
| `api-appeler "Résultat" "GET" "/api/produits" ["corps JSON"] ["cle"]` | `api-call` | Appelle l'API et écrit le corps de la réponse : sans réseau (même routeur que le serveur exporté) ou, après api-serveur, par HTTP vers ce serveur. Lisez le code HTTP avec api-statut. |
| `api-statut "Résultat"` | `api-status` | Écrit le code HTTP de la dernière réponse d'api-appeler (200, 201, 404, 422…). |
| `api-entete "Résultat" "Location"` | `api-header` | Écrit un en-tête de la dernière réponse d'api-appeler (texte vide s'il est absent). |
| `api-routes "Résultat"` | `api-list-routes` | Liste toutes les routes de l'API (« METHODE /chemin »), séparées par des virgules. |
| `api-openapi "Résultat"` | `api-export-openapi` | Écrit la description OpenAPI 3.1 de l'API (JSON), prête pour Swagger UI, Postman ou la génération de clients. |
| `api-exporter-serveur "Résultat"` | `api-export-server` | Écrit le code d'un serveur Node.js autonome (un fichier, aucune dépendance, données en JSON sur disque, clés lues dans EASYAPI_KEYS). Enregistrez-le avec telecharger. |
| `api-exporter-spec "Résultat"` | `api-export-spec` | Écrit la définition de l'API en JSON (sans données ni secrets), pour la sauvegarder ou la partager. |
| `api-importer-spec "Source"` | `api-import-spec` | Recharge une définition produite par api-exporter-spec (les données d'essai repartent à zéro ; les clés sont à recréer). |
| `api-compter "Résultat" "produits"` | `api-count` | Nombre d'enregistrements d'une ressource dans les données d'essai. |
| `api-vider ["produits"]` | `api-clear` | Vide les données d'essai d'une ressource (ou de toutes), sans toucher à la définition de l'API. |

## Chemins (golib : pathlib et os.path de Python) (37)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `chemin-element "Résultat" "Chemin"` | `pathlib-name` | Dernier élément du chemin (Path.name) : « c.txt » pour a/b/c.txt ; vide pour « / » ou « C:\ ». |
| `chemin-radical "Résultat" "Chemin"` | `pathlib-stem` | Nom sans son dernier suffixe (Path.stem) : « archive.tar » pour archive.tar.gz. |
| `chemin-suffixe "Résultat" "Chemin"` | `pathlib-suffix` | Dernier suffixe avec son point (Path.suffix) : « .gz » pour archive.tar.gz ; vide pour .bashrc ou « a. ». |
| `chemin-suffixes "Résultat" "Chemin"` | `pathlib-suffixes` | Tous les suffixes, séparés par des virgules (Path.suffixes) : « .tar, .gz ». |
| `chemin-parent "Résultat" "Chemin"` | `pathlib-parent` | Chemin du dossier parent (Path.parent) : a/b pour a/b/c ; « . » pour un nom seul ; la racine reste la racine. |
| `chemin-parents "Résultat" "Chemin"` | `pathlib-parents` | Tous les ancêtres, du plus proche au plus lointain, séparés par des virgules (Path.parents). |
| `chemin-parties "Résultat" "Chemin"` | `pathlib-parts` | Parties du chemin séparées par des virgules (Path.parts) ; l'ancre (« / » ou « C:\ ») vient en premier. |
| `chemin-lecteur "Résultat" "Chemin"` | `pathlib-drive` | Lecteur Windows (« C: » ou \\serveur\partage) ; vide pour un chemin POSIX. |
| `chemin-racine "Résultat" "Chemin"` | `pathlib-root` | Racine du chemin (« / » ou \) ; vide pour un chemin relatif. |
| `chemin-ancre "Résultat" "Chemin"` | `pathlib-anchor` | Lecteur et racine ensemble (Path.anchor) : « C:\ », « / ». |
| `chemin-est-absolu "Résultat" "Chemin"` | `pathlib-is-absolute` | true si le chemin est absolu (Path.is_absolute) ; sous Windows, le lecteur ET la racine sont requis. |
| `chemin-est-reserve "Résultat" "Chemin"` | `pathlib-is-reserved` | true si le dernier élément est un nom réservé de Windows (NUL, CON, COM1, LPT1…) ; toujours false en POSIX. |
| `chemin-en-posix "Résultat" "Chemin"` | `pathlib-as-posix` | Chemin avec des / (Path.as_posix) : C:\a\b devient C:/a/b. |
| `chemin-en-windows "Résultat" "Chemin"` | `pathlib-as-windows` | Chemin au format Windows (str(PureWindowsPath(p))) : a/b devient a\b. |
| `chemin-uri "Résultat" "Chemin"` | `pathlib-as-uri` | Adresse file:// d'un chemin absolu, caractères spéciaux encodés en UTF-8 (Path.as_uri). |
| `chemin-profondeur "Résultat" "Chemin"` | `pathlib-depth` | Nombre d'éléments du chemin sans l'ancre (a/b/c donne 3). |
| `chemin-partie "Résultat" "Chemin" position` | `pathlib-part` | Une partie du chemin : 1 = la première (l'ancre s'il y en a une), -1 = la dernière (Path.parts[i]). |
| `chemin-assembler "Résultat" "a" "b" ["c" …]` | `pathlib-joinpath` | Assemble des morceaux (Path.joinpath, opérateur /) : un morceau absolu remplace ce qui précède ; séparateurs réduits. |
| `chemin-avec-nom "Résultat" "Chemin" "nouveau.ext"` | `pathlib-with-name` | Remplace le dernier élément (Path.with_name) ; erreur si le chemin n'a pas de nom ou si le nom contient un séparateur. |
| `chemin-avec-radical "Résultat" "Chemin" "radical"` | `pathlib-with-stem` | Remplace le nom sans suffixe et garde l'extension (Path.with_stem). |
| `chemin-avec-suffixe "Résultat" "Chemin" ".ext"` | `pathlib-with-suffix` | Remplace (ou ajoute) le suffixe (Path.with_suffix) ; un texte vide le retire ; il doit commencer par un point. |
| `chemin-relatif-a "Résultat" "Chemin" "Base" [remonter]` | `pathlib-relative-to` | Chemin relatif à Base (Path.relative_to) ; erreur s'il n'est pas dessous, sauf avec « remonter » (walk_up) qui produit des « .. ». |
| `chemin-est-sous "Résultat" "Chemin" "Base"` | `pathlib-is-relative-to` | true si le chemin est Base ou se trouve dessous (Path.is_relative_to) ; comparaison lexicale. |
| `chemin-correspond "Résultat" "Chemin" "*.txt"` | `pathlib-match` | Motif comparé depuis la droite (Path.match) : * ? [abc] [!abc] ; un motif absolu doit couvrir tout le chemin. Insensible à la casse sous Windows. |
| `chemin-correspond-tout "Résultat" "Chemin" "**/*.py"` | `pathlib-full-match` | Motif sur le chemin entier (Path.full_match de Python 3.13) ; ** remplace zéro, un ou plusieurs éléments. |
| `chemin-egaux "Résultat" "A" "B"` | `pathlib-equals` | true si les deux chemins sont identiques une fois lus comme chemins (séparateurs répétés et « ./ » ignorés ; sans casse sous Windows). |
| `chemin-normaliser "Résultat" "Chemin"` | `pathlib-normpath` | Réduit « . », « .. » et les séparateurs répétés (os.path.normpath) : a/b/../c devient a/c. Sans toucher au disque. |
| `chemin-absolu "Résultat" "Chemin" ["Base"]` | `pathlib-absolute` | Chemin absolu normalisé (os.path.abspath) ; Base vaut le répertoire courant réglé par chemin-aller (« / » au départ). |
| `chemin-relatif-de "Résultat" "Chemin" ["Début"]` | `pathlib-relpath` | Chemin relatif depuis Début, avec des « .. » si besoin (os.path.relpath) ; Début vaut le répertoire courant. |
| `chemin-commun "Résultat" "a" "b" ["c" …]` | `pathlib-commonpath` | Plus long dossier commun (os.path.commonpath) ; erreur si l'on mélange absolus et relatifs, ou des lecteurs différents. |
| `chemin-scinder-ext "$racine" "$extension" "Chemin"` | `pathlib-splitext` | Sépare l'extension (os.path.splitext) : a/b.tar.gz donne a/b.tar et .gz ; .bashrc n'a pas d'extension. |
| `chemin-scinder "$tete" "$queue" "Chemin"` | `pathlib-split` | Sépare en dossier et dernier élément (os.path.split) ; la queue est vide si le chemin finit par un séparateur. |
| `chemin-queue "Résultat" "Chemin"` | `pathlib-basename` | Dernier élément (os.path.basename) ; vide si le chemin finit par un séparateur (contrairement à chemin-element). |
| `chemin-tete "Résultat" "Chemin"` | `pathlib-dirname` | Tout sauf le dernier élément (os.path.dirname) ; contrairement à chemin-parent, ne produit jamais « . ». |
| `chemin-style auto/posix/windows` | `pathlib-style` | Choisit la lecture des chemins : auto (par défaut) reconnaît Windows à un lecteur, un chemin UNC ou des \ sans /, sinon POSIX. |
| `chemin-courant "Résultat"` | `pathlib-cwd` | Répertoire courant virtuel utilisé par chemin-absolu et chemin-relatif-de (« / » au départ ; Path.cwd). |
| `chemin-aller "Chemin"` | `pathlib-chdir` | Change le répertoire courant virtuel (os.chdir sans disque) : un chemin relatif s'ajoute à l'ancien ; le résultat est normalisé. |

## Matrices & vecteurs (calcul matriciel et vectoriel) (31)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `matrice-identite "Résultat" n` | `matrix-identity` | Matrice identité n × n (1 sur la diagonale, 0 ailleurs). Une matrice s'écrit « 1, 2; 3, 4 » : valeurs séparées par des virgules, lignes par des points-virgules. |
| `matrice-nulle "Résultat" lignes colonnes [valeur]` | `matrix-zeros` | Matrice de lignes × colonnes remplie de zéros (ou de la valeur donnée), au plus 200 × 200. |
| `matrice-diagonale "Résultat" "1, 2, 3"` | `matrix-diagonal` | Matrice carrée dont la diagonale est le vecteur donné. |
| `matrice-dimensions "Résultat" "Matrice"` | `matrix-size` | Dimensions au format « lignesxcolonnes » (ex. 2x3). |
| `matrice-transposee "Résultat" "Matrice"` | `matrix-transpose` | Transposée : les lignes deviennent des colonnes. |
| `matrice-somme "Résultat" "A" "B"` | `matrix-add` | Somme de deux matrices de mêmes dimensions. |
| `matrice-difference "Résultat" "A" "B"` | `matrix-subtract` | Différence A − B de deux matrices de mêmes dimensions. |
| `matrice-produit "Résultat" "A" "B"` | `matrix-multiply` | Produit matriciel A × B (colonnes de A = lignes de B). Un vecteur colonne « 1; 2 » s'utilise comme une matrice. |
| `matrice-echelle "Résultat" "Matrice" facteur` | `matrix-scale` | Multiplie chaque valeur de la matrice par le facteur. |
| `matrice-puissance "Résultat" "Matrice" n` | `matrix-power` | Puissance entière d'une matrice carrée (de −1024 à 1024 ; négatif = puissance de l'inverse ; 0 = identité). |
| `matrice-determinant "Résultat" "Matrice"` | `matrix-determinant` | Déterminant d'une matrice carrée (élimination de Gauss à pivot partiel). |
| `matrice-inverse "Résultat" "Matrice"` | `matrix-inverse` | Inverse d'une matrice carrée ; erreur si elle n'est pas inversible. |
| `matrice-trace "Résultat" "Matrice"` | `matrix-trace` | Trace : somme de la diagonale d'une matrice carrée. |
| `matrice-rang "Résultat" "Matrice"` | `matrix-rank` | Rang : nombre de lignes linéairement indépendantes. |
| `matrice-echelonnee "Résultat" "Matrice"` | `matrix-rref` | Forme échelonnée réduite (Gauss-Jordan) : pivots égaux à 1, zéros au-dessus et en dessous. |
| `matrice-resoudre "Résultat" "A" "B"` | `matrix-solve` | Résout le système A·x = B (A carrée, B un vecteur) et écrit x ; erreur si la solution n'est pas unique. |
| `matrice-ligne "Résultat" "Matrice" numéro` | `matrix-row` | Une ligne de la matrice (la première porte le numéro 1). |
| `matrice-colonne "Résultat" "Matrice" numéro` | `matrix-column` | Une colonne de la matrice, écrite comme un vecteur (la première porte le numéro 1). |
| `matrice-element "Résultat" "Matrice" ligne colonne` | `matrix-get` | Valeur située à la ligne et à la colonne indiquées (numérotées à partir de 1). |
| `matrice-definir-element "Matrice" ligne colonne valeur` | `matrix-set` | Remplace une valeur de la matrice contenue dans la cible (composant ou variable), en place. |
| `matrice-est "Résultat" "Matrice" carree\|symetrique\|diagonale\|identite\|orthogonale\|inversible\|nulle` | `matrix-is` | Écrit true ou false selon que la matrice possède la propriété demandée (tolérance 1e-9). |
| `vecteur-somme "Résultat" "u" "v"` | `vector-add` | Somme de deux vecteurs de même taille. Un vecteur s'écrit « 1, 2, 3 ». |
| `vecteur-difference "Résultat" "u" "v"` | `vector-subtract` | Différence u − v de deux vecteurs de même taille. |
| `vecteur-echelle "Résultat" "u" facteur` | `vector-scale` | Multiplie chaque composante du vecteur par le facteur. |
| `vecteur-produit-scalaire "Résultat" "u" "v"` | `vector-dot` | Produit scalaire u · v (vecteurs de même taille). |
| `vecteur-produit-vectoriel "Résultat" "u" "v"` | `vector-cross` | Produit vectoriel u × v de deux vecteurs à 3 composantes. |
| `vecteur-norme "Résultat" "u" [p\|inf]` | `vector-norm` | Norme du vecteur : euclidienne par défaut (p = 2), p = 1 pour la somme des valeurs absolues, « inf » pour la plus grande. |
| `vecteur-normaliser "Résultat" "u"` | `vector-normalize` | Vecteur de même direction et de norme 1 ; erreur pour le vecteur nul. |
| `vecteur-angle "Résultat" "u" "v" [degres\|radians]` | `vector-angle` | Angle entre deux vecteurs non nuls, de 0 à 180° (degrés par défaut). |
| `vecteur-projection "Résultat" "u" "v"` | `vector-project` | Projection orthogonale de u sur v ; erreur si v est nul. |
| `vecteur-distance "Résultat" "u" "v"` | `vector-distance` | Distance euclidienne entre deux points donnés par leurs coordonnées. |

## Audio (parole, notes, mélodies, sons) (20)

| Syntaxe | Alias | Rôle |
|---|---|---|
| `bip [fréquence] [durée_ms]` | `beep` | Émet un court signal sonore. |
| `dire "Texte" ["fr-FR"] [vitesse]` | `speak` | Lit le texte à voix haute (synthèse vocale), dans la langue et à la vitesse indiquées (0,25 à 4 ; 1 par défaut). Sans son de l'hôte, agit sur le classeur Excel importé (VBA : Application.Speech.Speak). |
| `dire-arreter` | `speak-stop` | Interrompt la lecture vocale en cours et vide la file d'attente. |
| `dire-en-cours "Résultat"` | `speaking` | true si une lecture vocale est en cours, sinon false. |
| `voix-liste "Résultat"` | `voice-list` | Liste les voix de synthèse disponibles, séparées par des virgules. |
| `voix-choisir "nom"` | `voice-set` | Choisit la voix de dire : un nom (ou un morceau de nom) de voix-liste. Texte vide : voix par défaut. |
| `volume-son 0 à 100` | `audio-volume` | Règle le volume général : bip, notes, mélodies, voix et lecteur de sons (comme audio volume). |
| `note-jouer "La4" [durée_ms] [sinus\|carre\|triangle\|dent-de-scie]` | `note-play` | Joue une note (La4, do#3, Sib5, C, ou une fréquence en Hz) pendant 10 à 10 000 ms (250 par défaut). |
| `melodie-jouer "do4:200, re4:200, silence:100, mi4:400" [forme]` | `melody-play` | Joue une suite de notes note:durée (silence:durée pour une pause) : 256 notes et 60 secondes au plus. |
| `note-frequence "Résultat" "La4"` | `note-frequency` | Écrit la fréquence en hertz d'une note : La4 = 440, do4 = 261.6256 (do central, La4 = 440 Hz). |
| `sons-arreter` | `audio-stop-all` | Coupe tout : parole, notes, mélodies et sons en lecture. |
| `son-jouer "adresse ou data:" [boucle]` | `sound-play` | Joue un fichier son (mp3, wav, ogg…) : adresse web, data:, ou composant sélecteur de fichier. Remplace le son en cours ; « boucle » vrai le répète. Partage le lecteur de la commande audio (audio.temps, audio.etat…). |
| `son-pause` | `sound-pause` | Met le son en cours en pause (reprise avec son-reprendre). |
| `son-reprendre` | `sound-resume` | Reprend le son mis en pause là où il s'était arrêté. |
| `son-arreter` | `sound-stop` | Arrête le son et revient au début. |
| `son-aller-a secondes` | `sound-seek` | Place la lecture à la position indiquée, en secondes. |
| `son-position "Résultat"` | `sound-position` | Position de lecture en secondes, nombre exploitable dans un calcul (audio.temps donne mm:ss). |
| `son-duree "Résultat"` | `sound-duration` | Durée du son en secondes, nombre exploitable dans un calcul (audio.duree donne mm:ss ; 0 si inconnue). |
| `son-boucle vrai\|faux` | `sound-loop` | Active ou coupe la répétition du son en cours. |
| `son-etat "Résultat"` | `sound-state` | État de la lecture, comme audio.etat : « En lecture », « En pause », « Arrêté » ou « Aucun fichier ». |

## Exemples

### Formulaire d'inscription validé
```text
quand clic
  obligatoire "Nom" "Courriel"
  est-email "Courriel" "$ok"
  verifier "$ok" = "true" "Adresse e-mail invalide."
  capitaliser "Nom"
  identifiant "$numero"
  message "Bienvenue {Nom} — dossier {$numero}"
```

### Facture avec TVA et mise en forme
```text
quand clic
  calculate "Total HT" "Prix" * "Quantité"
  pourcent-de "$tva" "Total HT" 16
  somme "Total TTC" "Total HT" "$tva"
  monnaie "Total TTC" "USD" "en-US"
```

### Échéance à 30 jours et statut coloré
```text
quand clic
  aujourdhui "$today"
  copier "$today" "Échéance"
  ajouter-jours "Échéance" 30
  ecart-jours "$today" "Échéance" "$reste"
  si "$reste" < 7 alors couleur "Statut" "#d32f2f"
  sauf-si "$reste" < 7 alors couleur "Statut" "#2e7d32"
```

### Confirmation avant suppression
```text
quand clic
  confirmer "Supprimer ce client ?" "$ok"
  si "$ok" = "true" alors clear "Nom"
  si "$ok" = "true" alors message "Client supprimé."
```

### Répéter et attendre
```text
quand clic
  repeter 3 fois bip 880 80
  attendre 1 s
  message "Terminé"
```

Application complète : `examples/code-composants/11-carnet-depenses-100-commandes.berkios.json`.
