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.
- 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 +14 -3
- package/dist/fichiers.js +21 -1
- package/dist/navigateur.js +90 -62
- package/dist/outils/developpement.js +3 -1
- package/dist/outils/version.js +15 -0
- package/dist/parser/miseEnPage.js +1 -1
- package/dist/vocabulaire/table-ecran.js +6 -0
- package/docs/guide.en.md +41 -0
- package/docs/guide.md +39 -0
- package/llms.txt +2 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
-
-
|
|
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 »
|