humalis 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +8 -1
- package/README.md +8 -1
- package/dist/analyse/analyse.js +6 -7
- package/dist/analyse/css.js +28 -0
- package/dist/cibles/commun/mouvement.js +29 -0
- package/dist/cibles/commun/reperes.js +70 -0
- package/dist/cibles/mobile/projet.js +6 -0
- package/dist/cibles/statique/page.js +25 -11
- package/dist/cibles/statique/projet.js +6 -1
- package/dist/cibles/web/css-ecran.js +19 -1
- package/dist/cibles/web/ecran.js +11 -5
- package/dist/cibles/web/langue.js +3 -0
- package/dist/cibles/web/projet.js +10 -5
- package/dist/cli.js +7 -2
- package/dist/fichiers.js +21 -1
- package/dist/navigateur.js +90 -62
- package/dist/outils/developpement.js +3 -1
- package/dist/parser/miseEnPage.js +1 -1
- package/dist/vocabulaire/table-ecran.js +6 -0
- package/docs/guide.en.md +40 -0
- package/docs/guide.md +38 -0
- package/llms.txt +2 -1
- package/package.json +1 -1
package/dist/navigateur.js
CHANGED
|
@@ -3,7 +3,15 @@ var e=class extends Error{ligne;colonne;constructor(e,t,n){super(`Ligne ${t} : $
|
|
|
3
3
|
texte "Depuis 1998"`),`max-width`,`StyleSheet maxWidth`,l),i(`ombre`,`Une ombre sous l’élément : aucune, legere, moyenne ou forte.`,r(` bloc avec ombre legere :
|
|
4
4
|
texte "Poisson braisé"`),`box-shadow`,`StyleSheet shadow* et elevation`),i(`degrade`,`Un fond en dégradé entre deux couleurs : « degrade bleu vers violet », puis au besoin vertical ou horizontal (diagonal sinon).`,r(` bloc avec degrade bleu vers violet :
|
|
5
5
|
titre "Réservez" avec texte blanc`),`linear-gradient`,`LinearGradient (expo-linear-gradient)`,void 0,`Deux couleurs seulement (de base ou du thème) ; un dégradé plus fin s’écrit en CSS.`),i(`colle`,`L’élément reste collé en haut de l’écran quand on défile ; « colle en bas » le colle en bas.`,r(` bloc avec colle :
|
|
6
|
-
texte "Toujours visible"`),`position: sticky`,null,void 0,`Sur le téléphone, seuls l’en-tête et le pied de page restent collés ; ailleurs, un avertissement le dit.`),i(`
|
|
6
|
+
texte "Toujours visible"`),`position: sticky`,null,void 0,`Sur le téléphone, seuls l’en-tête et le pied de page restent collés ; ailleurs, un avertissement le dit.`),i(`defilement`,`Le bloc défile seul, avec sa propre barre, sans faire bouger le reste de la page : « defilement interne ».`,r(` ligne avec hauteur ecran :
|
|
7
|
+
colonne avec defilement interne :
|
|
8
|
+
texte "Un long chapitre."`),`overflow-y: auto`,null,[...l,`menu`],`Sur le téléphone, toute la page défile : un avertissement le dit.`),i(`hauteur`,`Le bloc prend toute la hauteur de l’écran, sous l’en-tête : « hauteur ecran ».`,r(` ligne avec hauteur ecran :
|
|
9
|
+
colonne avec defilement interne :
|
|
10
|
+
texte "Un long chapitre."`),`height: 100dvh`,null,l,`Sur le téléphone, toute la page défile : un avertissement le dit.`),{...i(`fixe`,`L’en-tête ne bouge jamais : seule la zone en dessous défile, avec sa barre (« entete avec fixe : »).`,`entete avec fixe :
|
|
11
|
+
lien "Accueil" vers "accueil"
|
|
12
|
+
|
|
13
|
+
page "accueil" :
|
|
14
|
+
titre "Accueil"`,`position: fixed`,null,[`entete`],`Seulement sur l’en-tête. Sur le téléphone, l’en-tête reste en haut comme avec « colle ».`),valeurLibre:!0},i(`sur`,`Dans un bloc « sur telephone : », les appareils où le contenu s’affiche.`,r(` sur telephone :
|
|
7
15
|
texte "Petit écran"`),`display`,`SurAppareil (largeur de la fenêtre)`,[`appareil`]),{mot:`site`,variantes:[],categorie:`structure`,concept:`structure.site`,contextes:[`declaration`],cibles:n(`index.html : icône, og:site_name, manifeste ; public/robots.txt ; plan du site par le prérendu`,`app.json : le nom de l’application, et son icône (un PNG)`,`le <head> de chaque page, robots.txt et sitemap.xml`),couvre:[`html:link-icon`,`html:meta-og`,`robots.txt`,`sitemap.xml`,`webmanifest`],description:`Le bloc « site : » en haut du fichier, c’est « je publie » : le nom du site (ajouté au titre de chaque page), sa description, son image de partage, son logo (l’icône) et son adresse publique. Il produit les balises d’aperçu, robots.txt et le plan du site. « indexation non » ferme le site aux moteurs de recherche.`,exemple:`site :
|
|
8
16
|
nom "Le Fleuve"
|
|
9
17
|
logo "./logo.svg"
|
|
@@ -100,7 +108,9 @@ page "plat" :
|
|
|
100
108
|
texte "a"`),[`leger`],`légère`),a(`forte`,[`ombre`],`Une ombre marquée.`,r(` bloc avec ombre forte :
|
|
101
109
|
texte "a"`),[`fort`]),a(`douce`,[`bordure`,`transition`],`Des coins légèrement arrondis ; pour une transition, des changements adoucis (200 ms).`,r(` bloc avec bordure douce :
|
|
102
110
|
texte "a"`),[`doux`]),a(`ronde`,[`bordure`],`Une forme ronde : un cercle pour un élément carré.`,r(` bloc avec bordure ronde :
|
|
103
|
-
texte "a"`),[`rond`]),a(`
|
|
111
|
+
texte "a"`),[`rond`]),a(`interne`,[`defilement`],`Le bloc a son propre défilement : « defilement interne ».`,r(` colonne avec defilement interne :
|
|
112
|
+
texte "a"`)),a(`ecran`,[`hauteur`],`La hauteur de l’écran, moins celle de l’en-tête : « hauteur ecran ».`,r(` ligne avec hauteur ecran :
|
|
113
|
+
texte "a"`),[],`écran`),a(`haut`,[`colle`],`Collé en haut de l’écran (par défaut).`,r(` bloc avec colle :
|
|
104
114
|
texte "a"`)),a(`bas`,[`colle`],`Collé en bas de l’écran : « colle en bas ».`,r(` bloc avec colle en bas :
|
|
105
115
|
texte "a"`)),a(`telephone`,[`sur`],`Un écran de moins de 640 pixels de large.`,r(` sur telephone :
|
|
106
116
|
texte "a"`),[`telephones`],`téléphone`),a(`tablette`,[`sur`],`Un écran de 640 à 1023 pixels de large.`,r(` sur tablette :
|
|
@@ -606,11 +616,11 @@ page "carte" :
|
|
|
606
616
|
titre "Carte"`,statut:`supporte`,etape:9,note:`En tête de ligne, suivi de « : » : ailleurs, « menu » reste un nom libre. Sur le mobile, le lien actif n’est pas marqué.`},{mot:`desactive`,accentue:`désactivé`,variantes:[`desactivee`,`desactives`,`desactivees`],categorie:`option`,concept:`option.desactive`,contextes:[`option`],cibles:C(`disabled`,`disabled (Pressable)`,`disabled`),couvre:[`html:disabled`],description:`Un élément sur lequel on ne peut pas agir pour l’instant.`,exemple:D(` bouton "Payer" avec desactive`),statut:`prevu`,etape:1},...p,...ne,...ue,...he];function A(e){return e.toLowerCase().normalize(`NFD`).replace(/[̀-ͯ]/g,``)}function Me(e){return[e.mot,...e.variantes]}const Ne=e=>e.contextes.includes(`partout`),Pe=[`tournure`,`option`,`valeurStyle`,`serveur`,`source`,`donnee`,`route`,`composant`,`declaration`,`session`,`miseEnPage`,`saisie`,`navigation`,`interaction`];function Fe(e){return e.categorie===`liaison`?!1:Ne(e)?!0:e.statut===`supporte`&&e.contextes.some(e=>!Pe.includes(e))}const Ie=new Map;for(let e of je)for(let t of Me(e)){let n=Ie.get(t)??[];n.push(e),Ie.set(t,n)}function Le(e){return Ie.get(A(e).replace(/-/g,``))??[]}function Re(e){return Le(e).some(e=>e.categorie!==`liaison`)}function ze(e){let t=Le(e);if(!t.some(e=>e.statut===`supporte`))return t.find(e=>e.statut===`prevu`)}const Be=je.filter(Fe),Ve=new Set(Be.map(e=>e.mot)),He=new Set(je.filter(Ne).map(e=>e.mot)),Ue=new Set([...Ve].filter(e=>!He.has(e)));function We(e){return He.has(Ke(e)??A(e))}const Ge=new Map(Be.flatMap(e=>e.variantes.map(t=>[t,e.mot])));function Ke(e){let t=A(e),n=Ge.get(t)??t;return Ve.has(n)?n:null}const qe=je.filter(e=>e.categorie===`liaison`),Je=new Set(qe.filter(e=>!e.elision).map(e=>e.mot));function Ye(e){return Je.has(A(e))}const Xe=new Set(qe.filter(e=>e.elision).map(e=>e.mot));function Ze(e){return Xe.has(e)}function Qe(e,t){let n=t;for(;n<e.length&&/[\p{L}0-9_]/u.test(e[n]);)n++;return e.slice(t,n)}function $e(e,t,n){let r=[n],i=t+n.length;for(;e[i]===`-`&&/\p{L}/u.test(e[i+1]??``);){let t=Qe(e,i+1);r.push(t),i+=1+t.length}for(let e=r.length;e>1;e--){let t=r.slice(0,e).join(`-`);if(Re(t.replace(/-/g,``)))return t}return null}function et(e,t){let n=0;for(let r=t;r<e.length;r++){if(e.startsWith(`"}`,r)&&n<=0)return r;e[r]===`{`&&n++,e[r]===`}`&&n--}return e.indexOf(`"}`,t)}function tt(t,n,r){let i=[],a=``,o=0;for(;o<t.length;){if(t[o]===`{`){a!==``&&(i.push({type:`texte`,valeur:a}),a=``),o++;let s=``,c=/^(code|accent)\s*"/.exec(t.slice(o)),l=c?et(t,o+c[0].length):-1;for(l>=0&&(s=t.slice(o,l+1),o=l+1);o<t.length&&t[o]!==`}`;)s+=t[o],o++;if(o>=t.length)throw new e(`accolade non fermée dans la chaîne : il manque }`,n,r);o++;let u=/^accent\b(.*)$/s.exec(s.trim());if(u){let t=/^\s*"([\s\S]*)"\s*$/.exec(u[1]);if(!t)throw new e(`accent attend un texte entre guillemets : {accent "mot"}.`,n,r);i.push({type:`accent`,valeur:t[1]})}else if(/^code\s+\S/s.test(s.trim())){let t=/^code\s+"([\s\S]*)"\s*$/.exec(s.trim());if(!t)throw new e(`code attend un texte entre guillemets : {code "titre"}.`,n,r);i.push({type:`code`,valeur:t[1]})}else i.push({type:`variable`,valeur:s.trim()});continue}a+=t[o],o++}return a!==``&&i.push({type:`texte`,valeur:a}),i}function nt(t){let n=[],r=t.split(`
|
|
607
617
|
`),i=[0];for(let t=0;t<r.length;t++){let a=r[t],o=0,s=/^( *)(code)(?: +(?!avec\b)([\p{L}][\p{L}0-9_]*))?( +avec +animation +frappe(?: +au +d[eé]filement)?)? *: *$/u.exec(a);if(s){let o=[],c=s[1].length;if(c%4!=0)throw new e(`indentation incohérente : un multiple de 4 est attendu`,t+1,1);let l=c/4,u=i[i.length-1];if(l>u+1)throw new e(`indentation incohérente : un seul niveau à la fois`,t+1,1);if(l===u+1)i.push(l),n.push({type:`INDENT`,valeur:``,ligne:t+1,colonne:1});else for(;i.length>1&&i[i.length-1]>l;)i.pop(),n.push({type:`DEDENT`,valeur:``,ligne:t+1,colonne:1});if(i[i.length-1]!==l)throw new e(`indentation incohérente : ce niveau ne correspond à aucun bloc ouvert`,t+1,1);for(;t+1<r.length;){let e=r[t+1],n=e.length-e.trimStart().length;if(e.trim()!==``&&n<=c)break;o.push(r[++t])}for(;o.length&&o[o.length-1].trim()===``;)o.pop();let d=Math.min(...o.filter(e=>e.trim()!==``).map(e=>e.length-e.trimStart().length)),f=o.map(e=>e.slice(Math.min(d,e.length-e.trimStart().length))).join(`
|
|
608
618
|
`),p=t-o.length+1;n.push({type:`MOT_CLE`,valeur:`code`,ligne:p,colonne:c+1,reserve:!1,original:`code`},...s[3]?[{type:`IDENTIFIANT`,valeur:s[3],ligne:p,colonne:c+6}]:[],...s[4]?s[4].trim().split(/ +/).map(e=>({type:`IDENTIFIANT`,valeur:e,ligne:p,colonne:a.indexOf(s[4])+1})):[],{type:`PONCTUATION`,valeur:`:`,ligne:p,colonne:a.indexOf(`:`)+1},{type:`FIN_LIGNE`,valeur:``,ligne:p,colonne:a.length+1},{type:`CODE_BRUT`,valeur:f,ligne:p+1,colonne:1},{type:`FIN_LIGNE`,valeur:``,ligne:t+1,colonne:1});continue}if(/^style\s*:\s*$/i.test(a)){for(;i.length>1;)i.pop(),n.push({type:`DEDENT`,valeur:``,ligne:t+1,colonne:1});let e=t,o=[];for(;t+1<r.length&&(r[t+1].trim()===``||/^\s/.test(r[t+1]));)o.push(r[++t]);for(;o.length>0&&o[o.length-1].trim()===``;)o.pop();let s=Math.min(...o.filter(e=>e.trim()!==``).map(e=>e.length-e.trimStart().length)),c=o.map(e=>e.slice(Math.min(s,e.length-e.trimStart().length))).join(`
|
|
609
|
-
`),l=e+1;n.push({type:`MOT_CLE`,valeur:`style`,ligne:l,colonne:1,reserve:!1,original:a.trim().split(/\s|:/)[0]},{type:`PONCTUATION`,valeur:`:`,ligne:l,colonne:a.indexOf(`:`)+1},{type:`FIN_LIGNE`,valeur:``,ligne:l,colonne:a.length+1},{type:`CSS`,valeur:c,ligne:l+1,colonne:1},{type:`FIN_LIGNE`,valeur:``,ligne:t+1,colonne:1});continue}if(a.trim()===``||a.trim().startsWith(`#`))continue;if(a.startsWith(` `))throw new e(`tabulation interdite : utilisez 4 espaces par niveau`,t+1,1);let c=a.length-a.trimStart().length;if(c%4!=0)throw new e(`indentation incohérente : ${c} espaces trouvés, un multiple de 4 est attendu`,t+1,1);let l=c/4,u=i[i.length-1];if(l>u){if(l!==u+1)throw new e(`indentation incohérente : un seul niveau à la fois`,t+1,1);i.push(l),n.push({type:`INDENT`,valeur:``,ligne:t+1,colonne:1})}else if(l<u){for(;i.length>1&&i[i.length-1]>l;)i.pop(),n.push({type:`DEDENT`,valeur:``,ligne:t+1,colonne:1});if(i[i.length-1]!==l)throw new e(`indentation incohérente : ce niveau ne correspond à aucun bloc ouvert`,t+1,1)}for(;o<a.length;){let r=a[o];if(r===` `){o++;continue}if(r===`#`)break;if(r===`"`){let r=o;o++;let i=``,s=0;for(;o<a.length&&(a[o]!==`"`||s>0&&a.indexOf(`}`,o+1)>=0);){let e=/^\{(code|accent)\s*"/.exec(a.slice(o)),t=e?et(a,o+e[0].length):-1;if(t>=0){i+=a.slice(o,t+2),o=t+2;continue}if(a[o]===`\\`&&a[o+1]===`\\`){i+=`\\\\`,o+=2;continue}a[o]===`\\`&&a[o+1]===`"`&&o++,a[o]===`{`&&s++,a[o]===`}`&&s>0&&s--,i+=a[o],o++}if(o>=a.length)throw new e(`chaîne de caractères non fermée (guillemet manquant)`,t+1,r+1);o++,n.push({type:`CHAINE`,valeur:i,ligne:t+1,colonne:r+1,parties:tt(i,t+1,r+1)});continue}if(/[0-9]/.test(r)){let e=o,r=``;for(;o<a.length&&/[0-9]/.test(a[o]);)r+=a[o],o++;if((a[o]===`,`||a[o]===`.`)&&/[0-9]/.test(a[o+1]??``))for(r+=`.`,o++;o<a.length&&/[0-9]/.test(a[o]);)r+=a[o],o++;n.push({type:`NOMBRE`,valeur:r,ligne:t+1,colonne:e+1});continue}if(/[\p{L}_]/u.test(r)){let e=o,r=Qe(a,o);if(o+=r.length,a[o]===`'`&&Ze(r)){o++,n.push({type:`LIAISON`,valeur:`${r.toLowerCase()}'`,ligne:t+1,colonne:e+1,original:`${r}'`});continue}if(Ye(r)){n.push({type:`LIAISON`,valeur:r.toLowerCase(),ligne:t+1,colonne:e+1,original:r});continue}let i=$e(a,e,r),s=i??r;i&&(o=e+i.length,r=i.replace(/-/g,``));let c=Ke(r);c?n.push({type:`MOT_CLE`,valeur:c,ligne:t+1,colonne:e+1,reserve:We(c),original:s}):n.push({type:`IDENTIFIANT`,valeur:r,ligne:t+1,colonne:e+1,...i?{original:s}:{}});continue}n.push({type:`PONCTUATION`,valeur:r,ligne:t+1,colonne:o+1}),o++}n.push({type:`FIN_LIGNE`,valeur:``,ligne:t+1,colonne:a.length+1})}for(;i.length>1;)i.pop(),n.push({type:`DEDENT`,valeur:``,ligne:r.length,colonne:1});return n.push({type:`FIN_FICHIER`,valeur:``,ligne:r.length,colonne:1}),n}var j=class extends Error{ligne;constructor(e,t){super(`Ligne ${t} : ${e}`),this.ligne=t,this.name=`ErreurSyntaxique`}};function rt(e){return e.some(e=>e.type===`Rendre`||it(e).some(rt))}function it(e){let t=[],n=e;for(let e of[`corps`,`alors`,`sinon`])Array.isArray(n[e])&&t.push(n[e]);if(Array.isArray(n.cas))for(let e of n.cas)t.push(e.corps);let r=n.action;return r&&typeof r==`object`&&Array.isArray(r.corps)&&t.push(r.corps),t}function at(e,t){let n=e=>{if(Array.isArray(e))return e.map(n);if(!e||typeof e!=`object`)return e;let r=e,i={};for(let[e,t]of Object.entries(r))i[e]=n(t);return(r.type===`Reference`||r.type===`Affectation`)&&typeof r.nom==`string`&&t.has(r.nom)&&(i.nom=t.get(r.nom)),r.type===`variable`&&typeof r.valeur==`string`&&(i.valeur=r.valeur.replace(/^[^.\s]+/,e=>t.get(e)??e)),i};return n(e)}function ot(e){let t=new Map(e.fonctions.filter(e=>!rt(e.corps)).map(e=>[e.nom,e]));e.fonctions=e.fonctions.filter(e=>!t.has(e.nom));let n=new Set(t.keys()),r=new Map,i=(e,t,n)=>e.flatMap(e=>{for(let r of it(e))r.splice(0,r.length,...i(r,t,n));if(e.type!==`Execution`)return[e];let a=t.get(e.nom);if(!a)return[e];if(n.includes(e.nom))throw new j(`« ${e.nom} » s'appelle elle-même : une fonction d'actions ne peut pas se rappeler (elle ne s'arrêterait jamais).`,e.ligne);if(e.arguments.length!==a.parametres.length){let t=a.parametres.length;throw new j(`« ${e.nom} » attend ${t} valeur${t>1?`s`:``}${t?` (${a.parametres.map(e=>e.nom).join(`, `)})`:``} ; ici, ${e.arguments.length}.`,e.ligne)}let o=(r.get(e.nom)??0)+1;r.set(e.nom,o);let s=new Map(a.parametres.map(t=>[t.nom,`${t.nom}_${e.nom}${o>1?`_${o}`:``}`]));return[...a.parametres.map((t,n)=>({type:`Variable`,nom:s.get(t.nom),valeur:e.arguments[n],ligne:e.ligne})),...i(at(a.corps,s),t,[...n,e.nom])]});for(let r of[...e.pages,...e.composants,...e.entete?[e.entete]:[],...e.pied?[e.pied]:[]]){let e=r.corps.filter(e=>e.type===`Fonction`);for(let t of e){if(rt(t.corps))throw new j(`« ${t.nom} » rend une valeur : une fonction de calcul s'écrit en haut du fichier, pour servir à toutes les pages.`,t.ligne);n.add(t.nom)}let a=new Map([...t,...e.map(e=>[e.nom,e])]);r.corps=i(r.corps.filter(e=>e.type!==`Fonction`),a,[])}return[...n]}const st=e=>e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase();function ct(e,t){let n=st(e),r=st(t),i=Array.from({length:r.length+1},(e,t)=>t);for(let e=1;e<=n.length;e++){let t=[e];for(let a=1;a<=r.length;a++)t[a]=Math.min(t[a-1]+1,i[a]+1,i[a-1]+(n[e-1]===r[a-1]?0:1));i=t}return i[r.length]}function lt(e,t){let n,r=e.length>5?2:1;for(let i of t){let t=ct(e,i);t<r&&st(e)!==st(i)?(n=i,r=t):t===r&&n===void 0&&st(e)!==st(i)&&(n=i)}return n}function M(e,t){let n=lt(e,t);return n?` Peut-être « ${n} » ?`:``}const ut=je.filter(e=>e.categorie===`style`&&e.statut===`supporte`&&e.contextes.includes(`option`)&&e.mot!==`style`),dt=je.filter(e=>e.categorie===`valeurStyle`&&e.statut===`supporte`),ft=Object.fromEntries(ut.map(e=>{let t=dt.filter(t=>t.valeurDe?.includes(e.mot));return[e.mot,{valeurs:t.map(e=>e.mot),accords:Object.fromEntries(t.flatMap(e=>e.variantes.map(t=>[t,e.mot])))}]})),pt=Object.fromEntries(ut.filter(e=>e.surElements).map(e=>[e.mot,e.surElements])),mt=new Set(ut.filter(e=>e.valeurLibre).map(e=>e.mot)),ht={vertical:`vertical`,verticale:`vertical`,horizontal:`horizontal`,horizontale:`horizontal`,diagonal:`diagonale`,diagonale:`diagonale`},gt=e=>A(e)in ht;function _t(e,t){let n=pt[A(e)];if(!(!n||n.includes(t)))return`« ${A(e)} » se règle seulement sur : ${n.join(`, `)} (ici, ${t}).`}const vt=[...Object.keys(ft).filter(e=>e!==`sur`),`nom`,`obligatoire`,`indice`,`minimum`,`maximum`];function yt(e,t,n=new Set){let r=A(e);if(r===`degrade`)return bt(t,n);if(mt.has(r))return{propriete:r,valeur:t};let i=ft[r];if(!i)return{erreur:`« ${e} » n'est pas une option connue. Options possibles : ${vt.join(`, `)}.`};let a=A(t),o=i.accords[a]??a;if([`couleur`,`fond`,`texte`].includes(r)&&n.has(o))return{propriete:r,valeur:o};if(!i.valeurs.includes(o)){let e=[`couleur`,`fond`,`texte`].includes(r)?[...n]:[];return e.length>0?{erreur:`« ${t} » n'est pas une valeur possible pour « ${r} ». Valeurs possibles : ${i.valeurs.join(`, `)}, et les couleurs du thème : ${e.join(`, `)}.${M(t,[`couleur`,`fond`,`texte`].includes(r)?[...i.valeurs,...e]:[])}`}:{erreur:`« ${t} » n'est pas une valeur possible pour « ${r} ». Valeurs possibles : ${i.valeurs.join(`, `)}.${M(t,[`couleur`,`fond`,`texte`].includes(r)?i.valeurs:[])}`}}return{propriete:r,valeur:o}}function bt(e,t){let[n,r,i=`diagonale`]=e.split(`-`),a=ft.couleur,o=e=>e===void 0?void 0:a.accords[A(e)]??A(e),s=o(n),c=o(r),l=e=>e!==void 0&&(a.valeurs.includes(e)||t.has(e));if(!l(s)||!l(c))return{erreur:`un dégradé va d'une couleur à une autre : « degrade bleu vers violet ». Couleurs possibles : ${[...a.valeurs,...t].join(`, `)}.`};if(s===c)return{erreur:`un dégradé va d'une couleur à une autre : « ${s} vers ${s} » est une seule couleur. Utilisez « fond ${s} ».`};let u=ht[A(i)];return u?{propriete:`degrade`,valeur:`${s}-${c}-${u}`}:{erreur:`« ${i} » n'est pas une direction de dégradé. Directions possibles : vertical, horizontal (sinon en diagonale).`}}const xt=(e,t=1)=>e.regarder(t).type===`PONCTUATION`&&e.regarder(t).valeur===`:`;function St(e){return N(e.actuel(),`langues`)&&xt(e)}function Ct(e){return N(e.actuel(),`traductions`)&&P(e.regarder(1))&&xt(e,2)}function wt(e,t){if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t(),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}}function Tt(e){let t=e.avancer();e.avancer();let n={type:`Langues`,langues:[],ligne:t.ligne};return wt(e,()=>{let t=e.actuel();if(!P(t))throw new j(`une ligne du bloc « langues » est le nom d'une langue, par exemple « francais » ou « anglais » : à la place, on trouve « ${t.valeur||t.type} »`,t.ligne);e.avancer(),n.langues.push({mot:A(t.original??t.valeur),ligne:t.ligne})}),n}function Et(e){let t=e.avancer(),n=e.avancer();e.avancer();let r={type:`Traductions`,langue:A(n.original??n.valeur),entrees:[],ligne:t.ligne};return wt(e,()=>{let t=e.actuel().ligne,n=e.attendre(`CHAINE`,void 0,`le texte à traduire entre guillemets, puis « : » et sa version : "Bonjour" : "Hello"`);e.attendre(`PONCTUATION`,`:`,`deux-points entre le texte et sa version : "Bonjour" : "Hello"`);let i=e.attendre(`CHAINE`,void 0,`la version entre guillemets après les deux-points : "Bonjour" : "Hello"`);r.entrees.push({texte:Dt(n),version:Dt(i),ligne:t})}),r}const Dt=e=>e.parties??(e.valeur===``?[]:[{type:`texte`,valeur:e.valeur}]);function Ot(e){let t=[];for(;N(e.actuel(),`en`)&&P(e.regarder(1))&&e.regarder(2).type===`CHAINE`;){e.avancer();let n=e.avancer(),r=e.avancer();t.push({langue:A(n.original??n.valeur),parties:Dt(r),ligne:r.ligne})}return t.length>0?t:void 0}function kt(e){return N(e.actuel(),`selecteur`)&&N(e.regarder(1),`langue`)}function At(e){return e.map(e=>e.type===`variable`?`{${e.valeur}}`:e.valeur).join(``)}function jt(e,t){if(t===`animation`){if(!P(e.actuel()))throw new j(`il manque le nom de l’animation : « animation apparition », « animation montee » ou « animation agrandissement »`,e.actuel().ligne);let t=e.avancer().valeur;if(N(e.actuel(),`defilement`)){e.avancer();let n=e.actuel().valeur===`et`&&N(e.regarder(1),`en`)&&N(e.regarder(2),`cascade`);if(n)for(let t=0;t<3;t++)e.avancer();return{propriete:`animation`,valeur:t,defilement:!0,...n?{cascade:!0}:{}}}return{propriete:`animation`,valeur:t}}if(t===`description`||t===`transcription`){let n=e.actuel();if(n.type===`CHAINE`){e.avancer();let r=Ot(e),i=n.parties??[];return{propriete:t,valeur:n.valeur,parties:i,...r?{texte:{type:`Chaine`,parties:i,versions:r,ligne:n.ligne}}:{}}}if(n.type===`IDENTIFIANT`){let n=[e.avancer().valeur];for(;e.actuel().type===`PONCTUATION`&&e.actuel().valeur===`.`&&P(e.regarder(1));)e.avancer(),n.push(e.avancer().valeur);let r=n.join(`.`);return{propriete:t,valeur:`{${r}}`,parties:[{type:`variable`,valeur:r}]}}return}if(t===`proportions`){let n=e.actuel();if(n.type!==`NOMBRE`||!N(e.regarder(1),`sur`)||e.regarder(2).type!==`NOMBRE`)throw new j(`les proportions s’écrivent « largeur sur hauteur », par exemple « proportions 4 sur 3 » ou « proportions 16 sur 9 »`,n.ligne);return e.avancer(),e.avancer(),{propriete:t,valeur:`${n.valeur}:${e.avancer().valeur}`}}if(t===`decorative`||t===`decoratif`)return{propriete:`decoratif`,valeur:`oui`};if(t===`prioritaire`)return{propriete:t,valeur:`oui`}}const Mt={courbe:`courbe`,courbes:`courbe`,barres:`barres`,barre:`barres`,camembert:`camembert`,camemberts:`camembert`},Nt=[`etiquette`,`etiquettes`,`valeur`,`couleur`,`description`,`proportions`,`style`],Pt=`serie "Ventes" valeur ventes avec couleur bleu`,Ft=(e,t=0)=>{let n=e.regarder(t);return P(n)?A(n.original??n.valeur):``};function It(e){if(!N(e.actuel(),`graphique`))return!1;let t=e.regarder(1);return N(t,`en`)||t.type===`IDENTIFIANT`||t.type===`CHAINE`||t.type===`PONCTUATION`&&t.valeur===`[`}function Lt(e){return N(e.actuel(),`serie`)&&e.regarder(1).type===`CHAINE`}function Rt(e){throw new j(`« serie » se place dans un graphique en bloc, décalée sous la ligne « graphique … : », par exemple ${Pt}`,e.actuel().ligne)}function zt(e,t){let n=e.avancer(),r=N(e.actuel(),`en`)?Mt[Ft(e,1)]:void 0;if(!r)throw new j(`il manque le genre du graphique juste après « graphique » : en courbe, en barres, en camembert. Par exemple : graphique en barres ventes avec etiquette mois et valeur montant et description "…"`,n.ligne);e.avancer(),e.avancer();let i={type:`Graphique`,genre:r,liste:t.expression(e),series:[],classes:[],ligne:n.ligne};if(e.accepter(`MOT_CLE`,`avec`))do Bt(e,i,t);while(e.accepter(`MOT_CLE`,`et`));return e.accepter(`PONCTUATION`,`:`)&&(i.series=Ht(e)),i}function Bt(e,t,n){let r=e.actuel(),i=Ft(e);if(!Nt.includes(i))throw new j(`« ${r.original??r.valeur} » n’est pas une option de graphique. Options : ${Nt.join(`, `)}.${M(i,Nt)}`,r.ligne);if(e.avancer(),i===`etiquette`)t.etiquette=e.attendreNom(`le champ des libellés, par exemple « etiquette mois »`).nom;else if(i===`etiquettes`)t.etiquettes=n.expression(e);else if(i===`valeur`)t.valeur=Vt(e);else if(i===`couleur`)t.couleur=e.attendreNom(`une couleur, par exemple « couleur bleu »`).nom;else if(i===`style`)t.classes.push(...e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean));else if(i===`proportions`){let[n,r]=jt(e,`proportions`).valeur.split(`:`).map(Number);t.proportions=[n,r]}else{let n=jt(e,`description`);t.description={type:`Chaine`,parties:n?.parties??[{type:`texte`,valeur:e.attendre(`CHAINE`,void 0,`la description entre guillemets`).valeur}],...n?.texte?.versions?{versions:n.texte.versions}:{},ligne:r.ligne}}}function Vt(e){let t=e.attendreNom(`le champ des valeurs, par exemple « valeur montant »`),n={champ:t.nom,ligne:t.ligne};if(N(e.actuel(),`en`)&&P(e.regarder(1))){e.avancer();let t=e.avancer();n.devise=t.original??t.valeur}return n}function Ht(e){let t=[];if(e.sauterFinsDeLigne(),!e.accepter(`INDENT`))return t;for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let n=e.actuel();if(!Lt(e))throw new j(`dans un graphique, chaque ligne est une série, par exemple ${Pt}`,n.ligne);e.avancer();let r=e.avancer(),i={nom:r.valeur,ligne:n.ligne},a=Ot(e);if(a&&(i.texteNom={type:`Chaine`,parties:[{type:`texte`,valeur:r.valeur}],versions:a,ligne:r.ligne}),N(e.actuel(),`valeur`)&&(e.avancer(),i.valeur=Vt(e)),e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel();if(Ft(e)!==`couleur`)throw new j(`« ${t.original??t.valeur} » ne se règle pas sur une série : seule sa couleur se choisit, par exemple ${Pt}`,t.ligne);e.avancer(),i.couleur=e.attendreNom(`une couleur, par exemple « couleur bleu »`).nom}while(e.accepter(`MOT_CLE`,`et`));t.push(i),e.sauterFinsDeLigne()}return e.accepter(`DEDENT`),t}function N(e,t){return(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t}const P=e=>e.type===`IDENTIFIANT`||e.type===`MOT_CLE`;function Ut(e,t){let n=A(t.original??t.valeur);if(n===`colle`)return N(e.actuel(),`en`)&&(N(e.regarder(1),`bas`)||N(e.regarder(1),`haut`))?(e.avancer(),{propriete:`colle`,valeur:A(e.avancer().valeur)}):{propriete:`colle`,valeur:`haut`};if(Gt.includes(n))return{propriete:n,valeur:`oui`};if(n===`automatique`&&e.actuel().type!==`NOMBRE`)return{propriete:n,valeur:`5`};if(n===`photo`){let t=e.attendre(`CHAINE`,void 0,`l’image entre guillemets : avec photo "camille.jpg"`);return{propriete:n,valeur:t.valeur,parties:t.parties??[]}}let r=jt(e,n);if(r)return r;if(n===`degrade`){if(!P(e.actuel()))throw new j(`un dégradé va d’une couleur à une autre : « degrade bleu vers violet »`,e.actuel().ligne);let t=e.avancer().valeur;if(!e.accepter(`MOT_CLE`,`vers`))throw new j(`il manque « vers » après « ${t} » : « degrade ${t} vers violet »`,e.actuel().ligne);if(!P(e.actuel()))throw new j(`il manque la deuxième couleur du dégradé : « degrade ${t} vers violet »`,e.actuel().ligne);let n=e.avancer().valeur,r=``;return P(e.actuel())&>(e.actuel().valeur)&&(r=`-${e.avancer().valeur}`),{propriete:`degrade`,valeur:`${t}-${n}${r}`}}}const Wt=[`telephone`,`tablette`,`ordinateur`],Gt=[`modifiable`,`ouvert`,`plusieurs`,`pourcentage`,`boucle`];function Kt(e){return e.verifier(`MOT_CLE`,`sur`)&&P(e.regarder(1))&&Wt.includes(A(e.regarder(1).valeur))}function qt(e,t){let n=e.avancer(),r=[];do{let t=e.actuel(),n=A(t.valeur);if(!P(t)||!Wt.includes(n))throw new j(`« ${t.valeur} » n’est pas un appareil. Appareils possibles : ${Wt.join(`, `)}.`,t.ligne);if(r.some(e=>e.valeur===n))throw new j(`l’appareil « ${n} » est écrit deux fois dans la même ligne « sur ».`,t.ligne);e.avancer(),r.push({propriete:`sur`,valeur:n})}while(e.accepter(`MOT_CLE`,`ou`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « sur », puis son contenu en dessous, décalé`),{type:`Bloc`,genre:`appareil`,styles:r,classes:[],corps:t.corps(e),ligne:n.ligne}}function Jt(e){if(!(N(e.actuel(),`entete`)||N(e.actuel(),`pied`)))return!1;let t=e.regarder(1);return t.type===`PONCTUATION`&&t.valeur===`:`||t.type===`MOT_CLE`&&t.valeur===`avec`}function Yt(e,t){let n=e.avancer(),r=A(n.original??n.valeur),i=[],a=[];if(e.accepter(`MOT_CLE`,`avec`))do if(e.verifier(`MOT_CLE`,`style`)){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur;a.push(...t.split(/\s+/).filter(Boolean))}else i.push(t.style(e));while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « ${r} », puis son contenu en dessous, décalé`),{type:`Disposition`,genre:r,styles:i,classes:a,corps:t.corps(e),ligne:n.ligne}}function Xt(e){let t={};for(;N(e.actuel(),`sans`);){e.avancer();let n=e.actuel(),r=A(n.original??n.valeur);if(!P(n)||r!==`entete`&&r!==`pied`)throw new j(`après « sans », il faut « entete » ou « pied » : page "connexion" sans entete et sans pied :`,n.ligne);e.avancer(),r===`entete`?t.sansEntete=!0:t.sansPied=!0,e.accepter(`MOT_CLE`,`et`)}return t}const Zt=[`nom`,`description`,`image`,`logo`,`adresse`],Qt=[`titre`,`description`,`image`],$t=e=>e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`:`;function en(e){return N(e.actuel(),`site`)&&$t(e)}function tn(e){return N(e.actuel(),`apercu`)&&$t(e)}function nn(e,t){let n=e.actuel();if(!P(n))throw new j(`une ligne de ce bloc commence par ${t} : à la place, on trouve « ${n.valeur||n.type} »`,n.ligne);return e.avancer(),A(n.original??n.valeur)}function rn(e){let t=e.actuel();if(N(t,`non`)||N(t,`oui`))return e.avancer(),N(t,`oui`);throw new j(`« indexation » est suivi de « non » (caché aux moteurs de recherche) ou de « oui ».`,t.ligne)}function an(e,t){if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t(),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}}function on(e){let t=e.avancer();e.avancer();let n={type:`Site`,indexation:!0,lignes:{},ligne:t.ligne};return an(e,()=>{let t=e.actuel().ligne,r=nn(e,`nom, description, image, logo, adresse ou indexation`);if(r===`indexation`){n.indexation=rn(e);return}if(!Zt.includes(r))throw new j(`« ${r} » n'est pas une ligne du bloc « site ». Lignes possibles : nom, description, image, logo, adresse ou indexation.`,t);let i=r;if(n[i]!==void 0)throw new j(`« ${i} » est déjà donné dans le bloc « site » (ligne ${n.lignes[i]}).`,t);let a=e.attendre(`CHAINE`,void 0,`la valeur de « ${i} » entre guillemets`);if(n[i]=a.valeur,n.lignes[i]=t,i===`nom`||i===`description`){let t=Ot(e);t&&(n.textes={...n.textes,[i]:{type:`Chaine`,parties:[{type:`texte`,valeur:a.valeur}],versions:t,ligne:a.ligne}})}}),n}function sn(e,t){let n=e.avancer();e.avancer();let r={type:`Apercu`,indexation:!0,ligne:n.ligne};return an(e,()=>{let n=e.actuel().ligne,i=nn(e,`titre, description, image ou indexation`);if(i===`indexation`){r.indexation=rn(e);return}if(!Qt.includes(i))throw new j(`« ${i} » n'est pas une ligne du bloc « apercu ». Lignes possibles : titre, description, image ou indexation.`,n);let a=i;if(r[a]!==void 0)throw new j(`« ${a} » est déjà donné dans le bloc « apercu ».`,n);r[a]=t(e)}),r}var cn=class{position=0;tokens=[];liaisons=new Map;constructor(e){let t;for(let n of e){if(n.type===`LIAISON`){t=n;continue}t&&this.liaisons.set(this.tokens.length,t),this.tokens.push(n),t=void 0}}liaisonAvant(){return this.liaisons.get(Math.min(this.position,this.tokens.length-1))}accepterLiaison(e){let t=this.liaisonAvant();return!t||t.valeur!==e?!1:(this.liaisons.delete(Math.min(this.position,this.tokens.length-1)),!0)}messageLiaison(e){let t=this.liaisonAvant();if(!t)return;let n=t.original??t.valeur;return`« ${n} » est un petit mot ignoré par Humalis : il ne peut pas servir de nom. Choisissez un autre nom pour ${e.replace(/^le nom de /,``)}, par exemple « ${n.replace(/'$/,``)}_1 » ou un mot plus parlant.`}actuel(){return this.tokens[Math.min(this.position,this.tokens.length-1)]}regarder(e){return this.tokens[Math.min(this.position+e,this.tokens.length-1)]}avancer(){let e=this.actuel();return this.position<this.tokens.length-1&&this.position++,e}verifier(e,t){let n=this.actuel();return n.type===e?t===void 0||n.valeur===t:!1}accepter(e,t){return this.verifier(e,t)?(this.avancer(),!0):!1}attendre(e,t,n){if(this.verifier(e,t))return this.avancer();let r=this.actuel();throw new j(`il manque ${n??(t?`« ${t} »`:e)} : à la place, on trouve ${r.type===`FIN_FICHIER`?`la fin du fichier`:r.type===`FIN_LIGNE`?`la fin de la ligne`:`« ${r.valeur||r.type} »`}`,r.ligne)}verifierNom(){let e=this.actuel();return e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&!e.reserve}attendreNom(e){let t=this.actuel();if(this.verifierNom())return this.avancer(),{...t,nom:t.original??t.valeur};let n=this.messageLiaison(e);if(n)throw new j(n,t.ligne);if(t.type===`MOT_CLE`)throw new j(`« ${t.original??t.valeur} » est un mot réservé du langage : il ne peut pas servir de nom. Choisissez un autre nom pour ${e.replace(/^le nom de /,``)}.`,t.ligne);return{...this.attendre(`IDENTIFIANT`,void 0,e),nom:``}}estFini(){return this.actuel().type===`FIN_FICHIER`}sauterFinsDeLigne(){for(;this.verifier(`FIN_LIGNE`);)this.avancer()}};const ln=e=>A(e.original??e.valeur),un=e=>e.original??e.valeur;function dn(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom de la source entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la source`);let r={type:`Source`,nom:n,session:!1,entetes:[],donnees:[],routes:[],ligne:t.ligne};return jr(e,()=>{let t=e.actuel();switch(ln(t)){case`adresse`:e.avancer(),r.adresse=e.attendre(`CHAINE`,void 0,`l'adresse de l'API entre guillemets`).valeur;break;case`session`:if(e.avancer(),!I(e.actuel(),`astratra`))throw new j(`« session » est suivi de « astratra » : la connexion des packs Astratra (session astratra)`,t.ligne);e.avancer(),r.session=!0;break;case`enveloppe`:e.avancer(),r.enveloppe=e.attendre(`CHAINE`,void 0,`le chemin de la valeur utile entre guillemets (enveloppe "data")`).valeur;break;case`erreur`:e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du chemin du message (erreur dans "message")`),r.erreurDans=e.attendre(`CHAINE`,void 0,`le chemin du message entre guillemets`).valeur;break;case`entete`:{e.avancer();let n=e.attendre(`CHAINE`,void 0,`le nom de l'en-tête entre guillemets`).valeur;I(e.actuel(),`vaut`)||e.attendre(`IDENTIFIANT`,`vaut`,`« vaut » suivi de la valeur (entete "Accept-Language" vaut "fr")`),e.avancer();let i=e.attendre(`CHAINE`,void 0,`la valeur de l'en-tête entre guillemets`).valeur;r.entetes.push({nom:n,valeur:i,ligne:t.ligne});break}case`jeton`:r.jeton=mn(e);break;case`cache`:e.avancer(),r.cache=pn(e,`cache 5 minutes`);break;case`delai`:e.avancer(),r.delai=pn(e,`delai 10 secondes`);break;case`essais`:e.avancer(),r.essais=fn(e,`essais 2`);break;case`donnee`:r.donnees.push(Pr(e,!0));break;case`route`:r.routes.push(_n(e));break;default:throw new j(`« ${un(t)} » n'est pas une ligne d'une source. Lignes possibles : adresse, session, enveloppe, erreur, entete, jeton, cache, essais, delai, donnee, route.`,t.ligne)}}),r}function fn(e,t){let n=e.attendre(`NOMBRE`,void 0,`un nombre entier (${t})`),r=Number(n.valeur);if(!Number.isInteger(r)||r<0)throw new j(`un nombre entier est attendu (${t}), mais « ${n.valeur} » a été trouvé`,n.ligne);return r}function pn(e,t){let n=fn(e,t),r=e.actuel(),i={seconde:1,secondes:1,minute:60,minutes:60,heure:3600,heures:3600}[ln(r)];if(i===void 0)throw new j(`une durée s'écrit avec un nombre entier et une unité : ${t} (secondes, minutes ou heures)`,r.ligne);return e.avancer(),n*i}function mn(e){let t=e.avancer(),n=e.actuel(),r=ln(n),i;if(r===`public`)e.avancer(),i=e.attendre(`CHAINE`,void 0,`le jeton public entre guillemets (jeton public "pk_…")`).valeur;else if(r===`secret`){if(e.avancer(),e.verifier(`CHAINE`))throw new j(`un jeton secret ne s'écrit jamais dans le fichier. Écrivez son nom : jeton secret depuis l'environnement "NOM_DE_LA_VARIABLE", et mettez la valeur dans le fichier .env du serveur.`,t.ligne);I(e.actuel(),`depuis`)||e.attendre(`IDENTIFIANT`,`depuis`,`« depuis l'environnement "NOM" » après « jeton secret »`),e.avancer(),I(e.actuel(),`environnement`)||e.attendre(`IDENTIFIANT`,`environnement`,`« environnement » après « depuis » (depuis l'environnement "NOM")`),e.avancer(),i=e.attendre(`CHAINE`,void 0,`le nom de la variable d'environnement entre guillemets`).valeur}else throw new j(`après « jeton », écrivez « public "…" » (valeur faite pour être vue) ou « secret depuis l'environnement "NOM" » ; « ${un(n)} » a été trouvé`,n.ligne);let a={genre:`autorisation`};if(e.accepter(`MOT_CLE`,`dans`)){let t=e.actuel(),n=ln(t);if(n!==`entete`&&n!==`parametre`)throw new j(`« dans » est suivi de « entete "X" » ou de « parametre "key" » ; « ${un(t)} » a été trouvé`,t.ligne);e.avancer(),a={genre:n,nom:e.attendre(`CHAINE`,void 0,`le nom de l'${n===`entete`?`en-tête`:`paramètre`} entre guillemets`).valeur}}return{genre:r,valeur:i,place:a,ligne:t.ligne}}const hn={"tout monde":`tout_le_monde`,connecte:`connecte`,"utilisateur connecte":`connecte`,"seul admin":`admin`,admin:`admin`},gn=[`lire`,`creer`,`modifier`,`supprimer`];function _n(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`l'adresse de la route entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après l'adresse de la route`);let r=[];return jr(e,()=>r.push(vn(e))),{type:`RouteSource`,adresse:n,regles:r,ligne:t.ligne}}function vn(e){let t=e.actuel(),n,r=0;for(;![`FIN_LIGNE`,`FIN_FICHIER`,`INDENT`,`DEDENT`].includes(e.regarder(r).type)&&!I(e.regarder(r),`peut`);)r++;if(I(e.regarder(r),`peut`)){let r=[];for(;!I(e.actuel(),`peut`);)r.push(ln(e.avancer()));if(n=hn[r.join(` `)],!n)throw new j(`qui peut agir ? Écrivez « tout le monde », « connecte » ou « seul admin », puis « peut … »`,t.ligne);e.avancer()}let i=e.avancer(),a=ln(i);if(!gn.includes(a))throw new j(`« ${un(i)} » n'est pas une action. Actions possibles : ${gn.join(`, `)}.`,i.ligne);let o=I(e.actuel(),`liste`);o&&e.avancer();let{nom:s}=e.attendreNom(`le nom de la donnée`),c=!1;if(e.verifier(`MOT_CLE`,`par`)){if(e.avancer(),!I(e.actuel(),`remplacement`)||a!==`modifier`)throw new j(`« par remplacement » ne suit que « modifier » (modifier produit par remplacement)`,i.ligne);e.avancer(),c=!0}let l;return e.accepter(`MOT_CLE`,`dans`)&&(l=e.attendre(`CHAINE`,void 0,`le chemin de la valeur dans la réponse, entre guillemets`).valeur),{type:`RegleSource`,qui:n,action:a,liste:o,donnee:s,...c?{remplacement:c}:{},dans:l,ligne:t.ligne}}function yn(e){if(I(e.actuel(),`source`)&&e.regarder(1).type===`CHAINE`)return e.avancer(),e.avancer().valeur}function bn(e){let t={};if(I(e.actuel(),`source`)&&e.regarder(1).type===`CHAINE`&&(e.avancer(),t.source=e.avancer().valeur),I(e.actuel(),`filtrant`)){e.avancer(),e.attendre(`MOT_CLE`,`par`,`« par » après « filtrant » (filtrant par categorie = "robes")`),t.filtrant=[];do{let n=e.attendreNom(`le nom du paramètre`).nom;e.attendre(`PONCTUATION`,`=`,`« = » entre le paramètre et sa valeur (filtrant par categorie = "robes")`),t.filtrant.push({cle:n,valeur:bi(e)})}while(e.accepter(`MOT_CLE`,`et`))}return t}function xn(e){let t={};if(e.verifier(`MOT_CLE`,`dans`)&&(e.avancer(),t.parent=e.attendre(`CHAINE`,void 0,`le nom de la page parente entre guillemets (page "commandes" dans "admin" :)`).valeur),I(e.actuel(),`adresse`)&&e.regarder(1).type===`CHAINE`&&(e.avancer(),t.adresse=e.avancer().valeur),I(e.actuel(),`reservee`)){let n=e.avancer(),r=e.actuel(),i=A(r.original??r.valeur);if(i!==`connecte`&&i!==`admin`)throw new j(`« reservee » est suivi de « connecte » ou de « admin » (page "admin" reservee a admin) ; « ${r.original??r.valeur} » a été trouvé`,n.ligne);e.avancer();let a;e.accepter(`MOT_CLE`,`sinon`)&&(e.attendre(`MOT_CLE`,`vers`,`« vers » suivi de la page, après « sinon » (sinon vers "connexion")`),a=e.attendre(`CHAINE`,void 0,`le nom de la page entre guillemets`).valeur),t.reservee={qui:i,...a===void 0?{}:{sinon:a},ligne:n.ligne}}let n=e.actuel();if(e.verifier(`MOT_CLE`,`dans`)||I(n,`adresse`)||I(n,`reservee`))throw new j(`« ${n.original??n.valeur} » n'est pas à sa place : dans l'en-tête d'une page, l'ordre est : dans "parent", puis a l'adresse "/…", puis reservee a …, puis avec parametre … et filtre …, puis deux-points`,n.ligne);return t}function Sn(e){let t=[],n=[];if(!e.accepter(`MOT_CLE`,`avec`))return{parametres:t,filtres:n};do{if(I(e.actuel(),`filtre`)){e.avancer();let{nom:t,ligne:r}=e.attendreNom(`le nom du filtre de la page (page "catalogue" avec filtre categorie :)`),i={nom:t,ligne:r};I(e.actuel(),`nombre`)?(e.avancer(),i.nombre=!0):I(e.actuel(),`texte`)&&e.avancer(),n.push(i);continue}I(e.actuel(),`parametre`)||e.attendre(`IDENTIFIANT`,`parametre`,`« parametre » ou « filtre » suivi de son nom (page "produit" avec parametre id :)`),e.avancer(),t.push(e.attendreNom(`le nom du paramètre de la page`).nom)}while(e.accepter(`MOT_CLE`,`et`));return{parametres:t,filtres:n}}const Cn=(e,t)=>(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t;function wn(e){return Cn(e.actuel(),`test`)&&e.regarder(1).type===`CHAINE`}function Tn(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du test entre guillemets`).valeur;e.attendre(`MOT_CLE`,`page`,`« de page » suivi du nom de la page testée`);let r=e.attendre(`CHAINE`,void 0,`le nom de la page testée entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la page, puis les étapes du test en dessous, décalées`);let i=[];if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)i.push(Dn(e)),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}return{type:`Test`,nom:n,page:r,etapes:i,ligne:t.ligne}}const En=(e,t)=>e.attendre(`CHAINE`,void 0,t).valeur;function Dn(e){let t=e.actuel(),n=t.ligne;if(Cn(t,`cliquer`))return e.avancer(),e.attendre(`MOT_CLE`,`sur`,`« sur » suivi du libellé ou du nom de l'élément`),{type:`Cliquer`,cible:En(e,`le libellé de l'élément entre guillemets`),ligne:n};if(Cn(t,`remplir`)){e.avancer(),e.attendre(`MOT_CLE`,`champ`,`« champ » suivi du libellé du champ`);let t=En(e,`le libellé du champ entre guillemets`);return e.attendre(`MOT_CLE`,`avec`,`« avec » suivi du texte à écrire`),{type:`RemplirChamp`,cible:t,valeur:En(e,`le texte à écrire entre guillemets`),ligne:n}}if(Cn(t,`aller`))return e.avancer(),e.attendre(`MOT_CLE`,`vers`,`« vers » suivi du nom de la page`),{type:`AllerVers`,cible:En(e,`le nom de la page entre guillemets`),ligne:n};if(Cn(t,`verifier`)){if(e.avancer(),Cn(e.actuel(),`que`)&&e.avancer(),e.accepter(`MOT_CLE`,`texte`)){let t=En(e,`le texte attendu entre guillemets`);e.attendre(`MOT_CLE`,`est`,`« est visible » ou « est absent »`);let r=e.actuel();if(Cn(r,`visible`))return e.avancer(),{type:`VerifierTexteVisible`,cible:t,ligne:n};if(Cn(r,`absent`))return e.avancer(),{type:`VerifierTexteAbsent`,cible:t,ligne:n};throw new j(`après « est », écrivez « visible » ou « absent ».`,r.ligne)}if(e.accepter(`MOT_CLE`,`page`))return e.attendre(`MOT_CLE`,`est`,`« est » suivi du nom de la page attendue`),{type:`VerifierPage`,cible:En(e,`le nom de la page attendue entre guillemets`),ligne:n};if(e.accepter(`MOT_CLE`,`champ`)){let t=En(e,`le libellé du champ entre guillemets`);if(!Cn(e.actuel(),`vaut`))throw new j(`il manque « vaut » suivi du texte attendu dans le champ.`,e.actuel().ligne);return e.avancer(),{type:`VerifierChamp`,cible:t,valeur:En(e,`le texte attendu entre guillemets`),ligne:n}}throw new j(`après « verifier que », écrivez texte "…" est visible, texte "…" est absent, page est "…" ou champ "…" vaut "…".`,n)}throw new j(`étape de test inconnue : « ${t.original??t.valeur} ». Étapes possibles : cliquer sur, remplir champ … avec, aller vers, verifier que …`,n)}const On=[{mot:`francais`,code:`fr`,nom:`français`,adjectif:`française`,nomPropre:`Français`,disponible:!0},{mot:`anglais`,code:`en`,nom:`anglais`,adjectif:`anglaise`,nomPropre:`English`,disponible:!0},{mot:`espagnol`,code:`es`,nom:`espagnol`,adjectif:`espagnole`,nomPropre:`Español`,disponible:!1},{mot:`portugais`,code:`pt`,nom:`portugais`,adjectif:`portugaise`,nomPropre:`Português`,disponible:!1},{mot:`swahili`,code:`sw`,nom:`swahili`,adjectif:`swahilie`,nomPropre:`Kiswahili`,disponible:!1},{mot:`lingala`,code:`ln`,nom:`lingala`,adjectif:`lingala`,nomPropre:`Lingála`,disponible:!1}];function kn(e){let t=e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase();return On.find(e=>e.mot===t)}const An=On.filter(e=>e.disponible),jn=[`icone`,`badge`,`avatar`,`progression`,`chargement`,`etoiles`,`compteur`,`audio`];function Mn(e){return e.type===`CHAINE`||e.type===`NOMBRE`||e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&(!e.reserve||[`vrai`,`faux`,`rien`].includes(e.valeur))||e.type===`PONCTUATION`&&e.valeur===`[`}function Nn(e){let t=e.actuel();if(N(t,`code`)&&N(e.regarder(1),`qr`)&&Mn(e.regarder(2)))return e.avancer(),e.avancer(),`qr`;let n=jn.find(e=>N(t,e));if(!n)return;let r=e.regarder(1),i=r.type===`FIN_LIGNE`||r.type===`MOT_CLE`&&r.valeur===`avec`;if(n===`chargement`&&i||Mn(r))return e.avancer(),n}const Pn=[`onglet`,`deroulant`];function Fn(e){return N(e.actuel(),`fil`)&&N(e.regarder(1),`ariane`)&&e.regarder(2).valeur===`:`}function In(e){return N(e.actuel(),`carte`)&&e.regarder(1).type===`CHAINE`&&!/^\p{Lu}/u.test(e.actuel().valeur)}function Ln(e){return N(e.actuel(),`marqueur`)&&Mn(e.regarder(1))}function Rn(e){return e.avancer(),e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean)}function zn(e,t){let n=e.avancer(),r=t.expression(e),i={},a=[];if(e.accepter(`MOT_CLE`,`avec`))do{let n=e.actuel(),r=A(n.original??n.valeur);if(n.type===`MOT_CLE`&&n.valeur===`style`)a.push(...Rn(e));else if(r===`latitude`||r===`longitude`||r===`zoom`){e.avancer();let a=r===`zoom`?`zoom 15`:r===`latitude`?`latitude -4,3250`:`longitude 15,3222`;if(!Mn(e.actuel())&&!(e.actuel().type===`PONCTUATION`&&[`-`,`(`].includes(e.actuel().valeur)))throw new j(`il manque la valeur après « ${r} » : ${a}`,n.ligne);i[r]=t.expression(e)}else if(r===`tuiles`||r===`attribution`)e.avancer(),i[r]=e.attendre(`CHAINE`,void 0,r===`tuiles`?`l’adresse des tuiles entre guillemets : tuiles "https://exemple.cd/{z}/{x}/{y}.png"`:`le texte de l’attribution entre guillemets : attribution "© MapTiler"`).valeur;else throw new j(`« ${n.original??n.valeur} » ne se règle pas sur une carte. Réglages possibles : latitude, longitude, zoom, tuiles, attribution, style.`,n.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Bloc`,genre:`carte`,styles:[],classes:a,titre:r,carte:i,corps:e.accepter(`PONCTUATION`,`:`)?t.corps(e):[],ligne:n.ligne}}function Bn(e,t){let n=e.avancer(),r=t(e),i={},a=[];if(e.accepter(`MOT_CLE`,`avec`))do{let n=e.actuel(),r=A(n.original??n.valeur);if(n.type===`MOT_CLE`&&n.valeur===`style`)a.push(...Rn(e));else if(r===`latitude`||r===`longitude`||r===`adresse`){if(e.avancer(),!Mn(e.actuel())&&!(e.actuel().type===`PONCTUATION`&&[`-`,`(`].includes(e.actuel().valeur)))throw new j(`il manque la valeur après « ${r} » : marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070`,n.ligne);i[r]=t(e)}else throw new j(`« ${n.original??n.valeur} » ne se règle pas sur un marqueur. Réglages possibles : latitude, longitude, adresse, style.`,n.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Element`,element:`marqueur`,contenu:r,styles:[],classes:a,lieu:i,ligne:n.ligne}}function Vn(e){return N(e.actuel(),`fichier`)&&e.regarder(1).type===`CHAINE`}function Hn(e){return N(e.actuel(),`fichier`)}const Un={o:1,octets:1,octet:1,ko:1024,mo:1048576,go:1073741824};function Wn(e,t){let n=e.avancer(),r=t(e);e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la variable qui recevra le fichier : fichier "Choisir une photo" dans photo`);let i={variable:e.attendreNom(`le nom de la variable qui recevra le fichier`).nom,accepte:[]};if(N(e.actuel(),`accepte`)){e.avancer();do{let t=e.actuel();if(t.type!==`IDENTIFIANT`&&t.type!==`MOT_CLE`)throw new j(`il manque ce que le fichier peut être : accepte images, accepte pdf, accepte images ou pdf`,t.ligne);i.accepte.push(A(e.avancer().valeur))}while(e.accepter(`MOT_CLE`,`ou`))}let a,o=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel(),n=A(t.valeur);if(n===`maximum`){e.avancer();let t=e.attendre(`NOMBRE`,void 0,`une taille après « maximum » : maximum 5 Mo`),n=e.actuel(),r=n.type===`IDENTIFIANT`?Un[A(n.valeur)]:void 0;if(r===void 0)throw new j(`la taille maximale a une unité : « maximum 500 Ko » ou « maximum 5 Mo »`,n.ligne);e.avancer(),i.octets=Math.round(Number(t.valeur)*r)}else if(n===`plusieurs`)e.avancer(),i.plusieurs=!0;else if(t.type===`IDENTIFIANT`&&n===`nom`)e.avancer(),a=e.attendre(`CHAINE`,void 0,`le nom de l'élément entre guillemets`).valeur;else if(t.type===`MOT_CLE`&&t.valeur===`style`)e.avancer(),o.push(...e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean));else throw new j(`« ${t.original??t.valeur} » ne se règle pas sur un choix de fichier. Réglages possibles : maximum 5 Mo, plusieurs, nom "…", style "…".`,t.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Element`,element:`fichier`,contenu:r,styles:[],classes:o,nom:a,fichier:i,ligne:n.ligne}}function Gn(e,t){e.avancer();let n=e.attendreNom(`le nom de la variable qui contient le fichier choisi`).nom;e.attendre(`MOT_CLE`,`vers`,`« vers » suivi de la route : envoyer fichier photo vers "api/photo" de la source "boutique"`);let r=e.attendre(`CHAINE`,void 0,`la route entre guillemets`).valeur,i=yn(e),a={type:`EnvoiFichier`,variable:n,adresse:r,...i===void 0?{}:{source:i},ligne:t};if(N(e.actuel(),`en`)&&N(e.regarder(1),`corps`)&&N(e.regarder(2),`brut`)&&(e.avancer(),e.avancer(),e.avancer(),a.corpsBrut=!0),N(e.actuel(),`sous`)&&N(e.regarder(1),`nom`)){if(a.corpsBrut)throw new j(`« en corps brut » envoie le fichier seul, sans formulaire : il n'a pas de nom de champ. Gardez « en corps brut » ou « sous le nom "photo" », pas les deux.`,e.actuel().ligne);e.avancer(),e.avancer(),a.champ=e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets : sous le nom "photo"`).valeur}return N(e.actuel(),`suivi`)&&(e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la variable de progression : suivi dans envoi`),a.suivi=e.attendreNom(`le nom de la variable de progression`).nom),N(e.actuel(),`et`)&&N(e.regarder(1),`fichier`)&&e.avancer(),N(e.actuel(),`fichier`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`dans`&&(e.avancer(),e.avancer(),a.resultat=e.attendreNom(`le nom de la variable qui recevra la réponse`).nom),a}const Kn={clair:`#ffffff`,sombre:`#141416`},qn=`#1d1d1f`;function Jn(e){let t=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(e.trim());if(!t)return;let n=t[1].length===3?[...t[1]].map(e=>e+e).join(``):t[1];return[0,2,4].map(e=>parseInt(n.slice(e,e+2),16))}function Yn(e){let t=Jn(e);return t?`#${t.map(e=>e.toString(16).padStart(2,`0`)).join(``)}`:void 0}function Xn(e){let[t,n,r]=(Jn(e)??[0,0,0]).map(e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4});return .2126*t+.7152*n+.0722*r}function Zn(e,t){let[n,r]=[Xn(e),Xn(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function Qn(e){return Zn(e,`#ffffff`)>=Zn(e,qn)?`#ffffff`:qn}const $n=[`automatique`,`clair`,`sombre`],er=[`etroite`,`normale`,`large`,`pleine`],tr=[`titres`,`texte`,`code`],nr=/\.(woff2|woff|ttf|otf)$/i,rr=[`page`,`encre`];function ir(e){return N(e.actuel(),`theme`)&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`:`}function ar(e,t){let n=e.actuel();if(!P(n))throw new j(`il manque ${t} : à la place, on trouve « ${n.valeur||n.type} »`,n.ligne);return e.avancer(),A(n.original??n.valeur)}function or(e,t){let n=e.attendre(`CHAINE`,void 0,`la couleur de « ${t} » entre guillemets, par exemple "#0e5a6b"`),r=Yn(n.valeur);if(!r)throw new j(`« ${n.valeur} » n’est pas une couleur. Écrivez-la entre guillemets sous la forme "#0e5a6b" (ou "#fff").`,n.ligne);return r}function sr(e){let t=e.avancer();e.avancer();let n={type:`Theme`,couleurs:[],polices:[],ligne:t.ligne};if(e.sauterFinsDeLigne(),!e.accepter(`INDENT`))return n;for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let t=e.actuel().ligne,r=ar(e,`une ligne du thème (couleur, police, mode ou largeur)`);if(r===`couleur`){let{nom:r}=e.attendreNom(`le nom de la couleur`),i=A(r);if(rr.includes(i))throw new j(`le nom « ${i} » est pris par le thème lui-même : choisissez un autre nom pour la couleur.`,t);if(!/^[a-z][a-z0-9_]*$/.test(i))throw new j(`le nom de couleur « ${r} » ne doit contenir que des lettres, des chiffres et des tirets bas.`,t);if(n.couleurs.some(e=>e.nom===i))throw new j(`la couleur « ${i} » est déjà déclarée dans le thème.`,t);let a,o;if(N(e.actuel(),`clair`)){if(e.avancer(),a=or(e,i),!N(e.actuel(),`sombre`))throw new j(`il manque « sombre » suivi de la couleur du mode sombre : couleur ${i} clair "${a}" sombre "#…"`,e.actuel().ligne);e.avancer(),o=or(e,i)}else a=or(e,i);n.couleurs.push({nom:i,clair:a,...o?{sombre:o}:{},ligne:t})}else if(r===`police`){let r=ar(e,`le rôle de la police (titres, texte ou code)`);if(!tr.includes(r))throw new j(`« ${r} » n’est pas un rôle de police. Rôles possibles : ${tr.join(`, `)}.`,t);if(n.polices.some(e=>e.role===r))throw new j(`la police « ${r} » est déjà déclarée dans le thème.`,t);let i=e.attendre(`CHAINE`,void 0,`le nom de la police entre guillemets`).valeur,a;if(N(e.actuel(),`depuis`)&&(e.avancer(),a=e.attendre(`CHAINE`,void 0,`le chemin du fichier de police entre guillemets`).valeur,!nr.test(a)))throw new j(`le fichier de police « ${a} » doit finir par .woff2, .woff, .ttf ou .otf.`,t);n.polices.push({role:r,nom:i,...a?{fichier:a}:{},ligne:t})}else if(r===`mode`||r===`largeur`){let i=r===`mode`?$n:er,a=ar(e,`la valeur de « ${r} »`);if(!i.includes(a))throw new j(`« ${a} » n’est pas une valeur possible pour « ${r} ». Valeurs possibles : ${i.join(`, `)}.`,t);n[r]={valeur:a,ligne:t}}else throw new j(`« ${r} » n’est pas une ligne du thème. Lignes possibles : couleur, police, mode, largeur.`,t);e.sauterFinsDeLigne()}return e.accepter(`DEDENT`),n}const cr=e=>N(e.actuel(),`basculer`)&&N(e.regarder(1),`theme`);function lr(e){if(cr(e))return!0;if(!(e.verifier(`MOT_CLE`,`changer`)&&N(e.regarder(1),`theme`)&&e.regarder(2).valeur===`par`))return!1;let t=e.regarder(3);return t.type===`CHAINE`||P(t)&&$n.includes(A(t.valeur))}function ur(e){if(cr(e)){let t=e.avancer();return{type:`Action`,action:`changerTheme`,arguments:[{type:`Chaine`,parties:[{type:`texte`,valeur:`bascule`}],ligne:e.avancer().ligne}],ligne:t.ligne}}let t=e.avancer();e.avancer(),e.avancer();let n=e.avancer();return{type:`Action`,action:`changerTheme`,arguments:[{type:`Chaine`,parties:[{type:`texte`,valeur:n.type===`CHAINE`?n.valeur:A(n.valeur)}],ligne:n.ligne}],ligne:t.ligne}}function F(e,t){return(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t}const dr=e=>e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&!e.reserve,fr={milliseconde:`milliseconde`,millisecondes:`milliseconde`,ms:`milliseconde`,seconde:`seconde`,secondes:`seconde`,minute:`minute`,minutes:`minute`,heure:`heure`,heures:`heure`},pr={milliseconde:1,seconde:1e3,minute:6e4,heure:36e5};function mr(e){if(e.type===`IDENTIFIANT`||e.type===`MOT_CLE`)return fr[A(e.original??e.valeur)]}function hr(e,t=0){let n=e.regarder(t);return(n.type===`NOMBRE`||dr(n))&&mr(e.regarder(t+1))!==void 0}function gr(e,t,n){let r=e.actuel();if(r.type!==`NOMBRE`&&!dr(r))throw new j(`il manque une durée : un nombre suivi de son unité, par exemple « ${n} ».`,r.ligne);let i=t.expression(e),a=mr(e.actuel());if(!a)throw new j(`il manque l’unité de la durée après le nombre : millisecondes, secondes, minutes ou heures (par exemple « ${n} »).`,e.actuel().ligne);return e.avancer(),{valeur:i,unite:a,ligne:r.ligne}}function _r(e,t,n){let r=n?{genre:n}:{};for(;;)if(F(e.actuel(),`pendant`)&&hr(e,1))e.avancer(),r.duree=gr(e,t,`pendant 10 secondes`);else if(F(e.actuel(),`sans`)&&F(e.regarder(1),`disparaitre`))e.avancer(),e.avancer(),r.persistant=!0;else if(e.verifier(`MOT_CLE`,`avec`)&&F(e.regarder(1),`action`)){let n=e.avancer().ligne;e.avancer();let i=e.attendre(`CHAINE`,void 0,`le texte du bouton entre guillemets (avec action "Annuler" :)`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le texte du bouton, puis ce qu’il fait en dessous, décalé`),r.action={libelle:i,corps:t.bloc(e),ligne:n}}else break;return Object.keys(r).length>0?r:void 0}function vr(e){let t=e.actuel(),n=e.regarder(1),r=n.type===`CHAINE`||n.type===`NOMBRE`||dr(n)||n.type===`PONCTUATION`&&[`[`,`(`].includes(n.valeur);return(F(t,`apres`)||F(t,`toutes`)||F(t,`tous`))&&(hr(e,1)||n.type===`NOMBRE`)||(F(t,`copier`)||F(t,`partager`)||F(t,`confirmer`))&&r||F(t,`fenetre`)&&n.type===`CHAINE`}function yr(e,t){let n=e.actuel();return F(n,`copier`)?xr(e,t):F(n,`partager`)?Sr(e,t):F(n,`confirmer`)?Cr(e,t):F(n,`fenetre`)?wr(e,t):br(e,t)}function br(e,t){let n=e.avancer(),r=F(n,`apres`)?`apres`:`toutes`,i=gr(e,t,r===`apres`?`apres 3 secondes`:`toutes les 5 secondes`),a;F(e.actuel(),`tant`)&&F(e.regarder(1),`que`)&&(e.avancer(),e.avancer(),a=t.comparaison(e));let o=r===`apres`?`apres …`:`toutes les …`;return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de « ${o} », puis ce qu’il faut faire en dessous, décalé`),{type:`Minuterie`,mode:r,duree:i,...a?{tantQue:a}:{},corps:t.bloc(e),ligne:n.ligne}}function xr(e,t){let n=e.avancer(),r=t.expression(e);if(e.verifier(`MOT_CLE`,`avec`)&&F(e.regarder(1),`message`)){e.avancer(),e.avancer();let t=e.attendre(`CHAINE`,void 0,`le texte du message entre guillemets (copier code avec message "Code copié")`),i=Ot(e),a=i?{texte:{type:`Chaine`,parties:t.parties??[],versions:i,ligne:t.ligne}}:{};return{type:`Copier`,valeur:r,message:t.valeur,...a,ligne:n.ligne}}return F(e.actuel(),`sans`)&&F(e.regarder(1),`message`)?(e.avancer(),e.avancer(),{type:`Copier`,valeur:r,message:null,ligne:n.ligne}):{type:`Copier`,valeur:r,ligne:n.ligne}}function Sr(e,t){let n=e.avancer(),r={type:`Partager`,texte:t.expression(e),ligne:n.ligne};for(;e.accepter(`MOT_CLE`,`avec`)||e.accepter(`MOT_CLE`,`et`);){let n=e.actuel();if(F(n,`titre`))e.avancer(),r.titre=t.expression(e);else if(F(n,`lien`))e.avancer(),e.accepter(`MOT_CLE`,`vers`),r.lien={adresse:e.attendre(`CHAINE`,void 0,`l’adresse du lien entre guillemets (avec lien "https://…" ou avec lien vers "produit")`).valeur};else if(r.lien&&dr(n))(r.lien.parametres??=[]).push(t.argumentPage(e));else throw new j(`après « partager … avec », on écrit « titre "…" » ou « lien "…" » (ici : « ${n.original??n.valeur} »).`,n.ligne)}return r}function Cr(e,t){let n=e.avancer(),r=t.expression(e),i={};if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel(),n=F(t,`oui`)?`oui`:F(t,`non`)?`non`:void 0;if(!n)throw new j(`après « confirmer … avec », on nomme les boutons : avec oui "Supprimer" et non "Garder" (ici : « ${t.original??t.valeur} »).`,t.ligne);e.avancer(),i[n]=e.attendre(`CHAINE`,void 0,`le texte du bouton « ${n} » entre guillemets`).valeur}while(e.accepter(`MOT_CLE`,`et`));e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de « confirmer … », puis ce qu’il faut faire si la personne répond oui, décalé`);let a=t.bloc(e),o=[];return e.sauterFinsDeLigne(),e.accepter(`MOT_CLE`,`sinon`)&&(e.attendre(`PONCTUATION`,`:`,`deux-points après « sinon »`),o=t.bloc(e)),{type:`Confirmer`,question:r,...i,alors:a,sinon:o,ligne:n.ligne}}function wr(e,t){let n=e.avancer(),r={type:`Fenetre`,titre:e.attendre(`CHAINE`,void 0,`le titre de la fenêtre entre guillemets`).valeur,classes:[],corps:[],ligne:n.ligne};if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel();if(F(t,`nom`))e.avancer(),r.nom=e.attendre(`CHAINE`,void 0,`le nom de la fenêtre entre guillemets`).valeur;else if(F(t,`description`))e.avancer(),r.description=e.attendre(`CHAINE`,void 0,`la description entre guillemets`).valeur;else if(F(t,`obligatoire`))e.avancer(),r.obligatoire=!0;else if(F(t,`style`))e.avancer(),r.classes.push(...e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean));else throw new j(`« ${t.original??t.valeur} » n’est pas une option de fenêtre. Options possibles : nom, description, obligatoire, style.`,t.ligne)}while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « fenetre », puis son contenu en dessous, décalé`),r.corps=t.bloc(e),r}function Tr(e,t){let n=e.actuel();if(F(n,`appuie`)||F(n,`appuies`)){e.avancer(),e.attendre(`MOT_CLE`,`sur`,`« sur » suivi des touches entre guillemets (appuie sur "controle+k")`);let t=e.attendre(`CHAINE`,void 0,`les touches entre guillemets, par exemple "controle+k"`).valeur,n=e.accepter(`MOT_CLE`,`dans`)?e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur:void 0;return{genre:`touche`,touches:t,...n===void 0?{}:{cible:n}}}if(F(n,`ecrit`)||F(n,`ecrire`))return e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du nom du champ (ecrit dans "recherche")`),{genre:`saisie`,cible:e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur};if(F(n,`arrete`)&&F(e.regarder(1),`ecrire`)){e.avancer(),e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du nom du champ (arrete d’ecrire dans "recherche")`);let n=e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur,r;return F(e.actuel(),`apres`)&&(e.avancer(),r=gr(e,t,`apres 300 millisecondes`)),{genre:`pauseSaisie`,cible:n,...r?{duree:r}:{}}}if(F(n,`arrive`)&&F(e.regarder(1),`en`)&&F(e.regarder(2),`bas`)){e.avancer(),e.avancer(),e.avancer();let n={genre:`bas`,cible:e.attendre(`CHAINE`,void 0,`le nom du bloc entre guillemets (arrive en bas de "catalogue")`).valeur};for(;;)if(F(e.actuel(),`tant`)&&F(e.regarder(1),`que`))e.avancer(),e.avancer(),n.tantQue=t.comparaison(e);else if(e.verifier(`MOT_CLE`,`avec`)&&F(e.regarder(1),`bouton`))e.avancer(),e.avancer(),n.bouton=e.attendre(`CHAINE`,void 0,`le texte du bouton entre guillemets (avec bouton "Voir plus")`).valeur;else if(F(e.actuel(),`sans`)&&F(e.regarder(1),`bouton`))e.avancer(),e.avancer(),n.bouton=null;else break;return n}}function Er(e){return F(e.actuel(),`ordre`)&&dr(e.regarder(1))&&F(e.regarder(2),`change`)}function Dr(e){e.avancer();let t=e.attendreNom(`le nom de la liste`).nom;return e.avancer(),{genre:`ordre`,variable:t}}function Or(e){let t=new cn(e),n=[],r=[],i=[],a=[],o=[],s=[],c=[],l=[],u=[],d=[],f=[],p=[],m,h,g,_=[],v=[],y,ee,te=new Set;for(t.sauterFinsDeLigne();!t.estFini();){if(t.verifier(`MOT_CLE`,`style`)&&t.regarder(1).valeur===`:`){let e=t.avancer();t.avancer(),t.sauterFinsDeLigne();let n=t.accepter(`CSS`)?t.regarder(-1).valeur:``;r.push({type:`BlocStyle`,css:n,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(Jt(t)){let e=Yt(t,{corps:L,style:oi});if(e.genre===`entete`?y:ee)throw new j(`un seul « ${e.genre} » par application : il est déjà déclaré plus haut.`,e.ligne);e.genre===`entete`?y=e:ee=e,t.sauterFinsDeLigne();continue}if(ir(t)){if(m)throw new j(`un seul bloc « theme » par application : réunissez les couleurs et les polices dans le même bloc.`,t.actuel().ligne);m=sr(t),t.sauterFinsDeLigne();continue}if(en(t)){if(h)throw new j(`un seul bloc « site » par application : il est déjà déclaré (ligne ${h.ligne}).`,t.actuel().ligne);if(n.length>0)throw new j(`le bloc « site » s'écrit en haut du fichier, avant les pages.`,t.actuel().ligne);h=on(t),t.sauterFinsDeLigne();continue}if(St(t)){if(g)throw new j(`un seul bloc « langues » par application : il est déjà déclaré (ligne ${g.ligne}).`,t.actuel().ligne);if(n.length>0)throw new j(`le bloc « langues » s'écrit en haut du fichier, avant les pages.`,t.actuel().ligne);g=Tt(t),t.sauterFinsDeLigne();continue}if(Ct(t)){_.push(Et(t)),t.sauterFinsDeLigne();continue}if(Ur(t)){v.push({...Wr(t),calcul:!0,constante:!0}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`variable`)){o.push(Wr(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`serveur`)&&t.regarder(1).type===`CHAINE`){u.push(Nr(t)),t.sauterFinsDeLigne();continue}if(wn(t)){p.push(Tn(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`fonction`)&&Ei(t.regarder(1))){f.push(Ar(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`source`)&&t.regarder(1).type===`CHAINE`){d.push(dn(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`composant`)&&t.regarder(1).type===`CHAINE`){l.push(zr(t)),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)&&I(t.regarder(1),`composant`)){let e=t.avancer();t.avancer();let n=t.attendre(`CHAINE`,void 0,`le nom du composant entre guillemets`).valeur;I(t.actuel(),`depuis`)||t.attendre(`IDENTIFIANT`,`depuis`,`« depuis » suivi du chemin du fichier React`),t.avancer();let r=t.attendre(`CHAINE`,void 0,`le chemin du fichier React entre guillemets`).valeur;s.push({type:`ComposantReact`,nom:n,chemin:r,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)&&I(t.regarder(1),`donnees`)){let e=t.avancer();t.avancer();let n=t.attendre(`CHAINE`,void 0,`le nom des données entre guillemets`).valeur;if(!I(t.actuel(),`depuis`))throw new j(`écrivez « depuis » puis le chemin du fichier CSV ou JSON.`,e.ligne);t.avancer();let r=t.attendre(`CHAINE`,void 0,`le chemin du fichier CSV ou JSON entre guillemets`).valeur;a.push({nom:n,chemin:r,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)&&I(t.regarder(1),`fichier`)){let e=t.avancer();t.avancer();let n=t.attendre(`CHAINE`,void 0,`le chemin du fichier Humalis entre guillemets`).valeur;c.push({chemin:n,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)){let e=t.avancer();t.attendre(`MOT_CLE`,`style`,`« style » après « utiliser »`);let n=t.attendre(`CHAINE`,void 0,`le chemin du fichier CSS entre guillemets`).valeur;i.push({type:`FichierStyle`,chemin:n,ligne:e.ligne}),t.sauterFinsDeLigne();continue}let e=Br(t);if(te.has(e.nom))throw new j(`la page « ${e.nom} » est déjà déclarée plus haut`,e.ligne);te.add(e.nom),n.push(e),t.sauterFinsDeLigne()}if(v.length>0)for(let e of[...n,...l,...y?[y]:[],...ee?[ee]:[]])e.corps.unshift(...v.map(e=>({...e})));let ne={type:`Programme`,pages:n,styles:r,fichiersStyle:i,donneesFichiers:a,partages:o,composantsReact:s,composants:l,serveurs:u,sources:d,fichiersHumalis:c,fonctions:f,tests:p,...m?{theme:m}:{},...h?{site:h}:{},...g?{langues:g}:{},..._.length?{traductions:_}:{},...y?{entete:y}:{},...ee?{pied:ee}:{}},re=ot(ne);return re.length&&(ne.fonctionsActions=re),ne}function kr(e){let t=e.avancer(),n=R(e);e.attendre(`PONCTUATION`,`:`,`deux-points après la valeur de « selon »`);let r=[],i=[];for(e.sauterFinsDeLigne(),e.attendre(`INDENT`,void 0,`des lignes « cas … : » décalées sous « selon »`),e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let t=e.actuel().ligne;if(I(e.actuel(),`cas`)){e.avancer();let n=[];do n.push(R(e));while(e.accepter(`MOT_CLE`,`ou`));e.attendre(`PONCTUATION`,`:`,`deux-points après les valeurs du « cas »`),r.push({valeurs:n,corps:L(e),ligne:t})}else if(e.accepter(`MOT_CLE`,`sinon`))e.attendre(`PONCTUATION`,`:`,`deux-points après « sinon »`),i=L(e);else throw new j(`dans « selon », chaque ligne commence par « cas … : » ou « sinon : ».`,t);e.sauterFinsDeLigne()}return e.accepter(`DEDENT`),{type:`Selon`,valeur:n,cas:r,sinon:i,ligne:t.ligne}}function Ar(e){let t=e.avancer(),{nom:n}=e.attendreNom(`le nom de la fonction`),r=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.attendreNom(`le nom d'une valeur que reçoit la fonction`);r.push({nom:t.nom,ligne:t.ligne})}while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « fonction », puis son corps en dessous, décalé`),{type:`Fonction`,nom:n,parametres:r,corps:L(e),ligne:t.ligne}}function I(e,t){return(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t}function jr(e,t){if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t(),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}}const Mr=e=>A(e.original??e.valeur);function Nr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du serveur entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom du serveur`);let r=[],i=[];return jr(e,()=>{let t=e.actuel();if(I(t,`donnee`))r.push(Pr(e));else if(I(t,`route`))i.push(Lr(e));else throw new j(`dans un serveur, on écrit « donnee … : » ou « route "…" : », mais « ${t.original??t.valeur} » a été trouvé`,t.ligne)}),{type:`Serveur`,nom:n,donnees:r,routes:i,ligne:t.ligne}}function Pr(e,t=!1){let n=e.avancer(),{nom:r}=e.attendreNom(`le nom de la donnée`);e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la donnée`);let i=[];return jr(e,()=>{let n=e.attendreNom(`le nom du champ`);e.attendre(`PONCTUATION`,`:`,`deux-points entre le nom du champ et son type`),i.push({nom:n.nom,type:Fr(e,t),ligne:n.ligne})}),{type:`Donnee`,nom:r,champs:i,ligne:n.ligne}}function Fr(e,t=!1){let n=e.avancer(),r=Mr(n);if(r===`texte`||r===`nombre`||r===`booleen`||r===`date`)return{genre:r};if(r===`liste`)return{genre:`liste`,de:Fr(e,t)};if(t&&Ei(n))return{genre:`donnee`,nom:n.original??n.valeur};throw new j(`« ${n.original??n.valeur} » n'est pas un type de champ. Types possibles : texte, nombre, booleen, date, liste de …`,n.ligne)}const Ir=[`lire`,`creer`,`modifier`,`supprimer`];function Lr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`l'adresse de la route entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après l'adresse de la route`);let r=[];return jr(e,()=>r.push(Rr(e))),{type:`Route`,adresse:n,regles:r,ligne:t.ligne}}function Rr(e){let t=e.actuel(),n=[];for(;!I(e.actuel(),`peut`)&&!e.verifier(`FIN_LIGNE`)&&!e.estFini();)n.push(Mr(e.avancer()));let r={"tout monde":`tout_le_monde`,connecte:`connecte`,"utilisateur connecte":`connecte`,"seul admin":`admin`,admin:`admin`}[n.join(` `)];if(!r)throw new j(`qui peut agir ? Écrivez « tout le monde », « connecte » ou « seul admin », puis « peut … »`,t.ligne);e.attendre(e.actuel().type===`MOT_CLE`?`MOT_CLE`:`IDENTIFIANT`,`peut`,`« peut » suivi d'une action`);let i=[];do{let t=e.avancer(),n=Mr(t);if(!Ir.includes(n))throw new j(`« ${t.original??t.valeur} » n'est pas une action. Actions possibles : ${Ir.join(`, `)}.`,t.ligne);i.push(n)}while(e.accepter(`MOT_CLE`,`et`));let{nom:a}=e.attendreNom(`le nom de la donnée`);return{type:`Regle`,qui:r,actions:i,donnee:a,ligne:t.ligne}}function zr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du composant entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom du composant`);let r=L(e);return{type:`DefinitionComposant`,nom:n,parametres:r.filter(e=>e.type===`Parametre`),corps:r.filter(e=>e.type!==`Parametre`),ligne:t.ligne}}function Br(e){let t=e.attendre(`MOT_CLE`,`page`,`une déclaration de page`),n=e.attendre(`CHAINE`,void 0,`le nom de la page entre guillemets`),r=xn(e),{parametres:i,filtres:a}=Sn(e),o=Xt(e);e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la page`);let s=L(e);for(let e of r.adresse?.matchAll(/:([A-Za-z_]\w*)/g)??[])i.includes(e[1])||i.push(e[1]);let c=s.filter(e=>e.type===`Apercu`);if(c.length>1)throw new j(`un seul bloc « apercu » par page : il est déjà écrit ligne ${c[0].ligne}.`,c[1].ligne);return{type:`Page`,nom:n.valeur,parametres:i,...a.length>0?{filtres:a}:{},...r,...o,...c.length?{apercu:c[0]}:{},corps:s.filter(e=>e.type!==`Apercu`),ligne:t.ligne}}function L(e){let t=[];if(e.sauterFinsDeLigne(),!e.accepter(`INDENT`))return t;for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t.push(Vr(e)),e.sauterFinsDeLigne();return e.accepter(`DEDENT`),t}function Vr(e){if(I(e.actuel(),`tableau`)&&(e.regarder(1).type===`CHAINE`||e.regarder(1).valeur===`:`)){let t=e.avancer(),n=e.verifier(`PONCTUATION`,`:`)?void 0:Di(e);e.attendre(`PONCTUATION`,`:`,`deux-points après la légende du tableau`),e.sauterFinsDeLigne();let r=[],i=[];if(e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let t=e.avancer();if(!I(t,`colonnes`)&&!I(t,`rangee`))throw new j(`un tableau contient « colonnes » et « rangee ».`,t.ligne);let n=[Di(e)];for(;e.accepter(`PONCTUATION`,`,`);)n.push(Di(e));I(t,`colonnes`)?r.push(...n):i.push(n),e.sauterFinsDeLigne()}e.accepter(`DEDENT`)}return{type:`TableauDocumentation`,...n?{legende:n}:{},colonnes:r,rangees:i,ligne:t.ligne}}if(I(e.actuel(),`liste`)&&(e.regarder(1).valeur===`:`||I(e.regarder(1),`numerotee`)&&e.regarder(2).valeur===`:`)){let t=e.avancer(),n=I(e.actuel(),`numerotee`);return n&&e.avancer(),e.attendre(`PONCTUATION`,`:`,`deux-points après « liste »`),{type:`Bloc`,genre:n?`listeNumerotee`:`liste`,styles:[],classes:[],corps:L(e),ligne:t.ligne}}if(I(e.actuel(),`code`)&&yi(e)){let t=e.avancer(),n=e.verifier(`PONCTUATION`,`:`)||I(e.actuel(),`avec`)?void 0:e.avancer().valeur,r;I(e.actuel(),`avec`)&&(e.avancer(),e.avancer(),e.avancer(),r=I(e.actuel(),`au`)?(e.avancer(),e.avancer(),`defilement`):`chargement`),e.attendre(`PONCTUATION`,`:`,`deux-points après « code »`),e.accepter(`FIN_LIGNE`);let i=e.attendre(`CODE_BRUT`,void 0,`les lignes du bloc de code`).valeur;return{type:`CodeDocumentation`,...n?{langage:n}:{},...r?{frappe:r}:{},code:i,ligne:t.ligne}}if(I(e.actuel(),`en`)&&I(e.regarder(1),`supposant`)){let t=e.avancer();for(let n of[`supposant`,`que`,`ca`,`marche`]){if(!I(e.actuel(),n))throw new j(`écrivez « en supposant que ça marche : »`,t.ligne);e.avancer()}return e.attendre(`PONCTUATION`,`:`,`deux-points après « en supposant que ça marche »`),{type:`Supposant`,corps:L(e),ligne:t.ligne}}if(e.verifier(`MOT_CLE`,`variable`))return Wr(e);if(I(e.actuel(),`continuer`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`vers`){let t=e.avancer();return e.avancer(),{type:`Action`,action:`rediriger`,arguments:[R(e)],continuer:!0,ligne:t.ligne}}if(tn(e))return sn(e,R);if(I(e.actuel(),`sous`)&&I(e.regarder(1),`page`)){let t=e.avancer();return e.avancer(),{type:`SousPage`,ligne:t.ligne}}if(I(e.actuel(),`revenir`)&&(e.regarder(1).type===`FIN_LIGNE`||e.regarder(1).type===`FIN_FICHIER`||e.regarder(1).type===`DEDENT`||e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`vers`)){let t=e.avancer();return{type:`Action`,action:`revenir`,arguments:e.accepter(`MOT_CLE`,`vers`)?[R(e)]:[],ligne:t.ligne}}if(I(e.actuel(),`recharger`)&&Ei(e.regarder(1))){let t=e.avancer();return{type:`Rechargement`,variable:e.attendreNom(`le nom de la variable à recharger`).nom,ligne:t.ligne}}if(I(e.actuel(),`essayer`)&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`:`){let t=e.avancer();e.avancer();let n=L(e);e.sauterFinsDeLigne();let r=[];return e.verifier(`MOT_CLE`,`si`)&&I(e.regarder(1),`erreur`)&&e.regarder(2).type===`PONCTUATION`&&e.regarder(2).valeur===`:`&&(e.avancer(),e.avancer(),e.avancer(),r=L(e)),{type:`Essayer`,corps:n,siErreur:r,ligne:t.ligne}}if(I(e.actuel(),`fonction`)&&Ei(e.regarder(1)))return Ar(e);if(Ei(e.actuel())&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`(`){let t=R(e);if(t.type===`Appel`)return{type:`Execution`,nom:t.nom,arguments:t.arguments,ligne:t.ligne}}if(Ur(e))return{...Wr(e),calcul:!0,constante:!0};if(e.verifier(`MOT_CLE`,`calcul`)&&Ei(e.regarder(1))&&e.regarder(2).type===`PONCTUATION`&&e.regarder(2).valeur===`=`)return{...Wr(e),calcul:!0};if(e.verifier(`MOT_CLE`,`si`))return fi(e);if(e.verifier(`MOT_CLE`,`quand`))return xi(e);if(I(e.actuel(),`tant`)&&I(e.regarder(1),`que`)){let t=e.avancer();e.avancer();let n=pi(e);return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de « tant que … »`),{type:`TantQue`,test:n,corps:L(e),ligne:t.ligne}}if(I(e.actuel(),`repeter`)&&(e.regarder(1).type!==`PONCTUATION`||e.regarder(1).valeur!==`=`)){let t=e.avancer(),n=R(e);if(!I(e.actuel(),`fois`))throw new j(`il manque « fois » : écrivez par exemple « repeter 3 fois : ».`,e.actuel().ligne);return e.avancer(),e.attendre(`PONCTUATION`,`:`,`deux-points après « fois »`),{type:`Repeter`,fois:n,corps:L(e),ligne:t.ligne}}if(I(e.actuel(),`arreter`)&&(e=>e.type===`FIN_LIGNE`||e.type===`FIN_FICHIER`||e.type===`DEDENT`)(e.regarder(1)))return{type:`Arreter`,ligne:e.avancer().ligne};if(I(e.actuel(),`passer`)&&I(e.regarder(1),`suivant`)){let t=e.avancer();return e.avancer(),{type:`PasserAuSuivant`,ligne:t.ligne}}if(I(e.actuel(),`selon`)&&(e.regarder(1).type!==`PONCTUATION`||e.regarder(1).valeur!==`=`))return kr(e);let t=e.regarder(1);if(I(e.actuel(),`rendre`)&&(ji(t)||t.type===`PONCTUATION`&&[`(`,`-`].includes(t.valeur)||t.type===`MOT_CLE`&&t.valeur===`rien`)){let t=e.avancer();return{type:`Rendre`,valeur:R(e),ligne:t.ligne}}if(e.verifier(`MOT_CLE`,`pour`))return Si(e);if(vr(e))return yr(e,ki);if(I(e.actuel(),`connecter`))return di(e);if(I(e.actuel(),`deconnecter`))return{type:`Deconnexion`,ligne:e.avancer().ligne};if(lr(e))return ur(e);if((I(e.actuel(),`supprimer`)||I(e.actuel(),`modifier`))&&Ei(e.regarder(1)))return ui(e);if(e.verifier(`MOT_CLE`,`formulaire`)&&e.regarder(1).type===`CHAINE`)return Zr(e);if($r(e))return ei(e);if(Kt(e))return qt(e,{corps:L});let n=e.actuel().ligne,r=Xr(e,Yr);if(r)return ni(e,{element:`champ`,ligne:n,sorte:r});if(Vn(e))return Wn(e,R);if(In(e))return zn(e,{expression:R,corps:L});if(Ln(e))return Bn(e,R);if(It(e))return zt(e,{expression:R});Lt(e)&&Rt(e);let i=e.actuel().ligne;if(kt(e))return e.avancer(),e.avancer(),ni(e,{element:`selecteurLangue`,ligne:i});let a=Nn(e);if(a)return ni(e,{element:a,ligne:i});if(si(e))return ci(e);if(I(e.actuel(),`soustitre`)&&ji(e.regarder(1))){let t=e.avancer().ligne;return ni(e,{element:`soustitre`,ligne:t})}if(Kr(e))return ni(e);if(I(e.actuel(),`parametre`)&&Ei(e.regarder(1))){let t=e.avancer();return{type:`Parametre`,nom:e.attendreNom(`le nom du paramètre`).nom,ligne:t.ligne}}if(e.actuel().type===`IDENTIFIANT`&&/^\p{Lu}/u.test(e.actuel().valeur))return Hr(e);let o=e.actuel();throw o.type===`IDENTIFIANT`&&ze(o.valeur)?new j(Ai(o),o.ligne):new j(`instruction inconnue : « ${o.valeur||o.type} »`,o.ligne)}function Hr(e){let t=e.avancer(),n=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.attendreNom(`le nom d'une propriété du composant`);n.push({nom:t.nom,valeur:R(e),ligne:t.ligne})}while(e.accepter(`MOT_CLE`,`et`));return{type:`Composant`,nom:t.valeur,proprietes:n,ligne:t.ligne}}function Ur(e){return I(e.actuel(),`constante`)&&Ei(e.regarder(1))&&e.regarder(2).type===`PONCTUATION`&&e.regarder(2).valeur===`=`}function Wr(e){let t=e.avancer(),{nom:n}=e.attendreNom(`le nom de la variable`);e.attendre(`PONCTUATION`,`=`,`le signe = après le nom de la variable`);let r=R(e);if(!e.accepter(`MOT_CLE`,`avec`))return{type:`Variable`,nom:n,valeur:r,ligne:t.ligne};let i={};do{let t=e.attendreNom(`une option de variable (partagee, memorisee)`),n=A(t.nom);if(n===`partagee`)i.partagee=!0;else if(n===`memorisee`){i.memorisee=!0;let t=e.actuel();if(t.type===`IDENTIFIANT`&&A(t.valeur)===`en`){e.avancer();let t=e.attendreNom(`« secret » après « memorisee en »`);if(A(t.nom)!==`secret`)throw new j(`« secret » est attendu après « memorisee en »`,t.ligne);i.secret=!0}}else throw new j(`« ${t.nom} » n'est pas une option de variable. Options possibles : partagee, memorisee.`,t.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Variable`,nom:n,valeur:r,options:i,ligne:t.ligne}}const Gr=[`titre`,`texte`,`image`,`bouton`,`lien`,`champ`];function Kr(e){let t=e.actuel();return t.type===`MOT_CLE`&&Gr.includes(t.valeur)}const qr=e=>e.type===`MOT_CLE`||e.type===`IDENTIFIANT`?Mr(e).replace(/[-_]/g,``):``,Jr=[[[`mot`,`passe`],`motDePasse`],[[`motdepasse`],`motDePasse`],[[`texte`,`long`],`texteLong`],[[`textelong`],`texteLong`],[[`adresse`,`web`],`adresseWeb`],[[`adresseweb`],`adresseWeb`],[[`email`],`email`],[[`telephone`],`telephone`],[[`nombre`],`nombre`],[[`date`],`date`],[[`heure`],`heure`],[[`texte`],`texte`]],Yr=[[[`case`,`cocher`],`case`],[[`caseacocher`],`case`],[[`choix`],`choix`],[[`liste`,`deroulante`],`liste`],[[`liste`,`deroulant`],`liste`],[[`listederoulante`],`liste`]];function Xr(e,t){for(let[n,r]of t)if(n.every((t,n)=>qr(e.regarder(n))===t)&&e.regarder(n.length).type===`CHAINE`){for(let t=0;t<n.length;t++)e.avancer();return r}}function Zr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du formulaire entre guillemets`).valeur;return e.attendre(`PONCTUATION`,`:`,`deux-points après le nom du formulaire`),{type:`Formulaire`,nom:n,corps:L(e),ligne:t.ligne}}const Qr=[`section`,`bloc`,`ligne`,`colonne`,`grille`,`onglets`,`onglet`,`deroulant`,`accordeon`,`carrousel`,`menu`];function $r(e){if(Fn(e))return!0;let t=Qr.find(t=>I(e.actuel(),t));if(!t)return!1;let n=e.regarder(1);return n.type===`PONCTUATION`&&n.valeur===`:`||n.type===`MOT_CLE`&&n.valeur===`avec`||t===`menu`&&(I(n,`repliable`)||I(n,`vertical`))||(t===`section`||Pn.includes(t))&&n.type===`CHAINE`}function ei(e){let t=Fn(e),n=e.avancer();t&&e.avancer();let r=t?`filAriane`:Qr.find(e=>I(n,e)),i=!1,a=!1;for(;r===`menu`&&(I(e.actuel(),`repliable`)||I(e.actuel(),`vertical`));)I(e.avancer(),`repliable`)?i=!0:a=!0;let o=[],s;r===`section`&&e.verifier(`CHAINE`)?o.push({type:`Element`,element:`titre`,contenu:Di(e),styles:[],classes:[],ligne:n.ligne}):Pn.includes(r)&&e.verifier(`CHAINE`)&&(s=Di(e));let c=[],l=[],u,d;if(e.accepter(`MOT_CLE`,`avec`))do if(e.verifier(`MOT_CLE`,`style`)){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur;l.push(...t.split(/\s+/).filter(Boolean))}else I(e.actuel(),`ancre`)?(e.avancer(),u=e.attendre(`CHAINE`,void 0,`le nom de l'ancre entre guillemets (avec ancre "desserts")`).valeur):e.verifier(`IDENTIFIANT`,`nom`)&&e.regarder(1).type===`CHAINE`?(e.avancer(),d=e.avancer().valeur):c.push(oi(e));while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « ${r} », puis son contenu en dessous, décalé`),{type:`Bloc`,genre:r,styles:c,classes:l,...s?{titre:s}:{},...u===void 0?{}:{ancre:u},...d===void 0?{}:{nom:d},...i?{repliable:i}:{},...a?{vertical:a}:{},corps:[...o,...L(e)],ligne:n.ligne}}function ti(e,t){let n=e.accepter(`PONCTUATION`,`-`),r=Number(e.attendre(`NOMBRE`,void 0,t).valeur);return n?-r:r}function ni(e,t){let n=t?{valeur:t.element,ligne:t.ligne}:e.avancer(),r=t?.sorte??(n.valeur===`champ`?Xr(e,Jr):void 0),i=n.valeur===`chargement`&&!ji(e.actuel())||n.valeur===`selecteurLangue`?{type:`Chaine`,parties:[],ligne:n.ligne}:R(e),a;if(r===`choix`||r===`liste`){if(!I(e.actuel(),`parmi`))throw new j(`il manque « parmi » suivi des valeurs possibles, par exemple : ${r===`choix`?`choix "Taille" parmi ["S", "M", "L"]`:`liste deroulante "Pays" parmi pays`}`,e.actuel().ligne);e.avancer(),a=R(e)}let o;e.accepter(`MOT_CLE`,`vers`)&&(o=e.attendre(`CHAINE`,void 0,`le nom de la page cible`).valeur);let s=[],c=[],l=[],u,d,f=!1,p={},m;if(e.accepter(`MOT_CLE`,`avec`))do{let t=qr(e.actuel());if(o!==void 0&&ii(e))l.push(ai(e));else if(e.verifier(`MOT_CLE`,`style`)){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur;c.push(...t.split(/\s+/).filter(Boolean))}else if(t===`ancre`)e.avancer(),d=e.attendre(`CHAINE`,void 0,`le nom de l'ancre entre guillemets (avec ancre "desserts")`).valeur;else if(t===`nouvel`&&qr(e.regarder(1))===`onglet`)e.avancer(),e.avancer(),f=!0;else if(e.verifier(`IDENTIFIANT`,`nom`))e.avancer(),u=e.attendre(`CHAINE`,void 0,`le nom de l'élément entre guillemets`).valeur;else if(t===`obligatoire`||t===`obligatoires`)e.avancer(),p.obligatoire=!0;else if(t===`decoratif`)e.avancer(),s.push({propriete:`decoratif`,valeur:`oui`});else if(t===`niveau`&&n.valeur===`soustitre`)e.avancer(),m=ti(e,`un niveau de titre entre 2 et 6`);else if(t===`indice`||t===`indices`){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le texte de l'indice entre guillemets`);p.indice=t.valeur;let n=Ot(e);n&&(p.indiceTexte={type:`Chaine`,parties:[{type:`texte`,valeur:t.valeur}],versions:n,ligne:t.ligne})}else t===`minimum`||t===`maximum`?(e.avancer(),p[t]=ti(e,`un nombre après « ${t} » (par exemple « ${t} 1 »)`)):t===`raccourci`&&e.regarder(1).type===`CHAINE`?(e.avancer(),p.raccourci=e.avancer().valeur):t===`annonce`||t===`annonces`?(e.avancer(),p.annonce=!0):s.push(oi(e))}while(e.accepter(`MOT_CLE`,`et`));return{type:`Element`,element:n.valeur,contenu:i,styles:s,...m===void 0?{}:{niveau:m},classes:c,nom:u,cible:o,...l.length>0?{arguments:l}:{},...d===void 0?{}:{ancre:d},...f?{nouvelOnglet:f}:{},...r?{sorte:r}:{},...a?{parmi:a}:{},...p,ligne:n.ligne}}const ri=new Set([...Object.keys(ft),`nom`,`style`,`ancre`,`nouvel`,`obligatoire`,`obligatoires`,`indice`,`indices`,`minimum`,`maximum`,`raccourci`,`annonce`]);function ii(e){let t=e.actuel();return Ei(t)&&!ri.has(Mr(t))}function ai(e){let{nom:t}=e.attendreNom(`le nom du paramètre de la page`);return{nom:t,valeur:R(e)}}function oi(e){let t=e.avancer();if(t.type!==`MOT_CLE`&&t.type!==`IDENTIFIANT`)throw new j(`un nom de propriété de style est attendu après « avec »`,t.ligne);let n=Ut(e,t);if(n)return n;let r=e.avancer();if(r.type!==`IDENTIFIANT`&&r.type!==`MOT_CLE`&&r.type!==`CHAINE`&&r.type!==`NOMBRE`)throw new j(`une valeur est attendue pour le style « ${t.valeur} »`,r.ligne);return{propriete:t.valeur,valeur:r.valeur}}function si(e){let t=e.actuel();return t.type===`MOT_CLE`&&[`afficher`,`cacher`,`montrer`,`rediriger`,`changer`,`envoyer`,`ajouter`,`retirer`].includes(t.valeur)}function ci(e){let t=e.avancer();if(t.valeur===`ajouter`||t.valeur===`retirer`){let n=bi(e);e.accepter(`MOT_CLE`,`dans`);let{nom:r}=e.attendreNom(`le nom de la liste`);return{type:`ModificationListe`,operation:t.valeur,valeur:n,liste:r,ligne:t.ligne}}if(t.valeur===`afficher`){let n=e.verifier(`MOT_CLE`,`erreur`)&&ji(e.regarder(1));n&&e.avancer();let r=[`reussite`,`avertissement`].find(t=>I(e.actuel(),t)&&ji(e.regarder(1)));r&&e.avancer();let i=n?`afficherErreur`:`afficher`,a=R(e),o=_r(e,ki,r);return{type:`Action`,action:i,arguments:[a],...o?{message:o}:{},ligne:t.ligne}}if(t.valeur===`cacher`||t.valeur===`montrer`)return{type:`Action`,action:t.valeur,arguments:[R(e)],ligne:t.ligne};if(t.valeur===`rediriger`){e.attendre(`MOT_CLE`,`vers`,`« vers » après « rediriger »`);let n=R(e),r=[];if(e.accepter(`MOT_CLE`,`avec`))do r.push(ai(e));while(e.accepter(`MOT_CLE`,`et`));return{type:`Action`,action:`rediriger`,arguments:[n],...r.length>0?{parametres:r}:{},ligne:t.ligne}}if(t.valeur===`envoyer`)return Hn(e)?Gn(e,t.ligne):li(e,t.ligne);if(!(e.verifier(`MOT_CLE`,`texte`)&&e.regarder(1).type===`CHAINE`)){let{nom:n}=e.attendreNom(`le nom de la variable à changer`),r=[];for(;e.verifier(`PONCTUATION`,`.`)&&Ei(e.regarder(1));){e.avancer();let t=e.avancer();r.push(t.original??t.valeur)}return e.attendre(`MOT_CLE`,`par`,`« par » suivi de la nouvelle valeur`),{type:`Affectation`,nom:n,...r.length>0?{champs:r}:{},valeur:bi(e),ligne:t.ligne}}e.avancer();let n=R(e);return e.attendre(`MOT_CLE`,`par`,`« par » suivi du nouveau texte`),{type:`Action`,action:`changerTexte`,arguments:[n,R(e)],ligne:t.ligne}}function li(e,t){e.attendre(`MOT_CLE`,`requete`,`« requete » après « envoyer »`),e.attendre(`MOT_CLE`,`vers`,`« vers » suivi de l'adresse`);let n=e.attendre(`CHAINE`,void 0,`l'adresse entre guillemets`).valeur,r=bn(e),i=[],a=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.verifierNom()&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`=`;a.push(t?e.attendreNom(`le nom de la donnée envoyée`).nom:void 0),t&&e.avancer(),i.push(t?R(e):bi(e))}while(e.accepter(`MOT_CLE`,`et`));let o;return e.accepter(`MOT_CLE`,`dans`)&&(o=e.attendreNom(`le nom de la variable qui recevra la réponse`).nom),{type:`Requete`,adresse:n,...r,donnees:i,...a.some(e=>e!==void 0)?{cles:a}:{},resultat:o,ligne:t}}function ui(e){let t=e.avancer(),n=I(t,`supprimer`),{nom:r}=e.attendreNom(`le nom de la donnée`),i={type:`Reference`,nom:r,ligne:t.ligne};n||e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la route, après « modifier ${r} »`);let a=e.attendre(`CHAINE`,void 0,`la route entre guillemets`).valeur,o=yn(e);if(n)return{type:`Suppression`,objet:i,adresse:a,...o===void 0?{}:{source:o},ligne:t.ligne};e.attendre(`MOT_CLE`,`avec`,`« avec » suivi des champs à changer (avec prix = 10)`);let s=[];do if(e.verifier(`MOT_CLE`,`champ`)){let t=bi(e);s.push({champ:t.type===`Champ`?t.nom:``,valeur:t})}else{let t=e.attendreNom(`le nom du champ à changer`).nom;e.attendre(`PONCTUATION`,`=`,`« = » suivi de la nouvelle valeur de « ${t} »`),s.push({champ:t,valeur:R(e)})}while(e.accepter(`MOT_CLE`,`et`));return{type:`Modification`,objet:i,adresse:a,...o===void 0?{}:{source:o},changements:s,ligne:t.ligne}}function di(e){let t=e.avancer();e.attendre(`MOT_CLE`,`avec`,`« avec champ "email" et champ "mot de passe" » après « se connecter »`);let n=bi(e);return e.attendre(`MOT_CLE`,`et`,`« et » suivi du champ du mot de passe`),{type:`Connexion`,email:n,motDePasse:bi(e),ligne:t.ligne}}function fi(e){let t=e.avancer(),n=pi(e);e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la condition`);let r=L(e),i=[];return e.sauterFinsDeLigne(),e.accepter(`MOT_CLE`,`sinon`)&&(e.attendre(`PONCTUATION`,`:`,`deux-points après « sinon »`),i=L(e)),{type:`Condition`,test:n,alors:r,sinon:i,ligne:t.ligne}}function pi(e){let t=mi(e);for(;e.verifier(`MOT_CLE`,`ou`);){let n=e.avancer().ligne;t={type:`Combinaison`,operateur:`ou`,gauche:t,droite:mi(e),ligne:n}}return t}function mi(e){let t=hi(e);for(;e.verifier(`MOT_CLE`,`et`);){let n=e.avancer().ligne;t={type:`Combinaison`,operateur:`et`,gauche:t,droite:hi(e),ligne:n}}return t}function hi(e){let t=e.regarder(2);if(I(e.actuel(),`utilisateur`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`est`&&(I(t,`connecte`)||I(t,`admin`)||I(t,`pas`)&&(I(e.regarder(3),`connecte`)||I(e.regarder(3),`admin`)))){let n=I(t,`pas`),r=e.avancer();e.avancer(),n&&e.avancer();let i=e.avancer();return{type:`Comparaison`,gauche:{type:`EtatUtilisateur`,etat:Mr(i),ligne:r.ligne},operateur:n?`faux`:`vrai`,ligne:r.ligne}}let n=+!!I(e.regarder(2),`pas`);if(I(e.actuel(),`mouvement`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`est`&&I(e.regarder(2+n),`reduit`)){let t=e.avancer();for(let t=0;t<2+n;t++)e.avancer();return{type:`Comparaison`,gauche:{type:`MouvementReduit`,ligne:t.ligne},operateur:n?`faux`:`vrai`,ligne:t.ligne}}if(I(e.actuel(),`theme`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`est`&&(I(e.regarder(2+n),`sombre`)||I(e.regarder(2+n),`clair`))){let t=e.avancer();for(let t=0;t<1+n;t++)e.avancer();let r=I(e.avancer(),`sombre`);return{type:`Comparaison`,gauche:{type:`ThemeSombre`,ligne:t.ligne},operateur:r===!!n?`faux`:`vrai`,ligne:t.ligne}}let r=bi(e);if(I(e.actuel(),`contient`))return e.avancer(),{type:`Comparaison`,gauche:r,operateur:`contient`,droite:R(e),ligne:r.ligne};for(let[t,n]of[[`commence`,`commencePar`],[`finit`,`finitPar`]])if(I(e.actuel(),t)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`par`)return e.avancer(),e.avancer(),{type:`Comparaison`,gauche:r,operateur:n,droite:R(e),ligne:r.ligne};return e.attendre(`MOT_CLE`,`est`,`« est » dans la comparaison`),I(e.actuel(),`pas`)?(e.avancer(),_i(vi(e,r))):vi(e,r)}const gi={egal:`different`,different:`egal`,vrai:`faux`,faux:`vrai`,superieur:`inferieurOuEgal`,inferieurOuEgal:`superieur`,inferieur:`superieurOuEgal`,superieurOuEgal:`inferieur`};function _i(e){let t=gi[e.operateur];return t?{...e,operateur:t}:{...e,negation:!0}}function vi(e,t){if(t.type===`Reference`){let n=e.actuel(),r=I(n,`en`)?e.regarder(1):void 0,i=r&&(I(r,`chargement`)||I(r,`erreur`))?Mr(r):I(n,`introuvable`)?`introuvable`:void 0;if(i)return e.avancer(),r&&e.avancer(),{type:`Comparaison`,gauche:{type:`EtatRequete`,variable:t.nom,etat:i,ligne:t.ligne},operateur:`vrai`,ligne:t.ligne}}if(e.accepter(`MOT_CLE`,`vide`))return{type:`Comparaison`,gauche:t,operateur:`vide`,ligne:t.ligne};if(e.accepter(`MOT_CLE`,`vrai`))return{type:`Comparaison`,gauche:t,operateur:`vrai`,ligne:t.ligne};if(e.accepter(`MOT_CLE`,`faux`))return{type:`Comparaison`,gauche:t,operateur:`faux`,ligne:t.ligne};if(e.accepter(`MOT_CLE`,`rien`))return{type:`Comparaison`,gauche:t,operateur:`rien`,ligne:t.ligne};if(P(e.actuel())&&kn(e.actuel().original??e.actuel().valeur)){let n=e.avancer();return{type:`Comparaison`,gauche:t,operateur:`egal`,droite:{type:`Reference`,nom:n.original??n.valeur,ligne:n.ligne},ligne:t.ligne}}if(e.accepter(`MOT_CLE`,`dans`))return{type:`Comparaison`,gauche:t,operateur:`dans`,droite:R(e),ligne:t.ligne};let n;if(I(e.actuel(),`plus`)){e.avancer();let t=e.actuel();if(![`grand`,`grande`,`grands`,`grandes`,`petit`,`petite`,`petits`,`petites`].some(e=>I(t,e)))throw new j(`après « est plus », écrivez « grand que » ou « petit que »`,t.ligne);e.avancer();let r=A(t.original??t.valeur).startsWith(`grand`);if(I(e.actuel(),`ou`)){e.avancer();let t=e.actuel();if(![`egal`,`egale`,`egaux`,`egales`].some(e=>I(t,e)))throw new j(`après « plus grand ou », écrivez « égal à »`,t.ligne);e.avancer(),n=r?`superieurOuEgal`:`inferieurOuEgal`}else{if(!I(e.actuel(),`que`))throw new j(`après « plus ${r?`grand`:`petit`} », écrivez « plus ${r?`grand`:`petit`} que »`,e.actuel().ligne);e.avancer(),n=r?`superieur`:`inferieur`}}else if([`different`,`differente`,`differents`,`differentes`].some(t=>I(e.actuel(),t)))e.avancer(),n=`different`;else if(e.accepter(`MOT_CLE`,`egal`))n=`egal`;else if(e.accepter(`MOT_CLE`,`inferieur`))n=e.accepter(`MOT_CLE`,`ou`)&&e.accepter(`MOT_CLE`,`egal`)?`inferieurOuEgal`:`inferieur`;else if(e.accepter(`MOT_CLE`,`superieur`))n=e.accepter(`MOT_CLE`,`ou`)&&e.accepter(`MOT_CLE`,`egal`)?`superieurOuEgal`:`superieur`;else{let t=e.actuel();throw new j(`comparaison inconnue après « est » : « ${t.valeur||t.type} ». Essayez « égal à », « différent de », « supérieur à », « inférieur à », « plus grand que » ou « plus petit que »`,t.ligne)}let r=R(e);return{type:`Comparaison`,gauche:t,operateur:n,droite:r,ligne:t.ligne}}function yi(e){for(let t=1;t<=7;t++)if(e.regarder(t).valeur===`:`)return e.regarder(t+2).type===`CODE_BRUT`||e.regarder(t+1).type===`CODE_BRUT`;return!1}function bi(e){if(e.verifier(`MOT_CLE`,`champ`)&&e.regarder(1).type===`CHAINE`){let t=e.avancer();return{type:`Champ`,nom:e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur,ligne:t.ligne}}return R(e)}function xi(e){let t=e.avancer(),n,r;if(Er(e)){let n=Dr(e);return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de l'événement`),{type:`Evenement`,...n,corps:L(e),ligne:t.ligne}}if(e.accepter(`MOT_CLE`,`utilisateur`)){let i=Tr(e,ki);if(i)return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de l'événement`),{type:`Evenement`,...i,corps:L(e),ligne:t.ligne};if(e.accepter(`MOT_CLE`,`clique`))n=`clic`,e.attendre(`MOT_CLE`,`sur`,`« sur » suivi de la cible`);else if(e.accepter(`MOT_CLE`,`survole`))n=`survol`;else{let t=e.actuel();throw new j(`action utilisateur inconnue : « ${t.valeur||t.type} »`,t.ligne)}r=e.attendre(`CHAINE`,void 0,`la cible entre guillemets`).valeur}else if(e.accepter(`MOT_CLE`,`page`))e.attendre(`MOT_CLE`,`charge`,`« se charge » après « la page »`),n=`chargement`;else if(e.accepter(`MOT_CLE`,`formulaire`))r=e.attendre(`CHAINE`,void 0,`le nom du formulaire`).valeur,e.attendre(`MOT_CLE`,`est`,`« est soumis » après le nom du formulaire`),e.attendre(`MOT_CLE`,`soumis`,`« soumis »`),n=`soumission`;else{let t=e.actuel();throw new j(`événement inconnu après « quand » : « ${t.valeur||t.type} »`,t.ligne)}e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de l'événement`);let i=L(e);return{type:`Evenement`,genre:n,cible:r,corps:i,ligne:t.ligne}}function Si(e){let t=e.avancer();e.attendre(`MOT_CLE`,`chaque`,`« chaque » après « pour »`);let{nom:n}=e.attendreNom(`le nom de la variable de boucle`);e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la liste à parcourir`);let r=R(e),i=e.verifier(`MOT_CLE`,`avec`)&&I(e.regarder(1),`deplacement`);i&&(e.avancer(),e.avancer()),e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la boucle`);let a=L(e);return{type:`Boucle`,variable:n,liste:r,...i?{deplacement:i}:{},corps:a,ligne:t.ligne}}function R(e){let t=Ci(e);for(;e.verifier(`PONCTUATION`,`+`)||e.verifier(`PONCTUATION`,`-`);){let n=e.avancer().valeur,r=Ci(e);t={type:`Calcul`,operateur:n,gauche:t,droite:r,ligne:t.ligne}}return t}function Ci(e){let t=wi(e);for(;e.verifier(`PONCTUATION`,`*`)||e.verifier(`PONCTUATION`,`/`);){let n=e.avancer().valeur,r=wi(e);t={type:`Calcul`,operateur:n,gauche:t,droite:r,ligne:t.ligne}}return t}function wi(e){let t=Ti(e),n=I(e.actuel(),`plus`)?1:I(e.actuel(),`moins`)?-1:0,r=e.regarder(2),i=P(r)?{jour:`jours`,jours:`jours`,semaine:`semaines`,semaines:`semaines`,mois:`mois`}[A(r.original??r.valeur)]:void 0;if(!n||!ji(e.regarder(1))||!i)return t;e.avancer();let a=Ti(e);return e.avancer(),{type:`DateDecalee`,date:t,nombre:a,unite:i,signe:n,ligne:t.ligne}}function Ti(e){let t=e.actuel();if(I(t,`aujourdhui`)||I(t,`aujourd`)&&e.regarder(1).valeur===`'`&&I(e.regarder(2),`hui`))return e.avancer(),I(t,`aujourd`)&&(e.avancer(),e.avancer()),{type:`DateDuJour`,maintenant:!1,ligne:t.ligne};if(I(t,`maintenant`)&&!Ei(e.regarder(1))&&e.regarder(1).valeur!==`=`)return e.avancer(),{type:`DateDuJour`,maintenant:!0,ligne:t.ligne};if(I(t,`jours`)&&I(e.regarder(1),`entre`)){e.avancer(),e.avancer();let n=Ti(e);return e.attendre(`MOT_CLE`,`et`,`« et » entre les deux dates (jours entre debut et fin)`),{type:`JoursEntre`,debut:n,fin:Ti(e),ligne:t.ligne}}if(e.accepter(`PONCTUATION`,`(`)){let t=R(e);return e.attendre(`PONCTUATION`,`)`,`une parenthèse fermante )`),t}if(e.accepter(`PONCTUATION`,`-`)){let n=e.actuel();return n.type===`NOMBRE`?(e.avancer(),{type:`Nombre`,valeur:-Number(n.valeur),ligne:n.ligne}):{type:`Calcul`,operateur:`-`,gauche:{type:`Nombre`,valeur:0,ligne:t.ligne},droite:wi(e),ligne:t.ligne}}for(let n of[`moyenne`,`somme`,`minimum`,`maximum`])if(I(t,n)&&ji(e.regarder(1)))return e.avancer(),{type:`Agregat`,operation:n,liste:wi(e),ligne:t.ligne};if(I(t,`arrondi`)&&ji(e.regarder(1))){e.avancer();let n=wi(e);if(e.verifier(`NOMBRE`)&&I(e.regarder(1),`chiffres`)){let r=Number(e.avancer().valeur);return e.avancer(),{type:`Arrondi`,valeur:n,chiffres:r,ligne:t.ligne}}return{type:`Arrondi`,valeur:n,ligne:t.ligne}}if(I(t,`hasard`)&&I(e.regarder(1),`entre`)){e.avancer(),e.avancer();let n=wi(e);return e.attendre(`MOT_CLE`,`et`,`« et » entre les deux bornes (hasard entre 1 et 6)`),{type:`Hasard`,minimum:n,maximum:wi(e),ligne:t.ligne}}if(e.verifier(`MOT_CLE`,`nombre`)&&Ei(e.regarder(1)))return e.avancer(),{type:`Compte`,liste:wi(e),ligne:t.ligne};for(let n of[`majuscules`,`minuscules`,`longueur`])if(I(t,n)&&ji(e.regarder(1)))return e.avancer(),{type:`OperationTexte`,operation:n,valeur:wi(e),ligne:t.ligne};if(I(t,`remplacer`)&&ji(e.regarder(1))){e.avancer();let n=wi(e);e.attendre(`MOT_CLE`,`par`,`« par » suivi du nouveau texte (remplacer "a" par "b" dans nom)`);let r=wi(e);return e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du texte où remplacer`),{type:`Remplacement`,cherche:n,remplace:r,dans:wi(e),ligne:t.ligne}}if(I(t,`trier`)&&ji(e.regarder(1))){e.avancer();let n=Di(e),r=e.accepter(`MOT_CLE`,`par`)?e.attendreNom(`le champ selon lequel trier`).nom:void 0,i=I(e.actuel(),`decroissant`);return i&&e.avancer(),{type:`Tri`,liste:n,...r===void 0?{}:{champ:r},decroissant:i,ligne:t.ligne}}if(I(t,`grouper`)&&ji(e.regarder(1))){e.avancer();let n=Di(e);return e.attendre(`MOT_CLE`,`par`,`« par » suivi du champ selon lequel grouper (grouper produits par categorie)`),{type:`Groupement`,liste:n,champ:e.attendreNom(`le champ selon lequel grouper`).nom,ligne:t.ligne}}if(I(t,`premier`)&&ji(e.regarder(1)))return e.avancer(),{type:`Premier`,liste:wi(e),ligne:t.ligne};if(t.type===`NOMBRE`&&I(e.regarder(1),`premiers`))return e.avancer(),e.avancer(),{type:`Premiers`,nombre:{type:`Nombre`,valeur:Number(t.valeur),ligne:t.ligne},liste:wi(e),ligne:t.ligne};let n=Di(e);for(;I(e.actuel(),`dont`);)e.avancer(),n={type:`Filtre`,liste:n,test:hi(e),ligne:t.ligne};return n}function Ei(e){return e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&!e.reserve}function Di(e){let t=e.actuel();if(t.type===`CHAINE`){e.avancer();let n=Ot(e);if(I(e.actuel(),`sans`)&&I(e.regarder(1),`traduction`)){let r=e.avancer();if(e.avancer(),n)throw new j(`ce texte a une version traduite et « sans traduction » : gardez l’un ou l’autre.`,r.ligne);return{type:`Chaine`,parties:t.parties??[],sansTraduction:!0,ligne:t.ligne}}return{type:`Chaine`,parties:t.parties??[],...n?{versions:n}:{},ligne:t.ligne}}if(t.type===`NOMBRE`)return e.avancer(),{type:`Nombre`,valeur:Number(t.valeur),ligne:t.ligne};if(e.verifier(`MOT_CLE`,`vrai`)||e.verifier(`MOT_CLE`,`faux`))return e.avancer(),{type:`Booleen`,valeur:t.valeur===`vrai`,ligne:t.ligne};if(e.verifier(`MOT_CLE`,`rien`))return e.avancer(),{type:`Rien`,ligne:t.ligne};if(e.verifier(`PONCTUATION`,`[`))return Mi(e);if(I(t,`erreur`)&&e.regarder(1).type===`IDENTIFIANT`){e.avancer();let n=e.avancer();return{type:`ErreurRequete`,variable:n.original??n.valeur,ligne:t.ligne}}if(I(t,`fiche`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`avec`)return Oi(e);if(e.verifierNom()&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`(`){e.avancer(),e.avancer();let n=[];if(!e.accepter(`PONCTUATION`,`)`)){do n.push(R(e));while(e.accepter(`PONCTUATION`,`,`));e.attendre(`PONCTUATION`,`)`,`une parenthèse fermante ) après les valeurs données à la fonction`)}return{type:`Appel`,nom:t.original??t.valeur,arguments:n,ligne:t.ligne}}if(e.verifierNom()){e.avancer();let n={type:`Reference`,nom:t.original??t.valeur,ligne:t.ligne};for(;e.verifier(`PONCTUATION`,`.`)&&Ei(e.regarder(1));){e.avancer();let r=e.avancer();n={type:`AccesChamp`,objet:n,champ:r.original??r.valeur,ligne:t.ligne}}return n}let n=e.messageLiaison(`la variable`);throw n?new j(`une valeur est attendue. ${n}`,t.ligne):t.type===`MOT_CLE`&&t.reserve&&ze(t.valeur)?new j(Ai(t),t.ligne):t.type===`MOT_CLE`&&t.reserve?new j(`une valeur est attendue, mais « ${t.original??t.valeur} » est un mot réservé du langage : il ne peut pas servir de nom de variable.`,t.ligne):new j(`une valeur est attendue, mais ${t.type===`FIN_LIGNE`||t.type===`FIN_FICHIER`?`la ligne s'arrête là`:`« ${t.valeur||t.type} » a été trouvé`}`,t.ligne)}function Oi(e){let t=e.avancer();e.avancer();let n=[];do{let{nom:t,ligne:r}=e.attendreNom(`le nom du champ de la fiche (fiche avec nom "Livre" et prix 12)`);n.push({nom:t,valeur:R(e),ligne:r})}while(e.accepter(`MOT_CLE`,`et`));return{type:`Fiche`,champs:n,ligne:t.ligne}}const ki={bloc:L,expression:R,comparaison:hi,argumentPage:ai};function Ai(e){return`« ${e.original??e.valeur} » n’est pas encore disponible : ce mot est prévu dans le vocabulaire, mais le compilateur ne le comprend pas encore.`}function ji(e){return e.type===`CHAINE`||e.type===`NOMBRE`||e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&(!e.reserve||[`vrai`,`faux`].includes(e.valeur))||e.type===`PONCTUATION`&&e.valeur===`[`}function Mi(e){let t=e.avancer(),n=[];if(!e.verifier(`PONCTUATION`,`]`))for(n.push(R(e));e.accepter(`PONCTUATION`,`,`);)n.push(R(e));return e.attendre(`PONCTUATION`,`]`,`un crochet fermant ] pour la liste`),{type:`Liste`,elements:n,ligne:t.ligne}}function Ni(e){let t=[],n=[],r=``,i=!1,a=!1,o=1,s=1,c=e.replace(/^\uFEFF/,``),l=``,u=!1;for(let e=0;e<c.length;e++){let t=c[e];if(t===`"`){if(u&&c[e+1]===`"`){e++;continue}u=!u;continue}if(!u&&(t===`
|
|
619
|
+
`),l=e+1;n.push({type:`MOT_CLE`,valeur:`style`,ligne:l,colonne:1,reserve:!1,original:a.trim().split(/\s|:/)[0]},{type:`PONCTUATION`,valeur:`:`,ligne:l,colonne:a.indexOf(`:`)+1},{type:`FIN_LIGNE`,valeur:``,ligne:l,colonne:a.length+1},{type:`CSS`,valeur:c,ligne:l+1,colonne:1},{type:`FIN_LIGNE`,valeur:``,ligne:t+1,colonne:1});continue}if(a.trim()===``||a.trim().startsWith(`#`))continue;if(a.startsWith(` `))throw new e(`tabulation interdite : utilisez 4 espaces par niveau`,t+1,1);let c=a.length-a.trimStart().length;if(c%4!=0)throw new e(`indentation incohérente : ${c} espaces trouvés, un multiple de 4 est attendu`,t+1,1);let l=c/4,u=i[i.length-1];if(l>u){if(l!==u+1)throw new e(`indentation incohérente : un seul niveau à la fois`,t+1,1);i.push(l),n.push({type:`INDENT`,valeur:``,ligne:t+1,colonne:1})}else if(l<u){for(;i.length>1&&i[i.length-1]>l;)i.pop(),n.push({type:`DEDENT`,valeur:``,ligne:t+1,colonne:1});if(i[i.length-1]!==l)throw new e(`indentation incohérente : ce niveau ne correspond à aucun bloc ouvert`,t+1,1)}for(;o<a.length;){let r=a[o];if(r===` `){o++;continue}if(r===`#`)break;if(r===`"`){let r=o;o++;let i=``,s=0;for(;o<a.length&&(a[o]!==`"`||s>0&&a.indexOf(`}`,o+1)>=0);){let e=/^\{(code|accent)\s*"/.exec(a.slice(o)),t=e?et(a,o+e[0].length):-1;if(t>=0){i+=a.slice(o,t+2),o=t+2;continue}if(a[o]===`\\`&&a[o+1]===`\\`){i+=`\\\\`,o+=2;continue}a[o]===`\\`&&a[o+1]===`"`&&o++,a[o]===`{`&&s++,a[o]===`}`&&s>0&&s--,i+=a[o],o++}if(o>=a.length)throw new e(`chaîne de caractères non fermée (guillemet manquant)`,t+1,r+1);o++,n.push({type:`CHAINE`,valeur:i,ligne:t+1,colonne:r+1,parties:tt(i,t+1,r+1)});continue}if(/[0-9]/.test(r)){let e=o,r=``;for(;o<a.length&&/[0-9]/.test(a[o]);)r+=a[o],o++;if((a[o]===`,`||a[o]===`.`)&&/[0-9]/.test(a[o+1]??``))for(r+=`.`,o++;o<a.length&&/[0-9]/.test(a[o]);)r+=a[o],o++;n.push({type:`NOMBRE`,valeur:r,ligne:t+1,colonne:e+1});continue}if(/[\p{L}_]/u.test(r)){let e=o,r=Qe(a,o);if(o+=r.length,a[o]===`'`&&Ze(r)){o++,n.push({type:`LIAISON`,valeur:`${r.toLowerCase()}'`,ligne:t+1,colonne:e+1,original:`${r}'`});continue}if(Ye(r)){n.push({type:`LIAISON`,valeur:r.toLowerCase(),ligne:t+1,colonne:e+1,original:r});continue}let i=$e(a,e,r),s=i??r;i&&(o=e+i.length,r=i.replace(/-/g,``));let c=Ke(r);c?n.push({type:`MOT_CLE`,valeur:c,ligne:t+1,colonne:e+1,reserve:We(c),original:s}):n.push({type:`IDENTIFIANT`,valeur:r,ligne:t+1,colonne:e+1,...i?{original:s}:{}});continue}n.push({type:`PONCTUATION`,valeur:r,ligne:t+1,colonne:o+1}),o++}n.push({type:`FIN_LIGNE`,valeur:``,ligne:t+1,colonne:a.length+1})}for(;i.length>1;)i.pop(),n.push({type:`DEDENT`,valeur:``,ligne:r.length,colonne:1});return n.push({type:`FIN_FICHIER`,valeur:``,ligne:r.length,colonne:1}),n}var j=class extends Error{ligne;constructor(e,t){super(`Ligne ${t} : ${e}`),this.ligne=t,this.name=`ErreurSyntaxique`}};function rt(e){return e.some(e=>e.type===`Rendre`||it(e).some(rt))}function it(e){let t=[],n=e;for(let e of[`corps`,`alors`,`sinon`])Array.isArray(n[e])&&t.push(n[e]);if(Array.isArray(n.cas))for(let e of n.cas)t.push(e.corps);let r=n.action;return r&&typeof r==`object`&&Array.isArray(r.corps)&&t.push(r.corps),t}function at(e,t){let n=e=>{if(Array.isArray(e))return e.map(n);if(!e||typeof e!=`object`)return e;let r=e,i={};for(let[e,t]of Object.entries(r))i[e]=n(t);return(r.type===`Reference`||r.type===`Affectation`)&&typeof r.nom==`string`&&t.has(r.nom)&&(i.nom=t.get(r.nom)),r.type===`variable`&&typeof r.valeur==`string`&&(i.valeur=r.valeur.replace(/^[^.\s]+/,e=>t.get(e)??e)),i};return n(e)}function ot(e){let t=new Map(e.fonctions.filter(e=>!rt(e.corps)).map(e=>[e.nom,e]));e.fonctions=e.fonctions.filter(e=>!t.has(e.nom));let n=new Set(t.keys()),r=new Map,i=(e,t,n)=>e.flatMap(e=>{for(let r of it(e))r.splice(0,r.length,...i(r,t,n));if(e.type!==`Execution`)return[e];let a=t.get(e.nom);if(!a)return[e];if(n.includes(e.nom))throw new j(`« ${e.nom} » s'appelle elle-même : une fonction d'actions ne peut pas se rappeler (elle ne s'arrêterait jamais).`,e.ligne);if(e.arguments.length!==a.parametres.length){let t=a.parametres.length;throw new j(`« ${e.nom} » attend ${t} valeur${t>1?`s`:``}${t?` (${a.parametres.map(e=>e.nom).join(`, `)})`:``} ; ici, ${e.arguments.length}.`,e.ligne)}let o=(r.get(e.nom)??0)+1;r.set(e.nom,o);let s=new Map(a.parametres.map(t=>[t.nom,`${t.nom}_${e.nom}${o>1?`_${o}`:``}`]));return[...a.parametres.map((t,n)=>({type:`Variable`,nom:s.get(t.nom),valeur:e.arguments[n],ligne:e.ligne})),...i(at(a.corps,s),t,[...n,e.nom])]});for(let r of[...e.pages,...e.composants,...e.entete?[e.entete]:[],...e.pied?[e.pied]:[]]){let e=r.corps.filter(e=>e.type===`Fonction`);for(let t of e){if(rt(t.corps))throw new j(`« ${t.nom} » rend une valeur : une fonction de calcul s'écrit en haut du fichier, pour servir à toutes les pages.`,t.ligne);n.add(t.nom)}let a=new Map([...t,...e.map(e=>[e.nom,e])]);r.corps=i(r.corps.filter(e=>e.type!==`Fonction`),a,[])}return[...n]}const st=e=>e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase();function ct(e,t){let n=st(e),r=st(t),i=Array.from({length:r.length+1},(e,t)=>t);for(let e=1;e<=n.length;e++){let t=[e];for(let a=1;a<=r.length;a++)t[a]=Math.min(t[a-1]+1,i[a]+1,i[a-1]+(n[e-1]===r[a-1]?0:1));i=t}return i[r.length]}function lt(e,t){let n,r=e.length>5?2:1;for(let i of t){let t=ct(e,i);t<r&&st(e)!==st(i)?(n=i,r=t):t===r&&n===void 0&&st(e)!==st(i)&&(n=i)}return n}function M(e,t){let n=lt(e,t);return n?` Peut-être « ${n} » ?`:``}const ut=je.filter(e=>e.categorie===`style`&&e.statut===`supporte`&&e.contextes.includes(`option`)&&e.mot!==`style`),dt=je.filter(e=>e.categorie===`valeurStyle`&&e.statut===`supporte`),ft=Object.fromEntries(ut.map(e=>{let t=dt.filter(t=>t.valeurDe?.includes(e.mot));return[e.mot,{valeurs:t.map(e=>e.mot),accords:Object.fromEntries(t.flatMap(e=>e.variantes.map(t=>[t,e.mot])))}]})),pt=Object.fromEntries(ut.filter(e=>e.surElements).map(e=>[e.mot,e.surElements])),mt=new Set(ut.filter(e=>e.valeurLibre).map(e=>e.mot)),ht={vertical:`vertical`,verticale:`vertical`,horizontal:`horizontal`,horizontale:`horizontal`,diagonal:`diagonale`,diagonale:`diagonale`},gt=e=>A(e)in ht;function _t(e,t){let n=pt[A(e)];if(!(!n||n.includes(t)))return`« ${A(e)} » se règle seulement sur : ${n.join(`, `)} (ici, ${t}).`}const vt=[...Object.keys(ft).filter(e=>e!==`sur`),`nom`,`obligatoire`,`indice`,`minimum`,`maximum`];function yt(e,t,n=new Set){let r=A(e);if(r===`degrade`)return bt(t,n);if(mt.has(r))return{propriete:r,valeur:t};let i=ft[r];if(!i)return{erreur:`« ${e} » n'est pas une option connue. Options possibles : ${vt.join(`, `)}.`};let a=A(t),o=i.accords[a]??a;if([`couleur`,`fond`,`texte`].includes(r)&&n.has(o))return{propriete:r,valeur:o};if(!i.valeurs.includes(o)){let e=[`couleur`,`fond`,`texte`].includes(r)?[...n]:[];return e.length>0?{erreur:`« ${t} » n'est pas une valeur possible pour « ${r} ». Valeurs possibles : ${i.valeurs.join(`, `)}, et les couleurs du thème : ${e.join(`, `)}.${M(t,[`couleur`,`fond`,`texte`].includes(r)?[...i.valeurs,...e]:[])}`}:{erreur:`« ${t} » n'est pas une valeur possible pour « ${r} ». Valeurs possibles : ${i.valeurs.join(`, `)}.${M(t,[`couleur`,`fond`,`texte`].includes(r)?i.valeurs:[])}`}}return{propriete:r,valeur:o}}function bt(e,t){let[n,r,i=`diagonale`]=e.split(`-`),a=ft.couleur,o=e=>e===void 0?void 0:a.accords[A(e)]??A(e),s=o(n),c=o(r),l=e=>e!==void 0&&(a.valeurs.includes(e)||t.has(e));if(!l(s)||!l(c))return{erreur:`un dégradé va d'une couleur à une autre : « degrade bleu vers violet ». Couleurs possibles : ${[...a.valeurs,...t].join(`, `)}.`};if(s===c)return{erreur:`un dégradé va d'une couleur à une autre : « ${s} vers ${s} » est une seule couleur. Utilisez « fond ${s} ».`};let u=ht[A(i)];return u?{propriete:`degrade`,valeur:`${s}-${c}-${u}`}:{erreur:`« ${i} » n'est pas une direction de dégradé. Directions possibles : vertical, horizontal (sinon en diagonale).`}}const xt=(e,t=1)=>e.regarder(t).type===`PONCTUATION`&&e.regarder(t).valeur===`:`;function St(e){return N(e.actuel(),`langues`)&&xt(e)}function Ct(e){return N(e.actuel(),`traductions`)&&P(e.regarder(1))&&xt(e,2)}function wt(e,t){if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t(),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}}function Tt(e){let t=e.avancer();e.avancer();let n={type:`Langues`,langues:[],ligne:t.ligne};return wt(e,()=>{let t=e.actuel();if(!P(t))throw new j(`une ligne du bloc « langues » est le nom d'une langue, par exemple « francais » ou « anglais » : à la place, on trouve « ${t.valeur||t.type} »`,t.ligne);e.avancer(),n.langues.push({mot:A(t.original??t.valeur),ligne:t.ligne})}),n}function Et(e){let t=e.avancer(),n=e.avancer();e.avancer();let r={type:`Traductions`,langue:A(n.original??n.valeur),entrees:[],ligne:t.ligne};return wt(e,()=>{let t=e.actuel().ligne,n=e.attendre(`CHAINE`,void 0,`le texte à traduire entre guillemets, puis « : » et sa version : "Bonjour" : "Hello"`);e.attendre(`PONCTUATION`,`:`,`deux-points entre le texte et sa version : "Bonjour" : "Hello"`);let i=e.attendre(`CHAINE`,void 0,`la version entre guillemets après les deux-points : "Bonjour" : "Hello"`);r.entrees.push({texte:Dt(n),version:Dt(i),ligne:t})}),r}const Dt=e=>e.parties??(e.valeur===``?[]:[{type:`texte`,valeur:e.valeur}]);function Ot(e){let t=[];for(;N(e.actuel(),`en`)&&P(e.regarder(1))&&e.regarder(2).type===`CHAINE`;){e.avancer();let n=e.avancer(),r=e.avancer();t.push({langue:A(n.original??n.valeur),parties:Dt(r),ligne:r.ligne})}return t.length>0?t:void 0}function kt(e){return N(e.actuel(),`selecteur`)&&N(e.regarder(1),`langue`)}function At(e){return e.map(e=>e.type===`variable`?`{${e.valeur}}`:e.valeur).join(``)}function jt(e,t){if(t===`animation`){if(!P(e.actuel()))throw new j(`il manque le nom de l’animation : « animation apparition », « animation montee » ou « animation agrandissement »`,e.actuel().ligne);let t=e.avancer().valeur;if(N(e.actuel(),`defilement`)){e.avancer();let n=e.actuel().valeur===`et`&&N(e.regarder(1),`en`)&&N(e.regarder(2),`cascade`);if(n)for(let t=0;t<3;t++)e.avancer();return{propriete:`animation`,valeur:t,defilement:!0,...n?{cascade:!0}:{}}}return{propriete:`animation`,valeur:t}}if(t===`description`||t===`transcription`){let n=e.actuel();if(n.type===`CHAINE`){e.avancer();let r=Ot(e),i=n.parties??[];return{propriete:t,valeur:n.valeur,parties:i,...r?{texte:{type:`Chaine`,parties:i,versions:r,ligne:n.ligne}}:{}}}if(n.type===`IDENTIFIANT`){let n=[e.avancer().valeur];for(;e.actuel().type===`PONCTUATION`&&e.actuel().valeur===`.`&&P(e.regarder(1));)e.avancer(),n.push(e.avancer().valeur);let r=n.join(`.`);return{propriete:t,valeur:`{${r}}`,parties:[{type:`variable`,valeur:r}]}}return}if(t===`proportions`){let n=e.actuel();if(n.type!==`NOMBRE`||!N(e.regarder(1),`sur`)||e.regarder(2).type!==`NOMBRE`)throw new j(`les proportions s’écrivent « largeur sur hauteur », par exemple « proportions 4 sur 3 » ou « proportions 16 sur 9 »`,n.ligne);return e.avancer(),e.avancer(),{propriete:t,valeur:`${n.valeur}:${e.avancer().valeur}`}}if(t===`decorative`||t===`decoratif`)return{propriete:`decoratif`,valeur:`oui`};if(t===`prioritaire`)return{propriete:t,valeur:`oui`}}const Mt={courbe:`courbe`,courbes:`courbe`,barres:`barres`,barre:`barres`,camembert:`camembert`,camemberts:`camembert`},Nt=[`etiquette`,`etiquettes`,`valeur`,`couleur`,`description`,`proportions`,`style`],Pt=`serie "Ventes" valeur ventes avec couleur bleu`,Ft=(e,t=0)=>{let n=e.regarder(t);return P(n)?A(n.original??n.valeur):``};function It(e){if(!N(e.actuel(),`graphique`))return!1;let t=e.regarder(1);return N(t,`en`)||t.type===`IDENTIFIANT`||t.type===`CHAINE`||t.type===`PONCTUATION`&&t.valeur===`[`}function Lt(e){return N(e.actuel(),`serie`)&&e.regarder(1).type===`CHAINE`}function Rt(e){throw new j(`« serie » se place dans un graphique en bloc, décalée sous la ligne « graphique … : », par exemple ${Pt}`,e.actuel().ligne)}function zt(e,t){let n=e.avancer(),r=N(e.actuel(),`en`)?Mt[Ft(e,1)]:void 0;if(!r)throw new j(`il manque le genre du graphique juste après « graphique » : en courbe, en barres, en camembert. Par exemple : graphique en barres ventes avec etiquette mois et valeur montant et description "…"`,n.ligne);e.avancer(),e.avancer();let i={type:`Graphique`,genre:r,liste:t.expression(e),series:[],classes:[],ligne:n.ligne};if(e.accepter(`MOT_CLE`,`avec`))do Bt(e,i,t);while(e.accepter(`MOT_CLE`,`et`));return e.accepter(`PONCTUATION`,`:`)&&(i.series=Ht(e)),i}function Bt(e,t,n){let r=e.actuel(),i=Ft(e);if(!Nt.includes(i))throw new j(`« ${r.original??r.valeur} » n’est pas une option de graphique. Options : ${Nt.join(`, `)}.${M(i,Nt)}`,r.ligne);if(e.avancer(),i===`etiquette`)t.etiquette=e.attendreNom(`le champ des libellés, par exemple « etiquette mois »`).nom;else if(i===`etiquettes`)t.etiquettes=n.expression(e);else if(i===`valeur`)t.valeur=Vt(e);else if(i===`couleur`)t.couleur=e.attendreNom(`une couleur, par exemple « couleur bleu »`).nom;else if(i===`style`)t.classes.push(...e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean));else if(i===`proportions`){let[n,r]=jt(e,`proportions`).valeur.split(`:`).map(Number);t.proportions=[n,r]}else{let n=jt(e,`description`);t.description={type:`Chaine`,parties:n?.parties??[{type:`texte`,valeur:e.attendre(`CHAINE`,void 0,`la description entre guillemets`).valeur}],...n?.texte?.versions?{versions:n.texte.versions}:{},ligne:r.ligne}}}function Vt(e){let t=e.attendreNom(`le champ des valeurs, par exemple « valeur montant »`),n={champ:t.nom,ligne:t.ligne};if(N(e.actuel(),`en`)&&P(e.regarder(1))){e.avancer();let t=e.avancer();n.devise=t.original??t.valeur}return n}function Ht(e){let t=[];if(e.sauterFinsDeLigne(),!e.accepter(`INDENT`))return t;for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let n=e.actuel();if(!Lt(e))throw new j(`dans un graphique, chaque ligne est une série, par exemple ${Pt}`,n.ligne);e.avancer();let r=e.avancer(),i={nom:r.valeur,ligne:n.ligne},a=Ot(e);if(a&&(i.texteNom={type:`Chaine`,parties:[{type:`texte`,valeur:r.valeur}],versions:a,ligne:r.ligne}),N(e.actuel(),`valeur`)&&(e.avancer(),i.valeur=Vt(e)),e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel();if(Ft(e)!==`couleur`)throw new j(`« ${t.original??t.valeur} » ne se règle pas sur une série : seule sa couleur se choisit, par exemple ${Pt}`,t.ligne);e.avancer(),i.couleur=e.attendreNom(`une couleur, par exemple « couleur bleu »`).nom}while(e.accepter(`MOT_CLE`,`et`));t.push(i),e.sauterFinsDeLigne()}return e.accepter(`DEDENT`),t}function N(e,t){return(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t}const P=e=>e.type===`IDENTIFIANT`||e.type===`MOT_CLE`;function Ut(e,t){let n=A(t.original??t.valeur);if(n===`colle`)return N(e.actuel(),`en`)&&(N(e.regarder(1),`bas`)||N(e.regarder(1),`haut`))?(e.avancer(),{propriete:`colle`,valeur:A(e.avancer().valeur)}):{propriete:`colle`,valeur:`haut`};if(Gt.includes(n))return{propriete:n,valeur:`oui`};if(n===`automatique`&&e.actuel().type!==`NOMBRE`)return{propriete:n,valeur:`5`};if(n===`photo`){let t=e.attendre(`CHAINE`,void 0,`l’image entre guillemets : avec photo "camille.jpg"`);return{propriete:n,valeur:t.valeur,parties:t.parties??[]}}let r=jt(e,n);if(r)return r;if(n===`degrade`){if(!P(e.actuel()))throw new j(`un dégradé va d’une couleur à une autre : « degrade bleu vers violet »`,e.actuel().ligne);let t=e.avancer().valeur;if(!e.accepter(`MOT_CLE`,`vers`))throw new j(`il manque « vers » après « ${t} » : « degrade ${t} vers violet »`,e.actuel().ligne);if(!P(e.actuel()))throw new j(`il manque la deuxième couleur du dégradé : « degrade ${t} vers violet »`,e.actuel().ligne);let n=e.avancer().valeur,r=``;return P(e.actuel())&>(e.actuel().valeur)&&(r=`-${e.avancer().valeur}`),{propriete:`degrade`,valeur:`${t}-${n}${r}`}}}const Wt=[`telephone`,`tablette`,`ordinateur`],Gt=[`modifiable`,`ouvert`,`plusieurs`,`pourcentage`,`boucle`,`fixe`];function Kt(e){return e.verifier(`MOT_CLE`,`sur`)&&P(e.regarder(1))&&Wt.includes(A(e.regarder(1).valeur))}function qt(e,t){let n=e.avancer(),r=[];do{let t=e.actuel(),n=A(t.valeur);if(!P(t)||!Wt.includes(n))throw new j(`« ${t.valeur} » n’est pas un appareil. Appareils possibles : ${Wt.join(`, `)}.`,t.ligne);if(r.some(e=>e.valeur===n))throw new j(`l’appareil « ${n} » est écrit deux fois dans la même ligne « sur ».`,t.ligne);e.avancer(),r.push({propriete:`sur`,valeur:n})}while(e.accepter(`MOT_CLE`,`ou`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « sur », puis son contenu en dessous, décalé`),{type:`Bloc`,genre:`appareil`,styles:r,classes:[],corps:t.corps(e),ligne:n.ligne}}function Jt(e){if(!(N(e.actuel(),`entete`)||N(e.actuel(),`pied`)))return!1;let t=e.regarder(1);return t.type===`PONCTUATION`&&t.valeur===`:`||t.type===`MOT_CLE`&&t.valeur===`avec`}function Yt(e,t){let n=e.avancer(),r=A(n.original??n.valeur),i=[],a=[];if(e.accepter(`MOT_CLE`,`avec`))do if(e.verifier(`MOT_CLE`,`style`)){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur;a.push(...t.split(/\s+/).filter(Boolean))}else i.push(t.style(e));while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « ${r} », puis son contenu en dessous, décalé`),{type:`Disposition`,genre:r,styles:i,classes:a,corps:t.corps(e),ligne:n.ligne}}function Xt(e){let t={};for(;N(e.actuel(),`sans`);){e.avancer();let n=e.actuel(),r=A(n.original??n.valeur);if(!P(n)||r!==`entete`&&r!==`pied`)throw new j(`après « sans », il faut « entete » ou « pied » : page "connexion" sans entete et sans pied :`,n.ligne);e.avancer(),r===`entete`?t.sansEntete=!0:t.sansPied=!0,e.accepter(`MOT_CLE`,`et`)}return t}const Zt=[`nom`,`description`,`image`,`logo`,`adresse`],Qt=[`titre`,`description`,`image`],$t=e=>e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`:`;function en(e){return N(e.actuel(),`site`)&&$t(e)}function tn(e){return N(e.actuel(),`apercu`)&&$t(e)}function nn(e,t){let n=e.actuel();if(!P(n))throw new j(`une ligne de ce bloc commence par ${t} : à la place, on trouve « ${n.valeur||n.type} »`,n.ligne);return e.avancer(),A(n.original??n.valeur)}function rn(e){let t=e.actuel();if(N(t,`non`)||N(t,`oui`))return e.avancer(),N(t,`oui`);throw new j(`« indexation » est suivi de « non » (caché aux moteurs de recherche) ou de « oui ».`,t.ligne)}function an(e,t){if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t(),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}}function on(e){let t=e.avancer();e.avancer();let n={type:`Site`,indexation:!0,lignes:{},ligne:t.ligne};return an(e,()=>{let t=e.actuel().ligne,r=nn(e,`nom, description, image, logo, adresse ou indexation`);if(r===`indexation`){n.indexation=rn(e);return}if(!Zt.includes(r))throw new j(`« ${r} » n'est pas une ligne du bloc « site ». Lignes possibles : nom, description, image, logo, adresse ou indexation.`,t);let i=r;if(n[i]!==void 0)throw new j(`« ${i} » est déjà donné dans le bloc « site » (ligne ${n.lignes[i]}).`,t);let a=e.attendre(`CHAINE`,void 0,`la valeur de « ${i} » entre guillemets`);if(n[i]=a.valeur,n.lignes[i]=t,i===`nom`||i===`description`){let t=Ot(e);t&&(n.textes={...n.textes,[i]:{type:`Chaine`,parties:[{type:`texte`,valeur:a.valeur}],versions:t,ligne:a.ligne}})}}),n}function sn(e,t){let n=e.avancer();e.avancer();let r={type:`Apercu`,indexation:!0,ligne:n.ligne};return an(e,()=>{let n=e.actuel().ligne,i=nn(e,`titre, description, image ou indexation`);if(i===`indexation`){r.indexation=rn(e);return}if(!Qt.includes(i))throw new j(`« ${i} » n'est pas une ligne du bloc « apercu ». Lignes possibles : titre, description, image ou indexation.`,n);let a=i;if(r[a]!==void 0)throw new j(`« ${a} » est déjà donné dans le bloc « apercu ».`,n);r[a]=t(e)}),r}var cn=class{position=0;tokens=[];liaisons=new Map;constructor(e){let t;for(let n of e){if(n.type===`LIAISON`){t=n;continue}t&&this.liaisons.set(this.tokens.length,t),this.tokens.push(n),t=void 0}}liaisonAvant(){return this.liaisons.get(Math.min(this.position,this.tokens.length-1))}accepterLiaison(e){let t=this.liaisonAvant();return!t||t.valeur!==e?!1:(this.liaisons.delete(Math.min(this.position,this.tokens.length-1)),!0)}messageLiaison(e){let t=this.liaisonAvant();if(!t)return;let n=t.original??t.valeur;return`« ${n} » est un petit mot ignoré par Humalis : il ne peut pas servir de nom. Choisissez un autre nom pour ${e.replace(/^le nom de /,``)}, par exemple « ${n.replace(/'$/,``)}_1 » ou un mot plus parlant.`}actuel(){return this.tokens[Math.min(this.position,this.tokens.length-1)]}regarder(e){return this.tokens[Math.min(this.position+e,this.tokens.length-1)]}avancer(){let e=this.actuel();return this.position<this.tokens.length-1&&this.position++,e}verifier(e,t){let n=this.actuel();return n.type===e?t===void 0||n.valeur===t:!1}accepter(e,t){return this.verifier(e,t)?(this.avancer(),!0):!1}attendre(e,t,n){if(this.verifier(e,t))return this.avancer();let r=this.actuel();throw new j(`il manque ${n??(t?`« ${t} »`:e)} : à la place, on trouve ${r.type===`FIN_FICHIER`?`la fin du fichier`:r.type===`FIN_LIGNE`?`la fin de la ligne`:`« ${r.valeur||r.type} »`}`,r.ligne)}verifierNom(){let e=this.actuel();return e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&!e.reserve}attendreNom(e){let t=this.actuel();if(this.verifierNom())return this.avancer(),{...t,nom:t.original??t.valeur};let n=this.messageLiaison(e);if(n)throw new j(n,t.ligne);if(t.type===`MOT_CLE`)throw new j(`« ${t.original??t.valeur} » est un mot réservé du langage : il ne peut pas servir de nom. Choisissez un autre nom pour ${e.replace(/^le nom de /,``)}.`,t.ligne);return{...this.attendre(`IDENTIFIANT`,void 0,e),nom:``}}estFini(){return this.actuel().type===`FIN_FICHIER`}sauterFinsDeLigne(){for(;this.verifier(`FIN_LIGNE`);)this.avancer()}};const ln=e=>A(e.original??e.valeur),un=e=>e.original??e.valeur;function dn(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom de la source entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la source`);let r={type:`Source`,nom:n,session:!1,entetes:[],donnees:[],routes:[],ligne:t.ligne};return jr(e,()=>{let t=e.actuel();switch(ln(t)){case`adresse`:e.avancer(),r.adresse=e.attendre(`CHAINE`,void 0,`l'adresse de l'API entre guillemets`).valeur;break;case`session`:if(e.avancer(),!I(e.actuel(),`astratra`))throw new j(`« session » est suivi de « astratra » : la connexion des packs Astratra (session astratra)`,t.ligne);e.avancer(),r.session=!0;break;case`enveloppe`:e.avancer(),r.enveloppe=e.attendre(`CHAINE`,void 0,`le chemin de la valeur utile entre guillemets (enveloppe "data")`).valeur;break;case`erreur`:e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du chemin du message (erreur dans "message")`),r.erreurDans=e.attendre(`CHAINE`,void 0,`le chemin du message entre guillemets`).valeur;break;case`entete`:{e.avancer();let n=e.attendre(`CHAINE`,void 0,`le nom de l'en-tête entre guillemets`).valeur;I(e.actuel(),`vaut`)||e.attendre(`IDENTIFIANT`,`vaut`,`« vaut » suivi de la valeur (entete "Accept-Language" vaut "fr")`),e.avancer();let i=e.attendre(`CHAINE`,void 0,`la valeur de l'en-tête entre guillemets`).valeur;r.entetes.push({nom:n,valeur:i,ligne:t.ligne});break}case`jeton`:r.jeton=mn(e);break;case`cache`:e.avancer(),r.cache=pn(e,`cache 5 minutes`);break;case`delai`:e.avancer(),r.delai=pn(e,`delai 10 secondes`);break;case`essais`:e.avancer(),r.essais=fn(e,`essais 2`);break;case`donnee`:r.donnees.push(Pr(e,!0));break;case`route`:r.routes.push(_n(e));break;default:throw new j(`« ${un(t)} » n'est pas une ligne d'une source. Lignes possibles : adresse, session, enveloppe, erreur, entete, jeton, cache, essais, delai, donnee, route.`,t.ligne)}}),r}function fn(e,t){let n=e.attendre(`NOMBRE`,void 0,`un nombre entier (${t})`),r=Number(n.valeur);if(!Number.isInteger(r)||r<0)throw new j(`un nombre entier est attendu (${t}), mais « ${n.valeur} » a été trouvé`,n.ligne);return r}function pn(e,t){let n=fn(e,t),r=e.actuel(),i={seconde:1,secondes:1,minute:60,minutes:60,heure:3600,heures:3600}[ln(r)];if(i===void 0)throw new j(`une durée s'écrit avec un nombre entier et une unité : ${t} (secondes, minutes ou heures)`,r.ligne);return e.avancer(),n*i}function mn(e){let t=e.avancer(),n=e.actuel(),r=ln(n),i;if(r===`public`)e.avancer(),i=e.attendre(`CHAINE`,void 0,`le jeton public entre guillemets (jeton public "pk_…")`).valeur;else if(r===`secret`){if(e.avancer(),e.verifier(`CHAINE`))throw new j(`un jeton secret ne s'écrit jamais dans le fichier. Écrivez son nom : jeton secret depuis l'environnement "NOM_DE_LA_VARIABLE", et mettez la valeur dans le fichier .env du serveur.`,t.ligne);I(e.actuel(),`depuis`)||e.attendre(`IDENTIFIANT`,`depuis`,`« depuis l'environnement "NOM" » après « jeton secret »`),e.avancer(),I(e.actuel(),`environnement`)||e.attendre(`IDENTIFIANT`,`environnement`,`« environnement » après « depuis » (depuis l'environnement "NOM")`),e.avancer(),i=e.attendre(`CHAINE`,void 0,`le nom de la variable d'environnement entre guillemets`).valeur}else throw new j(`après « jeton », écrivez « public "…" » (valeur faite pour être vue) ou « secret depuis l'environnement "NOM" » ; « ${un(n)} » a été trouvé`,n.ligne);let a={genre:`autorisation`};if(e.accepter(`MOT_CLE`,`dans`)){let t=e.actuel(),n=ln(t);if(n!==`entete`&&n!==`parametre`)throw new j(`« dans » est suivi de « entete "X" » ou de « parametre "key" » ; « ${un(t)} » a été trouvé`,t.ligne);e.avancer(),a={genre:n,nom:e.attendre(`CHAINE`,void 0,`le nom de l'${n===`entete`?`en-tête`:`paramètre`} entre guillemets`).valeur}}return{genre:r,valeur:i,place:a,ligne:t.ligne}}const hn={"tout monde":`tout_le_monde`,connecte:`connecte`,"utilisateur connecte":`connecte`,"seul admin":`admin`,admin:`admin`},gn=[`lire`,`creer`,`modifier`,`supprimer`];function _n(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`l'adresse de la route entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après l'adresse de la route`);let r=[];return jr(e,()=>r.push(vn(e))),{type:`RouteSource`,adresse:n,regles:r,ligne:t.ligne}}function vn(e){let t=e.actuel(),n,r=0;for(;![`FIN_LIGNE`,`FIN_FICHIER`,`INDENT`,`DEDENT`].includes(e.regarder(r).type)&&!I(e.regarder(r),`peut`);)r++;if(I(e.regarder(r),`peut`)){let r=[];for(;!I(e.actuel(),`peut`);)r.push(ln(e.avancer()));if(n=hn[r.join(` `)],!n)throw new j(`qui peut agir ? Écrivez « tout le monde », « connecte » ou « seul admin », puis « peut … »`,t.ligne);e.avancer()}let i=e.avancer(),a=ln(i);if(!gn.includes(a))throw new j(`« ${un(i)} » n'est pas une action. Actions possibles : ${gn.join(`, `)}.`,i.ligne);let o=I(e.actuel(),`liste`);o&&e.avancer();let{nom:s}=e.attendreNom(`le nom de la donnée`),c=!1;if(e.verifier(`MOT_CLE`,`par`)){if(e.avancer(),!I(e.actuel(),`remplacement`)||a!==`modifier`)throw new j(`« par remplacement » ne suit que « modifier » (modifier produit par remplacement)`,i.ligne);e.avancer(),c=!0}let l;return e.accepter(`MOT_CLE`,`dans`)&&(l=e.attendre(`CHAINE`,void 0,`le chemin de la valeur dans la réponse, entre guillemets`).valeur),{type:`RegleSource`,qui:n,action:a,liste:o,donnee:s,...c?{remplacement:c}:{},dans:l,ligne:t.ligne}}function yn(e){if(I(e.actuel(),`source`)&&e.regarder(1).type===`CHAINE`)return e.avancer(),e.avancer().valeur}function bn(e){let t={};if(I(e.actuel(),`source`)&&e.regarder(1).type===`CHAINE`&&(e.avancer(),t.source=e.avancer().valeur),I(e.actuel(),`filtrant`)){e.avancer(),e.attendre(`MOT_CLE`,`par`,`« par » après « filtrant » (filtrant par categorie = "robes")`),t.filtrant=[];do{let n=e.attendreNom(`le nom du paramètre`).nom;e.attendre(`PONCTUATION`,`=`,`« = » entre le paramètre et sa valeur (filtrant par categorie = "robes")`),t.filtrant.push({cle:n,valeur:bi(e)})}while(e.accepter(`MOT_CLE`,`et`))}return t}function xn(e){let t={};if(e.verifier(`MOT_CLE`,`dans`)&&(e.avancer(),t.parent=e.attendre(`CHAINE`,void 0,`le nom de la page parente entre guillemets (page "commandes" dans "admin" :)`).valeur),I(e.actuel(),`adresse`)&&e.regarder(1).type===`CHAINE`&&(e.avancer(),t.adresse=e.avancer().valeur),I(e.actuel(),`reservee`)){let n=e.avancer(),r=e.actuel(),i=A(r.original??r.valeur);if(i!==`connecte`&&i!==`admin`)throw new j(`« reservee » est suivi de « connecte » ou de « admin » (page "admin" reservee a admin) ; « ${r.original??r.valeur} » a été trouvé`,n.ligne);e.avancer();let a;e.accepter(`MOT_CLE`,`sinon`)&&(e.attendre(`MOT_CLE`,`vers`,`« vers » suivi de la page, après « sinon » (sinon vers "connexion")`),a=e.attendre(`CHAINE`,void 0,`le nom de la page entre guillemets`).valeur),t.reservee={qui:i,...a===void 0?{}:{sinon:a},ligne:n.ligne}}let n=e.actuel();if(e.verifier(`MOT_CLE`,`dans`)||I(n,`adresse`)||I(n,`reservee`))throw new j(`« ${n.original??n.valeur} » n'est pas à sa place : dans l'en-tête d'une page, l'ordre est : dans "parent", puis a l'adresse "/…", puis reservee a …, puis avec parametre … et filtre …, puis deux-points`,n.ligne);return t}function Sn(e){let t=[],n=[];if(!e.accepter(`MOT_CLE`,`avec`))return{parametres:t,filtres:n};do{if(I(e.actuel(),`filtre`)){e.avancer();let{nom:t,ligne:r}=e.attendreNom(`le nom du filtre de la page (page "catalogue" avec filtre categorie :)`),i={nom:t,ligne:r};I(e.actuel(),`nombre`)?(e.avancer(),i.nombre=!0):I(e.actuel(),`texte`)&&e.avancer(),n.push(i);continue}I(e.actuel(),`parametre`)||e.attendre(`IDENTIFIANT`,`parametre`,`« parametre » ou « filtre » suivi de son nom (page "produit" avec parametre id :)`),e.avancer(),t.push(e.attendreNom(`le nom du paramètre de la page`).nom)}while(e.accepter(`MOT_CLE`,`et`));return{parametres:t,filtres:n}}const Cn=(e,t)=>(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t;function wn(e){return Cn(e.actuel(),`test`)&&e.regarder(1).type===`CHAINE`}function Tn(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du test entre guillemets`).valeur;e.attendre(`MOT_CLE`,`page`,`« de page » suivi du nom de la page testée`);let r=e.attendre(`CHAINE`,void 0,`le nom de la page testée entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la page, puis les étapes du test en dessous, décalées`);let i=[];if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)i.push(Dn(e)),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}return{type:`Test`,nom:n,page:r,etapes:i,ligne:t.ligne}}const En=(e,t)=>e.attendre(`CHAINE`,void 0,t).valeur;function Dn(e){let t=e.actuel(),n=t.ligne;if(Cn(t,`cliquer`))return e.avancer(),e.attendre(`MOT_CLE`,`sur`,`« sur » suivi du libellé ou du nom de l'élément`),{type:`Cliquer`,cible:En(e,`le libellé de l'élément entre guillemets`),ligne:n};if(Cn(t,`remplir`)){e.avancer(),e.attendre(`MOT_CLE`,`champ`,`« champ » suivi du libellé du champ`);let t=En(e,`le libellé du champ entre guillemets`);return e.attendre(`MOT_CLE`,`avec`,`« avec » suivi du texte à écrire`),{type:`RemplirChamp`,cible:t,valeur:En(e,`le texte à écrire entre guillemets`),ligne:n}}if(Cn(t,`aller`))return e.avancer(),e.attendre(`MOT_CLE`,`vers`,`« vers » suivi du nom de la page`),{type:`AllerVers`,cible:En(e,`le nom de la page entre guillemets`),ligne:n};if(Cn(t,`verifier`)){if(e.avancer(),Cn(e.actuel(),`que`)&&e.avancer(),e.accepter(`MOT_CLE`,`texte`)){let t=En(e,`le texte attendu entre guillemets`);e.attendre(`MOT_CLE`,`est`,`« est visible » ou « est absent »`);let r=e.actuel();if(Cn(r,`visible`))return e.avancer(),{type:`VerifierTexteVisible`,cible:t,ligne:n};if(Cn(r,`absent`))return e.avancer(),{type:`VerifierTexteAbsent`,cible:t,ligne:n};throw new j(`après « est », écrivez « visible » ou « absent ».`,r.ligne)}if(e.accepter(`MOT_CLE`,`page`))return e.attendre(`MOT_CLE`,`est`,`« est » suivi du nom de la page attendue`),{type:`VerifierPage`,cible:En(e,`le nom de la page attendue entre guillemets`),ligne:n};if(e.accepter(`MOT_CLE`,`champ`)){let t=En(e,`le libellé du champ entre guillemets`);if(!Cn(e.actuel(),`vaut`))throw new j(`il manque « vaut » suivi du texte attendu dans le champ.`,e.actuel().ligne);return e.avancer(),{type:`VerifierChamp`,cible:t,valeur:En(e,`le texte attendu entre guillemets`),ligne:n}}throw new j(`après « verifier que », écrivez texte "…" est visible, texte "…" est absent, page est "…" ou champ "…" vaut "…".`,n)}throw new j(`étape de test inconnue : « ${t.original??t.valeur} ». Étapes possibles : cliquer sur, remplir champ … avec, aller vers, verifier que …`,n)}const On=[{mot:`francais`,code:`fr`,nom:`français`,adjectif:`française`,nomPropre:`Français`,disponible:!0},{mot:`anglais`,code:`en`,nom:`anglais`,adjectif:`anglaise`,nomPropre:`English`,disponible:!0},{mot:`espagnol`,code:`es`,nom:`espagnol`,adjectif:`espagnole`,nomPropre:`Español`,disponible:!1},{mot:`portugais`,code:`pt`,nom:`portugais`,adjectif:`portugaise`,nomPropre:`Português`,disponible:!1},{mot:`swahili`,code:`sw`,nom:`swahili`,adjectif:`swahilie`,nomPropre:`Kiswahili`,disponible:!1},{mot:`lingala`,code:`ln`,nom:`lingala`,adjectif:`lingala`,nomPropre:`Lingála`,disponible:!1}];function kn(e){let t=e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase();return On.find(e=>e.mot===t)}const An=On.filter(e=>e.disponible),jn=[`icone`,`badge`,`avatar`,`progression`,`chargement`,`etoiles`,`compteur`,`audio`];function Mn(e){return e.type===`CHAINE`||e.type===`NOMBRE`||e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&(!e.reserve||[`vrai`,`faux`,`rien`].includes(e.valeur))||e.type===`PONCTUATION`&&e.valeur===`[`}function Nn(e){let t=e.actuel();if(N(t,`code`)&&N(e.regarder(1),`qr`)&&Mn(e.regarder(2)))return e.avancer(),e.avancer(),`qr`;let n=jn.find(e=>N(t,e));if(!n)return;let r=e.regarder(1),i=r.type===`FIN_LIGNE`||r.type===`MOT_CLE`&&r.valeur===`avec`;if(n===`chargement`&&i||Mn(r))return e.avancer(),n}const Pn=[`onglet`,`deroulant`];function Fn(e){return N(e.actuel(),`fil`)&&N(e.regarder(1),`ariane`)&&e.regarder(2).valeur===`:`}function In(e){return N(e.actuel(),`carte`)&&e.regarder(1).type===`CHAINE`&&!/^\p{Lu}/u.test(e.actuel().valeur)}function Ln(e){return N(e.actuel(),`marqueur`)&&Mn(e.regarder(1))}function Rn(e){return e.avancer(),e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean)}function zn(e,t){let n=e.avancer(),r=t.expression(e),i={},a=[];if(e.accepter(`MOT_CLE`,`avec`))do{let n=e.actuel(),r=A(n.original??n.valeur);if(n.type===`MOT_CLE`&&n.valeur===`style`)a.push(...Rn(e));else if(r===`latitude`||r===`longitude`||r===`zoom`){e.avancer();let a=r===`zoom`?`zoom 15`:r===`latitude`?`latitude -4,3250`:`longitude 15,3222`;if(!Mn(e.actuel())&&!(e.actuel().type===`PONCTUATION`&&[`-`,`(`].includes(e.actuel().valeur)))throw new j(`il manque la valeur après « ${r} » : ${a}`,n.ligne);i[r]=t.expression(e)}else if(r===`tuiles`||r===`attribution`)e.avancer(),i[r]=e.attendre(`CHAINE`,void 0,r===`tuiles`?`l’adresse des tuiles entre guillemets : tuiles "https://exemple.cd/{z}/{x}/{y}.png"`:`le texte de l’attribution entre guillemets : attribution "© MapTiler"`).valeur;else throw new j(`« ${n.original??n.valeur} » ne se règle pas sur une carte. Réglages possibles : latitude, longitude, zoom, tuiles, attribution, style.`,n.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Bloc`,genre:`carte`,styles:[],classes:a,titre:r,carte:i,corps:e.accepter(`PONCTUATION`,`:`)?t.corps(e):[],ligne:n.ligne}}function Bn(e,t){let n=e.avancer(),r=t(e),i={},a=[];if(e.accepter(`MOT_CLE`,`avec`))do{let n=e.actuel(),r=A(n.original??n.valeur);if(n.type===`MOT_CLE`&&n.valeur===`style`)a.push(...Rn(e));else if(r===`latitude`||r===`longitude`||r===`adresse`){if(e.avancer(),!Mn(e.actuel())&&!(e.actuel().type===`PONCTUATION`&&[`-`,`(`].includes(e.actuel().valeur)))throw new j(`il manque la valeur après « ${r} » : marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070`,n.ligne);i[r]=t(e)}else throw new j(`« ${n.original??n.valeur} » ne se règle pas sur un marqueur. Réglages possibles : latitude, longitude, adresse, style.`,n.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Element`,element:`marqueur`,contenu:r,styles:[],classes:a,lieu:i,ligne:n.ligne}}function Vn(e){return N(e.actuel(),`fichier`)&&e.regarder(1).type===`CHAINE`}function Hn(e){return N(e.actuel(),`fichier`)}const Un={o:1,octets:1,octet:1,ko:1024,mo:1048576,go:1073741824};function Wn(e,t){let n=e.avancer(),r=t(e);e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la variable qui recevra le fichier : fichier "Choisir une photo" dans photo`);let i={variable:e.attendreNom(`le nom de la variable qui recevra le fichier`).nom,accepte:[]};if(N(e.actuel(),`accepte`)){e.avancer();do{let t=e.actuel();if(t.type!==`IDENTIFIANT`&&t.type!==`MOT_CLE`)throw new j(`il manque ce que le fichier peut être : accepte images, accepte pdf, accepte images ou pdf`,t.ligne);i.accepte.push(A(e.avancer().valeur))}while(e.accepter(`MOT_CLE`,`ou`))}let a,o=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel(),n=A(t.valeur);if(n===`maximum`){e.avancer();let t=e.attendre(`NOMBRE`,void 0,`une taille après « maximum » : maximum 5 Mo`),n=e.actuel(),r=n.type===`IDENTIFIANT`?Un[A(n.valeur)]:void 0;if(r===void 0)throw new j(`la taille maximale a une unité : « maximum 500 Ko » ou « maximum 5 Mo »`,n.ligne);e.avancer(),i.octets=Math.round(Number(t.valeur)*r)}else if(n===`plusieurs`)e.avancer(),i.plusieurs=!0;else if(t.type===`IDENTIFIANT`&&n===`nom`)e.avancer(),a=e.attendre(`CHAINE`,void 0,`le nom de l'élément entre guillemets`).valeur;else if(t.type===`MOT_CLE`&&t.valeur===`style`)e.avancer(),o.push(...e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean));else throw new j(`« ${t.original??t.valeur} » ne se règle pas sur un choix de fichier. Réglages possibles : maximum 5 Mo, plusieurs, nom "…", style "…".`,t.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Element`,element:`fichier`,contenu:r,styles:[],classes:o,nom:a,fichier:i,ligne:n.ligne}}function Gn(e,t){e.avancer();let n=e.attendreNom(`le nom de la variable qui contient le fichier choisi`).nom;e.attendre(`MOT_CLE`,`vers`,`« vers » suivi de la route : envoyer fichier photo vers "api/photo" de la source "boutique"`);let r=e.attendre(`CHAINE`,void 0,`la route entre guillemets`).valeur,i=yn(e),a={type:`EnvoiFichier`,variable:n,adresse:r,...i===void 0?{}:{source:i},ligne:t};if(N(e.actuel(),`en`)&&N(e.regarder(1),`corps`)&&N(e.regarder(2),`brut`)&&(e.avancer(),e.avancer(),e.avancer(),a.corpsBrut=!0),N(e.actuel(),`sous`)&&N(e.regarder(1),`nom`)){if(a.corpsBrut)throw new j(`« en corps brut » envoie le fichier seul, sans formulaire : il n'a pas de nom de champ. Gardez « en corps brut » ou « sous le nom "photo" », pas les deux.`,e.actuel().ligne);e.avancer(),e.avancer(),a.champ=e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets : sous le nom "photo"`).valeur}return N(e.actuel(),`suivi`)&&(e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la variable de progression : suivi dans envoi`),a.suivi=e.attendreNom(`le nom de la variable de progression`).nom),N(e.actuel(),`et`)&&N(e.regarder(1),`fichier`)&&e.avancer(),N(e.actuel(),`fichier`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`dans`&&(e.avancer(),e.avancer(),a.resultat=e.attendreNom(`le nom de la variable qui recevra la réponse`).nom),a}const Kn={clair:`#ffffff`,sombre:`#141416`},qn=`#1d1d1f`;function Jn(e){let t=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(e.trim());if(!t)return;let n=t[1].length===3?[...t[1]].map(e=>e+e).join(``):t[1];return[0,2,4].map(e=>parseInt(n.slice(e,e+2),16))}function Yn(e){let t=Jn(e);return t?`#${t.map(e=>e.toString(16).padStart(2,`0`)).join(``)}`:void 0}function Xn(e){let[t,n,r]=(Jn(e)??[0,0,0]).map(e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4});return .2126*t+.7152*n+.0722*r}function Zn(e,t){let[n,r]=[Xn(e),Xn(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function Qn(e){return Zn(e,`#ffffff`)>=Zn(e,qn)?`#ffffff`:qn}const $n=[`automatique`,`clair`,`sombre`],er=[`etroite`,`normale`,`large`,`pleine`],tr=[`titres`,`texte`,`code`],nr=/\.(woff2|woff|ttf|otf)$/i,rr=[`page`,`encre`];function ir(e){return N(e.actuel(),`theme`)&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`:`}function ar(e,t){let n=e.actuel();if(!P(n))throw new j(`il manque ${t} : à la place, on trouve « ${n.valeur||n.type} »`,n.ligne);return e.avancer(),A(n.original??n.valeur)}function or(e,t){let n=e.attendre(`CHAINE`,void 0,`la couleur de « ${t} » entre guillemets, par exemple "#0e5a6b"`),r=Yn(n.valeur);if(!r)throw new j(`« ${n.valeur} » n’est pas une couleur. Écrivez-la entre guillemets sous la forme "#0e5a6b" (ou "#fff").`,n.ligne);return r}function sr(e){let t=e.avancer();e.avancer();let n={type:`Theme`,couleurs:[],polices:[],ligne:t.ligne};if(e.sauterFinsDeLigne(),!e.accepter(`INDENT`))return n;for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let t=e.actuel().ligne,r=ar(e,`une ligne du thème (couleur, police, mode ou largeur)`);if(r===`couleur`){let{nom:r}=e.attendreNom(`le nom de la couleur`),i=A(r);if(rr.includes(i))throw new j(`le nom « ${i} » est pris par le thème lui-même : choisissez un autre nom pour la couleur.`,t);if(!/^[a-z][a-z0-9_]*$/.test(i))throw new j(`le nom de couleur « ${r} » ne doit contenir que des lettres, des chiffres et des tirets bas.`,t);if(n.couleurs.some(e=>e.nom===i))throw new j(`la couleur « ${i} » est déjà déclarée dans le thème.`,t);let a,o;if(N(e.actuel(),`clair`)){if(e.avancer(),a=or(e,i),!N(e.actuel(),`sombre`))throw new j(`il manque « sombre » suivi de la couleur du mode sombre : couleur ${i} clair "${a}" sombre "#…"`,e.actuel().ligne);e.avancer(),o=or(e,i)}else a=or(e,i);n.couleurs.push({nom:i,clair:a,...o?{sombre:o}:{},ligne:t})}else if(r===`police`){let r=ar(e,`le rôle de la police (titres, texte ou code)`);if(!tr.includes(r))throw new j(`« ${r} » n’est pas un rôle de police. Rôles possibles : ${tr.join(`, `)}.`,t);if(n.polices.some(e=>e.role===r))throw new j(`la police « ${r} » est déjà déclarée dans le thème.`,t);let i=e.attendre(`CHAINE`,void 0,`le nom de la police entre guillemets`).valeur,a;if(N(e.actuel(),`depuis`)&&(e.avancer(),a=e.attendre(`CHAINE`,void 0,`le chemin du fichier de police entre guillemets`).valeur,!nr.test(a)))throw new j(`le fichier de police « ${a} » doit finir par .woff2, .woff, .ttf ou .otf.`,t);n.polices.push({role:r,nom:i,...a?{fichier:a}:{},ligne:t})}else if(r===`mode`||r===`largeur`){let i=r===`mode`?$n:er,a=ar(e,`la valeur de « ${r} »`);if(!i.includes(a))throw new j(`« ${a} » n’est pas une valeur possible pour « ${r} ». Valeurs possibles : ${i.join(`, `)}.`,t);n[r]={valeur:a,ligne:t}}else throw new j(`« ${r} » n’est pas une ligne du thème. Lignes possibles : couleur, police, mode, largeur.`,t);e.sauterFinsDeLigne()}return e.accepter(`DEDENT`),n}const cr=e=>N(e.actuel(),`basculer`)&&N(e.regarder(1),`theme`);function lr(e){if(cr(e))return!0;if(!(e.verifier(`MOT_CLE`,`changer`)&&N(e.regarder(1),`theme`)&&e.regarder(2).valeur===`par`))return!1;let t=e.regarder(3);return t.type===`CHAINE`||P(t)&&$n.includes(A(t.valeur))}function ur(e){if(cr(e)){let t=e.avancer();return{type:`Action`,action:`changerTheme`,arguments:[{type:`Chaine`,parties:[{type:`texte`,valeur:`bascule`}],ligne:e.avancer().ligne}],ligne:t.ligne}}let t=e.avancer();e.avancer(),e.avancer();let n=e.avancer();return{type:`Action`,action:`changerTheme`,arguments:[{type:`Chaine`,parties:[{type:`texte`,valeur:n.type===`CHAINE`?n.valeur:A(n.valeur)}],ligne:n.ligne}],ligne:t.ligne}}function F(e,t){return(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t}const dr=e=>e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&!e.reserve,fr={milliseconde:`milliseconde`,millisecondes:`milliseconde`,ms:`milliseconde`,seconde:`seconde`,secondes:`seconde`,minute:`minute`,minutes:`minute`,heure:`heure`,heures:`heure`},pr={milliseconde:1,seconde:1e3,minute:6e4,heure:36e5};function mr(e){if(e.type===`IDENTIFIANT`||e.type===`MOT_CLE`)return fr[A(e.original??e.valeur)]}function hr(e,t=0){let n=e.regarder(t);return(n.type===`NOMBRE`||dr(n))&&mr(e.regarder(t+1))!==void 0}function gr(e,t,n){let r=e.actuel();if(r.type!==`NOMBRE`&&!dr(r))throw new j(`il manque une durée : un nombre suivi de son unité, par exemple « ${n} ».`,r.ligne);let i=t.expression(e),a=mr(e.actuel());if(!a)throw new j(`il manque l’unité de la durée après le nombre : millisecondes, secondes, minutes ou heures (par exemple « ${n} »).`,e.actuel().ligne);return e.avancer(),{valeur:i,unite:a,ligne:r.ligne}}function _r(e,t,n){let r=n?{genre:n}:{};for(;;)if(F(e.actuel(),`pendant`)&&hr(e,1))e.avancer(),r.duree=gr(e,t,`pendant 10 secondes`);else if(F(e.actuel(),`sans`)&&F(e.regarder(1),`disparaitre`))e.avancer(),e.avancer(),r.persistant=!0;else if(e.verifier(`MOT_CLE`,`avec`)&&F(e.regarder(1),`action`)){let n=e.avancer().ligne;e.avancer();let i=e.attendre(`CHAINE`,void 0,`le texte du bouton entre guillemets (avec action "Annuler" :)`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le texte du bouton, puis ce qu’il fait en dessous, décalé`),r.action={libelle:i,corps:t.bloc(e),ligne:n}}else break;return Object.keys(r).length>0?r:void 0}function vr(e){let t=e.actuel(),n=e.regarder(1),r=n.type===`CHAINE`||n.type===`NOMBRE`||dr(n)||n.type===`PONCTUATION`&&[`[`,`(`].includes(n.valeur);return(F(t,`apres`)||F(t,`toutes`)||F(t,`tous`))&&(hr(e,1)||n.type===`NOMBRE`)||(F(t,`copier`)||F(t,`partager`)||F(t,`confirmer`))&&r||F(t,`fenetre`)&&n.type===`CHAINE`}function yr(e,t){let n=e.actuel();return F(n,`copier`)?xr(e,t):F(n,`partager`)?Sr(e,t):F(n,`confirmer`)?Cr(e,t):F(n,`fenetre`)?wr(e,t):br(e,t)}function br(e,t){let n=e.avancer(),r=F(n,`apres`)?`apres`:`toutes`,i=gr(e,t,r===`apres`?`apres 3 secondes`:`toutes les 5 secondes`),a;F(e.actuel(),`tant`)&&F(e.regarder(1),`que`)&&(e.avancer(),e.avancer(),a=t.comparaison(e));let o=r===`apres`?`apres …`:`toutes les …`;return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de « ${o} », puis ce qu’il faut faire en dessous, décalé`),{type:`Minuterie`,mode:r,duree:i,...a?{tantQue:a}:{},corps:t.bloc(e),ligne:n.ligne}}function xr(e,t){let n=e.avancer(),r=t.expression(e);if(e.verifier(`MOT_CLE`,`avec`)&&F(e.regarder(1),`message`)){e.avancer(),e.avancer();let t=e.attendre(`CHAINE`,void 0,`le texte du message entre guillemets (copier code avec message "Code copié")`),i=Ot(e),a=i?{texte:{type:`Chaine`,parties:t.parties??[],versions:i,ligne:t.ligne}}:{};return{type:`Copier`,valeur:r,message:t.valeur,...a,ligne:n.ligne}}return F(e.actuel(),`sans`)&&F(e.regarder(1),`message`)?(e.avancer(),e.avancer(),{type:`Copier`,valeur:r,message:null,ligne:n.ligne}):{type:`Copier`,valeur:r,ligne:n.ligne}}function Sr(e,t){let n=e.avancer(),r={type:`Partager`,texte:t.expression(e),ligne:n.ligne};for(;e.accepter(`MOT_CLE`,`avec`)||e.accepter(`MOT_CLE`,`et`);){let n=e.actuel();if(F(n,`titre`))e.avancer(),r.titre=t.expression(e);else if(F(n,`lien`))e.avancer(),e.accepter(`MOT_CLE`,`vers`),r.lien={adresse:e.attendre(`CHAINE`,void 0,`l’adresse du lien entre guillemets (avec lien "https://…" ou avec lien vers "produit")`).valeur};else if(r.lien&&dr(n))(r.lien.parametres??=[]).push(t.argumentPage(e));else throw new j(`après « partager … avec », on écrit « titre "…" » ou « lien "…" » (ici : « ${n.original??n.valeur} »).`,n.ligne)}return r}function Cr(e,t){let n=e.avancer(),r=t.expression(e),i={};if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel(),n=F(t,`oui`)?`oui`:F(t,`non`)?`non`:void 0;if(!n)throw new j(`après « confirmer … avec », on nomme les boutons : avec oui "Supprimer" et non "Garder" (ici : « ${t.original??t.valeur} »).`,t.ligne);e.avancer(),i[n]=e.attendre(`CHAINE`,void 0,`le texte du bouton « ${n} » entre guillemets`).valeur}while(e.accepter(`MOT_CLE`,`et`));e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de « confirmer … », puis ce qu’il faut faire si la personne répond oui, décalé`);let a=t.bloc(e),o=[];return e.sauterFinsDeLigne(),e.accepter(`MOT_CLE`,`sinon`)&&(e.attendre(`PONCTUATION`,`:`,`deux-points après « sinon »`),o=t.bloc(e)),{type:`Confirmer`,question:r,...i,alors:a,sinon:o,ligne:n.ligne}}function wr(e,t){let n=e.avancer(),r={type:`Fenetre`,titre:e.attendre(`CHAINE`,void 0,`le titre de la fenêtre entre guillemets`).valeur,classes:[],corps:[],ligne:n.ligne};if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.actuel();if(F(t,`nom`))e.avancer(),r.nom=e.attendre(`CHAINE`,void 0,`le nom de la fenêtre entre guillemets`).valeur;else if(F(t,`description`))e.avancer(),r.description=e.attendre(`CHAINE`,void 0,`la description entre guillemets`).valeur;else if(F(t,`obligatoire`))e.avancer(),r.obligatoire=!0;else if(F(t,`style`))e.avancer(),r.classes.push(...e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur.split(/\s+/).filter(Boolean));else throw new j(`« ${t.original??t.valeur} » n’est pas une option de fenêtre. Options possibles : nom, description, obligatoire, style.`,t.ligne)}while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « fenetre », puis son contenu en dessous, décalé`),r.corps=t.bloc(e),r}function Tr(e,t){let n=e.actuel();if(F(n,`appuie`)||F(n,`appuies`)){e.avancer(),e.attendre(`MOT_CLE`,`sur`,`« sur » suivi des touches entre guillemets (appuie sur "controle+k")`);let t=e.attendre(`CHAINE`,void 0,`les touches entre guillemets, par exemple "controle+k"`).valeur,n=e.accepter(`MOT_CLE`,`dans`)?e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur:void 0;return{genre:`touche`,touches:t,...n===void 0?{}:{cible:n}}}if(F(n,`ecrit`)||F(n,`ecrire`))return e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du nom du champ (ecrit dans "recherche")`),{genre:`saisie`,cible:e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur};if(F(n,`arrete`)&&F(e.regarder(1),`ecrire`)){e.avancer(),e.avancer(),e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du nom du champ (arrete d’ecrire dans "recherche")`);let n=e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur,r;return F(e.actuel(),`apres`)&&(e.avancer(),r=gr(e,t,`apres 300 millisecondes`)),{genre:`pauseSaisie`,cible:n,...r?{duree:r}:{}}}if(F(n,`arrive`)&&F(e.regarder(1),`en`)&&F(e.regarder(2),`bas`)){e.avancer(),e.avancer(),e.avancer();let n={genre:`bas`,cible:e.attendre(`CHAINE`,void 0,`le nom du bloc entre guillemets (arrive en bas de "catalogue")`).valeur};for(;;)if(F(e.actuel(),`tant`)&&F(e.regarder(1),`que`))e.avancer(),e.avancer(),n.tantQue=t.comparaison(e);else if(e.verifier(`MOT_CLE`,`avec`)&&F(e.regarder(1),`bouton`))e.avancer(),e.avancer(),n.bouton=e.attendre(`CHAINE`,void 0,`le texte du bouton entre guillemets (avec bouton "Voir plus")`).valeur;else if(F(e.actuel(),`sans`)&&F(e.regarder(1),`bouton`))e.avancer(),e.avancer(),n.bouton=null;else break;return n}}function Er(e){return F(e.actuel(),`ordre`)&&dr(e.regarder(1))&&F(e.regarder(2),`change`)}function Dr(e){e.avancer();let t=e.attendreNom(`le nom de la liste`).nom;return e.avancer(),{genre:`ordre`,variable:t}}function Or(e){let t=new cn(e),n=[],r=[],i=[],a=[],o=[],s=[],c=[],l=[],u=[],d=[],f=[],p=[],m,h,g,_=[],v=[],y,ee,te=new Set;for(t.sauterFinsDeLigne();!t.estFini();){if(t.verifier(`MOT_CLE`,`style`)&&t.regarder(1).valeur===`:`){let e=t.avancer();t.avancer(),t.sauterFinsDeLigne();let n=t.accepter(`CSS`)?t.regarder(-1).valeur:``;r.push({type:`BlocStyle`,css:n,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(Jt(t)){let e=Yt(t,{corps:L,style:oi});if(e.genre===`entete`?y:ee)throw new j(`un seul « ${e.genre} » par application : il est déjà déclaré plus haut.`,e.ligne);e.genre===`entete`?y=e:ee=e,t.sauterFinsDeLigne();continue}if(ir(t)){if(m)throw new j(`un seul bloc « theme » par application : réunissez les couleurs et les polices dans le même bloc.`,t.actuel().ligne);m=sr(t),t.sauterFinsDeLigne();continue}if(en(t)){if(h)throw new j(`un seul bloc « site » par application : il est déjà déclaré (ligne ${h.ligne}).`,t.actuel().ligne);if(n.length>0)throw new j(`le bloc « site » s'écrit en haut du fichier, avant les pages.`,t.actuel().ligne);h=on(t),t.sauterFinsDeLigne();continue}if(St(t)){if(g)throw new j(`un seul bloc « langues » par application : il est déjà déclaré (ligne ${g.ligne}).`,t.actuel().ligne);if(n.length>0)throw new j(`le bloc « langues » s'écrit en haut du fichier, avant les pages.`,t.actuel().ligne);g=Tt(t),t.sauterFinsDeLigne();continue}if(Ct(t)){_.push(Et(t)),t.sauterFinsDeLigne();continue}if(Ur(t)){v.push({...Wr(t),calcul:!0,constante:!0}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`variable`)){o.push(Wr(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`serveur`)&&t.regarder(1).type===`CHAINE`){u.push(Nr(t)),t.sauterFinsDeLigne();continue}if(wn(t)){p.push(Tn(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`fonction`)&&Ei(t.regarder(1))){f.push(Ar(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`source`)&&t.regarder(1).type===`CHAINE`){d.push(dn(t)),t.sauterFinsDeLigne();continue}if(I(t.actuel(),`composant`)&&t.regarder(1).type===`CHAINE`){l.push(zr(t)),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)&&I(t.regarder(1),`composant`)){let e=t.avancer();t.avancer();let n=t.attendre(`CHAINE`,void 0,`le nom du composant entre guillemets`).valeur;I(t.actuel(),`depuis`)||t.attendre(`IDENTIFIANT`,`depuis`,`« depuis » suivi du chemin du fichier React`),t.avancer();let r=t.attendre(`CHAINE`,void 0,`le chemin du fichier React entre guillemets`).valeur;s.push({type:`ComposantReact`,nom:n,chemin:r,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)&&I(t.regarder(1),`donnees`)){let e=t.avancer();t.avancer();let n=t.attendre(`CHAINE`,void 0,`le nom des données entre guillemets`).valeur;if(!I(t.actuel(),`depuis`))throw new j(`écrivez « depuis » puis le chemin du fichier CSV ou JSON.`,e.ligne);t.avancer();let r=t.attendre(`CHAINE`,void 0,`le chemin du fichier CSV ou JSON entre guillemets`).valeur;a.push({nom:n,chemin:r,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)&&I(t.regarder(1),`fichier`)){let e=t.avancer();t.avancer();let n=t.attendre(`CHAINE`,void 0,`le chemin du fichier Humalis entre guillemets`).valeur;c.push({chemin:n,ligne:e.ligne}),t.sauterFinsDeLigne();continue}if(t.verifier(`MOT_CLE`,`utiliser`)){let e=t.avancer();t.attendre(`MOT_CLE`,`style`,`« style » après « utiliser »`);let n=t.attendre(`CHAINE`,void 0,`le chemin du fichier CSS entre guillemets`).valeur;i.push({type:`FichierStyle`,chemin:n,ligne:e.ligne}),t.sauterFinsDeLigne();continue}let e=Br(t);if(te.has(e.nom))throw new j(`la page « ${e.nom} » est déjà déclarée plus haut`,e.ligne);te.add(e.nom),n.push(e),t.sauterFinsDeLigne()}if(v.length>0)for(let e of[...n,...l,...y?[y]:[],...ee?[ee]:[]])e.corps.unshift(...v.map(e=>({...e})));let ne={type:`Programme`,pages:n,styles:r,fichiersStyle:i,donneesFichiers:a,partages:o,composantsReact:s,composants:l,serveurs:u,sources:d,fichiersHumalis:c,fonctions:f,tests:p,...m?{theme:m}:{},...h?{site:h}:{},...g?{langues:g}:{},..._.length?{traductions:_}:{},...y?{entete:y}:{},...ee?{pied:ee}:{}},re=ot(ne);return re.length&&(ne.fonctionsActions=re),ne}function kr(e){let t=e.avancer(),n=R(e);e.attendre(`PONCTUATION`,`:`,`deux-points après la valeur de « selon »`);let r=[],i=[];for(e.sauterFinsDeLigne(),e.attendre(`INDENT`,void 0,`des lignes « cas … : » décalées sous « selon »`),e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let t=e.actuel().ligne;if(I(e.actuel(),`cas`)){e.avancer();let n=[];do n.push(R(e));while(e.accepter(`MOT_CLE`,`ou`));e.attendre(`PONCTUATION`,`:`,`deux-points après les valeurs du « cas »`),r.push({valeurs:n,corps:L(e),ligne:t})}else if(e.accepter(`MOT_CLE`,`sinon`))e.attendre(`PONCTUATION`,`:`,`deux-points après « sinon »`),i=L(e);else throw new j(`dans « selon », chaque ligne commence par « cas … : » ou « sinon : ».`,t);e.sauterFinsDeLigne()}return e.accepter(`DEDENT`),{type:`Selon`,valeur:n,cas:r,sinon:i,ligne:t.ligne}}function Ar(e){let t=e.avancer(),{nom:n}=e.attendreNom(`le nom de la fonction`),r=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.attendreNom(`le nom d'une valeur que reçoit la fonction`);r.push({nom:t.nom,ligne:t.ligne})}while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « fonction », puis son corps en dessous, décalé`),{type:`Fonction`,nom:n,parametres:r,corps:L(e),ligne:t.ligne}}function I(e,t){return(e.type===`MOT_CLE`||e.type===`IDENTIFIANT`)&&A(e.original??e.valeur)===t}function jr(e,t){if(e.sauterFinsDeLigne(),e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t(),e.sauterFinsDeLigne();e.accepter(`DEDENT`)}}const Mr=e=>A(e.original??e.valeur);function Nr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du serveur entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom du serveur`);let r=[],i=[];return jr(e,()=>{let t=e.actuel();if(I(t,`donnee`))r.push(Pr(e));else if(I(t,`route`))i.push(Lr(e));else throw new j(`dans un serveur, on écrit « donnee … : » ou « route "…" : », mais « ${t.original??t.valeur} » a été trouvé`,t.ligne)}),{type:`Serveur`,nom:n,donnees:r,routes:i,ligne:t.ligne}}function Pr(e,t=!1){let n=e.avancer(),{nom:r}=e.attendreNom(`le nom de la donnée`);e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la donnée`);let i=[];return jr(e,()=>{let n=e.attendreNom(`le nom du champ`);e.attendre(`PONCTUATION`,`:`,`deux-points entre le nom du champ et son type`),i.push({nom:n.nom,type:Fr(e,t),ligne:n.ligne})}),{type:`Donnee`,nom:r,champs:i,ligne:n.ligne}}function Fr(e,t=!1){let n=e.avancer(),r=Mr(n);if(r===`texte`||r===`nombre`||r===`booleen`||r===`date`)return{genre:r};if(r===`liste`)return{genre:`liste`,de:Fr(e,t)};if(t&&Ei(n))return{genre:`donnee`,nom:n.original??n.valeur};throw new j(`« ${n.original??n.valeur} » n'est pas un type de champ. Types possibles : texte, nombre, booleen, date, liste de …`,n.ligne)}const Ir=[`lire`,`creer`,`modifier`,`supprimer`];function Lr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`l'adresse de la route entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après l'adresse de la route`);let r=[];return jr(e,()=>r.push(Rr(e))),{type:`Route`,adresse:n,regles:r,ligne:t.ligne}}function Rr(e){let t=e.actuel(),n=[];for(;!I(e.actuel(),`peut`)&&!e.verifier(`FIN_LIGNE`)&&!e.estFini();)n.push(Mr(e.avancer()));let r={"tout monde":`tout_le_monde`,connecte:`connecte`,"utilisateur connecte":`connecte`,"seul admin":`admin`,admin:`admin`}[n.join(` `)];if(!r)throw new j(`qui peut agir ? Écrivez « tout le monde », « connecte » ou « seul admin », puis « peut … »`,t.ligne);e.attendre(e.actuel().type===`MOT_CLE`?`MOT_CLE`:`IDENTIFIANT`,`peut`,`« peut » suivi d'une action`);let i=[];do{let t=e.avancer(),n=Mr(t);if(!Ir.includes(n))throw new j(`« ${t.original??t.valeur} » n'est pas une action. Actions possibles : ${Ir.join(`, `)}.`,t.ligne);i.push(n)}while(e.accepter(`MOT_CLE`,`et`));let{nom:a}=e.attendreNom(`le nom de la donnée`);return{type:`Regle`,qui:r,actions:i,donnee:a,ligne:t.ligne}}function zr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du composant entre guillemets`).valeur;e.attendre(`PONCTUATION`,`:`,`deux-points après le nom du composant`);let r=L(e);return{type:`DefinitionComposant`,nom:n,parametres:r.filter(e=>e.type===`Parametre`),corps:r.filter(e=>e.type!==`Parametre`),ligne:t.ligne}}function Br(e){let t=e.attendre(`MOT_CLE`,`page`,`une déclaration de page`),n=e.attendre(`CHAINE`,void 0,`le nom de la page entre guillemets`),r=xn(e),{parametres:i,filtres:a}=Sn(e),o=Xt(e);e.attendre(`PONCTUATION`,`:`,`deux-points après le nom de la page`);let s=L(e);for(let e of r.adresse?.matchAll(/:([A-Za-z_]\w*)/g)??[])i.includes(e[1])||i.push(e[1]);let c=s.filter(e=>e.type===`Apercu`);if(c.length>1)throw new j(`un seul bloc « apercu » par page : il est déjà écrit ligne ${c[0].ligne}.`,c[1].ligne);return{type:`Page`,nom:n.valeur,parametres:i,...a.length>0?{filtres:a}:{},...r,...o,...c.length?{apercu:c[0]}:{},corps:s.filter(e=>e.type!==`Apercu`),ligne:t.ligne}}function L(e){let t=[];if(e.sauterFinsDeLigne(),!e.accepter(`INDENT`))return t;for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();)t.push(Vr(e)),e.sauterFinsDeLigne();return e.accepter(`DEDENT`),t}function Vr(e){if(I(e.actuel(),`tableau`)&&(e.regarder(1).type===`CHAINE`||e.regarder(1).valeur===`:`)){let t=e.avancer(),n=e.verifier(`PONCTUATION`,`:`)?void 0:Di(e);e.attendre(`PONCTUATION`,`:`,`deux-points après la légende du tableau`),e.sauterFinsDeLigne();let r=[],i=[];if(e.accepter(`INDENT`)){for(e.sauterFinsDeLigne();!e.verifier(`DEDENT`)&&!e.estFini();){let t=e.avancer();if(!I(t,`colonnes`)&&!I(t,`rangee`))throw new j(`un tableau contient « colonnes » et « rangee ».`,t.ligne);let n=[Di(e)];for(;e.accepter(`PONCTUATION`,`,`);)n.push(Di(e));I(t,`colonnes`)?r.push(...n):i.push(n),e.sauterFinsDeLigne()}e.accepter(`DEDENT`)}return{type:`TableauDocumentation`,...n?{legende:n}:{},colonnes:r,rangees:i,ligne:t.ligne}}if(I(e.actuel(),`liste`)&&(e.regarder(1).valeur===`:`||I(e.regarder(1),`numerotee`)&&e.regarder(2).valeur===`:`)){let t=e.avancer(),n=I(e.actuel(),`numerotee`);return n&&e.avancer(),e.attendre(`PONCTUATION`,`:`,`deux-points après « liste »`),{type:`Bloc`,genre:n?`listeNumerotee`:`liste`,styles:[],classes:[],corps:L(e),ligne:t.ligne}}if(I(e.actuel(),`code`)&&yi(e)){let t=e.avancer(),n=e.verifier(`PONCTUATION`,`:`)||I(e.actuel(),`avec`)?void 0:e.avancer().valeur,r;I(e.actuel(),`avec`)&&(e.avancer(),e.avancer(),e.avancer(),r=I(e.actuel(),`au`)?(e.avancer(),e.avancer(),`defilement`):`chargement`),e.attendre(`PONCTUATION`,`:`,`deux-points après « code »`),e.accepter(`FIN_LIGNE`);let i=e.attendre(`CODE_BRUT`,void 0,`les lignes du bloc de code`).valeur;return{type:`CodeDocumentation`,...n?{langage:n}:{},...r?{frappe:r}:{},code:i,ligne:t.ligne}}if(I(e.actuel(),`en`)&&I(e.regarder(1),`supposant`)){let t=e.avancer();for(let n of[`supposant`,`que`,`ca`,`marche`]){if(!I(e.actuel(),n))throw new j(`écrivez « en supposant que ça marche : »`,t.ligne);e.avancer()}return e.attendre(`PONCTUATION`,`:`,`deux-points après « en supposant que ça marche »`),{type:`Supposant`,corps:L(e),ligne:t.ligne}}if(e.verifier(`MOT_CLE`,`variable`))return Wr(e);if(I(e.actuel(),`continuer`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`vers`){let t=e.avancer();return e.avancer(),{type:`Action`,action:`rediriger`,arguments:[R(e)],continuer:!0,ligne:t.ligne}}if(tn(e))return sn(e,R);if(I(e.actuel(),`sous`)&&I(e.regarder(1),`page`)){let t=e.avancer();return e.avancer(),{type:`SousPage`,ligne:t.ligne}}if(I(e.actuel(),`revenir`)&&(e.regarder(1).type===`FIN_LIGNE`||e.regarder(1).type===`FIN_FICHIER`||e.regarder(1).type===`DEDENT`||e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`vers`)){let t=e.avancer();return{type:`Action`,action:`revenir`,arguments:e.accepter(`MOT_CLE`,`vers`)?[R(e)]:[],ligne:t.ligne}}if(I(e.actuel(),`recharger`)&&Ei(e.regarder(1))){let t=e.avancer();return{type:`Rechargement`,variable:e.attendreNom(`le nom de la variable à recharger`).nom,ligne:t.ligne}}if(I(e.actuel(),`essayer`)&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`:`){let t=e.avancer();e.avancer();let n=L(e);e.sauterFinsDeLigne();let r=[];return e.verifier(`MOT_CLE`,`si`)&&I(e.regarder(1),`erreur`)&&e.regarder(2).type===`PONCTUATION`&&e.regarder(2).valeur===`:`&&(e.avancer(),e.avancer(),e.avancer(),r=L(e)),{type:`Essayer`,corps:n,siErreur:r,ligne:t.ligne}}if(I(e.actuel(),`fonction`)&&Ei(e.regarder(1)))return Ar(e);if(Ei(e.actuel())&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`(`){let t=R(e);if(t.type===`Appel`)return{type:`Execution`,nom:t.nom,arguments:t.arguments,ligne:t.ligne}}if(Ur(e))return{...Wr(e),calcul:!0,constante:!0};if(e.verifier(`MOT_CLE`,`calcul`)&&Ei(e.regarder(1))&&e.regarder(2).type===`PONCTUATION`&&e.regarder(2).valeur===`=`)return{...Wr(e),calcul:!0};if(e.verifier(`MOT_CLE`,`si`))return fi(e);if(e.verifier(`MOT_CLE`,`quand`))return xi(e);if(I(e.actuel(),`tant`)&&I(e.regarder(1),`que`)){let t=e.avancer();e.avancer();let n=pi(e);return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de « tant que … »`),{type:`TantQue`,test:n,corps:L(e),ligne:t.ligne}}if(I(e.actuel(),`repeter`)&&(e.regarder(1).type!==`PONCTUATION`||e.regarder(1).valeur!==`=`)){let t=e.avancer(),n=R(e);if(!I(e.actuel(),`fois`))throw new j(`il manque « fois » : écrivez par exemple « repeter 3 fois : ».`,e.actuel().ligne);return e.avancer(),e.attendre(`PONCTUATION`,`:`,`deux-points après « fois »`),{type:`Repeter`,fois:n,corps:L(e),ligne:t.ligne}}if(I(e.actuel(),`arreter`)&&(e=>e.type===`FIN_LIGNE`||e.type===`FIN_FICHIER`||e.type===`DEDENT`)(e.regarder(1)))return{type:`Arreter`,ligne:e.avancer().ligne};if(I(e.actuel(),`passer`)&&I(e.regarder(1),`suivant`)){let t=e.avancer();return e.avancer(),{type:`PasserAuSuivant`,ligne:t.ligne}}if(I(e.actuel(),`selon`)&&(e.regarder(1).type!==`PONCTUATION`||e.regarder(1).valeur!==`=`))return kr(e);let t=e.regarder(1);if(I(e.actuel(),`rendre`)&&(ji(t)||t.type===`PONCTUATION`&&[`(`,`-`].includes(t.valeur)||t.type===`MOT_CLE`&&t.valeur===`rien`)){let t=e.avancer();return{type:`Rendre`,valeur:R(e),ligne:t.ligne}}if(e.verifier(`MOT_CLE`,`pour`))return Si(e);if(vr(e))return yr(e,ki);if(I(e.actuel(),`connecter`))return di(e);if(I(e.actuel(),`deconnecter`))return{type:`Deconnexion`,ligne:e.avancer().ligne};if(lr(e))return ur(e);if((I(e.actuel(),`supprimer`)||I(e.actuel(),`modifier`))&&Ei(e.regarder(1)))return ui(e);if(e.verifier(`MOT_CLE`,`formulaire`)&&e.regarder(1).type===`CHAINE`)return Zr(e);if($r(e))return ei(e);if(Kt(e))return qt(e,{corps:L});let n=e.actuel().ligne,r=Xr(e,Yr);if(r)return ni(e,{element:`champ`,ligne:n,sorte:r});if(Vn(e))return Wn(e,R);if(In(e))return zn(e,{expression:R,corps:L});if(Ln(e))return Bn(e,R);if(It(e))return zt(e,{expression:R});Lt(e)&&Rt(e);let i=e.actuel().ligne;if(kt(e))return e.avancer(),e.avancer(),ni(e,{element:`selecteurLangue`,ligne:i});let a=Nn(e);if(a)return ni(e,{element:a,ligne:i});if(si(e))return ci(e);if(I(e.actuel(),`soustitre`)&&ji(e.regarder(1))){let t=e.avancer().ligne;return ni(e,{element:`soustitre`,ligne:t})}if(Kr(e))return ni(e);if(I(e.actuel(),`parametre`)&&Ei(e.regarder(1))){let t=e.avancer();return{type:`Parametre`,nom:e.attendreNom(`le nom du paramètre`).nom,ligne:t.ligne}}if(e.actuel().type===`IDENTIFIANT`&&/^\p{Lu}/u.test(e.actuel().valeur))return Hr(e);let o=e.actuel();throw o.type===`IDENTIFIANT`&&ze(o.valeur)?new j(Ai(o),o.ligne):new j(`instruction inconnue : « ${o.valeur||o.type} »`,o.ligne)}function Hr(e){let t=e.avancer(),n=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.attendreNom(`le nom d'une propriété du composant`);n.push({nom:t.nom,valeur:R(e),ligne:t.ligne})}while(e.accepter(`MOT_CLE`,`et`));return{type:`Composant`,nom:t.valeur,proprietes:n,ligne:t.ligne}}function Ur(e){return I(e.actuel(),`constante`)&&Ei(e.regarder(1))&&e.regarder(2).type===`PONCTUATION`&&e.regarder(2).valeur===`=`}function Wr(e){let t=e.avancer(),{nom:n}=e.attendreNom(`le nom de la variable`);e.attendre(`PONCTUATION`,`=`,`le signe = après le nom de la variable`);let r=R(e);if(!e.accepter(`MOT_CLE`,`avec`))return{type:`Variable`,nom:n,valeur:r,ligne:t.ligne};let i={};do{let t=e.attendreNom(`une option de variable (partagee, memorisee)`),n=A(t.nom);if(n===`partagee`)i.partagee=!0;else if(n===`memorisee`){i.memorisee=!0;let t=e.actuel();if(t.type===`IDENTIFIANT`&&A(t.valeur)===`en`){e.avancer();let t=e.attendreNom(`« secret » après « memorisee en »`);if(A(t.nom)!==`secret`)throw new j(`« secret » est attendu après « memorisee en »`,t.ligne);i.secret=!0}}else throw new j(`« ${t.nom} » n'est pas une option de variable. Options possibles : partagee, memorisee.`,t.ligne)}while(e.accepter(`MOT_CLE`,`et`));return{type:`Variable`,nom:n,valeur:r,options:i,ligne:t.ligne}}const Gr=[`titre`,`texte`,`image`,`bouton`,`lien`,`champ`];function Kr(e){let t=e.actuel();return t.type===`MOT_CLE`&&Gr.includes(t.valeur)}const qr=e=>e.type===`MOT_CLE`||e.type===`IDENTIFIANT`?Mr(e).replace(/[-_]/g,``):``,Jr=[[[`mot`,`passe`],`motDePasse`],[[`motdepasse`],`motDePasse`],[[`texte`,`long`],`texteLong`],[[`textelong`],`texteLong`],[[`adresse`,`web`],`adresseWeb`],[[`adresseweb`],`adresseWeb`],[[`email`],`email`],[[`telephone`],`telephone`],[[`nombre`],`nombre`],[[`date`],`date`],[[`heure`],`heure`],[[`texte`],`texte`]],Yr=[[[`case`,`cocher`],`case`],[[`caseacocher`],`case`],[[`choix`],`choix`],[[`liste`,`deroulante`],`liste`],[[`liste`,`deroulant`],`liste`],[[`listederoulante`],`liste`]];function Xr(e,t){for(let[n,r]of t)if(n.every((t,n)=>qr(e.regarder(n))===t)&&e.regarder(n.length).type===`CHAINE`){for(let t=0;t<n.length;t++)e.avancer();return r}}function Zr(e){let t=e.avancer(),n=e.attendre(`CHAINE`,void 0,`le nom du formulaire entre guillemets`).valeur;return e.attendre(`PONCTUATION`,`:`,`deux-points après le nom du formulaire`),{type:`Formulaire`,nom:n,corps:L(e),ligne:t.ligne}}const Qr=[`section`,`bloc`,`ligne`,`colonne`,`grille`,`onglets`,`onglet`,`deroulant`,`accordeon`,`carrousel`,`menu`];function $r(e){if(Fn(e))return!0;let t=Qr.find(t=>I(e.actuel(),t));if(!t)return!1;let n=e.regarder(1);return n.type===`PONCTUATION`&&n.valeur===`:`||n.type===`MOT_CLE`&&n.valeur===`avec`||t===`menu`&&(I(n,`repliable`)||I(n,`vertical`))||(t===`section`||Pn.includes(t))&&n.type===`CHAINE`}function ei(e){let t=Fn(e),n=e.avancer();t&&e.avancer();let r=t?`filAriane`:Qr.find(e=>I(n,e)),i=!1,a=!1;for(;r===`menu`&&(I(e.actuel(),`repliable`)||I(e.actuel(),`vertical`));)I(e.avancer(),`repliable`)?i=!0:a=!0;let o=[],s;r===`section`&&e.verifier(`CHAINE`)?o.push({type:`Element`,element:`titre`,contenu:Di(e),styles:[],classes:[],ligne:n.ligne}):Pn.includes(r)&&e.verifier(`CHAINE`)&&(s=Di(e));let c=[],l=[],u,d;if(e.accepter(`MOT_CLE`,`avec`))do if(e.verifier(`MOT_CLE`,`style`)){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur;l.push(...t.split(/\s+/).filter(Boolean))}else I(e.actuel(),`ancre`)?(e.avancer(),u=e.attendre(`CHAINE`,void 0,`le nom de l'ancre entre guillemets (avec ancre "desserts")`).valeur):e.verifier(`IDENTIFIANT`,`nom`)&&e.regarder(1).type===`CHAINE`?(e.avancer(),d=e.avancer().valeur):c.push(oi(e));while(e.accepter(`MOT_CLE`,`et`));return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la ligne « ${r} », puis son contenu en dessous, décalé`),{type:`Bloc`,genre:r,styles:c,classes:l,...s?{titre:s}:{},...u===void 0?{}:{ancre:u},...d===void 0?{}:{nom:d},...i?{repliable:i}:{},...a?{vertical:a}:{},corps:[...o,...L(e)],ligne:n.ligne}}function ti(e,t){let n=e.accepter(`PONCTUATION`,`-`),r=Number(e.attendre(`NOMBRE`,void 0,t).valeur);return n?-r:r}function ni(e,t){let n=t?{valeur:t.element,ligne:t.ligne}:e.avancer(),r=t?.sorte??(n.valeur===`champ`?Xr(e,Jr):void 0),i=n.valeur===`chargement`&&!ji(e.actuel())||n.valeur===`selecteurLangue`?{type:`Chaine`,parties:[],ligne:n.ligne}:R(e),a;if(r===`choix`||r===`liste`){if(!I(e.actuel(),`parmi`))throw new j(`il manque « parmi » suivi des valeurs possibles, par exemple : ${r===`choix`?`choix "Taille" parmi ["S", "M", "L"]`:`liste deroulante "Pays" parmi pays`}`,e.actuel().ligne);e.avancer(),a=R(e)}let o;e.accepter(`MOT_CLE`,`vers`)&&(o=e.attendre(`CHAINE`,void 0,`le nom de la page cible`).valeur);let s=[],c=[],l=[],u,d,f=!1,p={},m;if(e.accepter(`MOT_CLE`,`avec`))do{let t=qr(e.actuel());if(o!==void 0&&ii(e))l.push(ai(e));else if(e.verifier(`MOT_CLE`,`style`)){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le nom de la classe CSS entre guillemets`).valeur;c.push(...t.split(/\s+/).filter(Boolean))}else if(t===`ancre`)e.avancer(),d=e.attendre(`CHAINE`,void 0,`le nom de l'ancre entre guillemets (avec ancre "desserts")`).valeur;else if(t===`nouvel`&&qr(e.regarder(1))===`onglet`)e.avancer(),e.avancer(),f=!0;else if(e.verifier(`IDENTIFIANT`,`nom`))e.avancer(),u=e.attendre(`CHAINE`,void 0,`le nom de l'élément entre guillemets`).valeur;else if(t===`obligatoire`||t===`obligatoires`)e.avancer(),p.obligatoire=!0;else if(t===`decoratif`)e.avancer(),s.push({propriete:`decoratif`,valeur:`oui`});else if(t===`niveau`&&n.valeur===`soustitre`)e.avancer(),m=ti(e,`un niveau de titre entre 2 et 6`);else if(t===`indice`||t===`indices`){e.avancer();let t=e.attendre(`CHAINE`,void 0,`le texte de l'indice entre guillemets`);p.indice=t.valeur;let n=Ot(e);n&&(p.indiceTexte={type:`Chaine`,parties:[{type:`texte`,valeur:t.valeur}],versions:n,ligne:t.ligne})}else t===`minimum`||t===`maximum`?(e.avancer(),p[t]=ti(e,`un nombre après « ${t} » (par exemple « ${t} 1 »)`)):t===`raccourci`&&e.regarder(1).type===`CHAINE`?(e.avancer(),p.raccourci=e.avancer().valeur):t===`annonce`||t===`annonces`?(e.avancer(),p.annonce=!0):s.push(oi(e))}while(e.accepter(`MOT_CLE`,`et`));return{type:`Element`,element:n.valeur,contenu:i,styles:s,...m===void 0?{}:{niveau:m},classes:c,nom:u,cible:o,...l.length>0?{arguments:l}:{},...d===void 0?{}:{ancre:d},...f?{nouvelOnglet:f}:{},...r?{sorte:r}:{},...a?{parmi:a}:{},...p,ligne:n.ligne}}const ri=new Set([...Object.keys(ft),`nom`,`style`,`ancre`,`nouvel`,`obligatoire`,`obligatoires`,`indice`,`indices`,`minimum`,`maximum`,`raccourci`,`annonce`]);function ii(e){let t=e.actuel();return Ei(t)&&!ri.has(Mr(t))}function ai(e){let{nom:t}=e.attendreNom(`le nom du paramètre de la page`);return{nom:t,valeur:R(e)}}function oi(e){let t=e.avancer();if(t.type!==`MOT_CLE`&&t.type!==`IDENTIFIANT`)throw new j(`un nom de propriété de style est attendu après « avec »`,t.ligne);let n=Ut(e,t);if(n)return n;let r=e.avancer();if(r.type!==`IDENTIFIANT`&&r.type!==`MOT_CLE`&&r.type!==`CHAINE`&&r.type!==`NOMBRE`)throw new j(`une valeur est attendue pour le style « ${t.valeur} »`,r.ligne);return{propriete:t.valeur,valeur:r.valeur}}function si(e){let t=e.actuel();return t.type===`MOT_CLE`&&[`afficher`,`cacher`,`montrer`,`rediriger`,`changer`,`envoyer`,`ajouter`,`retirer`].includes(t.valeur)}function ci(e){let t=e.avancer();if(t.valeur===`ajouter`||t.valeur===`retirer`){let n=bi(e);e.accepter(`MOT_CLE`,`dans`);let{nom:r}=e.attendreNom(`le nom de la liste`);return{type:`ModificationListe`,operation:t.valeur,valeur:n,liste:r,ligne:t.ligne}}if(t.valeur===`afficher`){let n=e.verifier(`MOT_CLE`,`erreur`)&&ji(e.regarder(1));n&&e.avancer();let r=[`reussite`,`avertissement`].find(t=>I(e.actuel(),t)&&ji(e.regarder(1)));r&&e.avancer();let i=n?`afficherErreur`:`afficher`,a=R(e),o=_r(e,ki,r);return{type:`Action`,action:i,arguments:[a],...o?{message:o}:{},ligne:t.ligne}}if(t.valeur===`cacher`||t.valeur===`montrer`)return{type:`Action`,action:t.valeur,arguments:[R(e)],ligne:t.ligne};if(t.valeur===`rediriger`){e.attendre(`MOT_CLE`,`vers`,`« vers » après « rediriger »`);let n=R(e),r=[];if(e.accepter(`MOT_CLE`,`avec`))do r.push(ai(e));while(e.accepter(`MOT_CLE`,`et`));return{type:`Action`,action:`rediriger`,arguments:[n],...r.length>0?{parametres:r}:{},ligne:t.ligne}}if(t.valeur===`envoyer`)return Hn(e)?Gn(e,t.ligne):li(e,t.ligne);if(!(e.verifier(`MOT_CLE`,`texte`)&&e.regarder(1).type===`CHAINE`)){let{nom:n}=e.attendreNom(`le nom de la variable à changer`),r=[];for(;e.verifier(`PONCTUATION`,`.`)&&Ei(e.regarder(1));){e.avancer();let t=e.avancer();r.push(t.original??t.valeur)}return e.attendre(`MOT_CLE`,`par`,`« par » suivi de la nouvelle valeur`),{type:`Affectation`,nom:n,...r.length>0?{champs:r}:{},valeur:bi(e),ligne:t.ligne}}e.avancer();let n=R(e);return e.attendre(`MOT_CLE`,`par`,`« par » suivi du nouveau texte`),{type:`Action`,action:`changerTexte`,arguments:[n,R(e)],ligne:t.ligne}}function li(e,t){e.attendre(`MOT_CLE`,`requete`,`« requete » après « envoyer »`),e.attendre(`MOT_CLE`,`vers`,`« vers » suivi de l'adresse`);let n=e.attendre(`CHAINE`,void 0,`l'adresse entre guillemets`).valeur,r=bn(e),i=[],a=[];if(e.accepter(`MOT_CLE`,`avec`))do{let t=e.verifierNom()&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`=`;a.push(t?e.attendreNom(`le nom de la donnée envoyée`).nom:void 0),t&&e.avancer(),i.push(t?R(e):bi(e))}while(e.accepter(`MOT_CLE`,`et`));let o;return e.accepter(`MOT_CLE`,`dans`)&&(o=e.attendreNom(`le nom de la variable qui recevra la réponse`).nom),{type:`Requete`,adresse:n,...r,donnees:i,...a.some(e=>e!==void 0)?{cles:a}:{},resultat:o,ligne:t}}function ui(e){let t=e.avancer(),n=I(t,`supprimer`),{nom:r}=e.attendreNom(`le nom de la donnée`),i={type:`Reference`,nom:r,ligne:t.ligne};n||e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la route, après « modifier ${r} »`);let a=e.attendre(`CHAINE`,void 0,`la route entre guillemets`).valeur,o=yn(e);if(n)return{type:`Suppression`,objet:i,adresse:a,...o===void 0?{}:{source:o},ligne:t.ligne};e.attendre(`MOT_CLE`,`avec`,`« avec » suivi des champs à changer (avec prix = 10)`);let s=[];do if(e.verifier(`MOT_CLE`,`champ`)){let t=bi(e);s.push({champ:t.type===`Champ`?t.nom:``,valeur:t})}else{let t=e.attendreNom(`le nom du champ à changer`).nom;e.attendre(`PONCTUATION`,`=`,`« = » suivi de la nouvelle valeur de « ${t} »`),s.push({champ:t,valeur:R(e)})}while(e.accepter(`MOT_CLE`,`et`));return{type:`Modification`,objet:i,adresse:a,...o===void 0?{}:{source:o},changements:s,ligne:t.ligne}}function di(e){let t=e.avancer();e.attendre(`MOT_CLE`,`avec`,`« avec champ "email" et champ "mot de passe" » après « se connecter »`);let n=bi(e);return e.attendre(`MOT_CLE`,`et`,`« et » suivi du champ du mot de passe`),{type:`Connexion`,email:n,motDePasse:bi(e),ligne:t.ligne}}function fi(e){let t=e.avancer(),n=pi(e);e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la condition`);let r=L(e),i=[];return e.sauterFinsDeLigne(),e.accepter(`MOT_CLE`,`sinon`)&&(e.attendre(`PONCTUATION`,`:`,`deux-points après « sinon »`),i=L(e)),{type:`Condition`,test:n,alors:r,sinon:i,ligne:t.ligne}}function pi(e){let t=mi(e);for(;e.verifier(`MOT_CLE`,`ou`);){let n=e.avancer().ligne;t={type:`Combinaison`,operateur:`ou`,gauche:t,droite:mi(e),ligne:n}}return t}function mi(e){let t=hi(e);for(;e.verifier(`MOT_CLE`,`et`);){let n=e.avancer().ligne;t={type:`Combinaison`,operateur:`et`,gauche:t,droite:hi(e),ligne:n}}return t}function hi(e){let t=e.regarder(2);if(I(e.actuel(),`utilisateur`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`est`&&(I(t,`connecte`)||I(t,`admin`)||I(t,`pas`)&&(I(e.regarder(3),`connecte`)||I(e.regarder(3),`admin`)))){let n=I(t,`pas`),r=e.avancer();e.avancer(),n&&e.avancer();let i=e.avancer();return{type:`Comparaison`,gauche:{type:`EtatUtilisateur`,etat:Mr(i),ligne:r.ligne},operateur:n?`faux`:`vrai`,ligne:r.ligne}}let n=+!!I(e.regarder(2),`pas`);if(I(e.actuel(),`mouvement`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`est`&&I(e.regarder(2+n),`reduit`)){let t=e.avancer();for(let t=0;t<2+n;t++)e.avancer();return{type:`Comparaison`,gauche:{type:`MouvementReduit`,ligne:t.ligne},operateur:n?`faux`:`vrai`,ligne:t.ligne}}if(I(e.actuel(),`theme`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`est`&&(I(e.regarder(2+n),`sombre`)||I(e.regarder(2+n),`clair`))){let t=e.avancer();for(let t=0;t<1+n;t++)e.avancer();let r=I(e.avancer(),`sombre`);return{type:`Comparaison`,gauche:{type:`ThemeSombre`,ligne:t.ligne},operateur:r===!!n?`faux`:`vrai`,ligne:t.ligne}}let r=bi(e);if(I(e.actuel(),`contient`))return e.avancer(),{type:`Comparaison`,gauche:r,operateur:`contient`,droite:R(e),ligne:r.ligne};for(let[t,n]of[[`commence`,`commencePar`],[`finit`,`finitPar`]])if(I(e.actuel(),t)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`par`)return e.avancer(),e.avancer(),{type:`Comparaison`,gauche:r,operateur:n,droite:R(e),ligne:r.ligne};return e.attendre(`MOT_CLE`,`est`,`« est » dans la comparaison`),I(e.actuel(),`pas`)?(e.avancer(),_i(vi(e,r))):vi(e,r)}const gi={egal:`different`,different:`egal`,vrai:`faux`,faux:`vrai`,superieur:`inferieurOuEgal`,inferieurOuEgal:`superieur`,inferieur:`superieurOuEgal`,superieurOuEgal:`inferieur`};function _i(e){let t=gi[e.operateur];return t?{...e,operateur:t}:{...e,negation:!0}}function vi(e,t){if(t.type===`Reference`){let n=e.actuel(),r=I(n,`en`)?e.regarder(1):void 0,i=r&&(I(r,`chargement`)||I(r,`erreur`))?Mr(r):I(n,`introuvable`)?`introuvable`:void 0;if(i)return e.avancer(),r&&e.avancer(),{type:`Comparaison`,gauche:{type:`EtatRequete`,variable:t.nom,etat:i,ligne:t.ligne},operateur:`vrai`,ligne:t.ligne}}if(e.accepter(`MOT_CLE`,`vide`))return{type:`Comparaison`,gauche:t,operateur:`vide`,ligne:t.ligne};if(e.accepter(`MOT_CLE`,`vrai`))return{type:`Comparaison`,gauche:t,operateur:`vrai`,ligne:t.ligne};if(e.accepter(`MOT_CLE`,`faux`))return{type:`Comparaison`,gauche:t,operateur:`faux`,ligne:t.ligne};if(e.accepter(`MOT_CLE`,`rien`))return{type:`Comparaison`,gauche:t,operateur:`rien`,ligne:t.ligne};if(P(e.actuel())&&kn(e.actuel().original??e.actuel().valeur)){let n=e.avancer();return{type:`Comparaison`,gauche:t,operateur:`egal`,droite:{type:`Reference`,nom:n.original??n.valeur,ligne:n.ligne},ligne:t.ligne}}if(e.accepter(`MOT_CLE`,`dans`))return{type:`Comparaison`,gauche:t,operateur:`dans`,droite:R(e),ligne:t.ligne};let n;if(I(e.actuel(),`plus`)){e.avancer();let t=e.actuel();if(![`grand`,`grande`,`grands`,`grandes`,`petit`,`petite`,`petits`,`petites`].some(e=>I(t,e)))throw new j(`après « est plus », écrivez « grand que » ou « petit que »`,t.ligne);e.avancer();let r=A(t.original??t.valeur).startsWith(`grand`);if(I(e.actuel(),`ou`)){e.avancer();let t=e.actuel();if(![`egal`,`egale`,`egaux`,`egales`].some(e=>I(t,e)))throw new j(`après « plus grand ou », écrivez « égal à »`,t.ligne);e.avancer(),n=r?`superieurOuEgal`:`inferieurOuEgal`}else{if(!I(e.actuel(),`que`))throw new j(`après « plus ${r?`grand`:`petit`} », écrivez « plus ${r?`grand`:`petit`} que »`,e.actuel().ligne);e.avancer(),n=r?`superieur`:`inferieur`}}else if([`different`,`differente`,`differents`,`differentes`].some(t=>I(e.actuel(),t)))e.avancer(),n=`different`;else if(e.accepter(`MOT_CLE`,`egal`))n=`egal`;else if(e.accepter(`MOT_CLE`,`inferieur`))n=e.accepter(`MOT_CLE`,`ou`)&&e.accepter(`MOT_CLE`,`egal`)?`inferieurOuEgal`:`inferieur`;else if(e.accepter(`MOT_CLE`,`superieur`))n=e.accepter(`MOT_CLE`,`ou`)&&e.accepter(`MOT_CLE`,`egal`)?`superieurOuEgal`:`superieur`;else{let t=e.actuel();throw new j(`comparaison inconnue après « est » : « ${t.valeur||t.type} ». Essayez « égal à », « différent de », « supérieur à », « inférieur à », « plus grand que » ou « plus petit que »`,t.ligne)}let r=R(e);return{type:`Comparaison`,gauche:t,operateur:n,droite:r,ligne:t.ligne}}function yi(e){for(let t=1;t<=7;t++)if(e.regarder(t).valeur===`:`)return e.regarder(t+2).type===`CODE_BRUT`||e.regarder(t+1).type===`CODE_BRUT`;return!1}function bi(e){if(e.verifier(`MOT_CLE`,`champ`)&&e.regarder(1).type===`CHAINE`){let t=e.avancer();return{type:`Champ`,nom:e.attendre(`CHAINE`,void 0,`le nom du champ entre guillemets`).valeur,ligne:t.ligne}}return R(e)}function xi(e){let t=e.avancer(),n,r;if(Er(e)){let n=Dr(e);return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de l'événement`),{type:`Evenement`,...n,corps:L(e),ligne:t.ligne}}if(e.accepter(`MOT_CLE`,`utilisateur`)){let i=Tr(e,ki);if(i)return e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de l'événement`),{type:`Evenement`,...i,corps:L(e),ligne:t.ligne};if(e.accepter(`MOT_CLE`,`clique`))n=`clic`,e.attendre(`MOT_CLE`,`sur`,`« sur » suivi de la cible`);else if(e.accepter(`MOT_CLE`,`survole`))n=`survol`;else{let t=e.actuel();throw new j(`action utilisateur inconnue : « ${t.valeur||t.type} »`,t.ligne)}r=e.attendre(`CHAINE`,void 0,`la cible entre guillemets`).valeur}else if(e.accepter(`MOT_CLE`,`page`))e.attendre(`MOT_CLE`,`charge`,`« se charge » après « la page »`),n=`chargement`;else if(e.accepter(`MOT_CLE`,`formulaire`))r=e.attendre(`CHAINE`,void 0,`le nom du formulaire`).valeur,e.attendre(`MOT_CLE`,`est`,`« est soumis » après le nom du formulaire`),e.attendre(`MOT_CLE`,`soumis`,`« soumis »`),n=`soumission`;else{let t=e.actuel();throw new j(`événement inconnu après « quand » : « ${t.valeur||t.type} »`,t.ligne)}e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de l'événement`);let i=L(e);return{type:`Evenement`,genre:n,cible:r,corps:i,ligne:t.ligne}}function Si(e){let t=e.avancer();e.attendre(`MOT_CLE`,`chaque`,`« chaque » après « pour »`);let{nom:n}=e.attendreNom(`le nom de la variable de boucle`);e.attendre(`MOT_CLE`,`dans`,`« dans » suivi de la liste à parcourir`);let r=R(e),i=e.verifier(`MOT_CLE`,`avec`)&&I(e.regarder(1),`deplacement`);i&&(e.avancer(),e.avancer()),e.attendre(`PONCTUATION`,`:`,`deux-points à la fin de la boucle`);let a=L(e);return{type:`Boucle`,variable:n,liste:r,...i?{deplacement:i}:{},corps:a,ligne:t.ligne}}function R(e){let t=Ci(e);for(;e.verifier(`PONCTUATION`,`+`)||e.verifier(`PONCTUATION`,`-`);){let n=e.avancer().valeur,r=Ci(e);t={type:`Calcul`,operateur:n,gauche:t,droite:r,ligne:t.ligne}}return t}function Ci(e){let t=wi(e);for(;e.verifier(`PONCTUATION`,`*`)||e.verifier(`PONCTUATION`,`/`);){let n=e.avancer().valeur,r=wi(e);t={type:`Calcul`,operateur:n,gauche:t,droite:r,ligne:t.ligne}}return t}function wi(e){let t=Ti(e),n=I(e.actuel(),`plus`)?1:I(e.actuel(),`moins`)?-1:0,r=e.regarder(2),i=P(r)?{jour:`jours`,jours:`jours`,semaine:`semaines`,semaines:`semaines`,mois:`mois`}[A(r.original??r.valeur)]:void 0;if(!n||!ji(e.regarder(1))||!i)return t;e.avancer();let a=Ti(e);return e.avancer(),{type:`DateDecalee`,date:t,nombre:a,unite:i,signe:n,ligne:t.ligne}}function Ti(e){let t=e.actuel();if(I(t,`aujourdhui`)||I(t,`aujourd`)&&e.regarder(1).valeur===`'`&&I(e.regarder(2),`hui`))return e.avancer(),I(t,`aujourd`)&&(e.avancer(),e.avancer()),{type:`DateDuJour`,maintenant:!1,ligne:t.ligne};if(I(t,`maintenant`)&&!Ei(e.regarder(1))&&e.regarder(1).valeur!==`=`)return e.avancer(),{type:`DateDuJour`,maintenant:!0,ligne:t.ligne};if(I(t,`jours`)&&I(e.regarder(1),`entre`)){e.avancer(),e.avancer();let n=Ti(e);return e.attendre(`MOT_CLE`,`et`,`« et » entre les deux dates (jours entre debut et fin)`),{type:`JoursEntre`,debut:n,fin:Ti(e),ligne:t.ligne}}if(e.accepter(`PONCTUATION`,`(`)){let t=R(e);return e.attendre(`PONCTUATION`,`)`,`une parenthèse fermante )`),t}if(e.accepter(`PONCTUATION`,`-`)){let n=e.actuel();return n.type===`NOMBRE`?(e.avancer(),{type:`Nombre`,valeur:-Number(n.valeur),ligne:n.ligne}):{type:`Calcul`,operateur:`-`,gauche:{type:`Nombre`,valeur:0,ligne:t.ligne},droite:wi(e),ligne:t.ligne}}for(let n of[`moyenne`,`somme`,`minimum`,`maximum`])if(I(t,n)&&ji(e.regarder(1)))return e.avancer(),{type:`Agregat`,operation:n,liste:wi(e),ligne:t.ligne};if(I(t,`arrondi`)&&ji(e.regarder(1))){e.avancer();let n=wi(e);if(e.verifier(`NOMBRE`)&&I(e.regarder(1),`chiffres`)){let r=Number(e.avancer().valeur);return e.avancer(),{type:`Arrondi`,valeur:n,chiffres:r,ligne:t.ligne}}return{type:`Arrondi`,valeur:n,ligne:t.ligne}}if(I(t,`hasard`)&&I(e.regarder(1),`entre`)){e.avancer(),e.avancer();let n=wi(e);return e.attendre(`MOT_CLE`,`et`,`« et » entre les deux bornes (hasard entre 1 et 6)`),{type:`Hasard`,minimum:n,maximum:wi(e),ligne:t.ligne}}if(e.verifier(`MOT_CLE`,`nombre`)&&Ei(e.regarder(1)))return e.avancer(),{type:`Compte`,liste:wi(e),ligne:t.ligne};for(let n of[`majuscules`,`minuscules`,`longueur`])if(I(t,n)&&ji(e.regarder(1)))return e.avancer(),{type:`OperationTexte`,operation:n,valeur:wi(e),ligne:t.ligne};if(I(t,`remplacer`)&&ji(e.regarder(1))){e.avancer();let n=wi(e);e.attendre(`MOT_CLE`,`par`,`« par » suivi du nouveau texte (remplacer "a" par "b" dans nom)`);let r=wi(e);return e.attendre(`MOT_CLE`,`dans`,`« dans » suivi du texte où remplacer`),{type:`Remplacement`,cherche:n,remplace:r,dans:wi(e),ligne:t.ligne}}if(I(t,`trier`)&&ji(e.regarder(1))){e.avancer();let n=Di(e),r=e.accepter(`MOT_CLE`,`par`)?e.attendreNom(`le champ selon lequel trier`).nom:void 0,i=I(e.actuel(),`decroissant`);return i&&e.avancer(),{type:`Tri`,liste:n,...r===void 0?{}:{champ:r},decroissant:i,ligne:t.ligne}}if(I(t,`grouper`)&&ji(e.regarder(1))){e.avancer();let n=Di(e);return e.attendre(`MOT_CLE`,`par`,`« par » suivi du champ selon lequel grouper (grouper produits par categorie)`),{type:`Groupement`,liste:n,champ:e.attendreNom(`le champ selon lequel grouper`).nom,ligne:t.ligne}}if(I(t,`premier`)&&ji(e.regarder(1)))return e.avancer(),{type:`Premier`,liste:wi(e),ligne:t.ligne};if(t.type===`NOMBRE`&&I(e.regarder(1),`premiers`))return e.avancer(),e.avancer(),{type:`Premiers`,nombre:{type:`Nombre`,valeur:Number(t.valeur),ligne:t.ligne},liste:wi(e),ligne:t.ligne};let n=Di(e);for(;I(e.actuel(),`dont`);)e.avancer(),n={type:`Filtre`,liste:n,test:hi(e),ligne:t.ligne};return n}function Ei(e){return e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&!e.reserve}function Di(e){let t=e.actuel();if(t.type===`CHAINE`){e.avancer();let n=Ot(e);if(I(e.actuel(),`sans`)&&I(e.regarder(1),`traduction`)){let r=e.avancer();if(e.avancer(),n)throw new j(`ce texte a une version traduite et « sans traduction » : gardez l’un ou l’autre.`,r.ligne);return{type:`Chaine`,parties:t.parties??[],sansTraduction:!0,ligne:t.ligne}}return{type:`Chaine`,parties:t.parties??[],...n?{versions:n}:{},ligne:t.ligne}}if(t.type===`NOMBRE`)return e.avancer(),{type:`Nombre`,valeur:Number(t.valeur),ligne:t.ligne};if(e.verifier(`MOT_CLE`,`vrai`)||e.verifier(`MOT_CLE`,`faux`))return e.avancer(),{type:`Booleen`,valeur:t.valeur===`vrai`,ligne:t.ligne};if(e.verifier(`MOT_CLE`,`rien`))return e.avancer(),{type:`Rien`,ligne:t.ligne};if(e.verifier(`PONCTUATION`,`[`))return Mi(e);if(I(t,`erreur`)&&e.regarder(1).type===`IDENTIFIANT`){e.avancer();let n=e.avancer();return{type:`ErreurRequete`,variable:n.original??n.valeur,ligne:t.ligne}}if(I(t,`fiche`)&&e.regarder(1).type===`MOT_CLE`&&e.regarder(1).valeur===`avec`)return Oi(e);if(e.verifierNom()&&e.regarder(1).type===`PONCTUATION`&&e.regarder(1).valeur===`(`){e.avancer(),e.avancer();let n=[];if(!e.accepter(`PONCTUATION`,`)`)){do n.push(R(e));while(e.accepter(`PONCTUATION`,`,`));e.attendre(`PONCTUATION`,`)`,`une parenthèse fermante ) après les valeurs données à la fonction`)}return{type:`Appel`,nom:t.original??t.valeur,arguments:n,ligne:t.ligne}}if(e.verifierNom()){e.avancer();let n={type:`Reference`,nom:t.original??t.valeur,ligne:t.ligne};for(;e.verifier(`PONCTUATION`,`.`)&&Ei(e.regarder(1));){e.avancer();let r=e.avancer();n={type:`AccesChamp`,objet:n,champ:r.original??r.valeur,ligne:t.ligne}}return n}let n=e.messageLiaison(`la variable`);throw n?new j(`une valeur est attendue. ${n}`,t.ligne):t.type===`MOT_CLE`&&t.reserve&&ze(t.valeur)?new j(Ai(t),t.ligne):t.type===`MOT_CLE`&&t.reserve?new j(`une valeur est attendue, mais « ${t.original??t.valeur} » est un mot réservé du langage : il ne peut pas servir de nom de variable.`,t.ligne):new j(`une valeur est attendue, mais ${t.type===`FIN_LIGNE`||t.type===`FIN_FICHIER`?`la ligne s'arrête là`:`« ${t.valeur||t.type} » a été trouvé`}`,t.ligne)}function Oi(e){let t=e.avancer();e.avancer();let n=[];do{let{nom:t,ligne:r}=e.attendreNom(`le nom du champ de la fiche (fiche avec nom "Livre" et prix 12)`);n.push({nom:t,valeur:R(e),ligne:r})}while(e.accepter(`MOT_CLE`,`et`));return{type:`Fiche`,champs:n,ligne:t.ligne}}const ki={bloc:L,expression:R,comparaison:hi,argumentPage:ai};function Ai(e){return`« ${e.original??e.valeur} » n’est pas encore disponible : ce mot est prévu dans le vocabulaire, mais le compilateur ne le comprend pas encore.`}function ji(e){return e.type===`CHAINE`||e.type===`NOMBRE`||e.type===`IDENTIFIANT`||e.type===`MOT_CLE`&&(!e.reserve||[`vrai`,`faux`].includes(e.valeur))||e.type===`PONCTUATION`&&e.valeur===`[`}function Mi(e){let t=e.avancer(),n=[];if(!e.verifier(`PONCTUATION`,`]`))for(n.push(R(e));e.accepter(`PONCTUATION`,`,`);)n.push(R(e));return e.attendre(`PONCTUATION`,`]`,`un crochet fermant ] pour la liste`),{type:`Liste`,elements:n,ligne:t.ligne}}function Ni(e){let t=[],n=[],r=``,i=!1,a=!1,o=1,s=1,c=e.replace(/^\uFEFF/,``),l=``,u=!1;for(let e=0;e<c.length;e++){let t=c[e];if(t===`"`){if(u&&c[e+1]===`"`){e++;continue}u=!u;continue}if(!u&&(t===`
|
|
610
620
|
`||t===`\r`))break;u||(l+=t)}let d=e=>[...l].filter(t=>t===e).length,f=[`;`,` `,`,`].sort((e,t)=>d(t)-d(e))[0],p=()=>{n.push(r),r=``,a=!1},m=()=>{p(),t.push({cases:n,numero:s}),n=[],s=o+1};for(let e=0;e<c.length;e++){let t=c[e];if(i){t===`"`&&c[e+1]===`"`?(r+=`"`,e++):t===`"`?(i=!1,a=!0):(r+=t,t===`
|
|
611
621
|
`&&o++);continue}if(t===`"`&&r===``&&!a){i=!0;continue}if(t===f){p();continue}if(t===`
|
|
612
622
|
`||t===`\r`){m(),t===`\r`&&c[e+1]===`
|
|
613
|
-
`&&e++,o++;continue}if(a||t===`"`)throw Error(`ligne ${o} : guillemets mal formés dans le CSV.`);r+=t}if(i)throw Error(`ligne ${o} : guillemet non fermé dans le CSV.`);if((n.length||r!==``||a)&&m(),!t.length)throw Error(`ligne 1 : le CSV doit commencer par des noms de colonnes.`);let h=t.shift().cases.map(e=>e.trim().normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_|_$/g,``));if(h.some(e=>!e))throw Error(`ligne 1 : une colonne du CSV n’a pas de nom.`);if(new Set(h).size!==h.length)throw Error(`ligne 1 : deux colonnes du CSV portent le même nom.`);for(let e of t)if(e.cases.length!==h.length)throw Error(`ligne ${e.numero} : ${h.length} colonnes attendues, ${e.cases.length} trouvées.`);let g=e=>/^[-+]?(?:\d{1,3}(?:[ \u00a0]\d{3})+|\d+)(?:[,.]\d+)?$/.test(e.trim()),_=e=>/^(oui|non|vrai|faux|true|false)$/i.test(e.trim()),v=h.map((e,n)=>{let r=t.map(e=>e.cases[n].trim()).filter(Boolean);return r.length&&r.every(g)?`nombre`:r.length&&r.every(_)?`booleen`:`texte`});return t.map(e=>Object.fromEntries(h.map((t,n)=>{let r=e.cases[n].trim();if(v[n]===`nombre`&&!r)throw Error(`ligne ${e.numero} : la colonne « ${t} » attend un nombre, mais la case est vide.`);return[t,v[n]===`nombre`?Number(r.replace(/[ \u00a0]/g,``).replace(`,`,`.`)):v[n]===`booleen`?/^(oui|vrai|true)$/i.test(r):r]})))}function Pi(e){let t;try{t=JSON.parse(e)}catch{throw Error(`ligne 1 : le fichier JSON est mal formé.`)}let n=e=>typeof e==`object`&&!!e&&!Array.isArray(e);if(!n(t)&&!(Array.isArray(t)&&t.every(n)))throw Error(`ligne 1 : le JSON doit contenir une fiche ou une liste de fiches.`);let r=(e,t,i)=>{if(Array.isArray(t)){if(!Array.isArray(e))throw Error(`${i} : une liste était attendue.`);t.length&&e.forEach((e,n)=>r(e,t[0],`${i}, élément ${n+1}`))}else if(n(t)){if(!n(e))throw Error(`${i} : une fiche était attendue.`);for(let n of Object.keys(t)){if(!(n in e))throw Error(`${i} n'a pas le champ « ${n} ».`);r(e[n],t[n],i)}for(let n of Object.keys(e))if(!(n in t))throw Error(`${i} a un champ supplémentaire « ${n} ».`)}else if(typeof e!=typeof t)throw Error(`${i} : le type change d'un élément à l'autre.`)};return Array.isArray(t)&&t.length&&t.forEach((e,n)=>r(e,t[0],`l'élément ${n+1}`)),t}function Fi(e){if(!(e?.type!==`Chaine`||!e.parties.every(e=>e.type===`texte`)))return e.parties.map(e=>e.valeur).join(``)}function Ii(e,t){if(e.type!==`Comparaison`||e.gauche.type!==`Reference`||e.gauche.nom!==`langue`||e.droite?.type!==`Reference`||e.operateur!==`egal`&&e.operateur!==`different`)return;let n=kn(e.droite.nom);if(n)return n.code===t!=(e.operateur===`different`)!=!!e.negation}function Li(e,t,n){for(let r of t){if(r.type===`Element`&&r.element===e)return r.contenu;let t=r.type===`Condition`&&n!==void 0?Ii(r.test,n):void 0,i=r.type===`Bloc`?r.corps:r.type===`Condition`&&t!==void 0?t?r.alors:r.sinon:void 0;if(i){let t=Li(e,i,n);if(t)return t}}}function Ri(e,t){return{titre:e.apercu?.titre??Li(`titre`,e.corps,t),description:e.apercu?.description??Li(`texte`,e.corps,t)}}function zi(e,t){let n=e.site;if(!n)return;let r=(e,n)=>t.push({gravite:`avertissement`,message:e,ligne:n});n.adresse!==void 0&&!/^https:\/\/[^/]/.test(n.adresse)&&!/^http:\/\/localhost(:\d+)?(\/|$)/.test(n.adresse)&&t.push({gravite:`erreur`,message:`l'adresse du site « ${n.adresse} » doit commencer par https:// (ou http://localhost pour un essai).`,ligne:n.lignes.adresse??n.ligne}),n.logo===void 0&&r(`le site n'a pas d'icône : ajoutez « logo "./logo.svg" » au bloc « site » (un SVG, ou un PNG carré de 512×512 au moins).`,n.ligne),n.image!==void 0&&/^https?:\/\//.test(n.image)&&r(`l'image de partage « ${n.image} » est sur un autre site : si elle disparaît, l'aperçu des liens du site la perd. Préférez un fichier du projet.`,n.lignes.image??n.ligne);let i=new Map,a=e.langues?.langues[0],o=a?kn(a.mot)?.code:void 0;for(let t of e.pages){if(t.nom===`introuvable`)continue;let{titre:e,description:n}=Ri(t,o),a=t.apercu?.ligne??t.ligne,s=Fi(e),c=Fi(n);if(s!==void 0&&s.length>60&&r(`le titre de la page « ${t.nom} » fait plus de 60 caractères (${s.length}) : il sera coupé dans les résultats de recherche.`,a),c!==void 0&&c.length<50?r(`la description de la page « ${t.nom} » fait moins de 50 caractères (${c.length}) : dites en une phrase ce qu'on y trouve.`,a):c!==void 0&&c.length>160&&r(`la description de la page « ${t.nom} » fait plus de 160 caractères (${c.length}) : elle sera coupée dans les résultats de recherche.`,a),n===void 0&&r(`la page « ${t.nom} » n'a pas de description : ajoutez un « texte », ou « description "…" » dans un bloc « apercu : ».`,t.ligne),[t.apercu?.titre,t.apercu?.description,t.apercu?.image].some(e=>e!==void 0&&Fi(e)===void 0)&&r(`l'aperçu de partage de « ${t.nom} » dépend de données : l'onglet le montre, mais les réseaux sociaux, qui ne lisent pas le JavaScript, montreront celui du site.`,a),s!==void 0){let e=i.get(s);e?r(`les pages « ${e} » et « ${t.nom} » ont le même titre « ${s} » : les moteurs de recherche ne sauront pas laquelle montrer.`,t.ligne):i.set(s,t.nom)}}}function Bi(e){let t=new Set;return(e.langues?.langues??[]).flatMap(e=>{let n=kn(e.mot);return!n||!n.disponible||t.has(n.code)?[]:(t.add(n.code),[n])})}const Vi=e=>e.map(e=>e.nom).join(`, `),Hi=e=>/^[aeiouy]/.test(e.nom)?`l'${e.nom}`:`le ${e.nom}`,Ui=e=>e.some(e=>e.type===`texte`&&/\p{L}/u.test(e.valeur)),Wi=e=>new Set(e.filter(e=>e.type===`variable`).map(e=>e.valeur.trim().split(/\s+/)[0])),Gi=new WeakSet,Ki=e=>(Gi.add(e),e),qi=(e,t)=>Ki({type:`Chaine`,parties:[{type:`texte`,valeur:e}],ligne:t});function Ji(e,t){if(e.type===`Element`){for(let n of e.styles)(n.propriete===`description`||n.propriete===`transcription`)&&n.parties&&t.push(n.texte??{type:`Chaine`,parties:n.parties,ligne:e.ligne});e.indice!==void 0&&t.push(e.indiceTexte?Ki(e.indiceTexte):qi(e.indice,e.ligne))}if(e.type===`Graphique`){e.description?.type===`Chaine`&&t.push(e.description),e.etiquettes&&Zi(e.etiquettes,t);for(let n of e.series)t.push(n.texteNom?Ki(n.texteNom):qi(n.nom,n.ligne))}}const Yi=e=>{if(e.type!==`Condition`)return!1;let t=e.test;return t.type===`Comparaison`&&t.gauche.type===`Reference`&&t.gauche.nom===`langue`&&t.droite?.type===`Reference`&&kn(t.droite.nom)!==void 0};function Xi(e,t,n){let r=e=>{e?.type===`Chaine`&&t.push(e)};for(let i of e){switch(Ji(i,t),i.type){case`Element`:[`image`,`audio`,`icone`,`avatar`,`qr`,`selecteurLangue`,`chargement`,`progression`,`etoiles`,`compteur`].includes(i.element)||r(i.contenu);break;case`Action`:(i.action===`afficher`||i.action===`afficherErreur`)&&r(i.arguments[0]),i.action===`changerTexte`&&r(i.arguments[1]);break;case`Apercu`:r(i.titre),r(i.description)}i.type===`Bloc`&&r(i.titre);for(let e of[`corps`,`alors`,`sinon`]){let r=i[e];if(Array.isArray(r)){if(e!==`corps`&&n&&Yi(i)){let e=[];Xi(r,e,n);for(let t of e)n.add(t);t.push(...e)}else Xi(r,t,n)}}if(i.type===`Selon`)for(let e of i.cas)Xi(e.corps,t,n)}}function Zi(e,t){if(Array.isArray(e)){for(let n of e)Zi(n,t);return}if(!(!e||typeof e!=`object`)){e.type===`Chaine`&&t.push(e);for(let n of Object.values(e))n&&typeof n==`object`&&Zi(n,t)}}function Qi(e,t,n){if(Array.isArray(e)){for(let r of e)Qi(r,t,n);return}if(!e||typeof e!=`object`)return;let r=e;r.type===`Element`&&n&&r.element===n&&r.contenu?t.push(r.contenu):r.type===`Element`&&!n&&r.parmi&&t.push(r.parmi);for(let r of Object.values(e))r&&typeof r==`object`&&Qi(r,t,n)}function $i(e,t){let n=(e,n,r)=>t.push({gravite:e,categorie:`traduction`,message:n,ligne:r}),r=(e,t)=>n(`erreur`,e,t),i=(e,t)=>n(`avertissement`,e,t),a=[];Zi([e.pages,e.partages,e.composants,e.fonctions,e.entete,e.pied,e.site?.textes],a);let o=new Map;if(!e.langues){let t=new Set;for(let e of a){let n=e.versions?.[0];!n||t.has(n.ligne)||(t.add(n.ligne),r(`ce texte a une version ${kn(n.langue)?.adjectif??`« ${n.langue} »`}, mais le fichier ne déclare pas ses langues. Ajoutez en haut du fichier : « langues : », puis « francais » et « anglais » sur deux lignes décalées.`,n.ligne))}let n=[];Qi(e.pages,n,`selecteurLangue`);for(let e of n)r(`« selecteur de langue » demande un bloc « langues : » en haut du fichier, avec « francais » et « anglais » sur deux lignes décalées.`,e.ligne);for(let t of e.traductions??[])r(`le bloc « traductions » demande d'abord un bloc « langues : » en haut du fichier (« francais », puis « anglais »).`,t.ligne);return{langues:[],traductions:o}}let s=new Map;for(let{mot:t,ligne:n}of e.langues.langues){let e=kn(t);if(e)e.disponible?s.has(e.code)?r(`${Hi(e)} est déjà dans le bloc « langues » (ligne ${s.get(e.code)}).`,n):s.set(e.code,n):r(`${Hi(e)} n'est pas encore disponible : pour l'instant, Humalis traduit en ${Vi(An)}.`,n);else{let e=lt(t,An.map(e=>e.mot));r(`« ${t} » n'est pas une langue connue de Humalis. Langues possibles : ${Vi(An)}.${e?` Peut-être « ${e} » ?`:``}`,n)}}let c=Bi(e);if(c.length===0)return r(`le bloc « langues » est vide : écrivez une langue par ligne, la première étant celle des textes (${Vi(An)}).`,e.langues.ligne),{langues:[],traductions:o};let l=c[0],u=c.slice(1),d=(e,t,n)=>{let i=kn(e);if(!i){let n=lt(e,c.map(e=>e.mot));r(`« ${e} » n'est pas une langue connue de Humalis. Langues déclarées : ${Vi(c)}.${n?` Peut-être « ${n} » ?`:``}`,t);return}if(!c.includes(i)){r(`${Hi(i)} n'est pas dans le bloc « langues ». Langues déclarées : ${Vi(c)}.`,t);return}if(i===l){r(`${n} est déjà en ${l.nom}, la première langue du bloc « langues » : la version à ajouter est celle d'une autre langue (${Vi(u)||`aucune autre déclarée`}).`,t);return}return i},f=new Map;for(let t of e.traductions??[]){let e=d(t.langue,t.ligne,`le texte des pages`);if(e)for(let n of t.entrees){let t=At(n.texte),i=`${e.code}\u0000${t}`,a=f.get(i);if(a){r(`« ${t} » a déjà une version ${e.adjectif} dans ce bloc (ligne ${a.ligne}).`,n.ligne);continue}f.set(i,{ligne:n.ligne,utilisee:!1,langue:e}),p(n.texte,n.version,e,n.ligne),o.has(t)||o.set(t,new Map),o.get(t).set(e.code,n.version)}}function p(e,t,n,r){let a=Wi(t);for(let t of Wi(e))a.has(t)||i(`la version ${n.adjectif} n'utilise pas {${t}} : la personne qui lit en ${n.nom} ne verra pas cette valeur.`,r)}let m=[],h=new Set,g=e.pages;for(let e of g)Xi(e.corps,m,h),e.apercu&&Xi([e.apercu],m,h);for(let t of[e.entete,e.pied])t&&Xi(t.corps,m,h);for(let t of e.composants)Xi(t.corps,m,h);for(let t of[`nom`,`description`]){let n=e.site?.[t];n!==void 0&&m.push(e.site?.textes?.[t]?Ki(e.site.textes[t]):qi(n,e.site?.lignes[t]??e.site.ligne))}let _=new Set(a);for(let e of m)_.has(e)||a.push(e);for(let e of a){let t=new Set;if(Gi.has(e))for(let t of e.versions??[])t.parties.some(e=>e.type===`variable`)&&r(`ce texte (un indice, le nom d'une série, le nom ou la description du site) n'accepte pas de « {variable} » : retirez les accolades de la version.`,t.ligne);for(let n of e.versions??[]){let i=d(n.langue,n.ligne,`le texte écrit`);if(i){if(t.has(i)){r(`deux versions ${i.adjectif}s pour le même texte : gardez-en une seule.`,n.ligne);continue}t.add(i),p(e.parties,n.parties,i,n.ligne)}}for(let t of u){let n=f.get(`${t.code}\u0000${At(e.parties)}`);n&&(n.utilisee=!0)}}let v=[];Qi(e.pages,v);for(let e of v){let t=[];Zi(e,t);for(let e of t)e.versions&&r(`la valeur d'un choix est envoyée au serveur telle qu'elle est écrite : elle ne se traduit pas. Retirez « en … "…" » de cette valeur.`,e.versions[0].ligne)}for(let e of m){if(!Ui(e.parties)||h.has(e)||e.sansTraduction)continue;let t=At(e.parties);for(let n of u)e.versions?.some(e=>kn(e.langue)===n)||o.get(t)?.has(n.code)||i(`« ${t} » n'a pas de version ${n.adjectif} : écrivez « en ${n.mot} "…" » après le texte, ou ajoutez-le au bloc « traductions ${n.mot} ».`,e.ligne)}let y=a.map(e=>At(e.parties));for(let[e,t]of f){if(t.utilisee)continue;let n=e.split(`\0`)[1],r=lt(n,y);i(`cette traduction ne sert à rien : aucun texte du programme ne s'écrit « ${n} ».${r?` Peut-être « ${r} » ?`:` Une faute de frappe ?`}`,t.ligne)}return{langues:c,traductions:o}}const z={genre:`texte`},ea={genre:`nombre`},ta={genre:`booleen`},B={genre:`inconnu`},na=e=>({genre:`liste`,de:e});function V(e){switch(e.genre){case`texte`:return`un texte`;case`nombre`:return`un nombre`;case`booleen`:return`un booléen (vrai ou faux)`;case`liste`:return`une liste`;case`donnee`:return`une donnée « ${e.nom} »`;case`fiche`:return`une fiche`;case`inconnu`:return`une valeur de type inconnu`}}function ra(e){if(e.genre!==`liste`)return V(e);let t={texte:`textes`,nombre:`nombres`,booleen:`booléens`,liste:`listes`,donnee:`données`,fiche:`fiches`}[e.de.genre];return t?`une liste de ${t}`:`une liste`}const H=e=>e.genre!==`inconnu`;function ia(e,t){return!H(e)||!H(t)?!0:e.genre===`liste`&&t.genre===`liste`?ia(e.de,t.de):e.genre===`donnee`&&t.genre===`donnee`?e.nom===t.nom:e.genre===`fiche`&&t.genre===`fiche`?e.champs.length===t.champs.length&&e.champs.every(e=>{let n=t.champs.find(t=>t.nom===e.nom);return n!==void 0&&ia(e.type,n.type)}):e.genre===t.genre}function aa(e){return e.valeur.type===`Nombre`?Math.round(e.valeur.valeur*pr[e.unite]):void 0}function oa(e){return e<1e3?`${e} millisecondes`:`${String(e/1e3).replace(`.`,`,`)} seconde${e>=2e3?`s`:``}`}function sa(e,t,n){let r=e.typeDe(t.valeur);if(H(r)&&r.genre!==`nombre`){e.erreur(`une durée est un nombre suivi de son unité (${n}) ; ici, c’est ${V(r)}.`,t.ligne);return}let i=aa(t);if(i!==void 0&&i<=0){e.erreur(`une durée doit être plus grande que zéro (${n}).`,t.ligne);return}return i}function ca(e,t,n,r){let i=t.message;if(i){if(n){e.erreur(`un message de réussite ou d’avertissement, avec une durée ou un bouton, s’affiche dans un événement (quand …) : dans la page, « afficher "…" » écrit simplement un texte.`,t.ligne);return}if(i.duree){let n=sa(e,i.duree,`pendant 10 secondes`);n!==void 0&&(n<1e3||n>6e4)?e.erreur(`un message reste affiché de 1 à 60 secondes (ici : ${oa(n)}). Pour qu’il reste, écrivez « sans disparaitre ».`,i.duree.ligne):n!==void 0&&t.action===`afficherErreur`&&n<4e3&&e.avertissement(`${oa(n)}, c’est trop court pour lire une erreur : laissez au moins 4 secondes (8 par défaut).`,i.duree.ligne),i.persistant&&e.erreur(`« pendant … » et « sans disparaitre » se contredisent : gardez l’un des deux.`,t.ligne)}i.action&&(i.action.corps.length===0&&e.erreur(`le bouton « ${i.action.libelle} » du message ne fait rien : écrivez en dessous, décalé, ce qu’il fait.`,i.action.ligne),i.action.libelle.trim()===``&&e.erreur(`le bouton d’un message a besoin d’un texte : avec action "Annuler" :`,i.action.ligne),r&&e.avertissement(`un message avec un bouton, dans une minuterie : il peut disparaître avant que la personne le voie. Écrivez-le plutôt dans l’événement d’un clic.`,t.ligne))}}function la(e,t,n){n.page&&!n.auPremierNiveau&&e.erreur(`une minuterie de la page s’écrit au premier niveau de la page (elle démarre à son ouverture), ou dans un événement.`,t.ligne);let r=t.mode===`apres`?`apres 3 secondes`:`toutes les 5 secondes`,i=sa(e,t.duree,r);t.mode===`toutes`&&i!==void 0&&i<250?e.erreur(`« toutes les ${oa(i)} » réveillerait l’appareil plus de quatre fois par seconde : au moins 250 millisecondes. Pour une animation, utilisez le CSS.`,t.duree.ligne):t.mode===`toutes`&&i!==void 0&&i<1e3&&e.avertissement(`« toutes les ${oa(i)} » : moins d’une seconde, c’est beaucoup de travail pour l’appareil. Une seconde suffit souvent.`,t.duree.ligne),t.mode===`apres`&&t.tantQue&&e.erreur(`« tant que » suit « toutes les … » : une minuterie « apres … » ne passe qu’une fois. Écrivez un « si » dans son bloc.`,t.ligne),t.corps.length===0&&e.erreur(`cette minuterie ne fait rien : écrivez en dessous, décalé, ce qu’elle fait.`,t.ligne),n.survol&&e.avertissement(`une minuterie dans « survole » repart à chaque passage du pointeur : préférez un clic.`,t.ligne),n.page&&t.mode===`toutes`&&!t.tantQue&&ua(t.corps)&&!da(t.corps)&&e.avertissement(`cette page se met à jour toute seule, sans moyen de l’arrêter : ajoutez une pause avec une variable, par exemple « toutes les 5 secondes tant que actif est vrai : » et un bouton qui change « actif ».`,t.ligne)}function ua(e){return fa(e).some(e=>[`Affectation`,`ModificationListe`,`Requete`,`Rechargement`].includes(e.type))}function da(e){return fa(e).some(e=>e.type===`Arreter`)}function fa(e){let t=[];for(let n of e)t.push(n),n.type===`Condition`||n.type===`Confirmer`?t.push(...fa(n.alors),...fa(n.sinon)):n.type===`Boucle`||n.type===`TantQue`||n.type===`Repeter`||n.type===`Minuterie`||n.type===`Bloc`||n.type===`Formulaire`||n.type===`Fenetre`?t.push(...fa(n.corps)):n.type===`Selon`?t.push(...n.cas.flatMap(e=>fa(e.corps)),...fa(n.sinon)):n.type===`Action`&&n.message?.action&&t.push(...fa(n.message.action.corps));return t}function pa(e,t,n,r){if(n.dansLaPage)return e.erreur(`« ${t} » demande un geste de la personne : il s’écrit dans un événement (quand l’utilisateur clique sur …).`,r),!1;if(n.sansGeste){let i=n.sansGeste===`chargement`?`à l’ouverture de la page`:`dans une minuterie`;return e.erreur(`« ${t} » ${i} : personne n’a rien demandé, et le navigateur le refuserait. Écrivez-le dans l’événement d’un clic.`,r),!1}return n.apresUneAttente&&e.avertissement(`« ${t} » après une attente (une requête ou une question) : le navigateur, surtout Safari, peut le refuser, le geste de la personne étant passé. Placez « ${t} » avant l’attente.`,r),!0}function ma(e,t,n){let r=e.typeDe(t.valeur);pa(e,`copier`,n,t.ligne)&&(H(r)&&r.genre!==`texte`&&r.genre!==`nombre`&&e.erreur(`« copier » attend un texte ou un nombre ; ici, c’est ${V(r)}. Écrivez le texte voulu : copier "{p.nom}".`,t.ligne),t.message===``&&e.erreur(`le message de « copier » est vide : écrivez un texte, ou « sans message ».`,t.ligne))}function ha(e,t,n){e.typeDe(t.texte),t.titre&&e.typeDe(t.titre),pa(e,`partager`,n,t.ligne)}function ga(e,t,n){if(e.typeDe(t.question),n.dansLaPage){e.erreur(`« confirmer » pose une question à la personne : il s’écrit dans un événement (quand l’utilisateur clique sur …).`,t.ligne);return}if(n.sansGeste){let r=n.sansGeste===`chargement`?`à l’ouverture de la page`:`dans une minuterie`;e.erreur(`« confirmer » ${r} : personne n’a rien demandé à ce moment-là. Posez la question après un clic.`,t.ligne);return}n.dansUneAction&&e.erreur(`pas de « confirmer » dans le bouton d’un message : le bouton « Annuler » remplace déjà la question.`,t.ligne);for(let[n,r]of[[`oui`,t.oui],[`non`,t.non]])r!==void 0&&r.trim()===``&&e.erreur(`le bouton « ${n} » de la question n’a pas de texte : avec ${n} "…".`,t.ligne);let r=t.oui??`Oui`,i=t.non??`Non`;A(r.trim())===A(i.trim())&&e.erreur(`les deux boutons de la question s’appellent « ${r} » : la personne ne saurait pas lequel choisir. Donnez-leur des verbes différents (« Supprimer » et « Garder »).`,t.ligne),t.alors.length===0&&e.erreur(`« confirmer » sans rien à faire si la personne répond oui : écrivez en dessous, décalé, ce qui doit se passer.`,t.ligne),n.profondeur>=2&&e.avertissement(`trois questions de suite, c’est beaucoup : une ou deux suffisent.`,t.ligne)}function _a(e,t,n){n.dansUnEvenement&&e.erreur(`une fenêtre ne se crée pas dans un événement : écrivez-la dans la page, puis ouvrez-la avec montrer "…".`,t.ligne),n.dansUneFenetre&&e.erreur(`une fenêtre dans une fenêtre perd les personnes qui utilisent le clavier : placez-la à côté de l’autre, dans la page.`,t.ligne),t.titre.trim()===``&&e.erreur(`une fenêtre a besoin d’un titre : fenetre "Détails" :`,t.ligne)}function va(e,t,n,r){n?t.obligatoire&&!r&&e.avertissement(`la fenêtre « ${t.nom??t.titre} » est obligatoire, et rien ne la ferme : ajoutez un bouton qui fait cacher "${t.nom??t.titre}".`,t.ligne):e.avertissement(`la fenêtre « ${t.nom??t.titre} » ne s’ouvre jamais : ajoutez montrer "${t.nom??t.titre}" dans un événement.`,t.ligne)}const ya=[`controle`,`maj`,`alt`],ba=[`entree`,`echap`,`espace`,`tab`,`suppr`,`retour`,`haut`,`bas`,`gauche`,`droite`,`debut`,`fin`,`plus`,`moins`],xa=[`/`,`?`],Sa=[`controle+t`,`controle+w`,`controle+n`,`controle+l`,`controle+r`,`controle+q`,`controle+tab`,`controle+maj+t`,`controle+maj+n`,`alt+f4`,`f5`,`f11`,`f12`];function Ca(e){let t=`modificateurs ${ya.join(`, `)} ; touches : une lettre, un chiffre, ${ba.join(`, `)}, f1 à f12, / et ?`,n=A(e.trim()).split(/\s*\+\s*/).map(e=>e===``?`+`:e);if(e.trim()===``||n.some(e=>e===`+`))return{erreur:`« ${e} » n’est pas une touche : écrivez par exemple "controle+k" (${t}).`};let r=n[n.length-1],i=n.slice(0,-1),a=/^[a-z0-9]$/.test(r)||ba.includes(r)||xa.includes(r)||/^f([1-9]|1[0-2])$/.test(r),o=[...i.filter(e=>!ya.includes(e)),...a?[]:[r]][0];if(o!==void 0){let n={ctrl:`controle`,cmd:`controle`,commande:`controle`,shift:`maj`,majuscule:`maj`,esc:`echap`,escape:`echap`,enter:`entree`}[o];return{erreur:`la touche « ${o} » n’existe pas dans « ${e} »${n?` : écrivez « ${n} »`:``}. Touches possibles : ${t}.`}}return new Set(i).size===i.length?{touches:[...ya.filter(e=>i.includes(e)),r].join(`+`)}:{erreur:`« ${e} » répète un modificateur.`}}function wa(e,t,n,r){let i=Ca(t);if(`erreur`in i){e.erreur(i.erreur,n);return}return Sa.includes(i.touches)?e.avertissement(`« ${t} » est souvent gardé par le navigateur ou le système : il peut ne pas laisser passer cette touche. Choisissez-en une autre.`,n):!r.dansUnChamp&&/^[a-z0-9]$/.test(i.touches)&&e.avertissement(`un raccourci d’une seule lettre (« ${t} ») se déclenche sans le vouloir avec la reconnaissance vocale : ajoutez controle ou alt (par exemple "alt+${i.touches}").`,n),i.touches}function Ta(e,t,n,r){if(r){e.erreur(`« ${t.genre===`saisie`?`ecrit dans`:`arrete d’ecrire dans`} » suit un seul champ : placez le champ et son événement hors de la boucle.`,t.ligne);return}(n===`case`||n===`choix`||n===`liste`)&&e.erreur(`on ne tape pas dans « ${t.cible} » (une case à cocher, un choix ou une liste) : « ecrit » et « arrete d’ecrire » vont avec un champ où l’on écrit.`,t.ligne),t.genre===`pauseSaisie`&&Ea(e,t),Da(e,t,n===`motDePasse`)}function Ea(e,t){if(!t.duree)return;let n=sa(e,t.duree,`apres 300 millisecondes`);n===void 0&&t.duree.valeur.type!==`Nombre`?e.erreur(`la pause d’une frappe s’écrit en chiffres : apres 500 millisecondes.`,t.duree.ligne):n!==void 0&&(n<100||n>5e3)&&e.erreur(`la pause d’une frappe va de 100 millisecondes à 5 secondes (ici : ${oa(n)}) ; 300 millisecondes par défaut.`,t.duree.ligne)}function Da(e,t,n){let r=fa(t.corps).some(e=>e.type===`Requete`||e.type===`Rechargement`);n&&r?e.avertissement(`ce que la personne tape dans un mot de passe ne doit pas partir sur le réseau à chaque touche : vérifiez-le à l’envoi du formulaire.`,t.ligne):t.genre===`saisie`&&r&&e.avertissement(`« ecrit dans » envoie une requête à chaque touche : utilisez « arrete d’ecrire dans … » pour attendre une pause.`,t.ligne)}function Oa(e,t,n){let r=fa(t.corps);r.some(e=>e.type===`Requete`||e.type===`Rechargement`||e.type===`ModificationListe`&&e.operation===`ajouter`)||e.avertissement(`rien ne grandit quand le bas est atteint : ajoutez des éléments (ajouter … a …) ou chargez la suite (envoyer requete …).`,t.ligne);let i=new Set(r.flatMap(e=>e.type===`Affectation`?[e.nom]:e.type===`ModificationListe`?[e.liste]:e.type===`Requete`&&e.resultat?[e.resultat]:[]));t.tantQue&&n.length>0&&!n.some(e=>i.has(e))&&e.avertissement(`cet événement ne change jamais « ${n[0]} » : il ne s’arrêtera pas tout seul.`,t.ligne),t.bouton===null&&e.avertissement(`sans bouton « Voir plus », une personne au clavier ne peut plus atteindre le bas de la page : gardez le bouton (avec bouton "…").`,t.ligne)}function ka(e,t,n,r){e.erreur(`deux fenêtres s’appellent « ${t} » (lignes ${n} et ${r}) : montrer "${t}" ne saurait pas laquelle ouvrir. Donnez un nom à l’une d’elles : avec nom "…".`,r)}function Aa(e,t,n,r){e.erreur(`le nom « ${t} » est déjà donné à un bloc (ligne ${n}).`,r)}function ja(e,t,n,r,i){e.erreur(`aucun champ « ${t} » dans la page « ${n} »${r.length?`. Champs : ${r.join(`, `)}`:``}.`,i)}function Ma(e,t,n,r){n===void 0?e.erreur(`aucun bloc nommé « ${t} » dans la page : nommez le bloc qui grandit, par exemple section "Produits" avec nom "${t}" :`,r):e.erreur(`le bloc « ${t} » a déjà son « arrive en bas de » (ligne ${n}) : réunissez les deux.`,r)}function Na(e,t,n){return n.dansUnEvenement?(e.erreur(`« avec deplacement » s’écrit sur une boucle de la page, qui affiche la liste : pas dans un événement.`,t.ligne),!1):n.variable===void 0?(e.erreur(`on ne peut déplacer que les éléments d’une liste écrite dans une variable (pas un calcul ni une liste filtrée) : variable taches = [...], puis pour chaque t dans taches avec deplacement :`,t.ligne),!1):n.deja===void 0?(fa(t.corps).some(e=>e.type===`Element`&&e.element===`champ`)&&e.avertissement(`un champ dans une liste qu’on déplace : prendre un élément gêne la sélection du texte. Placez le champ hors de la boucle.`,t.ligne),!0):(e.erreur(`la liste « ${n.variable} » a déjà une boucle avec deplacement (ligne ${n.deja}) : une seule par liste.`,t.ligne),!1)}function Pa(e,t,n,r){e.erreur(`le raccourci « ${t} » est déjà pris dans cette page (ligne ${n}) : choisissez d’autres touches.`,r)}function Fa(e,t,n){n||e.erreur(`personne ne déplace rien dans « ${t.variable} » : écrivez pour chaque … dans ${t.variable} avec deplacement :`,t.ligne)}function Ia(e,t){if(![`bouton`,`lien`,`champ`].includes(t.element)){e.erreur(`« avec raccourci » s’applique à un bouton, un lien ou un champ : un ${t.element} ne se clique pas.`,t.ligne);return}return wa(e,t.raccourci??``,t.ligne,{dansUnChamp:!1})}function U(e){return e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)}var La=class{elements=[];formulaires=[];ids=new Map;idsPris=new Set;constructor(e,t){this.recenser(e.corps,t)}idDe(e){return this.ids.get(e)}parId(e){return this.elements.find(t=>t.id===e)}elementsDe(e){let t=new Set;return Ra(e,e=>t.add(e)),this.elements.filter(e=>t.has(e.noeud))}formulairesDe(e){let t=new Set;return Ra(e,()=>{},e=>t.add(e)),this.formulaires.filter(e=>t.has(e.noeud))}resoudre(e,t,n){let r=(n??this.elements).filter(e=>!t||e.noeud.element===t),i=r.filter(t=>t.nom===e);if(i.length>0)return{ids:i.map(e=>e.id)};let a=r.filter(t=>t.libelle===e);return a.length===0?{erreur:`inconnu`}:a.length>1?{erreur:`ambigu`,lignes:[a[0].ligne,a[1].ligne]}:{ids:[a[0].id]}}recenser(e,t,n){for(let r of e)if(r.type===`Element`){let e=this.ajouter(r,t);n&&r.element===`champ`&&n.champs.push(e)}else if(r.type===`Condition`)this.recenser(r.alors,t,n),this.recenser(r.sinon,t,n);else if(r.type===`Boucle`||r.type===`Bloc`||r.type===`Fenetre`)this.recenser(r.corps,t,n);else if(r.type===`Formulaire`){let e=n??this.ajouterFormulaire(r);this.recenser(r.corps,t,e)}}ajouterFormulaire(e){let t=`formulaire_${U(e.nom)||`ligne_${e.ligne}`}`,n=t;for(let e=2;this.idsPris.has(n);e++)n=`${t}_${e}`;this.idsPris.add(n);let r={noeud:e,id:n,nom:e.nom,champs:[],ligne:e.ligne};return this.formulaires.push(r),r}ajouter(e,t){let n=e.contenu,r=n.type===`Chaine`&&n.parties.every(e=>e.type===`texte`)?n.parties.map(e=>e.valeur).join(``):void 0;if(e.nom!==void 0){let n=this.elements.find(t=>t.nom===e.nom);n&&t.push({gravite:`erreur`,message:`le nom « ${e.nom} » est déjà donné à un élément (ligne ${n.ligne}).`,ligne:e.ligne})}let i=e.nom!==void 0&&U(e.nom)||r!==void 0&&U(r)&&`${e.element}_${U(r)}`||`${e.element}_ligne_${jc(e.ligne)}`,a=i;for(let e=2;this.idsPris.has(a);e++)a=`${i}_${e}`;return this.idsPris.add(a),this.ids.set(e,a),this.elements.push({noeud:e,id:a,nom:e.nom,libelle:r,ligne:e.ligne}),a}};function Ra(e,t,n=()=>{}){for(let r of e)r.type===`Element`?t(r):r.type===`Condition`?(Ra(r.alors,t,n),Ra(r.sinon,t,n)):r.type===`Boucle`||r.type===`Bloc`||r.type===`Fenetre`?Ra(r.corps,t,n):r.type===`Formulaire`&&(n(r),Ra(r.corps,t,n))}const za=[{nom:`panier`,lucide:`shopping-cart`,alias:[`caddie`,`chariot`]},{nom:`sac`,lucide:`shopping-bag`,alias:[`cabas`]},{nom:`maison`,lucide:`house`,alias:[`accueil`]},{nom:`recherche`,lucide:`search`,alias:[`loupe`,`chercher`]},{nom:`utilisateur`,lucide:`user`,alias:[`profil`,`personne`,`compte`]},{nom:`utilisateurs`,lucide:`users`,alias:[`equipe`,`groupe`]},{nom:`menu`,lucide:`menu`,alias:[`hamburger`]},{nom:`fermer`,lucide:`x`,alias:[`croix`]},{nom:`plus`,lucide:`plus`,alias:[`ajouter`]},{nom:`moins`,lucide:`minus`,alias:[`retirer`]},{nom:`coche`,lucide:`check`,alias:[`valider`]},{nom:`etoile`,lucide:`star`,alias:[`favori`]},{nom:`demi_etoile`,lucide:`star-half`},{nom:`coeur`,lucide:`heart`,alias:[`aimer`]},{nom:`calendrier`,lucide:`calendar`,alias:[`date`,`agenda`]},{nom:`horloge`,lucide:`clock`,alias:[`heure`]},{nom:`telephone`,lucide:`phone`,alias:[`appel`]},{nom:`courrier`,lucide:`mail`,alias:[`mail`,`email`,`enveloppe`]},{nom:`lieu`,lucide:`map-pin`,alias:[`adresse`,`position`]},{nom:`carte`,lucide:`map`,alias:[`plan`]},{nom:`soleil`,lucide:`sun`,alias:[`clair`]},{nom:`lune`,lucide:`moon`,alias:[`sombre`,`nuit`]},{nom:`fleche_droite`,lucide:`arrow-right`},{nom:`fleche_gauche`,lucide:`arrow-left`},{nom:`fleche_haut`,lucide:`arrow-up`},{nom:`fleche_bas`,lucide:`arrow-down`},{nom:`chevron_droite`,lucide:`chevron-right`},{nom:`chevron_gauche`,lucide:`chevron-left`},{nom:`chevron_haut`,lucide:`chevron-up`},{nom:`chevron_bas`,lucide:`chevron-down`},{nom:`info`,lucide:`info`,alias:[`information`]},{nom:`alerte`,lucide:`triangle-alert`,alias:[`attention`,`avertissement`]},{nom:`erreur`,lucide:`circle-x`},{nom:`succes`,lucide:`circle-check`,alias:[`reussite`]},{nom:`aide`,lucide:`circle-help`,alias:[`question`]},{nom:`parametres`,lucide:`settings`,alias:[`reglages`,`engrenage`]},{nom:`sortie`,lucide:`log-out`,alias:[`deconnexion`]},{nom:`entree`,lucide:`log-in`,alias:[`connexion`]},{nom:`cadenas`,lucide:`lock`,alias:[`verrou`]},{nom:`cle`,lucide:`key`},{nom:`oeil`,lucide:`eye`,alias:[`voir`]},{nom:`oeil_barre`,lucide:`eye-off`,alias:[`masquer`]},{nom:`corbeille`,lucide:`trash-2`,alias:[`poubelle`,`supprimer`]},{nom:`modifier`,lucide:`pencil`,alias:[`crayon`,`editer`]},{nom:`copier`,lucide:`copy`},{nom:`telecharger`,lucide:`download`},{nom:`envoyer`,lucide:`send`},{nom:`partager`,lucide:`share-2`},{nom:`lien`,lucide:`link`,alias:[`chaine`]},{nom:`image`,lucide:`image`},{nom:`photo`,lucide:`camera`,alias:[`appareil_photo`]},{nom:`video`,lucide:`video`,alias:[`camera`]},{nom:`musique`,lucide:`music`},{nom:`livre`,lucide:`book-open`,alias:[`lecture`]},{nom:`document`,lucide:`file-text`,alias:[`fichier`,`texte`]},{nom:`dossier`,lucide:`folder`},{nom:`filtre`,lucide:`funnel`,alias:[`entonnoir`]},{nom:`tri`,lucide:`arrow-up-down`,alias:[`trier`]},{nom:`liste`,lucide:`list`},{nom:`grille`,lucide:`layout-grid`,alias:[`mosaique`]},{nom:`cloche`,lucide:`bell`,alias:[`notification`]},{nom:`message`,lucide:`message-circle`,alias:[`bulle`]},{nom:`discussion`,lucide:`messages-square`,alias:[`conversation`,`chat`]},{nom:`couverts`,lucide:`utensils`,alias:[`restaurant`,`repas`]},{nom:`cafe`,lucide:`coffee`,alias:[`the`]},{nom:`vin`,lucide:`wine`,alias:[`verre`]},{nom:`poisson`,lucide:`fish`},{nom:`feuille`,lucide:`leaf`,alias:[`nature`,`bio`]},{nom:`flamme`,lucide:`flame`,alias:[`feu`,`piquant`]},{nom:`goutte`,lucide:`droplet`,alias:[`eau`]},{nom:`vagues`,lucide:`waves`,alias:[`fleuve`,`mer`]},{nom:`voiture`,lucide:`car`,alias:[`auto`]},{nom:`velo`,lucide:`bike`},{nom:`avion`,lucide:`plane`},{nom:`bateau`,lucide:`ship`},{nom:`train`,lucide:`train-front`},{nom:`carte_bancaire`,lucide:`credit-card`,alias:[`paiement`]},{nom:`argent`,lucide:`banknote`,alias:[`billet`]},{nom:`cadeau`,lucide:`gift`},{nom:`etiquette`,lucide:`tag`,alias:[`prix`]},{nom:`recompense`,lucide:`award`,alias:[`medaille`]},{nom:`trophee`,lucide:`trophy`},{nom:`eclair`,lucide:`zap`,alias:[`rapide`]},{nom:`globe`,lucide:`globe`,alias:[`monde`,`langue`]},{nom:`wifi`,lucide:`wifi`},{nom:`batterie`,lucide:`battery`},{nom:`mobile`,lucide:`smartphone`,alias:[`smartphone`]},{nom:`ordinateur`,lucide:`monitor`,alias:[`ecran`]},{nom:`imprimante`,lucide:`printer`,alias:[`imprimer`]},{nom:`micro`,lucide:`mic`},{nom:`son`,lucide:`volume-2`,alias:[`haut_parleur`]},{nom:`muet`,lucide:`volume-x`},{nom:`lecture_media`,lucide:`play`,alias:[`jouer`]},{nom:`pause`,lucide:`pause`},{nom:`stop`,lucide:`square`,alias:[`arreter`,`carre`]},{nom:`rafraichir`,lucide:`refresh-cw`,alias:[`actualiser`,`recharger`]},{nom:`plus_cercle`,lucide:`circle-plus`},{nom:`moins_cercle`,lucide:`circle-minus`},{nom:`points`,lucide:`ellipsis`,alias:[`plus_options`]},{nom:`points_verticaux`,lucide:`ellipsis-vertical`},{nom:`epingle`,lucide:`pin`},{nom:`drapeau`,lucide:`flag`},{nom:`signet`,lucide:`bookmark`,alias:[`marque_page`]},{nom:`ampoule`,lucide:`lightbulb`,alias:[`idee`]},{nom:`bouclier`,lucide:`shield`,alias:[`securite`]}],Ba=e=>e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().replace(/[\s-]+/g,`_`),Va=new Map;for(let e of za){Va.set(e.nom,e);for(let t of e.alias??[])Va.set(t,e)}function Ha(e){return Va.get(Ba(e))}function Ua(e,t){let n=Array.from({length:e.length+1},(e,n)=>[n,...Array(t.length).fill(0)]);for(let e=1;e<=t.length;e++)n[0][e]=e;for(let r=1;r<=e.length;r++)for(let i=1;i<=t.length;i++)n[r][i]=Math.min(n[r-1][i]+1,n[r][i-1]+1,n[r-1][i-1]+(e[r-1]===t[i-1]?0:1));return n[e.length][t.length]}function Wa(e){let t=Ba(e),n;for(let e of Va.keys()){let r=Ua(t,e);(!n||r<n.d)&&(n={nom:e,d:r})}return n&&n.d<=Math.max(1,Math.floor(t.length/4))?Va.get(n.nom).nom:void 0}const Ga=e=>/\p{Extended_Pictographic}/u.test(e);function Ka(e){return e.type===`Chaine`&&e.parties.every(e=>e.type===`texte`)?e.parties.map(e=>e.valeur).join(``):void 0}const qa=(e,t)=>e.find(e=>A(e.propriete)===t);function Ja(e,t,n){if(Ga(e))n.erreur(`une icône est un dessin, pas un émoji : écrivez son nom, par exemple icone "panier". Icônes possibles : ${za.slice(0,12).map(e=>e.nom).join(`, `)}…`,t);else if(!Ha(e)){let r=Wa(e);n.erreur(`l'icône « ${e} » n'existe pas.${r?` Peut-être « ${r} » ?`:` Icônes possibles : ${za.slice(0,12).map(e=>e.nom).join(`, `)}…`}`,t)}}function Ya(e,t){let{ligne:n,contenu:r,styles:i}=e,a=qa(i,`icone`);a&&Ja(a.valeur,n,t);let o=Ka(r);switch(e.element){case`icone`:o===void 0?t.erreur(`le nom de l'icône s'écrit entre guillemets, sans {variable} : icone "panier".`,n):Ja(o,n,t);break;case`badge`:o!==void 0&&o.length>12&&t.avertissement(`un badge est court : « `+o+` » a plus de 12 caractères.`,n);break;case`avatar`:o!==void 0&&o.trim()===``&&t.erreur(`un avatar prend le nom de la personne : avatar "Camille Martin".`,n);break;case`progression`:{let i=t.typeDe(r);r.type!==`Rien`&&H(i)&&i.genre!==`nombre`&&t.erreur(`une progression prend un nombre (ici, ${V(i)}) : progression 40, ou rien pour une barre qui avance sans fin.`,n);let a=e.maximum??100;a<=0&&t.erreur(`le maximum d'une progression doit être positif.`,n),r.type===`Nombre`&&r.valeur>a&&t.avertissement(`la valeur ${r.valeur} dépasse le maximum ${a} de la progression.`,n);break}case`etoiles`:{let a=t.typeDe(r);H(a)&&a.genre!==`nombre`&&t.erreur(`des étoiles prennent un nombre (ici, ${V(a)}) : etoiles 4.`,n);let o=e.maximum??5;(o<1||o>10)&&t.erreur(`des étoiles vont de 1 à 10 au maximum (5 par défaut) : etoiles note avec maximum 10.`,n),qa(i,`modifiable`)&&r.type!==`Reference`&&t.erreur(`des étoiles « modifiable » changent une variable : écrivez variable note = 3, puis etoiles note avec modifiable.`,n);break}case`compteur`:{if(r.type!==`Reference`){t.erreur(`un compteur change une variable : écrivez variable quantite = 1 d'abord, puis compteur quantite.`,n);break}let i=t.typeDe(r);H(i)&&i.genre!==`nombre`&&t.erreur(`un compteur change une variable de type nombre (« ${r.nom} » est ${V(i)}).`,n),e.minimum!==void 0&&e.maximum!==void 0&&e.minimum>e.maximum&&t.erreur(`le minimum (${e.minimum}) du compteur dépasse son maximum (${e.maximum}).`,n);break}case`qr`:o!==void 0&&new TextEncoder().encode(o).length>2900&&t.erreur(`ce texte est trop long pour un code QR (2 900 caractères au plus).`,n)}}const Xa=(e,t)=>{let n=qa(e,t);return n?Number(n.valeur):void 0};function Za(e,t,n){let r=e=>e.filter(e=>e.type===`Bloc`),i=qa(e.styles,`icone`);switch(i&&Ja(i.valeur,e.ligne,n),e.genre){case`onglets`:{let t=e.corps.find(e=>e.type!==`Bloc`||e.genre!==`onglet`);t&&n.erreur(`« onglets » ne contient que des onglets : onglet "Description" : …`,`ligne`in t?t.ligne:e.ligne);let i=r(e.corps).filter(e=>e.genre===`onglet`);i.length===0&&n.erreur(`« onglets » doit contenir au moins un onglet : onglet "Description" : …`,e.ligne),i.length===1&&n.avertissement(`un seul onglet : à quoi bon des onglets ?`,e.ligne),i.filter(e=>qa(e.styles,`ouvert`)).length>1&&n.erreur(`un seul onglet peut être « ouvert » au départ.`,e.ligne);break}case`onglet`:t?.genre!==`onglets`&&n.erreur(`un onglet se place dans un bloc « onglets ».`,e.ligne),e.titre||n.erreur(`un onglet a un titre entre guillemets : onglet "Avis" :`,e.ligne);break;case`accordeon`:{let t=e.corps.find(e=>e.type!==`Bloc`||e.genre!==`deroulant`);t&&n.erreur(`« accordeon » ne contient que des deroulant : deroulant "Question" : …`,`ligne`in t?t.ligne:e.ligne),r(e.corps).filter(e=>qa(e.styles,`ouvert`)).length>1&&!qa(e.styles,`plusieurs`)&&n.erreur(`dans un accordéon, un seul deroulant est « ouvert » à la fois (ou écrivez « accordeon avec plusieurs »).`,e.ligne);break}case`deroulant`:e.titre||n.erreur(`un deroulant a un titre entre guillemets : deroulant "Détails" :`,e.ligne);break;case`carrousel`:{e.corps.length===0&&n.erreur(`un carrousel est vide : mettez-y des images ou des blocs, une diapositive par élément.`,e.ligne);let t=Xa(e.styles,`visibles`);t!==void 0&&(t<1||t>4)&&n.erreur(`un carrousel montre de 1 à 4 diapositives à la fois (visibles 1 à 4).`,e.ligne);let r=Xa(e.styles,`automatique`);r!==void 0&&(r<2||r>60)&&n.erreur(`le défilement automatique va de 2 à 60 secondes : automatique 5.`,e.ligne);break}case`filAriane`:{let t=e.corps.find(e=>e.type!==`Element`||e.element!==`lien`&&e.element!==`texte`);t&&n.erreur(`un fil d'Ariane ne contient que des liens, puis un texte pour la page en cours.`,`ligne`in t?t.ligne:e.ligne);let r=e.corps[e.corps.length-1];e.corps.length<2?n.erreur(`un fil d'Ariane a au moins deux éléments : un lien, puis le texte de la page en cours.`,e.ligne):r.type===`Element`&&r.element!==`texte`&&n.erreur(`le dernier élément d'un fil d'Ariane est la page en cours : un texte, pas un lien.`,r.ligne);break}}}const Qa={bleu:{clair:`#1f5fbf`,sombre:`#7fb0ff`,encreClair:`#ffffff`,encreSombre:`#141416`},rouge:{clair:`#c62828`,sombre:`#ff8a80`,encreClair:`#ffffff`,encreSombre:`#141416`},vert:{clair:`#2e7d32`,sombre:`#81c784`,encreClair:`#ffffff`,encreSombre:`#141416`},jaune:{clair:`#f2c200`,sombre:`#ffe066`,encreClair:`#1d1d1f`,encreSombre:`#141416`},orange:{clair:`#e65100`,sombre:`#ffab70`,encreClair:`#ffffff`,encreSombre:`#141416`},violet:{clair:`#6a3fb5`,sombre:`#c3a6ff`,encreClair:`#ffffff`,encreSombre:`#141416`},rose:{clair:`#c2185b`,sombre:`#f48fb1`,encreClair:`#ffffff`,encreSombre:`#141416`},gris:{clair:`#5f6368`,sombre:`#b0b3b8`,encreClair:`#ffffff`,encreSombre:`#141416`},noir:{clair:`#1d1d1f`,sombre:`#000000`,encreClair:`#ffffff`,encreSombre:`#f2f2f4`},blanc:{clair:`#ffffff`,sombre:`#ffffff`,encreClair:`#1d1d1f`,encreSombre:`#141416`}},$a=new Set([`image`,`photo`]);function eo(e,t,n=[`clair`,`sombre`]){let r=[],i=(e,t,n)=>r.push({gravite:e,categorie:`accessibilite`,message:t,ligne:n}),a=0,o=1,s=new Map,c=[],l=new Set,u=(r,d=new Map)=>{for(let f of r)if(f.type===`Element`){let r=f,c=Ka(r.contenu),l=e=>r.styles.find(t=>t.propriete===e);if([`bouton`,`lien`,`champ`].includes(r.element)&&c!==void 0&&c.trim()===``)i(`erreur`,`le ${r.element} n'a pas de texte. Écrivez un libellé entre guillemets.`,r.ligne);else if(r.element===`champ`&&c!==void 0){/\p{L}/u.test(c)||i(`avertissement`,`le libellé « ${c} » du champ ne contient aucune lettre.`,r.ligne);let e=d.get(c.toLocaleLowerCase(`fr`));e===void 0?d.set(c.toLocaleLowerCase(`fr`),r.ligne):i(`avertissement`,`deux champs du même formulaire portent « ${c} » (premier ligne ${e}). Donnez-leur des libellés différents.`,r.ligne)}if(r.element===`image`){let e=l(`description`)?.valeur;e!==void 0&&(e.trim().length<3||$a.has(e.toLocaleLowerCase(`fr`))||e===c||/^IMG[_-]?\d+/i.test(e))&&i(`avertissement`,`la description « ${e} » de l'image ne dit rien. Décrivez ce qu'elle montre.`,r.ligne)}if(r.element===`icone`&&!l(`description`)&&!l(`decoratif`)&&i(`avertissement`,`cette icône seule n’a pas de description pour le lecteur d’écran. Ajoutez « avec description "…" » ou « avec decoratif ». `,r.ligne),r.element===`etoiles`&&!l(`description`)&&i(`avertissement`,`ces étoiles n’ont pas de description explicite. Ajoutez « avec description "Note : 4 sur 5" ». `,r.ligne),r.element===`lien`&&c!==void 0&&/^(ici|cliquez ici|lire la suite|en savoir plus)$/i.test(c.trim())){let e=s.get(c.toLocaleLowerCase(`fr`))??new Set;(e.size===0||!e.has(r.cible??``))&&i(`avertissement`,`le lien « ${c} » n'explique pas sa destination. Écrivez un libellé plus précis.`,r.ligne),e.add(r.cible??``),s.set(c.toLocaleLowerCase(`fr`),e)}if(r.element===`titre`&&(a++,a>1&&i(`avertissement`,`la page « ${e.nom} » a plusieurs titres principaux. Gardez un seul « titre ».`,r.ligne)),r.element===`soustitre`){let e=r.niveau??2;if(e<2||e>6){i(`erreur`,`le niveau d’un sous-titre doit être entre 2 et 6.`,r.ligne);continue}a===0&&i(`avertissement`,`ce sous-titre apparaît avant le titre principal de la page.`,r.ligne),e>o+1&&i(`avertissement`,`ce sous-titre fait un saut de niveau : après ${o}, écrivez un niveau ${o+1}.`,r.ligne),o=e}[`texte`,`titre`,`bouton`,`lien`,`champ`].includes(r.element)&&to(r,t,n,i)}else if(f.type===`Formulaire`)u(f.corps,new Map);else if(f.type===`Evenement`)f.genre===`survol`&&c.push({cible:f.cible,ligne:f.ligne}),f.genre===`clic`&&l.add(f.cible),u(f.corps,d);else if(f.type===`Bloc`||f.type===`Boucle`)u(f.corps,d);else if(f.type===`Condition`){let e=a;u(f.alors,d);let t=a;a=e,u(f.sinon,d),a=Math.max(a,t)}};u(e.corps);for(let e of c)l.has(e.cible)||i(`avertissement`,`ce survol n’a pas d’action au clic : le clavier et les écrans tactiles ne peuvent pas le déclencher.`,e.ligne);let d=JSON.stringify(e.corps).includes(`"type":"SousPage"`);return a===0&&!d&&i(`avertissement`,`la page « ${e.nom} » n'a pas de titre principal. Ajoutez « titre "…" ».`,e.ligne),r}function to(e,t,n,r){let i=t=>e.styles.find(e=>e.propriete===t)?.valeur,a=i(`couleur`)??i(`texte`),o=i(`fond`);if(!a&&!o)return;let s=i(`taille`)===`grande`?3:4.5;for(let i of n){let n=e=>t.get(e)?.[i]??Qa[e]?.[i],c=o?n(o):Kn[i],l=a?n(a):c?Qn(c):void 0;if(!c||!l)continue;let u=Zn(l,c);if(u>=s)continue;let d=Object.entries(Qa).filter(([,e])=>Zn(e[i],c)>=s).map(([e])=>e).slice(0,3);r(`avertissement`,`le contraste du texte en ${a??`couleur calculée`} est ${u.toFixed(1).replace(`.`,`,`)} en mode ${i} ; il faut ${s.toString().replace(`.`,`,`)}. Essayez ${d.join(`, `)}.`,e.ligne)}}function no(e,t=1){let n=t,r=e=>{for(let i of e)if(i.type===`Element`&&i.element===`titre`)n=1;else if(i.type===`Element`&&i.element===`soustitre`){if(i.niveau===void 0){let e=Math.min(t+1,6);e!==2&&(i.niveau=e),n=e}else n=i.niveau}else if(i.type===`Bloc`&&i.genre===`section`)io(i.corps,n);else if(i.type===`Bloc`)no(i.corps,n);else{for(let e of[`corps`,`alors`,`sinon`]){let t=i[e];Array.isArray(t)&&i.type!==`Evenement`&&r(t)}if(i.type===`Selon`)for(let e of i.cas)r(e.corps)}};r(e)}function ro(e,t=[]){for(let n of e)if(n.type===`Element`&&n.element===`soustitre`&&t.push(n),n.type!==`Evenement`){for(let e of[`corps`,`alors`,`sinon`]){let r=n[e];Array.isArray(r)&&ro(r,t)}if(n.type===`Selon`)for(let e of n.cas)ro(e.corps,t)}return t}function io(e,t){let n=ro(e),r=new Set(n.filter(e=>e.niveau===void 0));no(e,t);let[i,...a]=n;if(!i)return;let o=Math.min((i.niveau??2)+1,6);for(let e of a)r.has(e)&&(e.niveau??2)<o&&(e.niveau=o)}const ao=/^(authorization|cookie|proxy-authorization|x-api-key|x-auth-token|x-access-token|api-key|apikey|x-csrf-token)$/i,oo=[/\bsk_(live|test)_/i,/\bsk-[A-Za-z0-9]{16,}/,/\bghp_[A-Za-z0-9]{20,}/,/\bgithub_pat_/,/\bxox[abprs]-/,/\bAKIA[0-9A-Z]{12,}/,/-----BEGIN [A-Z ]*PRIVATE KEY-----/,/\brk_live_/],so=e=>oo.some(t=>t.test(e)),co=e=>e.replace(/^\/+/,``).replace(/\/+$/,``);function lo(e,t,n){let r=(e,t)=>n.push({gravite:`erreur`,message:e,ligne:t}),i=(e,t)=>n.push({gravite:`avertissement`,message:e,ligne:t}),a=new Map,o=[];for(let n of e){let e=a.get(n.nom);e&&r(`la source « ${n.nom} » est déjà déclarée à la ligne ${e.ligne}.`,n.ligne),a.set(n.nom,n),n.session&&o.push(n),n.adresse===void 0&&r(`la source « ${n.nom} » n'a pas d'adresse. Écrivez adresse "https://…".`,n.ligne);let i=new Map;for(let e of n.donnees){i.has(e.nom)&&r(`la donnée « ${e.nom} » est déjà déclarée dans la source « ${n.nom} » (ligne ${i.get(e.nom).ligne}).`,e.ligne),i.set(e.nom,e);let t=new Set;for(let i of e.champs){let a=i.type;for(;a.genre===`liste`;)a=a.de;a.genre===`donnee`&&!n.donnees.some(e=>e.nom===a.nom||e.cle===a.nom)&&r(`le champ « ${i.nom} » parle de « ${a.nom} », qui n'est ni un type (texte, nombre, booleen, date) ni une donnée de la source « ${n.nom} ». Données : ${n.donnees.map(e=>e.nom).join(`, `)}.`,i.ligne),t.has(i.nom)&&r(`le champ « ${i.nom} » est déjà déclaré dans la donnée « ${e.nom} ».`,i.ligne),t.add(i.nom)}}for(let e of n.entetes)ao.test(e.nom)?r(`un en-tête « ${e.nom} » avec une valeur écrite voyagerait jusqu'au navigateur : déclarez un jeton (jeton public "…" ou jeton secret depuis l'environnement "…").`,e.ligne):so(e.valeur)&&r(`la valeur de l'en-tête « ${e.nom} » ressemble à un secret : elle serait lisible par tout le monde.`,e.ligne);let s=n.jeton;s?.genre===`public`&&so(s.valeur)&&r(`cette valeur ressemble à un secret : elle serait lisible par tout le monde. Un jeton public est fait pour être vu ; pour un secret, écrivez jeton secret depuis l'environnement "NOM".`,s.ligne),s?.genre===`secret`&&(/^[A-Za-z_][A-Za-z0-9_]*$/.test(s.valeur)||r(`« ${s.valeur} » n'est pas un nom de variable d'environnement (lettres, chiffres et _, comme METEO_CLE). La valeur du secret ne s'écrit jamais ici.`,s.ligne),t.length===0?r(`la source « ${n.nom} » a un jeton secret, qui ne peut pas partir dans le navigateur. Ajoutez un bloc serveur "…" : il fera l'appel à la place du navigateur.`,s.ligne):r(`le jeton secret de la source « ${n.nom} » passera par le serveur, mais cette passerelle n'est pas encore disponible. Le secret n'est écrit nulle part : rien n'est produit.`,s.ligne));let c=new Map;for(let e of n.routes){let t=c.get(co(e.adresse));t&&r(`la route « ${e.adresse} » est déjà déclarée dans la source « ${n.nom} » (ligne ${t.ligne}).`,e.ligne),c.set(co(e.adresse),e);for(let t of e.regles)i.has(t.donnee)||r(`la donnée « ${t.donnee} » n'existe pas dans la source « ${n.nom} ». Données : ${[...i.keys()].join(`, `)||`aucune`}.${M(t.donnee,i.keys())}`,t.ligne),t.qui!==void 0&&s?.genre!==`secret`&&r(`« qui peut » n'a de sens que pour une source à jeton secret, où le serveur Humalis est la porte. Pour « ${n.nom} », c'est l'API qui décide qui peut.`,t.ligne),t.qui===void 0&&s?.genre===`secret`&&r(`la route « ${e.adresse} » passe par le serveur (jeton secret) : écrivez qui peut l'appeler (tout le monde peut …, connecte peut …, seul admin peut …).`,t.ligne)}}if(o.length>1)for(let e of o.slice(1))r(`une seule source peut donner la session ; « ${o[0].nom} » et « ${e.nom} » le demandent.`,e.ligne);o.length>0&&t.length>0&&r(`la source « ${o[0].nom} » donne la session, mais le serveur « ${t[0].nom} » la donne déjà : une seule des deux.`,o[0].ligne);for(let t of e)t.jeton?.genre===`public`&&t.adresse?.startsWith(`http://`)&&!/^http:\/\/(localhost|127\.0\.0\.1|\[::1\])/.test(t.adresse)&&i(`la source « ${t.nom} » envoie un jeton en clair (adresse en http://) : utilisez https://.`,t.ligne)}function uo(e,t){let n=new Map;for(let r of e){if(n.has(r.nom))continue;let e=new Map;for(let n of r.donnees){let i=t.has(n.nom)?`${r.nom}_${n.nom}`.replace(/[^A-Za-z0-9_]/g,`_`):n.nom;t.set(i,n),n.cle=i,e.set(n.nom,i)}let i=t=>{t.genre===`liste`?i(t.de):t.genre===`donnee`&&(t.nom=e.get(t.nom)??t.nom)};for(let e of r.donnees)for(let t of e.champs)i(t.type);n.set(r.nom,{source:r,cles:e})}return n}function fo(e,t){return e.routes.find(e=>co(e.adresse)===co(t))}function po(e,t,n){return e.regles.find(e=>e.action===t&&(n===void 0||e.liste===n))}function mo(e,t,n,r){if(e.source===void 0){r(`« filtrant par » demande la source visée : envoyer requete vers "…" de la source "nom" filtrant par …`,e.ligne);return}let i=t.get(e.source);if(!i){r(`aucune source « ${e.source} ». Sources : ${[...t.keys()].join(`, `)||`aucune`}.${M(e.source,t.keys())}`,e.ligne);return}if(e.filtrant&&e.donnees.length>0&&r(`une requête ne lit et n'envoie pas à la fois : « filtrant par » sert à lire, « avec » à envoyer.`,e.ligne),i.source.routes.length===0)return;let a=fo(i.source,e.adresse);if(!a){r(`aucune route « ${e.adresse} » dans la source « ${i.source.nom} ». Routes : ${i.source.routes.map(e=>e.adresse).join(`, `)}.`,e.ligne);return}let o=e.donnees.length>0&&!n,s=o?po(a,`creer`):n?po(a,`lire`,!1):po(a,`lire`,!0);if(!s){let t=o?`creer …`:n?`lire un …`:`lire une liste de …`;r(`la route « ${a.adresse} » de la source « ${i.source.nom} » ne dit pas « ${t} » : la requête n'est pas permise.`,e.ligne);return}let c=i.cles.get(s.donnee);if(c===void 0)return{regle:s};let l={genre:`donnee`,nom:c};return{type:s.liste?na(l):l,regle:s}}function ho(e,t,n,r){let i=e.type===`Suppression`?`supprimer`:`modifier`,a=t.get(e.source??``);if(!a){r(`aucune source « ${e.source} ». Sources : ${[...t.keys()].join(`, `)||`aucune`}.${M(e.source??``,t.keys())}`,e.ligne);return}if(a.source.routes.length===0)return;let o=fo(a.source,e.adresse);if(!o){r(`aucune route « ${e.adresse} » dans la source « ${a.source.nom} ». Routes : ${a.source.routes.map(e=>e.adresse).join(`, `)}.`,e.ligne);return}let s=po(o,i===`supprimer`?`supprimer`:`modifier`);if(!s){r(`la route « ${o.adresse} » de la source « ${a.source.nom} » ne dit pas « ${i} … » : l'action n'est pas permise.`,e.ligne);return}let c=a.cles.get(s.donnee);return c!==void 0&&n.genre!==`inconnu`&&(n.genre!==`donnee`||n.nom!==c)&&r(`« ${i} » attend un « ${s.donnee} » lu sur cette route (par exemple la variable d'une boucle « pour chaque p dans … »).`,e.ligne),s}const go={images:{mime:[`image/png`,`image/jpeg`,`image/webp`,`image/gif`,`image/avif`],apercu:!0,refus:`n'est pas une image`},audio:{mime:[`audio/mpeg`,`audio/ogg`,`audio/wav`,`audio/mp4`,`audio/aac`,`audio/flac`,`audio/webm`],apercu:!0,refus:`n'est pas un son`},videos:{mime:[`video/mp4`,`video/webm`,`video/ogg`,`video/quicktime`],apercu:!0,refus:`n'est pas une vidéo`},pdf:{mime:[`application/pdf`],apercu:!1,refus:`n'est pas un PDF`},documents:{mime:[`text/plain`,`text/csv`,`application/msword`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/vnd.ms-excel`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.oasis.opendocument.text`,`application/vnd.oasis.opendocument.spreadsheet`],apercu:!1,refus:`n'est pas un document`}},_o={image:`images`,photo:`images`,photos:`images`,son:`audio`,video:`videos`,document:`documents`},vo=e=>{let t=_o[e]??e;return t in go?t:void 0};function yo(e){let t={genre:`fiche`,champs:[{nom:`nom`,type:z},{nom:`taille`,type:ea},{nom:`type`,type:z},{nom:`apercu`,type:z}]};return e?na(t):t}function bo(e,t){let n=e.fichier,r=Ka(e.contenu);r!==void 0&&r.trim()===``&&t.erreur(`le libellé du choix de fichier est vide : écrivez ce que la personne lit sur le bouton, par exemple fichier "Choisir une photo" dans photo.`,e.ligne);let i=Object.keys(go);for(let r of n.accepte)r===`svg`?t.erreur(`le SVG n'est pas accepté : un fichier SVG peut contenir du script, ce n'est pas une « image » pour « accepte ». Acceptez images (PNG, JPEG, WebP, GIF, AVIF).`,e.ligne):vo(r)||t.erreur(`« ${r} » n'est pas un type de fichier connu. Types possibles : ${i.join(`, `)}.${M(r,i)}`,e.ligne);n.octets!==void 0&&n.octets<=0&&t.erreur(`la taille maximale est positive : maximum 5 Mo.`,e.ligne),n.accepte.length===0&&t.avertissement(`sans « accepte », tout fichier peut être choisi : le serveur doit vérifier le type. Écrivez par exemple accepte images ou accepte pdf.`,e.ligne)}const xo=e=>[...new Set(e.accepte.map(vo).filter(e=>e!==void 0))];function So(e){let t=xo(e);return t.length===0||t.some(e=>go[e].apercu)}function Co(e,t,n){let{ligne:r}=e;if(!t.fichiers.get(e.variable)){let i=[...t.fichiers.keys()];n.erreur(i.length===0?`« ${e.variable} » n'est pas un fichier choisi : la page n'a aucun choix de fichier. Écrivez fichier "Choisir une photo" dans ${e.variable}, puis envoyer fichier ${e.variable} vers …`:`« ${e.variable} » n'est pas un fichier choisi. Fichiers choisis dans cette page : ${i.join(`, `)}.${M(e.variable,i)}`,r)}if(e.source===void 0)n.erreur(`le serveur de ce fichier ne reçoit pas de fichier : les packs Astratra n'ont pas encore de route d'envoi, et Humalis n'invente pas de récepteur (taille, type, nom, droits : ce serait de la sécurité inventée). Envoyez le fichier à une source déclarée : envoyer fichier … vers "…" de la source "…".`,r);else{let i=t.sources.get(e.source);if(!i)n.erreur(`aucune source « ${e.source} ». Sources : ${[...t.sources.keys()].join(`, `)||`aucune`}.${M(e.source,t.sources.keys())}`,r);else if(i.source.jeton?.genre===`secret`&&n.erreur(`la source « ${i.source.nom} » a un jeton secret : un fichier ne peut pas passer par la passerelle du serveur pour l'instant (corps binaire, taille), et le secret ne doit jamais partir dans le navigateur. Envoyez le fichier à une source à session ou à jeton public.`,r),i.source.routes.length===0)n.avertissement(`la source « ${i.source.nom} » ne décrit pas ses routes : « ${co(e.adresse)} » n'est pas vérifiée.`,r);else{let t=fo(i.source,e.adresse);t?po(t,`creer`)||n.erreur(`la route « ${t.adresse} » de la source « ${i.source.nom} » ne dit pas « creer … » : l'envoi d'un fichier n'est pas permis.`,r):n.erreur(`aucune route « ${e.adresse} » dans la source « ${i.source.nom} ». Routes : ${i.source.routes.map(e=>e.adresse).join(`, `)}.`,r)}}if(e.suivi!==void 0){let i=t.typeDe(e.suivi,r);i&&H(i)&&i.genre!==`nombre`&&n.erreur(`« suivi dans ${e.suivi} » : la progression est un nombre de 0 à 100, mais « ${e.suivi} » est ${V(i)}. Déclarez variable ${e.suivi} = 0.`,r)}e.resultat!==void 0&&t.typeDe(e.resultat,r)}function wo(e,t=new Map){for(let n of e)n.type===`Element`&&n.element===`fichier`&&n.fichier?t.set(n.fichier.variable,{choix:n.fichier,ligne:n.ligne}):n.type===`Condition`?(wo(n.alors,t),wo(n.sinon,t)):(n.type===`Boucle`||n.type===`Bloc`||n.type===`Formulaire`)&&wo(n.corps,t);return t}const To=e=>String(e).replace(`.`,`,`),Eo=e=>e.type===`Nombre`?e.valeur:void 0;function Do(e,t,n,r){let[i,a]=t===`latitude`?[-90,90]:t===`longitude`?[-180,180]:[1,18],o=r.typeDe(e);if(H(o)&&o.genre!==`nombre`){r.erreur(`${t===`zoom`?`le`:`la`} ${t} est un nombre (ici, ${V(o)}) : ${t} ${t===`zoom`?`15`:t===`latitude`?`-4,3250`:`15,3222`}.`,n);return}let s=Eo(e);s!==void 0&&(s<i||s>a?r.erreur(t===`zoom`?`le zoom ${To(s)} est hors des bornes : il va de 1 (le monde entier) à 18 (une rue).`:`la ${t} ${To(s)} est hors des bornes : elle va de ${i} à ${a}.`,n):t===`zoom`&&!Number.isInteger(s)&&r.erreur(`le zoom est un nombre entier de 1 (le monde entier) à 18 (une rue), pas ${To(s)}.`,n))}function Oo(e,t,n,r){let i=Ka(e);i!==void 0&&i.trim()===``?r.erreur(t,n):r.typeDe(e)}function ko(e){let t=0,n=0;for(let r of e)if(r.type===`Element`&&r.element===`marqueur`)t++,n++;else if(r.type===`Boucle`)t+=ko(r.corps).total;else if(r.type===`Condition`){let e=ko(r.alors),i=ko(r.sinon);t+=e.total+i.total,n+=e.litteraux+i.litteraux}return{total:t,litteraux:n}}function Ao(e,t){let{ligne:n}=e,r=e.carte??{};e.titre&&Oo(e.titre,`le nom de la carte est vide : il la décrit pour les lecteurs d’écran, par exemple carte "Le restaurant Le Fleuve, avenue de la Gombe".`,n,t);let{latitude:i,longitude:a,zoom:o}=r;if(i===void 0!=(a===void 0)&&t.erreur(`une position s’écrit avec latitude et longitude ensemble : il manque ${i===void 0?`la latitude`:`la longitude`}. Exemple : avec latitude -4,3250 et longitude 15,3222.`,n),i&&Do(i,`latitude`,n,t),a&&Do(a,`longitude`,n,t),o&&Do(o,`zoom`,n,t),r.tuiles!==void 0){let e=r.tuiles;(!/^https:\/\//i.test(e)||!e.includes(`{z}`)||!e.includes(`{x}`)||!e.includes(`{y}`))&&t.erreur(`l’adresse des tuiles commence par https:// et contient {z}, {x} et {y} (le zoom et la case demandés), comme https://tile.openstreetmap.org/{z}/{x}/{y}.png. Ici : « ${e} ».`,n),(r.attribution===void 0||r.attribution.trim()===``)&&t.erreur(`des tuiles d’un autre fournisseur demandent son attribution, toujours affichée sur la carte : avec tuiles "https://…/{z}/{x}/{y}.png" et attribution "© MapTiler".`,n)}else r.attribution!==void 0&&t.erreur(`l’attribution accompagne des tuiles d’un autre fournisseur : écrivez aussi « tuiles "https://…/{z}/{x}/{y}.png" ». Les tuiles par défaut portent déjà leur attribution (OpenStreetMap).`,n);let s=e.corps.find(e=>(e.type!==`Element`||e.element!==`marqueur`)&&e.type!==`Boucle`&&e.type!==`Condition`);s&&t.erreur(`une carte ne contient que des marqueurs (dans un « pour chaque » ou un « si » au besoin) : marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070.`,`ligne`in s?s.ligne:n);let{total:c,litteraux:l}=ko(e.corps);i===void 0&&a===void 0&&c===0&&t.erreur(`une carte sans position ni marqueur n’affiche rien : ajoutez « avec latitude … et longitude … », ou des marqueurs.`,n),l>200&&t.avertissement(`${l} marqueurs écrits dans cette carte (plus de 200) : le regroupement des marqueurs n’existe pas dans cette version, la carte sera lente et illisible. Montrez-en moins, ou découpez en plusieurs cartes.`,n)}function jo(e,t,n){let{ligne:r,lieu:i}=e;if(t||n.erreur(`un marqueur se place dans une carte : carte "Nos agences" : puis, en dessous et décalé, marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070.`,r),Oo(e.contenu,`le nom du marqueur est vide : il s’affiche dans la bulle et nomme le repère pour les lecteurs d’écran.`,r,n),i?.latitude===void 0||i.longitude===void 0){let e=i?.latitude===void 0&&i?.longitude===void 0?`sa latitude et sa longitude`:i?.latitude===void 0?`sa latitude`:`sa longitude`;n.erreur(`le marqueur a besoin de sa position : il manque ${e}. Exemple : marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070.`,r)}i?.latitude&&Do(i.latitude,`latitude`,r,n),i?.longitude&&Do(i.longitude,`longitude`,r,n),i?.adresse&&n.typeDe(i.adresse)}const Mo={fc:`FC`,franc:`FC`,francs:`FC`,euro:`EUR`,euros:`EUR`,dollar:`USD`,dollars:`USD`};function No(e){return typeof e==`number`?e.toLocaleString(`fr-FR`):``}function Po(e){if(!e)return``;let t=new Date(`${e.slice(0,10)}T00:00:00`);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(`fr-FR`,{day:`numeric`,month:`long`,year:`numeric`})}function Fo(e,t){return typeof e==`number`?t===`EUR`?e.toLocaleString(`fr-FR`,{style:`currency`,currency:`EUR`}):t===`USD`?`${e.toLocaleString(`fr-FR`,{minimumFractionDigits:2,maximumFractionDigits:2})} $`:`${e.toLocaleString(`fr-FR`)} FC`:``}function Io(e,t,n=`fr`){return typeof e==`number`?`${(t===`Mo`?e/1048576:e/1024).toLocaleString(n===`en`?`en-US`:`fr-FR`,{maximumFractionDigits:1})} ${n===`en`?t===`Mo`?`MB`:`KB`:t}`:``}function Lo(e,t){if(typeof e!=`number`)return``;if(Math.abs(e)<2)return`${e.toLocaleString(`fr-FR`)} ${t}`;let n=/[sxz]$/.test(t)?t:/al$/.test(t)?`${t.slice(0,-2)}aux`:/(eau|au|eu)$/.test(t)?`${t}x`:`${t}s`;return`${e.toLocaleString(`fr-FR`)} ${n}`}const Ro="/** Les réglages régionaux de chaque langue. */\nconst REGIONS: Record<string, { nombre: string; date: string }> = { fr: { nombre: 'fr-FR', date: 'fr-FR' }, en: { nombre: 'en-US', date: 'en-GB' } };\nconst region = (langue: string) => REGIONS[langue] ?? REGIONS.fr;\n\n/** 28000 → « 28 000 » (en anglais : « 28,000 ») ; rien pour une valeur absente. */\nexport function formaterNombre(valeur: number | null | undefined, langue = 'fr'): string {\n return typeof valeur === 'number' ? valeur.toLocaleString(region(langue).nombre) : '';\n}\n\n/** « 2026-11-07 » → « 7 novembre 2026 » (en anglais : « 7 November 2026 ») ; un texte qui n'est pas une date reste tel quel. */\nexport function formaterDate(valeur: string | null | undefined, langue = 'fr'): string {\n if (!valeur) return '';\n // Le jour seul, à minuit sur l'appareil : pas de décalage de fuseau horaire.\n const date = new Date(`${valeur.slice(0, 10)}T00:00:00`);\n return Number.isNaN(date.getTime()) ? valeur : date.toLocaleDateString(region(langue).date, { day: 'numeric', month: 'long', year: 'numeric' });\n}\n\n/** 15000, « FC » → « 15 000 FC » ; 12.5, « EUR » → « 12,50 € » (en anglais : « €12.50 ») ; 12.5, « USD » → « 12,50 $ » (« $12.50 »). */\nexport function formaterArgent(valeur: number | null | undefined, devise: 'FC' | 'EUR' | 'USD', langue = 'fr'): string {\n if (typeof valeur !== 'number') return '';\n if (langue === 'en') {\n if (devise === 'FC') return `${valeur.toLocaleString('en-US')} FC`;\n return valeur.toLocaleString('en-US', { style: 'currency', currency: devise === 'EUR' ? 'EUR' : 'USD' });\n }\n if (devise === 'EUR') return valeur.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' });\n if (devise === 'USD') return `${valeur.toLocaleString('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} $`;\n return `${valeur.toLocaleString('fr-FR')} FC`;\n}\n\n/** 1, « article » → « 1 article » ; 3 → « 3 articles » ; en anglais, 0 et 2 « items », 1 « item ». */\nexport function accorder(nombre: number | null | undefined, mot: string, langue = 'fr'): string {\n if (typeof nombre !== 'number') return '';\n if (langue === 'en') {\n const pluriel = /(s|x|z|ch|sh)$/.test(mot) ? `${mot}es` : /[^aeiou]y$/.test(mot) ? `${mot.slice(0, -1)}ies` : `${mot}s`;\n return `${nombre.toLocaleString('en-US')} ${nombre === 1 ? mot : pluriel}`;\n }\n // En français, le pluriel commence à 2.\n if (Math.abs(nombre) < 2) return `${nombre.toLocaleString('fr-FR')} ${mot}`;\n const pluriel = /[sxz]$/.test(mot) ? mot : /al$/.test(mot) ? `${mot.slice(0, -2)}aux` : /(eau|au|eu)$/.test(mot) ? `${mot}x` : `${mot}s`;\n return `${nombre.toLocaleString('fr-FR')} ${pluriel}`;\n}\n".replace(/^export /gm,``).replace(`: Record<string, { nombre: string; date: string }>`,``).replace(`(langue: string)`,`(langue)`).replace(`(valeur: number | null | undefined, langue = 'fr'): string`,`(valeur, langue = 'fr')`).replace(`(valeur: string | null | undefined, langue = 'fr'): string`,`(valeur, langue = 'fr')`).replace(`(valeur: number | null | undefined, devise: 'FC' | 'EUR' | 'USD', langue = 'fr'): string`,`(valeur, devise, langue = 'fr')`).replace(`(nombre: number | null | undefined, mot: string, langue = 'fr'): string`,`(nombre, mot, langue = 'fr')`).replace(/^(?=.)/gm,` `),zo=`/** 1572864 octets, « Mo » → « 1,5 Mo » ; en anglais « 1.5 MB ». Rien pour une valeur absente. */
|
|
623
|
+
`&&e++,o++;continue}if(a||t===`"`)throw Error(`ligne ${o} : guillemets mal formés dans le CSV.`);r+=t}if(i)throw Error(`ligne ${o} : guillemet non fermé dans le CSV.`);if((n.length||r!==``||a)&&m(),!t.length)throw Error(`ligne 1 : le CSV doit commencer par des noms de colonnes.`);let h=t.shift().cases.map(e=>e.trim().normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_|_$/g,``));if(h.some(e=>!e))throw Error(`ligne 1 : une colonne du CSV n’a pas de nom.`);if(new Set(h).size!==h.length)throw Error(`ligne 1 : deux colonnes du CSV portent le même nom.`);for(let e of t)if(e.cases.length!==h.length)throw Error(`ligne ${e.numero} : ${h.length} colonnes attendues, ${e.cases.length} trouvées.`);let g=e=>/^[-+]?(?:\d{1,3}(?:[ \u00a0]\d{3})+|\d+)(?:[,.]\d+)?$/.test(e.trim()),_=e=>/^(oui|non|vrai|faux|true|false)$/i.test(e.trim()),v=h.map((e,n)=>{let r=t.map(e=>e.cases[n].trim()).filter(Boolean);return r.length&&r.every(g)?`nombre`:r.length&&r.every(_)?`booleen`:`texte`});return t.map(e=>Object.fromEntries(h.map((t,n)=>{let r=e.cases[n].trim();if(v[n]===`nombre`&&!r)throw Error(`ligne ${e.numero} : la colonne « ${t} » attend un nombre, mais la case est vide.`);return[t,v[n]===`nombre`?Number(r.replace(/[ \u00a0]/g,``).replace(`,`,`.`)):v[n]===`booleen`?/^(oui|vrai|true)$/i.test(r):r]})))}function Pi(e){let t;try{t=JSON.parse(e)}catch{throw Error(`ligne 1 : le fichier JSON est mal formé.`)}let n=e=>typeof e==`object`&&!!e&&!Array.isArray(e);if(!n(t)&&!(Array.isArray(t)&&t.every(n)))throw Error(`ligne 1 : le JSON doit contenir une fiche ou une liste de fiches.`);let r=(e,t,i)=>{if(Array.isArray(t)){if(!Array.isArray(e))throw Error(`${i} : une liste était attendue.`);t.length&&e.forEach((e,n)=>r(e,t[0],`${i}, élément ${n+1}`))}else if(n(t)){if(!n(e))throw Error(`${i} : une fiche était attendue.`);for(let n of Object.keys(t)){if(!(n in e))throw Error(`${i} n'a pas le champ « ${n} ».`);r(e[n],t[n],i)}for(let n of Object.keys(e))if(!(n in t))throw Error(`${i} a un champ supplémentaire « ${n} ».`)}else if(typeof e!=typeof t)throw Error(`${i} : le type change d'un élément à l'autre.`)};return Array.isArray(t)&&t.length&&t.forEach((e,n)=>r(e,t[0],`l'élément ${n+1}`)),t}function Fi(e){if(!(e?.type!==`Chaine`||!e.parties.every(e=>e.type===`texte`)))return e.parties.map(e=>e.valeur).join(``)}function Ii(e,t){if(e.type!==`Comparaison`||e.gauche.type!==`Reference`||e.gauche.nom!==`langue`||e.droite?.type!==`Reference`||e.operateur!==`egal`&&e.operateur!==`different`)return;let n=kn(e.droite.nom);if(n)return n.code===t!=(e.operateur===`different`)!=!!e.negation}function Li(e,t,n){for(let r of t){if(r.type===`Element`&&r.element===e)return r.contenu;let t=r.type===`Condition`&&n!==void 0?Ii(r.test,n):void 0,i=r.type===`Bloc`?r.corps:r.type===`Condition`&&t!==void 0?t?r.alors:r.sinon:void 0;if(i){let t=Li(e,i,n);if(t)return t}}}function Ri(e,t){return{titre:e.apercu?.titre??Li(`titre`,e.corps,t),description:e.apercu?.description??Li(`texte`,e.corps,t)}}function zi(e,t){let n=e.site;if(!n)return;let r=(e,n)=>t.push({gravite:`avertissement`,message:e,ligne:n});n.adresse!==void 0&&!/^https:\/\/[^/]/.test(n.adresse)&&!/^http:\/\/localhost(:\d+)?(\/|$)/.test(n.adresse)&&t.push({gravite:`erreur`,message:`l'adresse du site « ${n.adresse} » doit commencer par https:// (ou http://localhost pour un essai).`,ligne:n.lignes.adresse??n.ligne}),n.logo===void 0&&r(`le site n'a pas d'icône : ajoutez « logo "./logo.svg" » au bloc « site » (un SVG, ou un PNG carré de 512×512 au moins).`,n.ligne),n.image!==void 0&&/^https?:\/\//.test(n.image)&&r(`l'image de partage « ${n.image} » est sur un autre site : si elle disparaît, l'aperçu des liens du site la perd. Préférez un fichier du projet.`,n.lignes.image??n.ligne);let i=new Map,a=e.langues?.langues[0],o=a?kn(a.mot)?.code:void 0;for(let t of e.pages){if(t.nom===`introuvable`)continue;let{titre:e,description:n}=Ri(t,o),a=t.apercu?.ligne??t.ligne,s=Fi(e),c=Fi(n);if(s!==void 0&&s.length>60&&r(`le titre de la page « ${t.nom} » fait plus de 60 caractères (${s.length}) : il sera coupé dans les résultats de recherche.`,a),c!==void 0&&c.length<50?r(`la description de la page « ${t.nom} » fait moins de 50 caractères (${c.length}) : dites en une phrase ce qu'on y trouve.`,a):c!==void 0&&c.length>160&&r(`la description de la page « ${t.nom} » fait plus de 160 caractères (${c.length}) : elle sera coupée dans les résultats de recherche.`,a),n===void 0&&r(`la page « ${t.nom} » n'a pas de description : ajoutez un « texte », ou « description "…" » dans un bloc « apercu : ».`,t.ligne),[t.apercu?.titre,t.apercu?.description,t.apercu?.image].some(e=>e!==void 0&&Fi(e)===void 0)&&r(`l'aperçu de partage de « ${t.nom} » dépend de données : l'onglet le montre, mais les réseaux sociaux, qui ne lisent pas le JavaScript, montreront celui du site.`,a),s!==void 0){let e=i.get(s);e?r(`les pages « ${e} » et « ${t.nom} » ont le même titre « ${s} » : les moteurs de recherche ne sauront pas laquelle montrer.`,t.ligne):i.set(s,t.nom)}}}function Bi(e){let t=new Set;return(e.langues?.langues??[]).flatMap(e=>{let n=kn(e.mot);return!n||!n.disponible||t.has(n.code)?[]:(t.add(n.code),[n])})}const Vi=e=>e.map(e=>e.nom).join(`, `),Hi=e=>/^[aeiouy]/.test(e.nom)?`l'${e.nom}`:`le ${e.nom}`,Ui=e=>e.some(e=>e.type===`texte`&&/\p{L}/u.test(e.valeur)),Wi=e=>new Set(e.filter(e=>e.type===`variable`).map(e=>e.valeur.trim().split(/\s+/)[0])),Gi=new WeakSet,Ki=e=>(Gi.add(e),e),qi=(e,t)=>Ki({type:`Chaine`,parties:[{type:`texte`,valeur:e}],ligne:t});function Ji(e,t){if(e.type===`Element`){for(let n of e.styles)(n.propriete===`description`||n.propriete===`transcription`)&&n.parties&&t.push(n.texte??{type:`Chaine`,parties:n.parties,ligne:e.ligne});e.indice!==void 0&&t.push(e.indiceTexte?Ki(e.indiceTexte):qi(e.indice,e.ligne))}if(e.type===`Graphique`){e.description?.type===`Chaine`&&t.push(e.description),e.etiquettes&&Zi(e.etiquettes,t);for(let n of e.series)t.push(n.texteNom?Ki(n.texteNom):qi(n.nom,n.ligne))}}const Yi=e=>{if(e.type!==`Condition`)return!1;let t=e.test;return t.type===`Comparaison`&&t.gauche.type===`Reference`&&t.gauche.nom===`langue`&&t.droite?.type===`Reference`&&kn(t.droite.nom)!==void 0};function Xi(e,t,n){let r=e=>{e?.type===`Chaine`&&t.push(e)};for(let i of e){switch(Ji(i,t),i.type){case`Element`:[`image`,`audio`,`icone`,`avatar`,`qr`,`selecteurLangue`,`chargement`,`progression`,`etoiles`,`compteur`].includes(i.element)||r(i.contenu);break;case`Action`:(i.action===`afficher`||i.action===`afficherErreur`)&&r(i.arguments[0]),i.action===`changerTexte`&&r(i.arguments[1]);break;case`Apercu`:r(i.titre),r(i.description)}i.type===`Bloc`&&r(i.titre);for(let e of[`corps`,`alors`,`sinon`]){let r=i[e];if(Array.isArray(r)){if(e!==`corps`&&n&&Yi(i)){let e=[];Xi(r,e,n);for(let t of e)n.add(t);t.push(...e)}else Xi(r,t,n)}}if(i.type===`Selon`)for(let e of i.cas)Xi(e.corps,t,n)}}function Zi(e,t){if(Array.isArray(e)){for(let n of e)Zi(n,t);return}if(!(!e||typeof e!=`object`)){e.type===`Chaine`&&t.push(e);for(let n of Object.values(e))n&&typeof n==`object`&&Zi(n,t)}}function Qi(e,t,n){if(Array.isArray(e)){for(let r of e)Qi(r,t,n);return}if(!e||typeof e!=`object`)return;let r=e;r.type===`Element`&&n&&r.element===n&&r.contenu?t.push(r.contenu):r.type===`Element`&&!n&&r.parmi&&t.push(r.parmi);for(let r of Object.values(e))r&&typeof r==`object`&&Qi(r,t,n)}function $i(e,t){let n=(e,n,r)=>t.push({gravite:e,categorie:`traduction`,message:n,ligne:r}),r=(e,t)=>n(`erreur`,e,t),i=(e,t)=>n(`avertissement`,e,t),a=[];Zi([e.pages,e.partages,e.composants,e.fonctions,e.entete,e.pied,e.site?.textes],a);let o=new Map;if(!e.langues){let t=new Set;for(let e of a){let n=e.versions?.[0];!n||t.has(n.ligne)||(t.add(n.ligne),r(`ce texte a une version ${kn(n.langue)?.adjectif??`« ${n.langue} »`}, mais le fichier ne déclare pas ses langues. Ajoutez en haut du fichier : « langues : », puis « francais » et « anglais » sur deux lignes décalées.`,n.ligne))}let n=[];Qi(e.pages,n,`selecteurLangue`);for(let e of n)r(`« selecteur de langue » demande un bloc « langues : » en haut du fichier, avec « francais » et « anglais » sur deux lignes décalées.`,e.ligne);for(let t of e.traductions??[])r(`le bloc « traductions » demande d'abord un bloc « langues : » en haut du fichier (« francais », puis « anglais »).`,t.ligne);return{langues:[],traductions:o}}let s=new Map;for(let{mot:t,ligne:n}of e.langues.langues){let e=kn(t);if(e)e.disponible?s.has(e.code)?r(`${Hi(e)} est déjà dans le bloc « langues » (ligne ${s.get(e.code)}).`,n):s.set(e.code,n):r(`${Hi(e)} n'est pas encore disponible : pour l'instant, Humalis traduit en ${Vi(An)}.`,n);else{let e=lt(t,An.map(e=>e.mot));r(`« ${t} » n'est pas une langue connue de Humalis. Langues possibles : ${Vi(An)}.${e?` Peut-être « ${e} » ?`:``}`,n)}}let c=Bi(e);if(c.length===0)return r(`le bloc « langues » est vide : écrivez une langue par ligne, la première étant celle des textes (${Vi(An)}).`,e.langues.ligne),{langues:[],traductions:o};let l=c[0],u=c.slice(1),d=(e,t,n)=>{let i=kn(e);if(!i){let n=lt(e,c.map(e=>e.mot));r(`« ${e} » n'est pas une langue connue de Humalis. Langues déclarées : ${Vi(c)}.${n?` Peut-être « ${n} » ?`:``}`,t);return}if(!c.includes(i)){r(`${Hi(i)} n'est pas dans le bloc « langues ». Langues déclarées : ${Vi(c)}.`,t);return}if(i===l){r(`${n} est déjà en ${l.nom}, la première langue du bloc « langues » : la version à ajouter est celle d'une autre langue (${Vi(u)||`aucune autre déclarée`}).`,t);return}return i},f=new Map;for(let t of e.traductions??[]){let e=d(t.langue,t.ligne,`le texte des pages`);if(e)for(let n of t.entrees){let t=At(n.texte),i=`${e.code}\u0000${t}`,a=f.get(i);if(a){r(`« ${t} » a déjà une version ${e.adjectif} dans ce bloc (ligne ${a.ligne}).`,n.ligne);continue}f.set(i,{ligne:n.ligne,utilisee:!1,langue:e}),p(n.texte,n.version,e,n.ligne),o.has(t)||o.set(t,new Map),o.get(t).set(e.code,n.version)}}function p(e,t,n,r){let a=Wi(t);for(let t of Wi(e))a.has(t)||i(`la version ${n.adjectif} n'utilise pas {${t}} : la personne qui lit en ${n.nom} ne verra pas cette valeur.`,r)}let m=[],h=new Set,g=e.pages;for(let e of g)Xi(e.corps,m,h),e.apercu&&Xi([e.apercu],m,h);for(let t of[e.entete,e.pied])t&&Xi(t.corps,m,h);for(let t of e.composants)Xi(t.corps,m,h);for(let t of[`nom`,`description`]){let n=e.site?.[t];n!==void 0&&m.push(e.site?.textes?.[t]?Ki(e.site.textes[t]):qi(n,e.site?.lignes[t]??e.site.ligne))}let _=new Set(a);for(let e of m)_.has(e)||a.push(e);for(let e of a){let t=new Set;if(Gi.has(e))for(let t of e.versions??[])t.parties.some(e=>e.type===`variable`)&&r(`ce texte (un indice, le nom d'une série, le nom ou la description du site) n'accepte pas de « {variable} » : retirez les accolades de la version.`,t.ligne);for(let n of e.versions??[]){let i=d(n.langue,n.ligne,`le texte écrit`);if(i){if(t.has(i)){r(`deux versions ${i.adjectif}s pour le même texte : gardez-en une seule.`,n.ligne);continue}t.add(i),p(e.parties,n.parties,i,n.ligne)}}for(let t of u){let n=f.get(`${t.code}\u0000${At(e.parties)}`);n&&(n.utilisee=!0)}}let v=[];Qi(e.pages,v);for(let e of v){let t=[];Zi(e,t);for(let e of t)e.versions&&r(`la valeur d'un choix est envoyée au serveur telle qu'elle est écrite : elle ne se traduit pas. Retirez « en … "…" » de cette valeur.`,e.versions[0].ligne)}for(let e of m){if(!Ui(e.parties)||h.has(e)||e.sansTraduction)continue;let t=At(e.parties);for(let n of u)e.versions?.some(e=>kn(e.langue)===n)||o.get(t)?.has(n.code)||i(`« ${t} » n'a pas de version ${n.adjectif} : écrivez « en ${n.mot} "…" » après le texte, ou ajoutez-le au bloc « traductions ${n.mot} ».`,e.ligne)}let y=a.map(e=>At(e.parties));for(let[e,t]of f){if(t.utilisee)continue;let n=e.split(`\0`)[1],r=lt(n,y);i(`cette traduction ne sert à rien : aucun texte du programme ne s'écrit « ${n} ».${r?` Peut-être « ${r} » ?`:` Une faute de frappe ?`}`,t.ligne)}return{langues:c,traductions:o}}const z={genre:`texte`},ea={genre:`nombre`},ta={genre:`booleen`},B={genre:`inconnu`},na=e=>({genre:`liste`,de:e});function V(e){switch(e.genre){case`texte`:return`un texte`;case`nombre`:return`un nombre`;case`booleen`:return`un booléen (vrai ou faux)`;case`liste`:return`une liste`;case`donnee`:return`une donnée « ${e.nom} »`;case`fiche`:return`une fiche`;case`inconnu`:return`une valeur de type inconnu`}}function ra(e){if(e.genre!==`liste`)return V(e);let t={texte:`textes`,nombre:`nombres`,booleen:`booléens`,liste:`listes`,donnee:`données`,fiche:`fiches`}[e.de.genre];return t?`une liste de ${t}`:`une liste`}const H=e=>e.genre!==`inconnu`;function ia(e,t){return!H(e)||!H(t)?!0:e.genre===`liste`&&t.genre===`liste`?ia(e.de,t.de):e.genre===`donnee`&&t.genre===`donnee`?e.nom===t.nom:e.genre===`fiche`&&t.genre===`fiche`?e.champs.length===t.champs.length&&e.champs.every(e=>{let n=t.champs.find(t=>t.nom===e.nom);return n!==void 0&&ia(e.type,n.type)}):e.genre===t.genre}function aa(e){return e.valeur.type===`Nombre`?Math.round(e.valeur.valeur*pr[e.unite]):void 0}function oa(e){return e<1e3?`${e} millisecondes`:`${String(e/1e3).replace(`.`,`,`)} seconde${e>=2e3?`s`:``}`}function sa(e,t,n){let r=e.typeDe(t.valeur);if(H(r)&&r.genre!==`nombre`){e.erreur(`une durée est un nombre suivi de son unité (${n}) ; ici, c’est ${V(r)}.`,t.ligne);return}let i=aa(t);if(i!==void 0&&i<=0){e.erreur(`une durée doit être plus grande que zéro (${n}).`,t.ligne);return}return i}function ca(e,t,n,r){let i=t.message;if(i){if(n){e.erreur(`un message de réussite ou d’avertissement, avec une durée ou un bouton, s’affiche dans un événement (quand …) : dans la page, « afficher "…" » écrit simplement un texte.`,t.ligne);return}if(i.duree){let n=sa(e,i.duree,`pendant 10 secondes`);n!==void 0&&(n<1e3||n>6e4)?e.erreur(`un message reste affiché de 1 à 60 secondes (ici : ${oa(n)}). Pour qu’il reste, écrivez « sans disparaitre ».`,i.duree.ligne):n!==void 0&&t.action===`afficherErreur`&&n<4e3&&e.avertissement(`${oa(n)}, c’est trop court pour lire une erreur : laissez au moins 4 secondes (8 par défaut).`,i.duree.ligne),i.persistant&&e.erreur(`« pendant … » et « sans disparaitre » se contredisent : gardez l’un des deux.`,t.ligne)}i.action&&(i.action.corps.length===0&&e.erreur(`le bouton « ${i.action.libelle} » du message ne fait rien : écrivez en dessous, décalé, ce qu’il fait.`,i.action.ligne),i.action.libelle.trim()===``&&e.erreur(`le bouton d’un message a besoin d’un texte : avec action "Annuler" :`,i.action.ligne),r&&e.avertissement(`un message avec un bouton, dans une minuterie : il peut disparaître avant que la personne le voie. Écrivez-le plutôt dans l’événement d’un clic.`,t.ligne))}}function la(e,t,n){n.page&&!n.auPremierNiveau&&e.erreur(`une minuterie de la page s’écrit au premier niveau de la page (elle démarre à son ouverture), ou dans un événement.`,t.ligne);let r=t.mode===`apres`?`apres 3 secondes`:`toutes les 5 secondes`,i=sa(e,t.duree,r);t.mode===`toutes`&&i!==void 0&&i<250?e.erreur(`« toutes les ${oa(i)} » réveillerait l’appareil plus de quatre fois par seconde : au moins 250 millisecondes. Pour une animation, utilisez le CSS.`,t.duree.ligne):t.mode===`toutes`&&i!==void 0&&i<1e3&&e.avertissement(`« toutes les ${oa(i)} » : moins d’une seconde, c’est beaucoup de travail pour l’appareil. Une seconde suffit souvent.`,t.duree.ligne),t.mode===`apres`&&t.tantQue&&e.erreur(`« tant que » suit « toutes les … » : une minuterie « apres … » ne passe qu’une fois. Écrivez un « si » dans son bloc.`,t.ligne),t.corps.length===0&&e.erreur(`cette minuterie ne fait rien : écrivez en dessous, décalé, ce qu’elle fait.`,t.ligne),n.survol&&e.avertissement(`une minuterie dans « survole » repart à chaque passage du pointeur : préférez un clic.`,t.ligne),n.page&&t.mode===`toutes`&&!t.tantQue&&ua(t.corps)&&!da(t.corps)&&e.avertissement(`cette page se met à jour toute seule, sans moyen de l’arrêter : ajoutez une pause avec une variable, par exemple « toutes les 5 secondes tant que actif est vrai : » et un bouton qui change « actif ».`,t.ligne)}function ua(e){return fa(e).some(e=>[`Affectation`,`ModificationListe`,`Requete`,`Rechargement`].includes(e.type))}function da(e){return fa(e).some(e=>e.type===`Arreter`)}function fa(e){let t=[];for(let n of e)t.push(n),n.type===`Condition`||n.type===`Confirmer`?t.push(...fa(n.alors),...fa(n.sinon)):n.type===`Boucle`||n.type===`TantQue`||n.type===`Repeter`||n.type===`Minuterie`||n.type===`Bloc`||n.type===`Formulaire`||n.type===`Fenetre`?t.push(...fa(n.corps)):n.type===`Selon`?t.push(...n.cas.flatMap(e=>fa(e.corps)),...fa(n.sinon)):n.type===`Action`&&n.message?.action&&t.push(...fa(n.message.action.corps));return t}function pa(e,t,n,r){if(n.dansLaPage)return e.erreur(`« ${t} » demande un geste de la personne : il s’écrit dans un événement (quand l’utilisateur clique sur …).`,r),!1;if(n.sansGeste){let i=n.sansGeste===`chargement`?`à l’ouverture de la page`:`dans une minuterie`;return e.erreur(`« ${t} » ${i} : personne n’a rien demandé, et le navigateur le refuserait. Écrivez-le dans l’événement d’un clic.`,r),!1}return n.apresUneAttente&&e.avertissement(`« ${t} » après une attente (une requête ou une question) : le navigateur, surtout Safari, peut le refuser, le geste de la personne étant passé. Placez « ${t} » avant l’attente.`,r),!0}function ma(e,t,n){let r=e.typeDe(t.valeur);pa(e,`copier`,n,t.ligne)&&(H(r)&&r.genre!==`texte`&&r.genre!==`nombre`&&e.erreur(`« copier » attend un texte ou un nombre ; ici, c’est ${V(r)}. Écrivez le texte voulu : copier "{p.nom}".`,t.ligne),t.message===``&&e.erreur(`le message de « copier » est vide : écrivez un texte, ou « sans message ».`,t.ligne))}function ha(e,t,n){e.typeDe(t.texte),t.titre&&e.typeDe(t.titre),pa(e,`partager`,n,t.ligne)}function ga(e,t,n){if(e.typeDe(t.question),n.dansLaPage){e.erreur(`« confirmer » pose une question à la personne : il s’écrit dans un événement (quand l’utilisateur clique sur …).`,t.ligne);return}if(n.sansGeste){let r=n.sansGeste===`chargement`?`à l’ouverture de la page`:`dans une minuterie`;e.erreur(`« confirmer » ${r} : personne n’a rien demandé à ce moment-là. Posez la question après un clic.`,t.ligne);return}n.dansUneAction&&e.erreur(`pas de « confirmer » dans le bouton d’un message : le bouton « Annuler » remplace déjà la question.`,t.ligne);for(let[n,r]of[[`oui`,t.oui],[`non`,t.non]])r!==void 0&&r.trim()===``&&e.erreur(`le bouton « ${n} » de la question n’a pas de texte : avec ${n} "…".`,t.ligne);let r=t.oui??`Oui`,i=t.non??`Non`;A(r.trim())===A(i.trim())&&e.erreur(`les deux boutons de la question s’appellent « ${r} » : la personne ne saurait pas lequel choisir. Donnez-leur des verbes différents (« Supprimer » et « Garder »).`,t.ligne),t.alors.length===0&&e.erreur(`« confirmer » sans rien à faire si la personne répond oui : écrivez en dessous, décalé, ce qui doit se passer.`,t.ligne),n.profondeur>=2&&e.avertissement(`trois questions de suite, c’est beaucoup : une ou deux suffisent.`,t.ligne)}function _a(e,t,n){n.dansUnEvenement&&e.erreur(`une fenêtre ne se crée pas dans un événement : écrivez-la dans la page, puis ouvrez-la avec montrer "…".`,t.ligne),n.dansUneFenetre&&e.erreur(`une fenêtre dans une fenêtre perd les personnes qui utilisent le clavier : placez-la à côté de l’autre, dans la page.`,t.ligne),t.titre.trim()===``&&e.erreur(`une fenêtre a besoin d’un titre : fenetre "Détails" :`,t.ligne)}function va(e,t,n,r){n?t.obligatoire&&!r&&e.avertissement(`la fenêtre « ${t.nom??t.titre} » est obligatoire, et rien ne la ferme : ajoutez un bouton qui fait cacher "${t.nom??t.titre}".`,t.ligne):e.avertissement(`la fenêtre « ${t.nom??t.titre} » ne s’ouvre jamais : ajoutez montrer "${t.nom??t.titre}" dans un événement.`,t.ligne)}const ya=[`controle`,`maj`,`alt`],ba=[`entree`,`echap`,`espace`,`tab`,`suppr`,`retour`,`haut`,`bas`,`gauche`,`droite`,`debut`,`fin`,`plus`,`moins`],xa=[`/`,`?`],Sa=[`controle+t`,`controle+w`,`controle+n`,`controle+l`,`controle+r`,`controle+q`,`controle+tab`,`controle+maj+t`,`controle+maj+n`,`alt+f4`,`f5`,`f11`,`f12`];function Ca(e){let t=`modificateurs ${ya.join(`, `)} ; touches : une lettre, un chiffre, ${ba.join(`, `)}, f1 à f12, / et ?`,n=A(e.trim()).split(/\s*\+\s*/).map(e=>e===``?`+`:e);if(e.trim()===``||n.some(e=>e===`+`))return{erreur:`« ${e} » n’est pas une touche : écrivez par exemple "controle+k" (${t}).`};let r=n[n.length-1],i=n.slice(0,-1),a=/^[a-z0-9]$/.test(r)||ba.includes(r)||xa.includes(r)||/^f([1-9]|1[0-2])$/.test(r),o=[...i.filter(e=>!ya.includes(e)),...a?[]:[r]][0];if(o!==void 0){let n={ctrl:`controle`,cmd:`controle`,commande:`controle`,shift:`maj`,majuscule:`maj`,esc:`echap`,escape:`echap`,enter:`entree`}[o];return{erreur:`la touche « ${o} » n’existe pas dans « ${e} »${n?` : écrivez « ${n} »`:``}. Touches possibles : ${t}.`}}return new Set(i).size===i.length?{touches:[...ya.filter(e=>i.includes(e)),r].join(`+`)}:{erreur:`« ${e} » répète un modificateur.`}}function wa(e,t,n,r){let i=Ca(t);if(`erreur`in i){e.erreur(i.erreur,n);return}return Sa.includes(i.touches)?e.avertissement(`« ${t} » est souvent gardé par le navigateur ou le système : il peut ne pas laisser passer cette touche. Choisissez-en une autre.`,n):!r.dansUnChamp&&/^[a-z0-9]$/.test(i.touches)&&e.avertissement(`un raccourci d’une seule lettre (« ${t} ») se déclenche sans le vouloir avec la reconnaissance vocale : ajoutez controle ou alt (par exemple "alt+${i.touches}").`,n),i.touches}function Ta(e,t,n,r){if(r){e.erreur(`« ${t.genre===`saisie`?`ecrit dans`:`arrete d’ecrire dans`} » suit un seul champ : placez le champ et son événement hors de la boucle.`,t.ligne);return}(n===`case`||n===`choix`||n===`liste`)&&e.erreur(`on ne tape pas dans « ${t.cible} » (une case à cocher, un choix ou une liste) : « ecrit » et « arrete d’ecrire » vont avec un champ où l’on écrit.`,t.ligne),t.genre===`pauseSaisie`&&Ea(e,t),Da(e,t,n===`motDePasse`)}function Ea(e,t){if(!t.duree)return;let n=sa(e,t.duree,`apres 300 millisecondes`);n===void 0&&t.duree.valeur.type!==`Nombre`?e.erreur(`la pause d’une frappe s’écrit en chiffres : apres 500 millisecondes.`,t.duree.ligne):n!==void 0&&(n<100||n>5e3)&&e.erreur(`la pause d’une frappe va de 100 millisecondes à 5 secondes (ici : ${oa(n)}) ; 300 millisecondes par défaut.`,t.duree.ligne)}function Da(e,t,n){let r=fa(t.corps).some(e=>e.type===`Requete`||e.type===`Rechargement`);n&&r?e.avertissement(`ce que la personne tape dans un mot de passe ne doit pas partir sur le réseau à chaque touche : vérifiez-le à l’envoi du formulaire.`,t.ligne):t.genre===`saisie`&&r&&e.avertissement(`« ecrit dans » envoie une requête à chaque touche : utilisez « arrete d’ecrire dans … » pour attendre une pause.`,t.ligne)}function Oa(e,t,n){let r=fa(t.corps);r.some(e=>e.type===`Requete`||e.type===`Rechargement`||e.type===`ModificationListe`&&e.operation===`ajouter`)||e.avertissement(`rien ne grandit quand le bas est atteint : ajoutez des éléments (ajouter … a …) ou chargez la suite (envoyer requete …).`,t.ligne);let i=new Set(r.flatMap(e=>e.type===`Affectation`?[e.nom]:e.type===`ModificationListe`?[e.liste]:e.type===`Requete`&&e.resultat?[e.resultat]:[]));t.tantQue&&n.length>0&&!n.some(e=>i.has(e))&&e.avertissement(`cet événement ne change jamais « ${n[0]} » : il ne s’arrêtera pas tout seul.`,t.ligne),t.bouton===null&&e.avertissement(`sans bouton « Voir plus », une personne au clavier ne peut plus atteindre le bas de la page : gardez le bouton (avec bouton "…").`,t.ligne)}function ka(e,t,n,r){e.erreur(`deux fenêtres s’appellent « ${t} » (lignes ${n} et ${r}) : montrer "${t}" ne saurait pas laquelle ouvrir. Donnez un nom à l’une d’elles : avec nom "…".`,r)}function Aa(e,t,n,r){e.erreur(`le nom « ${t} » est déjà donné à un bloc (ligne ${n}).`,r)}function ja(e,t,n,r,i){e.erreur(`aucun champ « ${t} » dans la page « ${n} »${r.length?`. Champs : ${r.join(`, `)}`:``}.`,i)}function Ma(e,t,n,r){n===void 0?e.erreur(`aucun bloc nommé « ${t} » dans la page : nommez le bloc qui grandit, par exemple section "Produits" avec nom "${t}" :`,r):e.erreur(`le bloc « ${t} » a déjà son « arrive en bas de » (ligne ${n}) : réunissez les deux.`,r)}function Na(e,t,n){return n.dansUnEvenement?(e.erreur(`« avec deplacement » s’écrit sur une boucle de la page, qui affiche la liste : pas dans un événement.`,t.ligne),!1):n.variable===void 0?(e.erreur(`on ne peut déplacer que les éléments d’une liste écrite dans une variable (pas un calcul ni une liste filtrée) : variable taches = [...], puis pour chaque t dans taches avec deplacement :`,t.ligne),!1):n.deja===void 0?(fa(t.corps).some(e=>e.type===`Element`&&e.element===`champ`)&&e.avertissement(`un champ dans une liste qu’on déplace : prendre un élément gêne la sélection du texte. Placez le champ hors de la boucle.`,t.ligne),!0):(e.erreur(`la liste « ${n.variable} » a déjà une boucle avec deplacement (ligne ${n.deja}) : une seule par liste.`,t.ligne),!1)}function Pa(e,t,n,r){e.erreur(`le raccourci « ${t} » est déjà pris dans cette page (ligne ${n}) : choisissez d’autres touches.`,r)}function Fa(e,t,n){n||e.erreur(`personne ne déplace rien dans « ${t.variable} » : écrivez pour chaque … dans ${t.variable} avec deplacement :`,t.ligne)}function Ia(e,t){if(![`bouton`,`lien`,`champ`].includes(t.element)){e.erreur(`« avec raccourci » s’applique à un bouton, un lien ou un champ : un ${t.element} ne se clique pas.`,t.ligne);return}return wa(e,t.raccourci??``,t.ligne,{dansUnChamp:!1})}function U(e){return e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)}var La=class{elements=[];formulaires=[];ids=new Map;idsPris=new Set;constructor(e,t){this.recenser(e.corps,t)}idDe(e){return this.ids.get(e)}parId(e){return this.elements.find(t=>t.id===e)}elementsDe(e){let t=new Set;return Ra(e,e=>t.add(e)),this.elements.filter(e=>t.has(e.noeud))}formulairesDe(e){let t=new Set;return Ra(e,()=>{},e=>t.add(e)),this.formulaires.filter(e=>t.has(e.noeud))}resoudre(e,t,n){let r=(n??this.elements).filter(e=>!t||e.noeud.element===t),i=r.filter(t=>t.nom===e);if(i.length>0)return{ids:i.map(e=>e.id)};let a=r.filter(t=>t.libelle===e);return a.length===0?{erreur:`inconnu`}:a.length>1?{erreur:`ambigu`,lignes:[a[0].ligne,a[1].ligne]}:{ids:[a[0].id]}}recenser(e,t,n){for(let r of e)if(r.type===`Element`){let e=this.ajouter(r,t);n&&r.element===`champ`&&n.champs.push(e)}else if(r.type===`Condition`)this.recenser(r.alors,t,n),this.recenser(r.sinon,t,n);else if(r.type===`Boucle`||r.type===`Bloc`||r.type===`Fenetre`)this.recenser(r.corps,t,n);else if(r.type===`Formulaire`){let e=n??this.ajouterFormulaire(r);this.recenser(r.corps,t,e)}}ajouterFormulaire(e){let t=`formulaire_${U(e.nom)||`ligne_${e.ligne}`}`,n=t;for(let e=2;this.idsPris.has(n);e++)n=`${t}_${e}`;this.idsPris.add(n);let r={noeud:e,id:n,nom:e.nom,champs:[],ligne:e.ligne};return this.formulaires.push(r),r}ajouter(e,t){let n=e.contenu,r=n.type===`Chaine`&&n.parties.every(e=>e.type===`texte`)?n.parties.map(e=>e.valeur).join(``):void 0;if(e.nom!==void 0){let n=this.elements.find(t=>t.nom===e.nom);n&&t.push({gravite:`erreur`,message:`le nom « ${e.nom} » est déjà donné à un élément (ligne ${n.ligne}).`,ligne:e.ligne})}let i=e.nom!==void 0&&U(e.nom)||r!==void 0&&U(r)&&`${e.element}_${U(r)}`||`${e.element}_ligne_${Mc(e.ligne)}`,a=i;for(let e=2;this.idsPris.has(a);e++)a=`${i}_${e}`;return this.idsPris.add(a),this.ids.set(e,a),this.elements.push({noeud:e,id:a,nom:e.nom,libelle:r,ligne:e.ligne}),a}};function Ra(e,t,n=()=>{}){for(let r of e)r.type===`Element`?t(r):r.type===`Condition`?(Ra(r.alors,t,n),Ra(r.sinon,t,n)):r.type===`Boucle`||r.type===`Bloc`||r.type===`Fenetre`?Ra(r.corps,t,n):r.type===`Formulaire`&&(n(r),Ra(r.corps,t,n))}const za=[{nom:`panier`,lucide:`shopping-cart`,alias:[`caddie`,`chariot`]},{nom:`sac`,lucide:`shopping-bag`,alias:[`cabas`]},{nom:`maison`,lucide:`house`,alias:[`accueil`]},{nom:`recherche`,lucide:`search`,alias:[`loupe`,`chercher`]},{nom:`utilisateur`,lucide:`user`,alias:[`profil`,`personne`,`compte`]},{nom:`utilisateurs`,lucide:`users`,alias:[`equipe`,`groupe`]},{nom:`menu`,lucide:`menu`,alias:[`hamburger`]},{nom:`fermer`,lucide:`x`,alias:[`croix`]},{nom:`plus`,lucide:`plus`,alias:[`ajouter`]},{nom:`moins`,lucide:`minus`,alias:[`retirer`]},{nom:`coche`,lucide:`check`,alias:[`valider`]},{nom:`etoile`,lucide:`star`,alias:[`favori`]},{nom:`demi_etoile`,lucide:`star-half`},{nom:`coeur`,lucide:`heart`,alias:[`aimer`]},{nom:`calendrier`,lucide:`calendar`,alias:[`date`,`agenda`]},{nom:`horloge`,lucide:`clock`,alias:[`heure`]},{nom:`telephone`,lucide:`phone`,alias:[`appel`]},{nom:`courrier`,lucide:`mail`,alias:[`mail`,`email`,`enveloppe`]},{nom:`lieu`,lucide:`map-pin`,alias:[`adresse`,`position`]},{nom:`carte`,lucide:`map`,alias:[`plan`]},{nom:`soleil`,lucide:`sun`,alias:[`clair`]},{nom:`lune`,lucide:`moon`,alias:[`sombre`,`nuit`]},{nom:`fleche_droite`,lucide:`arrow-right`},{nom:`fleche_gauche`,lucide:`arrow-left`},{nom:`fleche_haut`,lucide:`arrow-up`},{nom:`fleche_bas`,lucide:`arrow-down`},{nom:`chevron_droite`,lucide:`chevron-right`},{nom:`chevron_gauche`,lucide:`chevron-left`},{nom:`chevron_haut`,lucide:`chevron-up`},{nom:`chevron_bas`,lucide:`chevron-down`},{nom:`info`,lucide:`info`,alias:[`information`]},{nom:`alerte`,lucide:`triangle-alert`,alias:[`attention`,`avertissement`]},{nom:`erreur`,lucide:`circle-x`},{nom:`succes`,lucide:`circle-check`,alias:[`reussite`]},{nom:`aide`,lucide:`circle-help`,alias:[`question`]},{nom:`parametres`,lucide:`settings`,alias:[`reglages`,`engrenage`]},{nom:`sortie`,lucide:`log-out`,alias:[`deconnexion`]},{nom:`entree`,lucide:`log-in`,alias:[`connexion`]},{nom:`cadenas`,lucide:`lock`,alias:[`verrou`]},{nom:`cle`,lucide:`key`},{nom:`oeil`,lucide:`eye`,alias:[`voir`]},{nom:`oeil_barre`,lucide:`eye-off`,alias:[`masquer`]},{nom:`corbeille`,lucide:`trash-2`,alias:[`poubelle`,`supprimer`]},{nom:`modifier`,lucide:`pencil`,alias:[`crayon`,`editer`]},{nom:`copier`,lucide:`copy`},{nom:`telecharger`,lucide:`download`},{nom:`envoyer`,lucide:`send`},{nom:`partager`,lucide:`share-2`},{nom:`lien`,lucide:`link`,alias:[`chaine`]},{nom:`image`,lucide:`image`},{nom:`photo`,lucide:`camera`,alias:[`appareil_photo`]},{nom:`video`,lucide:`video`,alias:[`camera`]},{nom:`musique`,lucide:`music`},{nom:`livre`,lucide:`book-open`,alias:[`lecture`]},{nom:`document`,lucide:`file-text`,alias:[`fichier`,`texte`]},{nom:`dossier`,lucide:`folder`},{nom:`filtre`,lucide:`funnel`,alias:[`entonnoir`]},{nom:`tri`,lucide:`arrow-up-down`,alias:[`trier`]},{nom:`liste`,lucide:`list`},{nom:`grille`,lucide:`layout-grid`,alias:[`mosaique`]},{nom:`cloche`,lucide:`bell`,alias:[`notification`]},{nom:`message`,lucide:`message-circle`,alias:[`bulle`]},{nom:`discussion`,lucide:`messages-square`,alias:[`conversation`,`chat`]},{nom:`couverts`,lucide:`utensils`,alias:[`restaurant`,`repas`]},{nom:`cafe`,lucide:`coffee`,alias:[`the`]},{nom:`vin`,lucide:`wine`,alias:[`verre`]},{nom:`poisson`,lucide:`fish`},{nom:`feuille`,lucide:`leaf`,alias:[`nature`,`bio`]},{nom:`flamme`,lucide:`flame`,alias:[`feu`,`piquant`]},{nom:`goutte`,lucide:`droplet`,alias:[`eau`]},{nom:`vagues`,lucide:`waves`,alias:[`fleuve`,`mer`]},{nom:`voiture`,lucide:`car`,alias:[`auto`]},{nom:`velo`,lucide:`bike`},{nom:`avion`,lucide:`plane`},{nom:`bateau`,lucide:`ship`},{nom:`train`,lucide:`train-front`},{nom:`carte_bancaire`,lucide:`credit-card`,alias:[`paiement`]},{nom:`argent`,lucide:`banknote`,alias:[`billet`]},{nom:`cadeau`,lucide:`gift`},{nom:`etiquette`,lucide:`tag`,alias:[`prix`]},{nom:`recompense`,lucide:`award`,alias:[`medaille`]},{nom:`trophee`,lucide:`trophy`},{nom:`eclair`,lucide:`zap`,alias:[`rapide`]},{nom:`globe`,lucide:`globe`,alias:[`monde`,`langue`]},{nom:`wifi`,lucide:`wifi`},{nom:`batterie`,lucide:`battery`},{nom:`mobile`,lucide:`smartphone`,alias:[`smartphone`]},{nom:`ordinateur`,lucide:`monitor`,alias:[`ecran`]},{nom:`imprimante`,lucide:`printer`,alias:[`imprimer`]},{nom:`micro`,lucide:`mic`},{nom:`son`,lucide:`volume-2`,alias:[`haut_parleur`]},{nom:`muet`,lucide:`volume-x`},{nom:`lecture_media`,lucide:`play`,alias:[`jouer`]},{nom:`pause`,lucide:`pause`},{nom:`stop`,lucide:`square`,alias:[`arreter`,`carre`]},{nom:`rafraichir`,lucide:`refresh-cw`,alias:[`actualiser`,`recharger`]},{nom:`plus_cercle`,lucide:`circle-plus`},{nom:`moins_cercle`,lucide:`circle-minus`},{nom:`points`,lucide:`ellipsis`,alias:[`plus_options`]},{nom:`points_verticaux`,lucide:`ellipsis-vertical`},{nom:`epingle`,lucide:`pin`},{nom:`drapeau`,lucide:`flag`},{nom:`signet`,lucide:`bookmark`,alias:[`marque_page`]},{nom:`ampoule`,lucide:`lightbulb`,alias:[`idee`]},{nom:`bouclier`,lucide:`shield`,alias:[`securite`]}],Ba=e=>e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().replace(/[\s-]+/g,`_`),Va=new Map;for(let e of za){Va.set(e.nom,e);for(let t of e.alias??[])Va.set(t,e)}function Ha(e){return Va.get(Ba(e))}function Ua(e,t){let n=Array.from({length:e.length+1},(e,n)=>[n,...Array(t.length).fill(0)]);for(let e=1;e<=t.length;e++)n[0][e]=e;for(let r=1;r<=e.length;r++)for(let i=1;i<=t.length;i++)n[r][i]=Math.min(n[r-1][i]+1,n[r][i-1]+1,n[r-1][i-1]+(e[r-1]===t[i-1]?0:1));return n[e.length][t.length]}function Wa(e){let t=Ba(e),n;for(let e of Va.keys()){let r=Ua(t,e);(!n||r<n.d)&&(n={nom:e,d:r})}return n&&n.d<=Math.max(1,Math.floor(t.length/4))?Va.get(n.nom).nom:void 0}const Ga=e=>/\p{Extended_Pictographic}/u.test(e);function Ka(e){return e.type===`Chaine`&&e.parties.every(e=>e.type===`texte`)?e.parties.map(e=>e.valeur).join(``):void 0}const qa=(e,t)=>e.find(e=>A(e.propriete)===t);function Ja(e,t,n){if(Ga(e))n.erreur(`une icône est un dessin, pas un émoji : écrivez son nom, par exemple icone "panier". Icônes possibles : ${za.slice(0,12).map(e=>e.nom).join(`, `)}…`,t);else if(!Ha(e)){let r=Wa(e);n.erreur(`l'icône « ${e} » n'existe pas.${r?` Peut-être « ${r} » ?`:` Icônes possibles : ${za.slice(0,12).map(e=>e.nom).join(`, `)}…`}`,t)}}function Ya(e,t){let{ligne:n,contenu:r,styles:i}=e,a=qa(i,`icone`);a&&Ja(a.valeur,n,t);let o=Ka(r);switch(e.element){case`icone`:o===void 0?t.erreur(`le nom de l'icône s'écrit entre guillemets, sans {variable} : icone "panier".`,n):Ja(o,n,t);break;case`badge`:o!==void 0&&o.length>12&&t.avertissement(`un badge est court : « `+o+` » a plus de 12 caractères.`,n);break;case`avatar`:o!==void 0&&o.trim()===``&&t.erreur(`un avatar prend le nom de la personne : avatar "Camille Martin".`,n);break;case`progression`:{let i=t.typeDe(r);r.type!==`Rien`&&H(i)&&i.genre!==`nombre`&&t.erreur(`une progression prend un nombre (ici, ${V(i)}) : progression 40, ou rien pour une barre qui avance sans fin.`,n);let a=e.maximum??100;a<=0&&t.erreur(`le maximum d'une progression doit être positif.`,n),r.type===`Nombre`&&r.valeur>a&&t.avertissement(`la valeur ${r.valeur} dépasse le maximum ${a} de la progression.`,n);break}case`etoiles`:{let a=t.typeDe(r);H(a)&&a.genre!==`nombre`&&t.erreur(`des étoiles prennent un nombre (ici, ${V(a)}) : etoiles 4.`,n);let o=e.maximum??5;(o<1||o>10)&&t.erreur(`des étoiles vont de 1 à 10 au maximum (5 par défaut) : etoiles note avec maximum 10.`,n),qa(i,`modifiable`)&&r.type!==`Reference`&&t.erreur(`des étoiles « modifiable » changent une variable : écrivez variable note = 3, puis etoiles note avec modifiable.`,n);break}case`compteur`:{if(r.type!==`Reference`){t.erreur(`un compteur change une variable : écrivez variable quantite = 1 d'abord, puis compteur quantite.`,n);break}let i=t.typeDe(r);H(i)&&i.genre!==`nombre`&&t.erreur(`un compteur change une variable de type nombre (« ${r.nom} » est ${V(i)}).`,n),e.minimum!==void 0&&e.maximum!==void 0&&e.minimum>e.maximum&&t.erreur(`le minimum (${e.minimum}) du compteur dépasse son maximum (${e.maximum}).`,n);break}case`qr`:o!==void 0&&new TextEncoder().encode(o).length>2900&&t.erreur(`ce texte est trop long pour un code QR (2 900 caractères au plus).`,n)}}const Xa=(e,t)=>{let n=qa(e,t);return n?Number(n.valeur):void 0};function Za(e,t,n){let r=e=>e.filter(e=>e.type===`Bloc`),i=qa(e.styles,`icone`);switch(i&&Ja(i.valeur,e.ligne,n),e.genre){case`onglets`:{let t=e.corps.find(e=>e.type!==`Bloc`||e.genre!==`onglet`);t&&n.erreur(`« onglets » ne contient que des onglets : onglet "Description" : …`,`ligne`in t?t.ligne:e.ligne);let i=r(e.corps).filter(e=>e.genre===`onglet`);i.length===0&&n.erreur(`« onglets » doit contenir au moins un onglet : onglet "Description" : …`,e.ligne),i.length===1&&n.avertissement(`un seul onglet : à quoi bon des onglets ?`,e.ligne),i.filter(e=>qa(e.styles,`ouvert`)).length>1&&n.erreur(`un seul onglet peut être « ouvert » au départ.`,e.ligne);break}case`onglet`:t?.genre!==`onglets`&&n.erreur(`un onglet se place dans un bloc « onglets ».`,e.ligne),e.titre||n.erreur(`un onglet a un titre entre guillemets : onglet "Avis" :`,e.ligne);break;case`accordeon`:{let t=e.corps.find(e=>e.type!==`Bloc`||e.genre!==`deroulant`);t&&n.erreur(`« accordeon » ne contient que des deroulant : deroulant "Question" : …`,`ligne`in t?t.ligne:e.ligne),r(e.corps).filter(e=>qa(e.styles,`ouvert`)).length>1&&!qa(e.styles,`plusieurs`)&&n.erreur(`dans un accordéon, un seul deroulant est « ouvert » à la fois (ou écrivez « accordeon avec plusieurs »).`,e.ligne);break}case`deroulant`:e.titre||n.erreur(`un deroulant a un titre entre guillemets : deroulant "Détails" :`,e.ligne);break;case`carrousel`:{e.corps.length===0&&n.erreur(`un carrousel est vide : mettez-y des images ou des blocs, une diapositive par élément.`,e.ligne);let t=Xa(e.styles,`visibles`);t!==void 0&&(t<1||t>4)&&n.erreur(`un carrousel montre de 1 à 4 diapositives à la fois (visibles 1 à 4).`,e.ligne);let r=Xa(e.styles,`automatique`);r!==void 0&&(r<2||r>60)&&n.erreur(`le défilement automatique va de 2 à 60 secondes : automatique 5.`,e.ligne);break}case`filAriane`:{let t=e.corps.find(e=>e.type!==`Element`||e.element!==`lien`&&e.element!==`texte`);t&&n.erreur(`un fil d'Ariane ne contient que des liens, puis un texte pour la page en cours.`,`ligne`in t?t.ligne:e.ligne);let r=e.corps[e.corps.length-1];e.corps.length<2?n.erreur(`un fil d'Ariane a au moins deux éléments : un lien, puis le texte de la page en cours.`,e.ligne):r.type===`Element`&&r.element!==`texte`&&n.erreur(`le dernier élément d'un fil d'Ariane est la page en cours : un texte, pas un lien.`,r.ligne);break}}}const Qa={bleu:{clair:`#1f5fbf`,sombre:`#7fb0ff`,encreClair:`#ffffff`,encreSombre:`#141416`},rouge:{clair:`#c62828`,sombre:`#ff8a80`,encreClair:`#ffffff`,encreSombre:`#141416`},vert:{clair:`#2e7d32`,sombre:`#81c784`,encreClair:`#ffffff`,encreSombre:`#141416`},jaune:{clair:`#f2c200`,sombre:`#ffe066`,encreClair:`#1d1d1f`,encreSombre:`#141416`},orange:{clair:`#e65100`,sombre:`#ffab70`,encreClair:`#ffffff`,encreSombre:`#141416`},violet:{clair:`#6a3fb5`,sombre:`#c3a6ff`,encreClair:`#ffffff`,encreSombre:`#141416`},rose:{clair:`#c2185b`,sombre:`#f48fb1`,encreClair:`#ffffff`,encreSombre:`#141416`},gris:{clair:`#5f6368`,sombre:`#b0b3b8`,encreClair:`#ffffff`,encreSombre:`#141416`},noir:{clair:`#1d1d1f`,sombre:`#000000`,encreClair:`#ffffff`,encreSombre:`#f2f2f4`},blanc:{clair:`#ffffff`,sombre:`#ffffff`,encreClair:`#1d1d1f`,encreSombre:`#141416`}},$a=new Set([`image`,`photo`]);function eo(e,t,n=[`clair`,`sombre`]){let r=[],i=(e,t,n)=>r.push({gravite:e,categorie:`accessibilite`,message:t,ligne:n}),a=0,o=1,s=new Map,c=[],l=new Set,u=(r,d=new Map)=>{for(let f of r)if(f.type===`Element`){let r=f,c=Ka(r.contenu),l=e=>r.styles.find(t=>t.propriete===e);if([`bouton`,`lien`,`champ`].includes(r.element)&&c!==void 0&&c.trim()===``)i(`erreur`,`le ${r.element} n'a pas de texte. Écrivez un libellé entre guillemets.`,r.ligne);else if(r.element===`champ`&&c!==void 0){/\p{L}/u.test(c)||i(`avertissement`,`le libellé « ${c} » du champ ne contient aucune lettre.`,r.ligne);let e=d.get(c.toLocaleLowerCase(`fr`));e===void 0?d.set(c.toLocaleLowerCase(`fr`),r.ligne):i(`avertissement`,`deux champs du même formulaire portent « ${c} » (premier ligne ${e}). Donnez-leur des libellés différents.`,r.ligne)}if(r.element===`image`){let e=l(`description`)?.valeur;e!==void 0&&(e.trim().length<3||$a.has(e.toLocaleLowerCase(`fr`))||e===c||/^IMG[_-]?\d+/i.test(e))&&i(`avertissement`,`la description « ${e} » de l'image ne dit rien. Décrivez ce qu'elle montre.`,r.ligne)}if(r.element===`icone`&&!l(`description`)&&!l(`decoratif`)&&i(`avertissement`,`cette icône seule n’a pas de description pour le lecteur d’écran. Ajoutez « avec description "…" » ou « avec decoratif ». `,r.ligne),r.element===`etoiles`&&!l(`description`)&&i(`avertissement`,`ces étoiles n’ont pas de description explicite. Ajoutez « avec description "Note : 4 sur 5" ». `,r.ligne),r.element===`lien`&&c!==void 0&&/^(ici|cliquez ici|lire la suite|en savoir plus)$/i.test(c.trim())){let e=s.get(c.toLocaleLowerCase(`fr`))??new Set;(e.size===0||!e.has(r.cible??``))&&i(`avertissement`,`le lien « ${c} » n'explique pas sa destination. Écrivez un libellé plus précis.`,r.ligne),e.add(r.cible??``),s.set(c.toLocaleLowerCase(`fr`),e)}if(r.element===`titre`&&(a++,a>1&&i(`avertissement`,`la page « ${e.nom} » a plusieurs titres principaux. Gardez un seul « titre ».`,r.ligne)),r.element===`soustitre`){let e=r.niveau??2;if(e<2||e>6){i(`erreur`,`le niveau d’un sous-titre doit être entre 2 et 6.`,r.ligne);continue}a===0&&i(`avertissement`,`ce sous-titre apparaît avant le titre principal de la page.`,r.ligne),e>o+1&&i(`avertissement`,`ce sous-titre fait un saut de niveau : après ${o}, écrivez un niveau ${o+1}.`,r.ligne),o=e}[`texte`,`titre`,`bouton`,`lien`,`champ`].includes(r.element)&&to(r,t,n,i)}else if(f.type===`Formulaire`)u(f.corps,new Map);else if(f.type===`Evenement`)f.genre===`survol`&&c.push({cible:f.cible,ligne:f.ligne}),f.genre===`clic`&&l.add(f.cible),u(f.corps,d);else if(f.type===`Bloc`||f.type===`Boucle`)u(f.corps,d);else if(f.type===`Condition`){let e=a;u(f.alors,d);let t=a;a=e,u(f.sinon,d),a=Math.max(a,t)}};u(e.corps);for(let e of c)l.has(e.cible)||i(`avertissement`,`ce survol n’a pas d’action au clic : le clavier et les écrans tactiles ne peuvent pas le déclencher.`,e.ligne);let d=JSON.stringify(e.corps).includes(`"type":"SousPage"`);return a===0&&!d&&i(`avertissement`,`la page « ${e.nom} » n'a pas de titre principal. Ajoutez « titre "…" ».`,e.ligne),r}function to(e,t,n,r){let i=t=>e.styles.find(e=>e.propriete===t)?.valeur,a=i(`couleur`)??i(`texte`),o=i(`fond`);if(!a&&!o)return;let s=i(`taille`)===`grande`?3:4.5;for(let i of n){let n=e=>t.get(e)?.[i]??Qa[e]?.[i],c=o?n(o):Kn[i],l=a?n(a):c?Qn(c):void 0;if(!c||!l)continue;let u=Zn(l,c);if(u>=s)continue;let d=Object.entries(Qa).filter(([,e])=>Zn(e[i],c)>=s).map(([e])=>e).slice(0,3);r(`avertissement`,`le contraste du texte en ${a??`couleur calculée`} est ${u.toFixed(1).replace(`.`,`,`)} en mode ${i} ; il faut ${s.toString().replace(`.`,`,`)}. Essayez ${d.join(`, `)}.`,e.ligne)}}function no(e,t=1){let n=t,r=e=>{for(let i of e)if(i.type===`Element`&&i.element===`titre`)n=1;else if(i.type===`Element`&&i.element===`soustitre`){if(i.niveau===void 0){let e=Math.min(t+1,6);e!==2&&(i.niveau=e),n=e}else n=i.niveau}else if(i.type===`Bloc`&&i.genre===`section`)io(i.corps,n);else if(i.type===`Bloc`)no(i.corps,n);else{for(let e of[`corps`,`alors`,`sinon`]){let t=i[e];Array.isArray(t)&&i.type!==`Evenement`&&r(t)}if(i.type===`Selon`)for(let e of i.cas)r(e.corps)}};r(e)}function ro(e,t=[]){for(let n of e)if(n.type===`Element`&&n.element===`soustitre`&&t.push(n),n.type!==`Evenement`){for(let e of[`corps`,`alors`,`sinon`]){let r=n[e];Array.isArray(r)&&ro(r,t)}if(n.type===`Selon`)for(let e of n.cas)ro(e.corps,t)}return t}function io(e,t){let n=ro(e),r=new Set(n.filter(e=>e.niveau===void 0));no(e,t);let[i,...a]=n;if(!i)return;let o=Math.min((i.niveau??2)+1,6);for(let e of a)r.has(e)&&(e.niveau??2)<o&&(e.niveau=o)}const ao=/^(authorization|cookie|proxy-authorization|x-api-key|x-auth-token|x-access-token|api-key|apikey|x-csrf-token)$/i,oo=[/\bsk_(live|test)_/i,/\bsk-[A-Za-z0-9]{16,}/,/\bghp_[A-Za-z0-9]{20,}/,/\bgithub_pat_/,/\bxox[abprs]-/,/\bAKIA[0-9A-Z]{12,}/,/-----BEGIN [A-Z ]*PRIVATE KEY-----/,/\brk_live_/],so=e=>oo.some(t=>t.test(e)),co=e=>e.replace(/^\/+/,``).replace(/\/+$/,``);function lo(e,t,n){let r=(e,t)=>n.push({gravite:`erreur`,message:e,ligne:t}),i=(e,t)=>n.push({gravite:`avertissement`,message:e,ligne:t}),a=new Map,o=[];for(let n of e){let e=a.get(n.nom);e&&r(`la source « ${n.nom} » est déjà déclarée à la ligne ${e.ligne}.`,n.ligne),a.set(n.nom,n),n.session&&o.push(n),n.adresse===void 0&&r(`la source « ${n.nom} » n'a pas d'adresse. Écrivez adresse "https://…".`,n.ligne);let i=new Map;for(let e of n.donnees){i.has(e.nom)&&r(`la donnée « ${e.nom} » est déjà déclarée dans la source « ${n.nom} » (ligne ${i.get(e.nom).ligne}).`,e.ligne),i.set(e.nom,e);let t=new Set;for(let i of e.champs){let a=i.type;for(;a.genre===`liste`;)a=a.de;a.genre===`donnee`&&!n.donnees.some(e=>e.nom===a.nom||e.cle===a.nom)&&r(`le champ « ${i.nom} » parle de « ${a.nom} », qui n'est ni un type (texte, nombre, booleen, date) ni une donnée de la source « ${n.nom} ». Données : ${n.donnees.map(e=>e.nom).join(`, `)}.`,i.ligne),t.has(i.nom)&&r(`le champ « ${i.nom} » est déjà déclaré dans la donnée « ${e.nom} ».`,i.ligne),t.add(i.nom)}}for(let e of n.entetes)ao.test(e.nom)?r(`un en-tête « ${e.nom} » avec une valeur écrite voyagerait jusqu'au navigateur : déclarez un jeton (jeton public "…" ou jeton secret depuis l'environnement "…").`,e.ligne):so(e.valeur)&&r(`la valeur de l'en-tête « ${e.nom} » ressemble à un secret : elle serait lisible par tout le monde.`,e.ligne);let s=n.jeton;s?.genre===`public`&&so(s.valeur)&&r(`cette valeur ressemble à un secret : elle serait lisible par tout le monde. Un jeton public est fait pour être vu ; pour un secret, écrivez jeton secret depuis l'environnement "NOM".`,s.ligne),s?.genre===`secret`&&(/^[A-Za-z_][A-Za-z0-9_]*$/.test(s.valeur)||r(`« ${s.valeur} » n'est pas un nom de variable d'environnement (lettres, chiffres et _, comme METEO_CLE). La valeur du secret ne s'écrit jamais ici.`,s.ligne),t.length===0?r(`la source « ${n.nom} » a un jeton secret, qui ne peut pas partir dans le navigateur. Ajoutez un bloc serveur "…" : il fera l'appel à la place du navigateur.`,s.ligne):r(`le jeton secret de la source « ${n.nom} » passera par le serveur, mais cette passerelle n'est pas encore disponible. Le secret n'est écrit nulle part : rien n'est produit.`,s.ligne));let c=new Map;for(let e of n.routes){let t=c.get(co(e.adresse));t&&r(`la route « ${e.adresse} » est déjà déclarée dans la source « ${n.nom} » (ligne ${t.ligne}).`,e.ligne),c.set(co(e.adresse),e);for(let t of e.regles)i.has(t.donnee)||r(`la donnée « ${t.donnee} » n'existe pas dans la source « ${n.nom} ». Données : ${[...i.keys()].join(`, `)||`aucune`}.${M(t.donnee,i.keys())}`,t.ligne),t.qui!==void 0&&s?.genre!==`secret`&&r(`« qui peut » n'a de sens que pour une source à jeton secret, où le serveur Humalis est la porte. Pour « ${n.nom} », c'est l'API qui décide qui peut.`,t.ligne),t.qui===void 0&&s?.genre===`secret`&&r(`la route « ${e.adresse} » passe par le serveur (jeton secret) : écrivez qui peut l'appeler (tout le monde peut …, connecte peut …, seul admin peut …).`,t.ligne)}}if(o.length>1)for(let e of o.slice(1))r(`une seule source peut donner la session ; « ${o[0].nom} » et « ${e.nom} » le demandent.`,e.ligne);o.length>0&&t.length>0&&r(`la source « ${o[0].nom} » donne la session, mais le serveur « ${t[0].nom} » la donne déjà : une seule des deux.`,o[0].ligne);for(let t of e)t.jeton?.genre===`public`&&t.adresse?.startsWith(`http://`)&&!/^http:\/\/(localhost|127\.0\.0\.1|\[::1\])/.test(t.adresse)&&i(`la source « ${t.nom} » envoie un jeton en clair (adresse en http://) : utilisez https://.`,t.ligne)}function uo(e,t){let n=new Map;for(let r of e){if(n.has(r.nom))continue;let e=new Map;for(let n of r.donnees){let i=t.has(n.nom)?`${r.nom}_${n.nom}`.replace(/[^A-Za-z0-9_]/g,`_`):n.nom;t.set(i,n),n.cle=i,e.set(n.nom,i)}let i=t=>{t.genre===`liste`?i(t.de):t.genre===`donnee`&&(t.nom=e.get(t.nom)??t.nom)};for(let e of r.donnees)for(let t of e.champs)i(t.type);n.set(r.nom,{source:r,cles:e})}return n}function fo(e,t){return e.routes.find(e=>co(e.adresse)===co(t))}function po(e,t,n){return e.regles.find(e=>e.action===t&&(n===void 0||e.liste===n))}function mo(e,t,n,r){if(e.source===void 0){r(`« filtrant par » demande la source visée : envoyer requete vers "…" de la source "nom" filtrant par …`,e.ligne);return}let i=t.get(e.source);if(!i){r(`aucune source « ${e.source} ». Sources : ${[...t.keys()].join(`, `)||`aucune`}.${M(e.source,t.keys())}`,e.ligne);return}if(e.filtrant&&e.donnees.length>0&&r(`une requête ne lit et n'envoie pas à la fois : « filtrant par » sert à lire, « avec » à envoyer.`,e.ligne),i.source.routes.length===0)return;let a=fo(i.source,e.adresse);if(!a){r(`aucune route « ${e.adresse} » dans la source « ${i.source.nom} ». Routes : ${i.source.routes.map(e=>e.adresse).join(`, `)}.`,e.ligne);return}let o=e.donnees.length>0&&!n,s=o?po(a,`creer`):n?po(a,`lire`,!1):po(a,`lire`,!0);if(!s){let t=o?`creer …`:n?`lire un …`:`lire une liste de …`;r(`la route « ${a.adresse} » de la source « ${i.source.nom} » ne dit pas « ${t} » : la requête n'est pas permise.`,e.ligne);return}let c=i.cles.get(s.donnee);if(c===void 0)return{regle:s};let l={genre:`donnee`,nom:c};return{type:s.liste?na(l):l,regle:s}}function ho(e,t,n,r){let i=e.type===`Suppression`?`supprimer`:`modifier`,a=t.get(e.source??``);if(!a){r(`aucune source « ${e.source} ». Sources : ${[...t.keys()].join(`, `)||`aucune`}.${M(e.source??``,t.keys())}`,e.ligne);return}if(a.source.routes.length===0)return;let o=fo(a.source,e.adresse);if(!o){r(`aucune route « ${e.adresse} » dans la source « ${a.source.nom} ». Routes : ${a.source.routes.map(e=>e.adresse).join(`, `)}.`,e.ligne);return}let s=po(o,i===`supprimer`?`supprimer`:`modifier`);if(!s){r(`la route « ${o.adresse} » de la source « ${a.source.nom} » ne dit pas « ${i} … » : l'action n'est pas permise.`,e.ligne);return}let c=a.cles.get(s.donnee);return c!==void 0&&n.genre!==`inconnu`&&(n.genre!==`donnee`||n.nom!==c)&&r(`« ${i} » attend un « ${s.donnee} » lu sur cette route (par exemple la variable d'une boucle « pour chaque p dans … »).`,e.ligne),s}const go={images:{mime:[`image/png`,`image/jpeg`,`image/webp`,`image/gif`,`image/avif`],apercu:!0,refus:`n'est pas une image`},audio:{mime:[`audio/mpeg`,`audio/ogg`,`audio/wav`,`audio/mp4`,`audio/aac`,`audio/flac`,`audio/webm`],apercu:!0,refus:`n'est pas un son`},videos:{mime:[`video/mp4`,`video/webm`,`video/ogg`,`video/quicktime`],apercu:!0,refus:`n'est pas une vidéo`},pdf:{mime:[`application/pdf`],apercu:!1,refus:`n'est pas un PDF`},documents:{mime:[`text/plain`,`text/csv`,`application/msword`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/vnd.ms-excel`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.oasis.opendocument.text`,`application/vnd.oasis.opendocument.spreadsheet`],apercu:!1,refus:`n'est pas un document`}},_o={image:`images`,photo:`images`,photos:`images`,son:`audio`,video:`videos`,document:`documents`},vo=e=>{let t=_o[e]??e;return t in go?t:void 0};function yo(e){let t={genre:`fiche`,champs:[{nom:`nom`,type:z},{nom:`taille`,type:ea},{nom:`type`,type:z},{nom:`apercu`,type:z}]};return e?na(t):t}function bo(e,t){let n=e.fichier,r=Ka(e.contenu);r!==void 0&&r.trim()===``&&t.erreur(`le libellé du choix de fichier est vide : écrivez ce que la personne lit sur le bouton, par exemple fichier "Choisir une photo" dans photo.`,e.ligne);let i=Object.keys(go);for(let r of n.accepte)r===`svg`?t.erreur(`le SVG n'est pas accepté : un fichier SVG peut contenir du script, ce n'est pas une « image » pour « accepte ». Acceptez images (PNG, JPEG, WebP, GIF, AVIF).`,e.ligne):vo(r)||t.erreur(`« ${r} » n'est pas un type de fichier connu. Types possibles : ${i.join(`, `)}.${M(r,i)}`,e.ligne);n.octets!==void 0&&n.octets<=0&&t.erreur(`la taille maximale est positive : maximum 5 Mo.`,e.ligne),n.accepte.length===0&&t.avertissement(`sans « accepte », tout fichier peut être choisi : le serveur doit vérifier le type. Écrivez par exemple accepte images ou accepte pdf.`,e.ligne)}const xo=e=>[...new Set(e.accepte.map(vo).filter(e=>e!==void 0))];function So(e){let t=xo(e);return t.length===0||t.some(e=>go[e].apercu)}function Co(e,t,n){let{ligne:r}=e;if(!t.fichiers.get(e.variable)){let i=[...t.fichiers.keys()];n.erreur(i.length===0?`« ${e.variable} » n'est pas un fichier choisi : la page n'a aucun choix de fichier. Écrivez fichier "Choisir une photo" dans ${e.variable}, puis envoyer fichier ${e.variable} vers …`:`« ${e.variable} » n'est pas un fichier choisi. Fichiers choisis dans cette page : ${i.join(`, `)}.${M(e.variable,i)}`,r)}if(e.source===void 0)n.erreur(`le serveur de ce fichier ne reçoit pas de fichier : les packs Astratra n'ont pas encore de route d'envoi, et Humalis n'invente pas de récepteur (taille, type, nom, droits : ce serait de la sécurité inventée). Envoyez le fichier à une source déclarée : envoyer fichier … vers "…" de la source "…".`,r);else{let i=t.sources.get(e.source);if(!i)n.erreur(`aucune source « ${e.source} ». Sources : ${[...t.sources.keys()].join(`, `)||`aucune`}.${M(e.source,t.sources.keys())}`,r);else if(i.source.jeton?.genre===`secret`&&n.erreur(`la source « ${i.source.nom} » a un jeton secret : un fichier ne peut pas passer par la passerelle du serveur pour l'instant (corps binaire, taille), et le secret ne doit jamais partir dans le navigateur. Envoyez le fichier à une source à session ou à jeton public.`,r),i.source.routes.length===0)n.avertissement(`la source « ${i.source.nom} » ne décrit pas ses routes : « ${co(e.adresse)} » n'est pas vérifiée.`,r);else{let t=fo(i.source,e.adresse);t?po(t,`creer`)||n.erreur(`la route « ${t.adresse} » de la source « ${i.source.nom} » ne dit pas « creer … » : l'envoi d'un fichier n'est pas permis.`,r):n.erreur(`aucune route « ${e.adresse} » dans la source « ${i.source.nom} ». Routes : ${i.source.routes.map(e=>e.adresse).join(`, `)}.`,r)}}if(e.suivi!==void 0){let i=t.typeDe(e.suivi,r);i&&H(i)&&i.genre!==`nombre`&&n.erreur(`« suivi dans ${e.suivi} » : la progression est un nombre de 0 à 100, mais « ${e.suivi} » est ${V(i)}. Déclarez variable ${e.suivi} = 0.`,r)}e.resultat!==void 0&&t.typeDe(e.resultat,r)}function wo(e,t=new Map){for(let n of e)n.type===`Element`&&n.element===`fichier`&&n.fichier?t.set(n.fichier.variable,{choix:n.fichier,ligne:n.ligne}):n.type===`Condition`?(wo(n.alors,t),wo(n.sinon,t)):(n.type===`Boucle`||n.type===`Bloc`||n.type===`Formulaire`)&&wo(n.corps,t);return t}const To=e=>String(e).replace(`.`,`,`),Eo=e=>e.type===`Nombre`?e.valeur:void 0;function Do(e,t,n,r){let[i,a]=t===`latitude`?[-90,90]:t===`longitude`?[-180,180]:[1,18],o=r.typeDe(e);if(H(o)&&o.genre!==`nombre`){r.erreur(`${t===`zoom`?`le`:`la`} ${t} est un nombre (ici, ${V(o)}) : ${t} ${t===`zoom`?`15`:t===`latitude`?`-4,3250`:`15,3222`}.`,n);return}let s=Eo(e);s!==void 0&&(s<i||s>a?r.erreur(t===`zoom`?`le zoom ${To(s)} est hors des bornes : il va de 1 (le monde entier) à 18 (une rue).`:`la ${t} ${To(s)} est hors des bornes : elle va de ${i} à ${a}.`,n):t===`zoom`&&!Number.isInteger(s)&&r.erreur(`le zoom est un nombre entier de 1 (le monde entier) à 18 (une rue), pas ${To(s)}.`,n))}function Oo(e,t,n,r){let i=Ka(e);i!==void 0&&i.trim()===``?r.erreur(t,n):r.typeDe(e)}function ko(e){let t=0,n=0;for(let r of e)if(r.type===`Element`&&r.element===`marqueur`)t++,n++;else if(r.type===`Boucle`)t+=ko(r.corps).total;else if(r.type===`Condition`){let e=ko(r.alors),i=ko(r.sinon);t+=e.total+i.total,n+=e.litteraux+i.litteraux}return{total:t,litteraux:n}}function Ao(e,t){let{ligne:n}=e,r=e.carte??{};e.titre&&Oo(e.titre,`le nom de la carte est vide : il la décrit pour les lecteurs d’écran, par exemple carte "Le restaurant Le Fleuve, avenue de la Gombe".`,n,t);let{latitude:i,longitude:a,zoom:o}=r;if(i===void 0!=(a===void 0)&&t.erreur(`une position s’écrit avec latitude et longitude ensemble : il manque ${i===void 0?`la latitude`:`la longitude`}. Exemple : avec latitude -4,3250 et longitude 15,3222.`,n),i&&Do(i,`latitude`,n,t),a&&Do(a,`longitude`,n,t),o&&Do(o,`zoom`,n,t),r.tuiles!==void 0){let e=r.tuiles;(!/^https:\/\//i.test(e)||!e.includes(`{z}`)||!e.includes(`{x}`)||!e.includes(`{y}`))&&t.erreur(`l’adresse des tuiles commence par https:// et contient {z}, {x} et {y} (le zoom et la case demandés), comme https://tile.openstreetmap.org/{z}/{x}/{y}.png. Ici : « ${e} ».`,n),(r.attribution===void 0||r.attribution.trim()===``)&&t.erreur(`des tuiles d’un autre fournisseur demandent son attribution, toujours affichée sur la carte : avec tuiles "https://…/{z}/{x}/{y}.png" et attribution "© MapTiler".`,n)}else r.attribution!==void 0&&t.erreur(`l’attribution accompagne des tuiles d’un autre fournisseur : écrivez aussi « tuiles "https://…/{z}/{x}/{y}.png" ». Les tuiles par défaut portent déjà leur attribution (OpenStreetMap).`,n);let s=e.corps.find(e=>(e.type!==`Element`||e.element!==`marqueur`)&&e.type!==`Boucle`&&e.type!==`Condition`);s&&t.erreur(`une carte ne contient que des marqueurs (dans un « pour chaque » ou un « si » au besoin) : marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070.`,`ligne`in s?s.ligne:n);let{total:c,litteraux:l}=ko(e.corps);i===void 0&&a===void 0&&c===0&&t.erreur(`une carte sans position ni marqueur n’affiche rien : ajoutez « avec latitude … et longitude … », ou des marqueurs.`,n),l>200&&t.avertissement(`${l} marqueurs écrits dans cette carte (plus de 200) : le regroupement des marqueurs n’existe pas dans cette version, la carte sera lente et illisible. Montrez-en moins, ou découpez en plusieurs cartes.`,n)}function jo(e,t,n){let{ligne:r,lieu:i}=e;if(t||n.erreur(`un marqueur se place dans une carte : carte "Nos agences" : puis, en dessous et décalé, marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070.`,r),Oo(e.contenu,`le nom du marqueur est vide : il s’affiche dans la bulle et nomme le repère pour les lecteurs d’écran.`,r,n),i?.latitude===void 0||i.longitude===void 0){let e=i?.latitude===void 0&&i?.longitude===void 0?`sa latitude et sa longitude`:i?.latitude===void 0?`sa latitude`:`sa longitude`;n.erreur(`le marqueur a besoin de sa position : il manque ${e}. Exemple : marqueur "Gombe" avec latitude -4,3047 et longitude 15,3070.`,r)}i?.latitude&&Do(i.latitude,`latitude`,r,n),i?.longitude&&Do(i.longitude,`longitude`,r,n),i?.adresse&&n.typeDe(i.adresse)}const Mo={fc:`FC`,franc:`FC`,francs:`FC`,euro:`EUR`,euros:`EUR`,dollar:`USD`,dollars:`USD`};function No(e){return typeof e==`number`?e.toLocaleString(`fr-FR`):``}function Po(e){if(!e)return``;let t=new Date(`${e.slice(0,10)}T00:00:00`);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(`fr-FR`,{day:`numeric`,month:`long`,year:`numeric`})}function Fo(e,t){return typeof e==`number`?t===`EUR`?e.toLocaleString(`fr-FR`,{style:`currency`,currency:`EUR`}):t===`USD`?`${e.toLocaleString(`fr-FR`,{minimumFractionDigits:2,maximumFractionDigits:2})} $`:`${e.toLocaleString(`fr-FR`)} FC`:``}function Io(e,t,n=`fr`){return typeof e==`number`?`${(t===`Mo`?e/1048576:e/1024).toLocaleString(n===`en`?`en-US`:`fr-FR`,{maximumFractionDigits:1})} ${n===`en`?t===`Mo`?`MB`:`KB`:t}`:``}function Lo(e,t){if(typeof e!=`number`)return``;if(Math.abs(e)<2)return`${e.toLocaleString(`fr-FR`)} ${t}`;let n=/[sxz]$/.test(t)?t:/al$/.test(t)?`${t.slice(0,-2)}aux`:/(eau|au|eu)$/.test(t)?`${t}x`:`${t}s`;return`${e.toLocaleString(`fr-FR`)} ${n}`}const Ro="/** Les réglages régionaux de chaque langue. */\nconst REGIONS: Record<string, { nombre: string; date: string }> = { fr: { nombre: 'fr-FR', date: 'fr-FR' }, en: { nombre: 'en-US', date: 'en-GB' } };\nconst region = (langue: string) => REGIONS[langue] ?? REGIONS.fr;\n\n/** 28000 → « 28 000 » (en anglais : « 28,000 ») ; rien pour une valeur absente. */\nexport function formaterNombre(valeur: number | null | undefined, langue = 'fr'): string {\n return typeof valeur === 'number' ? valeur.toLocaleString(region(langue).nombre) : '';\n}\n\n/** « 2026-11-07 » → « 7 novembre 2026 » (en anglais : « 7 November 2026 ») ; un texte qui n'est pas une date reste tel quel. */\nexport function formaterDate(valeur: string | null | undefined, langue = 'fr'): string {\n if (!valeur) return '';\n // Le jour seul, à minuit sur l'appareil : pas de décalage de fuseau horaire.\n const date = new Date(`${valeur.slice(0, 10)}T00:00:00`);\n return Number.isNaN(date.getTime()) ? valeur : date.toLocaleDateString(region(langue).date, { day: 'numeric', month: 'long', year: 'numeric' });\n}\n\n/** 15000, « FC » → « 15 000 FC » ; 12.5, « EUR » → « 12,50 € » (en anglais : « €12.50 ») ; 12.5, « USD » → « 12,50 $ » (« $12.50 »). */\nexport function formaterArgent(valeur: number | null | undefined, devise: 'FC' | 'EUR' | 'USD', langue = 'fr'): string {\n if (typeof valeur !== 'number') return '';\n if (langue === 'en') {\n if (devise === 'FC') return `${valeur.toLocaleString('en-US')} FC`;\n return valeur.toLocaleString('en-US', { style: 'currency', currency: devise === 'EUR' ? 'EUR' : 'USD' });\n }\n if (devise === 'EUR') return valeur.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR' });\n if (devise === 'USD') return `${valeur.toLocaleString('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} $`;\n return `${valeur.toLocaleString('fr-FR')} FC`;\n}\n\n/** 1, « article » → « 1 article » ; 3 → « 3 articles » ; en anglais, 0 et 2 « items », 1 « item ». */\nexport function accorder(nombre: number | null | undefined, mot: string, langue = 'fr'): string {\n if (typeof nombre !== 'number') return '';\n if (langue === 'en') {\n const pluriel = /(s|x|z|ch|sh)$/.test(mot) ? `${mot}es` : /[^aeiou]y$/.test(mot) ? `${mot.slice(0, -1)}ies` : `${mot}s`;\n return `${nombre.toLocaleString('en-US')} ${nombre === 1 ? mot : pluriel}`;\n }\n // En français, le pluriel commence à 2.\n if (Math.abs(nombre) < 2) return `${nombre.toLocaleString('fr-FR')} ${mot}`;\n const pluriel = /[sxz]$/.test(mot) ? mot : /al$/.test(mot) ? `${mot.slice(0, -2)}aux` : /(eau|au|eu)$/.test(mot) ? `${mot}x` : `${mot}s`;\n return `${nombre.toLocaleString('fr-FR')} ${pluriel}`;\n}\n".replace(/^export /gm,``).replace(`: Record<string, { nombre: string; date: string }>`,``).replace(`(langue: string)`,`(langue)`).replace(`(valeur: number | null | undefined, langue = 'fr'): string`,`(valeur, langue = 'fr')`).replace(`(valeur: string | null | undefined, langue = 'fr'): string`,`(valeur, langue = 'fr')`).replace(`(valeur: number | null | undefined, devise: 'FC' | 'EUR' | 'USD', langue = 'fr'): string`,`(valeur, devise, langue = 'fr')`).replace(`(nombre: number | null | undefined, mot: string, langue = 'fr'): string`,`(nombre, mot, langue = 'fr')`).replace(/^(?=.)/gm,` `),zo=`/** 1572864 octets, « Mo » → « 1,5 Mo » ; en anglais « 1.5 MB ». Rien pour une valeur absente. */
|
|
614
624
|
export function formaterTaille(octets: number | null | undefined, unite: 'Ko' | 'Mo', langue = 'fr'): string {
|
|
615
625
|
if (typeof octets !== 'number') return '';
|
|
616
626
|
const valeur = unite === 'Mo' ? octets / 1048576 : octets / 1024;
|
|
@@ -663,15 +673,15 @@ export function formaterDepuis(valeur: string | null | undefined): string {
|
|
|
663
673
|
if (minutes < 525600) return dire(Math.floor(minutes / 43200), 'mois');
|
|
664
674
|
return dire(Math.floor(minutes / 525600), 'an');
|
|
665
675
|
}
|
|
666
|
-
`.replace(/^export /gm,``).replace(/\((valeur|debut|fin)(: string \| null \| undefined)/g,`($1`).replace(/, (fin|nombre|unite)(: [^,)]+)/g,`, $1`).replace(/\(v: string\)/g,`(v)`).replace(/\(n: number, mot: string\)/g,`(n, mot)`).replace(/\): (string|number) \{/g,`) {`).replace(/^/gm,` `),Vo=(e,t)=>e.find(e=>A(e.propriete)===t);function Ho(e,t,n,r,i){let a=Vo(e,`animation`);for(let t of[`duree`,`delai`])if(Vo(e,t)&&!a){let e=t===`delai`?`avec animation montee et delai court`:`avec animation montee et duree longue`;i.erreur(`« ${t} » donne ${t===`delai`?`l’attente`:`la durée`} d’une animation : écrivez aussi « animation … », par exemple « ${e} ».`,r)}return a?A(a.valeur)===`defilement`?(i.erreur(`« au defilement » suit le nom d’une animation : « animation montee au defilement ».`,r),!1):(a.cascade&&![`bloc`,`section`,`ligne`,`colonne`,`grille`].includes(t)&&i.erreur(`« en cascade » fait apparaître les enfants d’un bloc l’un après l’autre : il s’écrit sur un bloc (section, bloc, ligne, colonne ou grille).`,r),(t===`champ`||t===`formulaire`||n)&&i.erreur(`pas d’animation sur un champ, ni dans un formulaire : un champ qui bouge pendant qu’on écrit gêne la saisie.`,r),a.defilement===!0):!1}const Uo=[`png`,`jpg`,`jpeg`,`webp`,`gif`,`svg`,`avif`];function Wo(e,t){let{styles:n,ligne:r}=e,i=Vo(n,`description`),a=Vo(n,`decoratif`);i&&a?t.erreur(`une image a soit une description, soit « decoratif » (elle ne porte aucune information), pas les deux.`,r):!i&&!a?t.erreur(`décrivez l’image pour les personnes qui ne la voient pas : « avec description "Le fleuve au coucher du soleil" », ou « avec decoratif » si elle ne porte aucune information.`,r):i&&(i.parties??[{type:`texte`,valeur:i.valeur}]).every(e=>e.type===`texte`&&e.valeur.trim()===``)&&t.erreur(`la description de l’image est vide : écrivez ce qu’elle montre, ou « avec decoratif » si elle ne porte aucune information.`,r),i?.parties?.some(e=>e.type===`variable`)&&t.typeDe(i.texte??{type:`Chaine`,parties:i.parties,ligne:r});let o=Vo(n,`proportions`);if(o){let[e,n]=o.valeur.split(`:`).map(Number);[e,n].every(e=>Number.isInteger(e)&&e>0)||t.erreur(`les proportions sont deux nombres entiers positifs : « proportions 4 sur 3 » (ici, ${o.valeur.replace(`:`,` sur `).replace(/\./g,`,`)}).`,r)}let s=Ka(e.contenu);if(s!==void 0&&!/^([a-z][a-z0-9+.-]*:|\/)/i.test(s.trim())){let e=/\.([a-z0-9]+)$/i.exec(s)?.[1]?.toLowerCase();(!e||!Uo.includes(e))&&t.erreur(`« ${s} » n’est pas une image que les navigateurs savent afficher. Formats possibles : ${Uo.map(e=>`.${e}`).join(`, `)}.`,r)}return Jo(n)}const Go=[`mp3`,`ogg`,`wav`,`m4a`,`aac`,`flac`,`opus`],Ko=/entretien|interview|discours|podcast/i;function qo(e,t){let{styles:n,ligne:r}=e,i=Vo(n,`description`);i?(i.parties??[{type:`texte`,valeur:i.valeur}]).every(e=>e.type===`texte`&&e.valeur.trim()===``)&&t.erreur(`la description du son est vide : elle nomme le lecteur pour les lecteurs d’écran.`,r):t.erreur(`décrivez le son pour les personnes qui ne le voient pas : « audio "extrait.mp3" avec description "Extrait de la chanson Le Fleuve" ».`,r);for(let e of[`description`,`transcription`]){let i=Vo(n,e);i?.parties?.some(e=>e.type===`variable`)&&t.typeDe(i.texte??{type:`Chaine`,parties:i.parties,ligne:r})}Vo(n,`automatique`)&&t.erreur(`Humalis ne lance jamais un son tout seul : les navigateurs le bloquent presque toujours et c’est gênant pour les lecteurs d’écran. Retirez « automatique » ; la personne lance le son avec les commandes du lecteur.`,r);let a=Ka(e.contenu);if(a!==void 0&&!/^([a-z][a-z0-9+.-]*:|\/)/i.test(a.trim())){let e=/\.([a-z0-9]+)$/i.exec(a)?.[1]?.toLowerCase();(!e||!Go.includes(e))&&t.erreur(`« ${a} » n’est pas un son que les navigateurs savent jouer. Formats possibles : ${Go.map(e=>`.${e}`).join(`, `)}.`,r)}a!==void 0&&Ko.test(a)&&!Vo(n,`transcription`)&&t.avertissement(`ce son ressemble à de la parole (son nom l’annonce) : ajoutez « et transcription "…" » pour les personnes qui ne peuvent pas l’écouter.`,r)}const Jo=e=>Vo(e,`prioritaire`)!==void 0;function Yo(e,t){e.length>2&&t.avertissement(`${e.length} images « prioritaire » dans cette page : au-delà de 2, elles se disputent le réseau et aucune n’arrive plus vite. Gardez « prioritaire » pour la grande image du haut.`,e[2])}function Xo(e,t){e.length>30&&t.avertissement(`trop de mouvement : ${e.length} éléments s’animent au défilement dans cette page (plus de 30). Gardez l’animation pour quelques éléments importants.`,e[30])}const Zo=e=>e.type===`Reference`?`« ${e.nom} »`:`la liste`;function Qo(e,t){let{ligne:n}=e;t.dansEvenement&&t.erreur(`un graphique se place dans la page, pas dans un événement. Pour le montrer après un clic, placez-le dans un « si » qui lit une variable que l’événement change.`,n),$o(e,t),es(e,t);let r=t.typeDe(e.liste),i=r.genre===`liste`?r.de:B;if(H(r)&&(r.genre!==`liste`||[`texte`,`booleen`,`liste`].includes(i.genre))){t.erreur(`un graphique se fait à partir d’une liste de nombres, de fiches ou de données, par exemple les ventes par mois ; ici, c’est ${ra(r)}.`,n);return}let a=e.valeur?[e.valeur]:e.series.flatMap(e=>e.valeur?[e.valeur]:[]);i.genre===`nombre`?ts(e,a,t):H(i)?ns(e,a,t.champsDe(i),t):(e.etiquette!==void 0||a.length>0)&&t.avertissement(`les champs des éléments de ${Zo(e.liste)} ne sont connus qu’à l’exécution : « etiquette » et « valeur » ne sont pas vérifiés. Vérifiez qu’ils existent dans les données reçues.`,n),rs(e,t)}function $o(e,t){if(!e.description){t.erreur(`décrivez ce que montre le graphique, pour les personnes qui ne le voient pas : ajoutez par exemple « et description "Les ventes montent de janvier à mars." ».`,e.ligne);return}e.description.type===`Chaine`&&e.description.parties.every(e=>e.type===`texte`&&e.valeur.trim()===``)&&t.erreur(`la description du graphique est vide : écrivez ce qu’il montre, par exemple « description "Les ventes montent de janvier à mars." ».`,e.ligne),e.description.type===`Chaine`&&e.description.parties.some(e=>e.type===`variable`)&&t.typeDe(e.description)}function es(e,t){let{ligne:n}=e;(e.valeur||e.couleur)&&e.series.length>0&&t.erreur(`la valeur et la couleur s’écrivent soit sur la ligne du graphique (une seule série), soit dans chaque ligne « serie » : pas les deux.`,n),e.genre===`camembert`&&e.series.length>1&&t.erreur(`un camembert montre une seule série, dont les parts font un tout : gardez une seule ligne « serie », ou choisissez un graphique en barres pour en comparer plusieurs.`,n);let r=[e.couleur,...e.series.map(e=>e.couleur)].filter(e=>e!==void 0);if(e.genre===`camembert`&&r.length>0)t.erreur(`les parts d’un camembert prennent chacune leur couleur : retirez « couleur ».`,n);else for(let e of r){let r=t.couleur(e);if(`erreur`in r){t.erreur(r.erreur,n);continue}let i=t.modes.find(e=>Zn(r[e],Kn[e])<3);if(i){let e=Zn(r[i],Kn[i]).toFixed(1).replace(`.`,`,`);t.avertissement(`la couleur « ${r.nom} » se voit mal sur le fond de la page en mode ${i} (contraste ${e} pour 1, il en faut au moins 3) : choisissez une couleur plus ${i===`clair`?`foncée`:`claire`}.`,n)}}let i=e.valeur?[e.valeur]:e.series.flatMap(e=>e.valeur?[e.valeur]:[]);for(let e of i)e.devise!==void 0&&!Mo[A(e.devise)]&&t.erreur(`« ${e.devise} » n’est pas une devise connue. Devises : FC, euros, dollars.${M(e.devise,Object.keys(Mo))}`,e.ligne);let a=[...new Set(i.map(e=>e.devise===void 0?`sans devise`:Mo[A(e.devise)]??e.devise))];a.length>1&&t.erreur(`toutes les séries d’un graphique s’écrivent dans la même unité : ici, ${a.join(` et `)}. Un axe ne peut pas compter deux unités à la fois.`,n),e.proportions&&!e.proportions.every(e=>Number.isInteger(e)&&e>0)&&t.erreur(`les proportions d’un graphique sont deux nombres entiers positifs : « proportions 2 sur 1 » (ici, ${e.proportions.join(` sur `).replace(/\./g,`,`)}).`,n)}function ts(e,t,n){if(e.etiquette!==void 0||t.length>0){n.erreur(`« etiquette » et « valeur » nomment des champs, mais la liste ne contient que des nombres : retirez-les, et écrivez les libellés avec « etiquettes ["Lun", "Mar"] ».`,e.ligne);return}if(!e.etiquettes)return;let r=n.typeDe(e.etiquettes);if(H(r)&&!(r.genre===`liste`&&(r.de.genre===`texte`||!H(r.de)))){n.erreur(`« etiquettes » attend une liste de textes, par exemple etiquettes ["Lun", "Mar", "Mer"] ; ici, c’est ${ra(r)}.`,e.ligne);return}let i=n.listeEcrite(e.liste),a=n.listeEcrite(e.etiquettes);i&&a&&i.elements.length!==a.elements.length&&n.erreur(`il y a ${i.elements.length} nombres et ${a.elements.length} étiquettes : il en faut autant, une étiquette par nombre.`,e.ligne)}function ns(e,t,n,r){let{ligne:i}=e,a=n.filter(e=>e.type.genre===`texte`).map(e=>e.nom),o=n.filter(e=>e.type.genre===`nombre`).map(e=>e.nom),s=e=>r.erreur(`« ${e} » n’est pas un champ des éléments de la liste. Champs : ${n.map(e=>e.nom).join(`, `)}.${M(e,n.map(e=>e.nom))}`,i);if(e.etiquettes){r.erreur(`« etiquettes » sert à une liste de nombres ; pour une liste de fiches ou de données, nommez le champ des libellés : « etiquette ${a[0]??`mois`} ».`,i);return}e.etiquette===void 0?r.erreur(`il manque le champ des libellés : ajoutez par exemple « etiquette ${a[0]??n[0]?.nom??`mois`} ». Champs : ${n.map(e=>e.nom).join(`, `)}.`,i):n.length>0&&!n.some(t=>t.nom===e.etiquette)&&s(e.etiquette),!e.valeur&&e.series.length===0&&r.erreur(`il manque le champ des valeurs : ajoutez par exemple « valeur ${o[0]??`montant`} ».`,i);for(let t of e.series)t.valeur||r.erreur(`la série « ${t.nom} » n’a pas de valeur : écrivez par exemple serie "${t.nom}" valeur ${o[0]??`montant`}.`,t.ligne);if(n.length!==0)for(let e of t){let t=n.find(t=>t.nom===e.champ);t?H(t.type)&&t.type.genre!==`nombre`&&r.erreur(`le champ « ${e.champ} » est ${V(t.type)} : un graphique dessine des nombres. Choisissez un champ nombre pour « valeur »${o.length?` (${o.join(`, `)})`:``}.`,e.ligne):s(e.champ)}}function rs(e,t){let n=t.listeEcrite(e.liste);if(!n)return;let r=e.valeur?.champ??e.series[0]?.valeur?.champ,i=n.elements.flatMap(e=>{let t=e.type===`Fiche`?e.champs.find(e=>e.nom===r)?.valeur:e;return t?.type===`Nombre`?[t.valeur]:[]}),a=n.elements.length;if(e.genre===`camembert`){let n=i.find(e=>e<0);n===void 0?a>8&&t.avertissement(`${a} parts : au-delà de 8, un camembert se lit mal. Regroupez les petites parts, ou choisissez un graphique en barres.`,e.ligne):t.erreur(`un camembert ne montre pas de valeur négative (${String(n).replace(`.`,`,`)}) : une part ne peut pas être plus petite que rien. Choisissez un graphique en barres.`,e.ligne)}else e.genre===`barres`&&a>40?t.avertissement(`${a} barres : au-delà de 40, elles deviennent trop fines pour être lues. Regroupez les valeurs, ou choisissez un graphique en courbe.`,e.ligne):e.genre===`courbe`&&a===1&&t.avertissement(`une courbe d’un seul point ne montre pas d’évolution : ajoutez des valeurs, ou montrez ce nombre dans un texte.`,e.ligne)}const is=[`lire`,`creer`,`modifier`,`supprimer`];function as(e,t){let n=(e,n)=>t.push({gravite:`erreur`,message:e,ligne:n}),r=(e,n)=>t.push({gravite:`avertissement`,message:e,ligne:n}),i=new Map;for(let t of e.donnees){i.has(t.nom)&&n(`la donnée « ${t.nom} » est déjà déclarée (ligne ${i.get(t.nom)}).`,t.ligne),i.set(t.nom,t.ligne);let e=new Map;for(let r of t.champs)e.has(r.nom)&&n(`le champ « ${r.nom} » est déjà déclaré (ligne ${e.get(r.nom)}).`,r.ligne),e.set(r.nom,r.ligne)}let a=new Map,o=new Set;for(let t of e.routes){a.has(t.adresse)&&n(`la route « ${t.adresse} » est déjà déclarée (ligne ${a.get(t.adresse)}).`,t.ligne),a.set(t.adresse,t.ligne);let s,c=new Set;for(let r of t.regles){if(!i.has(r.donnee)){n(`la donnée « ${r.donnee} » n'existe pas dans le serveur « ${e.nom} ». Données : ${[...i.keys()].join(`, `)||`aucune`}.${M(r.donnee,i.keys())}`,r.ligne);continue}if(s!==void 0&&s!==r.donnee){n(`une route ne sert qu'une donnée : la route « ${t.adresse} » sert déjà « ${s} ». Écrivez une autre route pour « ${r.donnee} ».`,r.ligne);continue}s=r.donnee,o.add(r.donnee);for(let e of r.actions)c.add(e)}if(s!==void 0){let e=new Set(c);c.has(`modifier`)&&(e.add(`creer`),e.add(`supprimer`));let n=is.filter(t=>!e.has(t));n.length>0&&r(`personne ne peut ${n.join(`, `)} « ${s} » : ces actions seront refusées.`,t.ligne)}}for(let t of e.donnees)o.has(t.nom)||r(`aucune route ne donne accès à la donnée « ${t.nom} ».`,t.ligne)}function os(e){let t={lire:null,creer:null,modifier:null,supprimer:null};for(let n of e.regles)for(let e of n.actions)t[e]=n.qui;return t.modifier&&(t.creer??=t.modifier,t.supprimer??=t.modifier),t}const ss=e=>e.replace(/^\/+/,``).replace(/^api\//,``),cs=new Set(`arguments.await.break.case.catch.class.const.continue.debugger.default.delete.do.else.enum.eval.export.extends.false.finally.for.function.if.implements.import.in.instanceof.interface.let.new.null.package.private.protected.public.return.static.super.switch.this.throw.true.try.typeof.undefined.var.void.while.with.yield.NaN.Infinity`.split(`.`));function ls(e){return U(e).split(`_`).filter(Boolean)}const us=e=>e.charAt(0).toUpperCase()+e.slice(1);function ds(e){let t=ls(e).map(us).join(``);return t===``?`Page`:/^[0-9]/.test(t)?`Page${t}`:t}function W(e){let[t=`valeur`,...n]=ls(e),r=t+n.map(us).join(``);return/^[0-9]/.test(r)&&(r=`v${r}`),cs.has(r)?`${r}_`:r}function G(e){return`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`)}'`}const fs=[`http`,`https`,`mailto`,`tel`];function ps(e){let t=/^([a-z][a-z0-9+.-]*):/i.exec(e.trim())?.[1]?.toLowerCase();if(t!==void 0)return fs.includes(t)?{externe:!0}:{refus:`l'adresse « ${e} » est refusée : un lien mène à une page, ou à une adresse en https://, http://, mailto: ou tel:. Les autres schémas (comme ${t}:) peuvent exécuter du code ou lire des fichiers.`};let n=e.indexOf(`#`);return n<0?{page:e}:{...n>0?{page:e.slice(0,n)}:{},ancre:e.slice(n+1)}}function ms(e,t){for(let n of e)t(n),n.type===`Bloc`||n.type===`Formulaire`||n.type===`Boucle`?ms(n.corps,t):n.type===`Condition`&&(ms(n.alors,t),ms(n.sinon,t))}function hs(e){let t=[];return ms(e.corps,e=>{(e.type===`Bloc`||e.type===`Element`)&&e.ancre!==void 0&&t.push({nom:e.ancre,ligne:e.ligne})}),t}const gs=`introuvable`;function _s(e,t){let n=(e,n)=>t.push({gravite:`erreur`,message:e,ligne:n}),r=new Set(e.pages.map(e=>e.nom)),i=e.serveurs.length>0||e.sources.some(e=>e.session),a=new Map;for(let t of e.pages){if(t.adresse!==void 0){t.adresse.startsWith(`/`)||n(`l'adresse « ${t.adresse} » de la page « ${t.nom} » doit commencer par / (par exemple "/collections/:slug").`,t.ligne);let r=a.get(t.adresse),i=r?e.pages.find(e=>e.nom===r.nom):void 0,o=t.parent===void 0?void 0:e.pages.find(e=>e.nom===t.parent),s=o!==void 0&&i?.parent===t.parent&&(o.adresse??`/${U(o.nom)}`)===t.adresse,c=r&&(t.parent===r.nom||i?.parent===t.nom||s);r&&c?a.set(t.adresse,r):r?n(`l'adresse « ${t.adresse} » est déjà celle de la page « ${r.nom} » (ligne ${r.ligne}).`,t.ligne):a.set(t.adresse,{nom:t.nom,ligne:t.ligne})}if(t.nom===`introuvable`&&(t.adresse!==void 0||t.parametres.length>0||t.reservee!==void 0)&&n(`la page « ${gs} » est la page 404 : elle n'a ni adresse, ni paramètre, et n'est pas réservée.`,t.ligne),t.reservee){i||n(`la page « ${t.nom} » est réservée, ce qui demande une session : ajoutez un bloc serveur, ou une source avec session astratra.`,t.reservee.ligne);let a=t.reservee.sinon??`connexion`;r.has(a)?(a===t.nom||e.pages.find(e=>e.nom===a)?.reservee)&&n(`la page « ${a} », où l'on envoie les visiteurs refusés de « ${t.nom} », est elle-même réservée : ils tourneraient en rond.`,t.reservee.ligne):n(t.reservee.sinon===void 0?`la page « ${t.nom} » est réservée : dites où envoyer les visiteurs (sinon vers "connexion") ou écrivez une page « connexion ».`:`la page « ${t.nom} » renvoie les visiteurs refusés vers « ${a} », qui n'existe pas. Pages : ${[...r].join(`, `)}.${M(a,r)}`,t.reservee.ligne)}}let o=new Map([...e.composants,...e.composantsReact].flatMap(e=>[[e.nom,e.nom],[ds(e.nom),e.nom]]));for(let t of e.pages){let e=ds(t.nom),r=o.get(e);r!==void 0&&n(`la page « ${t.nom} » et le composant « ${r} » auraient le même nom dans le code produit (${e}) : renommez l'un des deux (par exemple le composant « ${r}Bloc »).`,t.ligne)}vs(e,n),ys(e,t,n)}function vs(e,t){let n=new Map(e.pages.map(e=>[e.nom,e])),r=[...n.keys()].join(`, `),i=e=>e.adresse??`/${U(e.nom)}`,a=e=>{let t=[];return ms(e.corps,e=>{e.type===`SousPage`&&t.push(e.ligne)}),t},o=new Map,s=new Set;for(let a of e.pages){if(a.parent===void 0)continue;let c=n.get(a.parent);if(a.parent===a.nom){t(`une page ne peut pas être dans elle-même (page « ${a.nom} »).`,a.ligne);continue}if(!c){t(`la page « ${a.nom} » veut être dans « ${a.parent} », qui n'existe pas. Pages : ${r}.${M(a.parent,e.pages.map(e=>e.nom))}`,a.ligne);continue}o.set(c.nom,[...o.get(c.nom)??[],a]);let l=new Set([a.nom]),u=c,d=!1;for(;u;){if(l.has(u.nom)){d=!0;break}l.add(u.nom),u=u.parent===void 0?void 0:n.get(u.parent)}if(d){if(!s.has(a.nom)){for(let e of l)s.add(e);t(`la page « ${a.nom} » est dans « ${a.parent} », qui est elle-même dans « ${a.nom} » (directement ou non) : les sous-pages ne tournent pas en rond.`,a.ligne)}continue}if(a.nom===`introuvable`){t(`la page « ${gs} » est la page 404 : elle ne peut pas être une sous-page.`,a.ligne);continue}if(c.parametres.length>0){t(`la page « ${c.nom} » a un paramètre et des sous-pages (dont « ${a.nom} ») : dans cette version, le parent d'une sous-page n'a pas de paramètre. L'enfant peut avoir le sien.`,a.ligne);continue}if(a.adresse!==void 0&&(c.adresse!==void 0||c.nom!==`accueil`)){let e=i(c).replace(/\/+$/,``);a.adresse!==e&&!a.adresse.startsWith(`${e}/`)&&t(`l'adresse « ${a.adresse} » de « ${a.nom} » ne commence pas par celle de son parent « ${e} ».`,a.ligne)}let f=(e=>{for(let t=e;t;t=t.parent===void 0?void 0:n.get(t.parent)){if(t.reservee)return t.reservee;if(t.parent===void 0)break}})(c);a.reservee&&f?.qui===`admin`&&a.reservee.qui===`connecte`&&t(`la page « ${a.nom} » est réservée aux connectés, mais son parent « ${c.nom} » l'est aux admins : une sous-page peut être plus protégée que son parent, jamais moins.`,a.reservee.ligne)}for(let n of e.pages){let e=o.get(n.nom)??[],r=a(n);e.length>0&&r.length===0&&t(`la page « ${n.nom} » a des sous-pages (${e.map(e=>e.nom).join(`, `)}) mais pas d'endroit pour les montrer : écrivez « sous page » là où elles doivent apparaître.`,n.ligne),e.length===0&&r.length>0&&t(`« sous page » est écrit dans la page « ${n.nom} », qui n'a aucune sous-page : écrivez page "…" dans "${n.nom}" : sur une autre page.`,r[0]),r.length>1&&t(`« sous page » est écrit ${r.length} fois dans la page « ${n.nom} » : une seule fois, à l'endroit où la sous-page apparaît.`,r[1]);let s=e.filter(e=>e.adresse!==void 0&&e.adresse.replace(/\/+$/,``)===i(n).replace(/\/+$/,``));s.length>1&&t(`les pages « ${s[0].nom} » et « ${s[1].nom} » sont toutes deux la sous-page d'index de « ${n.nom} » (même adresse) : une seule.`,s[1].ligne)}}function ys(e,t,n){let r=new Map(e.pages.map(e=>[e.nom,e])),i=new Map;for(let t of e.pages){let e=new Map;for(let r of hs(t)){/^[A-Za-z0-9_-]+$/.test(r.nom)||n(`l'ancre « ${r.nom} » n'est pas valable : des lettres sans accent, des chiffres et des tirets seulement (par exemple avec ancre "desserts").`,r.ligne);let i=e.get(r.nom);i===void 0?e.set(r.nom,r.ligne):n(`l'ancre « ${r.nom} » est déjà utilisée dans la page « ${t.nom} » (ligne ${i}).`,r.ligne)}i.set(t.nom,[...e.keys()])}let a=(e,a,o)=>{let s=ps(a);if(s.ancre===void 0)return;let c=s.page===void 0||s.page===``?e:r.get(s.page);if(!c)return;if(c.parametres.length>0){t.push({gravite:`avertissement`,ligne:o,message:`l'ancre « ${s.ancre} » mène à la page « ${c.nom} », qui a un paramètre : l'ancre n'est pas vérifiée.`});return}let l=i.get(c.nom)??[];if(!l.includes(s.ancre)){let t=c===e&&(s.page===void 0||s.page===``)?`dans cette page`:`dans la page « ${c.nom} »`;n(`l'ancre « ${s.ancre} » n'existe pas ${t}. ${l.length>0?`Ancres : ${l.join(`, `)}.`:`Cette page n'a aucune ancre : écrivez avec ancre "`+s.ancre+`" sur l'élément ou le bloc où le lien doit mener.`}`,o)}};for(let t of e.pages)ms(t.corps,e=>{e.type===`Element`&&e.cible!==void 0&&a(t,e.cible,e.ligne)});for(let t of[e.entete,e.pied]){if(!t)continue;let o=t.genre===`entete`?`de l'en-tête`:`du pied de page`;ms(t.corps,s=>{if(s.type!==`Element`||s.cible===void 0)return;let c=ps(s.cible);if(c.ancre!==void 0){if(c.page!==void 0&&c.page!==``){let e=r.get(c.page);e&&a(e,s.cible,s.ligne);return}e.pages.filter(e=>!(t.genre===`entete`?e.sansEntete:e.sansPied)&&e.parametres.length===0).some(e=>i.get(e.nom)?.includes(c.ancre))||n(`l'ancre « ${c.ancre} » ${o} n'existe dans aucune page : écrivez avec ancre "${c.ancre}" sur l'élément ou le bloc où le lien doit mener, ou écrivez le nom de la page (par exemple "accueil#${c.ancre}").`,s.ligne)}})}}function bs(e){let t=[],n=(e,n)=>{let r=Ke(e);r&&r!==`liste`&&Ue.has(r)&&t.push({gravite:`avertissement`,message:`la variable « ${e} » porte le nom d'un mot du langage ; c'est permis, mais cela peut prêter à confusion.`,ligne:n})},r=e=>{for(let t of e)switch(t.type){case`Variable`:n(t.nom,t.ligne);break;case`Boucle`:n(t.variable,t.ligne),r(t.corps);break;case`Condition`:r(t.alors),r(t.sinon);break;case`Evenement`:case`Formulaire`:case`Bloc`:r(t.corps)}};for(let t of e.pages)r(t.corps);return t}var xs=class{pile=[];ouvrir(){this.pile.push(new Map)}fermer(){this.pile.pop()}chercher(e){for(let t=this.pile.length-1;t>=0;t--){let n=this.pile[t].get(e);if(n)return n}}nomsVisibles(){return[...new Set(this.pile.flatMap(e=>[...e.keys()]))]}declarerSymbole(e){this.pile[this.pile.length-1].set(e.nom,e)}declarer(e){let t=this.chercher(e.nom);return t||this.pile[this.pile.length-1].set(e.nom,e),t}};const Ss=new Set([...Object.keys(ft),`nom`,`style`,`ancre`,`nouvel`,`obligatoire`,`indice`,`minimum`,`maximum`]),Cs=new Map,ws=new Map,Ts=new Map,Es=(e,t)=>e===`admin`||t===`admin`?`admin`:e??t,Ds=e=>e.type===`Combinaison`?e.operateur===`et`?Es(Ds(e.gauche),Ds(e.droite)):void 0:e.gauche.type===`EtatUtilisateur`&&e.operateur===`vrai`?e.gauche.etat:void 0;function Os(e){let t=e.theme?.mode?.valeur;return t!==`clair`&&t!==`sombre`||JSON.stringify(e).includes(`"action":"changerTheme"`)?[`clair`,`sombre`]:[t]}function ks(e){let t={diagnostics:[],elements:new Map,cibles:new Map,champs:new Map,types:new Map,pagesComposants:new Map,pagesDispositions:new Map,typesParametres:new Map,facultatives:new Set,lecturesUn:new Set,reglesSources:new Map,etatsLus:new Map,reglesOperations:new Map,adressesRequetes:new Map,formats:new Map,pluriels:new Map,chemins:new Map,fonctions:new Map,fonctionsActions:new Set(e.fonctionsActions??[]),projections:new Set,filtres:new Map,tris:new Map,couleursTheme:new Set((e.theme?.couleurs??[]).map(e=>e.nom)),fenetres:new Map,blocsNommes:new Map,valeursTheme:new Map((e.theme?.couleurs??[]).map(e=>[e.nom,{clair:e.clair,sombre:e.sombre??e.clair}])),modesVus:Os(e),langues:{langues:[],traductions:new Map},referencesLangue:new Map,changementsLangue:new Map};for(let t of[...e.pages.map(e=>e.corps),e.entete?.corps,e.pied?.corps,...e.composants.map(e=>e.corps)])t&&no(t);t.langues=$i(e,t.diagnostics),Ts.clear();for(let e of t.langues.langues)Ts.set(e.mot,e.code);let n=new Set(e.pages.map(e=>e.nom));Cs.clear();for(let t of e.pages)Cs.set(t.nom,t.parametres);ws.clear();for(let t of e.pages)ws.set(t.nom,t.filtres??[]);let r=e.fichiersStyle.length>0?void 0:new Set(e.styles.flatMap(e=>[...e.css.matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)].map(e=>e[1]))),i=new Ms({type:`Page`,nom:``,parametres:[],corps:[],ligne:0},n,t,r).declarerPartages(e.partages),a={sources:new Map,serveur:e.serveurs[0]?.nom,routes:new Map,donnees:new Map};for(let t of e.serveurs){for(let e of t.donnees)a.donnees.set(e.nom,e);for(let e of t.routes){let t=a.donnees.get(e.regles[0]?.donnee??``);t&&a.routes.set(ss(e.adresse),{adresse:e.adresse,donnee:t,droits:os(e)})}}a.sources=uo(e.sources,a.donnees);let o={react:new Set(e.composantsReact.map(e=>e.nom)),humalis:new Map(e.composants.map(e=>[e.nom,e.parametres.map(e=>e.nom)]))},s=t.fonctions;for(let n of e.fonctions){let e=s.get(n.nom);if(e){t.diagnostics.push({gravite:`erreur`,message:`la fonction « ${n.nom} » est déjà définie (ligne ${e.definition.ligne}).`,ligne:n.ligne});continue}s.set(n.nom,{definition:n,retour:B,appels:[]})}for(let e of s.values())new Ms({type:`Page`,nom:`fonction ${e.definition.nom}`,parametres:[],corps:[],ligne:e.definition.ligne},n,t,r,[],o,[],a,s).analyserFonction(e);for(let c of e.composants){if(!/^\p{Lu}/u.test(c.nom)){let e=c.nom.charAt(0).toUpperCase()+c.nom.slice(1);t.diagnostics.push({gravite:`erreur`,message:`le nom d'un composant commence par une majuscule, comme en React : « ${e} ».`,ligne:c.ligne})}let e={type:`Page`,nom:c.nom,parametres:[],corps:c.corps,ligne:c.ligne};t.pagesComposants.set(c,e),new Ms(e,n,t,r,i,o,c.parametres,a,s).analyser()}for(let s of[e.entete,e.pied]){if(!s)continue;let e={type:`Page`,nom:s.genre,parametres:[],corps:s.corps,ligne:s.ligne};t.pagesDispositions.set(s,e);for(let e of s.styles){let n=yt(e.propriete,e.valeur,t.couleursTheme);`erreur`in n&&t.diagnostics.push({gravite:`erreur`,message:n.erreur,ligne:s.ligne})}new Ms(e,n,t,r,i,o,[],a).analyser()}for(let c of e.pages){new Ms(c,n,t,r,i,o,[],a,s).analyser(),t.diagnostics.push(...eo(c,t.valeursTheme,t.modesVus));for(let[n,r]of[[c.sansEntete,`entete`],[c.sansPied,`pied`]])n&&!e[r]&&t.diagnostics.push({gravite:`avertissement`,message:`la page « ${c.nom} » se passe d'un ${r===`entete`?`en-tête`:`pied de page`}, mais l'application n'en a pas : écrivez « ${r} : » en haut du fichier, ou retirez « sans ${r} ».`,ligne:c.ligne})}for(let n of e.serveurs)as(n,t.diagnostics);lo(e.sources,e.serveurs,t.diagnostics),_s(e,t.diagnostics),zi(e,t.diagnostics);for(let r of e.tests)n.has(r.page)||t.diagnostics.push({gravite:`erreur`,message:`le test « ${r.nom} » vise la page « ${r.page} », qui n'existe pas. Pages : ${[...n].join(`, `)||`aucune`}.${M(r.page,n)}`,ligne:r.ligne});let c=new Set(t.diagnostics.filter(e=>e.message.startsWith(`le nom « `)).map(e=>e.ligne));return t.diagnostics.push(...bs(e).filter(e=>!c.has(e.ligne))),t.diagnostics.sort((e,t)=>e.ligne-t.ligne),t}const As={ajouter:`ajouter`,retirer:`retirer`,afficherErreur:`afficher erreur`,montrer:`montrer`,cacher:`cacher`,rediriger:`rediriger`,revenir:`revenir`,changerTexte:`changer texte`,changerTheme:`changer theme`},js={inferieur:`est inférieur à`,superieur:`est supérieur à`,inferieurOuEgal:`est inférieur ou égal à`,superieurOuEgal:`est supérieur ou égal à`};var Ms=class{page;nomsPages;resultat;classesDefinies;partages;composants;parametres;liens;fonctions;portees=new xs;elements;declareesPlusLoin=new Map;boucleFermee=new Map;elementsGardes=new Map;garde;litLaSession=!1;elementEnCours;ligneNomUtilisateur;formulaireOuvert;formulairesVus=new Map;soumissions=new Map;soumissionPerdue=!1;defilements=[];prioritaires=[];fichiers=new Map;cadre={evenement:void 0,minuteries:0,questions:0,actionsMessage:0,fenetres:0,attente:!1};fenetres=[];blocsNommes=new Map;listesDeplacees=new Map;raccourcis=new Map;evenementsOrdre=[];constructor(e,t,n,r,i=[],a={react:new Set,humalis:new Map},o=[],s={sources:new Map,routes:new Map,donnees:new Map},c=new Map){this.page=e,this.nomsPages=t,this.resultat=n,this.classesDefinies=r,this.partages=i,this.composants=a,this.parametres=o,this.liens=s,this.fonctions=c,this.elements=new La(e,n.diagnostics),n.elements.set(e,this.elements),this.recenserInteractions(e.corps);for(let t of e.corps)t.type===`Variable`&&!this.declareesPlusLoin.has(t.nom)&&this.declareesPlusLoin.set(t.nom,t.ligne)}boucles=0;fonctionOuverte;analyserFonction(e){this.portees.ouvrir();for(let t of e.definition.parametres)this.declarer(t.nom,t.ligne,B);this.fonctionOuverte={info:e,rendus:[]},this.bloc(e.definition.corps,`evenement`,{genre:`page`}),e.retour=this.fonctionOuverte.rendus.find(H)??B,this.fonctionOuverte=void 0,this.portees.fermer()}analyser(){this.portees.ouvrir();for(let e of this.partages)this.portees.declarerSymbole(e);this.portees.ouvrir();for(let e of this.parametres)this.declarer(e.nom,e.ligne,B);for(let e of this.page.parametres)Ss.has(U(e))&&this.erreur(`« ${e} » ne peut pas nommer un paramètre de page : c'est une option des éléments (avec ${e} …). Choisissez un autre nom.`,this.page.ligne),this.declarer(e,this.page.ligne,z);for(let e of this.page.filtres??[]){if(Ss.has(U(e.nom))&&this.erreur(`« ${e.nom} » ne peut pas nommer un filtre de page : c'est une option des éléments (avec ${e.nom} …). Choisissez un autre nom.`,e.ligne),this.page.parametres.includes(e.nom)){this.erreur(`« ${e.nom} » est à la fois un paramètre et un filtre de la page « ${this.page.nom} » : choisissez un seul rôle (un paramètre est dans le chemin, un filtre dans ?${e.nom}=…).`,e.ligne);continue}this.declarer(e.nom,e.ligne,e.nombre?ea:z)}this.recenserGardes(this.page.corps,void 0),this.fichiers=wo(this.page.corps),this.bloc(this.page.corps,`vue`,{genre:`page`});for(let e of[this.page.apercu?.titre,this.page.apercu?.description,this.page.apercu?.image])e&&this.typeDe(e);this.verifierEtatsRequetes(),Xo(this.defilements,this.signaler()),Yo(this.prioritaires,this.signaler()),this.finInteractions(),this.portees.fermer(),this.portees.fermer();for(let e of this.soumissionPerdue?[]:this.elements.formulaires)this.soumissions.has(e.id)||this.formulairesVus.get(e.nom)!==e.ligne||this.avertissement(`le formulaire « ${e.nom} » n’envoie rien : ajoutez quand le formulaire "${e.nom}" est soumis : suivi de ce qu’il faut faire.`,e.ligne);let e=this.partages.find(e=>U(e.nom)===`utilisateur`),t=this.ligneNomUtilisateur??e?.ligne,n=`le nom « utilisateur » est pris par la session (« si utilisateur est … », « se connecter ») : donnez un autre nom à cette variable, par exemple « membre ».`;this.litLaSession&&t!==void 0&&!this.resultat.diagnostics.some(e=>e.ligne===t&&e.message===n)&&this.erreur(n,t)}recenserGardes(e,t){for(let n of e)if(n.type===`Element`&&t){let e=this.elements.idDe(n);e&&this.elementsGardes.set(e,t)}else n.type===`Condition`?(this.recenserGardes(n.alors,Es(t,Ds(n.test))),this.recenserGardes(n.sinon,t)):(n.type===`Boucle`||n.type===`Formulaire`||n.type===`Bloc`||n.type===`Fenetre`)&&this.recenserGardes(n.corps,t)}declarerPartages(e){this.portees.ouvrir();let t=[];for(let n of e){n.options?.partagee||this.erreur(`en haut du fichier, une variable est partagée entre les pages : ajoutez « avec partagee » (variable ${n.nom} = … avec partagee).`,n.ligne);let e=this.typeDe(n.valeur);if(n.fichierDonnees){let t=e;for(;t.genre===`liste`;)t=t.de;t.genre===`fiche`&&(t.fichier=n.fichierDonnees)}this.resultat.types.set(n,e),this.declarer(n.nom,n.ligne,e,n);let r=this.portees.chercher(n.nom);r&&t.push(r)}return this.portees.fermer(),t}erreur(e,t){this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t})}avertissement(e,t){this.resultat.diagnostics.push({gravite:`avertissement`,message:e,ligne:t})}bloc(e,t,n){for(let r of e)this.instruction(r,t,n)}sousBloc(e,t,n){this.portees.ouvrir(),this.bloc(e,t,n),this.portees.fermer()}instruction(e,t,n){let r=this.fonctionOuverte?Is(e):void 0;if(r){this.erreur(`une fonction calcule une valeur : « ${r} » s'écrit dans un événement, pas dans une fonction.`,e.ligne);return}switch(e.type){case`Essayer`:if(t!==`evenement`){this.erreur(`« essayer » s'écrit dans un événement : il attrape l'erreur d'une requête ou d'une action.`,e.ligne);return}this.sousBloc(e.corps,t,n),this.portees.ouvrir(),this.declarer(`raison`,e.ligne,z),this.sousBloc(e.siErreur,t,n),this.portees.fermer();return;case`Supposant`:t!==`evenement`&&this.erreur(`« en supposant que ça marche » ne sert que dans un événement.`,e.ligne);for(let r of e.corps)r.type!==`Affectation`&&r.type!==`ModificationListe`&&this.erreur(`un élément ne se défait pas : placez ici changer, ajouter ou retirer.`,r.ligne),this.instruction(r,t,n);return;case`TantQue`:case`Repeter`:case`Selon`:{let r=e.type===`TantQue`?`tant que`:e.type===`Repeter`?`repeter`:`selon`;if(t===`vue`&&this.erreur(r===`selon`?`« selon » s'écrit dans un événement ou une fonction : dans la page, utilisez « si ».`:`« ${r} » s'écrit dans un événement ou une fonction : dans la page, « pour chaque » affiche une liste.`,e.ligne),e.type===`Selon`){this.typeDe(e.valeur);for(let r of e.cas)r.valeurs.forEach(e=>this.typeDe(e)),this.sousBloc(r.corps,t,n);this.sousBloc(e.sinon,t,n);return}if(e.type===`TantQue`){this.comparaison(e.test);let t=Ls(e.test),n=Rs(e.corps);t.length>0&&!t.some(e=>n.has(e))&&this.avertissement(`cette boucle ne change jamais « ${t[0]} » : elle risque de ne jamais s'arrêter.`,e.ligne)}else{let t=this.typeDe(e.fois);H(t)&&t.genre!==`nombre`&&this.erreur(`« repeter » attend un nombre de fois ; ${K(e.fois)} est ${V(t)}.`,e.ligne)}this.boucles++,this.sousBloc(e.corps,t,n),this.boucles--;return}case`Arreter`:case`PasserAuSuivant`:{let t=e.type===`Arreter`?`arreter`:`passer au suivant`;this.boucles===0&&this.erreur(`« ${t} » s'écrit dans une boucle (pour chaque, tant que, repeter).`,e.ligne);return}case`Rendre`:{let t=this.typeDe(e.valeur);this.fonctionOuverte?this.fonctionOuverte.rendus.push(t):this.erreur(`« rendre » ne s'écrit que dans une fonction (fonction … avec … :).`,e.ligne);return}case`Variable`:{e.options?.partagee&&this.erreur(`une variable partagée se déclare en haut du fichier, hors des pages.`,e.ligne);let t=this.typeDe(e.valeur);this.resultat.types.set(e,t),(e.valeur.type===`Rien`||e.valeur.type===`Premier`)&&this.resultat.facultatives.add(e),this.declarer(e.nom,e.ligne,t,e);return}case`Affectation`:{if(t===`vue`&&this.horsEvenement(`changer … par`,e.ligne),Ts.size===0&&U(e.nom)===`langue`&&!this.portees.chercher(e.nom)){this.variable(e.nom,e.ligne);return}if(this.valeurDeLangue(e.nom)===`langue`&&!e.champs){let t=e.valeur.type===`Reference`?Ts.get(U(e.valeur.nom)):void 0;if(t===void 0){let t=[...Ts.keys()];this.erreur(`« changer langue par » attend une langue du bloc « langues » : ${t.join(` ou `)} (sans guillemets).`,e.ligne)}else this.resultat.changementsLangue.set(e,t);return}let n=this.variable(e.nom,e.ligne);if(n?.origine?.type===`Variable`&&n.origine.fichierDonnees){this.erreur(`« ${e.nom} » vient d'un fichier : on peut la lire, pas la changer. Pour la modifier, copiez-la : variable mes_${e.nom} = ${e.nom}.`,e.ligne);return}let r=this.typeDe(e.valeur);if(n&&this.page.parametres.includes(e.nom)){this.erreur(`« changer » sur « ${e.nom} » : un paramètre vient du chemin de l'adresse, on ne le change pas. Changez de page avec rediriger vers "${this.page.nom}" avec ${e.nom} …`,e.ligne);return}if(n&&(this.page.filtres??[]).some(t=>t.nom===e.nom)){e.champs?this.erreur(`« ${e.nom} » est un filtre d'adresse : il n'a pas de champs.`,e.ligne):ia(n.type,r)||this.erreur(`le filtre « ${e.nom} » est ${V(n.type)} ; on ne peut pas lui donner ${V(r)}.`,e.ligne);return}if(n&&this.estCalcul(n,e.ligne))return;let i=n?.type;if(n&&e.champs){let t={type:`Reference`,nom:e.nom,ligne:e.ligne};for(let n of e.champs)t={type:`AccesChamp`,objet:t,champ:n,ligne:e.ligne};i=this.typeDe(t)}let a=[e.nom,...e.champs??[]].join(`.`);i&&!ia(i,r)&&this.erreur(`« ${a} » est ${V(i)} ; on ne peut pas lui donner ${V(r)}.`,e.ligne);return}case`ModificationListe`:this.modificationListe(e,t);return;case`Rechargement`:t===`evenement`&&(this.cadre.attente=!0),t===`vue`&&this.horsEvenement(`recharger`,e.ligne),this.usagesEtat.push({nom:e.variable,ligne:e.ligne,mot:`recharger`});return;case`Suppression`:case`Modification`:{let n=e.type===`Suppression`?`supprimer`:`modifier`;t===`evenement`&&(this.cadre.attente=!0),t===`vue`&&this.horsEvenement(n,e.ligne),this.operationServeur(e);return}case`EnvoiFichier`:t===`vue`&&this.horsEvenement(`envoyer fichier`,e.ligne,` Un fichier se choisit par une action de la personne : placez-le dans un événement (quand … clique sur …).`),this.envoiFichier(e);return;case`Requete`:t===`evenement`&&(this.cadre.attente=!0),t===`vue`&&this.horsEvenement(`envoyer requete`,e.ligne,` Pour charger des données à l'ouverture de la page, placez-la dans : quand la page se charge :`),this.requete(e);return;case`Element`:this.element(e,t);return;case`Graphique`:this.graphique(e,t);return;case`Formulaire`:this.formulaire(e,t,n);return;case`Bloc`:this.blocMiseEnPage(e,t,n);return;case`CodeDocumentation`:t===`evenement`&&this.erreur(`un bloc de code se place dans une page.`,e.ligne);return;case`TableauDocumentation`:e.legende||this.erreur(`un tableau attend une légende entre guillemets : tableau "Commandes" :`,e.ligne),e.colonnes.length===0&&this.erreur(`un tableau attend une ligne « colonnes ».`,e.ligne);for(let t of e.rangees)e.colonnes.length>0&&t.length!==e.colonnes.length&&this.erreur(`la rangée a ${t.length} cellules, mais le tableau a ${e.colonnes.length} colonnes.`,t[0]?.ligne??e.ligne);e.legende&&this.typeDe(e.legende),e.colonnes.forEach(e=>this.typeDe(e)),e.rangees.flat().forEach(e=>this.typeDe(e));return;case`Action`:this.action(e,t),e.message&&(ca(this.hote(),e,t===`vue`,this.cadre.minuteries>0),e.message.action&&t===`evenement`&&(this.cadre.actionsMessage++,this.sousBloc(e.message.action.corps,`evenement`,n),this.cadre.actionsMessage--));return;case`Condition`:{this.comparaison(e.test);let r=this.garde;this.garde=Es(r,Ds(e.test)),this.sousBloc(e.alors,t,n),this.garde=r,this.sousBloc(e.sinon,t,n);return}case`Connexion`:case`Deconnexion`:{let n=e.type===`Connexion`?`se connecter`:`se deconnecter`;this.litLaSession=!0,t===`vue`&&this.horsEvenement(n,e.ligne),this.demandeUnServeur(n,e.ligne),e.type===`Connexion`&&this.connexion(e);return}case`Boucle`:this.boucle(e,t,n);return;case`Composant`:this.usageComposant(e,t);return;case`Apercu`:this.erreur(`« apercu » décrit toute la page : écrivez-le directement sous « page "…" : », hors des blocs et des événements.`,e.ligne);return;case`Execution`:this.fonctions.has(e.nom)?this.erreur(`« ${e.nom} » rend une valeur : emploie-la dans un calcul, par exemple « calcul x = ${e.nom}(…) ».`,e.ligne):this.typeDe({type:`Appel`,nom:e.nom,arguments:e.arguments,ligne:e.ligne});return;case`SousPage`:t===`evenement`&&this.erreur(`« sous page » est un endroit de la page, pas une action : placez-le dans la page, hors des événements.`,e.ligne);return;case`Parametre`:this.erreur(`« parametre » ne s'utilise qu'au début d'un composant (composant "…" :).`,e.ligne);return;case`Evenement`:this.evenement(e,t,n);return;case`Minuterie`:this.minuterie(e,t,n);return;case`Copier`:ma(this.hote(),e,this.placeGeste(t));return;case`Partager`:if(ha(this.hote(),e,this.placeGeste(t)),e.lien){this.pageCible(e.lien.adresse,e.ligne);let t=ps(e.lien.adresse).page;t!==void 0&&t!==``&&this.argumentsPage(t,e.lien.parametres??[],`partager … avec lien vers`,e.ligne)}return;case`Confirmer`:{let r=this.placeGeste(t);ga(this.hote(),e,{dansLaPage:t===`vue`,sansGeste:r.sansGeste,dansUneAction:this.cadre.actionsMessage>0,profondeur:this.cadre.questions}),this.cadre.attente=!0,this.cadre.questions++,this.sousBloc(e.alors,t,n),this.cadre.questions--,this.sousBloc(e.sinon,t,n);return}case`Fenetre`:_a(this.hote(),e,{dansUnEvenement:t===`evenement`,dansUneFenetre:this.cadre.fenetres>0}),this.cadre.fenetres++,this.sousBloc(e.corps,`vue`,n),this.cadre.fenetres--;return}}hote(){return{erreur:(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}),avertissement:(e,t)=>this.resultat.diagnostics.push({gravite:`avertissement`,message:e,ligne:t}),typeDe:e=>this.typeDe(e)}}placeGeste(e){return{dansLaPage:e===`vue`,sansGeste:this.cadre.minuteries>0?`minuterie`:this.cadre.evenement===`chargement`?`chargement`:void 0,apresUneAttente:this.cadre.attente}}recenserInteractions(e){for(let t of e)if(t.type===`Fenetre`){let e=t.nom??t.titre,n=this.fenetres.find(t=>t.nom===e);n?ka(this.hote(),e,n.noeud.ligne,t.ligne):this.fenetres.push({noeud:t,id:`fenetre_${U(e)||t.ligne}`,nom:e,ouverte:!1,fermee:!1}),this.recenserInteractions(t.corps)}else if(t.type===`Bloc`){if(t.nom!==void 0){let e=this.blocsNommes.get(t.nom);e?Aa(this.hote(),t.nom,e.ligne,t.ligne):this.blocsNommes.set(t.nom,{id:`bloc_${U(t.nom)||t.ligne}`,ligne:t.ligne})}this.recenserInteractions(t.corps)}else t.type===`Condition`?(this.recenserInteractions(t.alors),this.recenserInteractions(t.sinon)):(t.type===`Boucle`||t.type===`Formulaire`)&&this.recenserInteractions(t.corps)}fenetreVisee(e,t){let n=this.fenetres.find(e=>e.nom===t);if(n)return e.action===`montrer`&&(n.ouverte=!0),e.action===`cacher`&&(n.fermee=!0),n.id}minuterie(e,t,n){let r=t===`vue`;la(this.hote(),e,{page:r,auPremierNiveau:this.page.corps.includes(e),survol:this.cadre.evenement===`survol`}),e.tantQue&&this.comparaison(e.tantQue),this.cadre.minuteries++,this.boucles++,this.sousBloc(e.corps,`evenement`,n),this.boucles--,this.cadre.minuteries--}evenementInteraction(e,t){let n=t.genre===`boucle`?t.elements:void 0;switch(e.genre){case`touche`:{e.cible!==void 0&&this.cible(e,e.cible,n);let t=wa(this.hote(),e.touches??``,e.ligne,{dansUnChamp:e.cible!==void 0});t!==void 0&&this.raccourci(t,e.cible,e.ligne);return}case`saisie`:case`pauseSaisie`:{let r=e.cible??``,i=this.elements.resoudre(r,`champ`,n);if(!(`ids`in i)){let t=this.elements.elements.filter(e=>e.noeud.element===`champ`).map(e=>e.nom??e.libelle).filter(e=>!!e);ja(this.hote(),r,this.page.nom,t,e.ligne);return}this.resultat.cibles.set(e,i.ids);let a=this.elements.parId(i.ids[0])?.noeud.sorte;Ta(this.hote(),e,a,t.genre===`boucle`);return}case`bas`:{let t=e.cible??``,n=this.blocsNommes.get(t);!n||n.bas!==void 0?Ma(this.hote(),t,n?.bas,e.ligne):(n.bas=e.ligne,this.resultat.cibles.set(e,[n.id])),e.tantQue&&this.comparaison(e.tantQue),Oa(this.hote(),e,e.tantQue?Ls(e.tantQue):[]);return}case`ordre`:this.variable(e.variable??``,e.ligne),this.evenementsOrdre.push(e);return}}deplacement(e,t){let n=e.liste,r=(n.type===`Reference`?this.portees.chercher(n.nom):void 0)?.origine,i=n.type===`Reference`&&r?.type===`Variable`&&!r.calcul?n.nom:void 0,a=i===void 0?void 0:this.listesDeplacees.get(i);Na(this.hote(),e,{dansUnEvenement:t===`evenement`,variable:i,deja:a})&&i!==void 0&&this.listesDeplacees.set(i,e.ligne)}raccourci(e,t,n){let r=t===void 0?e:`${e}@${t}`,i=this.raccourcis.get(r);i===void 0?this.raccourcis.set(r,n):Pa(this.hote(),e,i,n)}finInteractions(){for(let e of this.fenetres)va(this.hote(),e.noeud,e.ouverte,e.fermee);for(let e of this.evenementsOrdre)Fa(this.hote(),e,this.listesDeplacees.has(e.variable??``));for(let e of this.fenetres)this.resultat.fenetres.set(e.noeud,e.id);for(let[e,t]of this.blocsNommes)this.resultat.blocsNommes.set(e,t.id)}element(e,t){if(t===`evenement`&&this.erreur(`un élément ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour le faire apparaître.`,e.ligne),this.elementEnCours=e.element,this.typeDe(e.contenu),this.elementEnCours=void 0,e.cible!==void 0){this.pageCible(e.cible,e.ligne);let t=ps(e.cible);t.page===void 0?e.arguments?.length&&this.erreur(t.externe?`une adresse externe (${e.cible}) n'a pas de paramètres de page : retirez « avec ${e.arguments[0].nom} … ».`:`« avec ${e.arguments[0].nom} … » demande une page : écrivez vers "page" avec …`,e.ligne):this.argumentsPage(t.page,e.arguments??[],`${e.element} … vers`,e.ligne)}e.nouvelOnglet&&e.element!==`lien`&&this.erreur(`« avec nouvel onglet » s'applique à un lien, pas à un ${e.element}.`,e.ligne);for(let t of e.styles){if(t.texte&&!t.texte.parties.some(e=>e.type===`variable`)&&this.versionsLues(t.texte),t.propriete===`decoratif`||e.element===`audio`&&t.propriete===`automatique`)continue;let n=yt(t.propriete,t.valeur,this.resultat.couleursTheme);if(`erreur`in n)this.erreur(n.erreur,e.ligne);else{let r=_t(t.propriete,e.element);r&&this.erreur(r,e.ligne),this.contrasteDuTheme(n.propriete,n.valeur,e.ligne)}}for(let t of e.classes)this.classesDefinies&&!this.classesDefinies.has(t)&&this.avertissement(`la classe CSS « ${t} » n'est définie dans aucun bloc style.`,e.ligne);if(Ya(e,this.signaler()),Ho(e.styles,e.element,this.formulaireOuvert!==void 0,e.ligne,this.signaler())&&this.defilements.push(e.ligne),e.element===`image`&&Wo(e,this.signaler())&&this.prioritaires.push(e.ligne),e.element===`fichier`&&this.choixFichier(e),e.element===`audio`&&qo(e,this.signaler()),e.element===`marqueur`&&jo(e,this.pileBlocs.some(e=>e.genre===`carte`),this.signaler()),this.optionsDeChamp(e),e.raccourci!==void 0){let t=Ia(this.hote(),e);t!==void 0&&this.raccourci(t,void 0,e.ligne)}}choixFichier(e){bo(e,this.signaler());let t=e.fichier,n=this.variable(t.variable,e.ligne);if(!n)return;let r=n.origine?.type===`Variable`?n.origine:void 0;(r?.options?.memorisee||r?.options?.partagee)&&this.erreur(`un fichier choisi ne se garde pas (ni mémorisé dans le navigateur, ni partagé entre les pages) : déclarez variable `+t.variable+` = rien dans la page.`,e.ligne);let i=yo(t.plusieurs);!H(n.type)||n.type.genre===`liste`&&!H(n.type.de)?(n.type=i,n.origine&&this.resultat.types.set(n.origine,i)):ia(n.type,i)||this.erreur(`« ${t.variable} » est ${V(n.type)} ; elle reçoit un fichier choisi. Déclarez variable ${t.variable} = rien.`,e.ligne)}envoiFichier(e){Co(e,{fichiers:this.fichiers,sources:this.liens.sources,typeDe:(e,t)=>this.variable(e,t)?.type},this.signaler()),e.resultat!==void 0&&this.ciblesSources.add(e.resultat)}optionsDeChamp(e){let t=[`progression`,`etoiles`,`compteur`].includes(e.element),n=[`obligatoire`,`indice`,`minimum`,`maximum`].filter(n=>e[n]!==void 0&&!(t&&(n===`minimum`||n===`maximum`)));if(e.element!==`champ`){n.length>0&&this.erreur(`l’option « ${n[0]} » s’applique à un champ (champ, case à cocher, choix, liste déroulante), pas à un ${e.element}.`,e.ligne);return}if(e.parmi){let t=this.typeDe(e.parmi),n=t.genre===`liste`&&(t.de.genre===`texte`||!H(t.de));H(t)&&!n&&this.erreur(`après « parmi », il faut une liste de textes, par exemple ["S", "M", "L"] ; ici, c’est ${t.genre===`liste`?ra(t):V(t)}.`,e.ligne)}for(let n of[`minimum`,`maximum`])e[n]!==void 0&&e.sorte!==`nombre`&&!t&&this.erreur(`l’option « ${n} » s’applique à un champ nombre : écrivez champ nombre "…" avec ${n} ….`,e.ligne);e.minimum!==void 0&&e.maximum!==void 0&&e.minimum>e.maximum&&this.erreur(`le minimum (${e.minimum}) est plus grand que le maximum (${e.maximum}).`,e.ligne),e.indice!==void 0&&(e.sorte===`case`||e.sorte===`choix`)&&this.erreur(`l’option « indice » ne s’applique pas à une case à cocher ni à un choix : il n’y a rien à écrire dedans.`,e.ligne),(e.obligatoire||e.minimum!==void 0||e.maximum!==void 0)&&!this.formulaireOuvert&&this.avertissement(`« obligatoire », « minimum » et « maximum » sont vérifiés à l’envoi d’un formulaire : placez ce champ dans un bloc formulaire "…" :`,e.ligne)}formulaire(e,t,n){if(t===`evenement`)this.erreur(`un formulaire ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour le faire apparaître.`,e.ligne);else if(this.formulaireOuvert)this.erreur(`un formulaire ne peut pas contenir un autre formulaire : placez « ${e.nom} » à côté de « ${this.formulaireOuvert.nom} ».`,e.ligne);else{let t=this.formulairesVus.get(e.nom);t===void 0?this.formulairesVus.set(e.nom,e.ligne):this.erreur(`le formulaire « ${e.nom} » existe déjà dans cette page (ligne ${t}).`,e.ligne)}let r=this.formulaireOuvert;this.formulaireOuvert??=e,this.sousBloc(e.corps,`vue`,n),this.formulaireOuvert=r}pileBlocs=[];signaler(){return{erreur:(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}),avertissement:(e,t)=>this.resultat.diagnostics.push({gravite:`avertissement`,message:e,ligne:t}),typeDe:e=>this.typeDe(e)}}graphique(e,t){e.description?.type===`Chaine`&&!e.description.parties.some(e=>e.type===`variable`)&&this.versionsLues(e.description),Qo(e,{...this.signaler(),dansEvenement:t===`evenement`,champsDe:e=>this.champsDesElements(e),listeEcrite:e=>{if(e.type===`Liste`)return e;let t=e.type===`Reference`?this.portees.chercher(e.nom)?.origine:void 0;return t?.type===`Variable`&&t.valeur.type===`Liste`?t.valeur:void 0},couleur:e=>{let t=yt(`couleur`,e,this.resultat.couleursTheme);if(`erreur`in t)return t;let n=this.resultat.valeursTheme.get(t.valeur)??Qa[t.valeur];return{nom:t.valeur,clair:n.clair,sombre:n.sombre}},modes:this.resultat.modesVus})}contrasteDuTheme(e,t,n){if(e!==`couleur`&&e!==`texte`)return;let r=this.resultat.valeursTheme.get(t);if(r)for(let e of this.resultat.modesVus){let i=Zn(r[e],Kn[e]);if(i<3){this.avertissement(`la couleur « ${t} » (mode ${e}) se voit mal sur le fond de la page (contraste ${i.toFixed(1).replace(`.`,`,`)} pour 1, il en faut au moins 3). Choisissez une couleur plus ${e===`clair`?`foncée`:`claire`} pour ce mode.`,n);return}}}blocMiseEnPage(e,t,n){t===`evenement`&&this.erreur(`un bloc ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour faire apparaître ce qu’il contient.`,e.ligne);for(let t of e.styles){let n=yt(t.propriete,t.valeur,this.resultat.couleursTheme);if(`erreur`in n)this.erreur(n.erreur,e.ligne);else{let r=_t(t.propriete,e.genre);r&&this.erreur(r,e.ligne),this.contrasteDuTheme(n.propriete,n.valeur,e.ligne)}}for(let t of e.classes)this.classesDefinies&&!this.classesDefinies.has(t)&&this.avertissement(`la classe CSS « ${t} » n'est définie dans aucun bloc style.`,e.ligne);Za(e,this.pileBlocs[this.pileBlocs.length-1],this.signaler()),e.genre===`carte`&&Ao(e,this.signaler()),Ho(e.styles,e.genre,this.formulaireOuvert!==void 0,e.ligne,this.signaler())&&this.defilements.push(e.ligne),this.pileBlocs.push(e),this.sousBloc(e.corps,`vue`,n),this.pileBlocs.pop()}action(e,t){let n=As[e.action];switch(t===`vue`&&e.action!==`afficher`&&this.horsEvenement(n,e.ligne),e.action){case`afficher`:case`afficherErreur`:this.typeDe(e.arguments[0]);return;case`changerTheme`:{let t=Ps(e.arguments[0]);(t===void 0||![`clair`,`sombre`,`automatique`,`bascule`].includes(t))&&this.erreur(`« changer theme par … » prend clair, sombre ou automatique (ici : « ${t??`?`} »).`,e.ligne);return}case`rediriger`:{let t=Ps(e.arguments[0]);t===void 0?this.typeDe(e.arguments[0]):this.pageCible(t,e.ligne);let n=t===void 0?void 0:ps(t).page;if(t!==void 0&&n!==void 0)this.argumentsPage(n,e.parametres??[],`rediriger vers`,e.ligne);else if(t!==void 0&&e.parametres?.length)this.erreur(`« rediriger vers … avec … » demande une page : rediriger vers "produit" avec id …`,e.ligne);else if(e.parametres?.length){for(let t of e.parametres)this.typeDe(t.valeur);this.erreur(`« rediriger vers … avec … » demande le nom de la page entre guillemets : rediriger vers "produit" avec id …`,e.ligne)}return}case`revenir`:if(e.arguments.length>0){let t=Ps(e.arguments[0]);t===void 0?(this.typeDe(e.arguments[0]),this.erreur(`« revenir vers » demande le nom de la page entre guillemets : revenir vers "catalogue"`,e.ligne)):this.nomsPages.has(t)||this.erreur(`« revenir vers ${t} » : la page n'existe pas. Pages : ${[...this.nomsPages].join(`, `)}.${M(t,this.nomsPages)}`,e.ligne)}return;case`montrer`:case`cacher`:case`changerTexte`:{let t=Ps(e.arguments[0]);if(t===void 0){let t=e.action===`changerTexte`?`changer texte de "description" par …`:`${n} "menu"`;this.erreur(`écrivez le nom de l'élément entre guillemets, par exemple : ${t}`,e.ligne)}else this.cible(e,t);e.action===`changerTexte`&&this.typeDe(e.arguments[1]);return}}}usageComposant(e,t){t===`evenement`&&this.erreur(`un composant ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour le faire apparaître.`,e.ligne);let n=e.proprietes.map(e=>this.typeDe(e.valeur)),r=this.composants.humalis.get(e.nom);if(r){e.proprietes.forEach((t,i)=>{if(!r.includes(t.nom)){this.erreur(`« ${t.nom} » n'est pas un paramètre du composant « ${e.nom} ». Paramètres : ${r.join(`, `)}.`,e.ligne);return}let a=`${e.nom}.${t.nom}`;this.resultat.typesParametres.set(a,[...this.resultat.typesParametres.get(a)??[],n[i]])});for(let t of r)e.proprietes.some(e=>e.nom===t)||this.avertissement(`le paramètre « ${t} » du composant « ${e.nom} » n'est pas donné.`,e.ligne)}else this.composants.react.has(e.nom)||this.erreur(`le composant « ${e.nom} » n'est pas déclaré. Ajoutez en haut du fichier : utiliser composant "${e.nom}" depuis "…", ou écrivez-le avec composant "${e.nom}" :`,e.ligne)}boucle(e,t,n){let r=this.typeDe(e.liste);H(r)&&r.genre!==`liste`&&this.erreur(`${K(e.liste)} est ${V(r)} ; pour chaque … dans attend une liste.`,e.ligne);let i=r.genre===`liste`?r.de:B;this.resultat.types.set(e,i),e.deplacement&&this.deplacement(e,t),this.portees.ouvrir(),this.declarer(e.variable,e.ligne,i,e);let a=t===`vue`?{genre:`boucle`,elements:this.elements.elementsDe(e.corps),formulaires:this.elements.formulairesDe(e.corps)}:n;t===`evenement`&&this.boucles++,this.bloc(e.corps,t,a),t===`evenement`&&this.boucles--,this.portees.fermer(),this.boucleFermee.set(e.variable,e.ligne)}evenement(e,t,n){t===`evenement`&&this.erreur(`un événement ne se place pas dans un autre événement : écrivez-le dans la page, sous son élément.`,e.ligne),e.genre===`soumission`?this.soumission(e,n):[`touche`,`saisie`,`pauseSaisie`,`bas`,`ordre`].includes(e.genre)?this.evenementInteraction(e,n):e.cible!==void 0&&(n.genre===`boucle`&&!n.elements.some(t=>Ns(t,e.cible))?this.erreur(`« ${e.cible} » n’est pas dans cette boucle : un événement placé dans une boucle vise un élément de la même boucle.`,e.ligne):this.cible(e,e.cible,n.genre===`boucle`?n.elements:void 0));let r=this.resultat.cibles.get(e)??[],i=r.map(e=>this.elementsGardes.get(e)),a=this.garde;r.length>0&&i.every(e=>e!==void 0)&&(this.garde=Es(a,i.includes(`connecte`)?`connecte`:`admin`)),e.corps.forEach((t,n)=>{t.type===`Supposant`&&![`Requete`,`Suppression`,`Modification`].some(t=>e.corps[n+1]?.type===t)&&this.erreur(`« en supposant que ça marche » demande une requête juste après : sinon il n’y a rien à défaire.`,t.ligne)});let o={...this.cadre};this.cadre.evenement=e.genre,this.cadre.attente=!1,this.sousBloc(e.corps,`evenement`,n),Object.assign(this.cadre,o),this.garde=a}soumission(e,t){let n=e.cible??``,r=this.elements.formulaires,i=(t.genre===`boucle`?t.formulaires:r).find(e=>e.nom===n);if(!i){this.soumissionPerdue=!0,t.genre===`boucle`&&r.some(e=>e.nom===n)?this.erreur(`« ${n} » n’est pas dans cette boucle : un événement placé dans une boucle vise un formulaire de la même boucle.`,e.ligne):r.length===0?this.erreur(`le formulaire « ${n} » n’existe pas dans cette page : créez-le avec formulaire "${n}" : suivi de ses champs et d’un bouton.`,e.ligne):this.erreur(`le formulaire « ${n} » n’existe pas dans cette page. Formulaires de la page : ${[...new Set(r.map(e=>e.nom))].join(`, `)}.`,e.ligne);return}let a=this.soumissions.get(i.id);if(a!==void 0){this.erreur(`le formulaire « ${n} » a déjà son événement « est soumis » (ligne ${a}) : réunissez les deux dans le même événement.`,e.ligne);return}this.soumissions.set(i.id,e.ligne),this.resultat.cibles.set(e,[i.id])}connexion(e){let t=[e.email,e.motDePasse];for(let e of t)this.typeDe(e);let n=t.map(e=>e.type===`Champ`?this.sorteDuChamp(e):void 0);if(t.some(e=>e.type!==`Champ`)||n.some(e=>e===`case`||e===`choix`||e===`liste`)){this.erreur(`« se connecter » attend deux champs de la page : se connecter avec champ "email" et champ "mot de passe"`,e.ligne);return}let[r,i]=t.map(e=>this.resultat.champs.get(e));r!==void 0&&r===i&&this.erreur(`« se connecter » attend deux champs différents : l’email, puis le mot de passe.`,e.ligne)}demandeUnServeur(e,t){this.liens.serveur!==void 0||[...this.liens.sources.values()].some(e=>e.source.session)||this.erreur(`« ${e} » demande un serveur dans le même fichier : la connexion passe par ses packs Astratra. Ajoutez un bloc serveur "…" :`,t)}comparaison(e){if(e.type===`Combinaison`){this.comparaison(e.gauche),this.comparaison(e.droite);return}let t=this.typeDe(e.gauche),n=e.droite?this.typeDe(e.droite):B;switch(e.operateur){case`dans`:H(n)&&n.genre!==`liste`?this.erreur(`« est dans » cherche dans une liste ; cette valeur est ${V(n)}.`,e.ligne):n.genre===`liste`&&H(n.de)&&!ia(t,n.de)&&this.erreur(`on ne peut pas chercher ${V(t)} dans ${ra(n)}.`,e.ligne);return;case`egal`:case`different`:ia(t,n)||this.erreur(`on ne peut pas comparer ${V(t)} et ${V(n)}.`,e.ligne);return;case`vide`:H(t)&&t.genre!==`texte`&&t.genre!==`liste`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « est vide » s'applique à un texte ou à une liste.`,e.ligne);return;case`rien`:return;case`commencePar`:case`finitPar`:H(t)&&t.genre!==`texte`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « ${e.operateur===`commencePar`?`commence par`:`finit par`} » s'applique à un texte.`,e.ligne);return;case`contient`:H(t)&&t.genre!==`texte`&&t.genre!==`liste`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « contient » s'applique à un texte ou à une liste.`,e.ligne);return;case`vrai`:case`faux`:H(t)&&t.genre!==`booleen`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « est ${e.operateur} » attend vrai ou faux.`,e.ligne);return;default:for(let[r,i]of[[e.gauche,t],[e.droite,n]])r&&H(i)&&i.genre!==`nombre`&&this.erreur(`${K(r)} est ${V(i)} ; « ${js[e.operateur]} » compare des nombres.`,e.ligne)}}versionsLues(e){for(let t of e.versions??[])this.interpolations({type:`Chaine`,parties:t.parties,ligne:t.ligne});for(let t of this.resultat.langues.traductions.get(At(e.parties))?.values()??[])this.interpolations({type:`Chaine`,parties:t,ligne:e.ligne})}typeDe(e){switch(e.type){case`Chaine`:return[e.parties,...e.versions?.map(e=>e.parties)??[]].some(e=>e.some(e=>e.type===`accent`))&&![`titre`,`soustitre`,`texte`].includes(this.elementEnCours??``)&&this.erreur(`accent s’emploie seulement dans un titre, un soustitre ou un texte.`,e.ligne),this.interpolations(e),this.versionsLues(e),z;case`Nombre`:return ea;case`Booleen`:return ta;case`Liste`:{let t=e.elements.map(e=>this.typeDe(e));return na(t[0]??B)}case`Reference`:{let t=this.valeurDeLangue(e.nom);return t===void 0?this.variable(e.nom,e.ligne)?.type??B:(this.resultat.referencesLangue.set(e,t),z)}case`Calcul`:return this.calcul(e);case`AccesChamp`:return this.accesChamp(e);case`Rien`:return B;case`Appel`:return this.appel(e);case`Agregat`:{let t=this.typeDe(e.liste),n=`« ${e.operation} de »`;return H(t)&&(t.genre!==`liste`||H(t.de)&&t.de.genre!==`nombre`)&&this.erreur(`${n} calcule sur une liste de nombres ; ${K(e.liste)} est ${t.genre===`liste`?ra(t):V(t)}.`,e.ligne),ea}case`Filtre`:case`Tri`:case`Premier`:case`Premiers`:case`Groupement`:return this.operationDeListe(e);case`OperationTexte`:case`Remplacement`:{let t=e.type===`OperationTexte`?[e.valeur]:[e.cherche,e.remplace,e.dans],n=e.type===`OperationTexte`?`« ${e.operation} de »`:`« remplacer »`;for(let r of t){let t=this.typeDe(r);H(t)&&t.genre!==`texte`&&this.erreur(`${n} attend un texte ; ${K(r)} est ${V(t)}.`,e.ligne)}return e.type===`OperationTexte`&&e.operation===`longueur`?ea:z}case`DateDuJour`:return z;case`DateDecalee`:case`JoursEntre`:{let t=e.type===`DateDecalee`?[e.date]:[e.debut,e.fin];for(let n of t){let t=this.typeDe(n);H(t)&&t.genre!==`texte`&&this.erreur(`une date s'écrit comme « aujourd'hui » ou « 2026-11-07 » ; ${K(n)} est ${V(t)}.`,e.ligne)}if(e.type===`DateDecalee`){let t=this.typeDe(e.nombre);return H(t)&&t.genre!==`nombre`&&this.erreur(`« ${e.signe>0?`plus`:`moins`} … ${e.unite} » attend un nombre ; ${K(e.nombre)} est ${V(t)}.`,e.ligne),z}return ea}case`Arrondi`:case`Hasard`:{let t=e.type===`Arrondi`?[e.valeur]:[e.minimum,e.maximum];for(let n of t){let t=this.typeDe(n);H(t)&&t.genre!==`nombre`&&this.erreur(`« ${e.type===`Arrondi`?`arrondi de`:`hasard entre`} » attend un nombre ; ${K(n)} est ${V(t)}.`,e.ligne)}return ea}case`Fiche`:{let t=[];for(let n of e.champs){if(t.some(e=>e.nom===n.nom)){this.erreur(`le champ « ${n.nom} » est donné deux fois dans cette fiche.`,n.ligne);continue}t.push({nom:n.nom,type:this.typeDe(n.valeur)})}return{genre:`fiche`,champs:t}}case`EtatRequete`:return this.usagesEtat.push({nom:e.variable,ligne:e.ligne,mot:`est ${e.etat===`introuvable`?``:`en `}${e.etat}`}),ta;case`ErreurRequete`:return this.usagesEtat.push({nom:e.variable,ligne:e.ligne,mot:`erreur de`}),z;case`MouvementReduit`:case`ThemeSombre`:return ta;case`EtatUtilisateur`:return this.litLaSession=!0,this.demandeUnServeur(`utilisateur est ${e.etat}`,e.ligne),ta;case`Compte`:{let t=this.typeDe(e.liste);return H(t)&&t.genre!==`liste`&&this.erreur(`${K(e.liste)} est ${V(t)} ; « nombre de » compte les éléments d’une liste.`,e.ligne),ea}case`Champ`:{let t=this.elements.resoudre(e.nom,`champ`);`ids`in t?this.resultat.champs.set(e,t.ids[0]):this.erreur(`aucun champ « ${e.nom} » dans la page « ${this.page.nom} ».${M(e.nom,this.elements.elements.filter(e=>e.noeud.element===`champ`).flatMap(e=>[e.nom,e.libelle].filter(e=>e!==void 0)))}`,e.ligne);let n=this.sorteDuChamp(e);return n===`nombre`?ea:n===`case`?ta:z}}}appel(e){let t=e.arguments.map(e=>this.typeDe(e)),n=this.fonctions.get(e.nom);if(!n&&this.resultat.fonctionsActions.has(e.nom))return this.erreur(`« ${e.nom} » fait des actions sans rendre de valeur : appelle-la seule sur une ligne, dans un événement (« ${e.nom}() »).`,e.ligne),B;if(!n){let t=[...this.fonctions.keys()];return this.erreur(t.length>0?`la fonction « ${e.nom} » n'existe pas. Fonctions : ${t.join(`, `)}.${M(e.nom,t)}`:`la fonction « ${e.nom} » n'existe pas : écrivez-la en haut du fichier, avec fonction ${e.nom} avec … :`,e.ligne),B}let r=n.definition.parametres.map(e=>e.nom);return r.length===t.length?n.appels.push(t):this.erreur(`la fonction « ${e.nom} » attend ${(e=>`${e} valeur${e>1?`s`:``}`)(r.length)}${r.length>0?` (${r.join(`, `)})`:``}, mais en reçoit ${t.length}.`,e.ligne),n.retour}operationDeListe(e){let t=this.typeDe(e.liste);if(H(t)&&t.genre!==`liste`){let n={Filtre:`« dont »`,Tri:`« trier »`,Premier:`« premier de »`,Premiers:`« les … premiers de »`,Groupement:`« grouper »`}[e.type];return this.erreur(`${n} s'applique à une liste ; ${K(e.liste)} est ${V(t)}.`,e.ligne),B}let n=t.genre===`liste`?t.de:B,r=this.champsDesElements(n),i=t=>this.erreur(`« ${t} » n'est pas un champ des éléments de ${K(e.liste)}. Champs : ${r.map(e=>e.nom).join(`, `)}.${M(t,r.map(e=>e.nom))}`,e.ligne);switch(e.type){case`Groupement`:{if(H(n)&&!r.length)return this.erreur(`« grouper » range une liste de fiches ou de données du serveur par un de leurs champs ; ${K(e.liste)} est ${ra(t)}.`,e.ligne),B;let a=r.find(t=>t.nom===e.champ);return!a&&H(n)&&i(e.champ),{genre:`liste`,de:{genre:`fiche`,champs:[{nom:`nom`,type:a?.type??B},{nom:`elements`,type:t}]}}}case`Filtre`:{if(H(n)&&!r.length)return this.erreur(`« dont » filtre une liste de fiches ou de données du serveur ; ${K(e.liste)} est ${ra(t)}.`,e.ligne),t;let a=Ls(e.test).filter(e=>!r.some(t=>t.nom===e)&&!this.portees.chercher(e));if(a.length>0&&r.length>0)return i(a[0]),t;this.portees.ouvrir();for(let t of r)this.portees.declarerSymbole({nom:t.nom,ligne:e.ligne,type:t.type});return this.comparaison(e.test),this.portees.fermer(),this.resultat.filtres.set(e,r.map(e=>e.nom)),t}case`Tri`:{if(e.champ===void 0)return this.resultat.tris.set(e,n.genre===`texte`?`texte`:`nombre`),t;let a=r.find(t=>t.nom===e.champ);return a?(this.resultat.tris.set(e,a.type.genre===`texte`?`texte`:`nombre`),t):(H(n)&&i(e.champ),t)}case`Premier`:return n;case`Premiers`:{let n=this.typeDe(e.nombre);return H(n)&&n.genre!==`nombre`&&this.erreur(`« les … premiers de » attend un nombre.`,e.ligne),t}}}champsDesElements(e){if(e.genre===`fiche`)return e.champs;if(e.genre===`donnee`){let t=this.liens.donnees.get(e.nom);return t?[{nom:`id`,type:z},...t.champs.map(e=>({nom:e.nom,type:this.typeDeChamp(e.type)}))]:[]}return[]}sorteDuChamp(e){let t=this.elements.resoudre(e.nom,`champ`);return`ids`in t?this.elements.parId(t.ids[0])?.noeud.sorte:void 0}calcul(e){for(let t of[e.gauche,e.droite]){let n=this.typeDe(t);if(H(n)&&n.genre!==`nombre`){let r=n.genre===`texte`&&e.operateur===`+`?` Pour coller du texte, écrivez par exemple : "Total : {total}"`:``;this.erreur(`${K(t)} est ${V(n)} ; « ${e.operateur} » calcule avec des nombres.${r}`,e.ligne)}}return e.operateur===`/`&&e.droite.type===`Nombre`&&e.droite.valeur===0&&this.erreur(`division par zéro : le nombre après « / » ne peut pas être 0.`,e.ligne),ea}modificationListe(e,t){t===`vue`&&this.horsEvenement(e.operation,e.ligne);let n=this.typeDe(e.valeur),r=this.variable(e.liste,e.ligne);if(r?.origine?.type===`Variable`&&r.origine.fichierDonnees){this.erreur(`« ${e.liste} » vient d'un fichier : on peut la lire, pas la changer. Pour la modifier, copiez-la : variable mes_${e.liste} = ${e.liste}.`,e.ligne);return}if(!r||this.estCalcul(r,e.ligne))return;let i=r.type;if(H(i)&&i.genre!==`liste`){this.erreur(`« ${e.liste} » est ${V(i)} ; on ne peut ajouter ou retirer que dans une liste.`,e.ligne);return}if(i.genre===`liste`){if(!H(i.de))e.operation===`ajouter`&&H(n)&&(r.type=na(n),r.origine&&this.resultat.types.set(r.origine,r.type));else if(!ia(i.de,n)){let t=e.operation===`ajouter`?`y ajouter`:`en retirer`;this.erreur(`« ${e.liste} » est ${ra(i)} ; on ne peut pas ${t} ${V(n)}.`,e.ligne)}}}estCalcul(e,t){return e.origine?.type!==`Variable`||!e.origine.calcul?!1:e.origine.constante?(this.erreur(`« ${e.nom} » est une constante : sa valeur ne change pas (ligne ${e.ligne}). Écrivez « variable ${e.nom} = … » si elle doit changer.`,t),!0):(this.erreur(`« ${e.nom} » est un calcul : sa valeur se recalcule seule (ligne ${e.ligne}). Changez plutôt les variables dont il dépend.`,t),!0)}interpolations(e){for(let t of e.parties){if(t.type!==`variable`)continue;let n=zs(t.valeur);if(`erreur`in n){this.erreur(n.erreur,e.ligne);continue}n.chemin!==t.valeur&&this.resultat.chemins.set(t,n.chemin);let[r,...i]=n.chemin.split(`.`);if(!this.portees.chercher(r)){this.erreur(`le texte utilise {${t.valeur}}, mais la variable « ${r} » n'est pas déclarée.${M(r,this.portees.nomsVisibles())}`,e.ligne);continue}let a={type:`Reference`,nom:r,ligne:e.ligne};for(let t of i)a={type:`AccesChamp`,objet:a,champ:t,ligne:e.ligne};let o=i.length>0?this.typeDe(a):this.portees.chercher(r).type;if(`depuis`in n&&n.depuis){if(H(o)&&o.genre!==`texte`){this.erreur(`« ${n.chemin} » est ${V(o)} ; « depuis » s'écrit après une date.`,e.ligne);continue}this.resultat.formats.set(t,`depuis`);continue}if(n.devise||n.pluriel){if(H(o)&&o.genre!==`nombre`){let t=n.devise?`« en ${n.mot} »`:`« ${n.pluriel} »`;this.erreur(`« ${n.chemin} » est ${V(o)} ; ${t} s'écrit après un nombre.`,e.ligne);continue}n.devise&&this.resultat.formats.set(t,n.devise),n.pluriel&&this.resultat.pluriels.set(t,n.pluriel);continue}o.genre===`nombre`?this.resultat.formats.set(t,`nombre`):(i.length===1&&this.estChampDate(r,i[0])||i.length===0&&this.estUneDate(r))&&this.resultat.formats.set(t,`date`)}}estUneDate(e){let t=this.portees.chercher(e)?.origine,n=t?.type===`Variable`?t.valeur:void 0;return n?.type===`DateDuJour`||n?.type===`DateDecalee`}estChampDate(e,t){let n=this.portees.chercher(e)?.type;return n?.genre===`donnee`&&this.liens.donnees.get(n.nom)?.champs.find(e=>e.nom===t)?.type.genre===`date`}typeDeChamp(e){return e.genre===`liste`?na(this.typeDeChamp(e.de)):e.genre===`donnee`?{genre:`donnee`,nom:e.nom}:e.genre===`nombre`?ea:e.genre===`booleen`?ta:z}argumentsPage(e,t,n,r){let i=t.map(e=>this.typeDe(e.valeur)),a=Cs.get(e);if(a===void 0)return;let o=ws.get(e)??[];t.forEach((t,n)=>{let s=o.find(e=>e.nom===t.nom);if(s){let a=s.nombre?ea:z;!ia(a,i[n])&&t.valeur.type!==`Rien`&&this.erreur(`le filtre « ${s.nom} » de la page « ${e} » est ${V(a)} ; on ne peut pas lui donner ${V(i[n])}.`,r);return}a.includes(t.nom)||this.erreur(o.length>0?`« ${t.nom} » n'est ni un paramètre ni un filtre de la page « ${e} ». Paramètres : ${a.join(`, `)||`aucun`}. Filtres : ${o.map(e=>e.nom).join(`, `)}.`:`la page « ${e} » n'a pas de paramètre « ${t.nom} ». Paramètres : ${a.join(`, `)||`aucun`}.`,r)});let s=a.find(e=>!t.some(t=>t.nom===e));s!==void 0&&this.erreur(`la page « ${e} » attend le paramètre « ${s} » : écrivez ${n} "${e}" avec ${s} …`,r)}accesChamp(e){let t=this.typeDe(e.objet);if(e.champ===`apercu`&&e.objet.type===`Reference`){let t=this.fichiers.get(e.objet.nom);t&&!So(t.choix)&&this.erreur(`un fichier accepté « ${t.choix.accepte.join(` ou `)} » n'a pas d'aperçu : « apercu » existe pour des images, des sons et des vidéos.`,e.ligne)}return t.genre===`liste`&&(t.de.genre===`fiche`||t.de.genre===`donnee`)?(this.resultat.projections.add(e),na(this.champDe(t.de,e))):this.champDe(t,e)}champDe(e,t){if(e.genre===`donnee`&&t.champ===`id`)return z;if(e.genre===`donnee`){let n=this.liens.donnees.get(e.nom),r=n?.champs.find(e=>e.nom===t.champ);return n&&!r?(this.erreur(`le champ « ${t.champ} » n'existe pas dans la donnée « ${n.nom} ». Champs : ${n.champs.map(e=>e.nom).join(`, `)}.${M(t.champ,n.champs.map(e=>e.nom))}`,t.ligne),B):r?this.typeDeChamp(r.type):B}if(e.genre===`fiche`){let n=e.champs.find(e=>e.nom===t.champ);return n?n.type:(this.erreur(`le champ « ${t.champ} » n'existe pas dans ${e.fichier?`le fichier « ${e.fichier} »`:`cette fiche`}. ${e.fichier?`Colonnes`:`Champs`} : ${e.champs.map(e=>e.nom).join(`, `)}.${M(t.champ,e.champs.map(e=>e.nom))}`,t.ligne),B)}return H(e)&&this.erreur(`${K(t.objet)} est ${V(e)} ; on ne lit un champ (${Fs(t)}) que sur une donnée du serveur ou une fiche.`,t.ligne),B}requete(e){let t=e.donnees.map(e=>this.typeDe(e)),n=e.resultat===void 0?void 0:this.variable(e.resultat,e.ligne);if(e.resultat!==void 0&&(e.source===void 0?this.ciblesAutres:this.ciblesSources).add(e.resultat),e.source!==void 0||e.filtrant!==void 0){this.requeteSource(e,n);return}if(this.liens.routes.size===0)return;let r=this.routeDe(e);if(!r)return;let i=e.donnees[0];if(e.donnees.length===1&&i.type===`Reference`&&this.page.parametres.includes(i.nom)&&n){this.resultat.lecturesUn.add(e);let t={genre:`donnee`,nom:r.donnee.nom};H(n.type)||(n.type=t,n.origine&&this.resultat.types.set(n.origine,t)),this.avertirDroits(r,`lire`,e.ligne);return}let a=e.donnees.length>0;if(n&&!a){let e=na({genre:`donnee`,nom:r.donnee.nom});(!H(n.type)||n.type.genre===`liste`&&!H(n.type.de))&&(n.type=e,n.origine&&this.resultat.types.set(n.origine,e))}e.donnees.forEach((n,i)=>{let a=n.type===`Champ`?U(n.nom):n.type===`Reference`?n.nom:void 0;a!==void 0&&this.verifierChamp(r,a,n,t[i],e.ligne)}),this.avertirDroits(r,a?`creer`:`lire`,e.ligne)}ciblesSources=new Set;ciblesAutres=new Set;usagesEtat=[];verifierEtatsRequetes(){let e=new Set;for(let t of this.usagesEtat)e.add(t.nom),!this.ciblesSources.has(t.nom)&&this.resultat.diagnostics.push({gravite:`erreur`,ligne:t.ligne,message:this.ciblesAutres.has(t.nom)?`« ${t.mot} » ne marche pas encore pour « ${t.nom} » : l'état d'une requête n'existe que pour une requête vers une source (de la source "…").`:`« ${t.nom} » ne reçoit aucune requête vers une source : « ${t.mot} » n'a pas de sens. Ajoutez envoyer requete vers "…" de la source "…" dans ${t.nom}.`});this.resultat.etatsLus.set(this.page,e)}requeteSource(e,t){for(let t of e.filtrant??[])this.typeDe(t.valeur);let n=e.donnees.length===1&&e.donnees[0].type===`Reference`&&this.page.parametres.includes(e.donnees[0].nom)&&t!==void 0,r=mo(e,this.liens.sources,n,(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}));r?.regle&&this.resultat.reglesSources.set(e,r.regle);let i=r?.type;!i||!t||(n&&this.resultat.lecturesUn.add(e),(!H(t.type)||t.type.genre===`liste`&&!H(t.type.de))&&(t.type=i,t.origine&&this.resultat.types.set(t.origine,i)))}operationServeur(e){let t=e.type===`Suppression`?`supprimer`:`modifier`,n=this.typeDe(e.objet),r=e.type===`Modification`?e.changements.map(e=>this.typeDe(e.valeur)):[];if(e.source!==void 0){let t=ho(e,this.liens.sources,n,(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}));t&&this.resultat.reglesOperations.set(e,t);return}if(this.liens.routes.size===0){this.erreur(`« ${t} » demande un serveur dans le même fichier : ajoutez un bloc serveur "…" : avec la route « ${ss(e.adresse)} ».`,e.ligne);return}let i=this.routeDe(e);if(i){if(H(n)&&(n.genre!==`donnee`||n.nom!==i.donnee.nom)){let r=t===`supprimer`?`supprimer … de "${i.adresse}"`:`modifier … dans "${i.adresse}"`;this.erreur(`${K(e.objet)} est ${V(n)} : « ${r} » attend un « ${i.donnee.nom} » lu sur cette route (par exemple la variable d’une boucle « pour chaque p dans ${i.adresse} »).`,e.ligne)}e.type===`Modification`&&e.changements.forEach((t,n)=>this.verifierChamp(i,U(t.champ),t.valeur,r[n],e.ligne)),this.avertirDroits(i,t,e.ligne)}}routeDe(e){let t=this.liens.routes.get(ss(e.adresse));if(!t){this.erreur(`aucune route « ${ss(e.adresse)} » dans le serveur « ${this.liens.serveur} ». Routes : ${[...this.liens.routes.values()].map(e=>e.adresse).join(`, `)}.`,e.ligne);return}return this.resultat.adressesRequetes.set(e,`/api/${ss(t.adresse)}`),t}verifierChamp(e,t,n,r,i){let a=e.donnee.champs.find(e=>e.nom===t);a?ia(this.typeDeChamp(a.type),r)||this.erreur(`${K(n)} est ${V(r)} ; le champ « ${a.nom} » de « ${e.donnee.nom} » attend ${V(this.typeDeChamp(a.type))}.`,i):this.erreur(`la donnée « ${e.donnee.nom} » n'a pas de champ « ${t} ». Champs : ${e.donnee.champs.map(e=>e.nom).join(`, `)}.${M(t,e.donnee.champs.map(e=>e.nom))}`,i)}avertirDroits(e,t,n){let r=t===`creer`?`créer`:t,i=e.droits[t];(i!==`connecte`||this.garde===void 0)&&(i!==`admin`||this.garde!==`admin`)&&(i===`connecte`?this.avertissement(`il faut être connecté pour ${r} « ${e.donnee.nom} » : cette requête sera refusée à un visiteur.`,n):i===`admin`&&this.avertissement(`seul un admin peut ${r} « ${e.donnee.nom} » : cette requête sera refusée à un visiteur.`,n))}declarer(e,t,n,r){if(U(e)===`utilisateur`&&(this.ligneNomUtilisateur??=t),Ts.size>0&&U(e)===`langue`){this.erreur(`« langue » est la langue choisie par la personne (« si langue est anglais », « changer langue par anglais ») : donnez un autre nom à cette variable.`,t);return}let i=this.portees.declarer({nom:e,ligne:t,type:n,origine:r});i&&this.erreur(`la variable « ${e} » existe déjà (ligne ${i.ligne}). Pour changer sa valeur, écrivez : changer ${e} par …`,t)}valeurDeLangue(e){if(Ts.size===0||this.portees.chercher(e))return;let t=U(e);return t===`langue`?`langue`:Ts.get(t)}variable(e,t){let n=this.portees.chercher(e);if(n)return n;let r=this.declareesPlusLoin.get(e),i=this.boucleFermee.get(e);r!==void 0&&r>t?this.erreur(`la variable « ${e} » est utilisée avant d'être déclarée (ligne ${r}).`,t):i===void 0?Ts.size===0&&(U(e)===`langue`||kn(e)?.disponible)?this.erreur(`« ${e} » ${U(e)===`langue`?`est la langue choisie par la personne`:`est une langue`} : déclarez d'abord les langues en haut du fichier, avec « langues : » puis « francais » et « anglais » sur deux lignes décalées.`,t):this.erreur(`la variable « ${e} » n'est pas déclarée. Déclarez-la avec : variable ${e} = …${M(e,this.portees.nomsVisibles())}${this.elementEnCours?` Si c'est un texte, mettez-le entre guillemets : ${this.elementEnCours} "${e}"`:``}`,t):this.erreur(`« ${e} » n'existe que dans la boucle de la ligne ${i}.`,t)}cible(e,t,n){let r=this.elements.resoudre(t,void 0,n),i=e.type===`Action`&&(e.action===`montrer`||e.action===`cacher`)?this.elements.formulaires.find(e=>e.nom===t):void 0,a=e.type===`Action`?this.fenetreVisee(e,t):void 0;if(a!==void 0)this.resultat.cibles.set(e,[a]);else if(`ids`in r)this.resultat.cibles.set(e,r.ids);else if(i)this.resultat.cibles.set(e,[i.id]);else if(r.erreur===`inconnu`)this.erreur(`aucun élément « ${t} » dans la page « ${this.page.nom} ».${M(t,(n??this.elements.elements).flatMap(e=>[e.nom,e.libelle].filter(e=>e!==void 0)))}`,e.ligne);else{let[n,i]=r.lignes;this.erreur(`deux éléments s'appellent « ${t} » (lignes ${n} et ${i}). Donnez un nom à l'un d'eux : avec nom "…"`,e.ligne)}}pageCible(e,t){let n=ps(e);if(n.refus){this.erreur(n.refus,t);return}n.externe||n.page===void 0||n.page===``||this.nomsPages.has(n.page)||this.avertissement(`la page « ${n.page} » n'existe pas dans ce fichier.${M(n.page,this.nomsPages)}`,t)}horsEvenement(e,t,n=``){this.erreur(`« ${e} » ne s'utilise que dans un événement (quand …).${n}`,t)}};function Ns(e,t){return e.nom===t||e.libelle===t}function Ps(e){if(e.type===`Chaine`&&!e.parties.some(e=>e.type===`variable`))return e.parties.map(e=>e.valeur).join(``)}function Fs(e){return e.type===`Reference`?e.nom:e.type===`AccesChamp`?`${Fs(e.objet)}.${e.champ}`:`…`}function K(e){return e.type===`Reference`||e.type===`AccesChamp`?`« ${Fs(e)} »`:e.type===`Champ`?`le champ « ${e.nom} »`:`cette valeur`}function Is(e){switch(e.type){case`Action`:return e.action===`afficher`?`afficher`:As[e.action];case`Requete`:return`envoyer requete`;case`Connexion`:return`se connecter`;case`Deconnexion`:return`se deconnecter`;case`Suppression`:return`supprimer`;case`Modification`:return`modifier`;case`Minuterie`:return e.mode===`apres`?`apres …`:`toutes les …`;case`Copier`:return`copier`;case`Partager`:return`partager`;case`Confirmer`:return`confirmer`;default:return}}function Ls(e){if(e.type===`Combinaison`)return[...Ls(e.gauche),...Ls(e.droite)];let t=[],n=e=>{e&&(e.type===`Reference`?t.push(e.nom):e.type===`AccesChamp`?n(e.objet):e.type===`Calcul`?(n(e.gauche),n(e.droite)):e.type===`Compte`&&n(e.liste))};return n(e.gauche),n(e.droite),t}function Rs(e,t=new Set){for(let n of e)if(n.type===`Affectation`)t.add(n.nom);else if(n.type===`ModificationListe`)t.add(n.liste);else if(n.type===`Requete`&&n.resultat!==void 0)t.add(n.resultat);else if(n.type===`EnvoiFichier`)n.suivi!==void 0&&t.add(n.suivi),n.resultat!==void 0&&t.add(n.resultat);else if(n.type===`Condition`)Rs(n.alors,t),Rs(n.sinon,t);else if(n.type===`Boucle`||n.type===`TantQue`||n.type===`Repeter`)Rs(n.corps,t);else if(n.type===`Selon`){for(let e of n.cas)Rs(e.corps,t);Rs(n.sinon,t)}return t}function zs(e){let t=/^(\S+)\s+depuis$/u.exec(e);if(t)return{chemin:t[1],depuis:!0};let n=/^(\S+)\s+en\s+(\S+)$/u.exec(e);if(n){let e={ko:`Ko`,mo:`Mo`}[n[2].toLowerCase()];if(e)return{chemin:n[1],devise:e,mot:n[2]};let t=Mo[n[2].normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase()];return t?{chemin:n[1],devise:t,mot:n[2]}:{erreur:`« ${n[2]} » n'est pas une devise connue. Devises : FC, euros, dollars (et Ko, Mo pour une taille).${M(n[2],[...Object.keys(Mo),`Ko`,`Mo`])}`}}let r=/^(\S+)\s+(\p{L}[\p{L}'-]*)$/u.exec(e);return r?{chemin:r[1],pluriel:r[2]}:{chemin:e}}function Bs(e){return`humalis-base64:`+e}const Vs=new Set([`description`,`decoratif`,`prioritaire`,`proportions`]),Hs=(e,t)=>e.find(e=>A(e.propriete)===t);function Us(e){return e.type===`Chaine`&&e.parties.every(e=>e.type===`texte`)?e.parties.map(e=>e.valeur).join(``):void 0}const Ws=e=>!/^([a-z][a-z0-9+.-]*:|\/)/i.test(e.trim());function Gs(e,t){let n=Hs(e.styles,`description`),r=Hs(e.styles,`proportions`),i=Us(e.contenu),a={};if(n&&!Hs(e.styles,`decoratif`)&&(a.description=t(n.texte??{type:`Chaine`,parties:n.parties??[{type:`texte`,valeur:n.valeur}],ligne:e.ligne})),i!==void 0&&Ws(i)&&(a.locale=i),r){let[e,t]=r.valeur.split(`:`).map(Number);a.proportions=[e,t]}return Hs(e.styles,`prioritaire`)&&(a.prioritaire=!0),a}function Ks(e){let t=e.replace(/\\/g,`/`).replace(/^(\.\/)+/,``);return t.split(`/`).some(e=>e===`..`||e===``)?t.split(`/`).pop():t}function qs(e,t,n=`image`){let r=new Map;for(let[i,a]of e??[])a.contenu!==void 0&&(a.genre??`image`)===n&&r.set(`${t}${Ks(i)}`,Bs(a.contenu));return r}function Js(e){return{variable:e.variable,familles:xo(e).map(e=>({nom:e,mime:go[e].mime})),...e.octets===void 0?{}:{octets:e.octets},plusieurs:e.plusieurs===!0,apercu:So(e)}}const Ys={courbe:`Graphique en courbe`,barres:`Graphique en barres`,camembert:`Graphique en camembert`},Xs=e=>e.charAt(0).toUpperCase()+e.slice(1).replace(/_/g,` `);function Zs(e,t,n,r,i){let a=e=>{if(e===void 0)return{};let t=yt(`couleur`,e,r);return`erreur`in t?{}:{couleur:t.valeur}},o=e.series.length>0?e.series.map(e=>{let t=i?.serie(e.texteNom??{type:`Chaine`,parties:[{type:`texte`,valeur:e.nom}],ligne:e.ligne});return{nom:e.nom,...t?{nomLangues:t}:{},...e.valeur?{valeur:e.valeur.champ}:{},...a(e.couleur)}}):[{nom:e.valeur?Xs(e.valeur.champ):`Valeur`,...e.valeur?{}:i?.message(`Valeur`)?{nomLangues:i.message(`Valeur`)}:{},...e.valeur?{valeur:e.valeur.champ}:{},...a(e.couleur)}],s=e.valeur?.devise??e.series.find(e=>e.valeur?.devise)?.valeur?.devise,c=s===void 0?void 0:Mo[A(s)];return{type:`graphique`,id:t,genre:e.genre,liste:n(e.liste),...e.etiquette===void 0?{}:{etiquette:e.etiquette},...e.etiquettes?{etiquettes:n(e.etiquettes)}:{},nomEtiquettes:e.etiquette===void 0?`Libellé`:Xs(e.etiquette),...e.etiquette===void 0&&i?.message(`Libellé`)?{nomEtiquettesLangues:i.message(`Libellé`)}:{},series:o,...c?{devise:c}:{},titre:Ys[e.genre],...i?.message(Ys[e.genre])?{titreLangues:i.message(Ys[e.genre])}:{},description:n(e.description??{type:`Chaine`,parties:[],ligne:e.ligne}),...e.proportions?{proportions:e.proportions}:{},classes:e.classes,ligne:e.ligne}}const Qs=[{fr:`Réessayer`,en:`Try again`},{fr:`Le serveur n'a pas répondu. Réessayez dans un instant.`,en:`The server did not answer. Try again in a moment.`},{fr:`Email ou mot de passe incorrect.`,en:`Incorrect email or password.`},{fr:`Trop de tentatives de connexion. Réessayez dans quelques minutes.`,en:`Too many sign-in attempts. Try again in a few minutes.`},{fr:`Trop de demandes en peu de temps. Patientez un moment, puis réessayez.`,en:`Too many requests in a short time. Wait a moment, then try again.`},{fr:`Ce que vous cherchez n'existe pas.`,en:`What you are looking for does not exist.`},{fr:`Connectez-vous pour continuer.`,en:`Sign in to continue.`},{fr:`Page introuvable`,en:`Page not found`},{fr:`Cette page n'existe pas.`,en:`This page does not exist.`},{fr:`Revenir à l'accueil`,en:`Back to the home page`},{fr:`Précédent`,en:`Previous`},{fr:`Suivant`,en:`Next`},{fr:`Chargement`,en:`Loading`},{fr:`Diminuer`,en:`Decrease`},{fr:`Augmenter`,en:`Increase`},{fr:`Quantité`,en:`Quantity`},{fr:`Code QR`,en:`QR code`},{fr:`Fil d'Ariane`,en:`Breadcrumb`},{fr:`Choisissez…`,en:`Choose…`},{fr:`Vérification…`,en:`Checking…`},{fr:"Note : ${nombre} sur ${maximum}",en:"Rating: ${nombre} out of ${maximum}"},{fr:"Note : ${valeur} sur ${maximum}",en:"Rating: ${valeur} out of ${maximum}"},{fr:"${i + 1} sur ${maximum}",en:"${i + 1} out of ${maximum}"},{fr:"Diapositive ${i + 1} sur ${pages}",en:"Slide ${i + 1} of ${pages}"},{fr:"Diapositive ${i + 1} sur ${total}",en:"Slide ${i + 1} of ${total}"},{fr:`Agrandir`,en:`Zoom in`},{fr:`Réduire`,en:`Zoom out`},{fr:`Ouvrir dans OpenStreetMap`,en:`Open in OpenStreetMap`},{fr:"Ouvrir dans OpenStreetMap : ${lieu.nom}",en:"Open in OpenStreetMap: ${lieu.nom}"},{fr:"Les lieux de la carte : ${nom}",en:"Places on the map: ${nom}"},{fr:`Graphique en courbe`,en:`Line chart`},{fr:`Graphique en barres`,en:`Bar chart`},{fr:`Graphique en camembert`,en:`Pie chart`},{fr:`Valeur`,en:`Value`},{fr:`Libellé`,en:`Label`},{fr:`Voir les données`,en:`View the data`},{fr:`Cacher les données`,en:`Hide the data`},{fr:`Les données du graphique`,en:`The chart data`},{fr:`Aucune donnée à afficher.`,en:`No data to display.`},{fr:`Lire la transcription`,en:`Read the transcript`,page:!0},{fr:`Lecture`,en:`Play`},{fr:`Ce fichier`,en:`This file`},{fr:"${sujet} est trop gros : ${ecrireTaille(fichier.size)}, le maximum est ${ecrireTaille(maximum)}.",en:"${sujet} is too large: ${ecrireTaille(fichier.size)}, the maximum is ${ecrireTaille(maximum)}."},{fr:"${sujet} n'est pas ${familles.map((f) => REFUS_DE_TYPE[f.nom]).join(' ni ')}.",en:"${sujet} is not ${familles.map((f) => REFUS_DE_TYPE[f.nom]).join(' or ')}."},{fr:`une image`,en:`an image`},{fr:`un son`,en:`a sound`},{fr:`une vidéo`,en:`a video`},{fr:`un PDF`,en:`a PDF`},{fr:`un document`,en:`a document`},{fr:` Mo`,en:` MB`},{fr:` Ko`,en:` KB`},{fr:` octets`,en:` bytes`},{fr:`Ce fichier est trop gros pour le serveur.`,en:`This file is too large for the server.`},{fr:`Choisissez d'abord un fichier.`,en:`Choose a file first.`},{fr:`AAAA-MM-JJ`,en:`YYYY-MM-DD`},{fr:`Fermer le message`,en:`Close the message`},{fr:`Aller au contenu`,en:`Skip to content`},{fr:`Fermer`,en:`Close`},{fr:`Copié`,en:`Copied`},{fr:`Copier`,en:`Copy`},{fr:`Copie impossible.`,en:`Could not copy.`},{fr:`Lien copié : il ne reste qu’à le coller.`,en:`Link copied: paste it wherever you like.`},{fr:`Texte copié : il ne reste qu’à le coller.`,en:`Text copied: paste it wherever you like.`},{fr:`Partage impossible.`,en:`Could not share.`},{fr:`Oui`,en:`Yes`},{fr:`Non`,en:`No`},{fr:`Voir plus`,en:`See more`},{fr:`Monter`,en:`Move up`},{fr:`Descendre`,en:`Move down`},{fr:`élément déplaçable`,en:`movable item`},{fr:`Annulé.`,en:`Cancelled.`},{fr:"position ${i + 1} sur ${dernier.current.liste.length}",en:"position ${i + 1} of ${dernier.current.liste.length}"},{fr:"Pris : ${nommer(actuelle[index])}, ${position(index)}. Flèches pour déplacer, Espace pour déposer, Échap pour annuler.",en:"Picked up: ${nommer(actuelle[index])}, ${position(index)}. Arrows to move, Space to drop, Escape to cancel."},{fr:"Déposé : ${nommer(actuelle[index])}, ${position(index)}.",en:"Dropped: ${nommer(actuelle[index])}, ${position(index)}."},{fr:"Déplacé en ${position(vers)}.",en:"Moved to ${position(vers)}."},{fr:"Déplacé en position ${vers + 1} sur ${copie.length}.",en:"Moved to position ${vers + 1} of ${copie.length}."},{fr:"${nommer(liste[index])}, position ${index + 1} sur ${liste.length}",en:"${nommer(liste[index])}, position ${index + 1} of ${liste.length}"}];function $s(e,t){let n=Qs.find(t=>t.fr===e);return n&&t.length>1?t.map(e=>({code:e,texte:n[e===`en`?`en`:`fr`]})):void 0}const ec={cocher:{fr:e=>`Cochez « ${e} » pour continuer.`,en:e=>`Check “${e}” to continue.`},choisir:{fr:e=>`Choisissez une valeur pour « ${e} ».`,en:e=>`Choose a value for “${e}”.`},obligatoire:{fr:e=>`Le champ « ${e} » est obligatoire.`,en:e=>`The field “${e}” is required.`},email:{fr:e=>`« ${e} » n’a pas la forme d’une adresse email (par exemple nom@exemple.cd).`,en:e=>`“${e}” does not look like an email address (for example name@example.com).`},date:{fr:e=>`« ${e} » doit être une date écrite AAAA-MM-JJ (par exemple 2026-01-31).`,en:e=>`“${e}” must be a date written YYYY-MM-DD (for example 2026-01-31).`},heure:{fr:e=>`« ${e} » doit être une heure écrite HH:MM (par exemple 14:30).`,en:e=>`“${e}” must be a time written HH:MM (for example 14:30).`},adresseWeb:{fr:e=>`« ${e} » doit être une adresse web complète, qui commence par https://.`,en:e=>`“${e}” must be a full web address, starting with https://.`},nombre:{fr:e=>`« ${e} » doit être un nombre.`,en:e=>`“${e}” must be a number.`},auMoins:{fr:(e,t=0)=>`« ${e} » doit être au moins ${t}.`,en:(e,t=0)=>`“${e}” must be at least ${t}.`},auPlus:{fr:(e,t=0)=>`« ${e} » doit être au plus ${t}.`,en:(e,t=0)=>`“${e}” must be at most ${t}.`}};function tc(e,t,n){let r=t?.sorte??`texte`,i=`${e}.trim() !== ''`,a=(e,t)=>n.map(({code:n,libelle:r})=>({code:n,texte:ec[e][n===`en`?`en`:`fr`](r,t)})),o=[];t?.obligatoire&&(r===`case`?o.push([`!${e}`,a(`cocher`)]):r===`choix`||r===`liste`?o.push([`${e} === ''`,a(`choisir`)]):o.push([`${e}.trim() === ''`,a(`obligatoire`)]));let s=(t,n)=>o.push([`${i} && !${t}.test(${e}.trim())`,a(n)]);switch(r){case`email`:s(`/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/`,`email`);break;case`date`:s(`/^\\d{4}-\\d{2}-\\d{2}$/`,`date`);break;case`heure`:s(`/^\\d{2}:\\d{2}$/`,`heure`);break;case`adresseWeb`:s(`/^https?:\\/\\/\\S+$/`,`adresseWeb`);break;case`nombre`:{let n=`Number(${e}.replace(',', '.'))`;o.push([`${i} && Number.isNaN(${n})`,a(`nombre`)]),t?.minimum!==void 0&&o.push([`${i} && ${n} < ${t.minimum}`,a(`auMoins`,t.minimum)]),t?.maximum!==void 0&&o.push([`${i} && ${n} > ${t.maximum}`,a(`auPlus`,t.maximum)]);break}}return o}function nc(e){let t=new Map;if(e.type!==`texte`)return t;for(let n of e.versions??[])n.parties.every(e=>`texte`in e)&&t.set(n.code,n.parties.map(e=>`texte`in e?e.texte:``).join(``));return t}const rc=e=>`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`)}'`;function ic(e,t){return e.length===1?t(e[0].texte):`t({ ${e.map(e=>`${e.code}: ${rc(e.texte)}`).join(`, `)} })`}function ac(e,t,n){let r=e=>n?`\`${e}\``:rc(e);return`t({ ${t.map(t=>`${t}: ${r(e[t===`en`?`en`:`fr`])}`).join(`, `)} })`}const oc=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);function sc(e,t,n){let r=[],i=e=>`\u0000${r.push(e)-1}\u0000`,a=e;for(let e of Qs){let r=e.fr.includes("${"),o=i(ac(e,t,r));if(r){n.partout&&(a=a.split(`\`${e.fr}\``).join(o));continue}let s=rc(e.fr),c=JSON.stringify(e.fr);a=a.replace(RegExp(`=${oc(c)}(?=[\\s/>])`,`g`),`={${o}}`),a=a.split(`'aria-label': ${s}`).join(`'aria-label': ${o}`),e.page&&!n.partout&&(a=a.split(`<summary>${e.fr}</summary>`).join(`<summary>{${o}}</summary>`),a=a.replace(RegExp(`(creer\\('summary', \\{\\s*\\},\\s*)${oc(s)}`,`g`),(e,t)=>`${t}${o}`)),n.partout&&(a=a.replace(RegExp(`>${oc(e.fr)}<`,`g`),`>{${o}}<`).replace(RegExp(`^(\\s+)${oc(e.fr)}$`,`gm`),`$1{${o}}`).split(s).join(o).split(c).join(o))}if(a=a.replace(/\u0000(\d+)\u0000/g,(e,t)=>r[Number(t)]),a===e||n.importer===void 0||/\bconst \{[^}]*\bt\b[^}]*\} = useLangue\(\)/.test(a)||/import \{[^}]*\bt\b[^}]*\} from '[^']*langue'/.test(a))return a;let o=`import { t } from '${n.importer}';\n`,s=[...a.matchAll(/^import [^\n]*\n/gm)],c=s.length>0?s[s.length-1].index+s[s.length-1][0].length:0;return a.slice(0,c)+o+a.slice(c)}function cc(e,t){for(let[n,r]of e){if(!n.endsWith(`.js`)||n===`humalis/qrcode.js`)continue;let i=n===`humalis/humalis.js`||n===`pages/introuvable-humalis.js`,a=sc(n===`humalis/graphique.js`?dc(r,t):r,t,{partout:i});a!==r&&n!==`humalis/humalis.js`&&(a=a.replace(/const \{ ([^}]*) \} = humalis;/g,(e,t)=>/\bt\b/.test(t)?e:`const { ${t}, t } = humalis;`)),e.set(n,a)}}function lc(e){let t=Qs.find(t=>t.fr===e);if(!t)throw Error(`message intégré inconnu : ${e}`);return t}function uc(e){return e.replace(/^(\s*)\/\*\* Le nombre d'une ligne/m,`$1/** La région des nombres de la figure en cours de calcul (« fr-FR » ou « en-US »). */
|
|
676
|
+
`.replace(/^export /gm,``).replace(/\((valeur|debut|fin)(: string \| null \| undefined)/g,`($1`).replace(/, (fin|nombre|unite)(: [^,)]+)/g,`, $1`).replace(/\(v: string\)/g,`(v)`).replace(/\(n: number, mot: string\)/g,`(n, mot)`).replace(/\): (string|number) \{/g,`) {`).replace(/^/gm,` `),Vo=(e,t)=>e.find(e=>A(e.propriete)===t);function Ho(e,t,n,r,i){let a=Vo(e,`animation`);for(let t of[`duree`,`delai`])if(Vo(e,t)&&!a){let e=t===`delai`?`avec animation montee et delai court`:`avec animation montee et duree longue`;i.erreur(`« ${t} » donne ${t===`delai`?`l’attente`:`la durée`} d’une animation : écrivez aussi « animation … », par exemple « ${e} ».`,r)}return a?A(a.valeur)===`defilement`?(i.erreur(`« au defilement » suit le nom d’une animation : « animation montee au defilement ».`,r),!1):(a.cascade&&![`bloc`,`section`,`ligne`,`colonne`,`grille`].includes(t)&&i.erreur(`« en cascade » fait apparaître les enfants d’un bloc l’un après l’autre : il s’écrit sur un bloc (section, bloc, ligne, colonne ou grille).`,r),(t===`champ`||t===`formulaire`||n)&&i.erreur(`pas d’animation sur un champ, ni dans un formulaire : un champ qui bouge pendant qu’on écrit gêne la saisie.`,r),a.defilement===!0):!1}const Uo=[`png`,`jpg`,`jpeg`,`webp`,`gif`,`svg`,`avif`];function Wo(e,t){let{styles:n,ligne:r}=e,i=Vo(n,`description`),a=Vo(n,`decoratif`);i&&a?t.erreur(`une image a soit une description, soit « decoratif » (elle ne porte aucune information), pas les deux.`,r):!i&&!a?t.erreur(`décrivez l’image pour les personnes qui ne la voient pas : « avec description "Le fleuve au coucher du soleil" », ou « avec decoratif » si elle ne porte aucune information.`,r):i&&(i.parties??[{type:`texte`,valeur:i.valeur}]).every(e=>e.type===`texte`&&e.valeur.trim()===``)&&t.erreur(`la description de l’image est vide : écrivez ce qu’elle montre, ou « avec decoratif » si elle ne porte aucune information.`,r),i?.parties?.some(e=>e.type===`variable`)&&t.typeDe(i.texte??{type:`Chaine`,parties:i.parties,ligne:r});let o=Vo(n,`proportions`);if(o){let[e,n]=o.valeur.split(`:`).map(Number);[e,n].every(e=>Number.isInteger(e)&&e>0)||t.erreur(`les proportions sont deux nombres entiers positifs : « proportions 4 sur 3 » (ici, ${o.valeur.replace(`:`,` sur `).replace(/\./g,`,`)}).`,r)}let s=Ka(e.contenu);if(s!==void 0&&!/^([a-z][a-z0-9+.-]*:|\/)/i.test(s.trim())){let e=/\.([a-z0-9]+)$/i.exec(s)?.[1]?.toLowerCase();(!e||!Uo.includes(e))&&t.erreur(`« ${s} » n’est pas une image que les navigateurs savent afficher. Formats possibles : ${Uo.map(e=>`.${e}`).join(`, `)}.`,r)}return Jo(n)}const Go=[`mp3`,`ogg`,`wav`,`m4a`,`aac`,`flac`,`opus`],Ko=/entretien|interview|discours|podcast/i;function qo(e,t){let{styles:n,ligne:r}=e,i=Vo(n,`description`);i?(i.parties??[{type:`texte`,valeur:i.valeur}]).every(e=>e.type===`texte`&&e.valeur.trim()===``)&&t.erreur(`la description du son est vide : elle nomme le lecteur pour les lecteurs d’écran.`,r):t.erreur(`décrivez le son pour les personnes qui ne le voient pas : « audio "extrait.mp3" avec description "Extrait de la chanson Le Fleuve" ».`,r);for(let e of[`description`,`transcription`]){let i=Vo(n,e);i?.parties?.some(e=>e.type===`variable`)&&t.typeDe(i.texte??{type:`Chaine`,parties:i.parties,ligne:r})}Vo(n,`automatique`)&&t.erreur(`Humalis ne lance jamais un son tout seul : les navigateurs le bloquent presque toujours et c’est gênant pour les lecteurs d’écran. Retirez « automatique » ; la personne lance le son avec les commandes du lecteur.`,r);let a=Ka(e.contenu);if(a!==void 0&&!/^([a-z][a-z0-9+.-]*:|\/)/i.test(a.trim())){let e=/\.([a-z0-9]+)$/i.exec(a)?.[1]?.toLowerCase();(!e||!Go.includes(e))&&t.erreur(`« ${a} » n’est pas un son que les navigateurs savent jouer. Formats possibles : ${Go.map(e=>`.${e}`).join(`, `)}.`,r)}a!==void 0&&Ko.test(a)&&!Vo(n,`transcription`)&&t.avertissement(`ce son ressemble à de la parole (son nom l’annonce) : ajoutez « et transcription "…" » pour les personnes qui ne peuvent pas l’écouter.`,r)}const Jo=e=>Vo(e,`prioritaire`)!==void 0;function Yo(e,t){e.length>2&&t.avertissement(`${e.length} images « prioritaire » dans cette page : au-delà de 2, elles se disputent le réseau et aucune n’arrive plus vite. Gardez « prioritaire » pour la grande image du haut.`,e[2])}function Xo(e,t){e.length>30&&t.avertissement(`trop de mouvement : ${e.length} éléments s’animent au défilement dans cette page (plus de 30). Gardez l’animation pour quelques éléments importants.`,e[30])}const Zo=e=>e.type===`Reference`?`« ${e.nom} »`:`la liste`;function Qo(e,t){let{ligne:n}=e;t.dansEvenement&&t.erreur(`un graphique se place dans la page, pas dans un événement. Pour le montrer après un clic, placez-le dans un « si » qui lit une variable que l’événement change.`,n),$o(e,t),es(e,t);let r=t.typeDe(e.liste),i=r.genre===`liste`?r.de:B;if(H(r)&&(r.genre!==`liste`||[`texte`,`booleen`,`liste`].includes(i.genre))){t.erreur(`un graphique se fait à partir d’une liste de nombres, de fiches ou de données, par exemple les ventes par mois ; ici, c’est ${ra(r)}.`,n);return}let a=e.valeur?[e.valeur]:e.series.flatMap(e=>e.valeur?[e.valeur]:[]);i.genre===`nombre`?ts(e,a,t):H(i)?ns(e,a,t.champsDe(i),t):(e.etiquette!==void 0||a.length>0)&&t.avertissement(`les champs des éléments de ${Zo(e.liste)} ne sont connus qu’à l’exécution : « etiquette » et « valeur » ne sont pas vérifiés. Vérifiez qu’ils existent dans les données reçues.`,n),rs(e,t)}function $o(e,t){if(!e.description){t.erreur(`décrivez ce que montre le graphique, pour les personnes qui ne le voient pas : ajoutez par exemple « et description "Les ventes montent de janvier à mars." ».`,e.ligne);return}e.description.type===`Chaine`&&e.description.parties.every(e=>e.type===`texte`&&e.valeur.trim()===``)&&t.erreur(`la description du graphique est vide : écrivez ce qu’il montre, par exemple « description "Les ventes montent de janvier à mars." ».`,e.ligne),e.description.type===`Chaine`&&e.description.parties.some(e=>e.type===`variable`)&&t.typeDe(e.description)}function es(e,t){let{ligne:n}=e;(e.valeur||e.couleur)&&e.series.length>0&&t.erreur(`la valeur et la couleur s’écrivent soit sur la ligne du graphique (une seule série), soit dans chaque ligne « serie » : pas les deux.`,n),e.genre===`camembert`&&e.series.length>1&&t.erreur(`un camembert montre une seule série, dont les parts font un tout : gardez une seule ligne « serie », ou choisissez un graphique en barres pour en comparer plusieurs.`,n);let r=[e.couleur,...e.series.map(e=>e.couleur)].filter(e=>e!==void 0);if(e.genre===`camembert`&&r.length>0)t.erreur(`les parts d’un camembert prennent chacune leur couleur : retirez « couleur ».`,n);else for(let e of r){let r=t.couleur(e);if(`erreur`in r){t.erreur(r.erreur,n);continue}let i=t.modes.find(e=>Zn(r[e],Kn[e])<3);if(i){let e=Zn(r[i],Kn[i]).toFixed(1).replace(`.`,`,`);t.avertissement(`la couleur « ${r.nom} » se voit mal sur le fond de la page en mode ${i} (contraste ${e} pour 1, il en faut au moins 3) : choisissez une couleur plus ${i===`clair`?`foncée`:`claire`}.`,n)}}let i=e.valeur?[e.valeur]:e.series.flatMap(e=>e.valeur?[e.valeur]:[]);for(let e of i)e.devise!==void 0&&!Mo[A(e.devise)]&&t.erreur(`« ${e.devise} » n’est pas une devise connue. Devises : FC, euros, dollars.${M(e.devise,Object.keys(Mo))}`,e.ligne);let a=[...new Set(i.map(e=>e.devise===void 0?`sans devise`:Mo[A(e.devise)]??e.devise))];a.length>1&&t.erreur(`toutes les séries d’un graphique s’écrivent dans la même unité : ici, ${a.join(` et `)}. Un axe ne peut pas compter deux unités à la fois.`,n),e.proportions&&!e.proportions.every(e=>Number.isInteger(e)&&e>0)&&t.erreur(`les proportions d’un graphique sont deux nombres entiers positifs : « proportions 2 sur 1 » (ici, ${e.proportions.join(` sur `).replace(/\./g,`,`)}).`,n)}function ts(e,t,n){if(e.etiquette!==void 0||t.length>0){n.erreur(`« etiquette » et « valeur » nomment des champs, mais la liste ne contient que des nombres : retirez-les, et écrivez les libellés avec « etiquettes ["Lun", "Mar"] ».`,e.ligne);return}if(!e.etiquettes)return;let r=n.typeDe(e.etiquettes);if(H(r)&&!(r.genre===`liste`&&(r.de.genre===`texte`||!H(r.de)))){n.erreur(`« etiquettes » attend une liste de textes, par exemple etiquettes ["Lun", "Mar", "Mer"] ; ici, c’est ${ra(r)}.`,e.ligne);return}let i=n.listeEcrite(e.liste),a=n.listeEcrite(e.etiquettes);i&&a&&i.elements.length!==a.elements.length&&n.erreur(`il y a ${i.elements.length} nombres et ${a.elements.length} étiquettes : il en faut autant, une étiquette par nombre.`,e.ligne)}function ns(e,t,n,r){let{ligne:i}=e,a=n.filter(e=>e.type.genre===`texte`).map(e=>e.nom),o=n.filter(e=>e.type.genre===`nombre`).map(e=>e.nom),s=e=>r.erreur(`« ${e} » n’est pas un champ des éléments de la liste. Champs : ${n.map(e=>e.nom).join(`, `)}.${M(e,n.map(e=>e.nom))}`,i);if(e.etiquettes){r.erreur(`« etiquettes » sert à une liste de nombres ; pour une liste de fiches ou de données, nommez le champ des libellés : « etiquette ${a[0]??`mois`} ».`,i);return}e.etiquette===void 0?r.erreur(`il manque le champ des libellés : ajoutez par exemple « etiquette ${a[0]??n[0]?.nom??`mois`} ». Champs : ${n.map(e=>e.nom).join(`, `)}.`,i):n.length>0&&!n.some(t=>t.nom===e.etiquette)&&s(e.etiquette),!e.valeur&&e.series.length===0&&r.erreur(`il manque le champ des valeurs : ajoutez par exemple « valeur ${o[0]??`montant`} ».`,i);for(let t of e.series)t.valeur||r.erreur(`la série « ${t.nom} » n’a pas de valeur : écrivez par exemple serie "${t.nom}" valeur ${o[0]??`montant`}.`,t.ligne);if(n.length!==0)for(let e of t){let t=n.find(t=>t.nom===e.champ);t?H(t.type)&&t.type.genre!==`nombre`&&r.erreur(`le champ « ${e.champ} » est ${V(t.type)} : un graphique dessine des nombres. Choisissez un champ nombre pour « valeur »${o.length?` (${o.join(`, `)})`:``}.`,e.ligne):s(e.champ)}}function rs(e,t){let n=t.listeEcrite(e.liste);if(!n)return;let r=e.valeur?.champ??e.series[0]?.valeur?.champ,i=n.elements.flatMap(e=>{let t=e.type===`Fiche`?e.champs.find(e=>e.nom===r)?.valeur:e;return t?.type===`Nombre`?[t.valeur]:[]}),a=n.elements.length;if(e.genre===`camembert`){let n=i.find(e=>e<0);n===void 0?a>8&&t.avertissement(`${a} parts : au-delà de 8, un camembert se lit mal. Regroupez les petites parts, ou choisissez un graphique en barres.`,e.ligne):t.erreur(`un camembert ne montre pas de valeur négative (${String(n).replace(`.`,`,`)}) : une part ne peut pas être plus petite que rien. Choisissez un graphique en barres.`,e.ligne)}else e.genre===`barres`&&a>40?t.avertissement(`${a} barres : au-delà de 40, elles deviennent trop fines pour être lues. Regroupez les valeurs, ou choisissez un graphique en courbe.`,e.ligne):e.genre===`courbe`&&a===1&&t.avertissement(`une courbe d’un seul point ne montre pas d’évolution : ajoutez des valeurs, ou montrez ce nombre dans un texte.`,e.ligne)}const is=[`lire`,`creer`,`modifier`,`supprimer`];function as(e,t){let n=(e,n)=>t.push({gravite:`erreur`,message:e,ligne:n}),r=(e,n)=>t.push({gravite:`avertissement`,message:e,ligne:n}),i=new Map;for(let t of e.donnees){i.has(t.nom)&&n(`la donnée « ${t.nom} » est déjà déclarée (ligne ${i.get(t.nom)}).`,t.ligne),i.set(t.nom,t.ligne);let e=new Map;for(let r of t.champs)e.has(r.nom)&&n(`le champ « ${r.nom} » est déjà déclaré (ligne ${e.get(r.nom)}).`,r.ligne),e.set(r.nom,r.ligne)}let a=new Map,o=new Set;for(let t of e.routes){a.has(t.adresse)&&n(`la route « ${t.adresse} » est déjà déclarée (ligne ${a.get(t.adresse)}).`,t.ligne),a.set(t.adresse,t.ligne);let s,c=new Set;for(let r of t.regles){if(!i.has(r.donnee)){n(`la donnée « ${r.donnee} » n'existe pas dans le serveur « ${e.nom} ». Données : ${[...i.keys()].join(`, `)||`aucune`}.${M(r.donnee,i.keys())}`,r.ligne);continue}if(s!==void 0&&s!==r.donnee){n(`une route ne sert qu'une donnée : la route « ${t.adresse} » sert déjà « ${s} ». Écrivez une autre route pour « ${r.donnee} ».`,r.ligne);continue}s=r.donnee,o.add(r.donnee);for(let e of r.actions)c.add(e)}if(s!==void 0){let e=new Set(c);c.has(`modifier`)&&(e.add(`creer`),e.add(`supprimer`));let n=is.filter(t=>!e.has(t));n.length>0&&r(`personne ne peut ${n.join(`, `)} « ${s} » : ces actions seront refusées.`,t.ligne)}}for(let t of e.donnees)o.has(t.nom)||r(`aucune route ne donne accès à la donnée « ${t.nom} ».`,t.ligne)}function os(e){let t={lire:null,creer:null,modifier:null,supprimer:null};for(let n of e.regles)for(let e of n.actions)t[e]=n.qui;return t.modifier&&(t.creer??=t.modifier,t.supprimer??=t.modifier),t}const ss=e=>e.replace(/^\/+/,``).replace(/^api\//,``),cs=new Set(`arguments.await.break.case.catch.class.const.continue.debugger.default.delete.do.else.enum.eval.export.extends.false.finally.for.function.if.implements.import.in.instanceof.interface.let.new.null.package.private.protected.public.return.static.super.switch.this.throw.true.try.typeof.undefined.var.void.while.with.yield.NaN.Infinity`.split(`.`));function ls(e){return U(e).split(`_`).filter(Boolean)}const us=e=>e.charAt(0).toUpperCase()+e.slice(1);function ds(e){let t=ls(e).map(us).join(``);return t===``?`Page`:/^[0-9]/.test(t)?`Page${t}`:t}function W(e){let[t=`valeur`,...n]=ls(e),r=t+n.map(us).join(``);return/^[0-9]/.test(r)&&(r=`v${r}`),cs.has(r)?`${r}_`:r}function G(e){return`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`)}'`}const fs=[`http`,`https`,`mailto`,`tel`];function ps(e){let t=/^([a-z][a-z0-9+.-]*):/i.exec(e.trim())?.[1]?.toLowerCase();if(t!==void 0)return fs.includes(t)?{externe:!0}:{refus:`l'adresse « ${e} » est refusée : un lien mène à une page, ou à une adresse en https://, http://, mailto: ou tel:. Les autres schémas (comme ${t}:) peuvent exécuter du code ou lire des fichiers.`};let n=e.indexOf(`#`);return n<0?{page:e}:{...n>0?{page:e.slice(0,n)}:{},ancre:e.slice(n+1)}}function ms(e,t){for(let n of e)t(n),n.type===`Bloc`||n.type===`Formulaire`||n.type===`Boucle`?ms(n.corps,t):n.type===`Condition`&&(ms(n.alors,t),ms(n.sinon,t))}function hs(e){let t=[];return ms(e.corps,e=>{(e.type===`Bloc`||e.type===`Element`)&&e.ancre!==void 0&&t.push({nom:e.ancre,ligne:e.ligne})}),t}const gs=`introuvable`;function _s(e,t){let n=(e,n)=>t.push({gravite:`erreur`,message:e,ligne:n}),r=new Set(e.pages.map(e=>e.nom)),i=e.serveurs.length>0||e.sources.some(e=>e.session),a=new Map;for(let t of e.pages){if(t.adresse!==void 0){t.adresse.startsWith(`/`)||n(`l'adresse « ${t.adresse} » de la page « ${t.nom} » doit commencer par / (par exemple "/collections/:slug").`,t.ligne);let r=a.get(t.adresse),i=r?e.pages.find(e=>e.nom===r.nom):void 0,o=t.parent===void 0?void 0:e.pages.find(e=>e.nom===t.parent),s=o!==void 0&&i?.parent===t.parent&&(o.adresse??`/${U(o.nom)}`)===t.adresse,c=r&&(t.parent===r.nom||i?.parent===t.nom||s);r&&c?a.set(t.adresse,r):r?n(`l'adresse « ${t.adresse} » est déjà celle de la page « ${r.nom} » (ligne ${r.ligne}).`,t.ligne):a.set(t.adresse,{nom:t.nom,ligne:t.ligne})}if(t.nom===`introuvable`&&(t.adresse!==void 0||t.parametres.length>0||t.reservee!==void 0)&&n(`la page « ${gs} » est la page 404 : elle n'a ni adresse, ni paramètre, et n'est pas réservée.`,t.ligne),t.reservee){i||n(`la page « ${t.nom} » est réservée, ce qui demande une session : ajoutez un bloc serveur, ou une source avec session astratra.`,t.reservee.ligne);let a=t.reservee.sinon??`connexion`;r.has(a)?(a===t.nom||e.pages.find(e=>e.nom===a)?.reservee)&&n(`la page « ${a} », où l'on envoie les visiteurs refusés de « ${t.nom} », est elle-même réservée : ils tourneraient en rond.`,t.reservee.ligne):n(t.reservee.sinon===void 0?`la page « ${t.nom} » est réservée : dites où envoyer les visiteurs (sinon vers "connexion") ou écrivez une page « connexion ».`:`la page « ${t.nom} » renvoie les visiteurs refusés vers « ${a} », qui n'existe pas. Pages : ${[...r].join(`, `)}.${M(a,r)}`,t.reservee.ligne)}}let o=new Map([...e.composants,...e.composantsReact].flatMap(e=>[[e.nom,e.nom],[ds(e.nom),e.nom]]));for(let t of e.pages){let e=ds(t.nom),r=o.get(e);r!==void 0&&n(`la page « ${t.nom} » et le composant « ${r} » auraient le même nom dans le code produit (${e}) : renommez l'un des deux (par exemple le composant « ${r}Bloc »).`,t.ligne)}vs(e,n),ys(e,t,n)}function vs(e,t){let n=new Map(e.pages.map(e=>[e.nom,e])),r=[...n.keys()].join(`, `),i=e=>e.adresse??`/${U(e.nom)}`,a=e=>{let t=[];return ms(e.corps,e=>{e.type===`SousPage`&&t.push(e.ligne)}),t},o=new Map,s=new Set;for(let a of e.pages){if(a.parent===void 0)continue;let c=n.get(a.parent);if(a.parent===a.nom){t(`une page ne peut pas être dans elle-même (page « ${a.nom} »).`,a.ligne);continue}if(!c){t(`la page « ${a.nom} » veut être dans « ${a.parent} », qui n'existe pas. Pages : ${r}.${M(a.parent,e.pages.map(e=>e.nom))}`,a.ligne);continue}o.set(c.nom,[...o.get(c.nom)??[],a]);let l=new Set([a.nom]),u=c,d=!1;for(;u;){if(l.has(u.nom)){d=!0;break}l.add(u.nom),u=u.parent===void 0?void 0:n.get(u.parent)}if(d){if(!s.has(a.nom)){for(let e of l)s.add(e);t(`la page « ${a.nom} » est dans « ${a.parent} », qui est elle-même dans « ${a.nom} » (directement ou non) : les sous-pages ne tournent pas en rond.`,a.ligne)}continue}if(a.nom===`introuvable`){t(`la page « ${gs} » est la page 404 : elle ne peut pas être une sous-page.`,a.ligne);continue}if(c.parametres.length>0){t(`la page « ${c.nom} » a un paramètre et des sous-pages (dont « ${a.nom} ») : dans cette version, le parent d'une sous-page n'a pas de paramètre. L'enfant peut avoir le sien.`,a.ligne);continue}if(a.adresse!==void 0&&(c.adresse!==void 0||c.nom!==`accueil`)){let e=i(c).replace(/\/+$/,``);a.adresse!==e&&!a.adresse.startsWith(`${e}/`)&&t(`l'adresse « ${a.adresse} » de « ${a.nom} » ne commence pas par celle de son parent « ${e} ».`,a.ligne)}let f=(e=>{for(let t=e;t;t=t.parent===void 0?void 0:n.get(t.parent)){if(t.reservee)return t.reservee;if(t.parent===void 0)break}})(c);a.reservee&&f?.qui===`admin`&&a.reservee.qui===`connecte`&&t(`la page « ${a.nom} » est réservée aux connectés, mais son parent « ${c.nom} » l'est aux admins : une sous-page peut être plus protégée que son parent, jamais moins.`,a.reservee.ligne)}for(let n of e.pages){let e=o.get(n.nom)??[],r=a(n);e.length>0&&r.length===0&&t(`la page « ${n.nom} » a des sous-pages (${e.map(e=>e.nom).join(`, `)}) mais pas d'endroit pour les montrer : écrivez « sous page » là où elles doivent apparaître.`,n.ligne),e.length===0&&r.length>0&&t(`« sous page » est écrit dans la page « ${n.nom} », qui n'a aucune sous-page : écrivez page "…" dans "${n.nom}" : sur une autre page.`,r[0]),r.length>1&&t(`« sous page » est écrit ${r.length} fois dans la page « ${n.nom} » : une seule fois, à l'endroit où la sous-page apparaît.`,r[1]);let s=e.filter(e=>e.adresse!==void 0&&e.adresse.replace(/\/+$/,``)===i(n).replace(/\/+$/,``));s.length>1&&t(`les pages « ${s[0].nom} » et « ${s[1].nom} » sont toutes deux la sous-page d'index de « ${n.nom} » (même adresse) : une seule.`,s[1].ligne)}}function ys(e,t,n){let r=new Map(e.pages.map(e=>[e.nom,e])),i=new Map;for(let t of e.pages){let e=new Map;for(let r of hs(t)){/^[A-Za-z0-9_-]+$/.test(r.nom)||n(`l'ancre « ${r.nom} » n'est pas valable : des lettres sans accent, des chiffres et des tirets seulement (par exemple avec ancre "desserts").`,r.ligne);let i=e.get(r.nom);i===void 0?e.set(r.nom,r.ligne):n(`l'ancre « ${r.nom} » est déjà utilisée dans la page « ${t.nom} » (ligne ${i}).`,r.ligne)}i.set(t.nom,[...e.keys()])}let a=(e,a,o)=>{let s=ps(a);if(s.ancre===void 0)return;let c=s.page===void 0||s.page===``?e:r.get(s.page);if(!c)return;if(c.parametres.length>0){t.push({gravite:`avertissement`,ligne:o,message:`l'ancre « ${s.ancre} » mène à la page « ${c.nom} », qui a un paramètre : l'ancre n'est pas vérifiée.`});return}let l=i.get(c.nom)??[];if(!l.includes(s.ancre)){let t=c===e&&(s.page===void 0||s.page===``)?`dans cette page`:`dans la page « ${c.nom} »`;n(`l'ancre « ${s.ancre} » n'existe pas ${t}. ${l.length>0?`Ancres : ${l.join(`, `)}.`:`Cette page n'a aucune ancre : écrivez avec ancre "`+s.ancre+`" sur l'élément ou le bloc où le lien doit mener.`}`,o)}};for(let t of e.pages)ms(t.corps,e=>{e.type===`Element`&&e.cible!==void 0&&a(t,e.cible,e.ligne)});for(let t of[e.entete,e.pied]){if(!t)continue;let o=t.genre===`entete`?`de l'en-tête`:`du pied de page`;ms(t.corps,s=>{if(s.type!==`Element`||s.cible===void 0)return;let c=ps(s.cible);if(c.ancre!==void 0){if(c.page!==void 0&&c.page!==``){let e=r.get(c.page);e&&a(e,s.cible,s.ligne);return}e.pages.filter(e=>!(t.genre===`entete`?e.sansEntete:e.sansPied)&&e.parametres.length===0).some(e=>i.get(e.nom)?.includes(c.ancre))||n(`l'ancre « ${c.ancre} » ${o} n'existe dans aucune page : écrivez avec ancre "${c.ancre}" sur l'élément ou le bloc où le lien doit mener, ou écrivez le nom de la page (par exemple "accueil#${c.ancre}").`,s.ligne)}})}}function bs(e){let t=[],n=(e,n)=>{let r=Ke(e);r&&r!==`liste`&&Ue.has(r)&&t.push({gravite:`avertissement`,message:`la variable « ${e} » porte le nom d'un mot du langage ; c'est permis, mais cela peut prêter à confusion.`,ligne:n})},r=e=>{for(let t of e)switch(t.type){case`Variable`:n(t.nom,t.ligne);break;case`Boucle`:n(t.variable,t.ligne),r(t.corps);break;case`Condition`:r(t.alors),r(t.sinon);break;case`Evenement`:case`Formulaire`:case`Bloc`:r(t.corps)}};for(let t of e.pages)r(t.corps);return t}var xs=class{pile=[];ouvrir(){this.pile.push(new Map)}fermer(){this.pile.pop()}chercher(e){for(let t=this.pile.length-1;t>=0;t--){let n=this.pile[t].get(e);if(n)return n}}nomsVisibles(){return[...new Set(this.pile.flatMap(e=>[...e.keys()]))]}declarerSymbole(e){this.pile[this.pile.length-1].set(e.nom,e)}declarer(e){let t=this.chercher(e.nom);return t||this.pile[this.pile.length-1].set(e.nom,e),t}};const Ss=new Set([...Object.keys(ft),`nom`,`style`,`ancre`,`nouvel`,`obligatoire`,`indice`,`minimum`,`maximum`]),Cs=new Map,ws=new Map,Ts=new Map,Es=(e,t)=>e===`admin`||t===`admin`?`admin`:e??t,Ds=e=>e.type===`Combinaison`?e.operateur===`et`?Es(Ds(e.gauche),Ds(e.droite)):void 0:e.gauche.type===`EtatUtilisateur`&&e.operateur===`vrai`?e.gauche.etat:void 0;function Os(e){let t=e.theme?.mode?.valeur;return t!==`clair`&&t!==`sombre`||JSON.stringify(e).includes(`"action":"changerTheme"`)?[`clair`,`sombre`]:[t]}function ks(e,t){let n={diagnostics:[],elements:new Map,cibles:new Map,champs:new Map,types:new Map,pagesComposants:new Map,pagesDispositions:new Map,typesParametres:new Map,facultatives:new Set,lecturesUn:new Set,reglesSources:new Map,etatsLus:new Map,reglesOperations:new Map,adressesRequetes:new Map,formats:new Map,pluriels:new Map,chemins:new Map,fonctions:new Map,fonctionsActions:new Set(e.fonctionsActions??[]),projections:new Set,filtres:new Map,tris:new Map,couleursTheme:new Set((e.theme?.couleurs??[]).map(e=>e.nom)),fenetres:new Map,blocsNommes:new Map,valeursTheme:new Map((e.theme?.couleurs??[]).map(e=>[e.nom,{clair:e.clair,sombre:e.sombre??e.clair}])),modesVus:Os(e),langues:{langues:[],traductions:new Map},referencesLangue:new Map,changementsLangue:new Map};for(let t of[...e.pages.map(e=>e.corps),e.entete?.corps,e.pied?.corps,...e.composants.map(e=>e.corps)])t&&no(t);n.langues=$i(e,n.diagnostics),Ts.clear();for(let e of n.langues.langues)Ts.set(e.mot,e.code);let r=new Set(e.pages.map(e=>e.nom));Cs.clear();for(let t of e.pages)Cs.set(t.nom,t.parametres);ws.clear();for(let t of e.pages)ws.set(t.nom,t.filtres??[]);let i=t??(e.fichiersStyle.length>0?void 0:new Set(e.styles.flatMap(e=>[...e.css.matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)].map(e=>e[1])))),a=new Ms({type:`Page`,nom:``,parametres:[],corps:[],ligne:0},r,n,i).declarerPartages(e.partages),o={sources:new Map,serveur:e.serveurs[0]?.nom,routes:new Map,donnees:new Map};for(let t of e.serveurs){for(let e of t.donnees)o.donnees.set(e.nom,e);for(let e of t.routes){let t=o.donnees.get(e.regles[0]?.donnee??``);t&&o.routes.set(ss(e.adresse),{adresse:e.adresse,donnee:t,droits:os(e)})}}o.sources=uo(e.sources,o.donnees);let s={react:new Set(e.composantsReact.map(e=>e.nom)),humalis:new Map(e.composants.map(e=>[e.nom,e.parametres.map(e=>e.nom)]))},c=n.fonctions;for(let t of e.fonctions){let e=c.get(t.nom);if(e){n.diagnostics.push({gravite:`erreur`,message:`la fonction « ${t.nom} » est déjà définie (ligne ${e.definition.ligne}).`,ligne:t.ligne});continue}c.set(t.nom,{definition:t,retour:B,appels:[]})}for(let e of c.values())new Ms({type:`Page`,nom:`fonction ${e.definition.nom}`,parametres:[],corps:[],ligne:e.definition.ligne},r,n,i,[],s,[],o,c).analyserFonction(e);for(let t of e.composants){if(!/^\p{Lu}/u.test(t.nom)){let e=t.nom.charAt(0).toUpperCase()+t.nom.slice(1);n.diagnostics.push({gravite:`erreur`,message:`le nom d'un composant commence par une majuscule, comme en React : « ${e} ».`,ligne:t.ligne})}let e={type:`Page`,nom:t.nom,parametres:[],corps:t.corps,ligne:t.ligne};n.pagesComposants.set(t,e),new Ms(e,r,n,i,a,s,t.parametres,o,c).analyser()}for(let t of[e.entete,e.pied]){if(!t)continue;let e={type:`Page`,nom:t.genre,parametres:[],corps:t.corps,ligne:t.ligne};n.pagesDispositions.set(t,e);for(let e of t.styles){let r=yt(e.propriete,e.valeur,n.couleursTheme);`erreur`in r&&n.diagnostics.push({gravite:`erreur`,message:r.erreur,ligne:t.ligne})}new Ms(e,r,n,i,a,s,[],o).analyser()}for(let t of e.pages){new Ms(t,r,n,i,a,s,[],o,c).analyser(),n.diagnostics.push(...eo(t,n.valeursTheme,n.modesVus));for(let[r,i]of[[t.sansEntete,`entete`],[t.sansPied,`pied`]])r&&!e[i]&&n.diagnostics.push({gravite:`avertissement`,message:`la page « ${t.nom} » se passe d'un ${i===`entete`?`en-tête`:`pied de page`}, mais l'application n'en a pas : écrivez « ${i} : » en haut du fichier, ou retirez « sans ${i} ».`,ligne:t.ligne})}for(let t of e.serveurs)as(t,n.diagnostics);lo(e.sources,e.serveurs,n.diagnostics),_s(e,n.diagnostics),zi(e,n.diagnostics);for(let t of e.tests)r.has(t.page)||n.diagnostics.push({gravite:`erreur`,message:`le test « ${t.nom} » vise la page « ${t.page} », qui n'existe pas. Pages : ${[...r].join(`, `)||`aucune`}.${M(t.page,r)}`,ligne:t.ligne});let l=new Set(n.diagnostics.filter(e=>e.message.startsWith(`le nom « `)).map(e=>e.ligne));return n.diagnostics.push(...bs(e).filter(e=>!l.has(e.ligne))),n.diagnostics.sort((e,t)=>e.ligne-t.ligne),n}const As={ajouter:`ajouter`,retirer:`retirer`,afficherErreur:`afficher erreur`,montrer:`montrer`,cacher:`cacher`,rediriger:`rediriger`,revenir:`revenir`,changerTexte:`changer texte`,changerTheme:`changer theme`},js={inferieur:`est inférieur à`,superieur:`est supérieur à`,inferieurOuEgal:`est inférieur ou égal à`,superieurOuEgal:`est supérieur ou égal à`};var Ms=class{page;nomsPages;resultat;classesDefinies;partages;composants;parametres;liens;fonctions;portees=new xs;elements;declareesPlusLoin=new Map;boucleFermee=new Map;elementsGardes=new Map;garde;litLaSession=!1;elementEnCours;ligneNomUtilisateur;formulaireOuvert;formulairesVus=new Map;soumissions=new Map;soumissionPerdue=!1;defilements=[];prioritaires=[];fichiers=new Map;cadre={evenement:void 0,minuteries:0,questions:0,actionsMessage:0,fenetres:0,attente:!1};fenetres=[];blocsNommes=new Map;listesDeplacees=new Map;raccourcis=new Map;evenementsOrdre=[];constructor(e,t,n,r,i=[],a={react:new Set,humalis:new Map},o=[],s={sources:new Map,routes:new Map,donnees:new Map},c=new Map){this.page=e,this.nomsPages=t,this.resultat=n,this.classesDefinies=r,this.partages=i,this.composants=a,this.parametres=o,this.liens=s,this.fonctions=c,this.elements=new La(e,n.diagnostics),n.elements.set(e,this.elements),this.recenserInteractions(e.corps);for(let t of e.corps)t.type===`Variable`&&!this.declareesPlusLoin.has(t.nom)&&this.declareesPlusLoin.set(t.nom,t.ligne)}boucles=0;fonctionOuverte;analyserFonction(e){this.portees.ouvrir();for(let t of e.definition.parametres)this.declarer(t.nom,t.ligne,B);this.fonctionOuverte={info:e,rendus:[]},this.bloc(e.definition.corps,`evenement`,{genre:`page`}),e.retour=this.fonctionOuverte.rendus.find(H)??B,this.fonctionOuverte=void 0,this.portees.fermer()}analyser(){this.portees.ouvrir();for(let e of this.partages)this.portees.declarerSymbole(e);this.portees.ouvrir();for(let e of this.parametres)this.declarer(e.nom,e.ligne,B);for(let e of this.page.parametres)Ss.has(U(e))&&this.erreur(`« ${e} » ne peut pas nommer un paramètre de page : c'est une option des éléments (avec ${e} …). Choisissez un autre nom.`,this.page.ligne),this.declarer(e,this.page.ligne,z);for(let e of this.page.filtres??[]){if(Ss.has(U(e.nom))&&this.erreur(`« ${e.nom} » ne peut pas nommer un filtre de page : c'est une option des éléments (avec ${e.nom} …). Choisissez un autre nom.`,e.ligne),this.page.parametres.includes(e.nom)){this.erreur(`« ${e.nom} » est à la fois un paramètre et un filtre de la page « ${this.page.nom} » : choisissez un seul rôle (un paramètre est dans le chemin, un filtre dans ?${e.nom}=…).`,e.ligne);continue}this.declarer(e.nom,e.ligne,e.nombre?ea:z)}this.recenserGardes(this.page.corps,void 0),this.fichiers=wo(this.page.corps),this.bloc(this.page.corps,`vue`,{genre:`page`});for(let e of[this.page.apercu?.titre,this.page.apercu?.description,this.page.apercu?.image])e&&this.typeDe(e);this.verifierEtatsRequetes(),Xo(this.defilements,this.signaler()),Yo(this.prioritaires,this.signaler()),this.finInteractions(),this.portees.fermer(),this.portees.fermer();for(let e of this.soumissionPerdue?[]:this.elements.formulaires)this.soumissions.has(e.id)||this.formulairesVus.get(e.nom)!==e.ligne||this.avertissement(`le formulaire « ${e.nom} » n’envoie rien : ajoutez quand le formulaire "${e.nom}" est soumis : suivi de ce qu’il faut faire.`,e.ligne);let e=this.partages.find(e=>U(e.nom)===`utilisateur`),t=this.ligneNomUtilisateur??e?.ligne,n=`le nom « utilisateur » est pris par la session (« si utilisateur est … », « se connecter ») : donnez un autre nom à cette variable, par exemple « membre ».`;this.litLaSession&&t!==void 0&&!this.resultat.diagnostics.some(e=>e.ligne===t&&e.message===n)&&this.erreur(n,t)}recenserGardes(e,t){for(let n of e)if(n.type===`Element`&&t){let e=this.elements.idDe(n);e&&this.elementsGardes.set(e,t)}else n.type===`Condition`?(this.recenserGardes(n.alors,Es(t,Ds(n.test))),this.recenserGardes(n.sinon,t)):(n.type===`Boucle`||n.type===`Formulaire`||n.type===`Bloc`||n.type===`Fenetre`)&&this.recenserGardes(n.corps,t)}declarerPartages(e){this.portees.ouvrir();let t=[];for(let n of e){n.options?.partagee||this.erreur(`en haut du fichier, une variable est partagée entre les pages : ajoutez « avec partagee » (variable ${n.nom} = … avec partagee).`,n.ligne);let e=this.typeDe(n.valeur);if(n.fichierDonnees){let t=e;for(;t.genre===`liste`;)t=t.de;t.genre===`fiche`&&(t.fichier=n.fichierDonnees)}this.resultat.types.set(n,e),this.declarer(n.nom,n.ligne,e,n);let r=this.portees.chercher(n.nom);r&&t.push(r)}return this.portees.fermer(),t}erreur(e,t){this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t})}avertissement(e,t){this.resultat.diagnostics.push({gravite:`avertissement`,message:e,ligne:t})}bloc(e,t,n){for(let r of e)this.instruction(r,t,n)}sousBloc(e,t,n){this.portees.ouvrir(),this.bloc(e,t,n),this.portees.fermer()}instruction(e,t,n){let r=this.fonctionOuverte?Is(e):void 0;if(r){this.erreur(`une fonction calcule une valeur : « ${r} » s'écrit dans un événement, pas dans une fonction.`,e.ligne);return}switch(e.type){case`Essayer`:if(t!==`evenement`){this.erreur(`« essayer » s'écrit dans un événement : il attrape l'erreur d'une requête ou d'une action.`,e.ligne);return}this.sousBloc(e.corps,t,n),this.portees.ouvrir(),this.declarer(`raison`,e.ligne,z),this.sousBloc(e.siErreur,t,n),this.portees.fermer();return;case`Supposant`:t!==`evenement`&&this.erreur(`« en supposant que ça marche » ne sert que dans un événement.`,e.ligne);for(let r of e.corps)r.type!==`Affectation`&&r.type!==`ModificationListe`&&this.erreur(`un élément ne se défait pas : placez ici changer, ajouter ou retirer.`,r.ligne),this.instruction(r,t,n);return;case`TantQue`:case`Repeter`:case`Selon`:{let r=e.type===`TantQue`?`tant que`:e.type===`Repeter`?`repeter`:`selon`;if(t===`vue`&&this.erreur(r===`selon`?`« selon » s'écrit dans un événement ou une fonction : dans la page, utilisez « si ».`:`« ${r} » s'écrit dans un événement ou une fonction : dans la page, « pour chaque » affiche une liste.`,e.ligne),e.type===`Selon`){this.typeDe(e.valeur);for(let r of e.cas)r.valeurs.forEach(e=>this.typeDe(e)),this.sousBloc(r.corps,t,n);this.sousBloc(e.sinon,t,n);return}if(e.type===`TantQue`){this.comparaison(e.test);let t=Ls(e.test),n=Rs(e.corps);t.length>0&&!t.some(e=>n.has(e))&&this.avertissement(`cette boucle ne change jamais « ${t[0]} » : elle risque de ne jamais s'arrêter.`,e.ligne)}else{let t=this.typeDe(e.fois);H(t)&&t.genre!==`nombre`&&this.erreur(`« repeter » attend un nombre de fois ; ${K(e.fois)} est ${V(t)}.`,e.ligne)}this.boucles++,this.sousBloc(e.corps,t,n),this.boucles--;return}case`Arreter`:case`PasserAuSuivant`:{let t=e.type===`Arreter`?`arreter`:`passer au suivant`;this.boucles===0&&this.erreur(`« ${t} » s'écrit dans une boucle (pour chaque, tant que, repeter).`,e.ligne);return}case`Rendre`:{let t=this.typeDe(e.valeur);this.fonctionOuverte?this.fonctionOuverte.rendus.push(t):this.erreur(`« rendre » ne s'écrit que dans une fonction (fonction … avec … :).`,e.ligne);return}case`Variable`:{e.options?.partagee&&this.erreur(`une variable partagée se déclare en haut du fichier, hors des pages.`,e.ligne);let t=this.typeDe(e.valeur);this.resultat.types.set(e,t),(e.valeur.type===`Rien`||e.valeur.type===`Premier`)&&this.resultat.facultatives.add(e),this.declarer(e.nom,e.ligne,t,e);return}case`Affectation`:{if(t===`vue`&&this.horsEvenement(`changer … par`,e.ligne),Ts.size===0&&U(e.nom)===`langue`&&!this.portees.chercher(e.nom)){this.variable(e.nom,e.ligne);return}if(this.valeurDeLangue(e.nom)===`langue`&&!e.champs){let t=e.valeur.type===`Reference`?Ts.get(U(e.valeur.nom)):void 0;if(t===void 0){let t=[...Ts.keys()];this.erreur(`« changer langue par » attend une langue du bloc « langues » : ${t.join(` ou `)} (sans guillemets).`,e.ligne)}else this.resultat.changementsLangue.set(e,t);return}let n=this.variable(e.nom,e.ligne);if(n?.origine?.type===`Variable`&&n.origine.fichierDonnees){this.erreur(`« ${e.nom} » vient d'un fichier : on peut la lire, pas la changer. Pour la modifier, copiez-la : variable mes_${e.nom} = ${e.nom}.`,e.ligne);return}let r=this.typeDe(e.valeur);if(n&&this.page.parametres.includes(e.nom)){this.erreur(`« changer » sur « ${e.nom} » : un paramètre vient du chemin de l'adresse, on ne le change pas. Changez de page avec rediriger vers "${this.page.nom}" avec ${e.nom} …`,e.ligne);return}if(n&&(this.page.filtres??[]).some(t=>t.nom===e.nom)){e.champs?this.erreur(`« ${e.nom} » est un filtre d'adresse : il n'a pas de champs.`,e.ligne):ia(n.type,r)||this.erreur(`le filtre « ${e.nom} » est ${V(n.type)} ; on ne peut pas lui donner ${V(r)}.`,e.ligne);return}if(n&&this.estCalcul(n,e.ligne))return;let i=n?.type;if(n&&e.champs){let t={type:`Reference`,nom:e.nom,ligne:e.ligne};for(let n of e.champs)t={type:`AccesChamp`,objet:t,champ:n,ligne:e.ligne};i=this.typeDe(t)}let a=[e.nom,...e.champs??[]].join(`.`);i&&!ia(i,r)&&this.erreur(`« ${a} » est ${V(i)} ; on ne peut pas lui donner ${V(r)}.`,e.ligne);return}case`ModificationListe`:this.modificationListe(e,t);return;case`Rechargement`:t===`evenement`&&(this.cadre.attente=!0),t===`vue`&&this.horsEvenement(`recharger`,e.ligne),this.usagesEtat.push({nom:e.variable,ligne:e.ligne,mot:`recharger`});return;case`Suppression`:case`Modification`:{let n=e.type===`Suppression`?`supprimer`:`modifier`;t===`evenement`&&(this.cadre.attente=!0),t===`vue`&&this.horsEvenement(n,e.ligne),this.operationServeur(e);return}case`EnvoiFichier`:t===`vue`&&this.horsEvenement(`envoyer fichier`,e.ligne,` Un fichier se choisit par une action de la personne : placez-le dans un événement (quand … clique sur …).`),this.envoiFichier(e);return;case`Requete`:t===`evenement`&&(this.cadre.attente=!0),t===`vue`&&this.horsEvenement(`envoyer requete`,e.ligne,` Pour charger des données à l'ouverture de la page, placez-la dans : quand la page se charge :`),this.requete(e);return;case`Element`:this.element(e,t);return;case`Graphique`:this.graphique(e,t);return;case`Formulaire`:this.formulaire(e,t,n);return;case`Bloc`:this.blocMiseEnPage(e,t,n);return;case`CodeDocumentation`:t===`evenement`&&this.erreur(`un bloc de code se place dans une page.`,e.ligne);return;case`TableauDocumentation`:e.legende||this.erreur(`un tableau attend une légende entre guillemets : tableau "Commandes" :`,e.ligne),e.colonnes.length===0&&this.erreur(`un tableau attend une ligne « colonnes ».`,e.ligne);for(let t of e.rangees)e.colonnes.length>0&&t.length!==e.colonnes.length&&this.erreur(`la rangée a ${t.length} cellules, mais le tableau a ${e.colonnes.length} colonnes.`,t[0]?.ligne??e.ligne);e.legende&&this.typeDe(e.legende),e.colonnes.forEach(e=>this.typeDe(e)),e.rangees.flat().forEach(e=>this.typeDe(e));return;case`Action`:this.action(e,t),e.message&&(ca(this.hote(),e,t===`vue`,this.cadre.minuteries>0),e.message.action&&t===`evenement`&&(this.cadre.actionsMessage++,this.sousBloc(e.message.action.corps,`evenement`,n),this.cadre.actionsMessage--));return;case`Condition`:{this.comparaison(e.test);let r=this.garde;this.garde=Es(r,Ds(e.test)),this.sousBloc(e.alors,t,n),this.garde=r,this.sousBloc(e.sinon,t,n);return}case`Connexion`:case`Deconnexion`:{let n=e.type===`Connexion`?`se connecter`:`se deconnecter`;this.litLaSession=!0,t===`vue`&&this.horsEvenement(n,e.ligne),this.demandeUnServeur(n,e.ligne),e.type===`Connexion`&&this.connexion(e);return}case`Boucle`:this.boucle(e,t,n);return;case`Composant`:this.usageComposant(e,t);return;case`Apercu`:this.erreur(`« apercu » décrit toute la page : écrivez-le directement sous « page "…" : », hors des blocs et des événements.`,e.ligne);return;case`Execution`:this.fonctions.has(e.nom)?this.erreur(`« ${e.nom} » rend une valeur : emploie-la dans un calcul, par exemple « calcul x = ${e.nom}(…) ».`,e.ligne):this.typeDe({type:`Appel`,nom:e.nom,arguments:e.arguments,ligne:e.ligne});return;case`SousPage`:t===`evenement`&&this.erreur(`« sous page » est un endroit de la page, pas une action : placez-le dans la page, hors des événements.`,e.ligne);return;case`Parametre`:this.erreur(`« parametre » ne s'utilise qu'au début d'un composant (composant "…" :).`,e.ligne);return;case`Evenement`:this.evenement(e,t,n);return;case`Minuterie`:this.minuterie(e,t,n);return;case`Copier`:ma(this.hote(),e,this.placeGeste(t));return;case`Partager`:if(ha(this.hote(),e,this.placeGeste(t)),e.lien){this.pageCible(e.lien.adresse,e.ligne);let t=ps(e.lien.adresse).page;t!==void 0&&t!==``&&this.argumentsPage(t,e.lien.parametres??[],`partager … avec lien vers`,e.ligne)}return;case`Confirmer`:{let r=this.placeGeste(t);ga(this.hote(),e,{dansLaPage:t===`vue`,sansGeste:r.sansGeste,dansUneAction:this.cadre.actionsMessage>0,profondeur:this.cadre.questions}),this.cadre.attente=!0,this.cadre.questions++,this.sousBloc(e.alors,t,n),this.cadre.questions--,this.sousBloc(e.sinon,t,n);return}case`Fenetre`:_a(this.hote(),e,{dansUnEvenement:t===`evenement`,dansUneFenetre:this.cadre.fenetres>0}),this.cadre.fenetres++,this.sousBloc(e.corps,`vue`,n),this.cadre.fenetres--;return}}hote(){return{erreur:(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}),avertissement:(e,t)=>this.resultat.diagnostics.push({gravite:`avertissement`,message:e,ligne:t}),typeDe:e=>this.typeDe(e)}}placeGeste(e){return{dansLaPage:e===`vue`,sansGeste:this.cadre.minuteries>0?`minuterie`:this.cadre.evenement===`chargement`?`chargement`:void 0,apresUneAttente:this.cadre.attente}}recenserInteractions(e){for(let t of e)if(t.type===`Fenetre`){let e=t.nom??t.titre,n=this.fenetres.find(t=>t.nom===e);n?ka(this.hote(),e,n.noeud.ligne,t.ligne):this.fenetres.push({noeud:t,id:`fenetre_${U(e)||t.ligne}`,nom:e,ouverte:!1,fermee:!1}),this.recenserInteractions(t.corps)}else if(t.type===`Bloc`){if(t.nom!==void 0){let e=this.blocsNommes.get(t.nom);e?Aa(this.hote(),t.nom,e.ligne,t.ligne):this.blocsNommes.set(t.nom,{id:`bloc_${U(t.nom)||t.ligne}`,ligne:t.ligne})}this.recenserInteractions(t.corps)}else t.type===`Condition`?(this.recenserInteractions(t.alors),this.recenserInteractions(t.sinon)):(t.type===`Boucle`||t.type===`Formulaire`)&&this.recenserInteractions(t.corps)}fenetreVisee(e,t){let n=this.fenetres.find(e=>e.nom===t);if(n)return e.action===`montrer`&&(n.ouverte=!0),e.action===`cacher`&&(n.fermee=!0),n.id}minuterie(e,t,n){let r=t===`vue`;la(this.hote(),e,{page:r,auPremierNiveau:this.page.corps.includes(e),survol:this.cadre.evenement===`survol`}),e.tantQue&&this.comparaison(e.tantQue),this.cadre.minuteries++,this.boucles++,this.sousBloc(e.corps,`evenement`,n),this.boucles--,this.cadre.minuteries--}evenementInteraction(e,t){let n=t.genre===`boucle`?t.elements:void 0;switch(e.genre){case`touche`:{e.cible!==void 0&&this.cible(e,e.cible,n);let t=wa(this.hote(),e.touches??``,e.ligne,{dansUnChamp:e.cible!==void 0});t!==void 0&&this.raccourci(t,e.cible,e.ligne);return}case`saisie`:case`pauseSaisie`:{let r=e.cible??``,i=this.elements.resoudre(r,`champ`,n);if(!(`ids`in i)){let t=this.elements.elements.filter(e=>e.noeud.element===`champ`).map(e=>e.nom??e.libelle).filter(e=>!!e);ja(this.hote(),r,this.page.nom,t,e.ligne);return}this.resultat.cibles.set(e,i.ids);let a=this.elements.parId(i.ids[0])?.noeud.sorte;Ta(this.hote(),e,a,t.genre===`boucle`);return}case`bas`:{let t=e.cible??``,n=this.blocsNommes.get(t);!n||n.bas!==void 0?Ma(this.hote(),t,n?.bas,e.ligne):(n.bas=e.ligne,this.resultat.cibles.set(e,[n.id])),e.tantQue&&this.comparaison(e.tantQue),Oa(this.hote(),e,e.tantQue?Ls(e.tantQue):[]);return}case`ordre`:this.variable(e.variable??``,e.ligne),this.evenementsOrdre.push(e);return}}deplacement(e,t){let n=e.liste,r=(n.type===`Reference`?this.portees.chercher(n.nom):void 0)?.origine,i=n.type===`Reference`&&r?.type===`Variable`&&!r.calcul?n.nom:void 0,a=i===void 0?void 0:this.listesDeplacees.get(i);Na(this.hote(),e,{dansUnEvenement:t===`evenement`,variable:i,deja:a})&&i!==void 0&&this.listesDeplacees.set(i,e.ligne)}raccourci(e,t,n){let r=t===void 0?e:`${e}@${t}`,i=this.raccourcis.get(r);i===void 0?this.raccourcis.set(r,n):Pa(this.hote(),e,i,n)}finInteractions(){for(let e of this.fenetres)va(this.hote(),e.noeud,e.ouverte,e.fermee);for(let e of this.evenementsOrdre)Fa(this.hote(),e,this.listesDeplacees.has(e.variable??``));for(let e of this.fenetres)this.resultat.fenetres.set(e.noeud,e.id);for(let[e,t]of this.blocsNommes)this.resultat.blocsNommes.set(e,t.id)}element(e,t){if(t===`evenement`&&this.erreur(`un élément ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour le faire apparaître.`,e.ligne),this.elementEnCours=e.element,this.typeDe(e.contenu),this.elementEnCours=void 0,e.cible!==void 0){this.pageCible(e.cible,e.ligne);let t=ps(e.cible);t.page===void 0?e.arguments?.length&&this.erreur(t.externe?`une adresse externe (${e.cible}) n'a pas de paramètres de page : retirez « avec ${e.arguments[0].nom} … ».`:`« avec ${e.arguments[0].nom} … » demande une page : écrivez vers "page" avec …`,e.ligne):this.argumentsPage(t.page,e.arguments??[],`${e.element} … vers`,e.ligne)}e.nouvelOnglet&&e.element!==`lien`&&this.erreur(`« avec nouvel onglet » s'applique à un lien, pas à un ${e.element}.`,e.ligne);for(let t of e.styles){if(t.texte&&!t.texte.parties.some(e=>e.type===`variable`)&&this.versionsLues(t.texte),t.propriete===`decoratif`||e.element===`audio`&&t.propriete===`automatique`)continue;let n=yt(t.propriete,t.valeur,this.resultat.couleursTheme);if(`erreur`in n)this.erreur(n.erreur,e.ligne);else{let r=_t(t.propriete,e.element);r&&this.erreur(r,e.ligne),this.contrasteDuTheme(n.propriete,n.valeur,e.ligne)}}for(let t of e.classes)this.classesDefinies&&!this.classesDefinies.has(t)&&this.avertissement(`le style « ${t} » n'est défini dans aucun CSS du projet.${M(t,this.classesDefinies)}`,e.ligne);if(Ya(e,this.signaler()),Ho(e.styles,e.element,this.formulaireOuvert!==void 0,e.ligne,this.signaler())&&this.defilements.push(e.ligne),e.element===`image`&&Wo(e,this.signaler())&&this.prioritaires.push(e.ligne),e.element===`fichier`&&this.choixFichier(e),e.element===`audio`&&qo(e,this.signaler()),e.element===`marqueur`&&jo(e,this.pileBlocs.some(e=>e.genre===`carte`),this.signaler()),this.optionsDeChamp(e),e.raccourci!==void 0){let t=Ia(this.hote(),e);t!==void 0&&this.raccourci(t,void 0,e.ligne)}}choixFichier(e){bo(e,this.signaler());let t=e.fichier,n=this.variable(t.variable,e.ligne);if(!n)return;let r=n.origine?.type===`Variable`?n.origine:void 0;(r?.options?.memorisee||r?.options?.partagee)&&this.erreur(`un fichier choisi ne se garde pas (ni mémorisé dans le navigateur, ni partagé entre les pages) : déclarez variable `+t.variable+` = rien dans la page.`,e.ligne);let i=yo(t.plusieurs);!H(n.type)||n.type.genre===`liste`&&!H(n.type.de)?(n.type=i,n.origine&&this.resultat.types.set(n.origine,i)):ia(n.type,i)||this.erreur(`« ${t.variable} » est ${V(n.type)} ; elle reçoit un fichier choisi. Déclarez variable ${t.variable} = rien.`,e.ligne)}envoiFichier(e){Co(e,{fichiers:this.fichiers,sources:this.liens.sources,typeDe:(e,t)=>this.variable(e,t)?.type},this.signaler()),e.resultat!==void 0&&this.ciblesSources.add(e.resultat)}optionsDeChamp(e){let t=[`progression`,`etoiles`,`compteur`].includes(e.element),n=[`obligatoire`,`indice`,`minimum`,`maximum`].filter(n=>e[n]!==void 0&&!(t&&(n===`minimum`||n===`maximum`)));if(e.element!==`champ`){n.length>0&&this.erreur(`l’option « ${n[0]} » s’applique à un champ (champ, case à cocher, choix, liste déroulante), pas à un ${e.element}.`,e.ligne);return}if(e.parmi){let t=this.typeDe(e.parmi),n=t.genre===`liste`&&(t.de.genre===`texte`||!H(t.de));H(t)&&!n&&this.erreur(`après « parmi », il faut une liste de textes, par exemple ["S", "M", "L"] ; ici, c’est ${t.genre===`liste`?ra(t):V(t)}.`,e.ligne)}for(let n of[`minimum`,`maximum`])e[n]!==void 0&&e.sorte!==`nombre`&&!t&&this.erreur(`l’option « ${n} » s’applique à un champ nombre : écrivez champ nombre "…" avec ${n} ….`,e.ligne);e.minimum!==void 0&&e.maximum!==void 0&&e.minimum>e.maximum&&this.erreur(`le minimum (${e.minimum}) est plus grand que le maximum (${e.maximum}).`,e.ligne),e.indice!==void 0&&(e.sorte===`case`||e.sorte===`choix`)&&this.erreur(`l’option « indice » ne s’applique pas à une case à cocher ni à un choix : il n’y a rien à écrire dedans.`,e.ligne),(e.obligatoire||e.minimum!==void 0||e.maximum!==void 0)&&!this.formulaireOuvert&&this.avertissement(`« obligatoire », « minimum » et « maximum » sont vérifiés à l’envoi d’un formulaire : placez ce champ dans un bloc formulaire "…" :`,e.ligne)}formulaire(e,t,n){if(t===`evenement`)this.erreur(`un formulaire ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour le faire apparaître.`,e.ligne);else if(this.formulaireOuvert)this.erreur(`un formulaire ne peut pas contenir un autre formulaire : placez « ${e.nom} » à côté de « ${this.formulaireOuvert.nom} ».`,e.ligne);else{let t=this.formulairesVus.get(e.nom);t===void 0?this.formulairesVus.set(e.nom,e.ligne):this.erreur(`le formulaire « ${e.nom} » existe déjà dans cette page (ligne ${t}).`,e.ligne)}let r=this.formulaireOuvert;this.formulaireOuvert??=e,this.sousBloc(e.corps,`vue`,n),this.formulaireOuvert=r}pileBlocs=[];signaler(){return{erreur:(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}),avertissement:(e,t)=>this.resultat.diagnostics.push({gravite:`avertissement`,message:e,ligne:t}),typeDe:e=>this.typeDe(e)}}graphique(e,t){e.description?.type===`Chaine`&&!e.description.parties.some(e=>e.type===`variable`)&&this.versionsLues(e.description),Qo(e,{...this.signaler(),dansEvenement:t===`evenement`,champsDe:e=>this.champsDesElements(e),listeEcrite:e=>{if(e.type===`Liste`)return e;let t=e.type===`Reference`?this.portees.chercher(e.nom)?.origine:void 0;return t?.type===`Variable`&&t.valeur.type===`Liste`?t.valeur:void 0},couleur:e=>{let t=yt(`couleur`,e,this.resultat.couleursTheme);if(`erreur`in t)return t;let n=this.resultat.valeursTheme.get(t.valeur)??Qa[t.valeur];return{nom:t.valeur,clair:n.clair,sombre:n.sombre}},modes:this.resultat.modesVus})}contrasteDuTheme(e,t,n){if(e!==`couleur`&&e!==`texte`)return;let r=this.resultat.valeursTheme.get(t);if(r)for(let e of this.resultat.modesVus){let i=Zn(r[e],Kn[e]);if(i<3){this.avertissement(`la couleur « ${t} » (mode ${e}) se voit mal sur le fond de la page (contraste ${i.toFixed(1).replace(`.`,`,`)} pour 1, il en faut au moins 3). Choisissez une couleur plus ${e===`clair`?`foncée`:`claire`} pour ce mode.`,n);return}}}blocMiseEnPage(e,t,n){t===`evenement`&&this.erreur(`un bloc ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour faire apparaître ce qu’il contient.`,e.ligne);for(let t of e.styles){let n=yt(t.propriete,t.valeur,this.resultat.couleursTheme);if(`erreur`in n)this.erreur(n.erreur,e.ligne);else{let r=_t(t.propriete,e.genre);r&&this.erreur(r,e.ligne),this.contrasteDuTheme(n.propriete,n.valeur,e.ligne)}}for(let t of e.classes)this.classesDefinies&&!this.classesDefinies.has(t)&&this.avertissement(`le style « ${t} » n'est défini dans aucun CSS du projet.${M(t,this.classesDefinies)}`,e.ligne);Za(e,this.pileBlocs[this.pileBlocs.length-1],this.signaler()),e.genre===`carte`&&Ao(e,this.signaler()),Ho(e.styles,e.genre,this.formulaireOuvert!==void 0,e.ligne,this.signaler())&&this.defilements.push(e.ligne),this.pileBlocs.push(e),this.sousBloc(e.corps,`vue`,n),this.pileBlocs.pop()}action(e,t){let n=As[e.action];switch(t===`vue`&&e.action!==`afficher`&&this.horsEvenement(n,e.ligne),e.action){case`afficher`:case`afficherErreur`:this.typeDe(e.arguments[0]);return;case`changerTheme`:{let t=Ps(e.arguments[0]);(t===void 0||![`clair`,`sombre`,`automatique`,`bascule`].includes(t))&&this.erreur(`« changer theme par … » prend clair, sombre ou automatique (ici : « ${t??`?`} »).`,e.ligne);return}case`rediriger`:{let t=Ps(e.arguments[0]);t===void 0?this.typeDe(e.arguments[0]):this.pageCible(t,e.ligne);let n=t===void 0?void 0:ps(t).page;if(t!==void 0&&n!==void 0)this.argumentsPage(n,e.parametres??[],`rediriger vers`,e.ligne);else if(t!==void 0&&e.parametres?.length)this.erreur(`« rediriger vers … avec … » demande une page : rediriger vers "produit" avec id …`,e.ligne);else if(e.parametres?.length){for(let t of e.parametres)this.typeDe(t.valeur);this.erreur(`« rediriger vers … avec … » demande le nom de la page entre guillemets : rediriger vers "produit" avec id …`,e.ligne)}return}case`revenir`:if(e.arguments.length>0){let t=Ps(e.arguments[0]);t===void 0?(this.typeDe(e.arguments[0]),this.erreur(`« revenir vers » demande le nom de la page entre guillemets : revenir vers "catalogue"`,e.ligne)):this.nomsPages.has(t)||this.erreur(`« revenir vers ${t} » : la page n'existe pas. Pages : ${[...this.nomsPages].join(`, `)}.${M(t,this.nomsPages)}`,e.ligne)}return;case`montrer`:case`cacher`:case`changerTexte`:{let t=Ps(e.arguments[0]);if(t===void 0){let t=e.action===`changerTexte`?`changer texte de "description" par …`:`${n} "menu"`;this.erreur(`écrivez le nom de l'élément entre guillemets, par exemple : ${t}`,e.ligne)}else this.cible(e,t);e.action===`changerTexte`&&this.typeDe(e.arguments[1]);return}}}usageComposant(e,t){t===`evenement`&&this.erreur(`un composant ne peut pas être créé dans un événement. Placez-le dans la page, puis utilisez montrer "…" pour le faire apparaître.`,e.ligne);let n=e.proprietes.map(e=>this.typeDe(e.valeur)),r=this.composants.humalis.get(e.nom);if(r){e.proprietes.forEach((t,i)=>{if(!r.includes(t.nom)){this.erreur(`« ${t.nom} » n'est pas un paramètre du composant « ${e.nom} ». Paramètres : ${r.join(`, `)}.`,e.ligne);return}let a=`${e.nom}.${t.nom}`;this.resultat.typesParametres.set(a,[...this.resultat.typesParametres.get(a)??[],n[i]])});for(let t of r)e.proprietes.some(e=>e.nom===t)||this.avertissement(`le paramètre « ${t} » du composant « ${e.nom} » n'est pas donné.`,e.ligne)}else this.composants.react.has(e.nom)||this.erreur(`le composant « ${e.nom} » n'est pas déclaré. Ajoutez en haut du fichier : utiliser composant "${e.nom}" depuis "…", ou écrivez-le avec composant "${e.nom}" :`,e.ligne)}boucle(e,t,n){let r=this.typeDe(e.liste);H(r)&&r.genre!==`liste`&&this.erreur(`${K(e.liste)} est ${V(r)} ; pour chaque … dans attend une liste.`,e.ligne);let i=r.genre===`liste`?r.de:B;this.resultat.types.set(e,i),e.deplacement&&this.deplacement(e,t),this.portees.ouvrir(),this.declarer(e.variable,e.ligne,i,e);let a=t===`vue`?{genre:`boucle`,elements:this.elements.elementsDe(e.corps),formulaires:this.elements.formulairesDe(e.corps)}:n;t===`evenement`&&this.boucles++,this.bloc(e.corps,t,a),t===`evenement`&&this.boucles--,this.portees.fermer(),this.boucleFermee.set(e.variable,e.ligne)}evenement(e,t,n){t===`evenement`&&this.erreur(`un événement ne se place pas dans un autre événement : écrivez-le dans la page, sous son élément.`,e.ligne),e.genre===`soumission`?this.soumission(e,n):[`touche`,`saisie`,`pauseSaisie`,`bas`,`ordre`].includes(e.genre)?this.evenementInteraction(e,n):e.cible!==void 0&&(n.genre===`boucle`&&!n.elements.some(t=>Ns(t,e.cible))?this.erreur(`« ${e.cible} » n’est pas dans cette boucle : un événement placé dans une boucle vise un élément de la même boucle.`,e.ligne):this.cible(e,e.cible,n.genre===`boucle`?n.elements:void 0));let r=this.resultat.cibles.get(e)??[],i=r.map(e=>this.elementsGardes.get(e)),a=this.garde;r.length>0&&i.every(e=>e!==void 0)&&(this.garde=Es(a,i.includes(`connecte`)?`connecte`:`admin`)),e.corps.forEach((t,n)=>{t.type===`Supposant`&&![`Requete`,`Suppression`,`Modification`].some(t=>e.corps[n+1]?.type===t)&&this.erreur(`« en supposant que ça marche » demande une requête juste après : sinon il n’y a rien à défaire.`,t.ligne)});let o={...this.cadre};this.cadre.evenement=e.genre,this.cadre.attente=!1,this.sousBloc(e.corps,`evenement`,n),Object.assign(this.cadre,o),this.garde=a}soumission(e,t){let n=e.cible??``,r=this.elements.formulaires,i=(t.genre===`boucle`?t.formulaires:r).find(e=>e.nom===n);if(!i){this.soumissionPerdue=!0,t.genre===`boucle`&&r.some(e=>e.nom===n)?this.erreur(`« ${n} » n’est pas dans cette boucle : un événement placé dans une boucle vise un formulaire de la même boucle.`,e.ligne):r.length===0?this.erreur(`le formulaire « ${n} » n’existe pas dans cette page : créez-le avec formulaire "${n}" : suivi de ses champs et d’un bouton.`,e.ligne):this.erreur(`le formulaire « ${n} » n’existe pas dans cette page. Formulaires de la page : ${[...new Set(r.map(e=>e.nom))].join(`, `)}.`,e.ligne);return}let a=this.soumissions.get(i.id);if(a!==void 0){this.erreur(`le formulaire « ${n} » a déjà son événement « est soumis » (ligne ${a}) : réunissez les deux dans le même événement.`,e.ligne);return}this.soumissions.set(i.id,e.ligne),this.resultat.cibles.set(e,[i.id])}connexion(e){let t=[e.email,e.motDePasse];for(let e of t)this.typeDe(e);let n=t.map(e=>e.type===`Champ`?this.sorteDuChamp(e):void 0);if(t.some(e=>e.type!==`Champ`)||n.some(e=>e===`case`||e===`choix`||e===`liste`)){this.erreur(`« se connecter » attend deux champs de la page : se connecter avec champ "email" et champ "mot de passe"`,e.ligne);return}let[r,i]=t.map(e=>this.resultat.champs.get(e));r!==void 0&&r===i&&this.erreur(`« se connecter » attend deux champs différents : l’email, puis le mot de passe.`,e.ligne)}demandeUnServeur(e,t){this.liens.serveur!==void 0||[...this.liens.sources.values()].some(e=>e.source.session)||this.erreur(`« ${e} » demande un serveur dans le même fichier : la connexion passe par ses packs Astratra. Ajoutez un bloc serveur "…" :`,t)}comparaison(e){if(e.type===`Combinaison`){this.comparaison(e.gauche),this.comparaison(e.droite);return}let t=this.typeDe(e.gauche),n=e.droite?this.typeDe(e.droite):B;switch(e.operateur){case`dans`:H(n)&&n.genre!==`liste`?this.erreur(`« est dans » cherche dans une liste ; cette valeur est ${V(n)}.`,e.ligne):n.genre===`liste`&&H(n.de)&&!ia(t,n.de)&&this.erreur(`on ne peut pas chercher ${V(t)} dans ${ra(n)}.`,e.ligne);return;case`egal`:case`different`:ia(t,n)||this.erreur(`on ne peut pas comparer ${V(t)} et ${V(n)}.`,e.ligne);return;case`vide`:H(t)&&t.genre!==`texte`&&t.genre!==`liste`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « est vide » s'applique à un texte ou à une liste.`,e.ligne);return;case`rien`:return;case`commencePar`:case`finitPar`:H(t)&&t.genre!==`texte`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « ${e.operateur===`commencePar`?`commence par`:`finit par`} » s'applique à un texte.`,e.ligne);return;case`contient`:H(t)&&t.genre!==`texte`&&t.genre!==`liste`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « contient » s'applique à un texte ou à une liste.`,e.ligne);return;case`vrai`:case`faux`:H(t)&&t.genre!==`booleen`&&this.erreur(`${K(e.gauche)} est ${V(t)} ; « est ${e.operateur} » attend vrai ou faux.`,e.ligne);return;default:for(let[r,i]of[[e.gauche,t],[e.droite,n]])r&&H(i)&&i.genre!==`nombre`&&this.erreur(`${K(r)} est ${V(i)} ; « ${js[e.operateur]} » compare des nombres.`,e.ligne)}}versionsLues(e){for(let t of e.versions??[])this.interpolations({type:`Chaine`,parties:t.parties,ligne:t.ligne});for(let t of this.resultat.langues.traductions.get(At(e.parties))?.values()??[])this.interpolations({type:`Chaine`,parties:t,ligne:e.ligne})}typeDe(e){switch(e.type){case`Chaine`:return[e.parties,...e.versions?.map(e=>e.parties)??[]].some(e=>e.some(e=>e.type===`accent`))&&![`titre`,`soustitre`,`texte`].includes(this.elementEnCours??``)&&this.erreur(`accent s’emploie seulement dans un titre, un soustitre ou un texte.`,e.ligne),this.interpolations(e),this.versionsLues(e),z;case`Nombre`:return ea;case`Booleen`:return ta;case`Liste`:{let t=e.elements.map(e=>this.typeDe(e));return na(t[0]??B)}case`Reference`:{let t=this.valeurDeLangue(e.nom);return t===void 0?this.variable(e.nom,e.ligne)?.type??B:(this.resultat.referencesLangue.set(e,t),z)}case`Calcul`:return this.calcul(e);case`AccesChamp`:return this.accesChamp(e);case`Rien`:return B;case`Appel`:return this.appel(e);case`Agregat`:{let t=this.typeDe(e.liste),n=`« ${e.operation} de »`;return H(t)&&(t.genre!==`liste`||H(t.de)&&t.de.genre!==`nombre`)&&this.erreur(`${n} calcule sur une liste de nombres ; ${K(e.liste)} est ${t.genre===`liste`?ra(t):V(t)}.`,e.ligne),ea}case`Filtre`:case`Tri`:case`Premier`:case`Premiers`:case`Groupement`:return this.operationDeListe(e);case`OperationTexte`:case`Remplacement`:{let t=e.type===`OperationTexte`?[e.valeur]:[e.cherche,e.remplace,e.dans],n=e.type===`OperationTexte`?`« ${e.operation} de »`:`« remplacer »`;for(let r of t){let t=this.typeDe(r);H(t)&&t.genre!==`texte`&&this.erreur(`${n} attend un texte ; ${K(r)} est ${V(t)}.`,e.ligne)}return e.type===`OperationTexte`&&e.operation===`longueur`?ea:z}case`DateDuJour`:return z;case`DateDecalee`:case`JoursEntre`:{let t=e.type===`DateDecalee`?[e.date]:[e.debut,e.fin];for(let n of t){let t=this.typeDe(n);H(t)&&t.genre!==`texte`&&this.erreur(`une date s'écrit comme « aujourd'hui » ou « 2026-11-07 » ; ${K(n)} est ${V(t)}.`,e.ligne)}if(e.type===`DateDecalee`){let t=this.typeDe(e.nombre);return H(t)&&t.genre!==`nombre`&&this.erreur(`« ${e.signe>0?`plus`:`moins`} … ${e.unite} » attend un nombre ; ${K(e.nombre)} est ${V(t)}.`,e.ligne),z}return ea}case`Arrondi`:case`Hasard`:{let t=e.type===`Arrondi`?[e.valeur]:[e.minimum,e.maximum];for(let n of t){let t=this.typeDe(n);H(t)&&t.genre!==`nombre`&&this.erreur(`« ${e.type===`Arrondi`?`arrondi de`:`hasard entre`} » attend un nombre ; ${K(n)} est ${V(t)}.`,e.ligne)}return ea}case`Fiche`:{let t=[];for(let n of e.champs){if(t.some(e=>e.nom===n.nom)){this.erreur(`le champ « ${n.nom} » est donné deux fois dans cette fiche.`,n.ligne);continue}t.push({nom:n.nom,type:this.typeDe(n.valeur)})}return{genre:`fiche`,champs:t}}case`EtatRequete`:return this.usagesEtat.push({nom:e.variable,ligne:e.ligne,mot:`est ${e.etat===`introuvable`?``:`en `}${e.etat}`}),ta;case`ErreurRequete`:return this.usagesEtat.push({nom:e.variable,ligne:e.ligne,mot:`erreur de`}),z;case`MouvementReduit`:case`ThemeSombre`:return ta;case`EtatUtilisateur`:return this.litLaSession=!0,this.demandeUnServeur(`utilisateur est ${e.etat}`,e.ligne),ta;case`Compte`:{let t=this.typeDe(e.liste);return H(t)&&t.genre!==`liste`&&this.erreur(`${K(e.liste)} est ${V(t)} ; « nombre de » compte les éléments d’une liste.`,e.ligne),ea}case`Champ`:{let t=this.elements.resoudre(e.nom,`champ`);`ids`in t?this.resultat.champs.set(e,t.ids[0]):this.erreur(`aucun champ « ${e.nom} » dans la page « ${this.page.nom} ».${M(e.nom,this.elements.elements.filter(e=>e.noeud.element===`champ`).flatMap(e=>[e.nom,e.libelle].filter(e=>e!==void 0)))}`,e.ligne);let n=this.sorteDuChamp(e);return n===`nombre`?ea:n===`case`?ta:z}}}appel(e){let t=e.arguments.map(e=>this.typeDe(e)),n=this.fonctions.get(e.nom);if(!n&&this.resultat.fonctionsActions.has(e.nom))return this.erreur(`« ${e.nom} » fait des actions sans rendre de valeur : appelle-la seule sur une ligne, dans un événement (« ${e.nom}() »).`,e.ligne),B;if(!n){let t=[...this.fonctions.keys()];return this.erreur(t.length>0?`la fonction « ${e.nom} » n'existe pas. Fonctions : ${t.join(`, `)}.${M(e.nom,t)}`:`la fonction « ${e.nom} » n'existe pas : écrivez-la en haut du fichier, avec fonction ${e.nom} avec … :`,e.ligne),B}let r=n.definition.parametres.map(e=>e.nom);return r.length===t.length?n.appels.push(t):this.erreur(`la fonction « ${e.nom} » attend ${(e=>`${e} valeur${e>1?`s`:``}`)(r.length)}${r.length>0?` (${r.join(`, `)})`:``}, mais en reçoit ${t.length}.`,e.ligne),n.retour}operationDeListe(e){let t=this.typeDe(e.liste);if(H(t)&&t.genre!==`liste`){let n={Filtre:`« dont »`,Tri:`« trier »`,Premier:`« premier de »`,Premiers:`« les … premiers de »`,Groupement:`« grouper »`}[e.type];return this.erreur(`${n} s'applique à une liste ; ${K(e.liste)} est ${V(t)}.`,e.ligne),B}let n=t.genre===`liste`?t.de:B,r=this.champsDesElements(n),i=t=>this.erreur(`« ${t} » n'est pas un champ des éléments de ${K(e.liste)}. Champs : ${r.map(e=>e.nom).join(`, `)}.${M(t,r.map(e=>e.nom))}`,e.ligne);switch(e.type){case`Groupement`:{if(H(n)&&!r.length)return this.erreur(`« grouper » range une liste de fiches ou de données du serveur par un de leurs champs ; ${K(e.liste)} est ${ra(t)}.`,e.ligne),B;let a=r.find(t=>t.nom===e.champ);return!a&&H(n)&&i(e.champ),{genre:`liste`,de:{genre:`fiche`,champs:[{nom:`nom`,type:a?.type??B},{nom:`elements`,type:t}]}}}case`Filtre`:{if(H(n)&&!r.length)return this.erreur(`« dont » filtre une liste de fiches ou de données du serveur ; ${K(e.liste)} est ${ra(t)}.`,e.ligne),t;let a=Ls(e.test).filter(e=>!r.some(t=>t.nom===e)&&!this.portees.chercher(e));if(a.length>0&&r.length>0)return i(a[0]),t;this.portees.ouvrir();for(let t of r)this.portees.declarerSymbole({nom:t.nom,ligne:e.ligne,type:t.type});return this.comparaison(e.test),this.portees.fermer(),this.resultat.filtres.set(e,r.map(e=>e.nom)),t}case`Tri`:{if(e.champ===void 0)return this.resultat.tris.set(e,n.genre===`texte`?`texte`:`nombre`),t;let a=r.find(t=>t.nom===e.champ);return a?(this.resultat.tris.set(e,a.type.genre===`texte`?`texte`:`nombre`),t):(H(n)&&i(e.champ),t)}case`Premier`:return n;case`Premiers`:{let n=this.typeDe(e.nombre);return H(n)&&n.genre!==`nombre`&&this.erreur(`« les … premiers de » attend un nombre.`,e.ligne),t}}}champsDesElements(e){if(e.genre===`fiche`)return e.champs;if(e.genre===`donnee`){let t=this.liens.donnees.get(e.nom);return t?[{nom:`id`,type:z},...t.champs.map(e=>({nom:e.nom,type:this.typeDeChamp(e.type)}))]:[]}return[]}sorteDuChamp(e){let t=this.elements.resoudre(e.nom,`champ`);return`ids`in t?this.elements.parId(t.ids[0])?.noeud.sorte:void 0}calcul(e){for(let t of[e.gauche,e.droite]){let n=this.typeDe(t);if(H(n)&&n.genre!==`nombre`){let r=n.genre===`texte`&&e.operateur===`+`?` Pour coller du texte, écrivez par exemple : "Total : {total}"`:``;this.erreur(`${K(t)} est ${V(n)} ; « ${e.operateur} » calcule avec des nombres.${r}`,e.ligne)}}return e.operateur===`/`&&e.droite.type===`Nombre`&&e.droite.valeur===0&&this.erreur(`division par zéro : le nombre après « / » ne peut pas être 0.`,e.ligne),ea}modificationListe(e,t){t===`vue`&&this.horsEvenement(e.operation,e.ligne);let n=this.typeDe(e.valeur),r=this.variable(e.liste,e.ligne);if(r?.origine?.type===`Variable`&&r.origine.fichierDonnees){this.erreur(`« ${e.liste} » vient d'un fichier : on peut la lire, pas la changer. Pour la modifier, copiez-la : variable mes_${e.liste} = ${e.liste}.`,e.ligne);return}if(!r||this.estCalcul(r,e.ligne))return;let i=r.type;if(H(i)&&i.genre!==`liste`){this.erreur(`« ${e.liste} » est ${V(i)} ; on ne peut ajouter ou retirer que dans une liste.`,e.ligne);return}if(i.genre===`liste`){if(!H(i.de))e.operation===`ajouter`&&H(n)&&(r.type=na(n),r.origine&&this.resultat.types.set(r.origine,r.type));else if(!ia(i.de,n)){let t=e.operation===`ajouter`?`y ajouter`:`en retirer`;this.erreur(`« ${e.liste} » est ${ra(i)} ; on ne peut pas ${t} ${V(n)}.`,e.ligne)}}}estCalcul(e,t){return e.origine?.type!==`Variable`||!e.origine.calcul?!1:e.origine.constante?(this.erreur(`« ${e.nom} » est une constante : sa valeur ne change pas (ligne ${e.ligne}). Écrivez « variable ${e.nom} = … » si elle doit changer.`,t),!0):(this.erreur(`« ${e.nom} » est un calcul : sa valeur se recalcule seule (ligne ${e.ligne}). Changez plutôt les variables dont il dépend.`,t),!0)}interpolations(e){for(let t of e.parties){if(t.type!==`variable`)continue;let n=zs(t.valeur);if(`erreur`in n){this.erreur(n.erreur,e.ligne);continue}n.chemin!==t.valeur&&this.resultat.chemins.set(t,n.chemin);let[r,...i]=n.chemin.split(`.`);if(!this.portees.chercher(r)){this.erreur(`le texte utilise {${t.valeur}}, mais la variable « ${r} » n'est pas déclarée.${M(r,this.portees.nomsVisibles())}`,e.ligne);continue}let a={type:`Reference`,nom:r,ligne:e.ligne};for(let t of i)a={type:`AccesChamp`,objet:a,champ:t,ligne:e.ligne};let o=i.length>0?this.typeDe(a):this.portees.chercher(r).type;if(`depuis`in n&&n.depuis){if(H(o)&&o.genre!==`texte`){this.erreur(`« ${n.chemin} » est ${V(o)} ; « depuis » s'écrit après une date.`,e.ligne);continue}this.resultat.formats.set(t,`depuis`);continue}if(n.devise||n.pluriel){if(H(o)&&o.genre!==`nombre`){let t=n.devise?`« en ${n.mot} »`:`« ${n.pluriel} »`;this.erreur(`« ${n.chemin} » est ${V(o)} ; ${t} s'écrit après un nombre.`,e.ligne);continue}n.devise&&this.resultat.formats.set(t,n.devise),n.pluriel&&this.resultat.pluriels.set(t,n.pluriel);continue}o.genre===`nombre`?this.resultat.formats.set(t,`nombre`):(i.length===1&&this.estChampDate(r,i[0])||i.length===0&&this.estUneDate(r))&&this.resultat.formats.set(t,`date`)}}estUneDate(e){let t=this.portees.chercher(e)?.origine,n=t?.type===`Variable`?t.valeur:void 0;return n?.type===`DateDuJour`||n?.type===`DateDecalee`}estChampDate(e,t){let n=this.portees.chercher(e)?.type;return n?.genre===`donnee`&&this.liens.donnees.get(n.nom)?.champs.find(e=>e.nom===t)?.type.genre===`date`}typeDeChamp(e){return e.genre===`liste`?na(this.typeDeChamp(e.de)):e.genre===`donnee`?{genre:`donnee`,nom:e.nom}:e.genre===`nombre`?ea:e.genre===`booleen`?ta:z}argumentsPage(e,t,n,r){let i=t.map(e=>this.typeDe(e.valeur)),a=Cs.get(e);if(a===void 0)return;let o=ws.get(e)??[];t.forEach((t,n)=>{let s=o.find(e=>e.nom===t.nom);if(s){let a=s.nombre?ea:z;!ia(a,i[n])&&t.valeur.type!==`Rien`&&this.erreur(`le filtre « ${s.nom} » de la page « ${e} » est ${V(a)} ; on ne peut pas lui donner ${V(i[n])}.`,r);return}a.includes(t.nom)||this.erreur(o.length>0?`« ${t.nom} » n'est ni un paramètre ni un filtre de la page « ${e} ». Paramètres : ${a.join(`, `)||`aucun`}. Filtres : ${o.map(e=>e.nom).join(`, `)}.`:`la page « ${e} » n'a pas de paramètre « ${t.nom} ». Paramètres : ${a.join(`, `)||`aucun`}.`,r)});let s=a.find(e=>!t.some(t=>t.nom===e));s!==void 0&&this.erreur(`la page « ${e} » attend le paramètre « ${s} » : écrivez ${n} "${e}" avec ${s} …`,r)}accesChamp(e){let t=this.typeDe(e.objet);if(e.champ===`apercu`&&e.objet.type===`Reference`){let t=this.fichiers.get(e.objet.nom);t&&!So(t.choix)&&this.erreur(`un fichier accepté « ${t.choix.accepte.join(` ou `)} » n'a pas d'aperçu : « apercu » existe pour des images, des sons et des vidéos.`,e.ligne)}return t.genre===`liste`&&(t.de.genre===`fiche`||t.de.genre===`donnee`)?(this.resultat.projections.add(e),na(this.champDe(t.de,e))):this.champDe(t,e)}champDe(e,t){if(e.genre===`donnee`&&t.champ===`id`)return z;if(e.genre===`donnee`){let n=this.liens.donnees.get(e.nom),r=n?.champs.find(e=>e.nom===t.champ);return n&&!r?(this.erreur(`le champ « ${t.champ} » n'existe pas dans la donnée « ${n.nom} ». Champs : ${n.champs.map(e=>e.nom).join(`, `)}.${M(t.champ,n.champs.map(e=>e.nom))}`,t.ligne),B):r?this.typeDeChamp(r.type):B}if(e.genre===`fiche`){let n=e.champs.find(e=>e.nom===t.champ);return n?n.type:(this.erreur(`le champ « ${t.champ} » n'existe pas dans ${e.fichier?`le fichier « ${e.fichier} »`:`cette fiche`}. ${e.fichier?`Colonnes`:`Champs`} : ${e.champs.map(e=>e.nom).join(`, `)}.${M(t.champ,e.champs.map(e=>e.nom))}`,t.ligne),B)}return H(e)&&this.erreur(`${K(t.objet)} est ${V(e)} ; on ne lit un champ (${Fs(t)}) que sur une donnée du serveur ou une fiche.`,t.ligne),B}requete(e){let t=e.donnees.map(e=>this.typeDe(e)),n=e.resultat===void 0?void 0:this.variable(e.resultat,e.ligne);if(e.resultat!==void 0&&(e.source===void 0?this.ciblesAutres:this.ciblesSources).add(e.resultat),e.source!==void 0||e.filtrant!==void 0){this.requeteSource(e,n);return}if(this.liens.routes.size===0)return;let r=this.routeDe(e);if(!r)return;let i=e.donnees[0];if(e.donnees.length===1&&i.type===`Reference`&&this.page.parametres.includes(i.nom)&&n){this.resultat.lecturesUn.add(e);let t={genre:`donnee`,nom:r.donnee.nom};H(n.type)||(n.type=t,n.origine&&this.resultat.types.set(n.origine,t)),this.avertirDroits(r,`lire`,e.ligne);return}let a=e.donnees.length>0;if(n&&!a){let e=na({genre:`donnee`,nom:r.donnee.nom});(!H(n.type)||n.type.genre===`liste`&&!H(n.type.de))&&(n.type=e,n.origine&&this.resultat.types.set(n.origine,e))}e.donnees.forEach((n,i)=>{let a=n.type===`Champ`?U(n.nom):n.type===`Reference`?n.nom:void 0;a!==void 0&&this.verifierChamp(r,a,n,t[i],e.ligne)}),this.avertirDroits(r,a?`creer`:`lire`,e.ligne)}ciblesSources=new Set;ciblesAutres=new Set;usagesEtat=[];verifierEtatsRequetes(){let e=new Set;for(let t of this.usagesEtat)e.add(t.nom),!this.ciblesSources.has(t.nom)&&this.resultat.diagnostics.push({gravite:`erreur`,ligne:t.ligne,message:this.ciblesAutres.has(t.nom)?`« ${t.mot} » ne marche pas encore pour « ${t.nom} » : l'état d'une requête n'existe que pour une requête vers une source (de la source "…").`:`« ${t.nom} » ne reçoit aucune requête vers une source : « ${t.mot} » n'a pas de sens. Ajoutez envoyer requete vers "…" de la source "…" dans ${t.nom}.`});this.resultat.etatsLus.set(this.page,e)}requeteSource(e,t){for(let t of e.filtrant??[])this.typeDe(t.valeur);let n=e.donnees.length===1&&e.donnees[0].type===`Reference`&&this.page.parametres.includes(e.donnees[0].nom)&&t!==void 0,r=mo(e,this.liens.sources,n,(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}));r?.regle&&this.resultat.reglesSources.set(e,r.regle);let i=r?.type;!i||!t||(n&&this.resultat.lecturesUn.add(e),(!H(t.type)||t.type.genre===`liste`&&!H(t.type.de))&&(t.type=i,t.origine&&this.resultat.types.set(t.origine,i)))}operationServeur(e){let t=e.type===`Suppression`?`supprimer`:`modifier`,n=this.typeDe(e.objet),r=e.type===`Modification`?e.changements.map(e=>this.typeDe(e.valeur)):[];if(e.source!==void 0){let t=ho(e,this.liens.sources,n,(e,t)=>this.resultat.diagnostics.push({gravite:`erreur`,message:e,ligne:t}));t&&this.resultat.reglesOperations.set(e,t);return}if(this.liens.routes.size===0){this.erreur(`« ${t} » demande un serveur dans le même fichier : ajoutez un bloc serveur "…" : avec la route « ${ss(e.adresse)} ».`,e.ligne);return}let i=this.routeDe(e);if(i){if(H(n)&&(n.genre!==`donnee`||n.nom!==i.donnee.nom)){let r=t===`supprimer`?`supprimer … de "${i.adresse}"`:`modifier … dans "${i.adresse}"`;this.erreur(`${K(e.objet)} est ${V(n)} : « ${r} » attend un « ${i.donnee.nom} » lu sur cette route (par exemple la variable d’une boucle « pour chaque p dans ${i.adresse} »).`,e.ligne)}e.type===`Modification`&&e.changements.forEach((t,n)=>this.verifierChamp(i,U(t.champ),t.valeur,r[n],e.ligne)),this.avertirDroits(i,t,e.ligne)}}routeDe(e){let t=this.liens.routes.get(ss(e.adresse));if(!t){this.erreur(`aucune route « ${ss(e.adresse)} » dans le serveur « ${this.liens.serveur} ». Routes : ${[...this.liens.routes.values()].map(e=>e.adresse).join(`, `)}.`,e.ligne);return}return this.resultat.adressesRequetes.set(e,`/api/${ss(t.adresse)}`),t}verifierChamp(e,t,n,r,i){let a=e.donnee.champs.find(e=>e.nom===t);a?ia(this.typeDeChamp(a.type),r)||this.erreur(`${K(n)} est ${V(r)} ; le champ « ${a.nom} » de « ${e.donnee.nom} » attend ${V(this.typeDeChamp(a.type))}.`,i):this.erreur(`la donnée « ${e.donnee.nom} » n'a pas de champ « ${t} ». Champs : ${e.donnee.champs.map(e=>e.nom).join(`, `)}.${M(t,e.donnee.champs.map(e=>e.nom))}`,i)}avertirDroits(e,t,n){let r=t===`creer`?`créer`:t,i=e.droits[t];(i!==`connecte`||this.garde===void 0)&&(i!==`admin`||this.garde!==`admin`)&&(i===`connecte`?this.avertissement(`il faut être connecté pour ${r} « ${e.donnee.nom} » : cette requête sera refusée à un visiteur.`,n):i===`admin`&&this.avertissement(`seul un admin peut ${r} « ${e.donnee.nom} » : cette requête sera refusée à un visiteur.`,n))}declarer(e,t,n,r){if(U(e)===`utilisateur`&&(this.ligneNomUtilisateur??=t),Ts.size>0&&U(e)===`langue`){this.erreur(`« langue » est la langue choisie par la personne (« si langue est anglais », « changer langue par anglais ») : donnez un autre nom à cette variable.`,t);return}let i=this.portees.declarer({nom:e,ligne:t,type:n,origine:r});i&&this.erreur(`la variable « ${e} » existe déjà (ligne ${i.ligne}). Pour changer sa valeur, écrivez : changer ${e} par …`,t)}valeurDeLangue(e){if(Ts.size===0||this.portees.chercher(e))return;let t=U(e);return t===`langue`?`langue`:Ts.get(t)}variable(e,t){let n=this.portees.chercher(e);if(n)return n;let r=this.declareesPlusLoin.get(e),i=this.boucleFermee.get(e);r!==void 0&&r>t?this.erreur(`la variable « ${e} » est utilisée avant d'être déclarée (ligne ${r}).`,t):i===void 0?Ts.size===0&&(U(e)===`langue`||kn(e)?.disponible)?this.erreur(`« ${e} » ${U(e)===`langue`?`est la langue choisie par la personne`:`est une langue`} : déclarez d'abord les langues en haut du fichier, avec « langues : » puis « francais » et « anglais » sur deux lignes décalées.`,t):this.erreur(`la variable « ${e} » n'est pas déclarée. Déclarez-la avec : variable ${e} = …${M(e,this.portees.nomsVisibles())}${this.elementEnCours?` Si c'est un texte, mettez-le entre guillemets : ${this.elementEnCours} "${e}"`:``}`,t):this.erreur(`« ${e} » n'existe que dans la boucle de la ligne ${i}.`,t)}cible(e,t,n){let r=this.elements.resoudre(t,void 0,n),i=e.type===`Action`&&(e.action===`montrer`||e.action===`cacher`)?this.elements.formulaires.find(e=>e.nom===t):void 0,a=e.type===`Action`?this.fenetreVisee(e,t):void 0;if(a!==void 0)this.resultat.cibles.set(e,[a]);else if(`ids`in r)this.resultat.cibles.set(e,r.ids);else if(i)this.resultat.cibles.set(e,[i.id]);else if(r.erreur===`inconnu`)this.erreur(`aucun élément « ${t} » dans la page « ${this.page.nom} ».${M(t,(n??this.elements.elements).flatMap(e=>[e.nom,e.libelle].filter(e=>e!==void 0)))}`,e.ligne);else{let[n,i]=r.lignes;this.erreur(`deux éléments s'appellent « ${t} » (lignes ${n} et ${i}). Donnez un nom à l'un d'eux : avec nom "…"`,e.ligne)}}pageCible(e,t){let n=ps(e);if(n.refus){this.erreur(n.refus,t);return}n.externe||n.page===void 0||n.page===``||this.nomsPages.has(n.page)||this.avertissement(`la page « ${n.page} » n'existe pas dans ce fichier.${M(n.page,this.nomsPages)}`,t)}horsEvenement(e,t,n=``){this.erreur(`« ${e} » ne s'utilise que dans un événement (quand …).${n}`,t)}};function Ns(e,t){return e.nom===t||e.libelle===t}function Ps(e){if(e.type===`Chaine`&&!e.parties.some(e=>e.type===`variable`))return e.parties.map(e=>e.valeur).join(``)}function Fs(e){return e.type===`Reference`?e.nom:e.type===`AccesChamp`?`${Fs(e.objet)}.${e.champ}`:`…`}function K(e){return e.type===`Reference`||e.type===`AccesChamp`?`« ${Fs(e)} »`:e.type===`Champ`?`le champ « ${e.nom} »`:`cette valeur`}function Is(e){switch(e.type){case`Action`:return e.action===`afficher`?`afficher`:As[e.action];case`Requete`:return`envoyer requete`;case`Connexion`:return`se connecter`;case`Deconnexion`:return`se deconnecter`;case`Suppression`:return`supprimer`;case`Modification`:return`modifier`;case`Minuterie`:return e.mode===`apres`?`apres …`:`toutes les …`;case`Copier`:return`copier`;case`Partager`:return`partager`;case`Confirmer`:return`confirmer`;default:return}}function Ls(e){if(e.type===`Combinaison`)return[...Ls(e.gauche),...Ls(e.droite)];let t=[],n=e=>{e&&(e.type===`Reference`?t.push(e.nom):e.type===`AccesChamp`?n(e.objet):e.type===`Calcul`?(n(e.gauche),n(e.droite)):e.type===`Compte`&&n(e.liste))};return n(e.gauche),n(e.droite),t}function Rs(e,t=new Set){for(let n of e)if(n.type===`Affectation`)t.add(n.nom);else if(n.type===`ModificationListe`)t.add(n.liste);else if(n.type===`Requete`&&n.resultat!==void 0)t.add(n.resultat);else if(n.type===`EnvoiFichier`)n.suivi!==void 0&&t.add(n.suivi),n.resultat!==void 0&&t.add(n.resultat);else if(n.type===`Condition`)Rs(n.alors,t),Rs(n.sinon,t);else if(n.type===`Boucle`||n.type===`TantQue`||n.type===`Repeter`)Rs(n.corps,t);else if(n.type===`Selon`){for(let e of n.cas)Rs(e.corps,t);Rs(n.sinon,t)}return t}function zs(e){let t=/^(\S+)\s+depuis$/u.exec(e);if(t)return{chemin:t[1],depuis:!0};let n=/^(\S+)\s+en\s+(\S+)$/u.exec(e);if(n){let e={ko:`Ko`,mo:`Mo`}[n[2].toLowerCase()];if(e)return{chemin:n[1],devise:e,mot:n[2]};let t=Mo[n[2].normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase()];return t?{chemin:n[1],devise:t,mot:n[2]}:{erreur:`« ${n[2]} » n'est pas une devise connue. Devises : FC, euros, dollars (et Ko, Mo pour une taille).${M(n[2],[...Object.keys(Mo),`Ko`,`Mo`])}`}}let r=/^(\S+)\s+(\p{L}[\p{L}'-]*)$/u.exec(e);return r?{chemin:r[1],pluriel:r[2]}:{chemin:e}}function Bs(e,t,n){let r=new Set,i=[],a=e.replace(/\/\*[\s\S]*?\*\//g,e=>e.replace(/[^\n]/g,` `));for(let e of a.matchAll(/([^{}]+)\{([^{}]*)\}/g)){let o=e[1];if(o.trimStart().startsWith(`@`))continue;let s=[...o.matchAll(/\.(-?[_a-zA-Z][\w-]*)/g)].map(e=>e[1]);for(let e of s)r.add(e);let c=s.filter(e=>e.startsWith(`humalis-`));if(c.length!==0)for(let r of e[2].matchAll(/(?:^|;)\s*([\w-]+)\s*:\s*([^;]*!\s*important)\s*(?=;|$)/gi)){let s=t+(a.slice(0,e.index+o.length+1+(r.index??0)).match(/\n/g)?.length??0);for(let e of c)i.push({gravite:`avertissement`,ligne:s,...n?{fichier:n}:{},message:`le CSS écrase « ${e} » avec !important (${r[1]}) : les réglages Humalis de cet élément (remplissage, largeur…) ne s'appliqueront plus. Retirez !important, ou visez votre propre classe avec « avec style ».`})}}return{classes:r,diagnostics:i}}function Vs(e){return`humalis-base64:`+e}const Hs=new Set([`description`,`decoratif`,`prioritaire`,`proportions`]),Us=(e,t)=>e.find(e=>A(e.propriete)===t);function Ws(e){return e.type===`Chaine`&&e.parties.every(e=>e.type===`texte`)?e.parties.map(e=>e.valeur).join(``):void 0}const Gs=e=>!/^([a-z][a-z0-9+.-]*:|\/)/i.test(e.trim());function Ks(e,t){let n=Us(e.styles,`description`),r=Us(e.styles,`proportions`),i=Ws(e.contenu),a={};if(n&&!Us(e.styles,`decoratif`)&&(a.description=t(n.texte??{type:`Chaine`,parties:n.parties??[{type:`texte`,valeur:n.valeur}],ligne:e.ligne})),i!==void 0&&Gs(i)&&(a.locale=i),r){let[e,t]=r.valeur.split(`:`).map(Number);a.proportions=[e,t]}return Us(e.styles,`prioritaire`)&&(a.prioritaire=!0),a}function qs(e){let t=e.replace(/\\/g,`/`).replace(/^(\.\/)+/,``);return t.split(`/`).some(e=>e===`..`||e===``)?t.split(`/`).pop():t}function Js(e,t,n=`image`){let r=new Map;for(let[i,a]of e??[])a.contenu!==void 0&&(a.genre??`image`)===n&&r.set(`${t}${qs(i)}`,Vs(a.contenu));return r}function Ys(e){return{variable:e.variable,familles:xo(e).map(e=>({nom:e,mime:go[e].mime})),...e.octets===void 0?{}:{octets:e.octets},plusieurs:e.plusieurs===!0,apercu:So(e)}}const Xs={courbe:`Graphique en courbe`,barres:`Graphique en barres`,camembert:`Graphique en camembert`},Zs=e=>e.charAt(0).toUpperCase()+e.slice(1).replace(/_/g,` `);function Qs(e,t,n,r,i){let a=e=>{if(e===void 0)return{};let t=yt(`couleur`,e,r);return`erreur`in t?{}:{couleur:t.valeur}},o=e.series.length>0?e.series.map(e=>{let t=i?.serie(e.texteNom??{type:`Chaine`,parties:[{type:`texte`,valeur:e.nom}],ligne:e.ligne});return{nom:e.nom,...t?{nomLangues:t}:{},...e.valeur?{valeur:e.valeur.champ}:{},...a(e.couleur)}}):[{nom:e.valeur?Zs(e.valeur.champ):`Valeur`,...e.valeur?{}:i?.message(`Valeur`)?{nomLangues:i.message(`Valeur`)}:{},...e.valeur?{valeur:e.valeur.champ}:{},...a(e.couleur)}],s=e.valeur?.devise??e.series.find(e=>e.valeur?.devise)?.valeur?.devise,c=s===void 0?void 0:Mo[A(s)];return{type:`graphique`,id:t,genre:e.genre,liste:n(e.liste),...e.etiquette===void 0?{}:{etiquette:e.etiquette},...e.etiquettes?{etiquettes:n(e.etiquettes)}:{},nomEtiquettes:e.etiquette===void 0?`Libellé`:Zs(e.etiquette),...e.etiquette===void 0&&i?.message(`Libellé`)?{nomEtiquettesLangues:i.message(`Libellé`)}:{},series:o,...c?{devise:c}:{},titre:Xs[e.genre],...i?.message(Xs[e.genre])?{titreLangues:i.message(Xs[e.genre])}:{},description:n(e.description??{type:`Chaine`,parties:[],ligne:e.ligne}),...e.proportions?{proportions:e.proportions}:{},classes:e.classes,ligne:e.ligne}}const $s=[{fr:`Réessayer`,en:`Try again`},{fr:`Le serveur n'a pas répondu. Réessayez dans un instant.`,en:`The server did not answer. Try again in a moment.`},{fr:`Email ou mot de passe incorrect.`,en:`Incorrect email or password.`},{fr:`Trop de tentatives de connexion. Réessayez dans quelques minutes.`,en:`Too many sign-in attempts. Try again in a few minutes.`},{fr:`Trop de demandes en peu de temps. Patientez un moment, puis réessayez.`,en:`Too many requests in a short time. Wait a moment, then try again.`},{fr:`Ce que vous cherchez n'existe pas.`,en:`What you are looking for does not exist.`},{fr:`Connectez-vous pour continuer.`,en:`Sign in to continue.`},{fr:`Page introuvable`,en:`Page not found`},{fr:`Cette page n'existe pas.`,en:`This page does not exist.`},{fr:`Revenir à l'accueil`,en:`Back to the home page`},{fr:`Précédent`,en:`Previous`},{fr:`Suivant`,en:`Next`},{fr:`Chargement`,en:`Loading`},{fr:`Diminuer`,en:`Decrease`},{fr:`Augmenter`,en:`Increase`},{fr:`Quantité`,en:`Quantity`},{fr:`Code QR`,en:`QR code`},{fr:`Fil d'Ariane`,en:`Breadcrumb`},{fr:`Choisissez…`,en:`Choose…`},{fr:`Vérification…`,en:`Checking…`},{fr:"Note : ${nombre} sur ${maximum}",en:"Rating: ${nombre} out of ${maximum}"},{fr:"Note : ${valeur} sur ${maximum}",en:"Rating: ${valeur} out of ${maximum}"},{fr:"${i + 1} sur ${maximum}",en:"${i + 1} out of ${maximum}"},{fr:"Diapositive ${i + 1} sur ${pages}",en:"Slide ${i + 1} of ${pages}"},{fr:"Diapositive ${i + 1} sur ${total}",en:"Slide ${i + 1} of ${total}"},{fr:`Agrandir`,en:`Zoom in`},{fr:`Réduire`,en:`Zoom out`},{fr:`Ouvrir dans OpenStreetMap`,en:`Open in OpenStreetMap`},{fr:"Ouvrir dans OpenStreetMap : ${lieu.nom}",en:"Open in OpenStreetMap: ${lieu.nom}"},{fr:"Les lieux de la carte : ${nom}",en:"Places on the map: ${nom}"},{fr:`Graphique en courbe`,en:`Line chart`},{fr:`Graphique en barres`,en:`Bar chart`},{fr:`Graphique en camembert`,en:`Pie chart`},{fr:`Valeur`,en:`Value`},{fr:`Libellé`,en:`Label`},{fr:`Voir les données`,en:`View the data`},{fr:`Cacher les données`,en:`Hide the data`},{fr:`Les données du graphique`,en:`The chart data`},{fr:`Aucune donnée à afficher.`,en:`No data to display.`},{fr:`Lire la transcription`,en:`Read the transcript`,page:!0},{fr:`Lecture`,en:`Play`},{fr:`Ce fichier`,en:`This file`},{fr:"${sujet} est trop gros : ${ecrireTaille(fichier.size)}, le maximum est ${ecrireTaille(maximum)}.",en:"${sujet} is too large: ${ecrireTaille(fichier.size)}, the maximum is ${ecrireTaille(maximum)}."},{fr:"${sujet} n'est pas ${familles.map((f) => REFUS_DE_TYPE[f.nom]).join(' ni ')}.",en:"${sujet} is not ${familles.map((f) => REFUS_DE_TYPE[f.nom]).join(' or ')}."},{fr:`une image`,en:`an image`},{fr:`un son`,en:`a sound`},{fr:`une vidéo`,en:`a video`},{fr:`un PDF`,en:`a PDF`},{fr:`un document`,en:`a document`},{fr:` Mo`,en:` MB`},{fr:` Ko`,en:` KB`},{fr:` octets`,en:` bytes`},{fr:`Ce fichier est trop gros pour le serveur.`,en:`This file is too large for the server.`},{fr:`Choisissez d'abord un fichier.`,en:`Choose a file first.`},{fr:`AAAA-MM-JJ`,en:`YYYY-MM-DD`},{fr:`Fermer le message`,en:`Close the message`},{fr:`Aller au contenu`,en:`Skip to content`},{fr:`Fermer`,en:`Close`},{fr:`Copié`,en:`Copied`},{fr:`Copier`,en:`Copy`},{fr:`Copie impossible.`,en:`Could not copy.`},{fr:`Lien copié : il ne reste qu’à le coller.`,en:`Link copied: paste it wherever you like.`},{fr:`Texte copié : il ne reste qu’à le coller.`,en:`Text copied: paste it wherever you like.`},{fr:`Partage impossible.`,en:`Could not share.`},{fr:`Oui`,en:`Yes`},{fr:`Non`,en:`No`},{fr:`Voir plus`,en:`See more`},{fr:`Monter`,en:`Move up`},{fr:`Descendre`,en:`Move down`},{fr:`élément déplaçable`,en:`movable item`},{fr:`Annulé.`,en:`Cancelled.`},{fr:"position ${i + 1} sur ${dernier.current.liste.length}",en:"position ${i + 1} of ${dernier.current.liste.length}"},{fr:"Pris : ${nommer(actuelle[index])}, ${position(index)}. Flèches pour déplacer, Espace pour déposer, Échap pour annuler.",en:"Picked up: ${nommer(actuelle[index])}, ${position(index)}. Arrows to move, Space to drop, Escape to cancel."},{fr:"Déposé : ${nommer(actuelle[index])}, ${position(index)}.",en:"Dropped: ${nommer(actuelle[index])}, ${position(index)}."},{fr:"Déplacé en ${position(vers)}.",en:"Moved to ${position(vers)}."},{fr:"Déplacé en position ${vers + 1} sur ${copie.length}.",en:"Moved to position ${vers + 1} of ${copie.length}."},{fr:"${nommer(liste[index])}, position ${index + 1} sur ${liste.length}",en:"${nommer(liste[index])}, position ${index + 1} of ${liste.length}"}];function ec(e,t){let n=$s.find(t=>t.fr===e);return n&&t.length>1?t.map(e=>({code:e,texte:n[e===`en`?`en`:`fr`]})):void 0}const tc={cocher:{fr:e=>`Cochez « ${e} » pour continuer.`,en:e=>`Check “${e}” to continue.`},choisir:{fr:e=>`Choisissez une valeur pour « ${e} ».`,en:e=>`Choose a value for “${e}”.`},obligatoire:{fr:e=>`Le champ « ${e} » est obligatoire.`,en:e=>`The field “${e}” is required.`},email:{fr:e=>`« ${e} » n’a pas la forme d’une adresse email (par exemple nom@exemple.cd).`,en:e=>`“${e}” does not look like an email address (for example name@example.com).`},date:{fr:e=>`« ${e} » doit être une date écrite AAAA-MM-JJ (par exemple 2026-01-31).`,en:e=>`“${e}” must be a date written YYYY-MM-DD (for example 2026-01-31).`},heure:{fr:e=>`« ${e} » doit être une heure écrite HH:MM (par exemple 14:30).`,en:e=>`“${e}” must be a time written HH:MM (for example 14:30).`},adresseWeb:{fr:e=>`« ${e} » doit être une adresse web complète, qui commence par https://.`,en:e=>`“${e}” must be a full web address, starting with https://.`},nombre:{fr:e=>`« ${e} » doit être un nombre.`,en:e=>`“${e}” must be a number.`},auMoins:{fr:(e,t=0)=>`« ${e} » doit être au moins ${t}.`,en:(e,t=0)=>`“${e}” must be at least ${t}.`},auPlus:{fr:(e,t=0)=>`« ${e} » doit être au plus ${t}.`,en:(e,t=0)=>`“${e}” must be at most ${t}.`}};function nc(e,t,n){let r=t?.sorte??`texte`,i=`${e}.trim() !== ''`,a=(e,t)=>n.map(({code:n,libelle:r})=>({code:n,texte:tc[e][n===`en`?`en`:`fr`](r,t)})),o=[];t?.obligatoire&&(r===`case`?o.push([`!${e}`,a(`cocher`)]):r===`choix`||r===`liste`?o.push([`${e} === ''`,a(`choisir`)]):o.push([`${e}.trim() === ''`,a(`obligatoire`)]));let s=(t,n)=>o.push([`${i} && !${t}.test(${e}.trim())`,a(n)]);switch(r){case`email`:s(`/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/`,`email`);break;case`date`:s(`/^\\d{4}-\\d{2}-\\d{2}$/`,`date`);break;case`heure`:s(`/^\\d{2}:\\d{2}$/`,`heure`);break;case`adresseWeb`:s(`/^https?:\\/\\/\\S+$/`,`adresseWeb`);break;case`nombre`:{let n=`Number(${e}.replace(',', '.'))`;o.push([`${i} && Number.isNaN(${n})`,a(`nombre`)]),t?.minimum!==void 0&&o.push([`${i} && ${n} < ${t.minimum}`,a(`auMoins`,t.minimum)]),t?.maximum!==void 0&&o.push([`${i} && ${n} > ${t.maximum}`,a(`auPlus`,t.maximum)]);break}}return o}function rc(e){let t=new Map;if(e.type!==`texte`)return t;for(let n of e.versions??[])n.parties.every(e=>`texte`in e)&&t.set(n.code,n.parties.map(e=>`texte`in e?e.texte:``).join(``));return t}const ic=e=>`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`)}'`;function ac(e,t){return e.length===1?t(e[0].texte):`t({ ${e.map(e=>`${e.code}: ${ic(e.texte)}`).join(`, `)} })`}function oc(e,t,n){let r=e=>n?`\`${e}\``:ic(e);return`t({ ${t.map(t=>`${t}: ${r(e[t===`en`?`en`:`fr`])}`).join(`, `)} })`}const sc=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);function cc(e,t,n){let r=[],i=e=>`\u0000${r.push(e)-1}\u0000`,a=e;for(let e of $s){let r=e.fr.includes("${"),o=i(oc(e,t,r));if(r){n.partout&&(a=a.split(`\`${e.fr}\``).join(o));continue}let s=ic(e.fr),c=JSON.stringify(e.fr);a=a.replace(RegExp(`=${sc(c)}(?=[\\s/>])`,`g`),`={${o}}`),a=a.split(`'aria-label': ${s}`).join(`'aria-label': ${o}`),e.page&&!n.partout&&(a=a.split(`<summary>${e.fr}</summary>`).join(`<summary>{${o}}</summary>`),a=a.replace(RegExp(`(creer\\('summary', \\{\\s*\\},\\s*)${sc(s)}`,`g`),(e,t)=>`${t}${o}`)),n.partout&&(a=a.replace(RegExp(`>${sc(e.fr)}<`,`g`),`>{${o}}<`).replace(RegExp(`^(\\s+)${sc(e.fr)}$`,`gm`),`$1{${o}}`).split(s).join(o).split(c).join(o))}if(a=a.replace(/\u0000(\d+)\u0000/g,(e,t)=>r[Number(t)]),a===e||n.importer===void 0||/\bconst \{[^}]*\bt\b[^}]*\} = useLangue\(\)/.test(a)||/import \{[^}]*\bt\b[^}]*\} from '[^']*langue'/.test(a))return a;let o=`import { t } from '${n.importer}';\n`,s=[...a.matchAll(/^import [^\n]*\n/gm)],c=s.length>0?s[s.length-1].index+s[s.length-1][0].length:0;return a.slice(0,c)+o+a.slice(c)}function lc(e,t){for(let[n,r]of e){if(!n.endsWith(`.js`)||n===`humalis/qrcode.js`)continue;let i=n===`humalis/humalis.js`||n===`pages/introuvable-humalis.js`,a=cc(n===`humalis/graphique.js`?fc(r,t):r,t,{partout:i});a!==r&&n!==`humalis/humalis.js`&&(a=a.replace(/const \{ ([^}]*) \} = humalis;/g,(e,t)=>/\bt\b/.test(t)?e:`const { ${t}, t } = humalis;`)),e.set(n,a)}}function uc(e){let t=$s.find(t=>t.fr===e);if(!t)throw Error(`message intégré inconnu : ${e}`);return t}function dc(e){return e.replace(/^(\s*)\/\*\* Le nombre d'une ligne/m,`$1/** La région des nombres de la figure en cours de calcul (« fr-FR » ou « en-US »). */
|
|
667
677
|
$1let REGION_GRAPHIQUE = 'fr-FR';
|
|
668
678
|
|
|
669
679
|
$1/** Le nombre d'une ligne`).split(`toLocaleString('fr-FR'`).join(`toLocaleString(REGION_GRAPHIQUE`).replace(`config.nomEtiquettes || 'Libellé'`,`config.nomEtiquettes || ''`).replace(/^(\s*)function calculerGraphique\(config, lignes, formater, largeur\) \{\n/m,`$&$1 REGION_GRAPHIQUE = config.langue === 'en' ? 'en-US' : 'fr-FR';
|
|
670
|
-
`)}function dc(e,t){let n=uc(e).replace(`devise ? (valeur) => humalis.formaterArgent(valeur, devise) : humalis.formaterNombre;`,`devise ? (valeur) => humalis.formaterArgent(valeur, devise, humalis.langue()) : (valeur) => humalis.formaterNombre(valeur, humalis.langue());`).replace(`htmlDuGraphique(config, donnees, formateur(config.devise))`,`htmlDuGraphique({ ...config, langue: humalis.langue() }, donnees, formateur(config.devise))`);for(let e of[`Voir les données`,`Les données du graphique`,`Aucune donnée à afficher.`])n=n.split(`>${e}<`).join(`>' + humalis.${ac(lc(e),t,!1)} + '<`);return n}function fc(e){if(e===void 0)return{};let t=ps(e);return t.externe?{externe:e.trim()}:{...t.page!==void 0&&t.page!==``?{cible:t.page}:{},...t.ancre===void 0?{}:{versAncre:t.ancre}}}const pc={clic:`clic`,survol:`survol`,chargement:`chargement`,soumission:`soumission`,touche:`touche`,saisie:`saisie`,pauseSaisie:`pauseSaisie`,bas:`bas`,ordre:`ordre`},mc=e=>{let t=Ca(e);return`touches`in t?t.touches:e};function hc(e,t){return{ecrans:e.pages.map(e=>new wc(e,t).ecran()),css:e.styles.map(e=>e.css),fichiersStyle:e.fichiersStyle.map(e=>({chemin:e.chemin,ligne:e.ligne})),partages:e.partages.map(e=>xc(e,t)),serveurs:e.serveurs.map(yc),sources:e.sources.map(gc),...e.theme?{theme:vc(e.theme)}:{},...t.langues.langues.length>1?{langues:t.langues.langues.map(e=>({code:e.code,nom:e.nomPropre}))}:{},...e.site?{site:{...e.site.nom===void 0?{}:{nom:e.site.nom},...e.site.textes?.nom&&Dc(e.site.textes.nom,t)?{nomLangues:Dc(e.site.textes.nom,t)}:{},...e.site.description===void 0?{}:{description:e.site.description},...e.site.textes?.description&&Dc(e.site.textes.description,t)?{descriptionLangues:Dc(e.site.textes.description,t)}:{},...e.site.image===void 0?{}:{image:e.site.image},...e.site.logo===void 0?{}:{logo:e.site.logo},...e.site.adresse===void 0?{}:{adresse:e.site.adresse},indexation:e.site.indexation,ligne:e.site.ligne}}:{},...e.entete||e.pied?{disposition:{...e.entete?{entete:_c(e.entete,t)}:{},...e.pied?{pied:_c(e.pied,t)}:{}}}:{},composantsReact:e.composantsReact.map(e=>({nom:e.nom,chemin:e.chemin,ligne:e.ligne})),fonctions:[...t.fonctions.values()].map(({definition:e,retour:n,appels:r})=>({nom:e.nom,parametres:e.parametres.map((e,t)=>({nom:e.nom,type:bc(r.map(e=>e[t]))})),retour:n,corps:new wc({type:`Page`,nom:`fonction ${e.nom}`,parametres:[],corps:[],ligne:e.ligne},t).actionsDe(e.corps),ligne:e.ligne})),composants:e.composants.map(e=>({...new wc(t.pagesComposants.get(e),t).ecran(),parametres:e.parametres.map(n=>({nom:n.nom,type:bc(t.typesParametres.get(`${e.nom}.${n.nom}`)??[])}))}))}}function gc(e){return{nom:e.nom,adresse:e.adresse??``,session:e.session,enveloppe:e.enveloppe??(e.session?`data`:void 0),erreurDans:e.erreurDans??(e.session?`message`:void 0),entetes:e.entetes.map(e=>({nom:e.nom,valeur:e.valeur})),jetonPublic:e.jeton?.genre===`public`?{valeur:e.jeton.valeur,place:e.jeton.place}:void 0,cache:e.cache,essais:e.essais,delai:e.delai,donnees:e.donnees.map(e=>({nom:e.cle??e.nom,champs:e.champs.map(e=>({nom:e.nom,type:e.type}))}))}}function _c(e,t){return{ecran:{...new wc(t.pagesDispositions.get(e),t).ecran(),parametres:[]},options:e.styles.map(e=>{let n=yt(e.propriete,e.valeur,t.couleursTheme);return`erreur`in n?{nom:e.propriete,valeur:e.valeur}:{nom:n.propriete,valeur:n.valeur}}),classes:e.classes}}function vc(e){return{couleurs:e.couleurs.map(e=>{let t=e.sombre??e.clair;return{nom:e.nom,clair:e.clair,sombre:t,encreClair:Qn(e.clair),encreSombre:Qn(t)}}),polices:e.polices.map(e=>({role:e.role,nom:e.nom,...e.fichier?{fichier:e.fichier}:{}})),mode:e.mode?.valeur??`automatique`,largeur:e.largeur?.valeur??`normale`}}function yc(e){return{nom:e.nom,donnees:e.donnees.map(e=>({nom:e.nom,champs:e.champs.map(e=>({nom:e.nom,type:e.type}))})),routes:e.routes.filter(e=>e.regles.length>0).map(e=>{let t=os(e);return{adresse:e.adresse,donnee:e.regles[0].donnee,droits:t,ligne:e.ligne}})}}function bc(e){let t=e.filter(e=>e.genre!==`inconnu`);if(t.length===0)return B;let n=JSON.stringify(t[0]);return t.every(e=>JSON.stringify(e)===n)?t[0]:B}function xc(e,t){let n={nom:e.nom,type:t.types.get(e)??B,initiale:Tc(e.valeur,t),ligne:e.ligne};return e.options?.memorisee&&(n.memorisee=!0),e.options?.secret&&(n.secret=!0),t.facultatives.has(e)&&(n.facultatif=!0),e.fichierDonnees&&(n.lectureSeule=!0),n}const Sc=new Set([`icone`,`badge`,`avatar`,`progression`,`chargement`,`etoiles`,`compteur`,`qr`,`fichier`,`audio`,`selecteurLangue`]),Cc=new Set([`icone`,`description`,`decoratif`,`photo`,`modifiable`,`ouvert`,`plusieurs`,`pourcentage`,`automatique`,`visibles`,`transcription`,`boucle`]);var wc=class{page;analyse;caches=[];constructor(e,t){this.page=e,this.analyse=t}ecran(){let e=[],t=[],n=[],r=[];for(let i of this.page.corps)i.type===`Variable`&&i.calcul?t.push({nom:i.nom,type:this.analyse.types.get(i)??B,valeur:this.valeur(i.valeur),...this.analyse.facultatives.has(i)?{facultatif:!0}:{}}):i.type===`Variable`?e.push({...xc(i,this.analyse),initiale:this.valeur(i.valeur)}):i.type===`Evenement`?r.push(this.gestionnaire(i)):i.type===`Minuterie`?r.push({declencheur:`minuterie`,cibles:[],actions:this.actions([i]),ligne:i.ligne}):n.push(...this.vue([i],r));return{nom:this.page.nom,etat:[...e,...this.caches],calculs:t,vue:n,gestionnaires:r,...this.page.parametres.length>0?{parametresAdresse:this.page.parametres}:{},...this.page.adresse===void 0?{}:{adresse:this.page.adresse},...this.page.parent===void 0?{}:{parent:this.page.parent},...this.page.filtres?.length?{filtres:this.page.filtres.map(e=>({nom:e.nom,...e.nombre?{nombre:!0}:{}}))}:{},...this.page.reservee?{reservee:{qui:this.page.reservee.qui,sinon:this.page.reservee.sinon??`connexion`}}:{},...this.analyse.etatsLus.get(this.page)?.size?{etatsRequetes:[...this.analyse.etatsLus.get(this.page)]}:{},...this.page.sansEntete?{sansEntete:!0}:{},...this.page.sansPied?{sansPied:!0}:{},...this.page.apercu?{apercu:{...this.page.apercu.titre?{titre:this.valeur(this.page.apercu.titre)}:{},...this.page.apercu.description?{description:this.valeur(this.page.apercu.description)}:{},...this.page.apercu.image?{image:this.valeur(this.page.apercu.image)}:{},indexation:this.page.apercu.indexation}}:{},ligne:this.page.ligne}}gestionnaire(e){return{declencheur:pc[e.genre],cibles:this.analyse.cibles.get(e)??[],actions:this.actions(e.corps),...e.touches===void 0?{}:{touches:mc(e.touches)},...e.genre===`pauseSaisie`?{millisecondes:e.duree?Ec(e.duree):300}:{},...e.tantQue?{tantQue:this.test(e.tantQue)}:{},...e.genre===`bas`?{bouton:e.bouton===void 0?`Voir plus`:e.bouton}:{},...e.variable===void 0?{}:{variable:e.variable},ligne:e.ligne}}vue(e,t){let n=[];for(let r of e)switch(r.type){case`Element`:n.push(r.element===`marqueur`?this.marqueur(r):this.element(r));break;case`Graphique`:n.push(Zs(r,`graphique-${jc(r.ligne)}`,e=>this.valeur(e),this.analyse.couleursTheme,{serie:e=>this.enLangues(e),message:e=>$s(e,this.analyse.langues.langues.map(e=>e.code))}));break;case`Action`:r.action===`afficher`&&n.push({type:`element`,id:`texte_ligne_${jc(r.ligne)}`,genre:`texte`,contenu:this.valeur(r.arguments[0]),options:[],classes:[],ligne:r.ligne});break;case`Condition`:n.push({type:`condition`,test:this.test(r.test),alors:this.vue(r.alors,t),sinon:this.vue(r.sinon,t),ligne:r.ligne});break;case`Boucle`:{let e=[];n.push({type:`repetition`,variable:r.variable,typeVariable:this.analyse.types.get(r)??B,liste:this.valeur(r.liste),corps:this.vue(r.corps,e),gestionnaires:e,...r.deplacement?{deplacement:!0}:{},ligne:r.ligne});break}case`Evenement`:t.push(this.gestionnaire(r));break;case`SousPage`:n.push({type:`sousPage`,ligne:r.ligne});break;case`Fenetre`:n.push({type:`fenetre`,id:this.analyse.fenetres.get(r)??`fenetre_ligne_${jc(r.ligne)}`,titre:r.titre,...r.description===void 0?{}:{description:r.description},...r.obligatoire?{obligatoire:!0}:{},classes:r.classes,corps:this.vue(r.corps,t),ligne:r.ligne});break;case`Bloc`:n.push(r.genre===`carte`?this.carte(r,t):this.bloc(r,t));break;case`CodeDocumentation`:n.push({type:`codeDocumentation`,...r.langage?{langage:r.langage}:{},...r.frappe?{frappe:r.frappe}:{},code:r.code,ligne:r.ligne});break;case`TableauDocumentation`:n.push({type:`tableauDocumentation`,legende:this.valeur(r.legende),colonnes:r.colonnes.map(e=>this.valeur(e)),rangees:r.rangees.map(e=>e.map(e=>this.valeur(e))),ligne:r.ligne});break;case`Formulaire`:n.push({type:`formulaire`,id:this.analyse.elements.get(this.page)?.formulaires.find(e=>e.noeud===r)?.id??`formulaire_ligne_${r.ligne}`,nom:r.nom,corps:this.vue(r.corps,t),ligne:r.ligne});break;case`Composant`:n.push({type:`composant`,nom:r.nom,proprietes:r.proprietes.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)})),ligne:r.ligne});break;case`Variable`:n.push({type:`locale`,nom:r.nom,typeValeur:this.analyse.types.get(r)??B,valeur:this.valeur(r.valeur),ligne:r.ligne})}return n}element(e){let t=e.indice===void 0?void 0:this.enLangues(e.indiceTexte??{type:`Chaine`,parties:[{type:`texte`,valeur:e.indice}],ligne:e.ligne}),n={...e.parmi?{parmi:this.valeur(e.parmi)}:{},...e.obligatoire?{obligatoire:!0}:{},...e.indice===void 0?{}:{indice:e.indice},...t?{indiceLangues:t}:{},...e.minimum===void 0?{}:{minimum:e.minimum},...e.maximum===void 0?{}:{maximum:e.maximum}},r=e.element===`champ`&&(e.sorte!==void 0||Object.keys(n).length>0)?{sorte:e.sorte??`texte`,...n}:void 0,i=e.element===`image`?Gs(e,e=>this.valeur(e)):void 0,{options:a,reglages:o}=this.separer(i?e.styles.filter(e=>!Vs.has(A(e.propriete))):e.styles);return Sc.has(e.element)?{type:`widget`,genre:e.element,id:this.analyse.elements.get(this.page)?.idDe(e)??`${e.element}_ligne_${jc(e.ligne)}`,contenu:this.valeur(e.contenu),options:a,classes:e.classes,reglages:o,...e.minimum===void 0?{}:{minimum:e.minimum},...e.maximum===void 0?{}:{maximum:e.maximum},...e.fichier?{fichier:Js(e.fichier)}:{},...e.element===`audio`?{textes:this.textesAudio(e)}:{},ligne:e.ligne}:{...r?{saisie:r}:{},...Object.keys(o).length>0?{reglages:o}:{},type:`element`,id:this.analyse.elements.get(this.page)?.idDe(e)??`${e.element}_ligne_${jc(e.ligne)}`,genre:e.element,...e.niveau===void 0?{}:{niveau:e.niveau},contenu:this.valeur(e.contenu),options:a,classes:e.classes,...fc(e.cible),...e.ancre===void 0?{}:{ancre:e.ancre},...e.nouvelOnglet?{nouvelOnglet:!0}:{},...e.arguments?{arguments:e.arguments.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)}))}:{},...i?{image:i}:{},...e.raccourci===void 0?{}:{raccourci:mc(e.raccourci)},...e.annonce?{annonce:!0}:{},ligne:e.ligne}}actionsDe(e){return this.actions(e)}actions(e){let t=[];for(let n of e)switch(n.type){case`Supposant`:{let e=[...new Set(n.corps.map(e=>e.type===`Affectation`?e.nom:e.type===`ModificationListe`?e.liste:``).filter(Boolean))];t.push({type:`optimiste`,corps:this.actions(n.corps),variables:e});break}case`Rendre`:t.push({type:`rendre`,valeur:this.valeur(n.valeur)});break;case`Variable`:t.push({type:`locale`,nom:n.nom,typeValeur:this.analyse.types.get(n)??B,valeur:this.valeur(n.valeur)});break;case`Affectation`:{let e=this.analyse.changementsLangue.get(n);if(e!==void 0){t.push({type:`langue`,code:e});break}if(!n.champs&&this.page.filtres?.some(e=>e.nom===n.nom)){t.push({type:`filtre`,nom:n.nom,valeur:this.valeur(n.valeur)});break}t.push({type:`affectation`,nom:n.nom,...n.champs?{champs:n.champs}:{},valeur:this.valeur(n.valeur)});break}case`ModificationListe`:t.push(n.operation===`ajouter`?{type:`ajout`,liste:n.liste,valeur:this.valeur(n.valeur)}:{type:`retrait`,liste:n.liste,valeur:this.valeur(n.valeur)});break;case`Requete`:t.push({type:`requete`,adresse:this.analyse.adressesRequetes.get(n)??kc(n.adresse),mode:this.analyse.lecturesUn.has(n)?`lireUn`:n.donnees.length>0?`envoyer`:`lire`,donnees:n.donnees.map(e=>this.valeur(e)),...n.cles?{cles:n.cles}:{},resultat:n.resultat,...n.source===void 0?{}:{source:n.source,filtrant:n.filtrant?.map(e=>({cle:e.cle,valeur:this.valeur(e.valeur)})),dans:this.analyse.reglesSources.get(n)?.dans}});break;case`Rechargement`:t.push({type:`recharger`,variable:n.variable});break;case`EnvoiFichier`:t.push({type:`envoiFichier`,variable:n.variable,adresse:n.adresse,source:n.source??``,corpsBrut:n.corpsBrut===!0,champ:n.champ??`fichier`,...n.suivi===void 0?{}:{suivi:n.suivi},...n.resultat===void 0?{}:{resultat:n.resultat}});break;case`Suppression`:t.push({type:`suppression`,adresse:this.analyse.adressesRequetes.get(n)??n.adresse,objet:this.valeur(n.objet),...n.source===void 0?{}:{source:n.source}});break;case`Modification`:t.push({type:`modification`,adresse:this.analyse.adressesRequetes.get(n)??n.adresse,objet:this.valeur(n.objet),changements:n.changements.map(e=>({champ:U(e.champ),valeur:this.valeur(e.valeur)})),...n.source===void 0?{}:{source:n.source},...this.analyse.reglesOperations.get(n)?.remplacement?{remplacement:!0}:{}});break;case`Action`:t.push(this.action(n));break;case`Connexion`:t.push({type:`connexion`,email:this.valeur(n.email),motDePasse:this.valeur(n.motDePasse)});break;case`Deconnexion`:t.push({type:`deconnexion`});break;case`Condition`:t.push({type:`si`,test:this.test(n.test),alors:this.actions(n.alors),sinon:this.actions(n.sinon)});break;case`Boucle`:t.push({type:`repetition`,variable:n.variable,typeVariable:this.analyse.types.get(n)??B,liste:this.valeur(n.liste),corps:this.actions(n.corps)});break;case`Essayer`:t.push({type:`essayer`,corps:this.actions(n.corps),siErreur:this.actions(n.siErreur)});break;case`TantQue`:t.push({type:`tantQue`,test:this.test(n.test),corps:this.actions(n.corps)});break;case`Repeter`:t.push({type:`repeter`,fois:this.valeur(n.fois),corps:this.actions(n.corps)});break;case`Arreter`:t.push({type:`arreter`});break;case`PasserAuSuivant`:t.push({type:`passer`});break;case`Selon`:t.push({type:`selon`,valeur:this.valeur(n.valeur),cas:n.cas.map(e=>({valeurs:e.valeurs.map(e=>this.valeur(e)),corps:this.actions(e.corps)})),sinon:this.actions(n.sinon)});break;case`Minuterie`:t.push({type:`minuterie`,mode:n.mode,millisecondes:this.duree(n.duree),...n.tantQue?{tantQue:this.test(n.tantQue)}:{},corps:this.actions(n.corps)});break;case`Copier`:t.push({type:`copie`,valeur:this.valeur(n.valeur),message:n.message===void 0?`Copié`:n.message,...n.texte?{texte:this.valeur(n.texte)}:{}});break;case`Partager`:{let e=n.lien,r=e?ps(e.adresse):void 0;t.push({type:`partage`,texte:this.valeur(n.texte),...n.titre?{titre:this.valeur(n.titre)}:{},...e&&r?{lien:r.externe?{externe:e.adresse.trim()}:{ecran:r.page??this.page.nom,...e.parametres?.length?{arguments:e.parametres.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)}))}:{}}}:{}});break}case`Confirmer`:t.push({type:`confirmation`,question:this.valeur(n.question),oui:n.oui??`Oui`,non:n.non??`Non`,alors:this.actions(n.alors),sinon:this.actions(n.sinon)})}return t}duree(e){let t=pr[e.unite];if(e.valeur.type===`Nombre`)return{type:`nombre`,valeur:Math.round(e.valeur.valeur*t)};let n=this.valeur(e.valeur);return t===1?n:{type:`calcul`,operateur:`*`,gauche:n,droite:{type:`nombre`,valeur:t}}}separer(e){let t=[],n={};for(let r of e){let e=A(r.propriete);if(Cc.has(e)){if(e===`photo`)n.photo=this.valeur({type:`Chaine`,parties:r.parties??[{type:`texte`,valeur:r.valeur}],ligne:0});else if(e===`automatique`||e===`visibles`)n[e]=Number(r.valeur);else if(e===`icone`)n.icone=Ha(r.valeur)?.nom??r.valeur;else if(e===`description`||e===`transcription`){n[e]=r.valeur;let t=e===`description`?this.enLangues(r.texte??{type:`Chaine`,parties:r.parties??[{type:`texte`,valeur:r.valeur}],ligne:0}):void 0;t&&(n.descriptionLangues=t)}else n[e]=!0;continue}let i=yt(r.propriete,r.valeur,this.analyse.couleursTheme);t.push(`erreur`in i?{nom:r.propriete,valeur:r.valeur}:{nom:i.propriete,valeur:i.valeur}),r.defilement&&t.push({nom:`animation`,valeur:`defilement`}),r.cascade&&t.push({nom:`animation`,valeur:`cascade`})}return{options:t,reglages:n}}enLangues(e){return e?Dc(e,this.analyse):void 0}textesAudio(e){let t=t=>{let n=e.styles.find(e=>A(e.propriete)===t);return n?this.valeur(n.texte??{type:`Chaine`,parties:n.parties??[{type:`texte`,valeur:n.valeur}],ligne:e.ligne}):void 0},n=t(`description`),r=t(`transcription`);return{...n?{description:n}:{},...r?{transcription:r}:{}}}etatCache(e,t,n,r){let i=`${e}_${jc(t)}`;return this.caches.push({nom:i,type:n,initiale:r,ligne:t}),i}bloc(e,t,n){let{options:r,reglages:i}=this.separer(e.styles);e.repliable&&r.push({nom:`menu`,valeur:`repliable`}),e.vertical&&r.push({nom:`menu`,valeur:`vertical`});let a={type:`bloc`,genre:e.genre,options:r,classes:e.classes,...e.ancre===void 0?{}:{ancre:e.ancre},corps:[],...e.titre?{titre:this.valeur(e.titre)}:{},...Object.keys(i).length>0?{reglages:i}:{},...e.nom!==void 0&&this.analyse.blocsNommes.has(e.nom)?{id:this.analyse.blocsNommes.get(e.nom)}:{},ligne:e.ligne},o=e.corps.filter(e=>e.type===`Bloc`),s=o.findIndex(e=>e.styles.some(e=>A(e.propriete)===`ouvert`));if(e.genre===`onglets`||e.genre===`accordeon`&&!i.plusieurs){let n=e.genre===`onglets`?Math.max(s,0):s;return a.etat=this.etatCache(e.genre===`onglets`?`onglet`:`accordeon`,e.ligne,ea,{type:`nombre`,valeur:n}),a.corps=e.corps.flatMap(e=>e.type===`Bloc`?[this.bloc(e,t,{etat:a.etat,index:o.indexOf(e)})]:this.vue([e],t)),a}return e.genre===`deroulant`&&!n?a.etat=this.etatCache(`ouvert`,e.ligne,ta,{type:`booleen`,valeur:i.ouvert===!0}):n&&(a.etat=n.etat,a.index=n.index),a.corps=this.vue(e.corps,t),a}carte(e,t){let n=e.carte??{};return{type:`carte`,id:`carte_ligne_${jc(e.ligne)}`,nom:this.valeur(e.titre),...n.latitude?{latitude:this.valeur(n.latitude)}:{},...n.longitude?{longitude:this.valeur(n.longitude)}:{},...n.zoom?{zoom:this.valeur(n.zoom)}:{},...n.tuiles===void 0?{}:{tuiles:{adresse:n.tuiles,attribution:n.attribution??``}},classes:e.classes,corps:this.vue(e.corps,t),ligne:e.ligne}}marqueur(e){let t=e.lieu;return{type:`marqueur`,nom:this.valeur(e.contenu),...t.adresse?{adresse:this.valeur(t.adresse)}:{},latitude:this.valeur(t.latitude),longitude:this.valeur(t.longitude),ligne:e.ligne}}action(e){let t=this.analyse.cibles.get(e)??[];switch(e.action){case`afficher`:case`afficherErreur`:{let t=e.message;return{type:`message`,genre:e.action===`afficherErreur`?`erreur`:t?.genre??`info`,texte:this.valeur(e.arguments[0]),...t?.duree?{duree:this.duree(t.duree)}:{},...t?.persistant?{persistant:!0}:{},...t?.action?{action:{libelle:t.action.libelle,actions:this.actions(t.action.corps)}}:{}}}case`montrer`:return{type:`visibilite`,ids:t,visible:!0};case`cacher`:return{type:`visibilite`,ids:t,visible:!1};case`rediriger`:return{type:`navigation`,ecran:this.valeur(e.arguments[0]),...e.parametres?{arguments:e.parametres.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)}))}:{},...e.continuer?{continuer:!0}:{}};case`changerTexte`:return{type:`changerTexte`,ids:t,texte:this.valeur(e.arguments[1])};case`changerTheme`:{let t=this.valeur(e.arguments[0]);return{type:`theme`,valeur:t.type===`texte`&&`texte`in t.parties[0]?t.parties[0].texte:`automatique`}}case`revenir`:{let t=e.arguments[0];return{type:`retour`,...t&&t.type===`Chaine`?{vers:t.parties.map(e=>e.type===`texte`?e.valeur:``).join(``)}:{}}}}}test(e){return e.type===`Combinaison`?{operateur:e.operateur,gauche:this.test(e.gauche),droite:this.test(e.droite)}:{gauche:this.valeur(e.gauche),operateur:e.operateur,droite:e.droite&&this.valeur(e.droite),...e.negation?{negation:!0}:{}}}valeur(e){return Tc(e,this.analyse)}};function Tc(e,t){let n=e=>Tc(e,t);switch(e.type){case`Chaine`:{let n=e=>e.map(e=>{if(e.type===`texte`)return{texte:e.valeur};if(e.type===`accent`)return{texte:e.valeur,accent:!0};if(e.type===`code`)return{texte:e.valeur,code:!0};let n=t.formats.get(e),r=t.pluriels.get(e);return{variable:t.chemins.get(e)??e.valeur,...n?{format:n}:{},...r?{pluriel:r}:{}}}),r=Oc(e,t);return{type:`texte`,parties:n(e.parties),...r?{versions:r.map(e=>({code:e.code,parties:n(e.parties)}))}:{}}}case`Nombre`:return{type:`nombre`,valeur:e.valeur};case`Booleen`:return{type:`booleen`,valeur:e.valeur};case`Rien`:return{type:`rien`};case`Liste`:return{type:`liste`,elements:e.elements.map(e=>n(e))};case`Reference`:{let n=t.referencesLangue.get(e);return n===`langue`?{type:`variable`,nom:`langue`}:n===void 0?{type:`variable`,nom:e.nom}:{type:`texte`,parties:[{texte:n}]}}case`Champ`:return{type:`champ`,id:t.champs.get(e)??e.nom};case`Calcul`:return{type:`calcul`,operateur:e.operateur,gauche:n(e.gauche),droite:n(e.droite)};case`Compte`:return{type:`compte`,liste:n(e.liste)};case`Fiche`:return{type:`fiche`,champs:e.champs.map(e=>({nom:e.nom,valeur:n(e.valeur)}))};case`Appel`:return{type:`appel`,nom:e.nom,arguments:e.arguments.map(e=>n(e))};case`AccesChamp`:return t.projections.has(e)?{type:`champs`,liste:n(e.objet),champ:e.champ}:{type:`champDonnee`,objet:n(e.objet),champ:e.champ};case`Agregat`:return{type:`agregat`,operation:e.operation,liste:n(e.liste)};case`Arrondi`:return{type:`arrondi`,valeur:n(e.valeur),...e.chiffres===void 0?{}:{chiffres:e.chiffres}};case`DateDuJour`:return{type:`dateDuJour`,maintenant:e.maintenant};case`DateDecalee`:return{type:`dateDecalee`,date:n(e.date),nombre:n(e.nombre),unite:e.unite,signe:e.signe};case`JoursEntre`:return{type:`joursEntre`,debut:n(e.debut),fin:n(e.fin)};case`Hasard`:return{type:`hasard`,minimum:n(e.minimum),maximum:n(e.maximum)};case`Filtre`:return{type:`filtre`,liste:n(e.liste),champs:t.filtres.get(e)??[],test:{gauche:n(e.test.gauche),operateur:e.test.operateur,...e.test.droite?{droite:n(e.test.droite)}:{},...e.test.negation?{negation:!0}:{}}};case`Tri`:return{type:`tri`,liste:n(e.liste),...e.champ===void 0?{}:{champ:e.champ},decroissant:e.decroissant,genre:t.tris.get(e)??`nombre`};case`Premier`:return{type:`premier`,liste:n(e.liste)};case`Groupement`:return{type:`groupement`,liste:n(e.liste),champ:e.champ};case`OperationTexte`:return{type:`operationTexte`,operation:e.operation,valeur:n(e.valeur)};case`Remplacement`:return{type:`remplacement`,cherche:n(e.cherche),remplace:n(e.remplace),dans:n(e.dans)};case`Premiers`:return{type:`premiers`,nombre:n(e.nombre),liste:n(e.liste)};case`EtatUtilisateur`:return{type:`utilisateur`,etat:e.etat};case`EtatRequete`:return{type:`etatRequete`,variable:e.variable,etat:e.etat};case`ErreurRequete`:return{type:`erreurRequete`,variable:e.variable};case`MouvementReduit`:return{type:`mouvementReduit`};case`ThemeSombre`:return{type:`themeSombre`}}}function Ec(e){return e.valeur.type===`Nombre`?Math.round(e.valeur.valeur*pr[e.unite]):300}function Dc(e,t){return Oc(e,t)?.map(e=>({code:e.code,texte:At(e.parties)}))}function Oc(e,t){let[n,...r]=t.langues.langues;if(!n)return;let i=t.langues.traductions.get(At(e.parties)),a=r.flatMap(t=>{let n=e.versions?.find(e=>kn(e.langue)===t)?.parties??i?.get(t.code);return n?[{code:t.code,parties:n}]:[]});return a.length>0?[{code:n.code,parties:e.parties},...a]:void 0}function kc(e){return/^[a-z][a-z0-9+.-]*:\/\//i.test(e)||e.startsWith(`/`)?e:`/${e}`}const Ac=1e6,jc=e=>e%Ac;function Mc(e,t=[]){let n=Math.floor(e.ligne/Ac),r=e.message.replace(/\bligne (\d+)/g,(e,r)=>{let i=Number(r),a=Math.floor(i/Ac);return a===n?`ligne ${jc(i)}`:`ligne ${jc(i)} de ${t[a]??`ce fichier`}`});return n===0?r===e.message?e:{...e,message:r}:{...e,message:r,ligne:jc(e.ligne),fichier:t[n]}}const Nc=e=>e.replace(/^Ligne \d+ : /,``);function Pc(t,n,r){let i=t===void 0?``:zc(t),a=Bc(i),o=e=>Uc(a,e),s=[],c=[],l=[],u=new Set,d=[],f=(t,r)=>{let i=s.length,p=i*Ac;u.add(t),s.push(o(t));let m;try{m=Or(nt(r))}catch(t){if(t instanceof e){c.push({gravite:`erreur`,message:Nc(t.message),ligne:p+t.ligne,colonne:t.colonne});return}if(t instanceof j){c.push({gravite:`erreur`,message:Nc(t.message),ligne:p+t.ligne});return}throw t}let h=Bc(t);if(i>0){Rc(m,p);for(let e of m.fichiersStyle)e.chemin=Uc(a,Hc(h,e.chemin));for(let e of m.composantsReact)e.chemin=Uc(a,Hc(h,e.chemin));for(let e of m.donneesFichiers)e.chemin=`./`+Uc(a,Hc(h,e.chemin));for(let e of m.theme?.polices??[])e.fichier&&=Uc(a,Hc(h,e.fichier));for(let e of[`image`,`logo`]){let t=m.site?.[e];t&&!/^https?:\/\//.test(t)&&(m.site[e]=Uc(a,Hc(h,t)))}}l.push(m),d.push(t);for(let e of m.fichiersHumalis){let r=Hc(h,e.chemin),i=d.indexOf(r);if(i!==-1){let t=[...d.slice(i),r].map(o).join(` → `);c.push({gravite:`erreur`,message:`les fichiers s'utilisent en boucle : ${t}. Retirez l'un des « utiliser fichier ».`,ligne:e.ligne});continue}if(u.has(r))continue;let a=n(r);if(a===void 0){let n=t===``?`ce fichier`:Vc(t);c.push({gravite:`erreur`,message:`le fichier « ${e.chemin} » est introuvable (cherché à côté de ${n}, sous ${r}).`,ligne:e.ligne});continue}f(r,a)}d.pop()},p=r??n(i);if(p===void 0)throw Error(`le fichier principal « ${t} » n'a pas pu être lu`);f(i,p);let m=()=>({diagnostics:c.map(e=>Mc(e,s)).sort(Lc),fichiers:s});if(c.some(e=>e.gravite===`erreur`))return m();let h=Ic(l,s,c);for(let e of h.donneesFichiers){let t=Hc(a,e.chemin);if(!e.chemin.startsWith(`./`)&&!e.chemin.startsWith(`../`)){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » doit avoir un chemin relatif (./…).`});continue}if(Uc(a,t).startsWith(`..`)){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » sort du projet.`});continue}let r=n(t);if(r===void 0){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » est introuvable (cherché à côté du fichier Humalis).`});continue}if(new TextEncoder().encode(r).length>1048576){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » dépasse 1 Mo : utilisez une source pour des données plus grandes.`});continue}try{let t=e.chemin.endsWith(`.csv`)?Ni(r):e.chemin.endsWith(`.json`)?Pi(r):void 0;if(t===void 0)throw Error(`seuls les fichiers .csv et .json sont acceptés.`);h.partages.push({type:`Variable`,nom:e.nom,valeur:Fc(t,e.ligne),options:{partagee:!0},fichierDonnees:e.chemin,ligne:e.ligne})}catch(t){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » : ${t.message}`})}}if(c.some(e=>e.gravite===`erreur`))return m();let g=ks(h);return c.push(...g.diagnostics),c.some(e=>e.gravite===`erreur`)?m():{...m(),application:hc(h,g)}}function Fc(e,t){return typeof e==`string`?{type:`Chaine`,parties:[{type:`texte`,valeur:e}],ligne:t}:typeof e==`number`?{type:`Nombre`,valeur:e,ligne:t}:typeof e==`boolean`?{type:`Booleen`,valeur:e,ligne:t}:Array.isArray(e)?{type:`Liste`,elements:e.map(e=>Fc(e,t)),ligne:t}:e&&typeof e==`object`?{type:`Fiche`,champs:Object.entries(e).map(([e,n])=>({nom:e,valeur:Fc(n,t),ligne:t})),ligne:t}:{type:`Rien`,ligne:t}}function Ic(e,t,n){let[r,...i]=e,a={...r,pages:[...r.pages],styles:[...r.styles],fichiersStyle:[...r.fichiersStyle],donneesFichiers:[...r.donneesFichiers],partages:[...r.partages],composantsReact:[...r.composantsReact],composants:[...r.composants],serveurs:[...r.serveurs],sources:[...r.sources],fonctions:[...r.fonctions],tests:[...r.tests]};for(let e of i){for(let t of e.pages){let e=a.pages.find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`la page « ${t.nom} » est déjà déclarée (ligne ${e.ligne}).`,ligne:t.ligne}):a.pages.push(t)}for(let t of e.serveurs){let e=a.serveurs[0];e?n.push({gravite:`erreur`,message:`un seul serveur par application : le serveur « ${e.nom} » est déjà déclaré (ligne ${e.ligne}). Mets ses données et ses routes dans ce même bloc.`,ligne:t.ligne}):a.serveurs.push(t)}for(let t of e.sources){let e=a.sources.find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`la source « ${t.nom} » est déjà déclarée (ligne ${e.ligne}).`,ligne:t.ligne}):a.sources.push(t)}for(let t of e.fonctions){let e=a.fonctions.find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`la fonction « ${t.nom} » est déjà définie (ligne ${e.ligne}).`,ligne:t.ligne}):a.fonctions.push(t)}a.tests.push(...e.tests),e.site&&(a.site?n.push({gravite:`erreur`,message:`un seul bloc « site » par application : il est déjà déclaré (ligne ${a.site.ligne}).`,ligne:e.site.ligne}):a.site=e.site),e.theme&&(a.theme?n.push({gravite:`erreur`,message:`un seul bloc « theme » par application : il est déjà déclaré (ligne ${a.theme.ligne}). Réunissez les couleurs et les polices dans le même bloc.`,ligne:e.theme.ligne}):a.theme=e.theme);for(let t of[`entete`,`pied`]){let r=e[t];r&&(a[t]?n.push({gravite:`erreur`,message:`un seul « ${t} » par application : il est déjà déclaré (ligne ${a[t].ligne}).`,ligne:r.ligne}):a[t]=r)}a.styles.push(...e.styles),a.fichiersStyle.push(...e.fichiersStyle),a.donneesFichiers.push(...e.donneesFichiers),a.partages.push(...e.partages);for(let t of[...e.composants,...e.composantsReact]){let e=[...a.composants,...a.composantsReact].find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`le composant « ${t.nom} » est déjà défini (ligne ${e.ligne}).`,ligne:t.ligne}):t.type===`ComposantReact`?a.composantsReact.push(t):a.composants.push(t)}}return a}const Lc=(e,t)=>(e.fichier??``).localeCompare(t.fichier??``)||e.ligne-t.ligne;function Rc(e,t){if(Array.isArray(e))for(let n of e)Rc(n,t);else if(typeof e==`object`&&e){let n=e;for(let[e,r]of Object.entries(n))e===`ligne`&&typeof r==`number`?n[e]=r+t:Rc(r,t)}}function zc(e){let t=[],n=e.startsWith(`/`);for(let r of e.replace(/\\/g,`/`).split(`/`))r!==``&&r!==`.`&&(r===`..`&&t.length>0&&t[t.length-1]!==`..`?t.pop():(r!==`..`||!n)&&t.push(r));return(n?`/`:``)+t.join(`/`)}const Bc=e=>e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`))||`/`:``,Vc=e=>e.slice(e.lastIndexOf(`/`)+1),Hc=(e,t)=>zc(t.startsWith(`/`)||e===``?t:`${e}/${t}`);function Uc(e,t){if(e===``)return t;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;return[...Array(n.length-i).fill(`..`),...r.slice(i)].join(`/`)}function Wc(e){let{application:t,diagnostics:n}=Pc(void 0,()=>void 0,e);return t?{application:t,diagnostics:n}:{diagnostics:n}}function Gc(e){try{return $c(e)??el(e)??tl(e)??rl(e)??il(e)??al(e)}catch{return}}const Kc=(e,t,n)=>Number.isFinite(e)&&Number.isFinite(t)&&e>0&&t>0?{largeur:e,hauteur:t,format:n}:void 0,qc=(e,t,n=0)=>e.length>=n+t.length&&t.every((t,r)=>e[n+r]===t),Jc=(e,t,n)=>String.fromCharCode(...e.subarray(t,t+n)),Yc=(e,t)=>e[t]<<8|e[t+1],Xc=(e,t)=>e[t]|e[t+1]<<8,Zc=(e,t)=>(e[t]<<24>>>0)+(e[t+1]<<16|e[t+2]<<8|e[t+3]),Qc=(e,t)=>e[t]|e[t+1]<<8|e[t+2]<<16;function $c(e){if(!(!qc(e,[137,80,78,71,13,10,26,10])||e.length<24||Jc(e,12,4)!==`IHDR`))return Kc(Zc(e,16),Zc(e,20),`png`)}function el(e){if(!(e.length<10||!/^GIF8[79]a$/.test(Jc(e,0,6))))return Kc(Xc(e,6),Xc(e,8),`gif`)}function tl(e){if(!qc(e,[255,216]))return;let t=2,n=1;for(;t+4<=e.length;){if(e[t]!==255)return;let r=e[t+1];if(r===255){t+=1;continue}if(r===216||r===1||r>=208&&r<=215){t+=2;continue}if(r===217||r===218)return;let i=Yc(e,t+2);if(i<2)return;if(r===225&&Jc(e,t+4,6)===`Exif\0\0`&&(n=nl(e,t+10,t+2+i)??n),r>=192&&r<=207&&r!==196&&r!==200&&r!==204){if(t+9>e.length)return;let r=Yc(e,t+5),i=Yc(e,t+7);return n>=5&&n<=8?Kc(r,i,`jpeg`):Kc(i,r,`jpeg`)}t+=2+i}}function nl(e,t,n){if(t+8>Math.min(n,e.length))return;let r=Jc(e,t,2)===`II`;if(!r&&Jc(e,t,2)!==`MM`)return;let i=t=>r?Xc(e,t):Yc(e,t),a=t+(t=>r?Xc(e,t)+Xc(e,t+2)*65536:Zc(e,t))(t+4);if(a+2>Math.min(n,e.length))return;let o=i(a);for(let t=0;t<o;t++){let r=a+2+t*12;if(r+12>Math.min(n,e.length))return;if(i(r)===274)return i(r+8)}}function rl(e){if(e.length<30||Jc(e,0,4)!==`RIFF`||Jc(e,8,4)!==`WEBP`)return;let t=Jc(e,12,4);if(t===`VP8 `)return qc(e,[157,1,42],23)?Kc(Xc(e,26)&16383,Xc(e,28)&16383,`webp`):void 0;if(t===`VP8L`){if(e[20]!==47)return;let t=e[21]|e[22]<<8|e[23]<<16|e[24]<<24;return Kc((t&16383)+1,(t>>>14&16383)+1,`webp`)}if(t===`VP8X`)return Kc(Qc(e,24)+1,Qc(e,27)+1,`webp`)}function il(e){if(e.length<16||Jc(e,4,4)!==`ftyp`||!/^avi[fs]$/.test(Jc(e,8,4)))return;let t=Math.min(e.length-16,4096);for(let n=12;n<=t;n++)if(e[n]===105&&Jc(e,n,4)===`ispe`)return Kc(Zc(e,n+8),Zc(e,n+12),`avif`)}function al(e){let t=new TextDecoder().decode(e.subarray(0,4096)),n=/<svg\b[^>]*>/i.exec(t)?.[0];if(!n)return;let r=/\bviewBox\s*=\s*["']\s*[-\d.eE]+[\s,]+[-\d.eE]+[\s,]+([\d.eE]+)[\s,]+([\d.eE]+)\s*["']/.exec(n);if(r)return Kc(Number(r[1]),Number(r[2]),`svg`);let i=e=>/^([\d.]+)(px)?$/.exec(RegExp(`\\b${e}\\s*=\\s*["']([^"']+)["']`).exec(n)?.[1]?.trim()??``)?.[1],a=i(`width`),o=i(`height`);return a&&o?Kc(Number(a),Number(o),`svg`):void 0}function ol(e,t){return t?.nom&&!e.includes(t.nom)?`${e} | ${t.nom}`:e}const sl=e=>/^https?:\/\//.test(e);function cl(e){let t=e.replace(/\\/g,`/`).split(`/`).filter(e=>e!==``&&e!==`.`);return t.includes(`..`)?t[t.length-1]:t.join(`/`)}function ll(e,t){return sl(e)?e:t?`${ul(t)}/${cl(e)}`:void 0}const ul=e=>e.replace(/\/+$/,``);function dl(e){return{svg:`image/svg+xml`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,webp:`image/webp`,ico:`image/x-icon`}[e.toLowerCase().match(/\.([a-z0-9]+)$/)?.[1]??``]??`image/png`}function fl(e,t){return e.indexation?`User-agent: *\nAllow: /\n${t?`Sitemap: ${ul(t)}/sitemap.xml\n`:``}`:`User-agent: *
|
|
680
|
+
`)}function fc(e,t){let n=dc(e).replace(`devise ? (valeur) => humalis.formaterArgent(valeur, devise) : humalis.formaterNombre;`,`devise ? (valeur) => humalis.formaterArgent(valeur, devise, humalis.langue()) : (valeur) => humalis.formaterNombre(valeur, humalis.langue());`).replace(`htmlDuGraphique(config, donnees, formateur(config.devise))`,`htmlDuGraphique({ ...config, langue: humalis.langue() }, donnees, formateur(config.devise))`);for(let e of[`Voir les données`,`Les données du graphique`,`Aucune donnée à afficher.`])n=n.split(`>${e}<`).join(`>' + humalis.${oc(uc(e),t,!1)} + '<`);return n}function pc(e){if(e===void 0)return{};let t=ps(e);return t.externe?{externe:e.trim()}:{...t.page!==void 0&&t.page!==``?{cible:t.page}:{},...t.ancre===void 0?{}:{versAncre:t.ancre}}}const mc={clic:`clic`,survol:`survol`,chargement:`chargement`,soumission:`soumission`,touche:`touche`,saisie:`saisie`,pauseSaisie:`pauseSaisie`,bas:`bas`,ordre:`ordre`},hc=e=>{let t=Ca(e);return`touches`in t?t.touches:e};function gc(e,t){return{ecrans:e.pages.map(e=>new Tc(e,t).ecran()),css:e.styles.map(e=>e.css),fichiersStyle:e.fichiersStyle.map(e=>({chemin:e.chemin,ligne:e.ligne})),partages:e.partages.map(e=>Sc(e,t)),serveurs:e.serveurs.map(bc),sources:e.sources.map(_c),...e.theme?{theme:yc(e.theme)}:{},...t.langues.langues.length>1?{langues:t.langues.langues.map(e=>({code:e.code,nom:e.nomPropre}))}:{},...e.site?{site:{...e.site.nom===void 0?{}:{nom:e.site.nom},...e.site.textes?.nom&&Oc(e.site.textes.nom,t)?{nomLangues:Oc(e.site.textes.nom,t)}:{},...e.site.description===void 0?{}:{description:e.site.description},...e.site.textes?.description&&Oc(e.site.textes.description,t)?{descriptionLangues:Oc(e.site.textes.description,t)}:{},...e.site.image===void 0?{}:{image:e.site.image},...e.site.logo===void 0?{}:{logo:e.site.logo},...e.site.adresse===void 0?{}:{adresse:e.site.adresse},indexation:e.site.indexation,ligne:e.site.ligne}}:{},...e.entete||e.pied?{disposition:{...e.entete?{entete:vc(e.entete,t)}:{},...e.pied?{pied:vc(e.pied,t)}:{}}}:{},composantsReact:e.composantsReact.map(e=>({nom:e.nom,chemin:e.chemin,ligne:e.ligne})),fonctions:[...t.fonctions.values()].map(({definition:e,retour:n,appels:r})=>({nom:e.nom,parametres:e.parametres.map((e,t)=>({nom:e.nom,type:xc(r.map(e=>e[t]))})),retour:n,corps:new Tc({type:`Page`,nom:`fonction ${e.nom}`,parametres:[],corps:[],ligne:e.ligne},t).actionsDe(e.corps),ligne:e.ligne})),composants:e.composants.map(e=>({...new Tc(t.pagesComposants.get(e),t).ecran(),parametres:e.parametres.map(n=>({nom:n.nom,type:xc(t.typesParametres.get(`${e.nom}.${n.nom}`)??[])}))}))}}function _c(e){return{nom:e.nom,adresse:e.adresse??``,session:e.session,enveloppe:e.enveloppe??(e.session?`data`:void 0),erreurDans:e.erreurDans??(e.session?`message`:void 0),entetes:e.entetes.map(e=>({nom:e.nom,valeur:e.valeur})),jetonPublic:e.jeton?.genre===`public`?{valeur:e.jeton.valeur,place:e.jeton.place}:void 0,cache:e.cache,essais:e.essais,delai:e.delai,donnees:e.donnees.map(e=>({nom:e.cle??e.nom,champs:e.champs.map(e=>({nom:e.nom,type:e.type}))}))}}function vc(e,t){return{ecran:{...new Tc(t.pagesDispositions.get(e),t).ecran(),parametres:[]},options:e.styles.map(e=>{let n=yt(e.propriete,e.valeur,t.couleursTheme);return`erreur`in n?{nom:e.propriete,valeur:e.valeur}:{nom:n.propriete,valeur:n.valeur}}),classes:e.classes}}function yc(e){return{couleurs:e.couleurs.map(e=>{let t=e.sombre??e.clair;return{nom:e.nom,clair:e.clair,sombre:t,encreClair:Qn(e.clair),encreSombre:Qn(t)}}),polices:e.polices.map(e=>({role:e.role,nom:e.nom,...e.fichier?{fichier:e.fichier}:{}})),mode:e.mode?.valeur??`automatique`,largeur:e.largeur?.valeur??`normale`}}function bc(e){return{nom:e.nom,donnees:e.donnees.map(e=>({nom:e.nom,champs:e.champs.map(e=>({nom:e.nom,type:e.type}))})),routes:e.routes.filter(e=>e.regles.length>0).map(e=>{let t=os(e);return{adresse:e.adresse,donnee:e.regles[0].donnee,droits:t,ligne:e.ligne}})}}function xc(e){let t=e.filter(e=>e.genre!==`inconnu`);if(t.length===0)return B;let n=JSON.stringify(t[0]);return t.every(e=>JSON.stringify(e)===n)?t[0]:B}function Sc(e,t){let n={nom:e.nom,type:t.types.get(e)??B,initiale:Ec(e.valeur,t),ligne:e.ligne};return e.options?.memorisee&&(n.memorisee=!0),e.options?.secret&&(n.secret=!0),t.facultatives.has(e)&&(n.facultatif=!0),e.fichierDonnees&&(n.lectureSeule=!0),n}const Cc=new Set([`icone`,`badge`,`avatar`,`progression`,`chargement`,`etoiles`,`compteur`,`qr`,`fichier`,`audio`,`selecteurLangue`]),wc=new Set([`icone`,`description`,`decoratif`,`photo`,`modifiable`,`ouvert`,`plusieurs`,`pourcentage`,`automatique`,`visibles`,`transcription`,`boucle`]);var Tc=class{page;analyse;caches=[];constructor(e,t){this.page=e,this.analyse=t}ecran(){let e=[],t=[],n=[],r=[];for(let i of this.page.corps)i.type===`Variable`&&i.calcul?t.push({nom:i.nom,type:this.analyse.types.get(i)??B,valeur:this.valeur(i.valeur),...this.analyse.facultatives.has(i)?{facultatif:!0}:{}}):i.type===`Variable`?e.push({...Sc(i,this.analyse),initiale:this.valeur(i.valeur)}):i.type===`Evenement`?r.push(this.gestionnaire(i)):i.type===`Minuterie`?r.push({declencheur:`minuterie`,cibles:[],actions:this.actions([i]),ligne:i.ligne}):n.push(...this.vue([i],r));return{nom:this.page.nom,etat:[...e,...this.caches],calculs:t,vue:n,gestionnaires:r,...this.page.parametres.length>0?{parametresAdresse:this.page.parametres}:{},...this.page.adresse===void 0?{}:{adresse:this.page.adresse},...this.page.parent===void 0?{}:{parent:this.page.parent},...this.page.filtres?.length?{filtres:this.page.filtres.map(e=>({nom:e.nom,...e.nombre?{nombre:!0}:{}}))}:{},...this.page.reservee?{reservee:{qui:this.page.reservee.qui,sinon:this.page.reservee.sinon??`connexion`}}:{},...this.analyse.etatsLus.get(this.page)?.size?{etatsRequetes:[...this.analyse.etatsLus.get(this.page)]}:{},...this.page.sansEntete?{sansEntete:!0}:{},...this.page.sansPied?{sansPied:!0}:{},...this.page.apercu?{apercu:{...this.page.apercu.titre?{titre:this.valeur(this.page.apercu.titre)}:{},...this.page.apercu.description?{description:this.valeur(this.page.apercu.description)}:{},...this.page.apercu.image?{image:this.valeur(this.page.apercu.image)}:{},indexation:this.page.apercu.indexation}}:{},ligne:this.page.ligne}}gestionnaire(e){return{declencheur:mc[e.genre],cibles:this.analyse.cibles.get(e)??[],actions:this.actions(e.corps),...e.touches===void 0?{}:{touches:hc(e.touches)},...e.genre===`pauseSaisie`?{millisecondes:e.duree?Dc(e.duree):300}:{},...e.tantQue?{tantQue:this.test(e.tantQue)}:{},...e.genre===`bas`?{bouton:e.bouton===void 0?`Voir plus`:e.bouton}:{},...e.variable===void 0?{}:{variable:e.variable},ligne:e.ligne}}vue(e,t){let n=[];for(let r of e)switch(r.type){case`Element`:n.push(r.element===`marqueur`?this.marqueur(r):this.element(r));break;case`Graphique`:n.push(Qs(r,`graphique-${Mc(r.ligne)}`,e=>this.valeur(e),this.analyse.couleursTheme,{serie:e=>this.enLangues(e),message:e=>ec(e,this.analyse.langues.langues.map(e=>e.code))}));break;case`Action`:r.action===`afficher`&&n.push({type:`element`,id:`texte_ligne_${Mc(r.ligne)}`,genre:`texte`,contenu:this.valeur(r.arguments[0]),options:[],classes:[],ligne:r.ligne});break;case`Condition`:n.push({type:`condition`,test:this.test(r.test),alors:this.vue(r.alors,t),sinon:this.vue(r.sinon,t),ligne:r.ligne});break;case`Boucle`:{let e=[];n.push({type:`repetition`,variable:r.variable,typeVariable:this.analyse.types.get(r)??B,liste:this.valeur(r.liste),corps:this.vue(r.corps,e),gestionnaires:e,...r.deplacement?{deplacement:!0}:{},ligne:r.ligne});break}case`Evenement`:t.push(this.gestionnaire(r));break;case`SousPage`:n.push({type:`sousPage`,ligne:r.ligne});break;case`Fenetre`:n.push({type:`fenetre`,id:this.analyse.fenetres.get(r)??`fenetre_ligne_${Mc(r.ligne)}`,titre:r.titre,...r.description===void 0?{}:{description:r.description},...r.obligatoire?{obligatoire:!0}:{},classes:r.classes,corps:this.vue(r.corps,t),ligne:r.ligne});break;case`Bloc`:n.push(r.genre===`carte`?this.carte(r,t):this.bloc(r,t));break;case`CodeDocumentation`:n.push({type:`codeDocumentation`,...r.langage?{langage:r.langage}:{},...r.frappe?{frappe:r.frappe}:{},code:r.code,ligne:r.ligne});break;case`TableauDocumentation`:n.push({type:`tableauDocumentation`,legende:this.valeur(r.legende),colonnes:r.colonnes.map(e=>this.valeur(e)),rangees:r.rangees.map(e=>e.map(e=>this.valeur(e))),ligne:r.ligne});break;case`Formulaire`:n.push({type:`formulaire`,id:this.analyse.elements.get(this.page)?.formulaires.find(e=>e.noeud===r)?.id??`formulaire_ligne_${r.ligne}`,nom:r.nom,corps:this.vue(r.corps,t),ligne:r.ligne});break;case`Composant`:n.push({type:`composant`,nom:r.nom,proprietes:r.proprietes.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)})),ligne:r.ligne});break;case`Variable`:n.push({type:`locale`,nom:r.nom,typeValeur:this.analyse.types.get(r)??B,valeur:this.valeur(r.valeur),ligne:r.ligne})}return n}element(e){let t=e.indice===void 0?void 0:this.enLangues(e.indiceTexte??{type:`Chaine`,parties:[{type:`texte`,valeur:e.indice}],ligne:e.ligne}),n={...e.parmi?{parmi:this.valeur(e.parmi)}:{},...e.obligatoire?{obligatoire:!0}:{},...e.indice===void 0?{}:{indice:e.indice},...t?{indiceLangues:t}:{},...e.minimum===void 0?{}:{minimum:e.minimum},...e.maximum===void 0?{}:{maximum:e.maximum}},r=e.element===`champ`&&(e.sorte!==void 0||Object.keys(n).length>0)?{sorte:e.sorte??`texte`,...n}:void 0,i=e.element===`image`?Ks(e,e=>this.valeur(e)):void 0,{options:a,reglages:o}=this.separer(i?e.styles.filter(e=>!Hs.has(A(e.propriete))):e.styles);return Cc.has(e.element)?{type:`widget`,genre:e.element,id:this.analyse.elements.get(this.page)?.idDe(e)??`${e.element}_ligne_${Mc(e.ligne)}`,contenu:this.valeur(e.contenu),options:a,classes:e.classes,reglages:o,...e.minimum===void 0?{}:{minimum:e.minimum},...e.maximum===void 0?{}:{maximum:e.maximum},...e.fichier?{fichier:Ys(e.fichier)}:{},...e.element===`audio`?{textes:this.textesAudio(e)}:{},ligne:e.ligne}:{...r?{saisie:r}:{},...Object.keys(o).length>0?{reglages:o}:{},type:`element`,id:this.analyse.elements.get(this.page)?.idDe(e)??`${e.element}_ligne_${Mc(e.ligne)}`,genre:e.element,...e.niveau===void 0?{}:{niveau:e.niveau},contenu:this.valeur(e.contenu),options:a,classes:e.classes,...pc(e.cible),...e.ancre===void 0?{}:{ancre:e.ancre},...e.nouvelOnglet?{nouvelOnglet:!0}:{},...e.arguments?{arguments:e.arguments.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)}))}:{},...i?{image:i}:{},...e.raccourci===void 0?{}:{raccourci:hc(e.raccourci)},...e.annonce?{annonce:!0}:{},ligne:e.ligne}}actionsDe(e){return this.actions(e)}actions(e){let t=[];for(let n of e)switch(n.type){case`Supposant`:{let e=[...new Set(n.corps.map(e=>e.type===`Affectation`?e.nom:e.type===`ModificationListe`?e.liste:``).filter(Boolean))];t.push({type:`optimiste`,corps:this.actions(n.corps),variables:e});break}case`Rendre`:t.push({type:`rendre`,valeur:this.valeur(n.valeur)});break;case`Variable`:t.push({type:`locale`,nom:n.nom,typeValeur:this.analyse.types.get(n)??B,valeur:this.valeur(n.valeur)});break;case`Affectation`:{let e=this.analyse.changementsLangue.get(n);if(e!==void 0){t.push({type:`langue`,code:e});break}if(!n.champs&&this.page.filtres?.some(e=>e.nom===n.nom)){t.push({type:`filtre`,nom:n.nom,valeur:this.valeur(n.valeur)});break}t.push({type:`affectation`,nom:n.nom,...n.champs?{champs:n.champs}:{},valeur:this.valeur(n.valeur)});break}case`ModificationListe`:t.push(n.operation===`ajouter`?{type:`ajout`,liste:n.liste,valeur:this.valeur(n.valeur)}:{type:`retrait`,liste:n.liste,valeur:this.valeur(n.valeur)});break;case`Requete`:t.push({type:`requete`,adresse:this.analyse.adressesRequetes.get(n)??Ac(n.adresse),mode:this.analyse.lecturesUn.has(n)?`lireUn`:n.donnees.length>0?`envoyer`:`lire`,donnees:n.donnees.map(e=>this.valeur(e)),...n.cles?{cles:n.cles}:{},resultat:n.resultat,...n.source===void 0?{}:{source:n.source,filtrant:n.filtrant?.map(e=>({cle:e.cle,valeur:this.valeur(e.valeur)})),dans:this.analyse.reglesSources.get(n)?.dans}});break;case`Rechargement`:t.push({type:`recharger`,variable:n.variable});break;case`EnvoiFichier`:t.push({type:`envoiFichier`,variable:n.variable,adresse:n.adresse,source:n.source??``,corpsBrut:n.corpsBrut===!0,champ:n.champ??`fichier`,...n.suivi===void 0?{}:{suivi:n.suivi},...n.resultat===void 0?{}:{resultat:n.resultat}});break;case`Suppression`:t.push({type:`suppression`,adresse:this.analyse.adressesRequetes.get(n)??n.adresse,objet:this.valeur(n.objet),...n.source===void 0?{}:{source:n.source}});break;case`Modification`:t.push({type:`modification`,adresse:this.analyse.adressesRequetes.get(n)??n.adresse,objet:this.valeur(n.objet),changements:n.changements.map(e=>({champ:U(e.champ),valeur:this.valeur(e.valeur)})),...n.source===void 0?{}:{source:n.source},...this.analyse.reglesOperations.get(n)?.remplacement?{remplacement:!0}:{}});break;case`Action`:t.push(this.action(n));break;case`Connexion`:t.push({type:`connexion`,email:this.valeur(n.email),motDePasse:this.valeur(n.motDePasse)});break;case`Deconnexion`:t.push({type:`deconnexion`});break;case`Condition`:t.push({type:`si`,test:this.test(n.test),alors:this.actions(n.alors),sinon:this.actions(n.sinon)});break;case`Boucle`:t.push({type:`repetition`,variable:n.variable,typeVariable:this.analyse.types.get(n)??B,liste:this.valeur(n.liste),corps:this.actions(n.corps)});break;case`Essayer`:t.push({type:`essayer`,corps:this.actions(n.corps),siErreur:this.actions(n.siErreur)});break;case`TantQue`:t.push({type:`tantQue`,test:this.test(n.test),corps:this.actions(n.corps)});break;case`Repeter`:t.push({type:`repeter`,fois:this.valeur(n.fois),corps:this.actions(n.corps)});break;case`Arreter`:t.push({type:`arreter`});break;case`PasserAuSuivant`:t.push({type:`passer`});break;case`Selon`:t.push({type:`selon`,valeur:this.valeur(n.valeur),cas:n.cas.map(e=>({valeurs:e.valeurs.map(e=>this.valeur(e)),corps:this.actions(e.corps)})),sinon:this.actions(n.sinon)});break;case`Minuterie`:t.push({type:`minuterie`,mode:n.mode,millisecondes:this.duree(n.duree),...n.tantQue?{tantQue:this.test(n.tantQue)}:{},corps:this.actions(n.corps)});break;case`Copier`:t.push({type:`copie`,valeur:this.valeur(n.valeur),message:n.message===void 0?`Copié`:n.message,...n.texte?{texte:this.valeur(n.texte)}:{}});break;case`Partager`:{let e=n.lien,r=e?ps(e.adresse):void 0;t.push({type:`partage`,texte:this.valeur(n.texte),...n.titre?{titre:this.valeur(n.titre)}:{},...e&&r?{lien:r.externe?{externe:e.adresse.trim()}:{ecran:r.page??this.page.nom,...e.parametres?.length?{arguments:e.parametres.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)}))}:{}}}:{}});break}case`Confirmer`:t.push({type:`confirmation`,question:this.valeur(n.question),oui:n.oui??`Oui`,non:n.non??`Non`,alors:this.actions(n.alors),sinon:this.actions(n.sinon)})}return t}duree(e){let t=pr[e.unite];if(e.valeur.type===`Nombre`)return{type:`nombre`,valeur:Math.round(e.valeur.valeur*t)};let n=this.valeur(e.valeur);return t===1?n:{type:`calcul`,operateur:`*`,gauche:n,droite:{type:`nombre`,valeur:t}}}separer(e){let t=[],n={};for(let r of e){let e=A(r.propriete);if(wc.has(e)){if(e===`photo`)n.photo=this.valeur({type:`Chaine`,parties:r.parties??[{type:`texte`,valeur:r.valeur}],ligne:0});else if(e===`automatique`||e===`visibles`)n[e]=Number(r.valeur);else if(e===`icone`)n.icone=Ha(r.valeur)?.nom??r.valeur;else if(e===`description`||e===`transcription`){n[e]=r.valeur;let t=e===`description`?this.enLangues(r.texte??{type:`Chaine`,parties:r.parties??[{type:`texte`,valeur:r.valeur}],ligne:0}):void 0;t&&(n.descriptionLangues=t)}else n[e]=!0;continue}let i=yt(r.propriete,r.valeur,this.analyse.couleursTheme);t.push(`erreur`in i?{nom:r.propriete,valeur:r.valeur}:{nom:i.propriete,valeur:i.valeur}),r.defilement&&t.push({nom:`animation`,valeur:`defilement`}),r.cascade&&t.push({nom:`animation`,valeur:`cascade`})}return{options:t,reglages:n}}enLangues(e){return e?Oc(e,this.analyse):void 0}textesAudio(e){let t=t=>{let n=e.styles.find(e=>A(e.propriete)===t);return n?this.valeur(n.texte??{type:`Chaine`,parties:n.parties??[{type:`texte`,valeur:n.valeur}],ligne:e.ligne}):void 0},n=t(`description`),r=t(`transcription`);return{...n?{description:n}:{},...r?{transcription:r}:{}}}etatCache(e,t,n,r){let i=`${e}_${Mc(t)}`;return this.caches.push({nom:i,type:n,initiale:r,ligne:t}),i}bloc(e,t,n){let{options:r,reglages:i}=this.separer(e.styles);e.repliable&&r.push({nom:`menu`,valeur:`repliable`}),e.vertical&&r.push({nom:`menu`,valeur:`vertical`});let a={type:`bloc`,genre:e.genre,options:r,classes:e.classes,...e.ancre===void 0?{}:{ancre:e.ancre},corps:[],...e.titre?{titre:this.valeur(e.titre)}:{},...Object.keys(i).length>0?{reglages:i}:{},...e.nom!==void 0&&this.analyse.blocsNommes.has(e.nom)?{id:this.analyse.blocsNommes.get(e.nom)}:{},ligne:e.ligne},o=e.corps.filter(e=>e.type===`Bloc`),s=o.findIndex(e=>e.styles.some(e=>A(e.propriete)===`ouvert`));if(e.genre===`onglets`||e.genre===`accordeon`&&!i.plusieurs){let n=e.genre===`onglets`?Math.max(s,0):s;return a.etat=this.etatCache(e.genre===`onglets`?`onglet`:`accordeon`,e.ligne,ea,{type:`nombre`,valeur:n}),a.corps=e.corps.flatMap(e=>e.type===`Bloc`?[this.bloc(e,t,{etat:a.etat,index:o.indexOf(e)})]:this.vue([e],t)),a}return e.genre===`deroulant`&&!n?a.etat=this.etatCache(`ouvert`,e.ligne,ta,{type:`booleen`,valeur:i.ouvert===!0}):n&&(a.etat=n.etat,a.index=n.index),a.corps=this.vue(e.corps,t),a}carte(e,t){let n=e.carte??{};return{type:`carte`,id:`carte_ligne_${Mc(e.ligne)}`,nom:this.valeur(e.titre),...n.latitude?{latitude:this.valeur(n.latitude)}:{},...n.longitude?{longitude:this.valeur(n.longitude)}:{},...n.zoom?{zoom:this.valeur(n.zoom)}:{},...n.tuiles===void 0?{}:{tuiles:{adresse:n.tuiles,attribution:n.attribution??``}},classes:e.classes,corps:this.vue(e.corps,t),ligne:e.ligne}}marqueur(e){let t=e.lieu;return{type:`marqueur`,nom:this.valeur(e.contenu),...t.adresse?{adresse:this.valeur(t.adresse)}:{},latitude:this.valeur(t.latitude),longitude:this.valeur(t.longitude),ligne:e.ligne}}action(e){let t=this.analyse.cibles.get(e)??[];switch(e.action){case`afficher`:case`afficherErreur`:{let t=e.message;return{type:`message`,genre:e.action===`afficherErreur`?`erreur`:t?.genre??`info`,texte:this.valeur(e.arguments[0]),...t?.duree?{duree:this.duree(t.duree)}:{},...t?.persistant?{persistant:!0}:{},...t?.action?{action:{libelle:t.action.libelle,actions:this.actions(t.action.corps)}}:{}}}case`montrer`:return{type:`visibilite`,ids:t,visible:!0};case`cacher`:return{type:`visibilite`,ids:t,visible:!1};case`rediriger`:return{type:`navigation`,ecran:this.valeur(e.arguments[0]),...e.parametres?{arguments:e.parametres.map(e=>({nom:e.nom,valeur:this.valeur(e.valeur)}))}:{},...e.continuer?{continuer:!0}:{}};case`changerTexte`:return{type:`changerTexte`,ids:t,texte:this.valeur(e.arguments[1])};case`changerTheme`:{let t=this.valeur(e.arguments[0]);return{type:`theme`,valeur:t.type===`texte`&&`texte`in t.parties[0]?t.parties[0].texte:`automatique`}}case`revenir`:{let t=e.arguments[0];return{type:`retour`,...t&&t.type===`Chaine`?{vers:t.parties.map(e=>e.type===`texte`?e.valeur:``).join(``)}:{}}}}}test(e){return e.type===`Combinaison`?{operateur:e.operateur,gauche:this.test(e.gauche),droite:this.test(e.droite)}:{gauche:this.valeur(e.gauche),operateur:e.operateur,droite:e.droite&&this.valeur(e.droite),...e.negation?{negation:!0}:{}}}valeur(e){return Ec(e,this.analyse)}};function Ec(e,t){let n=e=>Ec(e,t);switch(e.type){case`Chaine`:{let n=e=>e.map(e=>{if(e.type===`texte`)return{texte:e.valeur};if(e.type===`accent`)return{texte:e.valeur,accent:!0};if(e.type===`code`)return{texte:e.valeur,code:!0};let n=t.formats.get(e),r=t.pluriels.get(e);return{variable:t.chemins.get(e)??e.valeur,...n?{format:n}:{},...r?{pluriel:r}:{}}}),r=kc(e,t);return{type:`texte`,parties:n(e.parties),...r?{versions:r.map(e=>({code:e.code,parties:n(e.parties)}))}:{}}}case`Nombre`:return{type:`nombre`,valeur:e.valeur};case`Booleen`:return{type:`booleen`,valeur:e.valeur};case`Rien`:return{type:`rien`};case`Liste`:return{type:`liste`,elements:e.elements.map(e=>n(e))};case`Reference`:{let n=t.referencesLangue.get(e);return n===`langue`?{type:`variable`,nom:`langue`}:n===void 0?{type:`variable`,nom:e.nom}:{type:`texte`,parties:[{texte:n}]}}case`Champ`:return{type:`champ`,id:t.champs.get(e)??e.nom};case`Calcul`:return{type:`calcul`,operateur:e.operateur,gauche:n(e.gauche),droite:n(e.droite)};case`Compte`:return{type:`compte`,liste:n(e.liste)};case`Fiche`:return{type:`fiche`,champs:e.champs.map(e=>({nom:e.nom,valeur:n(e.valeur)}))};case`Appel`:return{type:`appel`,nom:e.nom,arguments:e.arguments.map(e=>n(e))};case`AccesChamp`:return t.projections.has(e)?{type:`champs`,liste:n(e.objet),champ:e.champ}:{type:`champDonnee`,objet:n(e.objet),champ:e.champ};case`Agregat`:return{type:`agregat`,operation:e.operation,liste:n(e.liste)};case`Arrondi`:return{type:`arrondi`,valeur:n(e.valeur),...e.chiffres===void 0?{}:{chiffres:e.chiffres}};case`DateDuJour`:return{type:`dateDuJour`,maintenant:e.maintenant};case`DateDecalee`:return{type:`dateDecalee`,date:n(e.date),nombre:n(e.nombre),unite:e.unite,signe:e.signe};case`JoursEntre`:return{type:`joursEntre`,debut:n(e.debut),fin:n(e.fin)};case`Hasard`:return{type:`hasard`,minimum:n(e.minimum),maximum:n(e.maximum)};case`Filtre`:return{type:`filtre`,liste:n(e.liste),champs:t.filtres.get(e)??[],test:{gauche:n(e.test.gauche),operateur:e.test.operateur,...e.test.droite?{droite:n(e.test.droite)}:{},...e.test.negation?{negation:!0}:{}}};case`Tri`:return{type:`tri`,liste:n(e.liste),...e.champ===void 0?{}:{champ:e.champ},decroissant:e.decroissant,genre:t.tris.get(e)??`nombre`};case`Premier`:return{type:`premier`,liste:n(e.liste)};case`Groupement`:return{type:`groupement`,liste:n(e.liste),champ:e.champ};case`OperationTexte`:return{type:`operationTexte`,operation:e.operation,valeur:n(e.valeur)};case`Remplacement`:return{type:`remplacement`,cherche:n(e.cherche),remplace:n(e.remplace),dans:n(e.dans)};case`Premiers`:return{type:`premiers`,nombre:n(e.nombre),liste:n(e.liste)};case`EtatUtilisateur`:return{type:`utilisateur`,etat:e.etat};case`EtatRequete`:return{type:`etatRequete`,variable:e.variable,etat:e.etat};case`ErreurRequete`:return{type:`erreurRequete`,variable:e.variable};case`MouvementReduit`:return{type:`mouvementReduit`};case`ThemeSombre`:return{type:`themeSombre`}}}function Dc(e){return e.valeur.type===`Nombre`?Math.round(e.valeur.valeur*pr[e.unite]):300}function Oc(e,t){return kc(e,t)?.map(e=>({code:e.code,texte:At(e.parties)}))}function kc(e,t){let[n,...r]=t.langues.langues;if(!n)return;let i=t.langues.traductions.get(At(e.parties)),a=r.flatMap(t=>{let n=e.versions?.find(e=>kn(e.langue)===t)?.parties??i?.get(t.code);return n?[{code:t.code,parties:n}]:[]});return a.length>0?[{code:n.code,parties:e.parties},...a]:void 0}function Ac(e){return/^[a-z][a-z0-9+.-]*:\/\//i.test(e)||e.startsWith(`/`)?e:`/${e}`}const jc=1e6,Mc=e=>e%jc;function Nc(e,t=[]){let n=Math.floor(e.ligne/jc),r=e.message.replace(/\bligne (\d+)/g,(e,r)=>{let i=Number(r),a=Math.floor(i/jc);return a===n?`ligne ${Mc(i)}`:`ligne ${Mc(i)} de ${t[a]??`ce fichier`}`});return n===0?r===e.message?e:{...e,message:r}:{...e,message:r,ligne:Mc(e.ligne),fichier:t[n]}}const Pc=e=>e.replace(/^Ligne \d+ : /,``);function Fc(t,n,r){let i=t===void 0?``:Bc(t),a=Vc(i),o=e=>Wc(a,e),s=[],c=[],l=[],u=new Set,d=[],f=(t,r)=>{let i=s.length,p=i*jc;u.add(t),s.push(o(t));let m;try{m=Or(nt(r))}catch(t){if(t instanceof e){c.push({gravite:`erreur`,message:Pc(t.message),ligne:p+t.ligne,colonne:t.colonne});return}if(t instanceof j){c.push({gravite:`erreur`,message:Pc(t.message),ligne:p+t.ligne});return}throw t}let h=Vc(t);if(i>0){zc(m,p);for(let e of m.fichiersStyle)e.chemin=Wc(a,Uc(h,e.chemin));for(let e of m.composantsReact)e.chemin=Wc(a,Uc(h,e.chemin));for(let e of m.donneesFichiers)e.chemin=`./`+Wc(a,Uc(h,e.chemin));for(let e of m.theme?.polices??[])e.fichier&&=Wc(a,Uc(h,e.fichier));for(let e of[`image`,`logo`]){let t=m.site?.[e];t&&!/^https?:\/\//.test(t)&&(m.site[e]=Wc(a,Uc(h,t)))}}l.push(m),d.push(t);for(let e of m.fichiersHumalis){let r=Uc(h,e.chemin),i=d.indexOf(r);if(i!==-1){let t=[...d.slice(i),r].map(o).join(` → `);c.push({gravite:`erreur`,message:`les fichiers s'utilisent en boucle : ${t}. Retirez l'un des « utiliser fichier ».`,ligne:e.ligne});continue}if(u.has(r))continue;let a=n(r);if(a===void 0){let n=t===``?`ce fichier`:Hc(t);c.push({gravite:`erreur`,message:`le fichier « ${e.chemin} » est introuvable (cherché à côté de ${n}, sous ${r}).`,ligne:e.ligne});continue}f(r,a)}d.pop()},p=r??n(i);if(p===void 0)throw Error(`le fichier principal « ${t} » n'a pas pu être lu`);f(i,p);let m=()=>({diagnostics:c.map(e=>Nc(e,s)).sort(Rc),fichiers:s});if(c.some(e=>e.gravite===`erreur`))return m();let h=Lc(l,s,c);for(let e of h.donneesFichiers){let t=Uc(a,e.chemin);if(!e.chemin.startsWith(`./`)&&!e.chemin.startsWith(`../`)){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » doit avoir un chemin relatif (./…).`});continue}if(Wc(a,t).startsWith(`..`)){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » sort du projet.`});continue}let r=n(t);if(r===void 0){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » est introuvable (cherché à côté du fichier Humalis).`});continue}if(new TextEncoder().encode(r).length>1048576){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » dépasse 1 Mo : utilisez une source pour des données plus grandes.`});continue}try{let t=e.chemin.endsWith(`.csv`)?Ni(r):e.chemin.endsWith(`.json`)?Pi(r):void 0;if(t===void 0)throw Error(`seuls les fichiers .csv et .json sont acceptés.`);h.partages.push({type:`Variable`,nom:e.nom,valeur:Ic(t,e.ligne),options:{partagee:!0},fichierDonnees:e.chemin,ligne:e.ligne})}catch(t){c.push({gravite:`erreur`,ligne:e.ligne,message:`le fichier de données « ${e.chemin} » : ${t.message}`})}}if(c.some(e=>e.gravite===`erreur`))return m();let g=new Set,_=!1;for(let e of h.styles){let t=Bs(e.css,e.ligne+1);for(let e of t.classes)g.add(e);c.push(...t.diagnostics)}for(let e of h.fichiersStyle){let t=n(Uc(a,e.chemin));if(t===void 0){_=!0;continue}let r=Bs(t,1,e.chemin.replace(/^\.\//,``));for(let e of r.classes)g.add(e);c.push(...r.diagnostics)}let v=ks(h,_?void 0:g);return c.push(...v.diagnostics),c.some(e=>e.gravite===`erreur`)?m():{...m(),application:gc(h,v)}}function Ic(e,t){return typeof e==`string`?{type:`Chaine`,parties:[{type:`texte`,valeur:e}],ligne:t}:typeof e==`number`?{type:`Nombre`,valeur:e,ligne:t}:typeof e==`boolean`?{type:`Booleen`,valeur:e,ligne:t}:Array.isArray(e)?{type:`Liste`,elements:e.map(e=>Ic(e,t)),ligne:t}:e&&typeof e==`object`?{type:`Fiche`,champs:Object.entries(e).map(([e,n])=>({nom:e,valeur:Ic(n,t),ligne:t})),ligne:t}:{type:`Rien`,ligne:t}}function Lc(e,t,n){let[r,...i]=e,a={...r,pages:[...r.pages],styles:[...r.styles],fichiersStyle:[...r.fichiersStyle],donneesFichiers:[...r.donneesFichiers],partages:[...r.partages],composantsReact:[...r.composantsReact],composants:[...r.composants],serveurs:[...r.serveurs],sources:[...r.sources],fonctions:[...r.fonctions],tests:[...r.tests]};for(let e of i){for(let t of e.pages){let e=a.pages.find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`la page « ${t.nom} » est déjà déclarée (ligne ${e.ligne}).`,ligne:t.ligne}):a.pages.push(t)}for(let t of e.serveurs){let e=a.serveurs[0];e?n.push({gravite:`erreur`,message:`un seul serveur par application : le serveur « ${e.nom} » est déjà déclaré (ligne ${e.ligne}). Mets ses données et ses routes dans ce même bloc.`,ligne:t.ligne}):a.serveurs.push(t)}for(let t of e.sources){let e=a.sources.find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`la source « ${t.nom} » est déjà déclarée (ligne ${e.ligne}).`,ligne:t.ligne}):a.sources.push(t)}for(let t of e.fonctions){let e=a.fonctions.find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`la fonction « ${t.nom} » est déjà définie (ligne ${e.ligne}).`,ligne:t.ligne}):a.fonctions.push(t)}a.tests.push(...e.tests),e.site&&(a.site?n.push({gravite:`erreur`,message:`un seul bloc « site » par application : il est déjà déclaré (ligne ${a.site.ligne}).`,ligne:e.site.ligne}):a.site=e.site),e.theme&&(a.theme?n.push({gravite:`erreur`,message:`un seul bloc « theme » par application : il est déjà déclaré (ligne ${a.theme.ligne}). Réunissez les couleurs et les polices dans le même bloc.`,ligne:e.theme.ligne}):a.theme=e.theme);for(let t of[`entete`,`pied`]){let r=e[t];r&&(a[t]?n.push({gravite:`erreur`,message:`un seul « ${t} » par application : il est déjà déclaré (ligne ${a[t].ligne}).`,ligne:r.ligne}):a[t]=r)}a.styles.push(...e.styles),a.fichiersStyle.push(...e.fichiersStyle),a.donneesFichiers.push(...e.donneesFichiers),a.partages.push(...e.partages);for(let t of[...e.composants,...e.composantsReact]){let e=[...a.composants,...a.composantsReact].find(e=>e.nom===t.nom);e?n.push({gravite:`erreur`,message:`le composant « ${t.nom} » est déjà défini (ligne ${e.ligne}).`,ligne:t.ligne}):t.type===`ComposantReact`?a.composantsReact.push(t):a.composants.push(t)}}return a}const Rc=(e,t)=>(e.fichier??``).localeCompare(t.fichier??``)||e.ligne-t.ligne;function zc(e,t){if(Array.isArray(e))for(let n of e)zc(n,t);else if(typeof e==`object`&&e){let n=e;for(let[e,r]of Object.entries(n))e===`ligne`&&typeof r==`number`?n[e]=r+t:zc(r,t)}}function Bc(e){let t=[],n=e.startsWith(`/`);for(let r of e.replace(/\\/g,`/`).split(`/`))r!==``&&r!==`.`&&(r===`..`&&t.length>0&&t[t.length-1]!==`..`?t.pop():(r!==`..`||!n)&&t.push(r));return(n?`/`:``)+t.join(`/`)}const Vc=e=>e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`))||`/`:``,Hc=e=>e.slice(e.lastIndexOf(`/`)+1),Uc=(e,t)=>Bc(t.startsWith(`/`)||e===``?t:`${e}/${t}`);function Wc(e,t){if(e===``)return t;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;return[...Array(n.length-i).fill(`..`),...r.slice(i)].join(`/`)}function Gc(e){let{application:t,diagnostics:n}=Fc(void 0,()=>void 0,e);return t?{application:t,diagnostics:n}:{diagnostics:n}}function Kc(e){try{return el(e)??tl(e)??nl(e)??il(e)??al(e)??ol(e)}catch{return}}const qc=(e,t,n)=>Number.isFinite(e)&&Number.isFinite(t)&&e>0&&t>0?{largeur:e,hauteur:t,format:n}:void 0,Jc=(e,t,n=0)=>e.length>=n+t.length&&t.every((t,r)=>e[n+r]===t),Yc=(e,t,n)=>String.fromCharCode(...e.subarray(t,t+n)),Xc=(e,t)=>e[t]<<8|e[t+1],Zc=(e,t)=>e[t]|e[t+1]<<8,Qc=(e,t)=>(e[t]<<24>>>0)+(e[t+1]<<16|e[t+2]<<8|e[t+3]),$c=(e,t)=>e[t]|e[t+1]<<8|e[t+2]<<16;function el(e){if(!(!Jc(e,[137,80,78,71,13,10,26,10])||e.length<24||Yc(e,12,4)!==`IHDR`))return qc(Qc(e,16),Qc(e,20),`png`)}function tl(e){if(!(e.length<10||!/^GIF8[79]a$/.test(Yc(e,0,6))))return qc(Zc(e,6),Zc(e,8),`gif`)}function nl(e){if(!Jc(e,[255,216]))return;let t=2,n=1;for(;t+4<=e.length;){if(e[t]!==255)return;let r=e[t+1];if(r===255){t+=1;continue}if(r===216||r===1||r>=208&&r<=215){t+=2;continue}if(r===217||r===218)return;let i=Xc(e,t+2);if(i<2)return;if(r===225&&Yc(e,t+4,6)===`Exif\0\0`&&(n=rl(e,t+10,t+2+i)??n),r>=192&&r<=207&&r!==196&&r!==200&&r!==204){if(t+9>e.length)return;let r=Xc(e,t+5),i=Xc(e,t+7);return n>=5&&n<=8?qc(r,i,`jpeg`):qc(i,r,`jpeg`)}t+=2+i}}function rl(e,t,n){if(t+8>Math.min(n,e.length))return;let r=Yc(e,t,2)===`II`;if(!r&&Yc(e,t,2)!==`MM`)return;let i=t=>r?Zc(e,t):Xc(e,t),a=t+(t=>r?Zc(e,t)+Zc(e,t+2)*65536:Qc(e,t))(t+4);if(a+2>Math.min(n,e.length))return;let o=i(a);for(let t=0;t<o;t++){let r=a+2+t*12;if(r+12>Math.min(n,e.length))return;if(i(r)===274)return i(r+8)}}function il(e){if(e.length<30||Yc(e,0,4)!==`RIFF`||Yc(e,8,4)!==`WEBP`)return;let t=Yc(e,12,4);if(t===`VP8 `)return Jc(e,[157,1,42],23)?qc(Zc(e,26)&16383,Zc(e,28)&16383,`webp`):void 0;if(t===`VP8L`){if(e[20]!==47)return;let t=e[21]|e[22]<<8|e[23]<<16|e[24]<<24;return qc((t&16383)+1,(t>>>14&16383)+1,`webp`)}if(t===`VP8X`)return qc($c(e,24)+1,$c(e,27)+1,`webp`)}function al(e){if(e.length<16||Yc(e,4,4)!==`ftyp`||!/^avi[fs]$/.test(Yc(e,8,4)))return;let t=Math.min(e.length-16,4096);for(let n=12;n<=t;n++)if(e[n]===105&&Yc(e,n,4)===`ispe`)return qc(Qc(e,n+8),Qc(e,n+12),`avif`)}function ol(e){let t=new TextDecoder().decode(e.subarray(0,4096)),n=/<svg\b[^>]*>/i.exec(t)?.[0];if(!n)return;let r=/\bviewBox\s*=\s*["']\s*[-\d.eE]+[\s,]+[-\d.eE]+[\s,]+([\d.eE]+)[\s,]+([\d.eE]+)\s*["']/.exec(n);if(r)return qc(Number(r[1]),Number(r[2]),`svg`);let i=e=>/^([\d.]+)(px)?$/.exec(RegExp(`\\b${e}\\s*=\\s*["']([^"']+)["']`).exec(n)?.[1]?.trim()??``)?.[1],a=i(`width`),o=i(`height`);return a&&o?qc(Number(a),Number(o),`svg`):void 0}function sl(e,t){return t?.nom&&!e.includes(t.nom)?`${e} | ${t.nom}`:e}const cl=e=>/^https?:\/\//.test(e);function ll(e){let t=e.replace(/\\/g,`/`).split(`/`).filter(e=>e!==``&&e!==`.`);return t.includes(`..`)?t[t.length-1]:t.join(`/`)}function ul(e,t){return cl(e)?e:t?`${dl(t)}/${ll(e)}`:void 0}const dl=e=>e.replace(/\/+$/,``);function fl(e){return{svg:`image/svg+xml`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,webp:`image/webp`,ico:`image/x-icon`}[e.toLowerCase().match(/\.([a-z0-9]+)$/)?.[1]??``]??`image/png`}function pl(e,t){return e.indexation?`User-agent: *\nAllow: /\n${t?`Sitemap: ${dl(t)}/sitemap.xml\n`:``}`:`User-agent: *
|
|
671
681
|
Disallow: /
|
|
672
|
-
`}function
|
|
673
|
-
`}function ml(e,t,n){let r=new Map;for(let i of[e.logo,e.image]){if(!i||sl(i))continue;let e=t?.get(i);e!==void 0&&r.set(`${n}${cl(i)}`,Bs(e))}return r}function hl(e,t){if(!e.logo)return[`<link rel="icon" href="data:," />`];let n=sl(e.logo)?e.logo:`${t}${cl(e.logo)}`;return[`<link rel="icon" type="${dl(e.logo)}" href="${gl(n)}" />`,...dl(e.logo)===`image/png`?[`<link rel="apple-touch-icon" href="${gl(n)}" />`]:[],`<link rel="manifest" href="${t}manifest.webmanifest" />`]}const gl=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`);function _l(e){return e.flatMap(e=>e.type===`element`?[e.id]:e.type===`formulaire`?[e.id,..._l(e.corps)]:e.type===`bloc`||e.type===`repetition`?_l(e.corps):e.type===`condition`?[..._l(e.alors),..._l(e.sinon)]:[])}function vl(e,t){let n=t?.entete&&!e.sansEntete?t.entete:void 0,r=t?.pied&&!e.sansPied?t.pied:void 0;if(!n&&!r)return e;let i=(e,t)=>({type:`bloc`,genre:e,options:t.options,classes:t.classes,corps:t.ecran.vue,ligne:t.ecran.ligne}),a=[n,r].filter(e=>e!==void 0),o=new Set(e.etat.map(e=>e.nom).concat(e.calculs.map(e=>e.nom))),s=new Set(_l(e.vue));for(let t of a){for(let n of[...t.ecran.etat.map(e=>e.nom),...t.ecran.calculs.map(e=>e.nom)]){if(o.has(n))throw Error(`le nom « ${n} » est utilisé dans la page « ${e.nom} » et dans l'en-tête ou le pied commun : sur un site statique, chaque page recopie l'en-tête, donc leurs noms ne peuvent pas se confondre. Renommez l'une des deux variables.`);o.add(n)}let n=new Set([...e.gestionnaires,...t.ecran.gestionnaires].flatMap(e=>e.cibles));for(let r of _l(t.ecran.vue)){if(s.has(r)&&n.has(r))throw Error(`l'élément « ${r} » existe dans la page « ${e.nom} » et dans l'en-tête ou le pied commun : donnez-lui un autre libellé ou un autre nom (avec nom "…") dans l'un des deux.`);s.add(r)}}return{...e,etat:[...e.etat,...a.flatMap(e=>e.ecran.etat)],calculs:[...e.calculs,...a.flatMap(e=>e.ecran.calculs)],gestionnaires:[...e.gestionnaires,...a.flatMap(e=>e.ecran.gestionnaires)],vue:[...n?[i(`entete`,n)]:[],{type:`bloc`,genre:`contenu`,options:[],classes:[`humalis-page`],corps:e.vue,ligne:e.ligne},...r?[i(`pied`,r)]:[]]}}const yl={"shopping-cart":`<path d="m2.05 2.05 1.099-.028a1 1 0 0 1 1.008.815l2.69 14.347A1 1 0 0 0 7.83 18H18" /><path d="M4.563 5h16.435a1 1 0 0 1 .981 1.204l-1.026 6.226A2 2 0 0 1 18.962 14H6.25" /><circle cx="18" cy="20" r="2" /><circle cx="8" cy="20" r="2" />`,"shopping-bag":`<path d="M16 10a4 4 0 0 1-8 0" /><path d="M3.103 6.034h17.794" /><path d="M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z" />`,house:`<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8" /><path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />`,search:`<path d="m21 21-4.34-4.34" /><circle cx="11" cy="11" r="8" />`,user:`<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" /><circle cx="12" cy="7" r="4" />`,users:`<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /><path d="M16 3.128a4 4 0 0 1 0 7.744" /><path d="M22 21v-2a4 4 0 0 0-3-3.87" /><circle cx="9" cy="7" r="4" />`,menu:`<path d="M4 5h16" /><path d="M4 12h16" /><path d="M4 19h16" />`,x:`<path d="M18 6 6 18" /><path d="m6 6 12 12" />`,plus:`<path d="M5 12h14" /><path d="M12 5v14" />`,minus:`<path d="M5 12h14" />`,check:`<path d="M20 6 9 17l-5-5" />`,star:`<path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" />`,"star-half":`<path d="M12 18.338a2.1 2.1 0 0 0-.987.244L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16l2.309-4.679A.53.53 0 0 1 12 2" />`,heart:`<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5" />`,calendar:`<path d="M8 2v3" /><path d="M16 2v3" /><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M3 9h18" />`,clock:`<circle cx="12" cy="12" r="10" /><path d="M12 6v6l4 2" />`,phone:`<path d="M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384" />`,mail:`<path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" /><rect x="2" y="4" width="20" height="16" rx="2" />`,"map-pin":`<path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" /><circle cx="12" cy="10" r="3" />`,map:`<path d="M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z" /><path d="M15 5.764v15" /><path d="M9 3.236v15" />`,sun:`<circle cx="12" cy="12" r="4" /><path d="M12 2v2" /><path d="M12 20v2" /><path d="m4.93 4.93 1.41 1.41" /><path d="m17.66 17.66 1.41 1.41" /><path d="M2 12h2" /><path d="M20 12h2" /><path d="m6.34 17.66-1.41 1.41" /><path d="m19.07 4.93-1.41 1.41" />`,moon:`<path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" />`,"arrow-right":`<path d="M5 12h14" /><path d="m12 5 7 7-7 7" />`,"arrow-left":`<path d="m12 19-7-7 7-7" /><path d="M19 12H5" />`,"arrow-up":`<path d="m5 12 7-7 7 7" /><path d="M12 19V5" />`,"arrow-down":`<path d="M12 5v14" /><path d="m19 12-7 7-7-7" />`,"chevron-right":`<path d="m9 18 6-6-6-6" />`,"chevron-left":`<path d="m15 18-6-6 6-6" />`,"chevron-up":`<path d="m18 15-6-6-6 6" />`,"chevron-down":`<path d="m6 9 6 6 6-6" />`,info:`<circle cx="12" cy="12" r="10" /><path d="M12 16v-4" /><path d="M12 8h.01" />`,"triangle-alert":`<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" /><path d="M12 9v4" /><path d="M12 17h.01" />`,"circle-x":`<circle cx="12" cy="12" r="10" /><path d="m15 9-6 6" /><path d="m9 9 6 6" />`,"circle-check":`<circle cx="12" cy="12" r="10" /><path d="m16 9-5.5 5.5L8 12" />`,"circle-help":`<circle cx="12" cy="12" r="10" /><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" /><path d="M12 17h.01" />`,settings:`<path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" /><circle cx="12" cy="12" r="3" />`,"log-out":`<path d="m16 17 5-5-5-5" /><path d="M21 12H9" /><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />`,"log-in":`<path d="m10 17 5-5-5-5" /><path d="M15 12H3" /><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" />`,lock:`<rect width="18" height="11" x="3" y="11" rx="2" ry="2" /><path d="M7 11V7a5 5 0 0 1 10 0v4" />`,key:`<path d="m2 21 9.6-9.6" /><path d="m7.5 15.5 2.3 2.3a1 1 0 0 1 0 1.4l-2.1 2.1a1 1 0 0 1-1.4 0L4 19" /><circle cx="15.5" cy="7.5" r="5.5" />`,eye:`<path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" /><circle cx="12" cy="12" r="3" />`,"eye-off":`<path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" /><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242" /><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" /><path d="m2 2 20 20" />`,"trash-2":`<path d="M10 11v6" /><path d="M14 11v6" /><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" /><path d="M3 6h18" /><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />`,pencil:`<path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" /><path d="m15 5 4 4" />`,copy:`<rect width="14" height="14" x="8" y="8" rx="2" ry="2" /><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />`,download:`<path d="M12 15V3" /><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /><path d="m7 10 5 5 5-5" />`,send:`<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z" /><path d="m21.854 2.147-10.94 10.939" />`,"share-2":`<circle cx="18" cy="5" r="3" /><circle cx="6" cy="12" r="3" /><circle cx="18" cy="19" r="3" /><line x1="8.59" x2="15.42" y1="13.51" y2="17.49" /><line x1="15.41" x2="8.59" y1="6.51" y2="10.49" />`,link:`<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />`,image:`<rect width="18" height="18" x="3" y="3" rx="2" ry="2" /><circle cx="9" cy="9" r="2" /><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />`,camera:`<path d="M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z" /><circle cx="12" cy="13" r="3" />`,video:`<path d="m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5" /><rect x="2" y="6" width="14" height="12" rx="2" />`,music:`<path d="M21 16V3a1 1 0 0 0-1.28-.96l-10 2.917a1 1 0 0 0-.72.96V19" /><circle cx="18" cy="16" r="3" /><circle cx="6" cy="19" r="3" />`,"book-open":`<path d="M12 5v16" /><path d="M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z" />`,"file-text":`<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" />`,folder:`<path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />`,funnel:`<path d="M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z" />`,"arrow-up-down":`<path d="m21 16-4 4-4-4" /><path d="M17 20V4" /><path d="m3 8 4-4 4 4" /><path d="M7 4v16" />`,list:`<path d="M3 5h.01" /><path d="M3 12h.01" /><path d="M3 19h.01" /><path d="M8 5h13" /><path d="M8 12h13" /><path d="M8 19h13" />`,"layout-grid":`<rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="14" y="3" rx="1" /><rect width="7" height="7" x="14" y="14" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" />`,bell:`<path d="M10.268 21a2 2 0 0 0 3.464 0" /><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326" />`,"message-circle":`<path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719" />`,"messages-square":`<path d="M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" /><path d="M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1" />`,utensils:`<path d="M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2" /><path d="M7 2v20" /><path d="M21 15V2a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7" />`,coffee:`<path d="M10 2v2" /><path d="M14 2v2" /><path d="M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1" /><path d="M6 2v2" />`,wine:`<path d="M8 22h8" /><path d="M7 10h10" /><path d="M12 15v7" /><path d="M12 15a5 5 0 0 0 5-5c0-2-.5-4-2-8H9c-1.5 4-2 6-2 8a5 5 0 0 0 5 5Z" />`,fish:`<path d="M6.5 12c.94-3.46 4.94-6 8.5-6 3.56 0 6.06 2.54 7 6-.94 3.47-3.44 6-7 6s-7.56-2.53-8.5-6Z" /><path d="M18 12v.5" /><path d="M16 17.93a9.77 9.77 0 0 1 0-11.86" /><path d="M7 10.67C7 8 5.58 5.97 2.73 5.5c-1 1.5-1 5 .23 6.5-1.24 1.5-1.24 5-.23 6.5C5.58 18.03 7 16 7 13.33" /><path d="M10.46 7.26C10.2 5.88 9.17 4.24 8 3h5.8a2 2 0 0 1 1.98 1.67l.23 1.4" /><path d="m16.01 17.93-.23 1.4A2 2 0 0 1 13.8 21H9.5a5.96 5.96 0 0 0 1.49-3.98" />`,leaf:`<path d="M11 20a10 10 0 0010-10 25.9 25.9 0 00-1.04-7.281 1 1 0 00-1.755-.325C15.833 5.5 13 5.5 9.8 6.1A7 7 0 0011 20" /><path d="M2 21a5 5 0 012.911-4.544C7.613 15.212 8.351 15.24 11 13" />`,flame:`<path d="M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4" />`,droplet:`<path d="M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z" />`,waves:`<path d="M2 12q2.5 2 5 0t5 0 5 0 5 0" /><path d="M2 19q2.5 2 5 0t5 0 5 0 5 0" /><path d="M2 5q2.5 2 5 0t5 0 5 0 5 0" />`,car:`<path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2" /><circle cx="7" cy="17" r="2" /><path d="M9 17h6" /><circle cx="17" cy="17" r="2" />`,bike:`<circle cx="18.5" cy="17.5" r="3.5" /><circle cx="5.5" cy="17.5" r="3.5" /><circle cx="15" cy="5" r="1" /><path d="M12 17.5V14l-3-3 4-3 2 3h2" />`,plane:`<path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z" />`,ship:`<path d="M12 2v2" /><path d="M12 9.189V13" /><path d="M19 12V6a2 2 0 00-2-2H7a2 2 0 00-2 2v6" /><path d="M19.38 19A11.6 11.6 0 0021 13l-8.188-3.639a2 2 0 00-1.624 0L3 13.001a11.6 11.6 0 002.81 7.76" /><path d="M2 20c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1" />`,"train-front":`<path d="M8 3.1V7a4 4 0 0 0 8 0V3.1" /><path d="m9 15-1-1" /><path d="m15 15 1-1" /><path d="M9 19c-2.8 0-5-2.2-5-5v-4a8 8 0 0 1 16 0v4c0 2.8-2.2 5-5 5Z" /><path d="m8 19-2 3" /><path d="m16 19 2 3" />`,"credit-card":`<rect width="20" height="14" x="2" y="5" rx="2" /><line x1="2" x2="22" y1="10" y2="10" /><path d="M6 14h2" />`,banknote:`<rect width="20" height="12" x="2" y="6" rx="2" /><circle cx="12" cy="12" r="2" /><path d="M6 12h.01M18 12h.01" />`,gift:`<path d="M12 7v14" /><path d="M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8" /><path d="M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5" /><rect x="3" y="7" width="18" height="4" rx="1" />`,tag:`<path d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z" /><circle cx="7.5" cy="7.5" r=".5" fill="currentColor" />`,award:`<path d="m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526" /><circle cx="12" cy="8" r="6" />`,trophy:`<path d="M10 14.66V17a1 1 0 0 1-1 1 2 2 0 0 0-2 2v2" /><path d="M14 14.66V17a1 1 0 0 0 1 1 2 2 0 0 1 2 2v2" /><path d="M17.916 10H19.5A2.5 2.5 0 0 0 22 7.5V5a1 1 0 0 0-1-1h-3" /><path d="M4 22h16" /><path d="M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z" /><path d="M6.084 10H4.5A2.5 2.5 0 0 1 2 7.5V5a1 1 0 0 1 1-1h3" />`,zap:`<path d="M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z" />`,globe:`<circle cx="12" cy="12" r="10" /><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" /><path d="M2 12h20" />`,wifi:`<path d="M12 20h.01" /><path d="M2 8.82a15 15 0 0 1 20 0" /><path d="M5 12.859a10 10 0 0 1 14 0" /><path d="M8.5 16.429a5 5 0 0 1 7 0" />`,battery:`<path d="M 22 14 L 22 10" /><rect x="2" y="6" width="16" height="12" rx="2" />`,smartphone:`<rect width="14" height="20" x="5" y="2" rx="2" ry="2" /><path d="M12 18h.01" />`,monitor:`<rect width="20" height="14" x="2" y="3" rx="2" /><line x1="8" x2="16" y1="21" y2="21" /><line x1="12" x2="12" y1="17" y2="21" />`,printer:`<path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2" /><path d="M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6" /><rect x="6" y="14" width="12" height="8" rx="1" />`,mic:`<path d="M12 19v3" /><path d="M19 10v2a7 7 0 0 1-14 0v-2" /><rect x="9" y="2" width="6" height="13" rx="3" />`,"volume-2":`<path d="M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z" /><path d="M16 9a5 5 0 0 1 0 6" /><path d="M19.364 18.364a9 9 0 0 0 0-12.728" />`,"volume-x":`<path d="M11 4.702a.7.7 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.7.7 0 0 0 11 19.298z" /><path d="m16.5 14.5 5-5" /><path d="m16.5 9.5 5 5" />`,play:`<path d="M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z" />`,pause:`<rect x="14" y="3" width="5" height="18" rx="1" /><rect x="5" y="3" width="5" height="18" rx="1" />`,square:`<rect width="18" height="18" x="3" y="3" rx="2" />`,"refresh-cw":`<path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" /><path d="M21 3v5h-5" /><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" /><path d="M8 16H3v5" />`,"circle-plus":`<circle cx="12" cy="12" r="10" /><path d="M8 12h8" /><path d="M12 8v8" />`,"circle-minus":`<circle cx="12" cy="12" r="10" /><path d="M8 12h8" />`,ellipsis:`<circle cx="12" cy="12" r="1" /><circle cx="19" cy="12" r="1" /><circle cx="5" cy="12" r="1" />`,"ellipsis-vertical":`<circle cx="12" cy="12" r="1" /><circle cx="12" cy="5" r="1" /><circle cx="12" cy="19" r="1" />`,pin:`<path d="M12 17v5" /><path d="M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" />`,flag:`<path d="M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528" />`,bookmark:`<path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" />`,lightbulb:`<path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5" /><path d="M9 18h6" /><path d="M10 22h4" />`,shield:`<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />`};function bl(e){let t=e.join(`
|
|
674
|
-
`),n=[...new Set([...t.matchAll(/\bicone\('([a-z0-9-]+)'/g)].map(e=>e[1]))],r=/\betoiles\(/.test(t);return r&&!n.includes(`star`)&&n.push(`star`),{icones:n,avatar:/\bavatar\(/.test(t),etoiles:r,qr:/\bcodeQr\(/.test(t),carrousel:/data-humalis-carrousel/.test(t),carte:/\bcarteLieux\(/.test(t)}}function
|
|
682
|
+
`}function ml(e,t,n){let r=e.logo,i=t?.get(r)?Uint8Array.from(atob(t.get(r)),e=>e.charCodeAt(0)):void 0,a=i&&Kc(i),o={src:`${n}${ll(r)}`,type:fl(r),sizes:a?`${a.largeur}x${a.hauteur}`:`any`};return JSON.stringify({...e.nom?{name:e.nom}:{},icons:[o],display:`browser`},null,2)+`
|
|
683
|
+
`}function hl(e,t,n){let r=new Map;for(let i of[e.logo,e.image]){if(!i||cl(i))continue;let e=t?.get(i);e!==void 0&&r.set(`${n}${ll(i)}`,Vs(e))}return r}function gl(e,t){if(!e.logo)return[`<link rel="icon" href="data:," />`];let n=cl(e.logo)?e.logo:`${t}${ll(e.logo)}`;return[`<link rel="icon" type="${fl(e.logo)}" href="${_l(n)}" />`,...fl(e.logo)===`image/png`?[`<link rel="apple-touch-icon" href="${_l(n)}" />`]:[],`<link rel="manifest" href="${t}manifest.webmanifest" />`]}const _l=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`);function vl(e){return e.flatMap(e=>e.type===`element`?[e.id]:e.type===`formulaire`?[e.id,...vl(e.corps)]:e.type===`bloc`||e.type===`repetition`?vl(e.corps):e.type===`condition`?[...vl(e.alors),...vl(e.sinon)]:[])}function yl(e,t){let n=t?.entete&&!e.sansEntete?t.entete:void 0,r=t?.pied&&!e.sansPied?t.pied:void 0;if(!n&&!r)return e;let i=(e,t)=>({type:`bloc`,genre:e,options:t.options,classes:t.classes,corps:t.ecran.vue,ligne:t.ecran.ligne}),a=[n,r].filter(e=>e!==void 0),o=new Set(e.etat.map(e=>e.nom).concat(e.calculs.map(e=>e.nom))),s=new Set(vl(e.vue));for(let t of a){for(let n of[...t.ecran.etat.map(e=>e.nom),...t.ecran.calculs.map(e=>e.nom)]){if(o.has(n))throw Error(`le nom « ${n} » est utilisé dans la page « ${e.nom} » et dans l'en-tête ou le pied commun : sur un site statique, chaque page recopie l'en-tête, donc leurs noms ne peuvent pas se confondre. Renommez l'une des deux variables.`);o.add(n)}let n=new Set([...e.gestionnaires,...t.ecran.gestionnaires].flatMap(e=>e.cibles));for(let r of vl(t.ecran.vue)){if(s.has(r)&&n.has(r))throw Error(`l'élément « ${r} » existe dans la page « ${e.nom} » et dans l'en-tête ou le pied commun : donnez-lui un autre libellé ou un autre nom (avec nom "…") dans l'un des deux.`);s.add(r)}}return{...e,etat:[...e.etat,...a.flatMap(e=>e.ecran.etat)],calculs:[...e.calculs,...a.flatMap(e=>e.ecran.calculs)],gestionnaires:[...e.gestionnaires,...a.flatMap(e=>e.ecran.gestionnaires)],vue:[...n?[i(`entete`,n)]:[],{type:`bloc`,genre:`contenu`,options:[],classes:[`humalis-page`],corps:e.vue,ligne:e.ligne},...r?[i(`pied`,r)]:[]]}}const bl={"shopping-cart":`<path d="m2.05 2.05 1.099-.028a1 1 0 0 1 1.008.815l2.69 14.347A1 1 0 0 0 7.83 18H18" /><path d="M4.563 5h16.435a1 1 0 0 1 .981 1.204l-1.026 6.226A2 2 0 0 1 18.962 14H6.25" /><circle cx="18" cy="20" r="2" /><circle cx="8" cy="20" r="2" />`,"shopping-bag":`<path d="M16 10a4 4 0 0 1-8 0" /><path d="M3.103 6.034h17.794" /><path d="M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z" />`,house:`<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8" /><path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />`,search:`<path d="m21 21-4.34-4.34" /><circle cx="11" cy="11" r="8" />`,user:`<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" /><circle cx="12" cy="7" r="4" />`,users:`<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /><path d="M16 3.128a4 4 0 0 1 0 7.744" /><path d="M22 21v-2a4 4 0 0 0-3-3.87" /><circle cx="9" cy="7" r="4" />`,menu:`<path d="M4 5h16" /><path d="M4 12h16" /><path d="M4 19h16" />`,x:`<path d="M18 6 6 18" /><path d="m6 6 12 12" />`,plus:`<path d="M5 12h14" /><path d="M12 5v14" />`,minus:`<path d="M5 12h14" />`,check:`<path d="M20 6 9 17l-5-5" />`,star:`<path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" />`,"star-half":`<path d="M12 18.338a2.1 2.1 0 0 0-.987.244L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16l2.309-4.679A.53.53 0 0 1 12 2" />`,heart:`<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5" />`,calendar:`<path d="M8 2v3" /><path d="M16 2v3" /><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M3 9h18" />`,clock:`<circle cx="12" cy="12" r="10" /><path d="M12 6v6l4 2" />`,phone:`<path d="M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384" />`,mail:`<path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" /><rect x="2" y="4" width="20" height="16" rx="2" />`,"map-pin":`<path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" /><circle cx="12" cy="10" r="3" />`,map:`<path d="M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z" /><path d="M15 5.764v15" /><path d="M9 3.236v15" />`,sun:`<circle cx="12" cy="12" r="4" /><path d="M12 2v2" /><path d="M12 20v2" /><path d="m4.93 4.93 1.41 1.41" /><path d="m17.66 17.66 1.41 1.41" /><path d="M2 12h2" /><path d="M20 12h2" /><path d="m6.34 17.66-1.41 1.41" /><path d="m19.07 4.93-1.41 1.41" />`,moon:`<path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" />`,"arrow-right":`<path d="M5 12h14" /><path d="m12 5 7 7-7 7" />`,"arrow-left":`<path d="m12 19-7-7 7-7" /><path d="M19 12H5" />`,"arrow-up":`<path d="m5 12 7-7 7 7" /><path d="M12 19V5" />`,"arrow-down":`<path d="M12 5v14" /><path d="m19 12-7 7-7-7" />`,"chevron-right":`<path d="m9 18 6-6-6-6" />`,"chevron-left":`<path d="m15 18-6-6 6-6" />`,"chevron-up":`<path d="m18 15-6-6-6 6" />`,"chevron-down":`<path d="m6 9 6 6 6-6" />`,info:`<circle cx="12" cy="12" r="10" /><path d="M12 16v-4" /><path d="M12 8h.01" />`,"triangle-alert":`<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" /><path d="M12 9v4" /><path d="M12 17h.01" />`,"circle-x":`<circle cx="12" cy="12" r="10" /><path d="m15 9-6 6" /><path d="m9 9 6 6" />`,"circle-check":`<circle cx="12" cy="12" r="10" /><path d="m16 9-5.5 5.5L8 12" />`,"circle-help":`<circle cx="12" cy="12" r="10" /><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" /><path d="M12 17h.01" />`,settings:`<path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" /><circle cx="12" cy="12" r="3" />`,"log-out":`<path d="m16 17 5-5-5-5" /><path d="M21 12H9" /><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />`,"log-in":`<path d="m10 17 5-5-5-5" /><path d="M15 12H3" /><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4" />`,lock:`<rect width="18" height="11" x="3" y="11" rx="2" ry="2" /><path d="M7 11V7a5 5 0 0 1 10 0v4" />`,key:`<path d="m2 21 9.6-9.6" /><path d="m7.5 15.5 2.3 2.3a1 1 0 0 1 0 1.4l-2.1 2.1a1 1 0 0 1-1.4 0L4 19" /><circle cx="15.5" cy="7.5" r="5.5" />`,eye:`<path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" /><circle cx="12" cy="12" r="3" />`,"eye-off":`<path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" /><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242" /><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" /><path d="m2 2 20 20" />`,"trash-2":`<path d="M10 11v6" /><path d="M14 11v6" /><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" /><path d="M3 6h18" /><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />`,pencil:`<path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" /><path d="m15 5 4 4" />`,copy:`<rect width="14" height="14" x="8" y="8" rx="2" ry="2" /><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />`,download:`<path d="M12 15V3" /><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /><path d="m7 10 5 5 5-5" />`,send:`<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z" /><path d="m21.854 2.147-10.94 10.939" />`,"share-2":`<circle cx="18" cy="5" r="3" /><circle cx="6" cy="12" r="3" /><circle cx="18" cy="19" r="3" /><line x1="8.59" x2="15.42" y1="13.51" y2="17.49" /><line x1="15.41" x2="8.59" y1="6.51" y2="10.49" />`,link:`<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />`,image:`<rect width="18" height="18" x="3" y="3" rx="2" ry="2" /><circle cx="9" cy="9" r="2" /><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />`,camera:`<path d="M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z" /><circle cx="12" cy="13" r="3" />`,video:`<path d="m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5" /><rect x="2" y="6" width="14" height="12" rx="2" />`,music:`<path d="M21 16V3a1 1 0 0 0-1.28-.96l-10 2.917a1 1 0 0 0-.72.96V19" /><circle cx="18" cy="16" r="3" /><circle cx="6" cy="19" r="3" />`,"book-open":`<path d="M12 5v16" /><path d="M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z" />`,"file-text":`<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" />`,folder:`<path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />`,funnel:`<path d="M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z" />`,"arrow-up-down":`<path d="m21 16-4 4-4-4" /><path d="M17 20V4" /><path d="m3 8 4-4 4 4" /><path d="M7 4v16" />`,list:`<path d="M3 5h.01" /><path d="M3 12h.01" /><path d="M3 19h.01" /><path d="M8 5h13" /><path d="M8 12h13" /><path d="M8 19h13" />`,"layout-grid":`<rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="14" y="3" rx="1" /><rect width="7" height="7" x="14" y="14" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" />`,bell:`<path d="M10.268 21a2 2 0 0 0 3.464 0" /><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326" />`,"message-circle":`<path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719" />`,"messages-square":`<path d="M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" /><path d="M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1" />`,utensils:`<path d="M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2" /><path d="M7 2v20" /><path d="M21 15V2a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7" />`,coffee:`<path d="M10 2v2" /><path d="M14 2v2" /><path d="M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1" /><path d="M6 2v2" />`,wine:`<path d="M8 22h8" /><path d="M7 10h10" /><path d="M12 15v7" /><path d="M12 15a5 5 0 0 0 5-5c0-2-.5-4-2-8H9c-1.5 4-2 6-2 8a5 5 0 0 0 5 5Z" />`,fish:`<path d="M6.5 12c.94-3.46 4.94-6 8.5-6 3.56 0 6.06 2.54 7 6-.94 3.47-3.44 6-7 6s-7.56-2.53-8.5-6Z" /><path d="M18 12v.5" /><path d="M16 17.93a9.77 9.77 0 0 1 0-11.86" /><path d="M7 10.67C7 8 5.58 5.97 2.73 5.5c-1 1.5-1 5 .23 6.5-1.24 1.5-1.24 5-.23 6.5C5.58 18.03 7 16 7 13.33" /><path d="M10.46 7.26C10.2 5.88 9.17 4.24 8 3h5.8a2 2 0 0 1 1.98 1.67l.23 1.4" /><path d="m16.01 17.93-.23 1.4A2 2 0 0 1 13.8 21H9.5a5.96 5.96 0 0 0 1.49-3.98" />`,leaf:`<path d="M11 20a10 10 0 0010-10 25.9 25.9 0 00-1.04-7.281 1 1 0 00-1.755-.325C15.833 5.5 13 5.5 9.8 6.1A7 7 0 0011 20" /><path d="M2 21a5 5 0 012.911-4.544C7.613 15.212 8.351 15.24 11 13" />`,flame:`<path d="M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4" />`,droplet:`<path d="M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z" />`,waves:`<path d="M2 12q2.5 2 5 0t5 0 5 0 5 0" /><path d="M2 19q2.5 2 5 0t5 0 5 0 5 0" /><path d="M2 5q2.5 2 5 0t5 0 5 0 5 0" />`,car:`<path d="M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2" /><circle cx="7" cy="17" r="2" /><path d="M9 17h6" /><circle cx="17" cy="17" r="2" />`,bike:`<circle cx="18.5" cy="17.5" r="3.5" /><circle cx="5.5" cy="17.5" r="3.5" /><circle cx="15" cy="5" r="1" /><path d="M12 17.5V14l-3-3 4-3 2 3h2" />`,plane:`<path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z" />`,ship:`<path d="M12 2v2" /><path d="M12 9.189V13" /><path d="M19 12V6a2 2 0 00-2-2H7a2 2 0 00-2 2v6" /><path d="M19.38 19A11.6 11.6 0 0021 13l-8.188-3.639a2 2 0 00-1.624 0L3 13.001a11.6 11.6 0 002.81 7.76" /><path d="M2 20c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1" />`,"train-front":`<path d="M8 3.1V7a4 4 0 0 0 8 0V3.1" /><path d="m9 15-1-1" /><path d="m15 15 1-1" /><path d="M9 19c-2.8 0-5-2.2-5-5v-4a8 8 0 0 1 16 0v4c0 2.8-2.2 5-5 5Z" /><path d="m8 19-2 3" /><path d="m16 19 2 3" />`,"credit-card":`<rect width="20" height="14" x="2" y="5" rx="2" /><line x1="2" x2="22" y1="10" y2="10" /><path d="M6 14h2" />`,banknote:`<rect width="20" height="12" x="2" y="6" rx="2" /><circle cx="12" cy="12" r="2" /><path d="M6 12h.01M18 12h.01" />`,gift:`<path d="M12 7v14" /><path d="M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8" /><path d="M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5" /><rect x="3" y="7" width="18" height="4" rx="1" />`,tag:`<path d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z" /><circle cx="7.5" cy="7.5" r=".5" fill="currentColor" />`,award:`<path d="m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526" /><circle cx="12" cy="8" r="6" />`,trophy:`<path d="M10 14.66V17a1 1 0 0 1-1 1 2 2 0 0 0-2 2v2" /><path d="M14 14.66V17a1 1 0 0 0 1 1 2 2 0 0 1 2 2v2" /><path d="M17.916 10H19.5A2.5 2.5 0 0 0 22 7.5V5a1 1 0 0 0-1-1h-3" /><path d="M4 22h16" /><path d="M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z" /><path d="M6.084 10H4.5A2.5 2.5 0 0 1 2 7.5V5a1 1 0 0 1 1-1h3" />`,zap:`<path d="M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z" />`,globe:`<circle cx="12" cy="12" r="10" /><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" /><path d="M2 12h20" />`,wifi:`<path d="M12 20h.01" /><path d="M2 8.82a15 15 0 0 1 20 0" /><path d="M5 12.859a10 10 0 0 1 14 0" /><path d="M8.5 16.429a5 5 0 0 1 7 0" />`,battery:`<path d="M 22 14 L 22 10" /><rect x="2" y="6" width="16" height="12" rx="2" />`,smartphone:`<rect width="14" height="20" x="5" y="2" rx="2" ry="2" /><path d="M12 18h.01" />`,monitor:`<rect width="20" height="14" x="2" y="3" rx="2" /><line x1="8" x2="16" y1="21" y2="21" /><line x1="12" x2="12" y1="17" y2="21" />`,printer:`<path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2" /><path d="M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6" /><rect x="6" y="14" width="12" height="8" rx="1" />`,mic:`<path d="M12 19v3" /><path d="M19 10v2a7 7 0 0 1-14 0v-2" /><rect x="9" y="2" width="6" height="13" rx="3" />`,"volume-2":`<path d="M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z" /><path d="M16 9a5 5 0 0 1 0 6" /><path d="M19.364 18.364a9 9 0 0 0 0-12.728" />`,"volume-x":`<path d="M11 4.702a.7.7 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.7.7 0 0 0 11 19.298z" /><path d="m16.5 14.5 5-5" /><path d="m16.5 9.5 5 5" />`,play:`<path d="M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z" />`,pause:`<rect x="14" y="3" width="5" height="18" rx="1" /><rect x="5" y="3" width="5" height="18" rx="1" />`,square:`<rect width="18" height="18" x="3" y="3" rx="2" />`,"refresh-cw":`<path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" /><path d="M21 3v5h-5" /><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" /><path d="M8 16H3v5" />`,"circle-plus":`<circle cx="12" cy="12" r="10" /><path d="M8 12h8" /><path d="M12 8v8" />`,"circle-minus":`<circle cx="12" cy="12" r="10" /><path d="M8 12h8" />`,ellipsis:`<circle cx="12" cy="12" r="1" /><circle cx="19" cy="12" r="1" /><circle cx="5" cy="12" r="1" />`,"ellipsis-vertical":`<circle cx="12" cy="12" r="1" /><circle cx="12" cy="5" r="1" /><circle cx="12" cy="19" r="1" />`,pin:`<path d="M12 17v5" /><path d="M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" />`,flag:`<path d="M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528" />`,bookmark:`<path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" />`,lightbulb:`<path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5" /><path d="M9 18h6" /><path d="M10 22h4" />`,shield:`<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />`};function xl(e){let t=e.join(`
|
|
684
|
+
`),n=[...new Set([...t.matchAll(/\bicone\('([a-z0-9-]+)'/g)].map(e=>e[1]))],r=/\betoiles\(/.test(t);return r&&!n.includes(`star`)&&n.push(`star`),{icones:n,avatar:/\bavatar\(/.test(t),etoiles:r,qr:/\bcodeQr\(/.test(t),carrousel:/data-humalis-carrousel/.test(t),carte:/\bcarteLieux\(/.test(t)}}function Sl(e){return[...e.icones.length>0?[`icone`]:[],...e.avatar?[`avatar`]:[],...e.etoiles?[`etoiles`]:[],...e.qr?[`codeQr`]:[],...e.carte?[`carteLieux`]:[]]}function Cl(e){let t=[];if(e.icones.length>0){let n=e.icones.map(e=>` ${JSON.stringify(e)}: ${JSON.stringify(bl[e]??bl[`circle-help`])},`).join(`
|
|
675
685
|
`);t.push(`
|
|
676
686
|
// ─── Les icônes (tracés de Lucide, licence ISC) ─────────────────────────
|
|
677
687
|
|
|
@@ -866,7 +876,7 @@ ${n}
|
|
|
866
876
|
}, 0);
|
|
867
877
|
return element;
|
|
868
878
|
}
|
|
869
|
-
`),t.join(``)}const
|
|
879
|
+
`),t.join(``)}const wl=String.raw`/**
|
|
870
880
|
* La géométrie d'un graphique, écrite par Humalis sans bibliothèque : à partir
|
|
871
881
|
* de la liste et du réglage du graphique, les formes à dessiner, la légende et
|
|
872
882
|
* la table de données. Une fonction pure : les mêmes données donnent les mêmes
|
|
@@ -1087,7 +1097,7 @@ function camembert(resultat, serie, libelles, valeurs, formater, nomEtiquettes)
|
|
|
1087
1097
|
});
|
|
1088
1098
|
return resultat;
|
|
1089
1099
|
}
|
|
1090
|
-
`,
|
|
1100
|
+
`,Tl=String.raw`/** Un texte du programme ou des données, sans danger dans le HTML. */
|
|
1091
1101
|
function echapperGraphique(texte) {
|
|
1092
1102
|
return String(texte).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
1093
1103
|
}
|
|
@@ -1132,16 +1142,16 @@ function htmlDuGraphique(config, lignes, formater) {
|
|
|
1132
1142
|
const etroit = calculerGraphique(config, lignes, formater, 400);
|
|
1133
1143
|
return ouverture + dessinHtml(config, large, 'l', 'humalis-graphique-large') + dessinHtml(config, etroit, 'e', 'humalis-graphique-etroit') + legendeHtml(large.legende) + tableHtml(large.table) + '</figure>';
|
|
1134
1144
|
}
|
|
1135
|
-
`,
|
|
1145
|
+
`,El=Function(`${wl}\n${Tl}\nreturn { calculerGraphique, graduations, htmlDuGraphique, PALETTE_GRAPHIQUE };`)();El.calculerGraphique,El.graduations;const Dl=El.htmlDuGraphique;El.PALETTE_GRAPHIQUE;function Ol(e){return{id:e.id,genre:e.genre,...e.etiquette===void 0?{}:{etiquette:W(e.etiquette)},nomEtiquettes:e.nomEtiquettes,series:e.series.map(e=>({nom:e.nom,...e.valeur===void 0?{}:{valeur:W(e.valeur)},...e.couleur?{couleur:e.couleur}:{}})),...e.devise?{devise:e.devise}:{},...e.proportions?{proportions:e.proportions}:{},titre:e.titre,...e.classes.length>0?{classes:e.classes.join(` `)}:{}}}function kl(e,t){let n=(e,t)=>e?ac(e,G):G(t),r=Object.entries(Ol(e)).map(([t,r])=>t===`titre`?`${t}: ${n(e.titreLangues,e.titre)}`:t===`nomEtiquettes`?`${t}: ${n(e.nomEtiquettesLangues,e.nomEtiquettes)}`:t===`series`&&e.series.some(e=>e.nomLangues)?`${t}: [${e.series.map(e=>`{ nom: ${n(e.nomLangues,e.nom)}${e.valeur===void 0?``:`, valeur: ${G(W(e.valeur))}`}${e.couleur?`, couleur: ${G(e.couleur)}`:``} }`).join(`, `)}]`:`${t}: ${Ml(r)}`);return e.etiquettes&&r.push(`etiquettes: ${t(e.etiquettes)}`),r.push(`description: ${t(e.description)}`),`humalisGraphique.dessiner({ ${r.join(`, `)} }, ${t(e.liste)})`}function Al(e,t,n){let r=Ol(e),i=t(e.liste);if(i===void 0)return`<figure class="humalis-graphique" data-humalis="${e.id}"></figure>`;let a=e.etiquettes?t(e.etiquettes):void 0,o=r.devise?e=>Fo(e,r.devise):e=>No(e);return Dl({...r,...a===void 0?{}:{etiquettes:a},description:n(e.description)},i,o)}const jl=`// Produit par Humalis : les graphiques du site, dessinés en SVG sans bibliothèque.
|
|
1136
1146
|
// Le HTML de départ de chaque page a été écrit avec ces mêmes fonctions : le
|
|
1137
1147
|
// dessin du script est identique. Tout texte (libellés, description) est
|
|
1138
1148
|
// échappé avant d'entrer dans le HTML ; les nombres passent par isFinite.
|
|
1139
1149
|
'use strict';
|
|
1140
1150
|
|
|
1141
1151
|
const humalisGraphique = (() => {
|
|
1142
|
-
${
|
|
1152
|
+
${Nl(wl)}
|
|
1143
1153
|
|
|
1144
|
-
${
|
|
1154
|
+
${Nl(Tl)}
|
|
1145
1155
|
|
|
1146
1156
|
/** Les valeurs au format du graphique : sa devise, sinon le format français des nombres. */
|
|
1147
1157
|
function formateur(devise) {
|
|
@@ -1157,7 +1167,7 @@ ${Ml(wl)}
|
|
|
1157
1167
|
|
|
1158
1168
|
return { dessiner };
|
|
1159
1169
|
})();
|
|
1160
|
-
`;function
|
|
1170
|
+
`;function Ml(e){return typeof e==`string`?G(e):Array.isArray(e)?`[${e.map(Ml).join(`, `)}]`:typeof e==`object`&&e?`{ ${Object.entries(e).map(([e,t])=>`${e}: ${Ml(t)}`).join(`, `)} }`:String(e)}function Nl(e){return e.replace(/^(?=.)/gm,` `).trimEnd()}`${wl}`;function Pl(e,t=[]){return e.some(e=>/humalis-graphique\b|<Graphique\b|humalisGraphique\./.test(e))?`
|
|
1161
1171
|
/* Les graphiques : du SVG écrit par Humalis, à la largeur de son conteneur. */
|
|
1162
1172
|
.humalis-graphique { margin: 1rem 0; width: 100%; box-sizing: border-box; container: humalis-graphique / inline-size; }
|
|
1163
1173
|
.humalis-graphique > svg { display: block; width: 100%; height: auto; overflow: visible; }
|
|
@@ -1184,8 +1194,8 @@ ${[...new Set([...Object.keys(Qa),...t])].map(e=>`.humalis-graphique-c-${e} { --
|
|
|
1184
1194
|
.humalis-graphique-donnees th, .humalis-graphique-donnees td { padding: 0.25rem 1rem 0.25rem 0; border-bottom: 1px solid rgb(138 138 144 / 0.35); text-align: left; }
|
|
1185
1195
|
.humalis-graphique-donnees td { text-align: right; font-variant-numeric: tabular-nums; }
|
|
1186
1196
|
.humalis-graphique-vide { margin: 0; padding: 1rem; border: 1px dashed rgb(138 138 144 / 0.6); border-radius: 0.5rem; }
|
|
1187
|
-
`:``}const
|
|
1188
|
-
`)}\n`}const
|
|
1197
|
+
`:``}const Fl={aucune:`0`,petite:`0.5rem`,moyenne:`1rem`,grande:`2rem`},Il={debut:`flex-start`,centree:`center`,fin:`flex-end`,etire:`stretch`},Ll={debut:`flex-start`,centree:`center`,fin:`flex-end`,entre:`space-between`,autour:`space-around`},Rl={etroite:`36rem`,normale:`48rem`,large:`72rem`,pleine:`none`},zl={aucune:`none`,legere:`0 1px 3px rgb(0 0 0 / 0.15)`,moyenne:`0 4px 12px rgb(0 0 0 / 0.2)`,forte:`0 12px 32px rgb(0 0 0 / 0.3)`},Bl={douce:`0.5rem`,ronde:`50%`},Vl={diagonale:`135deg`,vertical:`180deg`,horizontal:`90deg`};function Hl(e){let t=new Set,n=/humalis-(colonnes|espacement|remplissage|alignement|repartition|largeur|ombre|degrade|colle|bordure|sur|defilement|hauteur|fixe)-([a-z0-9_-]+)/g;for(let r of e)for(let e of r.matchAll(n))t.add(`${e[1]}-${e[2]}`);return t}function Ul(e){let t=Hl(e),n=[];if(e.some(e=>e.includes(`humalis-accent`))&&n.push(`.humalis-accent { color: var(--humalis-marque, currentColor); }`),e.some(e=>e.includes(`humalis-code-ligne`))&&n.push(`.humalis-code-ligne { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; padding: 0.1em 0.25em; border-radius: 0.2em; background: rgb(127 127 127 / 0.12); }`),e.some(e=>e.includes(`humalis-bloc-code`))&&n.push(`.humalis-bloc-code-conteneur { position: relative; max-width: 100%; overflow-x: auto; } .humalis-bloc-code { overflow-x: auto; padding: 1rem; border-radius: 0.5rem; background: rgb(127 127 127 / 0.12); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; white-space: pre; } .humalis-bloc-code-conteneur button { position: absolute; top: 0.5rem; right: 0.5rem; }`),e.some(e=>e.includes(`humalis-code-mot`))&&n.push(`.humalis-code-mot { color: #7348c3; font-weight: 600; } .humalis-code-texte { color: #147d50; } .humalis-code-commentaire { color: #68717d; } .humalis-code-nombre { color: #b25215; }`),e.some(e=>e.includes(`humalis-tableau-conteneur`))&&n.push(`.humalis-tableau-conteneur { max-width: 100%; overflow-x: auto; } .humalis-tableau-conteneur table { border-collapse: collapse; width: 100%; } .humalis-tableau-conteneur th, .humalis-tableau-conteneur td { border: 1px solid rgb(127 127 127 / 0.3); padding: 0.5rem; text-align: left; } .humalis-tableau-conteneur caption { text-align: left; font-weight: 700; margin-bottom: 0.5rem; }`),e.some(e=>e.includes(`humalis-liste`))&&n.push(`.humalis-liste { padding-inline-start: 1.5rem; } .humalis-liste > li { margin-block: 0.35rem; }`),e.some(e=>/humalis-entete\b/.test(e))&&(n.push(`.humalis-entete { padding: 0.75rem 1rem; border-bottom: 1px solid rgb(138 138 144 / 0.4); }`),n.push(`.humalis-aller-au-contenu { position: absolute; left: 0.5rem; top: -4rem; z-index: 1000; padding: 0.5rem 1rem; border-radius: 0.5rem; background: Canvas; color: CanvasText; }`),n.push(`.humalis-aller-au-contenu:focus { top: 0.5rem; }`)),e.some(e=>e.includes(`humalis-menu-vertical`))&&n.push(`.humalis-menu-vertical { flex-direction: column; flex-wrap: nowrap; align-items: stretch; }`),e.some(e=>e.includes(`humalis-menu-repliable`))&&(n.push(`.humalis-menu-bouton { display: none; }`),n.push(`.humalis-menu-bouton { align-items: center; justify-content: center; width: 2.5rem; height: 2.5rem; padding: 0; }`),n.push(`.humalis-menu-icone { position: relative; display: block; width: 1.125rem; height: 2px; border-radius: 2px; background: currentColor; box-shadow: 0 -6px 0 currentColor, 0 6px 0 currentColor; }`),n.push(`.humalis-menu-bouton[aria-expanded="true"] .humalis-menu-icone { box-shadow: none; transform: rotate(45deg); }`),n.push(`.humalis-menu-bouton[aria-expanded="true"] .humalis-menu-icone::after { content: ""; position: absolute; inset: 0; border-radius: inherit; background: currentColor; transform: rotate(-90deg); }`),n.push(`@media (max-width: 720px) { .humalis-menu-repliable { flex-direction: column; align-items: stretch; } .humalis-menu-bouton { display: inline-flex; align-self: flex-start; } .humalis-menu-repliable:not([data-ouvert]) > :not(.humalis-menu-bouton) { display: none; } }`)),e.some(e=>/humalis-pied\b/.test(e))&&n.push(`.humalis-pied { padding: 1.5rem 1rem; margin-top: 2rem; border-top: 1px solid rgb(138 138 144 / 0.4); }`),t.size===0&&n.length===0)return``;let r=[],i=!1;for(let e of[...t].sort()){let[,t,a]=/^([a-z]+)-(.+)$/.exec(e),o=`.humalis-${t}-${a}`;switch(t){case`colonnes`:{let e=Number(a);n.push(`.humalis-grille${o} { grid-template-columns: repeat(${e}, minmax(0, 1fr)); }`),e>2&&r.push(`@media (max-width: 1023px) { .humalis-grille${o} { grid-template-columns: repeat(2, minmax(0, 1fr)); } }`),e>1&&r.push(`@media (max-width: 639px) { .humalis-grille${o} { grid-template-columns: minmax(0, 1fr); } }`);break}case`espacement`:a in Fl&&n.push(`${o} { gap: ${Fl[a]}; }`);break;case`remplissage`:a in Fl&&n.push(`${o} { padding: ${Fl[a]}; }`);break;case`alignement`:a in Il&&n.push(`${o} { align-items: ${Il[a]}; }`);break;case`repartition`:a in Ll&&n.push(`${o} { justify-content: ${Ll[a]}; }`);break;case`largeur`:a in Rl&&n.push(`${o} { max-width: ${Rl[a]}; margin-left: auto; margin-right: auto; }`);break;case`ombre`:a in zl&&n.push(`${o} { box-shadow: ${zl[a]}; }`);break;case`bordure`:a in Bl&&n.push(`${o} { border-radius: ${Bl[a]}; }`);break;case`colle`:n.push(a===`bas`?`${o} { position: sticky; bottom: 0; z-index: 5; background: var(--humalis-page); }`:`${o} { position: sticky; top: 0; z-index: 5; background: var(--humalis-page); }`);break;case`degrade`:{let e=/^([a-z0-9_]+)-([a-z0-9_]+)-(diagonale|vertical|horizontal)$/.exec(a);e&&n.push(`${o} { background: linear-gradient(${Vl[e[3]]}, var(--humalis-${e[1]}), var(--humalis-${e[2]})); color: var(--humalis-${e[1]}-encre); }`);break}case`sur`:i=!0;break;case`defilement`:a===`interne`&&n.push(`${o} { overflow-y: auto; overscroll-behavior: contain; min-height: 0; max-height: 100%; align-self: stretch; scrollbar-width: thin; }`);break;case`hauteur`:a===`ecran`&&n.push(`${o} { height: calc(100dvh - var(--humalis-hauteur-entete, 0px)); min-height: 0; overflow: auto; }`);break;case`fixe`:n.push(`header${o} { position: fixed; top: 0; left: 0; right: 0; z-index: 50; background: var(--humalis-page); }`),n.push(`html:has(#racine > .humalis-fixe-oui), html:has(#racine > .humalis-fixe-oui) body { height: 100%; overflow: hidden; }`),n.push(`#racine:has(> .humalis-fixe-oui) { position: fixed; top: var(--humalis-hauteur-entete, 0px); left: 0; right: 0; bottom: 0; overflow-y: auto; overscroll-behavior: contain; }`),n.push(`body:has(header.humalis-fixe-oui) { padding-top: var(--humalis-hauteur-entete, 0px); }`)}}return i&&(n.unshift(`.humalis-appareil { display: none; }`),r.push(`@media (max-width: 639px) { .humalis-sur-telephone { display: contents; } }`,`@media (min-width: 640px) and (max-width: 1023px) { .humalis-sur-tablette { display: contents; } }`,`@media (min-width: 1024px) { .humalis-sur-ordinateur { display: contents; } }`)),`\n/* Les réglages de mise en page utilisés par cette application. */\n${[...n,...r].join(`
|
|
1198
|
+
`)}\n`}const Wl={carte:`.humalis-carte { margin: 1rem 0; }
|
|
1189
1199
|
.humalis-carte-zone { position: relative; z-index: 0; height: 24rem; max-height: 70vh; border-radius: 0.5rem; overflow: hidden; }
|
|
1190
1200
|
/* Le style des liens de la page ne doit pas déformer les commandes et l'attribution de Leaflet. */
|
|
1191
1201
|
.humalis-page .humalis-carte .leaflet-control-attribution a { display: inline; width: auto; margin: 0; }
|
|
@@ -1248,11 +1258,11 @@ button.humalis-etoile { cursor: pointer; }
|
|
|
1248
1258
|
.humalis-fil li { display: flex; align-items: center; }
|
|
1249
1259
|
.humalis-fil li + li::before { content: "/"; margin-right: 0.5rem; opacity: 0.6; }
|
|
1250
1260
|
.humalis-fil li > * { margin: 0; }
|
|
1251
|
-
.humalis-page .humalis-fil a { display: inline; margin: 0; }`};function
|
|
1252
|
-
`)}\n`}function
|
|
1253
|
-
`),n=[];return/humalis-fenetre|<Fenetre\b|confirmer\(/.test(t)&&n.push(
|
|
1254
|
-
.humalis-sentinelle { height: 1px; }`),/humalis-deplacable|useDeplacement\(/.test(t)&&n.push(
|
|
1255
|
-
`)}\n`:``}const
|
|
1261
|
+
.humalis-page .humalis-fil a { display: inline; margin: 0; }`};function Gl(e){let t=Object.entries(Wl).filter(([t])=>e.some(e=>RegExp(`humalis-${t}\\b`).test(e))).map(([,e])=>e);return t.length===0?``:`\n/* Les éléments d'écran utilisés par cette application. */\n${t.join(`
|
|
1262
|
+
`)}\n`}function Kl(e){switch(e.type){case`optimiste`:return[e.corps];case`essayer`:return[e.corps,e.siErreur];case`si`:return[e.alors,e.sinon];case`repetition`:case`tantQue`:case`repeter`:return[e.corps];case`selon`:return[...e.cas.map(e=>e.corps),e.sinon];case`minuterie`:return[e.corps];case`confirmation`:return[e.alors,e.sinon];case`message`:return e.action?[e.action.actions]:[];default:return[]}}const ql={entree:[`Enter`,`Entrée`],echap:[`Escape`,`Échap`],espace:[`Space`,`Espace`],tab:[`Tab`,`Tab`],suppr:[`Delete`,`Suppr`],retour:[`Backspace`,`Retour arrière`],haut:[`ArrowUp`,`↑`],bas:[`ArrowDown`,`↓`],gauche:[`ArrowLeft`,`←`],droite:[`ArrowRight`,`→`],debut:[`Home`,`Début`],fin:[`End`,`Fin`],plus:[`+`,`+`],moins:[`-`,`-`]};function Jl(e){let t=e.split(`+`),n=t.pop(),[r,i]=ql[n]??[n.toUpperCase(),n.toUpperCase()],a=e=>[...t.map(t=>t===`controle`?e:t===`maj`?`Shift`:`Alt`),r].join(`+`);return{aria:t.includes(`controle`)?`${a(`Control`)} ${a(`Meta`)}`:a(`Control`),texte:[...t.map(e=>e===`controle`?`Ctrl`:e===`maj`?`Maj`:`Alt`),i].join(`+`)}}function Yl(e){let t=e.join(`
|
|
1263
|
+
`),n=[];return/humalis-fenetre|<Fenetre\b|confirmer\(/.test(t)&&n.push(Zl),/humalis-voir-plus/.test(t)&&n.push(`.humalis-voir-plus { display: block; margin: 1rem auto; }
|
|
1264
|
+
.humalis-sentinelle { height: 1px; }`),/humalis-deplacable|useDeplacement\(/.test(t)&&n.push(Ql),/humalis-annonce-cachee/.test(t)&&n.push(Xl),n.length?`\n/* Les interactions (fenêtres, « Voir plus », glisser-déposer). */\n${n.join(`
|
|
1265
|
+
`)}\n`:``}const Xl=`.humalis-annonce-cachee { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }`,Zl=`html.humalis-fenetre-ouverte { overflow: hidden; }
|
|
1256
1266
|
.humalis-fenetre { border: none; border-radius: 0.75rem; padding: 0; max-width: min(32rem, calc(100% - 2rem)); background: var(--humalis-page); color: var(--humalis-encre); box-shadow: 0 12px 40px rgb(0 0 0 / 0.3); }
|
|
1257
1267
|
.humalis-fenetre::backdrop { background: rgb(0 0 0 / 0.45); }
|
|
1258
1268
|
.humalis-fenetre-contenu, .humalis-confirmation { position: relative; padding: 1.5rem; }
|
|
@@ -1263,14 +1273,14 @@ button.humalis-etoile { cursor: pointer; }
|
|
|
1263
1273
|
@media (prefers-reduced-motion: no-preference) {
|
|
1264
1274
|
.humalis-fenetre[open] { animation: humalis-fondu 150ms ease-out; }
|
|
1265
1275
|
@keyframes humalis-fondu { from { opacity: 0; transform: translateY(0.5rem); } }
|
|
1266
|
-
}`,
|
|
1276
|
+
}`,Ql=`.humalis-liste-deplacable { list-style: none; margin: 0; padding: 0; }
|
|
1267
1277
|
.humalis-deplacable { touch-action: none; cursor: grab; user-select: none; border-radius: 0.375rem; }
|
|
1268
1278
|
.humalis-deplacable:focus-visible { outline: 2px solid var(--humalis-bleu); outline-offset: 2px; }
|
|
1269
1279
|
.humalis-pris { cursor: grabbing; opacity: 0.6; }
|
|
1270
1280
|
.humalis-insertion-avant { box-shadow: 0 -3px 0 var(--humalis-bleu); }
|
|
1271
1281
|
.humalis-insertion-apres { box-shadow: 0 3px 0 var(--humalis-bleu); }
|
|
1272
|
-
${
|
|
1273
|
-
`)}\n}\n`}const
|
|
1282
|
+
${Xl}`,$l={courte:`150ms`,moyenne:`300ms`,longue:`600ms`},eu={courte:`100ms`,moyenne:`250ms`,longue:`500ms`},tu={apparition:`from { opacity: 0; }`,montee:`from { opacity: 0; transform: translateY(1rem); }`,agrandissement:`from { opacity: 0; transform: scale(0.95); }`};function nu(e){let t=new Set;for(let n of e)for(let e of n.matchAll(/humalis-(animation|duree|delai|transition|effet)-([a-z]+)/g))t.add(`${e[1]}-${e[2]}`);return t}function ru(e){if(!e.frappe)return;let t=0;for(let n of e.code)t=t*31+n.charCodeAt(0)>>>0;return{classe:`humalis-animation-frappe`,frappe:e.frappe,cle:`${e.ligne}-${t.toString(36)}`}}const iu=e=>e.some(e=>e.includes(`humalis-animation-defilement`)||e.includes(`humalis-animation-frappe`));function au(e){let t=nu(e);if(t.size===0)return``;let n=[];for(let e of[...t].sort()){let[t,r]=e.split(`-`),i=`.humalis-${e}`;t===`animation`&&tu[r]?(n.push(`${i} { animation: humalis-${r} var(--humalis-duree, 300ms) ease-out var(--humalis-delai, 0ms) backwards; }`),n.push(`@keyframes humalis-${r} { ${tu[r]} }`)):t===`animation`&&r===`defilement`?(n.push(`.humalis-animation-defilement:not([data-humalis-vu]) { animation: none; }`),n.push(`.humalis-js .humalis-animation-defilement:not([data-humalis-vu]) { opacity: 0; }`)):t===`animation`&&r===`frappe`?(n.push(`.humalis-animation-frappe { position: relative; }`),n.push(`.humalis-js .humalis-animation-frappe:not([data-humalis-tape="fini"]) > code:not(.humalis-frappe-copie), .humalis-js .humalis-animation-frappe:not([data-humalis-tape="fini"]) > code:not(.humalis-frappe-copie) * { color: transparent; }`),n.push(`.humalis-frappe-copie { position: absolute; inset: 0; padding: inherit; overflow: hidden; pointer-events: none; }`),n.push(`.humalis-frappe-copie::after { content: ""; display: inline-block; width: 0.55em; height: 1.1em; margin-left: 1px; vertical-align: text-bottom; background: currentColor; animation: humalis-curseur 1s steps(1) infinite; }`),n.push(`@keyframes humalis-curseur { 50% { opacity: 0; } }`)):t===`duree`&&$l[r]?n.push(`${i} { --humalis-duree: ${$l[r]}; }`):t===`delai`&&eu[r]?n.push(`${i} { --humalis-delai: ${eu[r]}; }`):t===`transition`&&r===`douce`?n.push(`${i} { transition: color 200ms ease, background-color 200ms ease, border-color 200ms ease, box-shadow 200ms ease, opacity 200ms ease, transform 200ms ease; }`):t===`effet`&&r===`leve`?(n.push(`${i} { transition: transform 200ms ease, box-shadow 200ms ease; }`),n.push(`${i}:hover, ${i}:focus-within, ${i}:active { transform: translateY(-0.25rem); box-shadow: 0 8px 20px rgb(0 0 0 / 0.18); }`)):t===`effet`&&r===`agrandi`&&(n.push(`${i} { transition: transform 200ms ease; }`),n.push(`${i}:hover, ${i}:focus-within, ${i}:active { transform: scale(1.03); }`))}if(t.has(`animation-cascade`)){n.push(`.humalis-animation-cascade.humalis-animation-cascade { animation: none; }`);for(let e of Object.keys(tu).filter(e=>t.has(`animation-${e}`)))n.push(`.humalis-animation-cascade.humalis-animation-${e} > * { animation: humalis-${e} var(--humalis-duree, 300ms) ease-out var(--humalis-delai, 0ms) backwards; }`);for(let e=2;e<=12;e++)n.push(`.humalis-animation-cascade > :nth-child(${e}) { --humalis-delai: ${(e-1)*80}ms; }`);n.push(`.humalis-animation-cascade:not([data-humalis-vu]) > * { animation: none; }`)}return n.length===0?``:`\n/* Le mouvement : seulement si l'appareil ne demande pas de réduire les animations. */\n@media (prefers-reduced-motion: no-preference) {\n${n.map(e=>` ${e}`).join(`
|
|
1283
|
+
`)}\n}\n`}const ou=`function observerLeDefilement() {
|
|
1274
1284
|
if (!('IntersectionObserver' in window)) return;
|
|
1275
1285
|
const reduire = matchMedia('(prefers-reduced-motion: reduce)');
|
|
1276
1286
|
const montrer = (element) => element.setAttribute('data-humalis-vu', '');
|
|
@@ -1361,12 +1371,30 @@ ${Yl}`,Ql={courte:`150ms`,moyenne:`300ms`,longue:`600ms`},$l={courte:`100ms`,moy
|
|
|
1361
1371
|
// Les éléments affichés plus tard (un « si », une liste reçue) sont suivis aussi.
|
|
1362
1372
|
new MutationObserver(suivre).observe(document.body, { childList: true, subtree: true });
|
|
1363
1373
|
reduire.addEventListener('change', suivre);
|
|
1364
|
-
}`;`${
|
|
1365
|
-
|
|
1366
|
-
|
|
1374
|
+
}`;`${ou.replace(`function observerLeDefilement() {`,`export function observerLeDefilement(): void {`).replace(`(element) =>`,`(element: Element) =>`).replace(`const etats = new Map();`,`const etats = new Map<string | null, { ecrites: number; fini: boolean }>();`).replace(`(pre) =>`,`(pre: Element) =>`).replace(`code.cloneNode(true);`,`code.cloneNode(true) as HTMLElement;`).replace(`const morceaux = [];`,`const morceaux: [Text, string][] = [];`).replace(`const noeud = parcours.currentNode;`,`const noeud = parcours.currentNode as Text;`)}`;const su=`function suivreLaHauteurDeLEntete() {
|
|
1375
|
+
const entete = () => document.querySelector('header.humalis-fixe-oui, header.humalis-colle-haut');
|
|
1376
|
+
const regler = () => {
|
|
1377
|
+
const e = entete();
|
|
1378
|
+
document.documentElement.style.setProperty('--humalis-hauteur-entete', e ? e.offsetHeight + 'px' : '0px');
|
|
1379
|
+
};
|
|
1380
|
+
regler();
|
|
1381
|
+
addEventListener('resize', regler);
|
|
1382
|
+
if (!('ResizeObserver' in window)) return;
|
|
1383
|
+
const observateur = new ResizeObserver(regler);
|
|
1384
|
+
const suivre = () => {
|
|
1385
|
+
const e = entete();
|
|
1386
|
+
if (e) observateur.observe(e);
|
|
1387
|
+
regler();
|
|
1388
|
+
};
|
|
1389
|
+
suivre();
|
|
1390
|
+
// L'en-tête peut apparaître après le chargement (le web le dessine après le script).
|
|
1391
|
+
new MutationObserver(suivre).observe(document.body, { childList: true, subtree: true });
|
|
1392
|
+
}`,cu=e=>e.some(e=>e.includes(`humalis-fixe-oui`)||e.includes(`humalis-hauteur-ecran`));`${su.replace(`function suivreLaHauteurDeLEntete() {`,`export function suivreLaHauteurDeLEntete(): void {`).replace(`const entete = () => document.querySelector(`,`const entete = () => document.querySelector<HTMLElement>(`)}`;const lu=`humalis-theme`,uu=`system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif`,du={etroite:`36rem`,normale:`48rem`,large:`72rem`,pleine:`none`},fu={woff2:[`font/woff2`,`woff2`],woff:[`font/woff`,`woff`],ttf:[`font/ttf`,`truetype`],otf:[`font/otf`,`opentype`]};function pu(e){return e.flatMap(e=>[e,...e.type===`si`?[...pu(e.alors),...pu(e.sinon)]:e.type===`repetition`?pu(e.corps):[]])}function mu(e){return e.flatMap(e=>e.type===`condition`?[...mu(e.alors),...mu(e.sinon)]:e.type===`repetition`?[...e.gestionnaires,...mu(e.corps)]:e.type===`formulaire`||e.type===`bloc`?mu(e.corps):[])}function hu(e){let t=[e.disposition?.entete?.ecran,e.disposition?.pied?.ecran].filter(e=>e!==void 0);return[...e.ecrans,...e.composants,...t].some(e=>[...e.gestionnaires,...mu(e.vue)].some(e=>pu(e.actions).some(e=>e.type===`theme`)))}const gu=e=>`'${e.replace(/'/g,`\\'`)}'`,_u=(e,t,n,r)=>`${r}--humalis-${e}: ${t};\n${r}--humalis-${e}-encre: ${n};`;function vu(e,t,n){let r=Object.entries(Qa).map(([e,n])=>({nom:e,couleur:n[t],encre:t===`clair`?n.encreClair:n.encreSombre})),i=(e?.couleurs??[]).map(e=>({nom:e.nom,couleur:t===`clair`?e.clair:e.sombre,encre:t===`clair`?e.encreClair:e.encreSombre})),a=new Map([...r,...i].map(e=>[e.nom,e])),o=t===`clair`?`#ffffff`:`#141416`,s=t===`clair`?`#1d1d1f`:`#f2f2f4`;return[`${n}--humalis-page: ${o};`,`${n}--humalis-encre: ${s};`,...[...a.values()].map(e=>_u(e.nom,e.couleur,e.encre,n))].join(`
|
|
1393
|
+
`)}function yu(e,t,n=new Map){let r=[];for(let t of e?.polices??[]){if(!t.fichier)continue;let e=n.get(t.fichier);if(e===void 0)throw Error(`le fichier de police « ${t.fichier} » n'a pas été lu`);let i=t.fichier.split(`.`).pop().toLowerCase(),[a,o]=fu[i]??fu.woff2;r.push(`@font-face {\n font-family: ${gu(t.nom)};\n src: url(data:${a};base64,${e}) format('${o}');\n font-display: swap;\n}`)}if(e&&e.couleurs.length>0){r.push(`:root {\n${vu(e,`clair`,` `)}\n}`),r.push(`@media (prefers-color-scheme: dark) {\n :root {\n${vu(e,`sombre`,` `)}\n }\n}`);for(let t of e.couleurs.filter(e=>!(e.nom in Qa)))r.push(`.humalis-couleur-${t.nom}, .humalis-texte-${t.nom} { color: var(--humalis-${t.nom}); }\n.humalis-fond-${t.nom} { background: var(--humalis-${t.nom}); color: var(--humalis-${t.nom}-encre); border-color: transparent; }`)}let i=e?.polices.find(e=>e.role===`texte`),a=e?.polices.find(e=>e.role===`titres`),o=e?.polices.find(e=>e.role===`code`);return i&&r.push(`body { font-family: ${gu(i.nom)}, ${uu}; }`),a&&r.push(`h1, h2, h3, h4, h5, h6 { font-family: ${gu(a.nom)}, ${i?`${gu(i.nom)}, `:``}${uu}; }`),o&&r.push(`code, pre { font-family: ${gu(o.nom)}, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }`),e&&e.largeur!==`normale`&&r.push(`.humalis-page { max-width: ${du[e.largeur]}; }`),(t||e&&e.mode!==`automatique`)&&(r.push(`:root[data-theme="clair"] {\n color-scheme: light;\n${vu(e,`clair`,` `)}\n}`),r.push(`:root[data-theme="sombre"] {\n color-scheme: dark;\n${vu(e,`sombre`,` `)}\n}`)),r.length===0?``:`\n/* Le thème du projet (couleurs, polices, mode). */\n${r.join(`
|
|
1394
|
+
`)}\n`}function bu(e){return e&&e.mode!==`automatique`?e.mode:void 0}const xu=`try{var t=localStorage.getItem('${lu}');if(t==='clair'||t==='sombre')document.documentElement.dataset.theme=t}catch(e){}`,Su=`humalis-langue`;function Cu(e){return e.operateur===`et`||e.operateur===`ou`}var wu=class{lignes=[];niveau=0;ligne(e=``){return this.lignes.push(e===``?``:` `.repeat(this.niveau)+e),this}indenter(e){return this.niveau++,e(),this.niveau--,this}bloc(e,t,n=`}`){return this.ligne(e),this.indenter(t),this.ligne(n)}texte(){return this.lignes.join(`
|
|
1367
1395
|
`)+`
|
|
1368
|
-
`}};function
|
|
1369
|
-
`),r=[],i=0;for(let e of n)r.push(i),i+=e.length+1;let a=[];for(let n of t){if(![`MOT_CLE`,`CHAINE`,`NOMBRE`].includes(n.type))continue;let t=r[n.ligne-1]+n.colonne-1,i=t+(n.original??n.valeur).length;if(n.type===`CHAINE`)for(i=t+1;i<e.length;){if(e[i]===`"`&&e[i-1]!==`\\`){i++;break}i++}a.push({debut:t,fin:i,classe:n.type===`MOT_CLE`?`mot`:n.type===`CHAINE`?`texte`:`nombre`})}for(let e=0;e<n.length;e++){let t=n[e];for(let n=0;n<t.length;n++){let i=r[e]+n;if(t[n]===`#`&&!a.some(e=>e.debut<=i&&i<e.fin)){a.push({debut:i,fin:r[e]+t.length,classe:`commentaire`});break}}}a.sort((e,t)=>e.debut-t.debut);let o=``,s=0;for(let t of a)t.debut<s||(o+=
|
|
1396
|
+
`}};function Tu(e,t){switch(e.type){case`champ`:{let n=t.sortes?.get(e.id);return n===`nombre`?{genre:`nombre`}:n===`case`?{genre:`booleen`}:{genre:`texte`}}case`texte`:return{genre:`texte`};case`nombre`:case`calcul`:case`compte`:return{genre:`nombre`};case`booleen`:case`utilisateur`:case`etatRequete`:case`mouvementReduit`:case`themeSombre`:return{genre:`booleen`};case`erreurRequete`:return{genre:`texte`};case`liste`:return{genre:`liste`,de:e.elements[0]?Tu(e.elements[0],t):{genre:`inconnu`}};case`variable`:return t.types.get(e.nom)??{genre:`inconnu`};case`fiche`:return{genre:`fiche`,champs:e.champs.map(e=>({nom:e.nom,type:Tu(e.valeur,t)}))};case`agregat`:case`arrondi`:case`hasard`:case`joursEntre`:return{genre:`nombre`};case`dateDuJour`:case`dateDecalee`:return{genre:`texte`};case`champs`:case`filtre`:case`tri`:case`premiers`:case`groupement`:return{genre:`liste`,de:{genre:`inconnu`}};case`premier`:return{genre:`inconnu`};case`operationTexte`:return e.operation===`longueur`?{genre:`nombre`}:{genre:`texte`};case`remplacement`:return{genre:`texte`};case`appel`:case`champDonnee`:case`rien`:return{genre:`inconnu`}}}function Eu(e,t,n){let[r,...i]=t,a=W(r);return`{ ...${e}, ${a}: ${i.length>0?Eu(`${e}.${a}`,i,n):n} }`}function Du(e,t){let n=n=>{if(!Cu(n))return t(n);let r=Du(n,t);return n.operateur===`ou`&&e.operateur===`ou`?r.slice(1,-1):n.operateur===`et`&&e.operateur===`ou`?`(${r})`:r};return e.operateur===`et`?`${n(e.gauche)} && ${n(e.droite)}`:`(${n(e.gauche)} || ${n(e.droite)})`}function Ou(e){return e.type===`calcul`||e.type===`hasard`||e.type===`agregat`&&e.operation===`moyenne`}function ku(e,t){let n=e=>Ou(e)?`(${t(e)})`:t(e);switch(e.type){case`champs`:return`${n(e.liste)}.map((element) => element.${W(e.champ)})`;case`agregat`:{let t=n(e.liste);switch(e.operation){case`somme`:return`${t}.reduce((somme, n) => somme + n, 0)`;case`moyenne`:return`${t}.reduce((somme, n) => somme + n, 0) / ${t}.length`;case`minimum`:return`Math.min(...${t})`;case`maximum`:return`Math.max(...${t})`}break}case`arrondi`:{if(e.chiffres===void 0||e.chiffres===0)return`Math.round(${t(e.valeur)})`;let r=10**e.chiffres;return`Math.round(${n(e.valeur)} * ${r}) / ${r}`}case`hasard`:{let t=n(e.minimum);return`${t} + Math.floor(Math.random() * (${n(e.maximum)} - ${t} + 1))`}}return``}function Au(e,t,n){let r=e=>Ou(e)?`(${t(e)})`:t(e);switch(e.type){case`filtre`:return`${r(e.liste)}.filter((element) => ${n(e.test,e.champs)})`;case`premier`:return e.liste.type===`filtre`?`${r(e.liste.liste)}.find((element) => ${n(e.liste.test,e.liste.champs)}) ?? null`:`${r(e.liste)}[0] ?? null`;case`premiers`:return`${r(e.liste)}.slice(0, ${t(e.nombre)})`;case`tri`:{let t=t=>e.champ===void 0?t:`${t}.${W(e.champ)}`,[n,i]=e.decroissant?[`y`,`x`]:[`x`,`y`],a=e.genre===`texte`?`${t(n)}.localeCompare(${t(i)}, 'fr')`:`${t(n)} - ${t(i)}`;return`[...${r(e.liste)}].sort((x, y) => ${a})`}}}function ju(e,t){let n=t!==void 0&&t!==`fr`?`, '${t}'`:``;if(e.pluriel)return t=>`accorder(${t}, ${G(e.pluriel)}${n})`;if(e.format===`date`)return e=>`formaterDate(${e}${n})`;if(e.format===`nombre`)return e=>`formaterNombre(${e}${n})`;if(e.format===`depuis`)return e=>`formaterDepuis(${e})`;if(e.format===`Ko`||e.format===`Mo`)return t=>`formaterTaille(${t}, '${e.format}'${n})`;if(e.format)return t=>`formaterArgent(${t}, '${e.format}'${n})`}function Mu(e,t){return e.type===`dateDuJour`?e.maintenant?`maintenant()`:`dateDuJour()`:e.type===`joursEntre`?`joursEntre(${t(e.debut)}, ${t(e.fin)})`:`decalerDate(${t(e.date)}, ${e.signe<0?/^[\w.]+$/.test(t(e.nombre))?`-${t(e.nombre)}`:`-(${t(e.nombre)})`:t(e.nombre)}, '${e.unite}')`}function Nu(e,t){let n=e=>Ou(e)?`(${t(e)})`:t(e);if(e.type===`remplacement`)return`${n(e.dans)}.replaceAll(${t(e.cherche)}, ${t(e.remplace)})`;switch(e.operation){case`majuscules`:return`${n(e.valeur)}.toLocaleUpperCase('fr')`;case`minuscules`:return`${n(e.valeur)}.toLocaleLowerCase('fr')`;case`longueur`:return`${n(e.valeur)}.length`}}const Pu=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`);function Fu(e,t){if(t!==`humalis`)return Pu(e);try{let t=nt(e),n=e.split(`
|
|
1397
|
+
`),r=[],i=0;for(let e of n)r.push(i),i+=e.length+1;let a=[];for(let n of t){if(![`MOT_CLE`,`CHAINE`,`NOMBRE`].includes(n.type))continue;let t=r[n.ligne-1]+n.colonne-1,i=t+(n.original??n.valeur).length;if(n.type===`CHAINE`)for(i=t+1;i<e.length;){if(e[i]===`"`&&e[i-1]!==`\\`){i++;break}i++}a.push({debut:t,fin:i,classe:n.type===`MOT_CLE`?`mot`:n.type===`CHAINE`?`texte`:`nombre`})}for(let e=0;e<n.length;e++){let t=n[e];for(let n=0;n<t.length;n++){let i=r[e]+n;if(t[n]===`#`&&!a.some(e=>e.debut<=i&&i<e.fin)){a.push({debut:i,fin:r[e]+t.length,classe:`commentaire`});break}}}a.sort((e,t)=>e.debut-t.debut);let o=``,s=0;for(let t of a)t.debut<s||(o+=Pu(e.slice(s,t.debut)),o+=`<span class="humalis-code-${t.classe}">${Pu(e.slice(t.debut,t.fin))}</span>`,s=t.fin);return o+Pu(e.slice(s))}catch{return Pu(e)}}function q(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}function Iu(e){return q(e).replace(/"/g,`"`).replace(/'/g,`'`)}function J(e){return e.filter(e=>e[1]!==void 0).map(([e,t])=>` ${e}="${Iu(t)}"`).join(``)}function Lu(e,t){let n=Mc(e),r=t[Math.floor(e/jc)];return r===void 0||n<=0?void 0:`${r}:${n}`}function Ru(e){if(!(e.type!==`texte`||!e.parties.every(e=>`texte`in e)))return e.parties.map(e=>`texte`in e?e.texte:``).join(``)}function zu(e,t){if(e.type!==`condition`)return;let n=e.test;if(Cu(n)||n.gauche.type!==`variable`||n.gauche.nom!==`langue`||n.operateur!==`egal`&&n.operateur!==`different`)return;let r=n.droite&&Ru(n.droite);if(r!==void 0)return r===t!=(n.operateur===`different`)==!!n.negation?e.sinon:e.alors}function Bu(e,t){let n=t?.[0]?.code,r=(e,t)=>{for(let i of t){if(i.type===`element`&&i.genre===e){let e=Ru(i.contenu);if(e)return e}let t=i.type===`bloc`?i.corps:n===void 0?void 0:zu(i,n);if(t){let n=r(e,t);if(n)return n}}},i=e.nom.replace(/_/g,` `),a=r(`titre`,e.vue)??i.charAt(0).toUpperCase()+i.slice(1);return{titre:a,description:r(`texte`,e.vue)??a}}function Vu(e,t=[]){let n=new Set(t),r=new Map;for(let t of e){let e=t.split(/[\\/]/).filter(e=>e!==``&&e!==`.`&&e!==`..`),i=e[e.length-1]||`style.css`,a=n.has(i)&&e.join(`-`)||i;for(let e=2;n.has(a);e++)a=`${e}-${i}`;n.add(a),r.set(t,a)}return r}function Hu(e){let t=e=>!e.parametresAdresse?.length&&e.parent===void 0,n=e.ecrans.find(e=>e.nom===`accueil`&&t(e))??e.ecrans.find(e=>t(e)&&e.nom!==`introuvable`)??e.ecrans.find(t)??e.ecrans[0],r=e=>(e.parametresAdresse??[]).map(e=>`/:${W(e)}`).join(``),i=new Map,a=(t,o=[])=>{let s=i.get(t.nom);if(s!==void 0)return s;let c=t.parent!==void 0&&!o.includes(t.nom)?e.ecrans.find(e=>e.nom===t.parent):void 0,l=t.adresse===void 0?c?`${a(c,[...o,t.nom]).replace(/\/+$/,``)}/${U(t.nom)}${r(t)}`:t===n&&!t.parametresAdresse?.length?`/`:`/${U(t.nom)}${r(t)}`:t.adresse;return i.set(t.nom,l),l};for(let t of e.ecrans)a(t);return i}JSON.stringify({compilerOptions:{target:`ES2022`,lib:[`ES2023`,`DOM`,`DOM.Iterable`],module:`ESNext`,moduleResolution:`bundler`,jsx:`react-jsx`,strict:!0,noEmit:!0,skipLibCheck:!0,types:[`vite/client`]},include:[`src`]},null,2)+``;function Uu(e=!1,t=!1){let n=Object.entries(Qa),r=e=>n.map(([t,n])=>{let r=e===`clair`?n.encreClair:n.encreSombre;return` --humalis-${t}: ${n[e]};\n --humalis-${t}-encre: ${r};`}).join(`
|
|
1370
1398
|
`),i=n.map(([e])=>`.humalis-couleur-${e}, .humalis-texte-${e} { color: var(--humalis-${e}); }\n.humalis-fond-${e} { background: var(--humalis-${e}); color: var(--humalis-${e}-encre); border-color: transparent; }`).join(`
|
|
1371
1399
|
`);return`/* Produit par Humalis : le jeu de styles nommés (couleur, fond, texte, taille, position, bordure). */
|
|
1372
1400
|
:root {
|
|
@@ -1450,24 +1478,24 @@ ${e?`
|
|
|
1450
1478
|
.humalis-grille { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(16rem, 100%), 1fr)); gap: 1rem; }
|
|
1451
1479
|
.humalis-menu { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem; }
|
|
1452
1480
|
.humalis-menu > *, .humalis-ligne > *, .humalis-colonne > *, .humalis-grille > * { margin-top: 0; margin-bottom: 0; }
|
|
1453
|
-
`:``}`}function q(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}function zu(e){return q(e).replace(/"/g,`"`).replace(/'/g,`'`)}function J(e){return e.filter(e=>e[1]!==void 0).map(([e,t])=>` ${e}="${zu(t)}"`).join(``)}const Bu={fr:`Langue`,en:`Language`},Y=(e,t,...n)=>({tag:e,attrs:t,enfants:n}),X=(...e)=>e.filter(Boolean).join(` `),Vu=e=>Ha(e??``)?.lucide??`circle-help`;function Hu(e,t){let n=t.reglages.descriptionLangues?{js:ic(t.reglages.descriptionLangues,G),initial:t.reglages.description}:t.reglages.description;switch(e){case`icone`:return{icone:Vu(t.litteral),classe:X(`humalis-icone`,t.classes),label:t.reglages.decoratif?void 0:n};case`badge`:return Y(`span`,[[`class`,X(`humalis-badge`,t.classes)]],t.texte);case`avatar`:return Y(`span`,[[`class`,X(`humalis-avatar`,t.classes)],[`role`,`img`],[`aria-label`,{js:t.texte.js,initial:t.texte.initial}]],{avatar:{nom:t.valeur.js,photo:t.photo?.js,initialNom:t.texte.initial,initialPhoto:t.photo?.initial}});case`progression`:{let e=t.maximum??100,r=t.valeur.initial===null||t.valeur.initial===void 0,i=Y(`progress`,[[`class`,`humalis-progression`],[`max`,String(e)],...r?[]:[[`value`,{js:`String(${t.valeur.js})`,initial:String(t.valeur.initial)}]],...n?[[`aria-label`,n]]:[]]);return!t.reglages.pourcentage&&!t.classes?i:Y(`div`,[[`class`,X(`humalis-progression-ligne`,t.classes)]],i,...t.reglages.pourcentage&&!r?[Y(`span`,[],{js:`Math.round((${t.valeur.js} / ${e}) * 100) + ' %'`,initial:`${Math.round(Number(t.valeur.initial)/e*100)} %`})]:[])}case`chargement`:return Y(`span`,[[`class`,X(`humalis-chargement`,t.classes)],[`role`,`status`],...t.litteral===``?[[`aria-label`,`Chargement`]]:[]],Y(`span`,[[`class`,`humalis-chargement-rond`],[`aria-hidden`,`true`]]),...t.litteral===``?[]:[t.texte]);case`etoiles`:return{etoiles:{js:t.valeur.js,initial:Number(t.valeur.initial)||0,maximum:t.maximum??5,change:t.reglages.modifiable&&t.variable?`(valeur) => { ${t.variable} = valeur; }`:void 0,label:n??{js:`'Note : ' + formaterNombre(${t.valeur.js}) + ' sur ${t.maximum??5}'`,initial:`Note : ${t.valeur.initial} sur ${t.maximum??5}`},classes:X(`humalis-etoiles`,t.classes)}};case`compteur`:{let e=t.variable,r=t.minimum,i=t.maximum,a=Number(t.valeur.initial);return Y(`div`,[[`class`,X(`humalis-compteur`,t.classes)],[`role`,`group`],[`aria-label`,n??`Quantité`]],Y(`button`,[[`type`,`button`],[`aria-label`,`Diminuer`],[`data-humalis`,`${t.id}-moins`],[`disabled`,r!==void 0&&{js:`${e} <= ${r}`,initial:a<=r}],[`onclick`,`() => { ${e} = ${r===void 0?`${e} - 1`:`Math.max(${r}, ${e} - 1)`}; }`]],{texte:`–`}),Y(`output`,[[`aria-live`,`polite`]],{js:`String(${e})`,initial:String(a)}),Y(`button`,[[`type`,`button`],[`aria-label`,`Augmenter`],[`data-humalis`,`${t.id}-plus`],[`disabled`,i!==void 0&&{js:`${e} >= ${i}`,initial:a>=i}],[`onclick`,`() => { ${e} = ${i===void 0?`${e} + 1`:`Math.min(${i}, ${e} + 1)`}; }`]],{texte:`+`}))}case`qr`:return Y(`span`,[[`class`,X(`humalis-qr`,t.classes)],[`role`,`img`],[`aria-label`,n??`Code QR`]],{qr:t.valeur.js});case`selecteurLangue`:{let e=t.langues??[],n={js:`t({ ${e.map(e=>`${e.code}: '${Bu[e.code]??`Langue`}'`).join(`, `)} })`,initial:Bu[e[0]?.code]??`Langue`};return Y(`select`,[[`class`,X(`humalis-selecteur-langue`,t.classes)],[`aria-label`,n],[`oninput`,`(evenement) => changerLangue(evenement.target.value)`]],...e.map((e,t)=>Y(`option`,[[`value`,e.code],[`lang`,e.code],[`selected`,{js:`langue() === '${e.code}'`,initial:t===0}]],{texte:e.nom})))}case`audio`:{let e=t.audio,n=Y(`audio`,[[`controls`,!0],[`preload`,`none`],[`src`,e.source],...e.description===void 0?[]:[[`aria-label`,e.description]],...t.reglages.boucle?[[`loop`,!0]]:[],...e.transcription?[]:[[`class`,X(`humalis-audio`,t.classes)]]]);return e.transcription?Y(`figure`,[[`class`,X(`humalis-audio`,t.classes)]],n,Y(`details`,[[`class`,`humalis-audio-transcription`]],Y(`summary`,[],{texte:`Lire la transcription`}),Y(`p`,[],e.transcription))):n}case`fichier`:throw Error(`le choix d’un fichier n’est pas encore produit pour le site statique`)}}function Uu(e){let t=e.trim().split(/\s+/).filter(Boolean);return((t[0]?.[0]??``)+(t.length>1?t[t.length-1][0]??``:``)).toUpperCase()}function Wu(e){switch(e.genre){case`onglets`:{let t=e.etat.js,n=Number(e.etat.initial);return Y(`div`,[[`class`,X(`humalis-onglets`,e.classes)]],Y(`div`,[[`role`,`tablist`],[`class`,`humalis-onglets-barre`]],...e.parties.map((r,i)=>Y(`button`,[[`type`,`button`],[`role`,`tab`],[`id`,`${e.id}-onglet-${i}`],[`data-humalis`,`${e.id}-onglet-${i}`],[`aria-selected`,{js:`String(${t} === ${i})`,initial:String(n===i)}],[`aria-controls`,`${e.id}-panneau-${i}`],[`tabindex`,{js:`${t} === ${i} ? '0' : '-1'`,initial:n===i?`0`:`-1`}],[`class`,`humalis-onglet`],[`onclick`,`() => { ${t} = ${i}; }`]],...r.icone?[{icone:Vu(r.icone),classe:`humalis-icone`}]:[],r.titre))),...e.parties.map((r,i)=>Y(`div`,[[`role`,`tabpanel`],[`id`,`${e.id}-panneau-${i}`],[`aria-labelledby`,`${e.id}-onglet-${i}`],[`class`,`humalis-onglets-panneau`],[`hidden`,{js:`${t} !== ${i}`,initial:n!==i}]],{vue:r.corps})))}case`deroulant`:{let t=e.ouvert;return Y(`div`,[[`class`,X(`humalis-deroulant`,e.classes)]],Y(`button`,[[`type`,`button`],[`id`,`${e.id}-titre`],[`data-humalis`,`${e.id}-titre`],[`aria-expanded`,{js:`String(${t.js})`,initial:String(t.initial)}],[`aria-controls`,`${e.id}-zone`],[`class`,`humalis-deroulant-titre`],[`onclick`,`() => { ${e.basculer}; }`]],...e.parties[0].icone?[{icone:Vu(e.parties[0].icone),classe:`humalis-icone`}]:[],Y(`span`,[],e.parties[0].titre)),Y(`div`,[[`role`,`region`],[`id`,`${e.id}-zone`],[`aria-labelledby`,`${e.id}-titre`],[`class`,`humalis-deroulant-zone`],[`hidden`,{js:`!(${t.js})`,initial:!t.initial}]],{vue:e.parties[0]?e.corps:[]}))}case`accordeon`:return Y(`div`,[[`class`,X(`humalis-accordeon`,e.classes)]],{vue:e.corps});case`carrousel`:return Y(`section`,[[`class`,X(`humalis-carrousel`,e.classes)],[`aria-roledescription`,`carrousel`],[`aria-label`,e.reglages.descriptionLangues?{js:ic(e.reglages.descriptionLangues,G),initial:e.reglages.description}:e.reglages.description??`Carrousel`],[`data-humalis-carrousel`,e.id],...e.reglages.automatique?[[`data-automatique`,String(e.reglages.automatique)]]:[],...e.reglages.visibles?[[`style`,`--humalis-visibles: ${e.reglages.visibles}`]]:[]],Y(`div`,[[`class`,`humalis-carrousel-piste`]],{vue:e.corps}));case`filAriane`:return Y(`nav`,[[`aria-label`,`Fil d'Ariane`],[`class`,X(`humalis-fil`,e.classes)]],Y(`ol`,[],...e.parties.map((t,n)=>Y(`li`,n===e.parties.length-1?[[`aria-current`,`page`]]:[],{vue:t.corps}))))}}const Gu=e=>`viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"${e}`;function Ku(e,t,n){let r=yl[e]??yl[`circle-help`],i=n?` role="img" aria-label="${zu(n)}"`:` aria-hidden="true"`;return`<svg xmlns="http://www.w3.org/2000/svg" class="${zu(t)}" ${Gu(`${i}`)}>${r}</svg>`}function qu(e,t,n,r,i){let a=Ku(`star`,`humalis-etoile-fond`),o=Array.from({length:t},(r,i)=>{let o=e-i,s=o>=1?`pleine`:o>=.5?`demi`:`vide`,c=`${a}${s===`demi`?`<span class="humalis-etoile-moitie">${Ku(`star`,``)}</span>`:``}`;return n?`<button type="button" role="radio" aria-checked="${Math.round(e)===i+1}" aria-label="${i+1} sur ${t}" class="humalis-etoile humalis-etoile-${s}">${c}</button>`:`<span class="humalis-etoile humalis-etoile-${s}">${c}</span>`});return`<span class="${zu(i)}" role="${n?`radiogroup`:`img`}" aria-label="${zu(r)}">${o.join(``)}</span>`}const Ju=new Set(`document.window.location.history.navigator.console.self.top.parent.frames.localStorage.sessionStorage.fetch.setTimeout.clearTimeout.addEventListener.JSON.Math.Object.Array.String.Number.Boolean.Promise.Error.CSS.humalis.creer.demarrer.afficherMessage.retirerPremier.formaterNombre.formaterDate.formaterArgent.formaterTaille.accorder.adresseDe.dateDuJour.maintenant.decalerDate.joursEntre.formaterDepuis.lirePartage.garderPartage.lireMemoire.garderMemoire.serveur.utilisateur.dessiner.relire.garder.auChargement.visibilite.textes.evenement.motDePasseSaisi`.split(`.`));function Z(e){let t=W(e);return Ju.has(t)?`${t}_`:t}function Yu(e,t,n){return e.every(e=>`texte`in e)?G(e.map(e=>`texte`in e?e.texte:``).join(``)):`\`${e.map(e=>{if(`texte`in e)return e.texte.replace(/\\/g,`\\\\`).replace(/`/g,"\\`").replace(/\$\{/g,"\\${");let[r,...i]=e.variable.split(`.`),a=`variable`in e?Ou(e,n):void 0;if(i.length>0&&t.facultatives?.has(r)){let e=`${Z(r)}?.${i.map(W).join(`.`)}`;return a?`\${${a(e)}}`:`\${${e} ?? ''}`}return a?`\${${a(Zu(e.variable,t))}}`:t.types.get(e.variable)?.genre===`liste`?`\${${Zu(e.variable,t)}.join(', ')}`:`\${${Zu(e.variable,t)}}`}).join(``)}\``}const Xu=e=>({types:e.types,champs:e.champs,sortes:e.sortes});function Zu(e,t){let[n,...r]=e.split(`.`);return[t.renommes?.get(n)??(t.calculs.has(n)?`${Z(n)}()`:Z(n)),...r.map(W)].join(`.`)}function Q(e,t){switch(e.type){case`texte`:return e.versions?`t({ ${e.versions.map((e,n)=>`${e.code}: ${Yu(e.parties,t,n===0?void 0:e.code)}`).join(`, `)} })`:Yu(e.parties,t);case`nombre`:case`booleen`:return String(e.valeur);case`liste`:return`[${e.elements.map(e=>Q(e,t)).join(`, `)}]`;case`variable`:return t.langues&&e.nom===`langue`?`langue()`:Zu(e.nom,t);case`champ`:{let n=t.champs.get(e.id)??Z(e.id);return t.sortes?.get(e.id)===`nombre`?`Number(${n}.replace(',', '.'))`:n}case`calcul`:{let n=e=>Tu(e)?`(${Q(e,t)})`:Q(e,t);return`${n(e.gauche)} ${e.operateur} ${n(e.droite)}`}case`compte`:return`${Q(e.liste,t)}.length`;case`fiche`:return`{ ${e.champs.map(e=>`${W(e.nom)}: ${Q(e.valeur,t)}`).join(`, `)} }`;case`appel`:return`${Z(e.nom)}(${e.arguments.map(e=>Q(e,t)).join(`, `)})`;case`agregat`:case`arrondi`:case`hasard`:case`champs`:return Eu(e,e=>Q(e,t));case`dateDuJour`:case`dateDecalee`:case`joursEntre`:return ku(e,e=>Q(e,t));case`operationTexte`:case`remplacement`:return Au(e,e=>Q(e,t));case`groupement`:return`grouper(${Q(e.liste,t)}, (element) => element.${W(e.champ)})`;case`filtre`:case`tri`:case`premier`:case`premiers`:return Du(e,e=>Q(e,t),(e,n)=>{let r=t.renommes;t.renommes=new Map([...r??[],...n.map(e=>[e,`element.${W(e)}`])]);let i=ed(e,t);return t.renommes=r,i});case`champDonnee`:{let n=e.objet.type===`variable`&&t.facultatives?.has(e.objet.nom);return`${Q(e.objet,t)}${n?`?.`:`.`}${W(e.champ)}`}case`rien`:return`null`;case`utilisateur`:return`utilisateur.${e.etat}`;case`mouvementReduit`:return`mouvementReduit()`;case`themeSombre`:return`themeSombre()`;case`etatRequete`:case`erreurRequete`:return`null`}}function Qu(e,t){let n=Q(e,t),r=Su(e,Xu(t));return r.genre===`liste`?`${n}.join(', ')`:r.genre===`booleen`?`String(${n})`:n}const $u={egal:`===`,different:`!==`,inferieur:`<`,superieur:`>`,inferieurOuEgal:`<=`,superieurOuEgal:`>=`};function ed(e,t){if(bu(e))return wu(e,e=>ed(e,t));if(e.negation)return`!(${ed({...e,negation:!1},t)})`;let n=Q(e.gauche,t),r=Su(e.gauche,Xu(t)).genre===`booleen`;switch(e.operateur){case`dans`:return`${Q(e.droite,t)}.includes(${n})`;case`vide`:return`${n}.length === 0`;case`vrai`:return r?n:`${n} === true`;case`faux`:return r?`!${n}`:`${n} === false`;case`rien`:return`${n} === null`;case`contient`:return`${n}.includes(${Q(e.droite,t)})`;case`commencePar`:return`${n}.startsWith(${Q(e.droite,t)})`;case`finitPar`:return`${n}.endsWith(${Q(e.droite,t)})`;default:return`${n} ${$u[e.operateur]} ${Q(e.droite,t)}`}}var td=class e{types;parent;valeurs=new Map;calculs=new Map;constructor(e,t){this.types=e,this.parent=t}definir(e,t){return this.valeurs.set(e,t),this}definirCalcul(e,t){return this.calculs.set(e,t),this}enfant(){return new e(this.types,this)}changer(e,t){this.valeurs.has(e)||!this.parent?this.valeurs.set(e,t):this.parent.changer(e,t)}lire(e){if(this.valeurs.has(e))return this.valeurs.get(e);let t=this.calculs.get(e);return t?$(t,this):this.parent?.lire(e)}};function nd(e,t){let[n,...r]=e.split(`.`),i=t.lire(n);for(let e of r)i=i?.[W(e)];return i}function $(e,t){switch(e.type){case`texte`:return e.parties.map(e=>{if(`texte`in e)return e.texte;let n=nd(e.variable,t);return e.pluriel?Lo(n,e.pluriel):e.format===`nombre`?No(n):e.format===`date`?n===``?``:Po(n):e.format===`depuis`?``:e.format===`Ko`||e.format===`Mo`?Io(n,e.format):e.format?Fo(n,e.format):e.variable.includes(`.`)&&t.lire(e.variable.split(`.`)[0])===null?``:t.types.get(e.variable)?.genre===`liste`&&Array.isArray(n)?n.join(`, `):String(n)}).join(``);case`nombre`:case`booleen`:return e.valeur;case`liste`:return e.elements.map(e=>$(e,t));case`variable`:return nd(e.nom,t);case`champ`:return``;case`calcul`:{let n=$(e.gauche,t),r=$(e.droite,t);switch(e.operateur){case`+`:return n+r;case`-`:return n-r;case`*`:return n*r;case`/`:return n/r}break}case`compte`:return $(e.liste,t).length;case`fiche`:return Object.fromEntries(e.champs.map(e=>[W(e.nom),$(e.valeur,t)]));case`appel`:return sd(e.nom,e.arguments.map(e=>$(e,t)));case`champs`:{let n=$(e.liste,t);return Array.isArray(n)?n.map(t=>t[W(e.champ)]):[]}case`agregat`:{let n=$(e.liste,t)??[];if(e.operation===`minimum`)return Math.min(...n);if(e.operation===`maximum`)return Math.max(...n);let r=n.reduce((e,t)=>e+t,0);return e.operation===`somme`?r:r/n.length}case`arrondi`:{let n=10**(e.chiffres??0);return Math.round($(e.valeur,t)*n)/n}case`dateDuJour`:case`dateDecalee`:case`joursEntre`:return``;case`hasard`:return $(e.minimum,t);case`filtre`:{let n=$(e.liste,t);return(Array.isArray(n)?n:[]).filter(n=>ld(e.test,e.champs,n,t))}case`premier`:{if(e.liste.type===`filtre`){let n=e.liste,r=$(n.liste,t);return(Array.isArray(r)?r:[]).find(e=>ld(n.test,n.champs,e,t))??null}let n=$(e.liste,t);return Array.isArray(n)?n[0]??null:null}case`premiers`:{let n=$(e.liste,t);return Array.isArray(n)?n.slice(0,Number($(e.nombre,t))):[]}case`operationTexte`:{let n=String($(e.valeur,t)??``);return e.operation===`majuscules`?n.toLocaleUpperCase(`fr`):e.operation===`minuscules`?n.toLocaleLowerCase(`fr`):n.length}case`remplacement`:return String($(e.dans,t)??``).replaceAll(String($(e.cherche,t)),String($(e.remplace,t)));case`groupement`:{let n=[],r=$(e.liste,t);for(let t of Array.isArray(r)?r:[]){let r=t[W(e.champ)],i=n.find(e=>e.nom===r);i?i.elements.push(t):n.push({nom:r,elements:[t]})}return n}case`tri`:{let n=$(e.liste,t),r=t=>e.champ===void 0?t:t[W(e.champ)],i=e.decroissant?-1:1;return[...Array.isArray(n)?n:[]].sort((t,n)=>i*(e.genre===`texte`?String(r(t)).localeCompare(String(r(n)),`fr`):r(t)-r(n)))}case`champDonnee`:return $(e.objet,t)?.[W(e.champ)];case`utilisateur`:case`etatRequete`:case`mouvementReduit`:case`themeSombre`:return!1;case`erreurRequete`:return``;case`rien`:return null}}function rd(e,t,n){let r=$(e,t);return Su(e,{types:t.types,champs:n}).genre===`liste`&&Array.isArray(r)?r.join(`, `):String(r)}function id(e,t,n){if(!bu(e)&&e.negation)return!id({...e,negation:!1},t,n);if(bu(e))return e.operateur===`et`?id(e.gauche,t,n)&&id(e.droite,t,n):id(e.gauche,t,n)||id(e.droite,t,n);let r=$(e.gauche,t),i=Su(e.gauche,{types:t.types,champs:n}).genre===`booleen`;switch(e.operateur){case`dans`:return $(e.droite,t).includes(r);case`vide`:return r.length===0;case`vrai`:return i?!!r:r===!0;case`faux`:return i?!r:r===!1;case`rien`:return r===null;case`contient`:{let n=$(e.droite,t);return Array.isArray(r)||typeof r==`string`?r.includes(n):!1}case`commencePar`:return String(r).startsWith(String($(e.droite,t)));case`finitPar`:return String(r).endsWith(String($(e.droite,t)));default:{let n=$(e.droite,t),i=r;switch(e.operateur){case`egal`:return i===n;case`different`:return i!==n;case`inferieur`:return i<n;case`superieur`:return i>n;case`inferieurOuEgal`:return i<=n;case`superieurOuEgal`:return i>=n}}}}const ad=new Map;function od(e){ad.clear();for(let t of e)ad.set(t.nom,t)}function sd(e,t){let n=ad.get(e);if(!n)return;let r=new td(new Map(n.parametres.map(e=>[e.nom,e.type])));n.parametres.forEach((e,n)=>r.definir(e.nom,t[n]));let i=cd(n.corps,r);return typeof i==`object`?i.valeur:void 0}function cd(e,t){for(let n of e)switch(n.type){case`rendre`:return{valeur:$(n.valeur,t)};case`arreter`:return`arreter`;case`passer`:return`passer`;case`locale`:t.definir(n.nom,$(n.valeur,t));break;case`affectation`:{let e=$(n.valeur,t);if(!n.champs){t.changer(n.nom,e);break}let r=(t,n)=>{let[i,...a]=n,o={...t};return o[W(i)]=a.length>0?r(o[W(i)],a):e,o};t.changer(n.nom,r(t.lire(n.nom),n.champs));break}case`si`:{let e=cd(id(n.test,t,new Map)?n.alors:n.sinon,t.enfant());if(e)return e;break}case`selon`:{let e=$(n.valeur,t),r=n.cas.find(n=>n.valeurs.some(n=>$(n,t)===e)),i=cd(r?r.corps:n.sinon,t.enfant());if(i)return i;break}case`repetition`:case`repeter`:case`tantQue`:{let e=n.type===`repetition`?$(n.liste,t):void 0,r=n.type===`repetition`?Array.isArray(e)?e:[]:void 0;for(let e=0;;e++){if(e>=1e5)return`impossible`;if(n.type===`repetition`&&e>=r.length||n.type===`repeter`&&e>=Number($(n.fois,t))||n.type===`tantQue`&&!id(n.test,t,new Map))break;let i=t.enfant();n.type===`repetition`&&i.definir(n.variable,r[e]);let a=cd(n.corps,i);if(a===`arreter`)break;if(a!==`passer`&&a)return a}break}case`ajout`:t.changer(n.liste,[...t.lire(n.liste)??[],$(n.valeur,t)]);break;default:return`impossible`}}function ld(e,t,n,r){let i=r.enfant();for(let e of t)i.definir(e,n[W(e)]);return id(e,i,new Map)}const ud={email:{type:`email`,autocomplete:`email`},telephone:{type:`tel`,autocomplete:`tel`},nombre:{type:`number`},date:{type:`date`},heure:{type:`time`},motDePasse:{type:`password`,autocomplete:`new-password`},adresseWeb:{type:`url`,autocomplete:`url`}},dd={clic:`onclick`,survol:`onmouseenter`};function fd(e,t,n){return new gd(e,t,n).generer()}function pd(e,t,n){let r=new gd({nom:`fonctions`,etat:[],calculs:[],vue:[],gestionnaires:[],parametres:[],ligne:0},t,``,[]);return`// Produit par Humalis depuis ${n} : les fonctions écrites en haut du fichier.
|
|
1481
|
+
`:``}`}const Wu={fr:`Langue`,en:`Language`},Y=(e,t,...n)=>({tag:e,attrs:t,enfants:n}),X=(...e)=>e.filter(Boolean).join(` `),Gu=e=>Ha(e??``)?.lucide??`circle-help`;function Ku(e,t){let n=t.reglages.descriptionLangues?{js:ac(t.reglages.descriptionLangues,G),initial:t.reglages.description}:t.reglages.description;switch(e){case`icone`:return{icone:Gu(t.litteral),classe:X(`humalis-icone`,t.classes),label:t.reglages.decoratif?void 0:n};case`badge`:return Y(`span`,[[`class`,X(`humalis-badge`,t.classes)]],t.texte);case`avatar`:return Y(`span`,[[`class`,X(`humalis-avatar`,t.classes)],[`role`,`img`],[`aria-label`,{js:t.texte.js,initial:t.texte.initial}]],{avatar:{nom:t.valeur.js,photo:t.photo?.js,initialNom:t.texte.initial,initialPhoto:t.photo?.initial}});case`progression`:{let e=t.maximum??100,r=t.valeur.initial===null||t.valeur.initial===void 0,i=Y(`progress`,[[`class`,`humalis-progression`],[`max`,String(e)],...r?[]:[[`value`,{js:`String(${t.valeur.js})`,initial:String(t.valeur.initial)}]],...n?[[`aria-label`,n]]:[]]);return!t.reglages.pourcentage&&!t.classes?i:Y(`div`,[[`class`,X(`humalis-progression-ligne`,t.classes)]],i,...t.reglages.pourcentage&&!r?[Y(`span`,[],{js:`Math.round((${t.valeur.js} / ${e}) * 100) + ' %'`,initial:`${Math.round(Number(t.valeur.initial)/e*100)} %`})]:[])}case`chargement`:return Y(`span`,[[`class`,X(`humalis-chargement`,t.classes)],[`role`,`status`],...t.litteral===``?[[`aria-label`,`Chargement`]]:[]],Y(`span`,[[`class`,`humalis-chargement-rond`],[`aria-hidden`,`true`]]),...t.litteral===``?[]:[t.texte]);case`etoiles`:return{etoiles:{js:t.valeur.js,initial:Number(t.valeur.initial)||0,maximum:t.maximum??5,change:t.reglages.modifiable&&t.variable?`(valeur) => { ${t.variable} = valeur; }`:void 0,label:n??{js:`'Note : ' + formaterNombre(${t.valeur.js}) + ' sur ${t.maximum??5}'`,initial:`Note : ${t.valeur.initial} sur ${t.maximum??5}`},classes:X(`humalis-etoiles`,t.classes)}};case`compteur`:{let e=t.variable,r=t.minimum,i=t.maximum,a=Number(t.valeur.initial);return Y(`div`,[[`class`,X(`humalis-compteur`,t.classes)],[`role`,`group`],[`aria-label`,n??`Quantité`]],Y(`button`,[[`type`,`button`],[`aria-label`,`Diminuer`],[`data-humalis`,`${t.id}-moins`],[`disabled`,r!==void 0&&{js:`${e} <= ${r}`,initial:a<=r}],[`onclick`,`() => { ${e} = ${r===void 0?`${e} - 1`:`Math.max(${r}, ${e} - 1)`}; }`]],{texte:`–`}),Y(`output`,[[`aria-live`,`polite`]],{js:`String(${e})`,initial:String(a)}),Y(`button`,[[`type`,`button`],[`aria-label`,`Augmenter`],[`data-humalis`,`${t.id}-plus`],[`disabled`,i!==void 0&&{js:`${e} >= ${i}`,initial:a>=i}],[`onclick`,`() => { ${e} = ${i===void 0?`${e} + 1`:`Math.min(${i}, ${e} + 1)`}; }`]],{texte:`+`}))}case`qr`:return Y(`span`,[[`class`,X(`humalis-qr`,t.classes)],[`role`,`img`],[`aria-label`,n??`Code QR`]],{qr:t.valeur.js});case`selecteurLangue`:{let e=t.langues??[],n={js:`t({ ${e.map(e=>`${e.code}: '${Wu[e.code]??`Langue`}'`).join(`, `)} })`,initial:Wu[e[0]?.code]??`Langue`};return Y(`select`,[[`class`,X(`humalis-selecteur-langue`,t.classes)],[`aria-label`,n],[`oninput`,`(evenement) => changerLangue(evenement.target.value)`]],...e.map((e,t)=>Y(`option`,[[`value`,e.code],[`lang`,e.code],[`selected`,{js:`langue() === '${e.code}'`,initial:t===0}]],{texte:e.nom})))}case`audio`:{let e=t.audio,n=Y(`audio`,[[`controls`,!0],[`preload`,`none`],[`src`,e.source],...e.description===void 0?[]:[[`aria-label`,e.description]],...t.reglages.boucle?[[`loop`,!0]]:[],...e.transcription?[]:[[`class`,X(`humalis-audio`,t.classes)]]]);return e.transcription?Y(`figure`,[[`class`,X(`humalis-audio`,t.classes)]],n,Y(`details`,[[`class`,`humalis-audio-transcription`]],Y(`summary`,[],{texte:`Lire la transcription`}),Y(`p`,[],e.transcription))):n}case`fichier`:throw Error(`le choix d’un fichier n’est pas encore produit pour le site statique`)}}function qu(e){let t=e.trim().split(/\s+/).filter(Boolean);return((t[0]?.[0]??``)+(t.length>1?t[t.length-1][0]??``:``)).toUpperCase()}function Ju(e){switch(e.genre){case`onglets`:{let t=e.etat.js,n=Number(e.etat.initial);return Y(`div`,[[`class`,X(`humalis-onglets`,e.classes)]],Y(`div`,[[`role`,`tablist`],[`class`,`humalis-onglets-barre`]],...e.parties.map((r,i)=>Y(`button`,[[`type`,`button`],[`role`,`tab`],[`id`,`${e.id}-onglet-${i}`],[`data-humalis`,`${e.id}-onglet-${i}`],[`aria-selected`,{js:`String(${t} === ${i})`,initial:String(n===i)}],[`aria-controls`,`${e.id}-panneau-${i}`],[`tabindex`,{js:`${t} === ${i} ? '0' : '-1'`,initial:n===i?`0`:`-1`}],[`class`,`humalis-onglet`],[`onclick`,`() => { ${t} = ${i}; }`]],...r.icone?[{icone:Gu(r.icone),classe:`humalis-icone`}]:[],r.titre))),...e.parties.map((r,i)=>Y(`div`,[[`role`,`tabpanel`],[`id`,`${e.id}-panneau-${i}`],[`aria-labelledby`,`${e.id}-onglet-${i}`],[`class`,`humalis-onglets-panneau`],[`hidden`,{js:`${t} !== ${i}`,initial:n!==i}]],{vue:r.corps})))}case`deroulant`:{let t=e.ouvert;return Y(`div`,[[`class`,X(`humalis-deroulant`,e.classes)]],Y(`button`,[[`type`,`button`],[`id`,`${e.id}-titre`],[`data-humalis`,`${e.id}-titre`],[`aria-expanded`,{js:`String(${t.js})`,initial:String(t.initial)}],[`aria-controls`,`${e.id}-zone`],[`class`,`humalis-deroulant-titre`],[`onclick`,`() => { ${e.basculer}; }`]],...e.parties[0].icone?[{icone:Gu(e.parties[0].icone),classe:`humalis-icone`}]:[],Y(`span`,[],e.parties[0].titre)),Y(`div`,[[`role`,`region`],[`id`,`${e.id}-zone`],[`aria-labelledby`,`${e.id}-titre`],[`class`,`humalis-deroulant-zone`],[`hidden`,{js:`!(${t.js})`,initial:!t.initial}]],{vue:e.parties[0]?e.corps:[]}))}case`accordeon`:return Y(`div`,[[`class`,X(`humalis-accordeon`,e.classes)]],{vue:e.corps});case`carrousel`:return Y(`section`,[[`class`,X(`humalis-carrousel`,e.classes)],[`aria-roledescription`,`carrousel`],[`aria-label`,e.reglages.descriptionLangues?{js:ac(e.reglages.descriptionLangues,G),initial:e.reglages.description}:e.reglages.description??`Carrousel`],[`data-humalis-carrousel`,e.id],...e.reglages.automatique?[[`data-automatique`,String(e.reglages.automatique)]]:[],...e.reglages.visibles?[[`style`,`--humalis-visibles: ${e.reglages.visibles}`]]:[]],Y(`div`,[[`class`,`humalis-carrousel-piste`]],{vue:e.corps}));case`filAriane`:return Y(`nav`,[[`aria-label`,`Fil d'Ariane`],[`class`,X(`humalis-fil`,e.classes)]],Y(`ol`,[],...e.parties.map((t,n)=>Y(`li`,n===e.parties.length-1?[[`aria-current`,`page`]]:[],{vue:t.corps}))))}}const Yu=e=>`viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"${e}`;function Xu(e,t,n){let r=bl[e]??bl[`circle-help`],i=n?` role="img" aria-label="${Iu(n)}"`:` aria-hidden="true"`;return`<svg xmlns="http://www.w3.org/2000/svg" class="${Iu(t)}" ${Yu(`${i}`)}>${r}</svg>`}function Zu(e,t,n,r,i){let a=Xu(`star`,`humalis-etoile-fond`),o=Array.from({length:t},(r,i)=>{let o=e-i,s=o>=1?`pleine`:o>=.5?`demi`:`vide`,c=`${a}${s===`demi`?`<span class="humalis-etoile-moitie">${Xu(`star`,``)}</span>`:``}`;return n?`<button type="button" role="radio" aria-checked="${Math.round(e)===i+1}" aria-label="${i+1} sur ${t}" class="humalis-etoile humalis-etoile-${s}">${c}</button>`:`<span class="humalis-etoile humalis-etoile-${s}">${c}</span>`});return`<span class="${Iu(i)}" role="${n?`radiogroup`:`img`}" aria-label="${Iu(r)}">${o.join(``)}</span>`}const Qu=new Set(`document.window.location.history.navigator.console.self.top.parent.frames.localStorage.sessionStorage.fetch.setTimeout.clearTimeout.addEventListener.JSON.Math.Object.Array.String.Number.Boolean.Promise.Error.CSS.humalis.creer.demarrer.afficherMessage.retirerPremier.formaterNombre.formaterDate.formaterArgent.formaterTaille.accorder.adresseDe.dateDuJour.maintenant.decalerDate.joursEntre.formaterDepuis.lirePartage.garderPartage.lireMemoire.garderMemoire.serveur.utilisateur.dessiner.relire.garder.auChargement.visibilite.textes.evenement.motDePasseSaisi`.split(`.`));function Z(e){let t=W(e);return Qu.has(t)?`${t}_`:t}function $u(e,t,n){return e.every(e=>`texte`in e)?G(e.map(e=>`texte`in e?e.texte:``).join(``)):`\`${e.map(e=>{if(`texte`in e)return e.texte.replace(/\\/g,`\\\\`).replace(/`/g,"\\`").replace(/\$\{/g,"\\${");let[r,...i]=e.variable.split(`.`),a=`variable`in e?ju(e,n):void 0;if(i.length>0&&t.facultatives?.has(r)){let e=`${Z(r)}?.${i.map(W).join(`.`)}`;return a?`\${${a(e)}}`:`\${${e} ?? ''}`}return a?`\${${a(td(e.variable,t))}}`:t.types.get(e.variable)?.genre===`liste`?`\${${td(e.variable,t)}.join(', ')}`:`\${${td(e.variable,t)}}`}).join(``)}\``}const ed=e=>({types:e.types,champs:e.champs,sortes:e.sortes});function td(e,t){let[n,...r]=e.split(`.`);return[t.renommes?.get(n)??(t.calculs.has(n)?`${Z(n)}()`:Z(n)),...r.map(W)].join(`.`)}function Q(e,t){switch(e.type){case`texte`:return e.versions?`t({ ${e.versions.map((e,n)=>`${e.code}: ${$u(e.parties,t,n===0?void 0:e.code)}`).join(`, `)} })`:$u(e.parties,t);case`nombre`:case`booleen`:return String(e.valeur);case`liste`:return`[${e.elements.map(e=>Q(e,t)).join(`, `)}]`;case`variable`:return t.langues&&e.nom===`langue`?`langue()`:td(e.nom,t);case`champ`:{let n=t.champs.get(e.id)??Z(e.id);return t.sortes?.get(e.id)===`nombre`?`Number(${n}.replace(',', '.'))`:n}case`calcul`:{let n=e=>Ou(e)?`(${Q(e,t)})`:Q(e,t);return`${n(e.gauche)} ${e.operateur} ${n(e.droite)}`}case`compte`:return`${Q(e.liste,t)}.length`;case`fiche`:return`{ ${e.champs.map(e=>`${W(e.nom)}: ${Q(e.valeur,t)}`).join(`, `)} }`;case`appel`:return`${Z(e.nom)}(${e.arguments.map(e=>Q(e,t)).join(`, `)})`;case`agregat`:case`arrondi`:case`hasard`:case`champs`:return ku(e,e=>Q(e,t));case`dateDuJour`:case`dateDecalee`:case`joursEntre`:return Mu(e,e=>Q(e,t));case`operationTexte`:case`remplacement`:return Nu(e,e=>Q(e,t));case`groupement`:return`grouper(${Q(e.liste,t)}, (element) => element.${W(e.champ)})`;case`filtre`:case`tri`:case`premier`:case`premiers`:return Au(e,e=>Q(e,t),(e,n)=>{let r=t.renommes;t.renommes=new Map([...r??[],...n.map(e=>[e,`element.${W(e)}`])]);let i=id(e,t);return t.renommes=r,i});case`champDonnee`:{let n=e.objet.type===`variable`&&t.facultatives?.has(e.objet.nom);return`${Q(e.objet,t)}${n?`?.`:`.`}${W(e.champ)}`}case`rien`:return`null`;case`utilisateur`:return`utilisateur.${e.etat}`;case`mouvementReduit`:return`mouvementReduit()`;case`themeSombre`:return`themeSombre()`;case`etatRequete`:case`erreurRequete`:return`null`}}function nd(e,t){let n=Q(e,t),r=Tu(e,ed(t));return r.genre===`liste`?`${n}.join(', ')`:r.genre===`booleen`?`String(${n})`:n}const rd={egal:`===`,different:`!==`,inferieur:`<`,superieur:`>`,inferieurOuEgal:`<=`,superieurOuEgal:`>=`};function id(e,t){if(Cu(e))return Du(e,e=>id(e,t));if(e.negation)return`!(${id({...e,negation:!1},t)})`;let n=Q(e.gauche,t),r=Tu(e.gauche,ed(t)).genre===`booleen`;switch(e.operateur){case`dans`:return`${Q(e.droite,t)}.includes(${n})`;case`vide`:return`${n}.length === 0`;case`vrai`:return r?n:`${n} === true`;case`faux`:return r?`!${n}`:`${n} === false`;case`rien`:return`${n} === null`;case`contient`:return`${n}.includes(${Q(e.droite,t)})`;case`commencePar`:return`${n}.startsWith(${Q(e.droite,t)})`;case`finitPar`:return`${n}.endsWith(${Q(e.droite,t)})`;default:return`${n} ${rd[e.operateur]} ${Q(e.droite,t)}`}}var ad=class e{types;parent;valeurs=new Map;calculs=new Map;constructor(e,t){this.types=e,this.parent=t}definir(e,t){return this.valeurs.set(e,t),this}definirCalcul(e,t){return this.calculs.set(e,t),this}enfant(){return new e(this.types,this)}changer(e,t){this.valeurs.has(e)||!this.parent?this.valeurs.set(e,t):this.parent.changer(e,t)}lire(e){if(this.valeurs.has(e))return this.valeurs.get(e);let t=this.calculs.get(e);return t?$(t,this):this.parent?.lire(e)}};function od(e,t){let[n,...r]=e.split(`.`),i=t.lire(n);for(let e of r)i=i?.[W(e)];return i}function $(e,t){switch(e.type){case`texte`:return e.parties.map(e=>{if(`texte`in e)return e.texte;let n=od(e.variable,t);return e.pluriel?Lo(n,e.pluriel):e.format===`nombre`?No(n):e.format===`date`?n===``?``:Po(n):e.format===`depuis`?``:e.format===`Ko`||e.format===`Mo`?Io(n,e.format):e.format?Fo(n,e.format):e.variable.includes(`.`)&&t.lire(e.variable.split(`.`)[0])===null?``:t.types.get(e.variable)?.genre===`liste`&&Array.isArray(n)?n.join(`, `):String(n)}).join(``);case`nombre`:case`booleen`:return e.valeur;case`liste`:return e.elements.map(e=>$(e,t));case`variable`:return od(e.nom,t);case`champ`:return``;case`calcul`:{let n=$(e.gauche,t),r=$(e.droite,t);switch(e.operateur){case`+`:return n+r;case`-`:return n-r;case`*`:return n*r;case`/`:return n/r}break}case`compte`:return $(e.liste,t).length;case`fiche`:return Object.fromEntries(e.champs.map(e=>[W(e.nom),$(e.valeur,t)]));case`appel`:return dd(e.nom,e.arguments.map(e=>$(e,t)));case`champs`:{let n=$(e.liste,t);return Array.isArray(n)?n.map(t=>t[W(e.champ)]):[]}case`agregat`:{let n=$(e.liste,t)??[];if(e.operation===`minimum`)return Math.min(...n);if(e.operation===`maximum`)return Math.max(...n);let r=n.reduce((e,t)=>e+t,0);return e.operation===`somme`?r:r/n.length}case`arrondi`:{let n=10**(e.chiffres??0);return Math.round($(e.valeur,t)*n)/n}case`dateDuJour`:case`dateDecalee`:case`joursEntre`:return``;case`hasard`:return $(e.minimum,t);case`filtre`:{let n=$(e.liste,t);return(Array.isArray(n)?n:[]).filter(n=>pd(e.test,e.champs,n,t))}case`premier`:{if(e.liste.type===`filtre`){let n=e.liste,r=$(n.liste,t);return(Array.isArray(r)?r:[]).find(e=>pd(n.test,n.champs,e,t))??null}let n=$(e.liste,t);return Array.isArray(n)?n[0]??null:null}case`premiers`:{let n=$(e.liste,t);return Array.isArray(n)?n.slice(0,Number($(e.nombre,t))):[]}case`operationTexte`:{let n=String($(e.valeur,t)??``);return e.operation===`majuscules`?n.toLocaleUpperCase(`fr`):e.operation===`minuscules`?n.toLocaleLowerCase(`fr`):n.length}case`remplacement`:return String($(e.dans,t)??``).replaceAll(String($(e.cherche,t)),String($(e.remplace,t)));case`groupement`:{let n=[],r=$(e.liste,t);for(let t of Array.isArray(r)?r:[]){let r=t[W(e.champ)],i=n.find(e=>e.nom===r);i?i.elements.push(t):n.push({nom:r,elements:[t]})}return n}case`tri`:{let n=$(e.liste,t),r=t=>e.champ===void 0?t:t[W(e.champ)],i=e.decroissant?-1:1;return[...Array.isArray(n)?n:[]].sort((t,n)=>i*(e.genre===`texte`?String(r(t)).localeCompare(String(r(n)),`fr`):r(t)-r(n)))}case`champDonnee`:return $(e.objet,t)?.[W(e.champ)];case`utilisateur`:case`etatRequete`:case`mouvementReduit`:case`themeSombre`:return!1;case`erreurRequete`:return``;case`rien`:return null}}function sd(e,t,n){let r=$(e,t);return Tu(e,{types:t.types,champs:n}).genre===`liste`&&Array.isArray(r)?r.join(`, `):String(r)}function cd(e,t,n){if(!Cu(e)&&e.negation)return!cd({...e,negation:!1},t,n);if(Cu(e))return e.operateur===`et`?cd(e.gauche,t,n)&&cd(e.droite,t,n):cd(e.gauche,t,n)||cd(e.droite,t,n);let r=$(e.gauche,t),i=Tu(e.gauche,{types:t.types,champs:n}).genre===`booleen`;switch(e.operateur){case`dans`:return $(e.droite,t).includes(r);case`vide`:return r.length===0;case`vrai`:return i?!!r:r===!0;case`faux`:return i?!r:r===!1;case`rien`:return r===null;case`contient`:{let n=$(e.droite,t);return Array.isArray(r)||typeof r==`string`?r.includes(n):!1}case`commencePar`:return String(r).startsWith(String($(e.droite,t)));case`finitPar`:return String(r).endsWith(String($(e.droite,t)));default:{let n=$(e.droite,t),i=r;switch(e.operateur){case`egal`:return i===n;case`different`:return i!==n;case`inferieur`:return i<n;case`superieur`:return i>n;case`inferieurOuEgal`:return i<=n;case`superieurOuEgal`:return i>=n}}}}const ld=new Map;function ud(e){ld.clear();for(let t of e)ld.set(t.nom,t)}function dd(e,t){let n=ld.get(e);if(!n)return;let r=new ad(new Map(n.parametres.map(e=>[e.nom,e.type])));n.parametres.forEach((e,n)=>r.definir(e.nom,t[n]));let i=fd(n.corps,r);return typeof i==`object`?i.valeur:void 0}function fd(e,t){for(let n of e)switch(n.type){case`rendre`:return{valeur:$(n.valeur,t)};case`arreter`:return`arreter`;case`passer`:return`passer`;case`locale`:t.definir(n.nom,$(n.valeur,t));break;case`affectation`:{let e=$(n.valeur,t);if(!n.champs){t.changer(n.nom,e);break}let r=(t,n)=>{let[i,...a]=n,o={...t};return o[W(i)]=a.length>0?r(o[W(i)],a):e,o};t.changer(n.nom,r(t.lire(n.nom),n.champs));break}case`si`:{let e=fd(cd(n.test,t,new Map)?n.alors:n.sinon,t.enfant());if(e)return e;break}case`selon`:{let e=$(n.valeur,t),r=n.cas.find(n=>n.valeurs.some(n=>$(n,t)===e)),i=fd(r?r.corps:n.sinon,t.enfant());if(i)return i;break}case`repetition`:case`repeter`:case`tantQue`:{let e=n.type===`repetition`?$(n.liste,t):void 0,r=n.type===`repetition`?Array.isArray(e)?e:[]:void 0;for(let e=0;;e++){if(e>=1e5)return`impossible`;if(n.type===`repetition`&&e>=r.length||n.type===`repeter`&&e>=Number($(n.fois,t))||n.type===`tantQue`&&!cd(n.test,t,new Map))break;let i=t.enfant();n.type===`repetition`&&i.definir(n.variable,r[e]);let a=fd(n.corps,i);if(a===`arreter`)break;if(a!==`passer`&&a)return a}break}case`ajout`:t.changer(n.liste,[...t.lire(n.liste)??[],$(n.valeur,t)]);break;default:return`impossible`}}function pd(e,t,n,r){let i=r.enfant();for(let e of t)i.definir(e,n[W(e)]);return cd(e,i,new Map)}const md={email:{type:`email`,autocomplete:`email`},telephone:{type:`tel`,autocomplete:`tel`},nombre:{type:`number`},date:{type:`date`},heure:{type:`time`},motDePasse:{type:`password`,autocomplete:`new-password`},adresseWeb:{type:`url`,autocomplete:`url`}},hd={clic:`onclick`,survol:`onmouseenter`};function gd(e,t,n){return new bd(e,t,n).generer()}function _d(e,t,n){let r=new bd({nom:`fonctions`,etat:[],calculs:[],vue:[],gestionnaires:[],parametres:[],ligne:0},t,``,[]);return`// Produit par Humalis depuis ${n} : les fonctions écrites en haut du fichier.
|
|
1454
1482
|
'use strict';
|
|
1455
1483
|
|
|
1456
1484
|
${e.map(e=>r.fonctionGlobale(e)).join(`
|
|
1457
|
-
`)}`}function
|
|
1458
|
-
`).join(``).replace(/^\n+/,``),u=
|
|
1459
|
-
`),f=[];return this.ecrireGroupeHtml(this.ecran.vue,this.environnement(),f),{html:f,script:`${d}\n${l}`,titre:e,description:t,session:this.besoins.session,composants:this.besoins.composants,serveur:this.besoins.serveur}}fonctionComposant(){let e=(this.parametres??[]).map(e=>Z(e.nom)).join(`, `),t=new
|
|
1485
|
+
`)}`}function vd(e,t){return new bd(e,t,``,e.parametres).fonctionComposant()}function yd(e,t,n,r){new bd(e,t,``,e.parametres).htmlComposant(n,r)}var bd=class{ecran;site;source;parametres;contexte={types:new Map,champs:new Map,calculs:new Set};montres=new Set;caches=new Set;textesChanges=new Set;evenements=new Map;saisies=new Map;libelles=new Map;libellesLangues=new Map;formulaires=new Map;formulaireDe=new Map;echecs;fonctions=[];chargements=[];minuteries=[];dansMinuterie=!1;raccourcis=[];fenetres=new Set;basDesBlocs=new Map;dansEvenement=!1;dernieres=0;nomsPris=new Set;clesChamps=new Map;champsEmail=new Set;champsMotDePasse=new Set;niveaux=new Map;titreVu=!1;besoins={session:!1,composants:!1,serveur:!1};constructor(e,t,n,r){this.ecran=e,this.site=t,this.source=n,this.parametres=r,t.langues&&(this.contexte.langues=!0);let i=r?[]:t.partages;for(let t of[...i,...e.etat])this.contexte.types.set(t.nom,t.type),this.nomsPris.add(Z(t.nom));for(let t of e.calculs)this.contexte.types.set(t.nom,t.type),this.contexte.calculs.add(t.nom),this.nomsPris.add(Z(t.nom));for(let e of r??[])this.contexte.types.set(e.nom,e.type);for(let t of e.parametresAdresse??[])this.contexte.types.set(t,{genre:`texte`}),this.nomsPris.add(Z(t));this.contexte.facultatives=new Set([...e.etat,...e.calculs].filter(e=>e.facultatif).map(e=>e.nom)),this.contexte.sortes=new Map,this.recenser(e.vue,[]);for(let t of e.gestionnaires)this.enregistrer(t,[])}recenser(e,t,n){for(let r of e)switch(r.type){case`element`:if(r.genre===`champ`){let e=Od(r.contenu)??r.id;if(this.contexte.champs.set(r.id,this.nomUnique(`champ_${U(e)||r.id}`)),this.clesChamps.set(r.id,W(e)),this.libelles.set(r.id,e),this.libellesLangues.set(r.id,rc(r.contenu)),r.saisie){this.saisies.set(r.id,r.saisie);let e=r.saisie.sorte;(e===`nombre`||e===`case`)&&this.contexte.sortes?.set(r.id,e)}n!==void 0&&this.formulaires.get(n)?.champs.push(r.id)}n!==void 0&&(r.genre===`champ`||r.genre===`bouton`)&&this.formulaireDe.set(r.id,n),(r.genre===`titre`||r.genre===`soustitre`)&&this.niveaux.set(r,r.genre===`soustitre`?r.niveau??2:this.titreVu?2:1),r.genre===`titre`&&(this.titreVu=!0),r.raccourci!==void 0&&this.raccourcis.push(`[${G(r.raccourci)}, () => ${r.genre===`champ`?`focaliser`:`cliquer`}(${G(r.id)})]`);break;case`formulaire`:this.formulaires.set(r.id,{nom:r.nom,champs:[]}),this.recenser(r.corps,t,r.id);break;case`bloc`:this.recenser(r.corps,t,n);break;case`fenetre`:this.fenetres.add(r.id),this.recenser(r.corps,t,n);break;case`condition`:this.recenser(r.alors,t,n),this.recenser(r.sinon,t,n);break;case`repetition`:{this.contexte.types.set(r.variable,r.typeVariable);let e=[...t,{nom:r.variable,type:r.typeVariable}];this.recenser(r.corps,e,n);for(let t of r.gestionnaires)this.enregistrer(t,e);break}case`locale`:this.contexte.types.set(r.nom,r.typeValeur);break;case`composant`:this.besoins.composants=!0}}enregistrer(e,t){if(this.parcourirActions(e.actions),e.declencheur===`chargement`){this.chargements.push(...e.actions);return}if(e.declencheur===`minuterie`){for(let t of e.actions)t.type===`minuterie`&&this.minuteries.push(t);return}if(e.declencheur===`bas`){let n=e.cibles[0]??``,r=this.nomUnique(`quandArriveEnBas${ds(n.replace(/^bloc_/,``))}`,!1);this.fonctions.push({nom:r,parametres:t,actions:e.actions}),this.basDesBlocs.set(n,{fonction:r,gestionnaire:e});return}if(e.declencheur===`touche`){if(e.touches===void 0)return;let n=this.nomUnique(`quandAppuie${ds(e.touches.replace(/\+/g,`_`).replace(/[^a-z0-9_]/g,`_`))}`,!1);this.fonctions.push({nom:n,parametres:t,actions:e.actions});let r=e.cibles[0];this.raccourcis.push(`[${G(e.touches)}, ${n}${r===void 0?``:`, ${G(r)}`}]`);return}if(e.declencheur===`saisie`||e.declencheur===`pauseSaisie`){let n=e.cibles[0]??``,r=e.declencheur===`saisie`,i=this.nomUnique(`quand${r?`Ecrit`:`ArreteDEcrire`}${ds(kd(n))}`,!1);this.fonctions.push({nom:i,parametres:t,actions:e.actions});let a=this.evenements.get(n)??new Map;a.set(r?`onfrappe`:`onpause`,[r?i:`{ faire: ${i}, millisecondes: ${e.millisecondes??300} }`]),this.evenements.set(n,a);return}if(e.declencheur===`soumission`){let n=e.cibles[0]??``,r=this.formulaires.get(n);if(!r)return;let i=this.nomUnique(`quandSoumis${ds(r.nom)}`,!1);this.fonctions.push({nom:i,parametres:t,actions:e.actions,formulaire:n}),r.soumission=t.length===0?i:`() => ${i}(${t.map(e=>Z(e.nom)).join(`, `)})`;return}if(e.declencheur!==`clic`&&e.declencheur!==`survol`)return;let n=hd[e.declencheur],r=e.declencheur===`clic`?`Clique`:`Survole`,i=this.nomUnique(`quand${r}${ds(kd(e.cibles[0]??``))}`,!1);this.fonctions.push({nom:i,parametres:t,actions:e.actions});let a=t.length===0?i:`${i}(${t.map(e=>Z(e.nom)).join(`, `)})`;for(let t of e.cibles){let e=this.evenements.get(t)??new Map;e.set(n,[...e.get(n)??[],a]),this.evenements.set(t,e)}}parcourirActions(e){for(let t of e)switch(t.type){case`visibilite`:for(let e of t.ids)(t.visible?this.montres:this.caches).add(e);break;case`changerTexte`:for(let e of t.ids)this.textesChanges.add(e);break;case`requete`:case`suppression`:case`modification`:this.besoins.serveur=!0;break;case`connexion`:for(let[e,n]of[[t.email,this.champsEmail],[t.motDePasse,this.champsMotDePasse]])e.type===`champ`&&n.add(e.id);break;case`locale`:this.contexte.types.set(t.nom,t.typeValeur);break;case`si`:this.parcourirActions(t.alors),this.parcourirActions(t.sinon);break;case`repetition`:this.contexte.types.set(t.variable,t.typeVariable),this.parcourirActions(t.corps);break;case`tantQue`:case`repeter`:case`selon`:case`minuterie`:case`confirmation`:case`message`:for(let e of Kl(t))this.parcourirActions(e)}}nomUnique(e,t=!0){let n=t?Z(e):e,r=n;for(let e=2;this.nomsPris.has(r);e++)r=`${n}${e}`;return this.nomsPris.add(r),r}messageCopier(){return this.site.langues&&ec(`Copier`,this.site.langues.map(e=>e.code))||[{code:`fr`,texte:`Copier`}]}generer(){let{titre:e,description:t}=Bu(this.ecran,this.site.langues),n=new wu;for(let e of this.ecran.calculs)this.ecrireCalcul(n,e.nom,e.valeur);for(let e of this.fonctions)this.ecrireFonction(n,e);if(this.chargements.length>0){n.ligne(),n.ligne(`/** « quand la page se charge » : une fois, au démarrage. */`);let e=jd(this.chargements)?`async `:``;n.bloc(`${e}function auChargement() {`,()=>this.ecrireActions(n,this.chargements,new Set,Pd(this.chargements)))}this.minuteries.length>0&&(n.ligne(),n.ligne(`/** Les minuteries de la page : démarrées à son ouverture, chacune seulement tant que sa condition est vraie. */`),n.bloc(`const minuteries = [`,()=>{for(let e of this.minuteries)n.bloc(`{`,()=>{this.dansMinuterie=!0,n.bloc(`${jd(e.corps)?`async `:``}faire(${Nd(e.corps)?`arreter`:``}) {`,()=>this.ecrireActions(n,e.corps,new Set,Pd(e.corps)),`},`),this.dansMinuterie=!1,n.ligne(`millisecondes: () => ${Q(e.millisecondes,this.contexte)},`),e.mode===`toutes`&&n.ligne(`repete: true,`),e.tantQue&&n.ligne(`actif: () => ${id(e.tantQue,this.contexte)},`)},`},`)},`];`)),this.raccourcis.length>0&&(n.ligne(),n.ligne(`/** Les raccourcis de la page : ses touches, ce qu’il fait, et l’élément où doit être le focus. */`),n.bloc(`const raccourcis = [`,()=>this.raccourcis.forEach(e=>n.ligne(`${e},`)),`];`));let r=new wu;r.ligne(),r.ligne(`/** Le contenu de la page, d’après l’état : au démarrage, puis après chaque événement. */`),r.bloc(`function dessiner() {`,()=>this.ecrireRetour(r,this.ecran.vue));let i=n.texte()+r.texte(),a=this.site.partages.filter(e=>RegExp(`\\b${Z(e.nom)}\\b`).test(i)),o=new wu;this.ecrireEtat(o,a);let s=new wu,c=this.ecrireMemoire(s,a);this.chargements.length>0&&c.push(`auChargement`),this.minuteries.length>0&&c.push(`minuteries`),this.raccourcis.length>0&&c.push(`raccourcis`),this.besoins.session=/\butilisateur\.(connecte|admin|seConnecter|seDeconnecter)\b/.test(i),this.besoins.session&&c.push(`session: true`);let l=[o.texte(),n.texte(),s.texte(),r.texte(),`\nhumalis.demarrer({ ${c.join(`, `)} });\n`].filter(e=>e!==`
|
|
1486
|
+
`).join(``).replace(/^\n+/,``),u=Td.filter(e=>RegExp(`\\b${e}(\\(|\\.)`).test(l)),d=[`// Produit par Humalis depuis ${this.source} : la page « ${this.ecran.nom} ».`,`// Son HTML contient déjà le contenu de départ, lisible sans JavaScript ;`,`// ce script le redessine d’après l’état, après chaque événement.`,`'use strict';`,``,...u.length>0?[`const { ${u.join(`, `)} } = humalis;`,``]:[]].join(`
|
|
1487
|
+
`),f=[];return this.ecrireGroupeHtml(this.ecran.vue,this.environnement(),f),{html:f,script:`${d}\n${l}`,titre:e,description:t,session:this.besoins.session,composants:this.besoins.composants,serveur:this.besoins.serveur}}fonctionComposant(){let e=(this.parametres??[]).map(e=>Z(e.nom)).join(`, `),t=new wu;t.indenter(()=>{for(let e of this.ecran.calculs)t.bloc(`function ${Z(e.nom)}() {`,()=>t.ligne(`return ${Q(e.valeur,this.contexte)};`));this.ecrireRetour(t,this.ecran.vue)});let n=t.texte(),r=Td.filter(e=>RegExp(`\\b${e}(\\(|\\.)`).test(n)),i=r.length>0?` const { ${r.join(`, `)} } = humalis;\n`:``;return`/** Le composant « ${this.ecran.nom} »${e?` : il reçoit ${e}`:``}. */
|
|
1460
1488
|
function ${ds(this.ecran.nom)}(${e?`{ ${e} }`:``}) {
|
|
1461
1489
|
${i}${n}}
|
|
1462
|
-
`}htmlComposant(e,t){let n=new td(this.contexte.types);for(let t of this.parametres??[])n.definir(t.nom,e.get(t.nom));for(let e of this.ecran.calculs)n.definirCalcul(e.nom,e.valeur);this.ecrireGroupeHtml(this.ecran.vue,n,t)}ecrireEtat(e,t){if(this.ecran.parametresAdresse?.length){e.ligne(`// Les paramètres de la page, lus dans son adresse (produit.html?id=…).`);for(let t of this.ecran.parametresAdresse)e.ligne(`const ${Z(t)} = new URLSearchParams(location.search).get(${G(W(t))}) ?? '';`)}if(this.ecran.etat.length>0){e.ligne(`// L’état de la page.`);for(let t of this.ecran.etat)e.ligne(`let ${Z(t.nom)} = ${Q(t.initiale,this.contexte)};`)}if(t.length>0){e.ligne(`// Partagées entre les pages (« avec partagee ») : relues au démarrage.`);for(let n of t)e.ligne(`let ${Z(n.nom)} = ${Q(n.initiale,this.contexte)};`)}if(this.contexte.champs.size>0){e.ligne(`// Ce qui est tapé dans les champs.`);for(let[t,n]of this.contexte.champs)e.ligne(`let ${n} = ${this.contexte.sortes?.get(t)===`case`?`false`:`''`};`)}let n=[...new Set([...this.montres,...this.caches,...this.fenetres])];n.length>0&&(e.ligne(`// Les éléments montrés ou cachés.`),e.ligne(`let visibilite = { ${n.map(e=>`${G(e)}: ${!this.montres.has(e)&&!this.fenetres.has(e)}`).join(`, `)} };`)),this.textesChanges.size>0&&(e.ligne(`// Les textes changés par un événement.`),e.ligne(`let textes = {};`))}ecrireCalcul(e,t,n){e.ligne(),e.ligne(`/** « calcul ${t} » : recalculé à chaque fois. */`),e.bloc(`function ${Z(t)}() {`,()=>e.ligne(`return ${Q(n,this.contexte)};`))}ecrireMemoire(e,t){let n=[];for(let e of t){if(e.lectureSeule)continue;let[t,r]=e.memorisee?[`lireMemoire`,`garderMemoire`]:[`lirePartage`,`garderPartage`];n.push({nom:Z(e.nom),lire:t,garder:r,cle:`${this.site.cle}:partage:${e.nom}`})}for(let e of this.ecran.etat)e.memorisee&&n.push({nom:Z(e.nom),lire:`lireMemoire`,garder:`garderMemoire`,cle:`${this.site.cle}:${U(this.ecran.nom)}:${U(e.nom)}`});return n.length===0?[`dessiner`]:(e.ligne(),e.ligne(`/** Relit ce qui est gardé hors de la page : partagé entre les pages, ou mémorisé. */`),e.bloc(`function relire() {`,()=>{for(let t of n)e.ligne(`${t.nom} = ${t.lire}(${G(t.cle)}, ${t.nom});`)}),e.ligne(),e.ligne(`/** Garde ces variables, pour les autres pages et pour le retour du visiteur. */`),e.bloc(`function garder() {`,()=>{for(let t of n)e.ligne(`${t.garder}(${G(t.cle)}, ${t.nom});`)}),[`relire`,`garder`,`dessiner`])}ecrireFonction(e,t){let n=t.parametres.map(e=>Z(e.nom)).join(`, `),r=Dd(t.actions)?`async `:``,i=new Set(t.parametres.map(e=>e.nom)),a=t.formulaire===void 0?void 0:this.formulaires.get(t.formulaire);e.ligne(),this.dansEvenement=!0,e.bloc(`${r}function ${t.nom}(${n}) {`,()=>{if(!a){this.ecrireActions(e,t.actions,i,Ad(t.actions));return}for(let t of a.champs)for(let[n,r]of this.verifications(t))e.bloc(`if (${n}) {`,()=>{e.ligne(`afficherMessage(${ic(r,G)}, 'erreur');`),e.ligne(`return;`)});Ed(t.actions)&&(this.echecs=this.nomsPris.has(`echecs`)?`echecsAvantEnvoi`:`echecs`,e.ligne(`const ${this.echecs} = serveur.echecs();`)),this.ecrireActions(e,t.actions,i,Ad(t.actions)),this.echecs=void 0;for(let t of a.champs){let n=this.contexte.champs.get(t);n&&e.ligne(`${n} = ${this.contexte.sortes?.get(t)===`case`?`false`:`''`};`)}}),this.dansEvenement=!1}verifications(e){let t=this.contexte.champs.get(e);if(t===void 0)return[];let n=this.libelles.get(e)??e,r=(this.site.langues??[{code:`fr`}]).map(({code:t})=>({code:t,libelle:this.libellesLangues.get(e)?.get(t)??n}));return tc(t,this.saisies.get(e),r)}fonctionGlobale(e){let t=new xu;for(let t of e.parametres)this.contexte.types.set(t.nom,t.type);return t.bloc(`function ${Z(e.nom)}(${e.parametres.map(e=>Z(e.nom)).join(`, `)}) {`,()=>this.ecrireActions(t,e.corps,new Set(e.parametres.map(e=>e.nom)),Ad(e.corps))),t.texte()}ecrireActions(e,t,n,r){let i=e=>Q(e,this.contexte);for(let a of t)switch(a.type){case`rendre`:e.ligne(`return ${i(a.valeur)};`);break;case`message`:{let t=[...a.duree?[`duree: ${i(a.duree)}`]:[],...a.persistant?[`persistant: true`]:[]],o=`afficherMessage(${i(a.texte)}, '${a.genre}'`;if(!a.action){e.ligne(`${o}${t.length>0?`, { ${t.join(`, `)} }`:``});`);break}let s=a.action;e.bloc(`${o}, {`,()=>{for(let n of t)e.ligne(`${n},`);e.bloc(`action: { libelle: ${G(s.libelle)}, ${Dd(s.actions)?`async `:``}faire() {`,()=>this.ecrireActions(e,s.actions,new Set(n),r),`} },`)},`});`);break}case`confirmation`:e.bloc(`if (await confirmer(${i(a.question)}${a.oui!==`Oui`||a.non!==`Non`?`, { oui: ${G(a.oui)}, non: ${G(a.non)} }`:``})) {`,()=>this.ecrireActions(e,a.alors,n,r),a.sinon.length>0?`} else {`:`}`),a.sinon.length>0&&(e.indenter(()=>this.ecrireActions(e,a.sinon,n,r)),e.ligne(`}`));break;case`copie`:e.ligne(`await copier(${this.enTexte(a.valeur)}${a.message===null?`, null`:a.texte?`, ${i(a.texte)}`:a.message===`Copié`?``:`, ${G(a.message)}`});`);break;case`partage`:{let t=a.lien,n=t?`externe`in t?G(t.externe):`new URL(${t.arguments?.length?this.adresseAvec(t.ecran,t.arguments):G(this.fichier(t.ecran))}, location.href).href`:void 0,r=[`texte: ${this.enTexte(a.texte)}`,...a.titre?[`titre: ${this.enTexte(a.titre)}`]:[],...n?[`adresse: ${n}`]:[]];e.ligne(`await partager({ ${r.join(`, `)} });`);break}case`minuterie`:{let t=[...a.mode===`toutes`?[`repete: true`]:[],...a.tantQue?[`tantQue: () => ${ed(a.tantQue,this.contexte)}`]:[]],o=this.dansMinuterie;this.dansMinuterie=!0,e.bloc(`planifier(${Dd(a.corps)?`async `:``}(${kd(a.corps)?`arreter`:``}) => {`,()=>this.ecrireActions(e,a.corps,new Set(n),r),`}, ${i(a.millisecondes)}${t.length>0?`, { ${t.join(`, `)} }`:``});`),this.dansMinuterie=o;break}case`visibilite`:for(let t of a.ids)e.ligne(`visibilite = { ...visibilite, ${G(t)}: ${a.visible} };`);break;case`navigation`:{let t=Cd(a.ecran),n=a.arguments&&t!==void 0?this.adresseAvec(t,a.arguments):this.adresse(a.ecran);e.ligne(`location.assign(${n});`);break}case`changerTexte`:for(let t of a.ids)e.ligne(`textes = { ...textes, ${G(t)}: ${i(a.texte)} };`);break;case`theme`:e.ligne(`definirTheme(${G(a.valeur)});`);break;case`langue`:e.ligne(`changerLangue(${G(a.code)});`);break;case`affectation`:e.ligne(`${Z(a.nom)} = ${a.champs?Cu(Z(a.nom),a.champs,i(a.valeur)):i(a.valeur)};`);break;case`locale`:n.add(a.nom),e.ligne(`${r.has(a.nom)?`let`:`const`} ${Z(a.nom)} = ${i(a.valeur)};`);break;case`ajout`:e.ligne(`${Z(a.liste)} = [...${Z(a.liste)}, ${i(a.valeur)}];`);break;case`retrait`:e.ligne(`${Z(a.liste)} = retirerPremier(${Z(a.liste)}, ${i(a.valeur)});`);break;case`requete`:{let t=[G(a.adresse)];a.mode===`envoyer`&&t.push(this.donnees(a.donnees,a.cles)),a.mode===`lireUn`&&t.push(i(a.donnees[0]));let n=`await serveur.${a.mode}(${t.join(`, `)}`;if(a.resultat!==void 0&&this.dansEvenement){let t=++this.dernieres;e.ligne(`const derniere${t} = derniereRequete(${G(a.resultat)});`),e.ligne(`const reponse${t} = ${n}, ${Z(a.resultat)});`),e.ligne(`if (!derniere${t}()) return;`),e.ligne(`${Z(a.resultat)} = reponse${t};`)}else a.resultat===void 0?e.ligne(`${n});`):e.ligne(`${Z(a.resultat)} = ${n}, ${Z(a.resultat)});`);this.echecs&&a.mode===`envoyer`&&e.ligne(`if (serveur.echecs() > ${this.echecs}) return;`);break}case`suppression`:case`modification`:{let t=a.type===`suppression`?`await serveur.supprimer(${G(a.adresse)}, ${i(a.objet)}.id);`:`await serveur.modifier(${G(a.adresse)}, ${i(a.objet)}.id, { ${a.changements.map(e=>W(e.champ)===i(e.valeur)?i(e.valeur):`${W(e.champ)}: ${i(e.valeur)}`).join(`, `)} });`;a.objet.type===`variable`&&this.contexte.facultatives?.has(a.objet.nom)?e.bloc(`if (${i(a.objet)} !== null) {`,()=>e.ligne(t)):e.ligne(t),this.echecs&&e.ligne(`if (serveur.echecs() > ${this.echecs}) return;`);break}case`connexion`:{let t=a.motDePasse.type===`champ`?this.contexte.champs.get(a.motDePasse.id):void 0,n=i(a.motDePasse);t&&(e.ligne(`const motDePasseSaisi = ${t};`),e.ligne(`${t} = '';`),n=`motDePasseSaisi`),e.ligne(`if (!(await utilisateur.seConnecter(${i(a.email)}, ${n}))) return;`);break}case`deconnexion`:e.ligne(`await utilisateur.seDeconnecter();`);break;case`si`:e.bloc(`if (${ed(a.test,this.contexte)}) {`,()=>this.ecrireActions(e,a.alors,n,r),a.sinon.length>0?`} else {`:`}`),a.sinon.length>0&&(e.indenter(()=>this.ecrireActions(e,a.sinon,n,r)),e.ligne(`}`));break;case`repetition`:n.add(a.variable),e.bloc(`for (const ${Z(a.variable)} of ${i(a.liste)}) {`,()=>this.dansUneBoucle(()=>this.ecrireActions(e,a.corps,n,r)));break;case`tantQue`:e.bloc(`while (${ed(a.test,this.contexte)}) {`,()=>this.dansUneBoucle(()=>this.ecrireActions(e,a.corps,n,r)));break;case`repeter`:e.bloc(`for (let fois = 0; fois < ${i(a.fois)}; fois++) {`,()=>this.dansUneBoucle(()=>this.ecrireActions(e,a.corps,n,r)));break;case`arreter`:this.dansMinuterie?(e.ligne(`arreter();`),e.ligne(`return;`)):e.ligne(`break;`);break;case`passer`:e.ligne(`continue;`);break;case`selon`:{let t=i(a.valeur);a.cas.forEach((a,o)=>{let s=a.valeurs.map(e=>`${t} === ${i(e)}`).join(` || `);e.ligne(`${o===0?``:`} else `}if (${s}) {`),e.indenter(()=>this.ecrireActions(e,a.corps,n,r))}),a.sinon.length>0&&(e.ligne(a.cas.length>0?`} else {`:`{`),e.indenter(()=>this.ecrireActions(e,a.sinon,n,r))),(a.cas.length>0||a.sinon.length>0)&&e.ligne(`}`);break}}}enTexte(e){let t=Q(e,this.contexte),n=Su(e,{types:this.contexte.types,champs:this.contexte.champs,sortes:this.contexte.sortes}).genre;return n===`texte`?t:n===`nombre`?`formaterNombre(${t})`:`String(${t})`}voirPlusJs(e,t,n){return[`creer('div', { class: 'humalis-sentinelle', 'data-humalis': ${G(`${e}-bas`)}, 'aria-hidden': 'true', onbas: ${t} })`,...n===null?[]:[`creer('button', { type: 'button', class: 'humalis-voir-plus', 'data-humalis': ${G(`${e}-voir-plus`)}, onclick: ${t} }, ${n===`Voir plus`&&this.site.langues?`t({ fr: 'Voir plus', en: 'See more' })`:G(n)})`]]}dansUneBoucle(e){let t=this.dansMinuterie;this.dansMinuterie=!1,e(),this.dansMinuterie=t}donnees(e,t){return`{ ${e.map((e,n)=>{let r=t?.[n],i=r===void 0?e.type===`champ`?this.clesChamps.get(e.id)??W(e.id):e.type===`variable`?Z(e.nom):`valeur`:/^[A-Za-z_]\w*$/.test(r)?r:JSON.stringify(r),a=Q(e,this.contexte);return i===a?i:`${i}: ${a}`}).join(`, `)} }`}adresseAvec(e,t){let n=t.map(e=>`${W(e.nom)}=\${encodeURIComponent(String(${Q(e.valeur,this.contexte)}))}`).join(`&`);return`\`${this.fichier(e)}?${n}\``}adresse(e){let t=Cd(e);return t===void 0?`adresseDe(${Q(e,this.contexte)})`:G(this.fichier(t))}fichier(e){return this.site.fichiers.get(e)??`${U(e)||`index`}.html`}ecrireRetour(e,t){for(let n of t)n.type===`locale`&&e.ligne(`const ${Z(n.nom)} = ${Q(n.valeur,this.contexte)};`);e.ligne(`return [`),e.indenter(()=>this.ecrireVue(e,t)),e.ligne(`];`)}ecrireGroupe(e,t,n,r){t.some(e=>e.type===`locale`)?e.bloc(`${n}(() => {`,()=>this.ecrireRetour(e,t),`})()${r}`):e.bloc(`${n}[`,()=>this.ecrireVue(e,t),`]${r}`)}ecrireVue(e,t){for(let n of t)switch(n.type){case`element`:{let t=this.elementJs(n);this.montres.has(n.id)||this.caches.has(n.id)?e.ligne(`...(visibilite[${G(n.id)}] ? [${t}] : []),`):e.ligne(`${t},`);break}case`condition`:e.ligne(`...(${ed(n.test,this.contexte)}`),e.indenter(()=>{this.ecrireGroupe(e,n.alors,`? `,``),n.sinon.length>0?this.ecrireGroupe(e,n.sinon,`: `,`),`):e.ligne(`: []),`)});break;case`repetition`:{let t=`...${Q(n.liste,this.contexte)}.flatMap((${Z(n.variable)}) => `;n.corps.some(e=>e.type===`locale`)?e.bloc(`${t}{`,()=>this.ecrireRetour(e,n.corps),`}),`):e.bloc(`${t}[`,()=>this.ecrireVue(e,n.corps),`]),`);break}case`widget`:this.ecrireEnfantJs(e,Hu(n.genre,this.aide(n,this.environnement())));break;case`carte`:this.carteJs(e,n);break;case`marqueur`:break;case`fenetre`:{let t=[`titre: ${G(n.titre)}`,...n.description===void 0?[]:[`description: ${G(n.description)}`],...n.obligatoire?[`obligatoire: true`]:[],...n.classes.length>0?[`classes: ${G(n.classes.join(` `))}`]:[],`ouverte: visibilite[${G(n.id)}]`,`fermer: () => { visibilite = { ...visibilite, ${G(n.id)}: false }; }`];this.ecrireGroupe(e,n.corps,`fenetre(${G(n.id)}, { ${t.join(`, `)} }, ...`,`),`);break}case`graphique`:e.ligne(`${Ol(n,e=>Q(e,this.contexte))},`);break;case`codeDocumentation`:let t=nu(n),r=t?`, 'data-humalis-frappe': '${t.frappe}', 'data-humalis-frappe-cle': '${t.cle}'`:``;e.ligne(`creer('div', { class: 'humalis-bloc-code-conteneur' }, creer('pre', { class: 'humalis-bloc-code${t?` ${t.classe}`:``}', 'data-langage': ${G(n.langage??``)}${r} }, (() => { const code = document.createElement('code'); code.innerHTML = ${G(Mu(n.code,n.langage))}; return code; })()), creer('button', { type: 'button', onclick: () => copier(${G(n.code)}) }, ${ic(this.messageCopier(),G)})),`);break;case`tableauDocumentation`:{let t=(e,t)=>`creer('${t}', {}, ${this.contenuAccentJs(e,`texte`)})`,r=(e,n)=>`creer('tr', {}, ${e.map(e=>t(e,n)).join(`, `)})`;e.ligne(`creer('div', { class: 'humalis-tableau-conteneur' }, creer('table', {}, creer('caption', {}, ${this.contenuAccentJs(n.legende,`texte`)}), creer('thead', {}, ${r(n.colonnes,`th`)}), creer('tbody', {}, ${n.rangees.map(e=>r(e,`td`)).join(`, `)}))),`);break}case`bloc`:{if(n.genre===`liste`||n.genre===`listeNumerotee`){let t=n.genre===`liste`?`ul`:`ol`;e.ligne(`creer('${t}', { class: 'humalis-liste' },`),e.indenter(()=>n.corps.forEach(t=>{if(t.type===`repetition`){let n=`...${Q(t.liste,this.contexte)}.flatMap((${Z(t.variable)}) => `;e.bloc(`${n}[`,()=>this.ecrireGroupe(e,t.corps,`creer('li', {}, ...`,`),`),`]),`)}else this.ecrireGroupe(e,[t],`creer('li', {}, ...`,`),`)})),e.ligne(`),`);break}if(vd.has(n.genre)){this.ecrireEnfantJs(e,Wu(this.aideComposite(n,this.environnement())));break}let t=yd[n.genre]??`div`,r=_d(n)?`creer('button', { type: 'button', class: 'humalis-menu-bouton', 'aria-expanded': 'false', 'aria-label': 'Menu' }, creer('span', { class: 'humalis-menu-icone', 'aria-hidden': 'true' })), `:``;this.ecrireGroupe(e,n.corps,`creer('${t}', { class: ${G(jd(n))} }, ${r}...`,`),`);let i=n.id===void 0?void 0:this.basDesBlocs.get(n.id);if(i){let t=this.voirPlusJs(n.id,i.fonction,i.gestionnaire.bouton??null),r=i.gestionnaire.tantQue?ed(i.gestionnaire.tantQue,this.contexte):void 0;r?e.ligne(`...(${r} ? [${t.join(`, `)}] : []),`):t.forEach(t=>e.ligne(`${t},`))}break}case`formulaire`:{let t=this.formulaires.get(n.id)?.soumission??`() => {}`,r=`creer('form', { 'data-humalis': ${G(n.id)}, class: 'humalis-formulaire', novalidate: true, onsubmit: ${t} }, ...`;this.montres.has(n.id)||this.caches.has(n.id)?this.ecrireGroupe(e,n.corps,`...(visibilite[${G(n.id)}] ? [${r}`,`)] : []),`):this.ecrireGroupe(e,n.corps,r,`),`);break}case`composant`:{let t=n.proprietes.map(e=>`${Z(e.nom)}: ${Q(e.valeur,this.contexte)}`);e.ligne(`...${n.nom}(${t.length?`{ ${t.join(`, `)} }`:``}),`);break}}}elementJs(e){let t=(t=[])=>{let n=[...t,[`'data-humalis'`,G(e.id)]],r=this.classes(e);r&&n.push([`class`,G(r)]),e.annonce&&n.push([`'aria-live'`,`'polite'`],[`'aria-atomic'`,`'true'`]);for(let[t,r]of bd(e))n.push([G(t),G(r)]);for(let[t,r]of this.evenements.get(e.id)??[]){let e=r.length===1&&!r[0].includes(`(`)?r[0]:r.length===1?`() => ${r[0]}`:`async () => { ${r.map(e=>`await ${e.includes(`(`)?e:`${e}()`};`).join(` `)} }`;n.push([t,e])}return n},n=e=>`{ ${e.map(([e,t])=>`${e}: ${t}`).join(`, `)} }`,r=e.reglages?.icone?Ha(e.reglages.icone)?.lucide:void 0,i=(r?`icone(${G(r)}, 'humalis-icone'), `:``)+(this.textesChanges.has(e.id)?`textes[${G(e.id)}] ?? ${Qu(e.contenu,this.contexte)}`:this.contenuAccentJs(e.contenu,e.genre));switch(e.genre){case`titre`:case`soustitre`:return`creer('h${this.niveaux.get(e)??1}', ${n(t())}, ${i})`;case`texte`:return`creer('p', ${n(t())}, ${i})`;case`bouton`:return`creer('button', ${n(t([[`type`,this.formulaireDe.has(e.id)&&!this.evenements.has(e.id)?`'submit'`:`'button'`]]))}, ${i})`;case`lien`:return`creer('a', ${n(t([[`href`,e.arguments&&e.cible!==void 0?this.adresseAvec(e.cible,e.arguments):G(this.fichier(e.cible??``))]]))}, ${i})`;case`image`:{if(e.image)return`creer('img', ${n(t(this.attributsImage(e.image,e.contenu,e=>Q(e,this.contexte),G,e=>`'${e}'`)))})`;let r=Cd(e.contenu);return`creer('img', ${n(t([[`src`,r===void 0?Q(e.contenu,this.contexte):G(r)],[`alt`,G(e.reglages?.decoratif?``:e.reglages?.description??Sd(r))],...e.reglages?.decoratif?[[`aria-hidden`,`'true'`]]:[]]))})`}case`champ`:return this.champJs(e,t,n,i)}}champJs(e,t,n,r){let i=this.contexte.champs.get(e.id),a=e.saisie,o=a?.sorte??`texte`,s=`(evenement) => { ${i} = evenement.target.value; }`,c=a?.obligatoire?`creer('span', {}, ${r}, creer('span', { class: 'humalis-obligatoire', 'aria-hidden': 'true' }, ' *'))`:r,l=e=>(a?.obligatoire&&e.push([`required`,`true`]),a?.indice!==void 0&&o!==`liste`&&e.push([`placeholder`,a.indiceLangues?ic(a.indiceLangues,G):G(a.indice)]),a?.minimum!==void 0&&e.push([`min`,String(a.minimum)]),a?.maximum!==void 0&&e.push([`max`,String(a.maximum)]),e);switch(o){case`case`:{let e=l(t([[`type`,`'checkbox'`]]));return e.push([`checked`,i],[`oninput`,`(evenement) => { ${i} = evenement.target.checked; }`]),`creer('label', { class: 'humalis-case' }, creer('input', ${n(e)}), ${c})`}case`choix`:{let t=a?.parmi?Q(a.parmi,this.contexte):`[]`,r=`creer('input', { type: 'radio', name: ${G(e.id)}, value: valeur, checked: ${i} === valeur, oninput: () => { ${i} = valeur; } })`,o=this.classes(e);return`creer('fieldset', ${n([[`'data-humalis'`,G(e.id)],[`class`,G(o?`${o} humalis-choix`:`humalis-choix`)]])}, creer('legend', {}, ${c}), ...${t}.map((valeur) => creer('label', {}, ${r}, valeur)))`}case`liste`:{let e=a?.parmi?Q(a.parmi,this.contexte):`[]`,r=l(t());r.push([`oninput`,s]);let o=`creer('option', { value: '', selected: ${i} === '' }, ${a?.indiceLangues?ic(a.indiceLangues,G):G(a?.indice??`Choisissez…`)})`;return`creer('label', { class: 'humalis-champ' }, ${c}, creer('select', ${n(r)}, ${o}, ...${e}.map((valeur) => creer('option', { value: valeur, selected: ${i} === valeur }, valeur))))`}case`texteLong`:{let e=l(t([[`rows`,`4`]]));return e.push([`value`,i],[`oninput`,s]),`creer('label', { class: 'humalis-champ' }, ${c}, creer('textarea', ${n(e)}))`}default:{let r=this.genreChamp(e)??ud[o],a=t();return r&&a.push([`type`,G(r.type)]),r?.autocomplete&&a.push([`autocomplete`,G(r.autocomplete)]),l(a),a.push([`value`,i],[`oninput`,s]),`creer('label', { class: 'humalis-champ' }, ${c}, creer('input', ${n(a)}))`}}}attributsImage(e,t,n,r,i=e=>e){let a=e.locale===void 0?void 0:this.site.medias?.get(e.locale),o=[[i(`src`),e.locale===void 0?n(t):r(`images/${Ks(e.locale)}`)],[i(`alt`),e.description?n(e.description):r(``)]];return a?.largeur&&a.hauteur&&o.push([i(`width`),r(String(a.largeur))],[i(`height`),r(String(a.hauteur))]),o.push(e.prioritaire?[i(`fetchpriority`),r(`high`)]:[i(`loading`),r(`lazy`)],[i(`decoding`),r(`async`)]),e.description||o.push([i(`aria-hidden`),r(`true`)]),e.proportions&&o.push([i(`style`),r(`aspect-ratio: ${e.proportions[0]} / ${e.proportions[1]}`)]),o}classes(e){return[...e.options.map(e=>`humalis-${e.nom}-${e.valeur}`),...e.classes].join(` `)}genreChamp(e){if(this.champsMotDePasse.has(e.id))return{type:`password`,autocomplete:`current-password`};if(this.champsEmail.has(e.id))return{type:`email`,autocomplete:`username`}}environnement(){let e=new td(this.contexte.types);for(let t of this.ecran.parametresAdresse??[])e.definir(t,``);this.site.langues&&e.definir(`langue`,this.site.langues[0].code);for(let t of[...this.site.partages,...this.ecran.etat])e.definir(t.nom,$(t.initiale,e));for(let t of this.ecran.calculs)e.definirCalcul(t.nom,t.valeur);return e}ecrireHtml(e,t,n){for(let r of e)switch(r.type){case`element`:this.montres.has(r.id)||n.push(this.elementHtml(r,t));break;case`condition`:this.ecrireGroupeHtml(id(r.test,t,this.contexte.champs)?r.alors:r.sinon,t,n);break;case`repetition`:{let e=$(r.liste,t);for(let i of Array.isArray(e)?e:[])this.ecrireGroupeHtml(r.corps,t.enfant().definir(r.variable,i),n);break}case`widget`:this.ecrireEnfantHtml(Hu(r.genre,this.aide(r,t)),t,n);break;case`carte`:this.carteHtml(r,t,n);break;case`marqueur`:break;case`fenetre`:n.push(`<dialog${J([[`data-humalis`,r.id],[`class`,[`humalis-fenetre`,...r.classes].join(` `)],[`aria-labelledby`,`${r.id}-titre`],[`aria-describedby`,r.description===void 0?void 0:`${r.id}-description`]])}>`),n.push(`<div class="humalis-fenetre-contenu">`),n.push(`<h2${J([[`id`,`${r.id}-titre`]])}>${q(r.titre)}</h2>`),r.description!==void 0&&n.push(`<p${J([[`id`,`${r.id}-description`]])}>${q(r.description)}</p>`),this.ecrireGroupeHtml(r.corps,t,n),n.push(`<button type="button" class="humalis-fenetre-fermer" aria-label="Fermer">×</button>`),n.push(`</div>`),n.push(`</dialog>`);break;case`graphique`:n.push(kl(r,e=>this.initial(e,t),e=>this.texteInitial(e,t)));break;case`codeDocumentation`:let e=nu(r),i=e?` data-humalis-frappe="${e.frappe}" data-humalis-frappe-cle="${e.cle}"`:``;n.push(`<div class="humalis-bloc-code-conteneur"><pre class="humalis-bloc-code${e?` ${e.classe}`:``}" data-langage="${q(r.langage??``)}"${i}><code>${Mu(r.code,r.langage)}</code></pre><button type="button">${q(this.messageCopier()[0].texte)}</button></div>`);break;case`tableauDocumentation`:{let e=(e,n)=>`<${n}>${this.contenuAccentHtml(e,`texte`,t)}</${n}>`;n.push(`<div class="humalis-tableau-conteneur"><table>`),n.push(`<caption>${this.contenuAccentHtml(r.legende,`texte`,t)}</caption><thead><tr>${r.colonnes.map(t=>e(t,`th`)).join(``)}</tr></thead><tbody>`);for(let t of r.rangees)n.push(`<tr>${t.map(t=>e(t,`td`)).join(``)}</tr>`);n.push(`</tbody></table></div>`);break}case`bloc`:{if(r.genre===`liste`||r.genre===`listeNumerotee`){let e=r.genre===`liste`?`ul`:`ol`;n.push(`<${e} class="humalis-liste">`);for(let e of r.corps){if(e.type===`repetition`){let r=$(e.liste,t);for(let i of Array.isArray(r)?r:[])n.push(`<li>`),this.ecrireGroupeHtml(e.corps,t.enfant().definir(e.variable,i),n),n.push(`</li>`);continue}n.push(`<li>`),this.ecrireGroupeHtml([e],t,n),n.push(`</li>`)}n.push(`</${e}>`);break}if(vd.has(r.genre)){this.ecrireEnfantHtml(Wu(this.aideComposite(r,t)),t,n);break}let e=yd[r.genre]??`div`;n.push(`<${e}${J([[`class`,jd(r)]])}>`),_d(r)&&n.push(`<button type="button" class="humalis-menu-bouton" aria-expanded="false" aria-label="Menu"><span class="humalis-menu-icone" aria-hidden="true"></span></button>`),this.ecrireGroupeHtml(r.corps,t,n),n.push(`</${e}>`);let i=r.id===void 0?void 0:this.basDesBlocs.get(r.id);i&&(!i.gestionnaire.tantQue||id(i.gestionnaire.tantQue,t,this.contexte.champs))&&(n.push(`<div class="humalis-sentinelle" data-humalis="${r.id}-bas" aria-hidden="true"></div>`),i.gestionnaire.bouton!==null&&n.push(`<button type="button" class="humalis-voir-plus" data-humalis="${r.id}-voir-plus">${q(i.gestionnaire.bouton??`Voir plus`)}</button>`));break}case`formulaire`:if(this.montres.has(r.id))break;n.push(`<form${J([[`data-humalis`,r.id],[`class`,`humalis-formulaire`],[`novalidate`,`true`]])}>`),this.ecrireGroupeHtml(r.corps,t,n),n.push(`</form>`);break;case`composant`:{let e=this.site.composants.get(r.nom);if(!e)throw Error(`le composant « ${r.nom} » n'est pas écrit en Humalis`);let i=new Map(r.proprietes.map(e=>[e.nom,$(e.valeur,t)]));hd(e,this.site,i,n);break}}}ecrireGroupeHtml(e,t,n){let r=t.enfant();for(let t of e)t.type===`locale`&&r.definir(t.nom,$(t.valeur,r));this.ecrireHtml(e,r,n)}initial(e,t){try{return $(e,t)}catch{return}}contenuAccentJs(e,t){if(e.type!==`texte`||![`titre`,`soustitre`,`texte`].includes(t))return Qu(e,this.contexte);let n=e=>e.map(e=>`texte`in e?e.accent?`creer('span', { class: 'humalis-accent' }, ${G(e.texte)})`:e.code?`creer('code', { class: 'humalis-code-ligne' }, ${G(e.texte)})`:G(e.texte):Qu({type:`texte`,parties:[e]},this.contexte)).join(`, `),r=e=>e.some(e=>`texte`in e&&(e.accent||e.code));return!r(e.parties)&&!e.versions?.some(e=>r(e.parties))?Qu(e,this.contexte):e.versions?`...(${e.versions.slice(1).map(e=>`langue() === ${G(e.code)} ? [${n(e.parties)}] : `).join(``)}[${n(e.versions[0].parties)}])`:n(e.parties)}contenuAccentHtml(e,t,n){return e.type!==`texte`||![`titre`,`soustitre`,`texte`].includes(t)||!e.parties.some(e=>`texte`in e&&(e.accent||e.code))?q(rd(e,n,this.contexte.champs)):e.parties.map(e=>{let t=q(`texte`in e?e.texte:rd({type:`texte`,parties:[e]},n,this.contexte.champs));return`texte`in e&&e.accent?`<span class="humalis-accent">${t}</span>`:`texte`in e&&e.code?`<code class="humalis-code-ligne">${t}</code>`:t}).join(``)}texteInitial(e,t){try{return rd(e,t,this.contexte.champs)}catch{return``}}classesDe(e){return[...e.options.map(e=>`humalis-${e.nom}-${e.valeur}`),...e.classes].join(` `)}aide(e,t){let n=Cd(e.contenu);return{valeur:{js:Q(e.contenu,this.contexte),initial:this.initial(e.contenu,t)},texte:{js:Qu(e.contenu,this.contexte),initial:this.texteInitial(e.contenu,t)},...n===void 0?{}:{litteral:n},classes:this.classesDe(e),styles:e.options.map(e=>`${e.nom}_${e.valeur}`),reglages:e.reglages,...e.minimum===void 0?{}:{minimum:e.minimum},...e.maximum===void 0?{}:{maximum:e.maximum},...e.reglages.photo?{photo:{js:Q(e.reglages.photo,this.contexte),initial:this.texteInitial(e.reglages.photo,t)}}:{},...e.contenu.type===`variable`?{variable:Z(e.contenu.nom)}:{},...this.site.langues?{langues:this.site.langues}:{},...e.genre===`audio`?{audio:this.audioDe(e,t)}:{},id:e.id}}audioDe(e,t){let n=e=>Cd(e)??{js:Qu(e,this.contexte),initial:this.texteInitial(e,t)},r=Cd(e.contenu),{description:i,transcription:a}=e.textes??{};return{source:r!==void 0&&Ws(r)?`audio/${Ks(r)}`:n(e.contenu),...i?{description:n(i)}:{},...a?{transcription:{js:Qu(a,this.contexte),initial:this.texteInitial(a,t)}}:{}}}aideComposite(e,t){let n=e.corps.filter(e=>e.type===`bloc`),r=e=>e?{js:Qu(e,this.contexte),initial:this.texteInitial(e,t)}:{js:`''`,initial:``},i=e.etat?{js:Z(e.etat),initial:this.initial({type:`variable`,nom:e.etat},t)}:void 0,a={genre:e.genre,id:`${e.genre}-${e.ligne%1e6}`,classes:this.classesDe(e),reglages:e.reglages??{},parties:e.genre===`onglets`?n.map(e=>({titre:r(e.titre),icone:e.reglages?.icone,corps:e.corps})):e.genre===`deroulant`?[{titre:r(e.titre),icone:e.reglages?.icone,corps:e.corps}]:e.genre===`filAriane`?e.corps.map(e=>({titre:r(void 0),corps:[e]})):[],...i?{etat:i}:{},corps:e.corps};if(e.genre===`deroulant`&&i){let t=e.index!==void 0;a.ouvert=t?{js:`${i.js} === ${e.index}`,initial:i.initial===e.index}:{js:i.js,initial:i.initial===!0},a.basculer=t?`${i.js} = ${i.js} === ${e.index} ? -1 : ${e.index}`:`${i.js} = !${i.js}`}return a}classesCarte(e){return[`humalis-carte`,...e.classes].join(` `)}lieuxInitiaux(e,t){return e.flatMap(e=>{if(e.type===`marqueur`)return[{nom:this.texteInitial(e.nom,t),...e.adresse?{adresse:this.texteInitial(e.adresse,t)}:{},latitude:Number(this.initial(e.latitude,t)),longitude:Number(this.initial(e.longitude,t))}];if(e.type===`condition`)return this.lieuxInitiaux(id(e.test,t,this.contexte.champs)?e.alors:e.sinon,t);if(e.type===`repetition`){let n=$(e.liste,t);return(Array.isArray(n)?n:[]).flatMap(n=>this.lieuxInitiaux(e.corps,t.enfant().definir(e.variable,n)))}return[]})}carteHtml(e,t,n){let r=this.texteInitial(e.nom,t),i=this.lieuxInitiaux(e.corps,t),a=e=>`https://www.openstreetmap.org/?mlat=${e.latitude}&mlon=${e.longitude}#map=15/${e.latitude}/${e.longitude}`;n.push(`<section${J([[`aria-label`,r],[`class`,this.classesCarte(e)]])}>`),n.push(`<div class="humalis-carte-zone"></div>`),n.push(`<ul${J([[`aria-label`,`Les lieux de la carte : ${r}`],[`class`,`humalis-carte-lieux`]])}>`);for(let e of i)n.push(`<li><strong>${q(e.nom)}</strong>${e.adresse?`<span>${q(e.adresse)}</span>`:``}<a${J([[`href`,a(e)],[`aria-label`,`Ouvrir dans OpenStreetMap : ${e.nom}`]])}>Ouvrir dans OpenStreetMap</a></li>`);if(i.length===0&&e.latitude&&e.longitude){let r={latitude:Number(this.initial(e.latitude,t)),longitude:Number(this.initial(e.longitude,t))};n.push(`<li><a${J([[`href`,a(r)]])}>Ouvrir dans OpenStreetMap</a></li>`)}n.push(`</ul>`),n.push(`</section>`)}lieuxJs(e,t){for(let n of t)if(n.type===`marqueur`){let t=n.adresse?`, adresse: ${Qu(n.adresse,this.contexte)}`:``;e.ligne(`{ nom: ${Qu(n.nom,this.contexte)}${t}, latitude: ${Q(n.latitude,this.contexte)}, longitude: ${Q(n.longitude,this.contexte)} },`)}else n.type===`condition`?(e.ligne(`...(${ed(n.test,this.contexte)} ? [`),e.indenter(()=>this.lieuxJs(e,n.alors)),n.sinon.length>0?(e.ligne(`] : [`),e.indenter(()=>this.lieuxJs(e,n.sinon)),e.ligne(`]),`)):e.ligne(`] : []),`)):n.type===`repetition`&&e.bloc(`...${Q(n.liste,this.contexte)}.flatMap((${Z(n.variable)}) => [`,()=>this.lieuxJs(e,n.corps),`]),`)}carteJs(e,t){let n=[...t.latitude&&t.longitude?[`latitude: ${Q(t.latitude,this.contexte)}`,`longitude: ${Q(t.longitude,this.contexte)}`]:[],...t.zoom?[`zoom: ${Q(t.zoom,this.contexte)}`]:[],...t.tuiles?[`tuiles: ${G(t.tuiles.adresse)}`,`attribution: ${G(t.tuiles.attribution)}`]:[]];e.bloc(`carteLieux(${G(t.id)}, ${Qu(t.nom,this.contexte)}, ${n.length>0?`{ ${n.join(`, `)} }`:`{}`}, [`,()=>this.lieuxJs(e,t.corps),`], ${G(this.classesCarte(t))}),`)}ecrireEnfantJs(e,t){if(`tag`in t){let n=t.attrs.filter(([,e])=>e!==!1).map(([e,t])=>`${/^[a-z]+$/.test(e)?e:G(e)}: ${typeof t==`string`?e.startsWith(`on`)?t:G(t):typeof t==`boolean`?String(t):t.js}`);e.bloc(`creer(${G(t.tag)}, { ${n.join(`, `)} },`,()=>t.enfants.forEach(t=>this.ecrireEnfantJs(e,t)),`),`)}else if(`texte`in t)e.ligne(`${G(t.texte)},`);else if(`js`in t)e.ligne(`${t.js},`);else if(`vue`in t)this.ecrireGroupe(e,t.vue,`...`,`,`);else if(`icone`in t)e.ligne(`icone(${G(t.icone)}, ${G(t.classe??`humalis-icone`)}${t.label?`, ${typeof t.label==`string`?G(t.label):t.label.js}`:``}),`);else if(`qr`in t)e.ligne(`codeQr(${t.qr}),`);else if(`avatar`in t)e.ligne(`avatar(${t.avatar.nom}, ${t.avatar.photo??`''`}),`);else{let{js:n,maximum:r,change:i,label:a,classes:o}=t.etoiles;e.ligne(`etoiles(${n}, ${r}, ${i??`undefined`}, ${typeof a==`string`?G(a):a.js}, ${G(o)}),`)}}ecrireEnfantHtml(e,t,n){if(`tag`in e){let r=J(e.attrs.filter(([e])=>!e.startsWith(`on`)).map(([e,t])=>{let n=typeof t==`object`?t.initial:t;return[e,n===!1?void 0:n===!0?`true`:n]}));if([`progress`].includes(e.tag)&&e.enfants.length===0){n.push(`<${e.tag}${r}></${e.tag}>`);return}n.push(`<${e.tag}${r}>`);for(let r of e.enfants)this.ecrireEnfantHtml(r,t,n);n.push(`</${e.tag}>`)}else if(`texte`in e)n.push(q(e.texte));else if(`js`in e)n.push(q(e.initial));else if(`vue`in e)this.ecrireGroupeHtml(e.vue,t,n);else if(`icone`in e)n.push(Ku(e.icone,e.classe??`humalis-icone`,typeof e.label==`object`?e.label.initial:e.label));else if(!(`qr`in e)){if(`avatar`in e){let{initialNom:t,initialPhoto:r}=e.avatar;n.push(r?`<img${J([[`src`,r],[`alt`,``]])}>`:`<span aria-hidden="true">${q(Uu(t))}</span>`)}else{let{initial:t,maximum:r,change:i,label:a,classes:o}=e.etoiles;n.push(qu(t,r,i!==void 0,typeof a==`string`?a:a.initial,o))}}}champHtml(e,t,n,r){let i=e.saisie,a=i?.sorte??`texte`,o=i?.obligatoire?`<span>${r}<span class="humalis-obligatoire" aria-hidden="true"> *</span></span>`:r,s=[[`data-humalis`,e.id],[`class`,n]],c=e=>[...e,[`required`,i?.obligatoire?`true`:void 0],[`placeholder`,a===`liste`?void 0:i?.indice],[`min`,i?.minimum===void 0?void 0:String(i.minimum)],[`max`,i?.maximum===void 0?void 0:String(i.maximum)]],l=()=>{let e=i?.parmi?$(i.parmi,t):[];return(Array.isArray(e)?e:[]).map(String)};switch(a){case`case`:return`<label class="humalis-case"><input${J(c([[`type`,`checkbox`],...s]))}>${o}</label>`;case`choix`:{let t=l().map(t=>`<label><input${J([[`type`,`radio`],[`name`,e.id],[`value`,t]])}>${q(t)}</label>`).join(``);return`<fieldset${J([[`data-humalis`,e.id],[`class`,n?`${n} humalis-choix`:`humalis-choix`]])}><legend>${o}</legend>${t}</fieldset>`}case`liste`:{let e=l().map(e=>`<option${J([[`value`,e]])}>${q(e)}</option>`).join(``);return`<label class="humalis-champ">${o}<select${J(c(s))}><option value="" selected="true">${q(i?.indice??`Choisissez…`)}</option>${e}</select></label>`}case`texteLong`:return`<label class="humalis-champ">${o}<textarea${J(c([[`rows`,`4`],...s]))}></textarea></label>`;default:{let t=this.genreChamp(e)??ud[a];return`<label class="humalis-champ">${o}<input${J(c([...s,[`type`,t?.type],[`autocomplete`,t?.autocomplete]]))}></label>`}}}elementHtml(e,t){let n=this.classes(e)||void 0,r=(t=[])=>J([...t,[`data-humalis`,e.id],[`class`,n],...e.annonce?[[`aria-live`,`polite`],[`aria-atomic`,`true`]]:[],...bd(e)]),i=e.reglages?.icone?Ha(e.reglages.icone)?.lucide:void 0,a=(i?Ku(i,`humalis-icone`):``)+this.contenuAccentHtml(e.contenu,e.genre,t);switch(e.genre){case`titre`:case`soustitre`:{let t=`h${this.niveaux.get(e)??1}`;return`<${t}${r()}>${a}</${t}>`}case`texte`:return`<p${r()}>${a}</p>`;case`bouton`:return`<button${r([[`type`,this.formulaireDe.has(e.id)&&!this.evenements.has(e.id)?`submit`:`button`]])}>${a}</button>`;case`lien`:{let n=(e.arguments??[]).map(e=>`${W(e.nom)}=${encodeURIComponent(String($(e.valeur,t)))}`).join(`&`);return`<a${r([[`href`,this.fichier(e.cible??``)+(n?`?${n}`:``)]])}>${a}</a>`}case`image`:{if(e.image)return`<img${r(this.attributsImage(e.image,e.contenu,e=>String($(e,t)),e=>e))}>`;let n=Cd(e.contenu);return`<img${r([[`src`,String($(e.contenu,t))],[`alt`,e.reglages?.decoratif?``:e.reglages?.description??Sd(n)],...e.reglages?.decoratif?[[`aria-hidden`,`true`]]:[]])}>`}case`champ`:return this.champHtml(e,t,n,a)}}};const _d=e=>e.options.some(e=>e.nom===`menu`&&e.valeur===`repliable`),vd=new Set([`onglets`,`deroulant`,`accordeon`,`carrousel`,`filAriane`]),yd={section:`section`,entete:`header`,pied:`footer`,menu:`nav`};function bd(e){if(e.raccourci===void 0)return[];let{aria:t,texte:n}=ql(e.raccourci),r=Cd(e.contenu);return[[`aria-keyshortcuts`,t],[`title`,r?`${r} (${n})`:n]]}const xd=`creer.icone.avatar.etoiles.codeQr.carteLieux.definirTheme.t.langue.changerLangue.afficherMessage.planifier.mouvementReduit.themeSombre.copier.partager.derniereRequete.cliquer.focaliser.fenetre.confirmer.retirerPremier.grouper.formaterNombre.formaterDate.formaterArgent.accorder.formaterTaille.dateDuJour.maintenant.decalerDate.joursEntre.formaterDepuis.adresseDe.lirePartage.garderPartage.lireMemoire.garderMemoire.serveur.utilisateur`.split(`.`);function Sd(e){return e===void 0?``:e.replace(/\.[a-z0-9]+$/i,``).replace(/[_-]+/g,` `)}function Cd(e){if(!(e.type===`texte`&&e.versions))return wd(e)}function wd(e){if(!(e.type!==`texte`||!e.parties.every(e=>`texte`in e)))return e.parties.map(e=>`texte`in e?e.texte:``).join(``)}function Td(e){return e.replace(/^(titre|texte|image|bouton|lien|champ)_/,``)}function Ed(e){return e.some(e=>e.type===`requete`&&e.mode===`envoyer`||e.type===`suppression`||e.type===`modification`||Gl(e).some(e=>Ed(e)))}function Dd(e){return e.some(e=>Od.has(e.type)||e.type!==`minuterie`&&e.type!==`message`&&Gl(e).some(e=>Dd(e)))}const Od=new Set([`requete`,`suppression`,`modification`,`connexion`,`deconnexion`,`confirmation`,`copie`,`partage`]);function kd(e){return e.some(e=>e.type===`arreter`||![`repetition`,`tantQue`,`repeter`,`minuterie`,`message`].includes(e.type)&&Gl(e).some(kd))}function Ad(e,t=new Set){for(let n of e){n.type===`affectation`&&t.add(n.nom),(n.type===`ajout`||n.type===`retrait`)&&t.add(n.liste),n.type===`requete`&&n.resultat!==void 0&&t.add(n.resultat);for(let e of Gl(n))Ad(e,t)}return t}function jd(e){return[`humalis-${e.genre}`,...e.options.map(e=>`humalis-${e.nom}-${e.valeur}`),...e.classes].join(` `)}const Md=`.humalis-projet`;function Nd(e){let t=Lu(e);return new Map(e.ecrans.map(e=>[e.nom,t.get(e.nom)===`/`?`index.html`:`${U(e.nom)||`page`}.html`]))}function Pd(e,t){let n=new Map,r=Nd(e),i={partages:e.partages,cle:`humalis:${U(t.nom)||`application`}`,fichiers:r,composants:new Map(e.composants.map(e=>[e.nom,e])),medias:t.medias,...e.langues?{langues:e.langues}:{}},a=e.langues?.[0].code,o=[`humalis/styles.css`];e.css.length>0&&(n.set(`styles/style.css`,e.css.join(`
|
|
1490
|
+
`}htmlComposant(e,t){let n=new ad(this.contexte.types);for(let t of this.parametres??[])n.definir(t.nom,e.get(t.nom));for(let e of this.ecran.calculs)n.definirCalcul(e.nom,e.valeur);this.ecrireGroupeHtml(this.ecran.vue,n,t)}ecrireEtat(e,t){if(this.ecran.parametresAdresse?.length){e.ligne(`// Les paramètres de la page, lus dans son adresse (produit.html?id=…).`);for(let t of this.ecran.parametresAdresse)e.ligne(`const ${Z(t)} = new URLSearchParams(location.search).get(${G(W(t))}) ?? '';`)}if(this.ecran.etat.length>0){e.ligne(`// L’état de la page.`);for(let t of this.ecran.etat)e.ligne(`let ${Z(t.nom)} = ${Q(t.initiale,this.contexte)};`)}if(t.length>0){e.ligne(`// Partagées entre les pages (« avec partagee ») : relues au démarrage.`);for(let n of t)e.ligne(`let ${Z(n.nom)} = ${Q(n.initiale,this.contexte)};`)}if(this.contexte.champs.size>0){e.ligne(`// Ce qui est tapé dans les champs.`);for(let[t,n]of this.contexte.champs)e.ligne(`let ${n} = ${this.contexte.sortes?.get(t)===`case`?`false`:`''`};`)}let n=[...new Set([...this.montres,...this.caches,...this.fenetres])];n.length>0&&(e.ligne(`// Les éléments montrés ou cachés.`),e.ligne(`let visibilite = { ${n.map(e=>`${G(e)}: ${!this.montres.has(e)&&!this.fenetres.has(e)}`).join(`, `)} };`)),this.textesChanges.size>0&&(e.ligne(`// Les textes changés par un événement.`),e.ligne(`let textes = {};`))}ecrireCalcul(e,t,n){e.ligne(),e.ligne(`/** « calcul ${t} » : recalculé à chaque fois. */`),e.bloc(`function ${Z(t)}() {`,()=>e.ligne(`return ${Q(n,this.contexte)};`))}ecrireMemoire(e,t){let n=[];for(let e of t){if(e.lectureSeule)continue;let[t,r]=e.memorisee?[`lireMemoire`,`garderMemoire`]:[`lirePartage`,`garderPartage`];n.push({nom:Z(e.nom),lire:t,garder:r,cle:`${this.site.cle}:partage:${e.nom}`})}for(let e of this.ecran.etat)e.memorisee&&n.push({nom:Z(e.nom),lire:`lireMemoire`,garder:`garderMemoire`,cle:`${this.site.cle}:${U(this.ecran.nom)}:${U(e.nom)}`});return n.length===0?[`dessiner`]:(e.ligne(),e.ligne(`/** Relit ce qui est gardé hors de la page : partagé entre les pages, ou mémorisé. */`),e.bloc(`function relire() {`,()=>{for(let t of n)e.ligne(`${t.nom} = ${t.lire}(${G(t.cle)}, ${t.nom});`)}),e.ligne(),e.ligne(`/** Garde ces variables, pour les autres pages et pour le retour du visiteur. */`),e.bloc(`function garder() {`,()=>{for(let t of n)e.ligne(`${t.garder}(${G(t.cle)}, ${t.nom});`)}),[`relire`,`garder`,`dessiner`])}ecrireFonction(e,t){let n=t.parametres.map(e=>Z(e.nom)).join(`, `),r=jd(t.actions)?`async `:``,i=new Set(t.parametres.map(e=>e.nom)),a=t.formulaire===void 0?void 0:this.formulaires.get(t.formulaire);e.ligne(),this.dansEvenement=!0,e.bloc(`${r}function ${t.nom}(${n}) {`,()=>{if(!a){this.ecrireActions(e,t.actions,i,Pd(t.actions));return}for(let t of a.champs)for(let[n,r]of this.verifications(t))e.bloc(`if (${n}) {`,()=>{e.ligne(`afficherMessage(${ac(r,G)}, 'erreur');`),e.ligne(`return;`)});Ad(t.actions)&&(this.echecs=this.nomsPris.has(`echecs`)?`echecsAvantEnvoi`:`echecs`,e.ligne(`const ${this.echecs} = serveur.echecs();`)),this.ecrireActions(e,t.actions,i,Pd(t.actions)),this.echecs=void 0;for(let t of a.champs){let n=this.contexte.champs.get(t);n&&e.ligne(`${n} = ${this.contexte.sortes?.get(t)===`case`?`false`:`''`};`)}}),this.dansEvenement=!1}verifications(e){let t=this.contexte.champs.get(e);if(t===void 0)return[];let n=this.libelles.get(e)??e,r=(this.site.langues??[{code:`fr`}]).map(({code:t})=>({code:t,libelle:this.libellesLangues.get(e)?.get(t)??n}));return nc(t,this.saisies.get(e),r)}fonctionGlobale(e){let t=new wu;for(let t of e.parametres)this.contexte.types.set(t.nom,t.type);return t.bloc(`function ${Z(e.nom)}(${e.parametres.map(e=>Z(e.nom)).join(`, `)}) {`,()=>this.ecrireActions(t,e.corps,new Set(e.parametres.map(e=>e.nom)),Pd(e.corps))),t.texte()}ecrireActions(e,t,n,r){let i=e=>Q(e,this.contexte);for(let a of t)switch(a.type){case`rendre`:e.ligne(`return ${i(a.valeur)};`);break;case`message`:{let t=[...a.duree?[`duree: ${i(a.duree)}`]:[],...a.persistant?[`persistant: true`]:[]],o=`afficherMessage(${i(a.texte)}, '${a.genre}'`;if(!a.action){e.ligne(`${o}${t.length>0?`, { ${t.join(`, `)} }`:``});`);break}let s=a.action;e.bloc(`${o}, {`,()=>{for(let n of t)e.ligne(`${n},`);e.bloc(`action: { libelle: ${G(s.libelle)}, ${jd(s.actions)?`async `:``}faire() {`,()=>this.ecrireActions(e,s.actions,new Set(n),r),`} },`)},`});`);break}case`confirmation`:e.bloc(`if (await confirmer(${i(a.question)}${a.oui!==`Oui`||a.non!==`Non`?`, { oui: ${G(a.oui)}, non: ${G(a.non)} }`:``})) {`,()=>this.ecrireActions(e,a.alors,n,r),a.sinon.length>0?`} else {`:`}`),a.sinon.length>0&&(e.indenter(()=>this.ecrireActions(e,a.sinon,n,r)),e.ligne(`}`));break;case`copie`:e.ligne(`await copier(${this.enTexte(a.valeur)}${a.message===null?`, null`:a.texte?`, ${i(a.texte)}`:a.message===`Copié`?``:`, ${G(a.message)}`});`);break;case`partage`:{let t=a.lien,n=t?`externe`in t?G(t.externe):`new URL(${t.arguments?.length?this.adresseAvec(t.ecran,t.arguments):G(this.fichier(t.ecran))}, location.href).href`:void 0,r=[`texte: ${this.enTexte(a.texte)}`,...a.titre?[`titre: ${this.enTexte(a.titre)}`]:[],...n?[`adresse: ${n}`]:[]];e.ligne(`await partager({ ${r.join(`, `)} });`);break}case`minuterie`:{let t=[...a.mode===`toutes`?[`repete: true`]:[],...a.tantQue?[`tantQue: () => ${id(a.tantQue,this.contexte)}`]:[]],o=this.dansMinuterie;this.dansMinuterie=!0,e.bloc(`planifier(${jd(a.corps)?`async `:``}(${Nd(a.corps)?`arreter`:``}) => {`,()=>this.ecrireActions(e,a.corps,new Set(n),r),`}, ${i(a.millisecondes)}${t.length>0?`, { ${t.join(`, `)} }`:``});`),this.dansMinuterie=o;break}case`visibilite`:for(let t of a.ids)e.ligne(`visibilite = { ...visibilite, ${G(t)}: ${a.visible} };`);break;case`navigation`:{let t=Dd(a.ecran),n=a.arguments&&t!==void 0?this.adresseAvec(t,a.arguments):this.adresse(a.ecran);e.ligne(`location.assign(${n});`);break}case`changerTexte`:for(let t of a.ids)e.ligne(`textes = { ...textes, ${G(t)}: ${i(a.texte)} };`);break;case`theme`:e.ligne(`definirTheme(${G(a.valeur)});`);break;case`langue`:e.ligne(`changerLangue(${G(a.code)});`);break;case`affectation`:e.ligne(`${Z(a.nom)} = ${a.champs?Eu(Z(a.nom),a.champs,i(a.valeur)):i(a.valeur)};`);break;case`locale`:n.add(a.nom),e.ligne(`${r.has(a.nom)?`let`:`const`} ${Z(a.nom)} = ${i(a.valeur)};`);break;case`ajout`:e.ligne(`${Z(a.liste)} = [...${Z(a.liste)}, ${i(a.valeur)}];`);break;case`retrait`:e.ligne(`${Z(a.liste)} = retirerPremier(${Z(a.liste)}, ${i(a.valeur)});`);break;case`requete`:{let t=[G(a.adresse)];a.mode===`envoyer`&&t.push(this.donnees(a.donnees,a.cles)),a.mode===`lireUn`&&t.push(i(a.donnees[0]));let n=`await serveur.${a.mode}(${t.join(`, `)}`;if(a.resultat!==void 0&&this.dansEvenement){let t=++this.dernieres;e.ligne(`const derniere${t} = derniereRequete(${G(a.resultat)});`),e.ligne(`const reponse${t} = ${n}, ${Z(a.resultat)});`),e.ligne(`if (!derniere${t}()) return;`),e.ligne(`${Z(a.resultat)} = reponse${t};`)}else a.resultat===void 0?e.ligne(`${n});`):e.ligne(`${Z(a.resultat)} = ${n}, ${Z(a.resultat)});`);this.echecs&&a.mode===`envoyer`&&e.ligne(`if (serveur.echecs() > ${this.echecs}) return;`);break}case`suppression`:case`modification`:{let t=a.type===`suppression`?`await serveur.supprimer(${G(a.adresse)}, ${i(a.objet)}.id);`:`await serveur.modifier(${G(a.adresse)}, ${i(a.objet)}.id, { ${a.changements.map(e=>W(e.champ)===i(e.valeur)?i(e.valeur):`${W(e.champ)}: ${i(e.valeur)}`).join(`, `)} });`;a.objet.type===`variable`&&this.contexte.facultatives?.has(a.objet.nom)?e.bloc(`if (${i(a.objet)} !== null) {`,()=>e.ligne(t)):e.ligne(t),this.echecs&&e.ligne(`if (serveur.echecs() > ${this.echecs}) return;`);break}case`connexion`:{let t=a.motDePasse.type===`champ`?this.contexte.champs.get(a.motDePasse.id):void 0,n=i(a.motDePasse);t&&(e.ligne(`const motDePasseSaisi = ${t};`),e.ligne(`${t} = '';`),n=`motDePasseSaisi`),e.ligne(`if (!(await utilisateur.seConnecter(${i(a.email)}, ${n}))) return;`);break}case`deconnexion`:e.ligne(`await utilisateur.seDeconnecter();`);break;case`si`:e.bloc(`if (${id(a.test,this.contexte)}) {`,()=>this.ecrireActions(e,a.alors,n,r),a.sinon.length>0?`} else {`:`}`),a.sinon.length>0&&(e.indenter(()=>this.ecrireActions(e,a.sinon,n,r)),e.ligne(`}`));break;case`repetition`:n.add(a.variable),e.bloc(`for (const ${Z(a.variable)} of ${i(a.liste)}) {`,()=>this.dansUneBoucle(()=>this.ecrireActions(e,a.corps,n,r)));break;case`tantQue`:e.bloc(`while (${id(a.test,this.contexte)}) {`,()=>this.dansUneBoucle(()=>this.ecrireActions(e,a.corps,n,r)));break;case`repeter`:e.bloc(`for (let fois = 0; fois < ${i(a.fois)}; fois++) {`,()=>this.dansUneBoucle(()=>this.ecrireActions(e,a.corps,n,r)));break;case`arreter`:this.dansMinuterie?(e.ligne(`arreter();`),e.ligne(`return;`)):e.ligne(`break;`);break;case`passer`:e.ligne(`continue;`);break;case`selon`:{let t=i(a.valeur);a.cas.forEach((a,o)=>{let s=a.valeurs.map(e=>`${t} === ${i(e)}`).join(` || `);e.ligne(`${o===0?``:`} else `}if (${s}) {`),e.indenter(()=>this.ecrireActions(e,a.corps,n,r))}),a.sinon.length>0&&(e.ligne(a.cas.length>0?`} else {`:`{`),e.indenter(()=>this.ecrireActions(e,a.sinon,n,r))),(a.cas.length>0||a.sinon.length>0)&&e.ligne(`}`);break}}}enTexte(e){let t=Q(e,this.contexte),n=Tu(e,{types:this.contexte.types,champs:this.contexte.champs,sortes:this.contexte.sortes}).genre;return n===`texte`?t:n===`nombre`?`formaterNombre(${t})`:`String(${t})`}voirPlusJs(e,t,n){return[`creer('div', { class: 'humalis-sentinelle', 'data-humalis': ${G(`${e}-bas`)}, 'aria-hidden': 'true', onbas: ${t} })`,...n===null?[]:[`creer('button', { type: 'button', class: 'humalis-voir-plus', 'data-humalis': ${G(`${e}-voir-plus`)}, onclick: ${t} }, ${n===`Voir plus`&&this.site.langues?`t({ fr: 'Voir plus', en: 'See more' })`:G(n)})`]]}dansUneBoucle(e){let t=this.dansMinuterie;this.dansMinuterie=!1,e(),this.dansMinuterie=t}donnees(e,t){return`{ ${e.map((e,n)=>{let r=t?.[n],i=r===void 0?e.type===`champ`?this.clesChamps.get(e.id)??W(e.id):e.type===`variable`?Z(e.nom):`valeur`:/^[A-Za-z_]\w*$/.test(r)?r:JSON.stringify(r),a=Q(e,this.contexte);return i===a?i:`${i}: ${a}`}).join(`, `)} }`}adresseAvec(e,t){let n=t.map(e=>`${W(e.nom)}=\${encodeURIComponent(String(${Q(e.valeur,this.contexte)}))}`).join(`&`);return`\`${this.fichier(e)}?${n}\``}adresse(e){let t=Dd(e);return t===void 0?`adresseDe(${Q(e,this.contexte)})`:G(this.fichier(t))}fichier(e){return this.site.fichiers.get(e)??`${U(e)||`index`}.html`}ecrireRetour(e,t){for(let n of t)n.type===`locale`&&e.ligne(`const ${Z(n.nom)} = ${Q(n.valeur,this.contexte)};`);e.ligne(`return [`),e.indenter(()=>this.ecrireVue(e,t)),e.ligne(`];`)}ecrireGroupe(e,t,n,r){t.some(e=>e.type===`locale`)?e.bloc(`${n}(() => {`,()=>this.ecrireRetour(e,t),`})()${r}`):e.bloc(`${n}[`,()=>this.ecrireVue(e,t),`]${r}`)}ecrireVue(e,t){for(let n of t)switch(n.type){case`element`:{let t=this.elementJs(n);this.montres.has(n.id)||this.caches.has(n.id)?e.ligne(`...(visibilite[${G(n.id)}] ? [${t}] : []),`):e.ligne(`${t},`);break}case`condition`:e.ligne(`...(${id(n.test,this.contexte)}`),e.indenter(()=>{this.ecrireGroupe(e,n.alors,`? `,``),n.sinon.length>0?this.ecrireGroupe(e,n.sinon,`: `,`),`):e.ligne(`: []),`)});break;case`repetition`:{let t=`...${Q(n.liste,this.contexte)}.flatMap((${Z(n.variable)}) => `;n.corps.some(e=>e.type===`locale`)?e.bloc(`${t}{`,()=>this.ecrireRetour(e,n.corps),`}),`):e.bloc(`${t}[`,()=>this.ecrireVue(e,n.corps),`]),`);break}case`widget`:this.ecrireEnfantJs(e,Ku(n.genre,this.aide(n,this.environnement())));break;case`carte`:this.carteJs(e,n);break;case`marqueur`:break;case`fenetre`:{let t=[`titre: ${G(n.titre)}`,...n.description===void 0?[]:[`description: ${G(n.description)}`],...n.obligatoire?[`obligatoire: true`]:[],...n.classes.length>0?[`classes: ${G(n.classes.join(` `))}`]:[],`ouverte: visibilite[${G(n.id)}]`,`fermer: () => { visibilite = { ...visibilite, ${G(n.id)}: false }; }`];this.ecrireGroupe(e,n.corps,`fenetre(${G(n.id)}, { ${t.join(`, `)} }, ...`,`),`);break}case`graphique`:e.ligne(`${kl(n,e=>Q(e,this.contexte))},`);break;case`codeDocumentation`:let t=ru(n),r=t?`, 'data-humalis-frappe': '${t.frappe}', 'data-humalis-frappe-cle': '${t.cle}'`:``;e.ligne(`creer('div', { class: 'humalis-bloc-code-conteneur' }, creer('pre', { class: 'humalis-bloc-code${t?` ${t.classe}`:``}', 'data-langage': ${G(n.langage??``)}${r} }, (() => { const code = document.createElement('code'); code.innerHTML = ${G(Fu(n.code,n.langage))}; return code; })()), creer('button', { type: 'button', onclick: () => copier(${G(n.code)}) }, ${ac(this.messageCopier(),G)})),`);break;case`tableauDocumentation`:{let t=(e,t)=>`creer('${t}', {}, ${this.contenuAccentJs(e,`texte`)})`,r=(e,n)=>`creer('tr', {}, ${e.map(e=>t(e,n)).join(`, `)})`;e.ligne(`creer('div', { class: 'humalis-tableau-conteneur' }, creer('table', {}, creer('caption', {}, ${this.contenuAccentJs(n.legende,`texte`)}), creer('thead', {}, ${r(n.colonnes,`th`)}), creer('tbody', {}, ${n.rangees.map(e=>r(e,`td`)).join(`, `)}))),`);break}case`bloc`:{if(n.genre===`liste`||n.genre===`listeNumerotee`){let t=n.genre===`liste`?`ul`:`ol`;e.ligne(`creer('${t}', { ${this.repereObjetJs(n.ligne)}class: 'humalis-liste' },`),e.indenter(()=>n.corps.forEach(t=>{if(t.type===`repetition`){let n=`...${Q(t.liste,this.contexte)}.flatMap((${Z(t.variable)}) => `;e.bloc(`${n}[`,()=>this.ecrireGroupe(e,t.corps,`creer('li', {}, ...`,`),`),`]),`)}else this.ecrireGroupe(e,[t],`creer('li', {}, ...`,`),`)})),e.ligne(`),`);break}if(Sd.has(n.genre)){this.ecrireEnfantJs(e,Ju(this.aideComposite(n,this.environnement())));break}let t=Cd[n.genre]??`div`,r=xd(n)?`creer('button', { type: 'button', class: 'humalis-menu-bouton', 'aria-expanded': 'false', 'aria-label': 'Menu' }, creer('span', { class: 'humalis-menu-icone', 'aria-hidden': 'true' })), `:``;this.ecrireGroupe(e,n.corps,`creer('${t}', { ${this.repereObjetJs(n.ligne)}class: ${G(Fd(n))} }, ${r}...`,`),`);let i=n.id===void 0?void 0:this.basDesBlocs.get(n.id);if(i){let t=this.voirPlusJs(n.id,i.fonction,i.gestionnaire.bouton??null),r=i.gestionnaire.tantQue?id(i.gestionnaire.tantQue,this.contexte):void 0;r?e.ligne(`...(${r} ? [${t.join(`, `)}] : []),`):t.forEach(t=>e.ligne(`${t},`))}break}case`formulaire`:{let t=this.formulaires.get(n.id)?.soumission??`() => {}`,r=`creer('form', { ${this.repereObjetJs(n.ligne)}'data-humalis': ${G(n.id)}, class: 'humalis-formulaire', novalidate: true, onsubmit: ${t} }, ...`;this.montres.has(n.id)||this.caches.has(n.id)?this.ecrireGroupe(e,n.corps,`...(visibilite[${G(n.id)}] ? [${r}`,`)] : []),`):this.ecrireGroupe(e,n.corps,r,`),`);break}case`composant`:{let t=n.proprietes.map(e=>`${Z(e.nom)}: ${Q(e.valeur,this.contexte)}`);e.ligne(`...${n.nom}(${t.length?`{ ${t.join(`, `)} }`:``}),`);break}}}elementJs(e){let t=(t=[])=>{let n=[...this.repereJs(e.ligne),...t,[`'data-humalis'`,G(e.id)]],r=this.classes(e);r&&n.push([`class`,G(r)]),e.annonce&&n.push([`'aria-live'`,`'polite'`],[`'aria-atomic'`,`'true'`]);for(let[t,r]of wd(e))n.push([G(t),G(r)]);for(let[t,r]of this.evenements.get(e.id)??[]){let e=r.length===1&&!r[0].includes(`(`)?r[0]:r.length===1?`() => ${r[0]}`:`async () => { ${r.map(e=>`await ${e.includes(`(`)?e:`${e}()`};`).join(` `)} }`;n.push([t,e])}return n},n=e=>`{ ${e.map(([e,t])=>`${e}: ${t}`).join(`, `)} }`,r=e.reglages?.icone?Ha(e.reglages.icone)?.lucide:void 0,i=(r?`icone(${G(r)}, 'humalis-icone'), `:``)+(this.textesChanges.has(e.id)?`textes[${G(e.id)}] ?? ${nd(e.contenu,this.contexte)}`:this.contenuAccentJs(e.contenu,e.genre));switch(e.genre){case`titre`:case`soustitre`:return`creer('h${this.niveaux.get(e)??1}', ${n(t())}, ${i})`;case`texte`:return`creer('p', ${n(t())}, ${i})`;case`bouton`:return`creer('button', ${n(t([[`type`,this.formulaireDe.has(e.id)&&!this.evenements.has(e.id)?`'submit'`:`'button'`]]))}, ${i})`;case`lien`:return`creer('a', ${n(t([[`href`,e.arguments&&e.cible!==void 0?this.adresseAvec(e.cible,e.arguments):G(this.fichier(e.cible??``))]]))}, ${i})`;case`image`:{if(e.image)return`creer('img', ${n(t(this.attributsImage(e.image,e.contenu,e=>Q(e,this.contexte),G,e=>`'${e}'`)))})`;let r=Dd(e.contenu);return`creer('img', ${n(t([[`src`,r===void 0?Q(e.contenu,this.contexte):G(r)],[`alt`,G(e.reglages?.decoratif?``:e.reglages?.description??Ed(r))],...e.reglages?.decoratif?[[`aria-hidden`,`'true'`]]:[]]))})`}case`champ`:return this.champJs(e,t,n,i)}}champJs(e,t,n,r){let i=this.contexte.champs.get(e.id),a=e.saisie,o=a?.sorte??`texte`,s=`(evenement) => { ${i} = evenement.target.value; }`,c=a?.obligatoire?`creer('span', {}, ${r}, creer('span', { class: 'humalis-obligatoire', 'aria-hidden': 'true' }, ' *'))`:r,l=e=>(a?.obligatoire&&e.push([`required`,`true`]),a?.indice!==void 0&&o!==`liste`&&e.push([`placeholder`,a.indiceLangues?ac(a.indiceLangues,G):G(a.indice)]),a?.minimum!==void 0&&e.push([`min`,String(a.minimum)]),a?.maximum!==void 0&&e.push([`max`,String(a.maximum)]),e);switch(o){case`case`:{let e=l(t([[`type`,`'checkbox'`]]));return e.push([`checked`,i],[`oninput`,`(evenement) => { ${i} = evenement.target.checked; }`]),`creer('label', { class: 'humalis-case' }, creer('input', ${n(e)}), ${c})`}case`choix`:{let t=a?.parmi?Q(a.parmi,this.contexte):`[]`,r=`creer('input', { type: 'radio', name: ${G(e.id)}, value: valeur, checked: ${i} === valeur, oninput: () => { ${i} = valeur; } })`,o=this.classes(e);return`creer('fieldset', ${n([...this.repereJs(e.ligne),[`'data-humalis'`,G(e.id)],[`class`,G(o?`${o} humalis-choix`:`humalis-choix`)]])}, creer('legend', {}, ${c}), ...${t}.map((valeur) => creer('label', {}, ${r}, valeur)))`}case`liste`:{let e=a?.parmi?Q(a.parmi,this.contexte):`[]`,r=l(t());r.push([`oninput`,s]);let o=`creer('option', { value: '', selected: ${i} === '' }, ${a?.indiceLangues?ac(a.indiceLangues,G):G(a?.indice??`Choisissez…`)})`;return`creer('label', { class: 'humalis-champ' }, ${c}, creer('select', ${n(r)}, ${o}, ...${e}.map((valeur) => creer('option', { value: valeur, selected: ${i} === valeur }, valeur))))`}case`texteLong`:{let e=l(t([[`rows`,`4`]]));return e.push([`value`,i],[`oninput`,s]),`creer('label', { class: 'humalis-champ' }, ${c}, creer('textarea', ${n(e)}))`}default:{let r=this.genreChamp(e)??md[o],a=t();return r&&a.push([`type`,G(r.type)]),r?.autocomplete&&a.push([`autocomplete`,G(r.autocomplete)]),l(a),a.push([`value`,i],[`oninput`,s]),`creer('label', { class: 'humalis-champ' }, ${c}, creer('input', ${n(a)}))`}}}attributsImage(e,t,n,r,i=e=>e){let a=e.locale===void 0?void 0:this.site.medias?.get(e.locale),o=[[i(`src`),e.locale===void 0?n(t):r(`images/${qs(e.locale)}`)],[i(`alt`),e.description?n(e.description):r(``)]];return a?.largeur&&a.hauteur&&o.push([i(`width`),r(String(a.largeur))],[i(`height`),r(String(a.hauteur))]),o.push(e.prioritaire?[i(`fetchpriority`),r(`high`)]:[i(`loading`),r(`lazy`)],[i(`decoding`),r(`async`)]),e.description||o.push([i(`aria-hidden`),r(`true`)]),e.proportions&&o.push([i(`style`),r(`aspect-ratio: ${e.proportions[0]} / ${e.proportions[1]}`)]),o}classes(e){return[...e.options.map(e=>`humalis-${e.nom}-${e.valeur}`),...e.classes].join(` `)}genreChamp(e){if(this.champsMotDePasse.has(e.id))return{type:`password`,autocomplete:`current-password`};if(this.champsEmail.has(e.id))return{type:`email`,autocomplete:`username`}}environnement(){let e=new ad(this.contexte.types);for(let t of this.ecran.parametresAdresse??[])e.definir(t,``);this.site.langues&&e.definir(`langue`,this.site.langues[0].code);for(let t of[...this.site.partages,...this.ecran.etat])e.definir(t.nom,$(t.initiale,e));for(let t of this.ecran.calculs)e.definirCalcul(t.nom,t.valeur);return e}ecrireHtml(e,t,n){for(let r of e)switch(r.type){case`element`:this.montres.has(r.id)||n.push(this.elementHtml(r,t));break;case`condition`:this.ecrireGroupeHtml(cd(r.test,t,this.contexte.champs)?r.alors:r.sinon,t,n);break;case`repetition`:{let e=$(r.liste,t);for(let i of Array.isArray(e)?e:[])this.ecrireGroupeHtml(r.corps,t.enfant().definir(r.variable,i),n);break}case`widget`:this.ecrireEnfantHtml(Ku(r.genre,this.aide(r,t)),t,n);break;case`carte`:this.carteHtml(r,t,n);break;case`marqueur`:break;case`fenetre`:n.push(`<dialog${J([[`data-humalis`,r.id],[`class`,[`humalis-fenetre`,...r.classes].join(` `)],[`aria-labelledby`,`${r.id}-titre`],[`aria-describedby`,r.description===void 0?void 0:`${r.id}-description`]])}>`),n.push(`<div class="humalis-fenetre-contenu">`),n.push(`<h2${J([[`id`,`${r.id}-titre`]])}>${q(r.titre)}</h2>`),r.description!==void 0&&n.push(`<p${J([[`id`,`${r.id}-description`]])}>${q(r.description)}</p>`),this.ecrireGroupeHtml(r.corps,t,n),n.push(`<button type="button" class="humalis-fenetre-fermer" aria-label="Fermer">×</button>`),n.push(`</div>`),n.push(`</dialog>`);break;case`graphique`:n.push(Al(r,e=>this.initial(e,t),e=>this.texteInitial(e,t)));break;case`codeDocumentation`:let e=ru(r),i=e?` data-humalis-frappe="${e.frappe}" data-humalis-frappe-cle="${e.cle}"`:``;n.push(`<div class="humalis-bloc-code-conteneur"><pre class="humalis-bloc-code${e?` ${e.classe}`:``}" data-langage="${q(r.langage??``)}"${i}><code>${Fu(r.code,r.langage)}</code></pre><button type="button">${q(this.messageCopier()[0].texte)}</button></div>`);break;case`tableauDocumentation`:{let e=(e,n)=>`<${n}>${this.contenuAccentHtml(e,`texte`,t)}</${n}>`;n.push(`<div class="humalis-tableau-conteneur"><table>`),n.push(`<caption>${this.contenuAccentHtml(r.legende,`texte`,t)}</caption><thead><tr>${r.colonnes.map(t=>e(t,`th`)).join(``)}</tr></thead><tbody>`);for(let t of r.rangees)n.push(`<tr>${t.map(t=>e(t,`td`)).join(``)}</tr>`);n.push(`</tbody></table></div>`);break}case`bloc`:{if(r.genre===`liste`||r.genre===`listeNumerotee`){let e=r.genre===`liste`?`ul`:`ol`;n.push(`<${e}${J([this.repereHtml(r.ligne)])} class="humalis-liste">`);for(let e of r.corps){if(e.type===`repetition`){let r=$(e.liste,t);for(let i of Array.isArray(r)?r:[])n.push(`<li>`),this.ecrireGroupeHtml(e.corps,t.enfant().definir(e.variable,i),n),n.push(`</li>`);continue}n.push(`<li>`),this.ecrireGroupeHtml([e],t,n),n.push(`</li>`)}n.push(`</${e}>`);break}if(Sd.has(r.genre)){this.ecrireEnfantHtml(Ju(this.aideComposite(r,t)),t,n);break}let e=Cd[r.genre]??`div`;n.push(`<${e}${J([this.repereHtml(r.ligne),[`class`,Fd(r)]])}>`),xd(r)&&n.push(`<button type="button" class="humalis-menu-bouton" aria-expanded="false" aria-label="Menu"><span class="humalis-menu-icone" aria-hidden="true"></span></button>`),this.ecrireGroupeHtml(r.corps,t,n),n.push(`</${e}>`);let i=r.id===void 0?void 0:this.basDesBlocs.get(r.id);i&&(!i.gestionnaire.tantQue||cd(i.gestionnaire.tantQue,t,this.contexte.champs))&&(n.push(`<div class="humalis-sentinelle" data-humalis="${r.id}-bas" aria-hidden="true"></div>`),i.gestionnaire.bouton!==null&&n.push(`<button type="button" class="humalis-voir-plus" data-humalis="${r.id}-voir-plus">${q(i.gestionnaire.bouton??`Voir plus`)}</button>`));break}case`formulaire`:if(this.montres.has(r.id))break;n.push(`<form${J([this.repereHtml(r.ligne),[`data-humalis`,r.id],[`class`,`humalis-formulaire`],[`novalidate`,`true`]])}>`),this.ecrireGroupeHtml(r.corps,t,n),n.push(`</form>`);break;case`composant`:{let e=this.site.composants.get(r.nom);if(!e)throw Error(`le composant « ${r.nom} » n'est pas écrit en Humalis`);let i=new Map(r.proprietes.map(e=>[e.nom,$(e.valeur,t)]));yd(e,this.site,i,n);break}}}ecrireGroupeHtml(e,t,n){let r=t.enfant();for(let t of e)t.type===`locale`&&r.definir(t.nom,$(t.valeur,r));this.ecrireHtml(e,r,n)}initial(e,t){try{return $(e,t)}catch{return}}contenuAccentJs(e,t){if(e.type!==`texte`||![`titre`,`soustitre`,`texte`].includes(t))return nd(e,this.contexte);let n=e=>e.map(e=>`texte`in e?e.accent?`creer('span', { class: 'humalis-accent' }, ${G(e.texte)})`:e.code?`creer('code', { class: 'humalis-code-ligne' }, ${G(e.texte)})`:G(e.texte):nd({type:`texte`,parties:[e]},this.contexte)).join(`, `),r=e=>e.some(e=>`texte`in e&&(e.accent||e.code));return!r(e.parties)&&!e.versions?.some(e=>r(e.parties))?nd(e,this.contexte):e.versions?`...(${e.versions.slice(1).map(e=>`langue() === ${G(e.code)} ? [${n(e.parties)}] : `).join(``)}[${n(e.versions[0].parties)}])`:n(e.parties)}contenuAccentHtml(e,t,n){return e.type!==`texte`||![`titre`,`soustitre`,`texte`].includes(t)||!e.parties.some(e=>`texte`in e&&(e.accent||e.code))?q(sd(e,n,this.contexte.champs)):e.parties.map(e=>{let t=q(`texte`in e?e.texte:sd({type:`texte`,parties:[e]},n,this.contexte.champs));return`texte`in e&&e.accent?`<span class="humalis-accent">${t}</span>`:`texte`in e&&e.code?`<code class="humalis-code-ligne">${t}</code>`:t}).join(``)}texteInitial(e,t){try{return sd(e,t,this.contexte.champs)}catch{return``}}classesDe(e){return[...e.options.map(e=>`humalis-${e.nom}-${e.valeur}`),...e.classes].join(` `)}aide(e,t){let n=Dd(e.contenu);return{valeur:{js:Q(e.contenu,this.contexte),initial:this.initial(e.contenu,t)},texte:{js:nd(e.contenu,this.contexte),initial:this.texteInitial(e.contenu,t)},...n===void 0?{}:{litteral:n},classes:this.classesDe(e),styles:e.options.map(e=>`${e.nom}_${e.valeur}`),reglages:e.reglages,...e.minimum===void 0?{}:{minimum:e.minimum},...e.maximum===void 0?{}:{maximum:e.maximum},...e.reglages.photo?{photo:{js:Q(e.reglages.photo,this.contexte),initial:this.texteInitial(e.reglages.photo,t)}}:{},...e.contenu.type===`variable`?{variable:Z(e.contenu.nom)}:{},...this.site.langues?{langues:this.site.langues}:{},...e.genre===`audio`?{audio:this.audioDe(e,t)}:{},id:e.id}}audioDe(e,t){let n=e=>Dd(e)??{js:nd(e,this.contexte),initial:this.texteInitial(e,t)},r=Dd(e.contenu),{description:i,transcription:a}=e.textes??{};return{source:r!==void 0&&Gs(r)?`audio/${qs(r)}`:n(e.contenu),...i?{description:n(i)}:{},...a?{transcription:{js:nd(a,this.contexte),initial:this.texteInitial(a,t)}}:{}}}aideComposite(e,t){let n=e.corps.filter(e=>e.type===`bloc`),r=e=>e?{js:nd(e,this.contexte),initial:this.texteInitial(e,t)}:{js:`''`,initial:``},i=e.etat?{js:Z(e.etat),initial:this.initial({type:`variable`,nom:e.etat},t)}:void 0,a={genre:e.genre,id:`${e.genre}-${e.ligne%1e6}`,classes:this.classesDe(e),reglages:e.reglages??{},parties:e.genre===`onglets`?n.map(e=>({titre:r(e.titre),icone:e.reglages?.icone,corps:e.corps})):e.genre===`deroulant`?[{titre:r(e.titre),icone:e.reglages?.icone,corps:e.corps}]:e.genre===`filAriane`?e.corps.map(e=>({titre:r(void 0),corps:[e]})):[],...i?{etat:i}:{},corps:e.corps};if(e.genre===`deroulant`&&i){let t=e.index!==void 0;a.ouvert=t?{js:`${i.js} === ${e.index}`,initial:i.initial===e.index}:{js:i.js,initial:i.initial===!0},a.basculer=t?`${i.js} = ${i.js} === ${e.index} ? -1 : ${e.index}`:`${i.js} = !${i.js}`}return a}classesCarte(e){return[`humalis-carte`,...e.classes].join(` `)}lieuxInitiaux(e,t){return e.flatMap(e=>{if(e.type===`marqueur`)return[{nom:this.texteInitial(e.nom,t),...e.adresse?{adresse:this.texteInitial(e.adresse,t)}:{},latitude:Number(this.initial(e.latitude,t)),longitude:Number(this.initial(e.longitude,t))}];if(e.type===`condition`)return this.lieuxInitiaux(cd(e.test,t,this.contexte.champs)?e.alors:e.sinon,t);if(e.type===`repetition`){let n=$(e.liste,t);return(Array.isArray(n)?n:[]).flatMap(n=>this.lieuxInitiaux(e.corps,t.enfant().definir(e.variable,n)))}return[]})}carteHtml(e,t,n){let r=this.texteInitial(e.nom,t),i=this.lieuxInitiaux(e.corps,t),a=e=>`https://www.openstreetmap.org/?mlat=${e.latitude}&mlon=${e.longitude}#map=15/${e.latitude}/${e.longitude}`;n.push(`<section${J([[`aria-label`,r],[`class`,this.classesCarte(e)]])}>`),n.push(`<div class="humalis-carte-zone"></div>`),n.push(`<ul${J([[`aria-label`,`Les lieux de la carte : ${r}`],[`class`,`humalis-carte-lieux`]])}>`);for(let e of i)n.push(`<li><strong>${q(e.nom)}</strong>${e.adresse?`<span>${q(e.adresse)}</span>`:``}<a${J([[`href`,a(e)],[`aria-label`,`Ouvrir dans OpenStreetMap : ${e.nom}`]])}>Ouvrir dans OpenStreetMap</a></li>`);if(i.length===0&&e.latitude&&e.longitude){let r={latitude:Number(this.initial(e.latitude,t)),longitude:Number(this.initial(e.longitude,t))};n.push(`<li><a${J([[`href`,a(r)]])}>Ouvrir dans OpenStreetMap</a></li>`)}n.push(`</ul>`),n.push(`</section>`)}lieuxJs(e,t){for(let n of t)if(n.type===`marqueur`){let t=n.adresse?`, adresse: ${nd(n.adresse,this.contexte)}`:``;e.ligne(`{ nom: ${nd(n.nom,this.contexte)}${t}, latitude: ${Q(n.latitude,this.contexte)}, longitude: ${Q(n.longitude,this.contexte)} },`)}else n.type===`condition`?(e.ligne(`...(${id(n.test,this.contexte)} ? [`),e.indenter(()=>this.lieuxJs(e,n.alors)),n.sinon.length>0?(e.ligne(`] : [`),e.indenter(()=>this.lieuxJs(e,n.sinon)),e.ligne(`]),`)):e.ligne(`] : []),`)):n.type===`repetition`&&e.bloc(`...${Q(n.liste,this.contexte)}.flatMap((${Z(n.variable)}) => [`,()=>this.lieuxJs(e,n.corps),`]),`)}carteJs(e,t){let n=[...t.latitude&&t.longitude?[`latitude: ${Q(t.latitude,this.contexte)}`,`longitude: ${Q(t.longitude,this.contexte)}`]:[],...t.zoom?[`zoom: ${Q(t.zoom,this.contexte)}`]:[],...t.tuiles?[`tuiles: ${G(t.tuiles.adresse)}`,`attribution: ${G(t.tuiles.attribution)}`]:[]];e.bloc(`carteLieux(${G(t.id)}, ${nd(t.nom,this.contexte)}, ${n.length>0?`{ ${n.join(`, `)} }`:`{}`}, [`,()=>this.lieuxJs(e,t.corps),`], ${G(this.classesCarte(t))}),`)}ecrireEnfantJs(e,t){if(`tag`in t){let n=t.attrs.filter(([,e])=>e!==!1).map(([e,t])=>`${/^[a-z]+$/.test(e)?e:G(e)}: ${typeof t==`string`?e.startsWith(`on`)?t:G(t):typeof t==`boolean`?String(t):t.js}`);e.bloc(`creer(${G(t.tag)}, { ${n.join(`, `)} },`,()=>t.enfants.forEach(t=>this.ecrireEnfantJs(e,t)),`),`)}else if(`texte`in t)e.ligne(`${G(t.texte)},`);else if(`js`in t)e.ligne(`${t.js},`);else if(`vue`in t)this.ecrireGroupe(e,t.vue,`...`,`,`);else if(`icone`in t)e.ligne(`icone(${G(t.icone)}, ${G(t.classe??`humalis-icone`)}${t.label?`, ${typeof t.label==`string`?G(t.label):t.label.js}`:``}),`);else if(`qr`in t)e.ligne(`codeQr(${t.qr}),`);else if(`avatar`in t)e.ligne(`avatar(${t.avatar.nom}, ${t.avatar.photo??`''`}),`);else{let{js:n,maximum:r,change:i,label:a,classes:o}=t.etoiles;e.ligne(`etoiles(${n}, ${r}, ${i??`undefined`}, ${typeof a==`string`?G(a):a.js}, ${G(o)}),`)}}ecrireEnfantHtml(e,t,n){if(`tag`in e){let r=J(e.attrs.filter(([e])=>!e.startsWith(`on`)).map(([e,t])=>{let n=typeof t==`object`?t.initial:t;return[e,n===!1?void 0:n===!0?`true`:n]}));if([`progress`].includes(e.tag)&&e.enfants.length===0){n.push(`<${e.tag}${r}></${e.tag}>`);return}n.push(`<${e.tag}${r}>`);for(let r of e.enfants)this.ecrireEnfantHtml(r,t,n);n.push(`</${e.tag}>`)}else if(`texte`in e)n.push(q(e.texte));else if(`js`in e)n.push(q(e.initial));else if(`vue`in e)this.ecrireGroupeHtml(e.vue,t,n);else if(`icone`in e)n.push(Xu(e.icone,e.classe??`humalis-icone`,typeof e.label==`object`?e.label.initial:e.label));else if(!(`qr`in e)){if(`avatar`in e){let{initialNom:t,initialPhoto:r}=e.avatar;n.push(r?`<img${J([[`src`,r],[`alt`,``]])}>`:`<span aria-hidden="true">${q(qu(t))}</span>`)}else{let{initial:t,maximum:r,change:i,label:a,classes:o}=e.etoiles;n.push(Zu(t,r,i!==void 0,typeof a==`string`?a:a.initial,o))}}}champHtml(e,t,n,r){let i=e.saisie,a=i?.sorte??`texte`,o=i?.obligatoire?`<span>${r}<span class="humalis-obligatoire" aria-hidden="true"> *</span></span>`:r,s=[this.repereHtml(e.ligne),[`data-humalis`,e.id],[`class`,n]],c=e=>[...e,[`required`,i?.obligatoire?`true`:void 0],[`placeholder`,a===`liste`?void 0:i?.indice],[`min`,i?.minimum===void 0?void 0:String(i.minimum)],[`max`,i?.maximum===void 0?void 0:String(i.maximum)]],l=()=>{let e=i?.parmi?$(i.parmi,t):[];return(Array.isArray(e)?e:[]).map(String)};switch(a){case`case`:return`<label class="humalis-case"><input${J(c([[`type`,`checkbox`],...s]))}>${o}</label>`;case`choix`:{let t=l().map(t=>`<label><input${J([[`type`,`radio`],[`name`,e.id],[`value`,t]])}>${q(t)}</label>`).join(``);return`<fieldset${J([this.repereHtml(e.ligne),[`data-humalis`,e.id],[`class`,n?`${n} humalis-choix`:`humalis-choix`]])}><legend>${o}</legend>${t}</fieldset>`}case`liste`:{let e=l().map(e=>`<option${J([[`value`,e]])}>${q(e)}</option>`).join(``);return`<label class="humalis-champ">${o}<select${J(c(s))}><option value="" selected="true">${q(i?.indice??`Choisissez…`)}</option>${e}</select></label>`}case`texteLong`:return`<label class="humalis-champ">${o}<textarea${J(c([[`rows`,`4`],...s]))}></textarea></label>`;default:{let t=this.genreChamp(e)??md[a];return`<label class="humalis-champ">${o}<input${J(c([...s,[`type`,t?.type],[`autocomplete`,t?.autocomplete]]))}></label>`}}}repereHtml(e){return[`data-humalis-source`,this.site.reperes?Lu(e,this.site.reperes):void 0]}repereJs(e){let t=this.site.reperes?Lu(e,this.site.reperes):void 0;return t===void 0?[]:[[`'data-humalis-source'`,G(t)]]}repereObjetJs(e){return this.repereJs(e).map(([e,t])=>`${e}: ${t}, `).join(``)}elementHtml(e,t){let n=this.classes(e)||void 0,r=(t=[])=>J([this.repereHtml(e.ligne),...t,[`data-humalis`,e.id],[`class`,n],...e.annonce?[[`aria-live`,`polite`],[`aria-atomic`,`true`]]:[],...wd(e)]),i=e.reglages?.icone?Ha(e.reglages.icone)?.lucide:void 0,a=(i?Xu(i,`humalis-icone`):``)+this.contenuAccentHtml(e.contenu,e.genre,t);switch(e.genre){case`titre`:case`soustitre`:{let t=`h${this.niveaux.get(e)??1}`;return`<${t}${r()}>${a}</${t}>`}case`texte`:return`<p${r()}>${a}</p>`;case`bouton`:return`<button${r([[`type`,this.formulaireDe.has(e.id)&&!this.evenements.has(e.id)?`submit`:`button`]])}>${a}</button>`;case`lien`:{let n=(e.arguments??[]).map(e=>`${W(e.nom)}=${encodeURIComponent(String($(e.valeur,t)))}`).join(`&`);return`<a${r([[`href`,this.fichier(e.cible??``)+(n?`?${n}`:``)]])}>${a}</a>`}case`image`:{if(e.image)return`<img${r(this.attributsImage(e.image,e.contenu,e=>String($(e,t)),e=>e))}>`;let n=Dd(e.contenu);return`<img${r([[`src`,String($(e.contenu,t))],[`alt`,e.reglages?.decoratif?``:e.reglages?.description??Ed(n)],...e.reglages?.decoratif?[[`aria-hidden`,`true`]]:[]])}>`}case`champ`:return this.champHtml(e,t,n,a)}}};const xd=e=>e.options.some(e=>e.nom===`menu`&&e.valeur===`repliable`),Sd=new Set([`onglets`,`deroulant`,`accordeon`,`carrousel`,`filAriane`]),Cd={section:`section`,entete:`header`,pied:`footer`,menu:`nav`};function wd(e){if(e.raccourci===void 0)return[];let{aria:t,texte:n}=Jl(e.raccourci),r=Dd(e.contenu);return[[`aria-keyshortcuts`,t],[`title`,r?`${r} (${n})`:n]]}const Td=`creer.icone.avatar.etoiles.codeQr.carteLieux.definirTheme.t.langue.changerLangue.afficherMessage.planifier.mouvementReduit.themeSombre.copier.partager.derniereRequete.cliquer.focaliser.fenetre.confirmer.retirerPremier.grouper.formaterNombre.formaterDate.formaterArgent.accorder.formaterTaille.dateDuJour.maintenant.decalerDate.joursEntre.formaterDepuis.adresseDe.lirePartage.garderPartage.lireMemoire.garderMemoire.serveur.utilisateur`.split(`.`);function Ed(e){return e===void 0?``:e.replace(/\.[a-z0-9]+$/i,``).replace(/[_-]+/g,` `)}function Dd(e){if(!(e.type===`texte`&&e.versions))return Od(e)}function Od(e){if(!(e.type!==`texte`||!e.parties.every(e=>`texte`in e)))return e.parties.map(e=>`texte`in e?e.texte:``).join(``)}function kd(e){return e.replace(/^(titre|texte|image|bouton|lien|champ)_/,``)}function Ad(e){return e.some(e=>e.type===`requete`&&e.mode===`envoyer`||e.type===`suppression`||e.type===`modification`||Kl(e).some(e=>Ad(e)))}function jd(e){return e.some(e=>Md.has(e.type)||e.type!==`minuterie`&&e.type!==`message`&&Kl(e).some(e=>jd(e)))}const Md=new Set([`requete`,`suppression`,`modification`,`connexion`,`deconnexion`,`confirmation`,`copie`,`partage`]);function Nd(e){return e.some(e=>e.type===`arreter`||![`repetition`,`tantQue`,`repeter`,`minuterie`,`message`].includes(e.type)&&Kl(e).some(Nd))}function Pd(e,t=new Set){for(let n of e){n.type===`affectation`&&t.add(n.nom),(n.type===`ajout`||n.type===`retrait`)&&t.add(n.liste),n.type===`requete`&&n.resultat!==void 0&&t.add(n.resultat);for(let e of Kl(n))Pd(e,t)}return t}function Fd(e){return[`humalis-${e.genre}`,...e.options.map(e=>`humalis-${e.nom}-${e.valeur}`),...e.classes].join(` `)}const Id=`.humalis-projet`;function Ld(e){let t=Hu(e);return new Map(e.ecrans.map(e=>[e.nom,t.get(e.nom)===`/`?`index.html`:`${U(e.nom)||`page`}.html`]))}function Rd(e,t){let n=new Map,r=Ld(e),i={partages:e.partages,cle:`humalis:${U(t.nom)||`application`}`,fichiers:r,composants:new Map(e.composants.map(e=>[e.nom,e])),medias:t.medias,...e.langues?{langues:e.langues}:{},...t.sources?{reperes:t.sources}:{}},a=e.langues?.[0].code,o=[`humalis/styles.css`];e.css.length>0&&(n.set(`styles/style.css`,e.css.join(`
|
|
1463
1491
|
|
|
1464
1492
|
`)+`
|
|
1465
|
-
`),o.push(`styles/style.css`));let s=
|
|
1493
|
+
`),o.push(`styles/style.css`));let s=Vu(e.fichiersStyle.map(e=>e.chemin),e.css.length>0?[`style.css`]:[]);for(let{chemin:r}of e.fichiersStyle){let e=t.fichiersStyle?.get(r);if(e===void 0)throw Error(`le fichier de style « ${r} » n'a pas été lu`);n.set(`styles/${s.get(r)}`,e),o.push(`styles/${s.get(r)}`)}ud(e.fonctions);let c=hu(e),l=bu(e.theme),u=e.disposition!==void 0,d=t.adresse??e.site?.adresse,f=e.ecrans.map(n=>({ecran:n,page:gd(yl(n,e.disposition),i,t.source)})),p=f.some(({page:e})=>e.serveur),m=f.some(({page:e})=>e.session);n.set(Id,`Site produit par Humalis depuis ${t.source}.\nLe compilateur réécrit ce dossier à chaque compilation.\n`);let h=JSON.stringify([...e.ecrans,...e.composants].map(e=>e.vue)).match(/"type":"formulaire"|"saisie":/)!==null,g=JSON.stringify([...e.ecrans,...e.composants].map(e=>e.vue)).includes(`"type":"bloc"`);if(n.set(`humalis/styles.css`,Uu(h,g)),e.fonctions.length>0&&n.set(`fonctions.js`,_d(e.fonctions,i,t.source)),e.composants.length>0){let r=e.composants.map(e=>vd(e,i));n.set(`composants.js`,`// Produit par Humalis depuis ${t.source} : les composants écrits en Humalis.
|
|
1466
1494
|
// Chacun reçoit ses paramètres et rend ses éléments, placés dans la page.
|
|
1467
1495
|
'use strict';
|
|
1468
1496
|
|
|
1469
1497
|
${r.join(`
|
|
1470
|
-
`)}`)}for(let{ecran:t,page:i}of f){let s=`pages/${U(t.nom)||`page`}.js`,f=/\bcodeQr\(/.test(i.script)||i.composants&&/\bcodeQr\(/.test(n.get(`composants.js`)??``),p=/\bcarteLieux\(/.test(i.script)||i.composants&&/\bcarteLieux\(/.test(n.get(`composants.js`)??``),m=/\bhumalisGraphique\./.test(i.script)||i.composants&&/\bhumalisGraphique\./.test(n.get(`composants.js`)??``),h=[`humalis/humalis.js`,...f?[`humalis/qrcode.js`]:[],...m?[`humalis/graphique.js`]:[],...p?[`humalis/leaflet.js`]:[],...e.fonctions.length>0?[`fonctions.js`]:[],...i.composants?[`composants.js`]:[],s],g=r.get(t.nom),_=
|
|
1498
|
+
`)}`)}for(let{ecran:t,page:i}of f){let s=`pages/${U(t.nom)||`page`}.js`,f=/\bcodeQr\(/.test(i.script)||i.composants&&/\bcodeQr\(/.test(n.get(`composants.js`)??``),p=/\bcarteLieux\(/.test(i.script)||i.composants&&/\bcarteLieux\(/.test(n.get(`composants.js`)??``),m=/\bhumalisGraphique\./.test(i.script)||i.composants&&/\bhumalisGraphique\./.test(n.get(`composants.js`)??``),h=[`humalis/humalis.js`,...f?[`humalis/qrcode.js`]:[],...m?[`humalis/graphique.js`]:[],...p?[`humalis/leaflet.js`]:[],...e.fonctions.length>0?[`fonctions.js`]:[],...i.composants?[`composants.js`]:[],s],g=r.get(t.nom),_=Bd(e,t,i,g,d);n.set(g,Ud(_.titre,_.description,p?[`humalis/leaflet.css`,...o]:o,h,i.html,{mode:l,bascule:c,site:u,langue:a},_.balises)),n.set(s,i.script)}if(n.set(`404.html`,Ud(`Page introuvable`,`Cette page n'existe pas.`,o,e.langues?[`humalis/humalis.js`,`pages/introuvable-humalis.js`]:[],[`<h1>Page introuvable</h1>`,`<p>Cette page n'existe pas.</p>`,`<a href="index.html">Revenir à l'accueil</a>`],{bascule:!1,langue:a})),e.langues&&n.set(`pages/introuvable-humalis.js`,Qd),n.set(`LISEZMOI.md`,Zd(t,m||p)),e.site){n.set(`robots.txt`,pl(e.site,e.site.indexation?d:void 0)),d&&e.site.indexation&&n.set(`sitemap.xml`,Hd(e,r,d)),e.site.logo&&!cl(e.site.logo)&&n.set(`manifest.webmanifest`,ml(e.site,t.images,``));for(let[r,i]of hl(e.site,t.images,``))n.set(r,i)}let _=xl([...n.entries()].filter(([e])=>e.endsWith(`.js`)||e.endsWith(`.html`)).map(([,e])=>e));_.qr&&n.set(`humalis/qrcode.js`,`//---------------------------------------------------------------------
|
|
1471
1499
|
//
|
|
1472
1500
|
// QR Code Generator for JavaScript
|
|
1473
1501
|
//
|
|
@@ -3758,7 +3786,7 @@ var qrcode = function() {
|
|
|
3758
3786
|
|
|
3759
3787
|
// L'encodage UTF-8 (les accents d'un texte français)
|
|
3760
3788
|
qrcode.stringToBytes = qrcode.stringToBytesFuncs['UTF-8'];
|
|
3761
|
-
`),[...n.entries()].some(([e,t])=>e.endsWith(`.js`)&&/\bhumalisGraphique\./.test(t))&&n.set(`humalis/graphique.js`,
|
|
3789
|
+
`),[...n.entries()].some(([e,t])=>e.endsWith(`.js`)&&/\bhumalisGraphique\./.test(t))&&n.set(`humalis/graphique.js`,jl);let v=[...n.entries()].filter(([e])=>e.endsWith(`.js`)).map(([,e])=>e),y=e=>v.some(t=>e.test(t)),ee={pressePapier:y(/\b(copier|partager)\(/),fenetres:y(/\bfenetre\(/),questions:y(/\bconfirmer\(/),bas:y(/\bonbas:/)};n.set(`humalis/humalis.js`,Wd(t.source,r,p,m,c?l??``:void 0,_,e.langues,ee)),[...n.values()].some(e=>e.includes(`humalis-menu-bouton`))&&n.set(`humalis/humalis.js`,`${n.get(`humalis/humalis.js`)}\n${tf}`),cu([...n.values()])&&n.set(`humalis/humalis.js`,`${n.get(`humalis/humalis.js`)}\n// La hauteur de l'en-tête, pour « entete avec fixe » et « hauteur ecran ».\n${su}\nsuivreLaHauteurDeLEntete();\n`),iu([...n.values()])&&n.set(`humalis/humalis.js`,`${n.get(`humalis/humalis.js`)}\n// Les animations « au defilement » attendent que l'élément entre à l'écran.\n${ou}\nobserverLeDefilement();\n`),n.set(`humalis/styles.css`,n.get(`humalis/styles.css`)+Ul([...n.values()])+Gl([...n.values()])+au([...n.values()])+Yl([...n.values()])+Pl([...n.values()],e.theme?.couleurs.map(e=>e.nom))+yu(e.theme,c,t.polices));for(let[e,r]of Js(t.medias,`images/`))n.set(e,r);for(let[e,r]of Js(t.medias,`audio/`,`audio`))n.set(e,r);return _.carte&&(n.set(`humalis/leaflet.js`,`/* @preserve
|
|
3762
3790
|
* Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com
|
|
3763
3791
|
* (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade
|
|
3764
3792
|
*/
|
|
@@ -4424,22 +4452,22 @@ svg.leaflet-image-layer.leaflet-interactive path {\r
|
|
|
4424
4452
|
print-color-adjust: exact;\r
|
|
4425
4453
|
}\r
|
|
4426
4454
|
}\r
|
|
4427
|
-
`)),e.langues&&
|
|
4455
|
+
`)),e.langues&&lc(n,e.langues.map(e=>e.code)),n}function zd(e,t){return`${dl(e)}/${t===`index.html`?``:t}`}function Bd(e,t,n,r,i){let a=e.site,o=t.apercu;if(!a&&!o)return{titre:n.titre,description:n.description,balises:[]};let s=sl((o?.titre&&Vd(o.titre))??n.titre,a),c=n.description!==n.titre,l=(o?.description&&Vd(o.description))??(c?n.description:a?.description??n.description),u=(o?.image&&Vd(o.image))??a?.image,d=u?ul(u,i):void 0,f=i&&a?zd(i,r):void 0,p=o?.indexation===!1||a?.indexation===!1;return{titre:s,description:l,balises:[...f?[`<link rel="canonical" href="${_l(f)}" />`]:[],`<meta property="og:title" content="${_l(s)}" />`,`<meta property="og:description" content="${_l(l)}" />`,`<meta property="og:type" content="website" />`,...f?[`<meta property="og:url" content="${_l(f)}" />`]:[],...a?.nom?[`<meta property="og:site_name" content="${_l(a.nom)}" />`]:[],...d?[`<meta property="og:image" content="${_l(d)}" />`]:[],`<meta name="twitter:card" content="${d?`summary_large_image`:`summary`}" />`,...p?[`<meta name="robots" content="noindex" />`]:[],...a?gl(a,``):[]]}}function Vd(e){if(!(e.type!==`texte`||!e.parties.every(e=>`texte`in e)))return e.parties.map(e=>`texte`in e?e.texte:``).join(``)}function Hd(e,t,n){return`<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${e.ecrans.filter(e=>e.apercu?.indexation!==!1&&e.nom!==`introuvable`).map(e=>` <url><loc>${_l(zd(n,t.get(e.nom)))}</loc></url>\n`).join(``)}</urlset>\n`}function Ud(e,t,n,r,i,a={bascule:!1},o=[]){return`<!doctype html>
|
|
4428
4456
|
<html lang="${a.langue??`fr`}"${a.mode?` data-theme="${a.mode}"`:``}>
|
|
4429
4457
|
<head>
|
|
4430
4458
|
<meta charset="utf-8">
|
|
4431
4459
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
4432
|
-
<title>${q(e)}</title>${a.bascule?`\n <script>${
|
|
4433
|
-
<meta name="description" content="${
|
|
4434
|
-
${o.map(e=>` ${e}\n`).join(``)}${n.map(e=>` <link rel="stylesheet" href="${
|
|
4460
|
+
<title>${q(e)}</title>${a.bascule?`\n <script>${xu}<\/script>`:``}
|
|
4461
|
+
<meta name="description" content="${Iu(t)}">
|
|
4462
|
+
${o.map(e=>` ${e}\n`).join(``)}${n.map(e=>` <link rel="stylesheet" href="${Iu(e)}">\n`).join(``)}${r.map(e=>` <script src="${Iu(e)}" defer><\/script>\n`).join(``)} </head>
|
|
4435
4463
|
<body>
|
|
4436
4464
|
<ul class="humalis-messages" aria-live="polite"></ul>
|
|
4437
4465
|
<main class="${a.site?`humalis-site`:`humalis-page`}">
|
|
4438
4466
|
${i.map(e=>` ${e}\n`).join(``)} </main>
|
|
4439
4467
|
</body>
|
|
4440
4468
|
</html>
|
|
4441
|
-
`}function
|
|
4442
|
-
`),l=[`creer`,`demarrer`,`afficherMessage`,`planifier`,`mouvementReduit`,`themeSombre`,`cliquer`,`focaliser`,`retirerPremier`,`grouper`,`formaterNombre`,`formaterDate`,`formaterArgent`,`accorder`,`formaterTaille`,`dateDuJour`,`maintenant`,`decalerDate`,`joursEntre`,`formaterDepuis`,`adresseDe`,`lirePartage`,`garderPartage`,`lireMemoire`,`garderMemoire`,...i===void 0?[]:[`definirTheme`],...o?[`t`,`langue`,`changerLangue`]:[],...a?
|
|
4469
|
+
`}function Wd(e,t,n,r,i,a,o,s={pressePapier:!1,fenetres:!1,questions:!1,bas:!1}){let c=[...t].map(([e,t])=>` ${G(e)}: ${G(t)},`).join(`
|
|
4470
|
+
`),l=[`creer`,`demarrer`,`afficherMessage`,`planifier`,`mouvementReduit`,`themeSombre`,`cliquer`,`focaliser`,`retirerPremier`,`grouper`,`formaterNombre`,`formaterDate`,`formaterArgent`,`accorder`,`formaterTaille`,`dateDuJour`,`maintenant`,`decalerDate`,`joursEntre`,`formaterDepuis`,`adresseDe`,`lirePartage`,`garderPartage`,`lireMemoire`,`garderMemoire`,...i===void 0?[]:[`definirTheme`],...o?[`t`,`langue`,`changerLangue`]:[],...a?Sl(a):[],...s.pressePapier?[`copier`,`partager`]:[],...s.fenetres?[`fenetre`]:[],...s.questions?[`confirmer`]:[],...n?[`serveur`,`derniereRequete`]:[],...r?[`utilisateur`]:[]];return`// Produit par Humalis depuis ${e} : les outils communs des pages.
|
|
4443
4471
|
// Du JavaScript écrit en clair, sans bibliothèque : on peut le reprendre à
|
|
4444
4472
|
// la main. Un seul nom global, « humalis » ; chaque page prend ce qu'il lui
|
|
4445
4473
|
// faut (const { creer } = humalis;).
|
|
@@ -4840,10 +4868,10 @@ ${Bo}
|
|
|
4840
4868
|
const garderPartage = (cle, valeur) => garderDans(() => sessionStorage, cle, valeur);
|
|
4841
4869
|
const lireMemoire = (cle, actuelle) => lireDans(() => localStorage, cle, actuelle);
|
|
4842
4870
|
const garderMemoire = (cle, valeur) => garderDans(() => localStorage, cle, valeur);
|
|
4843
|
-
${i===void 0?``:
|
|
4871
|
+
${i===void 0?``:ef(i)}${o?$d(o):``}${a?Cl(a):``}${s.pressePapier?Gd:``}${s.bas?Kd:``}${s.fenetres?qd:``}${s.questions?Jd:``}${n||r?Yd:``}${r?Xd:``}
|
|
4844
4872
|
return { ${l.join(`, `)} };
|
|
4845
4873
|
})();
|
|
4846
|
-
`}const
|
|
4874
|
+
`}const Gd=`
|
|
4847
4875
|
// ─── Copier et partager ─────────────────────────────────────────────────
|
|
4848
4876
|
|
|
4849
4877
|
/**
|
|
@@ -4900,7 +4928,7 @@ ${i===void 0?``:Xd(i)}${o?Yd(o):``}${a?Sl(a):``}${s.pressePapier?Vd:``}${s.bas?H
|
|
|
4900
4928
|
}
|
|
4901
4929
|
await copier(adresse ?? texte, adresse ? 'Lien copié : il ne reste qu’à le coller.' : 'Texte copié : il ne reste qu’à le coller.');
|
|
4902
4930
|
}
|
|
4903
|
-
`,
|
|
4931
|
+
`,Kd=`
|
|
4904
4932
|
// ─── Le défilement infini (« arrive en bas de ») ─────────────────────────
|
|
4905
4933
|
|
|
4906
4934
|
let observateurDuBas;
|
|
@@ -4929,7 +4957,7 @@ ${i===void 0?``:Xd(i)}${o?Yd(o):``}${a?Sl(a):``}${s.pressePapier?Vd:``}${s.bas?H
|
|
|
4929
4957
|
for (const sentinelle of sentinelles) observateurDuBas.observe(sentinelle);
|
|
4930
4958
|
}
|
|
4931
4959
|
|
|
4932
|
-
`,
|
|
4960
|
+
`,qd=`
|
|
4933
4961
|
// ─── Les fenêtres (« fenetre "…" : ») ───────────────────────────────────
|
|
4934
4962
|
|
|
4935
4963
|
/**
|
|
@@ -4983,7 +5011,7 @@ ${i===void 0?``:Xd(i)}${o?Yd(o):``}${a?Sl(a):``}${s.pressePapier?Vd:``}${s.bas?H
|
|
|
4983
5011
|
}
|
|
4984
5012
|
return null;
|
|
4985
5013
|
}
|
|
4986
|
-
`,
|
|
5014
|
+
`,Jd=`
|
|
4987
5015
|
// ─── Les questions (« confirmer ») ──────────────────────────────────────
|
|
4988
5016
|
|
|
4989
5017
|
/**
|
|
@@ -5040,7 +5068,7 @@ ${i===void 0?``:Xd(i)}${o?Yd(o):``}${a?Sl(a):``}${s.pressePapier?Vd:``}${s.bas?H
|
|
|
5040
5068
|
non.focus();
|
|
5041
5069
|
});
|
|
5042
5070
|
}
|
|
5043
|
-
`,
|
|
5071
|
+
`,Yd=`
|
|
5044
5072
|
// ─── Le serveur (« envoyer requete ») ───────────────────────────────────
|
|
5045
5073
|
|
|
5046
5074
|
/** Les en-têtes d'un envoi : le jeton CSRF que pose @astratra/security (cookie astratra_csrf). */
|
|
@@ -5093,7 +5121,7 @@ ${i===void 0?``:Xd(i)}${o?Yd(o):``}${a?Sl(a):``}${s.pressePapier?Vd:``}${s.bas?H
|
|
|
5093
5121
|
modifier: (adresse, id, donnees) =>
|
|
5094
5122
|
appeler(\`\${adresse}/\${encodeURIComponent(id)}\`, { method: 'PATCH', headers: entetes(), body: JSON.stringify(donnees) }, undefined),
|
|
5095
5123
|
};
|
|
5096
|
-
`,
|
|
5124
|
+
`,Xd=`
|
|
5097
5125
|
// ─── La session (« se connecter », « si utilisateur est connecte ») ─────
|
|
5098
5126
|
// La session est le cookie HttpOnly posé par le pack, que le JavaScript ne
|
|
5099
5127
|
// peut pas lire : la page ne garde ni jeton ni mot de passe. L'état
|
|
@@ -5159,7 +5187,7 @@ ${i===void 0?``:Xd(i)}${o?Yd(o):``}${a?Sl(a):``}${s.pressePapier?Vd:``}${s.bas?H
|
|
|
5159
5187
|
}
|
|
5160
5188
|
await relireSession();
|
|
5161
5189
|
}
|
|
5162
|
-
`;function
|
|
5190
|
+
`;function Zd(e,t){return`# ${e.nom}
|
|
5163
5191
|
|
|
5164
5192
|
Site statique produit par Humalis depuis \`${e.source}\` : du HTML,
|
|
5165
5193
|
du CSS et du JavaScript écrit en clair, sans framework et sans
|
|
@@ -5178,9 +5206,9 @@ visite (\`sessionStorage\`), les variables mémorisées au retour du
|
|
|
5178
5206
|
visiteur (\`localStorage\`).
|
|
5179
5207
|
${t?"\nLes requêtes et la connexion vont vers le serveur Humalis (`--cible\nserveur`), à la même origine : servez ce dossier et le serveur derrière la\nmême adresse (les chemins `/api` et `/auth` vers le serveur), ou réglez\n`ADRESSE_SERVEUR` en tête de `humalis/humalis.js`. La session est le\ncookie du pack `@astratra/security` ; ouvert depuis le disque, le site\nne peut pas parler au serveur.\n":``}
|
|
5180
5208
|
Ce dossier est réécrit à chaque compilation Humalis. Pour le reprendre à
|
|
5181
|
-
la main, supprimez le fichier \`${
|
|
5209
|
+
la main, supprimez le fichier \`${Id}\` : Humalis refusera alors
|
|
5182
5210
|
de l'écraser.
|
|
5183
|
-
`}const
|
|
5211
|
+
`}const Qd=`// Produit par Humalis : la page « introuvable », dans la langue de la personne.
|
|
5184
5212
|
'use strict';
|
|
5185
5213
|
|
|
5186
5214
|
const { creer } = humalis;
|
|
@@ -5192,7 +5220,7 @@ humalis.demarrer({
|
|
|
5192
5220
|
creer('a', { href: 'index.html' }, "Revenir à l'accueil"),
|
|
5193
5221
|
],
|
|
5194
5222
|
});
|
|
5195
|
-
|
|
5223
|
+
`,$d=e=>`
|
|
5196
5224
|
// ─── Les langues (bloc « langues ») ─────────────────────────────────────
|
|
5197
5225
|
|
|
5198
5226
|
/** Les langues du site : la première est celle des textes écrits et du HTML de départ. */
|
|
@@ -5201,7 +5229,7 @@ humalis.demarrer({
|
|
|
5201
5229
|
/** Le choix gardé, sinon la première langue du site que demande le navigateur, sinon la première. */
|
|
5202
5230
|
function langueDeDepart() {
|
|
5203
5231
|
try {
|
|
5204
|
-
const gardee = localStorage.getItem('${
|
|
5232
|
+
const gardee = localStorage.getItem('${Su}');
|
|
5205
5233
|
if (LANGUES.includes(gardee)) return gardee;
|
|
5206
5234
|
} catch {
|
|
5207
5235
|
// Stockage refusé : on suit le navigateur.
|
|
@@ -5232,13 +5260,13 @@ humalis.demarrer({
|
|
|
5232
5260
|
langueCourante = code;
|
|
5233
5261
|
document.documentElement.lang = code;
|
|
5234
5262
|
try {
|
|
5235
|
-
localStorage.setItem('${
|
|
5263
|
+
localStorage.setItem('${Su}', code);
|
|
5236
5264
|
} catch {
|
|
5237
5265
|
// Sans stockage, le choix vaut jusqu'au rechargement.
|
|
5238
5266
|
}
|
|
5239
5267
|
actualiser();
|
|
5240
5268
|
}
|
|
5241
|
-
`,
|
|
5269
|
+
`,ef=e=>`
|
|
5242
5270
|
// ─── Le thème (changer theme par sombre) ────────────────────────────────
|
|
5243
5271
|
|
|
5244
5272
|
/** Le mode du projet quand le visiteur n'a rien choisi (bloc theme). */
|
|
@@ -5251,8 +5279,8 @@ humalis.demarrer({
|
|
|
5251
5279
|
theme = affiche === 'sombre' ? 'clair' : 'sombre';
|
|
5252
5280
|
}
|
|
5253
5281
|
try {
|
|
5254
|
-
if (theme === 'automatique') localStorage.removeItem('${
|
|
5255
|
-
else localStorage.setItem('${
|
|
5282
|
+
if (theme === 'automatique') localStorage.removeItem('${lu}');
|
|
5283
|
+
else localStorage.setItem('${lu}', theme);
|
|
5256
5284
|
} catch {
|
|
5257
5285
|
// Stockage refusé : le choix vaut pour cette visite seulement.
|
|
5258
5286
|
}
|
|
@@ -5262,7 +5290,7 @@ humalis.demarrer({
|
|
|
5262
5290
|
// « theme est sombre » est relu : la page est redessinée.
|
|
5263
5291
|
actualiser();
|
|
5264
5292
|
}
|
|
5265
|
-
`,
|
|
5293
|
+
`,tf=`// Les menus repliables : le bouton « Menu » d'un petit écran.
|
|
5266
5294
|
document.addEventListener('click', (evenement) => {
|
|
5267
5295
|
const cible = evenement.target instanceof Element ? evenement.target : null;
|
|
5268
5296
|
const menu = cible?.closest('.humalis-menu-repliable');
|
|
@@ -5286,4 +5314,4 @@ document.addEventListener('keydown', (evenement) => {
|
|
|
5286
5314
|
fermerLesMenus(null);
|
|
5287
5315
|
ouvert?.focus();
|
|
5288
5316
|
});
|
|
5289
|
-
`;export{
|
|
5317
|
+
`;export{Gc as compiler,Rd as genererProjetStatique};
|