humalis 1.2.0 → 1.3.1

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.
@@ -3,6 +3,7 @@ import { existsSync, mkdirSync, readFileSync, statSync } from 'node:fs';
3
3
  import { createServer } from 'node:http';
4
4
  import { dirname, join, resolve } from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
+ import { AIDE_REPERES } from '../cibles/commun/reperes.js';
6
7
  export function dependances(fichier, source) {
7
8
  return [...source.matchAll(/^\s*utiliser\s+(?:fichier|style)\s+"([^"]+)"/gmu)]
8
9
  .map((capture) => resolve(dirname(fichier), capture[1]));
@@ -72,7 +73,8 @@ export async function developper(fichier, port) {
72
73
  reponse.setHeader('Access-Control-Allow-Origin', '*');
73
74
  if (requete.url === '/diagnostics.js') {
74
75
  reponse.setHeader('Content-Type', 'text/javascript');
75
- reponse.end(`let panneau=document.createElement('pre');panneau.style='position:fixed;inset:0 0 auto;z-index:999999;background:#420;color:white;padding:1rem;white-space:pre-wrap;display:none';document.body.append(panneau);setInterval(async()=>{let e=await(await fetch('http://localhost:${port + 1}/diagnostics')).text();panneau.textContent=e;panneau.style.display=e?'block':'none'},500);`);
76
+ // L'aide Alt + survol (le fichier et la ligne Humalis d'un élément), puis le panneau des erreurs.
77
+ reponse.end(AIDE_REPERES + `let panneau=document.createElement('pre');panneau.style='position:fixed;inset:0 0 auto;z-index:999999;background:#420;color:white;padding:1rem;white-space:pre-wrap;display:none';document.body.append(panneau);setInterval(async()=>{let e=await(await fetch('http://localhost:${port + 1}/diagnostics')).text();panneau.textContent=e;panneau.style.display=e?'block':'none'},500);`);
76
78
  }
77
79
  else {
78
80
  reponse.setHeader('Content-Type', 'text/plain; charset=utf-8');
@@ -0,0 +1,15 @@
1
+ import { readFileSync } from 'node:fs';
2
+ /** La version du paquet, lue dans son package.json (deux dossiers au-dessus de src/outils/ comme de dist/outils/). */
3
+ export function versionHumalis() {
4
+ return JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;
5
+ }
6
+ /** « humalis --version » ou « humalis --aide » : le texte à afficher, ou undefined pour une autre commande. */
7
+ export function reponseSimple(arguments_, aide) {
8
+ if (arguments_.length !== 1)
9
+ return undefined;
10
+ if (['--version', '-v', 'version'].includes(arguments_[0]))
11
+ return `humalis ${versionHumalis()}`;
12
+ if (['--aide', '--help', '-h', 'aide'].includes(arguments_[0]))
13
+ return aide;
14
+ return undefined;
15
+ }
@@ -56,7 +56,7 @@ export function analyserStylePropre(flux, propriete) {
56
56
  return undefined;
57
57
  }
58
58
  const APPAREILS = ['telephone', 'tablette', 'ordinateur'];
59
- const DRAPEAUX = ['modifiable', 'ouvert', 'plusieurs', 'pourcentage', 'boucle'];
59
+ const DRAPEAUX = ['modifiable', 'ouvert', 'plusieurs', 'pourcentage', 'boucle', 'fixe'];
60
60
  /** « sur telephone : », « sur tablette ou ordinateur : » (en tête de ligne, suivi d'un appareil). */
61
61
  export function estSurAppareil(flux) {
62
62
  return flux.verifier('MOT_CLE', 'sur') && estMot(flux.regarder(1)) && APPAREILS.includes(normaliser(flux.regarder(1).valeur));
@@ -100,6 +100,10 @@ export const ENTREES_ECRAN = [
100
100
  style('ombre', 'Une ombre sous l’élément : aucune, legere, moyenne ou forte.', PAGE(' bloc avec ombre legere :\n texte "Poisson braisé"'), 'box-shadow', 'StyleSheet shadow* et elevation'),
101
101
  style('degrade', 'Un fond en dégradé entre deux couleurs : « degrade bleu vers violet », puis au besoin vertical ou horizontal (diagonal sinon).', PAGE(' bloc avec degrade bleu vers violet :\n titre "Réservez" avec texte blanc'), 'linear-gradient', 'LinearGradient (expo-linear-gradient)', undefined, 'Deux couleurs seulement (de base ou du thème) ; un dégradé plus fin s’écrit en CSS.'),
102
102
  style('colle', 'L’élément reste collé en haut de l’écran quand on défile ; « colle en bas » le colle en bas.', PAGE(' bloc avec colle :\n texte "Toujours visible"'), 'position: sticky', null, undefined, 'Sur le téléphone, seuls l’en-tête et le pied de page restent collés ; ailleurs, un avertissement le dit.'),
103
+ // ─── Défilement et hauteur (plan, apparence sans CSS) ────────────────
104
+ style('defilement', 'Le bloc défile seul, avec sa propre barre, sans faire bouger le reste de la page : « defilement interne ».', PAGE(' ligne avec hauteur ecran :\n colonne avec defilement interne :\n texte "Un long chapitre."'), 'overflow-y: auto', null, [...BLOCS, 'menu'], 'Sur le téléphone, toute la page défile : un avertissement le dit.'),
105
+ style('hauteur', 'Le bloc prend toute la hauteur de l’écran, sous l’en-tête : « hauteur ecran ».', PAGE(' ligne avec hauteur ecran :\n colonne avec defilement interne :\n texte "Un long chapitre."'), 'height: 100dvh', null, BLOCS, 'Sur le téléphone, toute la page défile : un avertissement le dit.'),
106
+ { ...style('fixe', 'L’en-tête ne bouge jamais : seule la zone en dessous défile, avec sa barre (« entete avec fixe : »).', 'entete avec fixe :\n lien "Accueil" vers "accueil"\n\npage "accueil" :\n 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: true },
103
107
  style('sur', 'Dans un bloc « sur telephone : », les appareils où le contenu s’affiche.', PAGE(' sur telephone :\n texte "Petit écran"'), 'display', 'SurAppareil (largeur de la fenêtre)', ['appareil']),
104
108
  // ─── La publication (plan 2026-10-30-qualite-publication, parties 3 à 5) ──
105
109
  {
@@ -389,6 +393,8 @@ export const ENTREES_ECRAN = [
389
393
  valeur('forte', ['ombre'], 'Une ombre marquée.', PAGE(' bloc avec ombre forte :\n texte "a"'), ['fort']),
390
394
  valeur('douce', ['bordure', 'transition'], 'Des coins légèrement arrondis ; pour une transition, des changements adoucis (200 ms).', PAGE(' bloc avec bordure douce :\n texte "a"'), ['doux']),
391
395
  valeur('ronde', ['bordure'], 'Une forme ronde : un cercle pour un élément carré.', PAGE(' bloc avec bordure ronde :\n texte "a"'), ['rond']),
396
+ valeur('interne', ['defilement'], 'Le bloc a son propre défilement : « defilement interne ».', PAGE(' colonne avec defilement interne :\n texte "a"')),
397
+ valeur('ecran', ['hauteur'], 'La hauteur de l’écran, moins celle de l’en-tête : « hauteur ecran ».', PAGE(' ligne avec hauteur ecran :\n texte "a"'), [], 'écran'),
392
398
  valeur('haut', ['colle'], 'Collé en haut de l’écran (par défaut).', PAGE(' bloc avec colle :\n texte "a"')),
393
399
  valeur('bas', ['colle'], 'Collé en bas de l’écran : « colle en bas ».', PAGE(' bloc avec colle en bas :\n texte "a"')),
394
400
  valeur('telephone', ['sur'], 'Un écran de moins de 640 pixels de large.', PAGE(' sur telephone :\n texte "a"'), ['telephones'], 'téléphone'),
package/docs/guide.en.md CHANGED
@@ -408,6 +408,11 @@ CSS can also come from a file: `utiliser style "./theme.css"` at the top of
408
408
  the file. CSS applies to the web, static and desktop targets; mobile only
409
409
  translates named styles (colour, background, size, position, border).
410
410
 
411
+ `humalis verifier` warns when a class used with `avec style` is missing from
412
+ the project's CSS and suggests a close name. It also warns when an
413
+ `!important` rule targets a `.humalis-…` class: remove `!important` or use
414
+ your own class.
415
+
411
416
  ---
412
417
 
413
418
  ## 6. Layout
@@ -446,6 +451,33 @@ Block settings: `largeur` (width: `etroite` narrow, `large` wide),
446
451
  `alignement centre` (centred), `degrade bleu vers violet` (gradient), `colle`
447
452
  (sticks to the top while scrolling).
448
453
 
454
+ ### A page that fits the screen
455
+
456
+ `entete avec fixe :` (fixed header) keeps the header still: only the area below
457
+ scrolls, with its own scrollbar. `hauteur ecran` (screen height) makes a block
458
+ fill the screen under the header, and `defilement interne` (inner scrolling)
459
+ gives a block its own scrolling without moving the rest. Together they make a
460
+ documentation page: the table of contents and the text each scroll on their own,
461
+ without a line of CSS.
462
+
463
+ ```humalis
464
+ entete avec fixe :
465
+ lien "Home" vers "guide"
466
+
467
+ page "guide" :
468
+ titre "The guide"
469
+ ligne avec hauteur ecran :
470
+ menu vertical avec defilement interne :
471
+ lien "Install" vers "guide"
472
+ lien "Pages" vers "guide"
473
+ colonne avec defilement interne :
474
+ texte "A long chapter that scrolls on its own."
475
+ ```
476
+
477
+ On the static target, the scrollbar stays the window's. On a phone the whole page
478
+ scrolls: `hauteur ecran` and `defilement interne` have no effect, and a warning
479
+ says so.
480
+
449
481
  ### Depending on the device
450
482
 
451
483
  ```humalis
@@ -1927,6 +1959,7 @@ texte "…" est absent` (a text is not shown).
1927
1959
  | Command | Role |
1928
1960
  |---|---|
1929
1961
  | `humalis nouveau <name>` | creates a project |
1962
+ | `humalis --version` | shows the installed version (`humalis --help`: the usage) |
1930
1963
  | `humalis developper` | runs the site and recompiles it on every save |
1931
1964
  | `humalis compile <file> --cible <target> --sortie <folder>` | generates a target's project |
1932
1965
  | `humalis compile <file> --cible web --composants <folder>` | generates React components to import elsewhere |
@@ -1940,6 +1973,14 @@ For web and static, `--adresse https://…` gives the site's final address
1940
1973
  (sitemap, share links). For desktop, `--serveur https://…` gives the address
1941
1974
  of the server the application calls.
1942
1975
 
1976
+ With `humalis developper`, every element of the page carries its Humalis
1977
+ file and line: in the browser's inspector, a heading shows for example
1978
+ `data-humalis-source="pages/accueil.humalis:12"` (the path starts from the
1979
+ main file, the line is the one in that file). Hold the Alt key (Option on
1980
+ Mac) and hover over an element: a small label shows the same reference next
1981
+ to the cursor. `humalis compile` adds none of this: the published site stays
1982
+ identical.
1983
+
1943
1984
  ### Error messages
1944
1985
 
1945
1986
  Messages are in French, with the line number, and often suggest the fix:
package/docs/guide.md CHANGED
@@ -389,6 +389,10 @@ Le CSS peut aussi venir d'un fichier : `utiliser style "./theme.css"` en haut du
389
389
  fichier. Le CSS s'applique au web, au statique et au desktop ; le mobile ne
390
390
  traduit que les styles nommés (couleur, fond, taille, position, bordure).
391
391
 
392
+ `humalis verifier` avertit si une classe donnée par `avec style` est absente du CSS
393
+ du projet et propose un nom proche. Il avertit aussi si une règle `!important`
394
+ cible une classe `.humalis-…` : retirez `!important` ou utilisez votre propre classe.
395
+
392
396
  ---
393
397
 
394
398
  ## 6. La mise en page
@@ -424,6 +428,32 @@ Les réglages des blocs : `largeur` (`etroite`, `large`), `remplissage` et
424
428
  `moyenne`), `bordure douce`, `repartition entre`, `alignement centre`,
425
429
  `degrade bleu vers violet`, `colle` (reste en haut pendant le défilement).
426
430
 
431
+ ### Une page qui tient dans l'écran
432
+
433
+ `entete avec fixe :` garde l'en-tête immobile : seule la zone en dessous défile,
434
+ avec sa barre. `hauteur ecran` fait remplir l'écran à un bloc, sous l'en-tête, et
435
+ `defilement interne` donne à un bloc son propre défilement, sans faire bouger le
436
+ reste. Ensemble, ils font une page de documentation : le sommaire et le texte
437
+ défilent chacun de leur côté, sans une ligne de CSS.
438
+
439
+ ```humalis
440
+ entete avec fixe :
441
+ lien "Accueil" vers "guide"
442
+
443
+ page "guide" :
444
+ titre "Le guide"
445
+ ligne avec hauteur ecran :
446
+ menu vertical avec defilement interne :
447
+ lien "Installer" vers "guide"
448
+ lien "Les pages" vers "guide"
449
+ colonne avec defilement interne :
450
+ texte "Un long chapitre, qui défile seul."
451
+ ```
452
+
453
+ Sur le statique, la barre de défilement reste celle de la fenêtre. Sur le
454
+ téléphone, toute la page défile : `hauteur ecran` et `defilement interne` n'ont
455
+ pas d'effet, et un avertissement le dit.
456
+
427
457
  ### Selon l'appareil
428
458
 
429
459
  ```humalis
@@ -1841,6 +1871,7 @@ Les autres étapes : `remplir champ "email" avec "…"`, `aller vers "panier"`,
1841
1871
  | Commande | Rôle |
1842
1872
  |---|---|
1843
1873
  | `humalis nouveau <nom>` | crée un projet |
1874
+ | `humalis --version` | affiche la version installée (`humalis --aide` : le mode d'emploi) |
1844
1875
  | `humalis developper` | lance le site et le recompile à chaque enregistrement |
1845
1876
  | `humalis compile <fichier> --cible <cible> --sortie <dossier>` | produit le projet d'une cible |
1846
1877
  | `humalis compile <fichier> --cible web --composants <dossier>` | produit des composants React à importer ailleurs |
@@ -1854,6 +1885,14 @@ Pour le web et le statique, `--adresse https://…` donne l'adresse finale du
1854
1885
  site (plan du site, liens de partage). Pour le desktop, `--serveur https://…`
1855
1886
  donne l'adresse du serveur que l'application appelle.
1856
1887
 
1888
+ Avec `humalis developper`, chaque élément de la page porte son fichier
1889
+ Humalis et sa ligne : dans l'inspecteur du navigateur, un titre montre par
1890
+ exemple `data-humalis-source="pages/accueil.humalis:12"` (le chemin part du
1891
+ fichier principal, la ligne est celle de ce fichier). Tiens la touche Alt
1892
+ (Option sur Mac) et survole un élément : une petite étiquette affiche ce
1893
+ même repère près du curseur. `humalis compile` n'ajoute rien de tout cela :
1894
+ le site publié reste identique.
1895
+
1857
1896
  ### Les messages d'erreur
1858
1897
 
1859
1898
  Les messages sont en français, avec la ligne, et proposent souvent la
package/llms.txt CHANGED
@@ -146,7 +146,8 @@ page "accueil" :
146
146
  - Un nom de classe CSS sans guillemets : il manque le nom de la classe CSS entre guillemets
147
147
  - « utiliser » sans « style » : il manque « style » après « utiliser »
148
148
  - Un chemin de fichier CSS sans guillemets : il manque le chemin du fichier CSS entre guillemets
149
- - Une classe CSS définie nulle part : n'est définie dans aucun bloc style
149
+ - Un style CSS introuvable : n'est défini dans aucun CSS du projet
150
+ - Une règle CSS écrase un style Humalis : le CSS écrase « humalis-page »
150
151
  - Une option de variable inconnue : n'est pas une option de variable
151
152
  - Un mot après « memorisee en » qui n’est pas « secret » : est attendu après « memorisee en »
152
153
  - Une variable en haut du fichier sans « avec partagee » : ajoutez « avec partagee »
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "humalis",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Un seul langage, en français, pour créer une application complète : web, mobile, desktop et serveur",
5
5
  "type": "module",
6
6
  "bin": {