[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
<!-- © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
|
|
|
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) -->
|
|
|
|
|
|
|
|
|
|
<script>
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
// Racine de l'interface (§ 13.4). Ses propriétés sont les dépendances de
|
|
|
|
|
// l'application — système de fichiers, horloge, exécuteur de génération,
|
|
|
|
|
// presse-papiers, identifiants, langue, provenance, démonstrations, format
|
[FIX] iteration 3 review: seat targets, gestures, warnings, settings
The wheel no longer zooms during a gesture, so a drop lands under the
ghost. A seat is a target the size of its pitch. A floor drop refuses to
remove an every-tour reservation. A seat reservation the retained plan
does not hold is flagged at the seat, with its swap as remedy. DERIVE names
the person; capacities have an upper bound; Generate waits for a pending
setting; a worker that fails to load shows a refusal; § 5.3 constraints
get their switches. Commands are not re-entrant and a double click does not
confirm. Checked: 2755 node, 550 browser tests, from the index alone.
--- FR ---
[FIX] revue de l'itération 3 : cibles, gestes, avertissements, réglages
La molette ne zoome plus pendant un geste : le dépôt tombe sous le fantôme.
Un siège est une cible de la taille de son pas. Un dépôt sur le sol refuse
de retirer une réservation de tous les tours. Une réservation à un siège
que le retenu ne tient pas est relevée au siège, l'échange en remède. La
dérive nomme la personne ; les capacités ont une borne ; Générer attend un
réglage en cours ; un travailleur qui ne se charge pas donne un refus ; le
§ 5.3 a ses bascules. Les commandes ne sont pas ré-entrantes et un double
clic ne confirme pas. Vérifié : 2755 node, 550 navigateur, index seul.
Assisted-by: Claude Opus 5.5
2026-10-07 17:50:35 -04:00
|
|
|
// courant, version du produit et sa forme Windows, et en option le thème
|
|
|
|
|
// de départ — que src/main.js construit pour la machine et monterApp pour
|
|
|
|
|
// une épreuve : App ne choisit aucune plateforme, et ne lit la version que
|
|
|
|
|
// dans ses propriétés, la même au bandeau, au titre, à l'accueil et dans
|
|
|
|
|
// le bloc « À propos ».
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
//
|
|
|
|
|
// À son initialisation, App crée une fois chacun la séance, sans racine,
|
|
|
|
|
// le contrôleur de génération et la façade, et les donne aux composants par
|
|
|
|
|
// le contexte de Svelte — clés 'seance', 'facade', 'generation', 'ui', 't',
|
|
|
|
|
// 'format', 'horloge' et 'relireListe' —, posé de façon synchrone avant que
|
|
|
|
|
// la détermination du dossier de travail, asynchrone, ne rende. La façade
|
|
|
|
|
// pose la racine de la séance par changerRacine : aussitôt sans question,
|
|
|
|
|
// après la réponse sinon. App lit la liste du dossier de travail par la
|
|
|
|
|
// façade et la donne à l'accueil, une fois la détermination réglée — sans
|
|
|
|
|
// question au démarrage, après la réponse sinon : pret se résout quand la
|
|
|
|
|
// détermination est faite, la liste lue quand aucune question n'attend, et
|
|
|
|
|
// le premier écran — les lignes de la liste, ou la question — rendu.
|
|
|
|
|
//
|
|
|
|
|
// L'écran suit la séance : la liste sans événement ouvert, l'événement
|
|
|
|
|
// sinon ; le panneau « À propos » les remplace tant qu'il est ouvert. Chaque
|
|
|
|
|
// ouverture d'un événement remet l'état de navigation à son départ. Le
|
|
|
|
|
// bandeau, présent sur tout écran, ne défile pas : un écran plus haut que
|
|
|
|
|
// la fenêtre défile sous lui.
|
|
|
|
|
//
|
|
|
|
|
// Le thème part de la propriété themeInitial, ou de la préférence du
|
|
|
|
|
// système lue au montage ; le réglage de l'opérateur le change pour la
|
|
|
|
|
// séance, en mémoire, posé en data-theme sur <html> (§ 19.2). À la sortie
|
|
|
|
|
// de la page (pagehide), la séance ferme l'événement et rend son verrou,
|
|
|
|
|
// sans question ; aucun beforeunload ne retient la page (§ 8.4).
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
import './jetons.css';
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
import { onDestroy, setContext, tick, untrack } from 'svelte';
|
|
|
|
|
import { creerFacade } from '../application/evenements.js';
|
|
|
|
|
import { creerFormat } from '../application/format.js';
|
|
|
|
|
import { creerControleurGeneration } from '../application/generation.js';
|
|
|
|
|
import { TABLES_APPLICATION } from '../application/libelles.js';
|
|
|
|
|
import { creerSeance } from '../application/seance.js';
|
|
|
|
|
import { creerTraduction } from '../application/traduction.js';
|
|
|
|
|
import APropos from './APropos.svelte';
|
|
|
|
|
import Accueil from './accueil/Accueil.svelte';
|
|
|
|
|
import Bandeau from './Bandeau.svelte';
|
|
|
|
|
import Evenement from './evenement/Evenement.svelte';
|
|
|
|
|
import { blocAPropos, provenanceVisible, versionVisible } from './apropos.js';
|
|
|
|
|
import { creerEtatUi } from './etat_ui.js';
|
|
|
|
|
import { TABLES_INTERFACE } from './libelles.js';
|
|
|
|
|
import { themeInitial as themeDuSysteme } from './theme.js';
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
// Les dépendances se lisent une fois, au montage : App crée ses services
|
|
|
|
|
// une seule fois, et un changement de propriété ne les recrée pas.
|
|
|
|
|
const dependances = $props();
|
|
|
|
|
const {
|
|
|
|
|
fs,
|
|
|
|
|
horloge,
|
|
|
|
|
executeur,
|
|
|
|
|
pressePapiers,
|
|
|
|
|
identifiant,
|
|
|
|
|
langue = 'fr',
|
|
|
|
|
provenance,
|
|
|
|
|
demonstrations,
|
|
|
|
|
formatCourant,
|
|
|
|
|
produitVersion,
|
[FIX] iteration 3 review: seat targets, gestures, warnings, settings
The wheel no longer zooms during a gesture, so a drop lands under the
ghost. A seat is a target the size of its pitch. A floor drop refuses to
remove an every-tour reservation. A seat reservation the retained plan
does not hold is flagged at the seat, with its swap as remedy. DERIVE names
the person; capacities have an upper bound; Generate waits for a pending
setting; a worker that fails to load shows a refusal; § 5.3 constraints
get their switches. Commands are not re-entrant and a double click does not
confirm. Checked: 2755 node, 550 browser tests, from the index alone.
--- FR ---
[FIX] revue de l'itération 3 : cibles, gestes, avertissements, réglages
La molette ne zoome plus pendant un geste : le dépôt tombe sous le fantôme.
Un siège est une cible de la taille de son pas. Un dépôt sur le sol refuse
de retirer une réservation de tous les tours. Une réservation à un siège
que le retenu ne tient pas est relevée au siège, l'échange en remède. La
dérive nomme la personne ; les capacités ont une borne ; Générer attend un
réglage en cours ; un travailleur qui ne se charge pas donne un refus ; le
§ 5.3 a ses bascules. Les commandes ne sont pas ré-entrantes et un double
clic ne confirme pas. Vérifié : 2755 node, 550 navigateur, index seul.
Assisted-by: Claude Opus 5.5
2026-10-07 17:50:35 -04:00
|
|
|
versionWindows,
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
themeInitial,
|
|
|
|
|
} = untrack(() => dependances);
|
|
|
|
|
|
|
|
|
|
const { t } = creerTraduction([...TABLES_APPLICATION, ...TABLES_INTERFACE], { langue });
|
|
|
|
|
const format = creerFormat(t);
|
[FIX] iteration 3 review: seat targets, gestures, warnings, settings
The wheel no longer zooms during a gesture, so a drop lands under the
ghost. A seat is a target the size of its pitch. A floor drop refuses to
remove an every-tour reservation. A seat reservation the retained plan
does not hold is flagged at the seat, with its swap as remedy. DERIVE names
the person; capacities have an upper bound; Generate waits for a pending
setting; a worker that fails to load shows a refusal; § 5.3 constraints
get their switches. Commands are not re-entrant and a double click does not
confirm. Checked: 2755 node, 550 browser tests, from the index alone.
--- FR ---
[FIX] revue de l'itération 3 : cibles, gestes, avertissements, réglages
La molette ne zoome plus pendant un geste : le dépôt tombe sous le fantôme.
Un siège est une cible de la taille de son pas. Un dépôt sur le sol refuse
de retirer une réservation de tous les tours. Une réservation à un siège
que le retenu ne tient pas est relevée au siège, l'échange en remède. La
dérive nomme la personne ; les capacités ont une borne ; Générer attend un
réglage en cours ; un travailleur qui ne se charge pas donne un refus ; le
§ 5.3 a ses bascules. Les commandes ne sont pas ré-entrantes et un double
clic ne confirme pas. Vérifié : 2755 node, 550 navigateur, index seul.
Assisted-by: Claude Opus 5.5
2026-10-07 17:50:35 -04:00
|
|
|
// Le bloc « À propos » se compose au montage, avant toute séance : une
|
|
|
|
|
// forme de la version que les dépendances ne portent pas lève RangeError
|
|
|
|
|
// ici, et App ne se monte pas avec un bloc copiable faux (§ 18.6).
|
|
|
|
|
const bloc = blocAPropos(
|
|
|
|
|
{ version: { affichee: produitVersion, windows: versionWindows }, plateforme: fs.nature, provenance, format: formatCourant },
|
|
|
|
|
t,
|
|
|
|
|
);
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
const seanceApp = creerSeance({
|
|
|
|
|
fs,
|
|
|
|
|
horloge,
|
|
|
|
|
identifiant,
|
|
|
|
|
produitVersion,
|
|
|
|
|
planifier: horloge.planifier,
|
|
|
|
|
annuler: horloge.annuler,
|
|
|
|
|
formatCourant,
|
|
|
|
|
});
|
|
|
|
|
const generationApp = creerControleurGeneration({ seance: seanceApp, executeur, horloge, produitVersion });
|
|
|
|
|
const facadeApp = creerFacade({
|
|
|
|
|
fs,
|
|
|
|
|
horloge,
|
|
|
|
|
identifiant,
|
|
|
|
|
produitVersion,
|
|
|
|
|
demonstrations,
|
|
|
|
|
ouvert: () => seanceApp.etat().evenement?.base ?? null,
|
|
|
|
|
ouvrir: (base) => seanceApp.ouvrir(base),
|
|
|
|
|
fermer: () => seanceApp.fermer(),
|
|
|
|
|
creer: (champs) => seanceApp.creer(champs),
|
|
|
|
|
racine: () => seanceApp.etat().racine,
|
|
|
|
|
changerRacine: (racine) => seanceApp.changerRacine(racine),
|
|
|
|
|
});
|
|
|
|
|
// La façade que reçoivent les composants, et que rend l'export facade :
|
|
|
|
|
// celle de creerFacade, dont demarrer et repondre relisent la liste une
|
|
|
|
|
// fois la détermination réglée sans question. La façade appelle
|
|
|
|
|
// changerRacine avant de retirer sa question, si bien qu'une lecture
|
|
|
|
|
// lancée de ce rappel serait refusée (QUESTION_EN_ATTENTE). Une
|
|
|
|
|
// détermination refusée ne laisse rien : le demarrer suivant la refait, et
|
|
|
|
|
// relit alors la liste.
|
|
|
|
|
const facadeContexte = {
|
|
|
|
|
...facadeApp,
|
|
|
|
|
demarrer: async () => {
|
|
|
|
|
const issue = await facadeApp.demarrer();
|
|
|
|
|
if (issue.dossier.question === null) await relireListe();
|
|
|
|
|
return issue;
|
|
|
|
|
},
|
|
|
|
|
repondre: async (choix) => {
|
|
|
|
|
const issue = await facadeApp.repondre(choix);
|
|
|
|
|
if (issue.dossier.question === null) await relireListe();
|
|
|
|
|
return issue;
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
const uiApp = creerEtatUi();
|
|
|
|
|
|
|
|
|
|
setContext('seance', seanceApp);
|
|
|
|
|
setContext('facade', facadeContexte);
|
|
|
|
|
setContext('relireListe', () => relireListe());
|
|
|
|
|
setContext('generation', generationApp);
|
|
|
|
|
setContext('ui', uiApp);
|
|
|
|
|
setContext('t', t);
|
|
|
|
|
setContext('format', format);
|
|
|
|
|
setContext('horloge', horloge);
|
|
|
|
|
|
|
|
|
|
// Un refus de la séance ou de la façade porte un code, que l'écran
|
|
|
|
|
// traduit ; toute autre erreur est une faute, qui remonte.
|
|
|
|
|
const estRefus = (erreur) => typeof erreur?.code === 'string';
|
|
|
|
|
const refusDe = (erreur) => ({ code: erreur.code, details: erreur.details });
|
|
|
|
|
|
|
|
|
|
// La liste du dossier de travail, que l'accueil montre, et le refus qui en
|
|
|
|
|
// tient lieu quand la façade refuse de la lire : une liste refusée ne
|
|
|
|
|
// montre plus les lignes d'une lecture d'avant. lecture est la promesse de
|
|
|
|
|
// la dernière lecture lancée, que preparer attend ; quand deux lectures se
|
|
|
|
|
// chevauchent, seule la dernière pose ce qu'elle lit. La lecture passe par
|
|
|
|
|
// facadeContexte, la façade que voient les composants et les épreuves.
|
|
|
|
|
let lignes = $state.raw([]);
|
|
|
|
|
let refusLecture = $state.raw(null);
|
|
|
|
|
let lecture = Promise.resolve();
|
|
|
|
|
let lectures = 0;
|
|
|
|
|
|
|
|
|
|
async function lireListe() {
|
|
|
|
|
lectures += 1;
|
|
|
|
|
const rang = lectures;
|
|
|
|
|
try {
|
|
|
|
|
const lues = await facadeContexte.lister();
|
|
|
|
|
if (rang !== lectures) return;
|
|
|
|
|
lignes = lues;
|
|
|
|
|
refusLecture = null;
|
|
|
|
|
} catch (erreur) {
|
|
|
|
|
if (!estRefus(erreur)) throw erreur;
|
|
|
|
|
if (rang !== lectures) return;
|
|
|
|
|
lignes = [];
|
|
|
|
|
refusLecture = refusDe(erreur);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Lance une lecture de la liste, qui devient la dernière, et rend sa
|
|
|
|
|
// promesse. L'accueil l'appelle par le contexte après toute opération qui
|
|
|
|
|
// change le dossier de travail.
|
|
|
|
|
function relireListe() {
|
|
|
|
|
lecture = lireListe();
|
|
|
|
|
return lecture;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// L'état observable de la séance, et la base de l'événement ouvert : une
|
|
|
|
|
// base qui change vers un événement remet la navigation à son départ. Le
|
|
|
|
|
// refus de « Liste des événements » tient jusqu'au changement suivant.
|
|
|
|
|
// La liste se relit à chaque fermeture d'un événement, qui a pu en créer,
|
|
|
|
|
// en changer ou écrire ailleurs ; elle se lit aussi quand la détermination
|
|
|
|
|
// se règle — preparer sans question, repondre de facadeContexte après la
|
|
|
|
|
// réponse.
|
|
|
|
|
let etatSeance = $state.raw(seanceApp.etat());
|
|
|
|
|
let refusListe = $state.raw(null);
|
|
|
|
|
let baseOuverte = null;
|
|
|
|
|
const desabonner = seanceApp.subscribe((etat) => {
|
|
|
|
|
const base = etat.evenement?.base ?? null;
|
|
|
|
|
if (base !== null && base !== baseOuverte) uiApp.reinitialiser();
|
|
|
|
|
const fermeture = baseOuverte !== null && base === null;
|
|
|
|
|
baseOuverte = base;
|
|
|
|
|
etatSeance = etat;
|
|
|
|
|
refusListe = null;
|
|
|
|
|
if (fermeture) relireListe();
|
|
|
|
|
});
|
|
|
|
|
onDestroy(desabonner);
|
|
|
|
|
|
|
|
|
|
let theme = $state(themeInitial ?? themeDuSysteme(window.matchMedia('(prefers-color-scheme: dark)').matches));
|
|
|
|
|
$effect(() => {
|
|
|
|
|
document.documentElement.setAttribute('data-theme', theme);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const titre = t('coquille.titre', { version: produitVersion });
|
|
|
|
|
const version = versionVisible(provenance, produitVersion, t);
|
|
|
|
|
const provenanceAffichee = provenanceVisible(provenance, t);
|
|
|
|
|
|
|
|
|
|
// « Liste des événements » : ferme l'événement, sans question ; sous un
|
|
|
|
|
// support rompu, la séance le refuse, et le refus s'affiche à côté de la
|
|
|
|
|
// commande.
|
|
|
|
|
async function revenirALaListe() {
|
|
|
|
|
try {
|
|
|
|
|
await seanceApp.fermer();
|
|
|
|
|
} catch (erreur) {
|
|
|
|
|
if (!estRefus(erreur)) throw erreur;
|
|
|
|
|
refusListe = refusDe(erreur);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// La page se retire : la séance ferme l'événement et rend son verrou. Sous
|
|
|
|
|
// un support rompu, elle le refuse et rien ne s'écrit.
|
|
|
|
|
function quitterLaPage() {
|
|
|
|
|
seanceApp.fermer().catch((erreur) => {
|
|
|
|
|
if (!estRefus(erreur)) throw erreur;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// La détermination faite sans question, la liste du dossier retenu se
|
|
|
|
|
// lit ; une question laisse l'accueil sans lignes, jusqu'à la réponse. Un
|
|
|
|
|
// refus de la détermination s'affiche à la place de la liste.
|
|
|
|
|
async function preparer() {
|
|
|
|
|
try {
|
|
|
|
|
await facadeContexte.demarrer();
|
|
|
|
|
} catch (erreur) {
|
|
|
|
|
if (!estRefus(erreur)) throw erreur;
|
|
|
|
|
refusLecture = refusDe(erreur);
|
|
|
|
|
}
|
|
|
|
|
await lecture;
|
|
|
|
|
await tick();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Résolue quand la détermination du dossier de travail est faite et le
|
|
|
|
|
* premier écran rendu : les lignes de la liste lue, ou la question. */
|
|
|
|
|
export const pret = preparer();
|
|
|
|
|
/** La séance de ce montage. */
|
|
|
|
|
export function seance() {
|
|
|
|
|
return seanceApp;
|
|
|
|
|
}
|
|
|
|
|
/** Le contrôleur de génération de ce montage. */
|
|
|
|
|
export function generation() {
|
|
|
|
|
return generationApp;
|
|
|
|
|
}
|
|
|
|
|
/** La façade des événements de ce montage. */
|
|
|
|
|
export const facade = facadeContexte;
|
|
|
|
|
/** L'état de navigation de ce montage. */
|
|
|
|
|
export const ui = uiApp;
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
</script>
|
|
|
|
|
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
<svelte:window onpagehide={quitterLaPage} />
|
|
|
|
|
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
<svelte:head>
|
|
|
|
|
<title>{titre}</title>
|
|
|
|
|
</svelte:head>
|
|
|
|
|
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
<div class="app">
|
|
|
|
|
<Bandeau
|
|
|
|
|
etat={etatSeance}
|
|
|
|
|
{version}
|
|
|
|
|
provenance={provenanceAffichee}
|
|
|
|
|
{theme}
|
|
|
|
|
{refusListe}
|
|
|
|
|
choisirTheme={(choix) => (theme = choix)}
|
|
|
|
|
ouvrirApropos={() => uiApp.ouvrirApropos()}
|
|
|
|
|
{revenirALaListe}
|
|
|
|
|
/>
|
|
|
|
|
<main class="ecran">
|
|
|
|
|
{#if $uiApp.apropos}
|
|
|
|
|
<APropos {bloc} {pressePapiers} fermer={() => uiApp.fermerApropos()} />
|
|
|
|
|
{:else if etatSeance.evenement === null}
|
|
|
|
|
<Accueil {provenance} version={produitVersion} {demonstrations} {lignes} {refusLecture} />
|
|
|
|
|
{:else}
|
|
|
|
|
<Evenement />
|
|
|
|
|
{/if}
|
|
|
|
|
</main>
|
|
|
|
|
</div>
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
|
|
|
|
|
<style>
|
|
|
|
|
:global(body) {
|
|
|
|
|
margin: 0;
|
|
|
|
|
background-color: var(--couleur-page-fond);
|
|
|
|
|
color: var(--couleur-page-texte);
|
|
|
|
|
font-family: var(--police-interface);
|
|
|
|
|
}
|
|
|
|
|
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
.app {
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
display: flex;
|
[ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : coquille — bandeau, sections, thème, À propos
La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
|
|
|
flex-direction: column;
|
|
|
|
|
min-height: 100vh;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.ecran {
|
|
|
|
|
flex: 1;
|
|
|
|
|
padding: var(--espace-4);
|
[ADD] skeleton: Capacitor web app that shows its dated version
The engine to come must be proven against oracles under node in seconds,
so the skeleton sets three test projects: node, watched; node-long; and a
real Chromium that reads computed styles in both themes. The version
lives in version.json alone; a check refuses eight divergences — technical
form, generated module, changelog head, stray version strings — and a
build guard keeps test files and fixture assets out of the bundle.
Checked: on this commit alone, 73 node tests, 7 browser tests and the
version check pass; the guard fails on a fixture joined as an asset.
--- FR ---
[ADD] squelette : application web Capacitor qui affiche sa version datée
Le moteur à venir doit s'éprouver contre des oracles sous node en
quelques secondes : le squelette pose trois projets d'épreuve — node,
sous surveillance ; node-long ; et un vrai Chromium qui lit le style
calculé dans les deux thèmes. La version vit dans version.json seul ; un
contrôle refuse huit divergences — forme technique, module engendré,
tête du changelog, chaînes de version égarées — et une garde de
construction tient fichiers et données d'épreuve hors du paquet.
Vérifié : sur ce commit seul, 73 épreuves node, 7 navigateur et le
contrôle de version passent ; la garde échoue sur une donnée jointe.
Assisted-by: Claude Opus 5.5
2026-10-05 13:13:13 -04:00
|
|
|
}
|
|
|
|
|
</style>
|