@starterlib/ui 0.11.7 → 0.13.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.
@@ -1861,6 +1861,123 @@ export declare class StFreshness {
1861
1861
  "perimee": "perimee";
1862
1862
  }, never, never, true, never>;
1863
1863
  }
1864
+ /** Une image a inspecter : son contenu, charge par l'application, et ce qu'elle montre, deja traduit. */
1865
+ export interface ImageAInspecter {
1866
+ /** Le contenu (`Blob`), charge par l'application par `@starterlib/core`, sans cache. */
1867
+ readonly contenu: Blob;
1868
+ /** Ce que montre l'image (« Recto de la piece »), son nom au lecteur d'ecran et sa legende. */
1869
+ readonly libelle: string;
1870
+ }
1871
+ /** Les bornes et les pas du zoom (1 : l'image ajustee a la largeur du panneau) et du contraste. */
1872
+ export declare const BORNES_DE_LA_VISIONNEUSE: {
1873
+ readonly zoom: {
1874
+ readonly min: 0.5;
1875
+ readonly max: 4;
1876
+ readonly pas: 0.25;
1877
+ };
1878
+ readonly contraste: {
1879
+ readonly min: 0.5;
1880
+ readonly max: 2;
1881
+ readonly pas: 0.25;
1882
+ };
1883
+ };
1884
+ type EtatDuPanneau = 'chargement' | 'prete' | 'illisible';
1885
+ /**
1886
+ * Visionneuse de pieces (P08-17 d'Aplomb, DEC-090) : une image, ou deux cote a cote (recto et verso,
1887
+ * piece et selfie), a inspecter a l'ecran SANS la telecharger.
1888
+ *
1889
+ * ```html
1890
+ * <st-image-viewer libelle="Piece d'identite" [images]="pieces()" filigrane="M. Operateur, 14/10/2026" />
1891
+ * ```
1892
+ *
1893
+ * - **Aucune adresse vers l'image** : le contenu (`Blob`, charge par l'application par
1894
+ * `@starterlib/core`, la piece etant servie sans cache par le serveur) est decode une fois en
1895
+ * `ImageBitmap`, dessine dans un canevas, puis le bitmap est ferme : une seule image decodee par
1896
+ * panneau, aucune `ObjectURL` (ni lien, ni `blob:` a autoriser dans la politique de securite du
1897
+ * contenu), aucun bouton de telechargement, aucun menu contextuel « Enregistrer l'image ». Les
1898
+ * canevas sont vides a la destruction, et a chaque changement d'images.
1899
+ * - **Zoom, rotation, contraste** a la barre d'outils et au clavier, communs aux deux panneaux ; le
1900
+ * defilement de l'un suit celui de l'autre. Raccourcis : `+` et `-` (zoom), `r` et `Maj+r`
1901
+ * (rotation a droite et a gauche), `c` et `Maj+c` (contraste), `0` (vue d'origine) ; les fleches
1902
+ * font defiler le panneau qui a le focus. Chaque changement s'annonce poliment.
1903
+ * - **Filigrane** (`filigrane` : identite de l'operateur et date, texte fourni) par-dessus chaque
1904
+ * panneau, a l'ecran comme a l'impression ; les images, elles, ne s'impriment pas.
1905
+ * - Rien n'est stocke dans le navigateur.
1906
+ */
1907
+ export declare class StImageViewer {
1908
+ /** Une ou deux images ; au-dela de deux, les suivantes sont ignorees. */
1909
+ readonly images: import("@angular/core").InputSignal<readonly ImageAInspecter[]>;
1910
+ /** Le nom du groupe (« Piece d'identite de la demande 42 »). */
1911
+ readonly libelle: import("@angular/core").InputSignal<string>;
1912
+ /** Le texte du filigrane (identite de l'operateur, date), deja traduit ; `null` : aucun. */
1913
+ readonly filigrane: import("@angular/core").InputSignal<string | null>;
1914
+ protected readonly libelles: import("@angular/core").Signal<import("@starterlib/ui/donnees").LibellesDonnees>;
1915
+ protected readonly bornes: {
1916
+ readonly zoom: {
1917
+ readonly min: 0.5;
1918
+ readonly max: 4;
1919
+ readonly pas: 0.25;
1920
+ };
1921
+ readonly contraste: {
1922
+ readonly min: 0.5;
1923
+ readonly max: 2;
1924
+ readonly pas: 0.25;
1925
+ };
1926
+ };
1927
+ protected readonly zoom: import("@angular/core").WritableSignal<number>;
1928
+ protected readonly rotation: import("@angular/core").WritableSignal<number>;
1929
+ protected readonly contraste: import("@angular/core").WritableSignal<number>;
1930
+ protected readonly etats: import("@angular/core").WritableSignal<readonly EtatDuPanneau[]>;
1931
+ private readonly dimensions;
1932
+ private readonly ajustements;
1933
+ private readonly toiles;
1934
+ private readonly defilements;
1935
+ protected readonly annonce: AnnonceLocale;
1936
+ protected readonly identifiantDeLAide: string;
1937
+ /** Une generation par jeu d'images : un decodage en retard ne dessine jamais dans un canevas reutilise. */
1938
+ private generation;
1939
+ private synchronisationEnCours;
1940
+ protected readonly affichees: import("@angular/core").Signal<ImageAInspecter[]>;
1941
+ protected readonly transformation: import("@angular/core").Signal<string>;
1942
+ protected readonly filtre: import("@angular/core").Signal<string>;
1943
+ /** Taille affichee du canevas et de sa boite (la boite echange ses cotes a 90 et 270 degres). */
1944
+ protected readonly mesures: import("@angular/core").Signal<({
1945
+ largeur: number;
1946
+ hauteur: number;
1947
+ boiteLargeur: number;
1948
+ boiteHauteur: number;
1949
+ } | null)[]>;
1950
+ constructor();
1951
+ private dessiner;
1952
+ protected zoomer(sens: 1 | -1): void;
1953
+ protected tourner(degres: 90 | -90): void;
1954
+ protected contraster(sens: 1 | -1): void;
1955
+ protected reinitialiser(): void;
1956
+ protected pourcentage(valeur: number): number;
1957
+ private annoncerLaVue;
1958
+ protected auClavier(evenement: KeyboardEvent): void;
1959
+ /** Le defilement d'un panneau, reporte en proportion sur l'autre (une seule fois, sans rebond). */
1960
+ protected synchroniser(indice: number): void;
1961
+ protected interdireLeMenu(evenement: Event): void;
1962
+ static ɵfac: i0.ɵɵFactoryDeclaration<StImageViewer, never>;
1963
+ static ɵcmp: i0.ɵɵComponentDeclaration<StImageViewer, "st-image-viewer", never, {
1964
+ "images": {
1965
+ "alias": "images";
1966
+ "required": true;
1967
+ "isSignal": true;
1968
+ };
1969
+ "libelle": {
1970
+ "alias": "libelle";
1971
+ "required": true;
1972
+ "isSignal": true;
1973
+ };
1974
+ "filigrane": {
1975
+ "alias": "filigrane";
1976
+ "required": false;
1977
+ "isSignal": true;
1978
+ };
1979
+ }, {}, never, never, true, never>;
1980
+ }
1864
1981
  /**
1865
1982
  * Les libelles de `@starterlib/ui/donnees` (P08-08) : le catalogue par point d'entree (AD-10, D154),
1866
1983
  * comme ceux de la navigation et des formulaires. La langue suit celle du dictionnaire du tronc.
@@ -1874,6 +1991,20 @@ export interface LibellesDonnees {
1874
1991
  readonly perimeeDepuis: (duree: string) => string;
1875
1992
  /** Le nom de la donnee devant son etat, espace finale comprise (« Positions : »). */
1876
1993
  readonly libelleDeLaDonnee: (libelle: string) => string;
1994
+ /** `st-image-viewer` (P08-17) : le nom de sa barre d'outils. */
1995
+ readonly outilsDeLaVisionneuse: string;
1996
+ readonly reduire: string;
1997
+ readonly agrandir: string;
1998
+ readonly tournerAGauche: string;
1999
+ readonly tournerADroite: string;
2000
+ readonly moinsDeContraste: string;
2001
+ readonly plusDeContraste: string;
2002
+ readonly vueDOrigine: string;
2003
+ /** Les raccourcis de la visionneuse, en aide visible sous la barre. */
2004
+ readonly raccourcisDeLaVisionneuse: string;
2005
+ /** L'annonce de la vue : zoom et contraste en pour cent, rotation en degres. */
2006
+ readonly etatDeLaVue: (zoom: number, rotation: number, contraste: number) => string;
2007
+ readonly imageIllisible: string;
1877
2008
  }
1878
2009
  export declare const LIBELLES_DONNEES_FR: LibellesDonnees;
1879
2010
  export declare const LIBELLES_DONNEES_EN: LibellesDonnees;
@@ -2,7 +2,7 @@ import * as i0 from "@angular/core";
2
2
  import { InjectionToken, Provider, Signal } from "@angular/core";
3
3
  import { AnnonceLocale, CatalogueDuPointDEntree } from "@starterlib/ui";
4
4
  import { ColonneDeTableau } from "@starterlib/ui/listes";
5
- import { UniteDeTemps } from "@starterlib/util/graduations";
5
+ import { Graduations, UniteDeTemps } from "@starterlib/util/graduations";
6
6
  /**
7
7
  * Les donnees d'un graphique (P08-07), telles que l'API les donne : des instants ISO 8601 et des
8
8
  * valeurs en CHAINE DECIMALE, jamais en flottant (regles-front §2). L'echelle se calcule sur des
@@ -48,6 +48,16 @@ export interface MarqueurDeGraphique {
48
48
  readonly instant: string;
49
49
  readonly libelle: string;
50
50
  }
51
+ /**
52
+ * Une classe d'histogramme (P08-18), de preference calculee par le SERVEUR sur toutes ses donnees :
53
+ * ses bornes en chaines decimales exactes, de `debut` (compris) a `fin` (exclue, sauf pour la
54
+ * derniere classe), et son effectif, un entier positif ou nul.
55
+ */
56
+ export interface ClasseDHistogramme {
57
+ readonly debut: string;
58
+ readonly fin: string;
59
+ readonly effectif: number;
60
+ }
51
61
  /**
52
62
  * Les libelles de `@starterlib/ui/graphiques` (P08-07) : le catalogue par point d'entree (AD-10,
53
63
  * D154), comme ceux des donnees et de la navigation. La langue suit celle du dictionnaire du tronc.
@@ -76,6 +86,20 @@ export interface LibellesGraphiques {
76
86
  * variation depuis le premier point, deja formatees ; `null` : un seul point.
77
87
  */
78
88
  readonly tendance: (dernier: string, variation: string | null) => string;
89
+ /** L'en-tete de la colonne des effectifs du tableau equivalent de `st-histogram` (P08-18). */
90
+ readonly colonneEffectif: string;
91
+ /** Le nom de l'axe des effectifs de `st-histogram`, au-dessus de ses graduations. */
92
+ readonly axeEffectif: string;
93
+ /** Une classe dans le tableau equivalent : ses bornes, deja formatees (« 0 % a 5 % »). */
94
+ readonly intervalle: (debut: string, fin: string) => string;
95
+ /** Le nom de la liste des classes, lue par le lecteur d'ecran sous l'histogramme. */
96
+ readonly classes: string;
97
+ /** Une classe lue par le lecteur d'ecran : ses bornes et son effectif, deja formates. */
98
+ readonly classe: (debut: string, fin: string, effectif: string) => string;
99
+ /** La legende des classes negatives (hachurees) d'un histogramme. */
100
+ readonly classesNegatives: string;
101
+ /** La legende des classes positives ou nulles d'un histogramme. */
102
+ readonly classesPositives: string;
79
103
  }
80
104
  export declare const LIBELLES_GRAPHIQUES_FR: LibellesGraphiques;
81
105
  export declare const LIBELLES_GRAPHIQUES_EN: LibellesGraphiques;
@@ -181,7 +205,7 @@ interface MarqueurLu {
181
205
  readonly libelle: string;
182
206
  }
183
207
  /** Ce que le gabarit dessine : calcule une fois par changement des donnees ou de la largeur. */
184
- interface Dessin {
208
+ interface Dessin$1 {
185
209
  readonly largeur: number;
186
210
  readonly hauteur: number;
187
211
  /** Le cadre du trace : de `gauche` a `droite`, de `haut` a `bas`. */
@@ -278,12 +302,11 @@ export declare class StLineChart {
278
302
  protected readonly marqueursLus: import("@angular/core").Signal<readonly MarqueurLu[]>;
279
303
  /** Aucun point lisible, ni dans les series ni dans le plafond. */
280
304
  protected readonly vide: import("@angular/core").Signal<boolean>;
281
- protected readonly dessin: import("@angular/core").Signal<Dessin | null>;
305
+ protected readonly dessin: import("@angular/core").Signal<Dessin$1 | null>;
282
306
  /** Les colonnes du tableau equivalent : l'instant, chaque serie, le plafond. */
283
307
  protected readonly colonnes: import("@angular/core").Signal<readonly ColonneDeTableau[]>;
284
308
  /** Une ligne par instant, dans l'ordre du temps ; chaque valeur relue depuis sa chaine. */
285
309
  protected readonly lignes: import("@angular/core").Signal<readonly Readonly<Record<string, string>>[]>;
286
- constructor();
287
310
  /** La courbe ou le tableau ; le bouton garde le focus, et la bascule s'annonce. */
288
311
  protected basculer(): void;
289
312
  static ɵfac: i0.ɵɵFactoryDeclaration<StLineChart, never>;
@@ -417,5 +440,178 @@ export declare class StSparkline {
417
440
  };
418
441
  }, {}, never, never, true, never>;
419
442
  }
443
+ /** Une classe lue : ses bornes en nombres (l'echelle) et en chaines (l'affichage), son effectif. */
444
+ interface ClasseLue {
445
+ readonly debut: number;
446
+ readonly fin: number;
447
+ readonly texteDebut: `${number}`;
448
+ readonly texteFin: `${number}`;
449
+ readonly effectif: number;
450
+ }
451
+ /**
452
+ * Les classes fournies, lisibles, dans l'ordre des bornes : une classe sans bornes decimales, sans
453
+ * etendue (`fin` <= `debut`) ou d'effectif qui n'est pas un entier positif ou nul est ecartee
454
+ * (signale en developpement).
455
+ */
456
+ declare function lireClasses(classes: readonly ClasseDHistogramme[], source: string): ClasseLue[];
457
+ /**
458
+ * Les classes de valeurs fournies (chaines decimales), en TypeScript pur : des bornes « agreables »
459
+ * (celles d'une graduation, `@starterlib/util/graduations`), environ `nombre` classes de meme
460
+ * largeur ; une valeur sur une borne va dans la classe qui commence a cette borne, et la derniere
461
+ * classe comprend sa fin. Aucun calcul statistique metier : le serveur qui en a besoin fournit ses
462
+ * classes.
463
+ */
464
+ declare function classesDesValeurs(valeurs: readonly string[], nombre: number, source: string): ClasseLue[];
465
+ /**
466
+ * Les graduations de l'axe des effectifs : de zero au plus grand, des pas ENTIERS (un effectif de
467
+ * deux ne se gradue pas par demis) ; tout vide, l'axe va de zero a un.
468
+ */
469
+ declare function graduationsDEffectif(plusGrand: number, nombreVise: number): Graduations;
470
+ /** Une classe a dessiner, et ce qui la dit. */
471
+ interface ClasseDite extends ClasseLue {
472
+ readonly rang: number;
473
+ readonly negative: boolean;
474
+ readonly texteDuDebut: string;
475
+ readonly texteDeLaFin: string;
476
+ readonly texteDeLEffectif: string;
477
+ }
478
+ /** Ce que le gabarit dessine : calcule une fois par changement des donnees ou de la largeur. */
479
+ interface Dessin {
480
+ readonly largeur: number;
481
+ readonly hauteur: number;
482
+ readonly gauche: number;
483
+ readonly droite: number;
484
+ readonly haut: number;
485
+ readonly bas: number;
486
+ readonly graduations: readonly {
487
+ readonly y: number;
488
+ readonly texte: string;
489
+ }[];
490
+ readonly reperes: readonly {
491
+ readonly x: number;
492
+ readonly texte: string;
493
+ readonly ancre: 'start' | 'middle' | 'end';
494
+ }[];
495
+ /** La verticale de zero, si l'axe passe de part et d'autre. */
496
+ readonly zero: number | null;
497
+ readonly barres: readonly {
498
+ readonly rang: number;
499
+ readonly negative: boolean;
500
+ readonly x: number;
501
+ readonly y: number;
502
+ readonly largeur: number;
503
+ readonly hauteur: number;
504
+ }[];
505
+ }
506
+ /**
507
+ * Une distribution par classes (P08-18, DEC-103) : resultats des essais du laboratoire, resultats
508
+ * publiables ; en SVG ecrit a la main, sans bibliotheque, au niveau d'accessibilite de la courbe.
509
+ *
510
+ * ```html
511
+ * <st-histogram etiquette="Rendements des essais" axe="Rendement" pourcentage
512
+ * [resume]="resume()" [classes]="classes()" />
513
+ * <st-histogram etiquette="Durees des positions" axe="Duree, en jours" [valeurs]="durees()" />
514
+ * ```
515
+ *
516
+ * - **Classes fournies** (`classes`, de preference calculees par le serveur sur toutes ses donnees)
517
+ * ou **calculees** en TypeScript pur sur des valeurs fournies (`valeurs`, `nombreDeClasses`) : des
518
+ * bornes « agreables » de meme largeur. Aucun calcul statistique metier dans le composant.
519
+ * - **Accessible** : un `svg` `role="img"` nomme (`etiquette`) et decrit (`resume`, visible) ; la
520
+ * liste des classes et de leurs effectifs se lit au lecteur d'ecran sous l'image ; « Voir les
521
+ * donnees » bascule vers un `st-data-table` equivalent, au clavier, et la bascule s'annonce.
522
+ * - **La couleur ne dit rien seule** : une classe negative (sa fin au plus zero) est HACHUREE, ce que
523
+ * le contraste force garde ; la verticale de zero est plus franche.
524
+ * - **Des chaines decimales** : les bornes affichees relisent leur chaine (regles-front §2), les
525
+ * graduations viennent de `@starterlib/util/graduations` ; les effectifs se graduent par entiers.
526
+ * - **Sobre** : aucune animation ; 50 classes au plus, recommandees (signale en developpement).
527
+ */
528
+ export declare class StHistogram {
529
+ private readonly locale;
530
+ protected readonly catalogue: import("@angular/core").Signal<import("@starterlib/ui").CatalogueDuPointDEntree<import("@starterlib/ui/graphiques").LibellesGraphiques>>;
531
+ protected readonly annonce: AnnonceLocale;
532
+ /** Les classes fournies ; prioritaires sur `valeurs` (les deux donnees : signale en developpement). */
533
+ readonly classes: import("@angular/core").InputSignal<readonly ClasseDHistogramme[] | null>;
534
+ /** Des valeurs en chaines decimales, rangees en classes par le composant. */
535
+ readonly valeurs: import("@angular/core").InputSignal<readonly string[] | null>;
536
+ /** Le nombre de classes vise pour des `valeurs` : les bornes agreables l'ajustent. */
537
+ readonly nombreDeClasses: import("@angular/core").InputSignal<number>;
538
+ /** Le nom de l'axe des valeurs, deja traduit (« Rendement de l'essai ») : sous l'axe et en tete du tableau. */
539
+ readonly axe: import("@angular/core").InputSignal<string>;
540
+ /** Code ISO 4217 : les bornes sont des montants dans cette devise. */
541
+ readonly devise: import("@angular/core").InputSignal<string | null>;
542
+ /** Sans devise : les bornes sont EN POUR CENT, telles que l'API les donne (3.25 : « 3,25 % »). */
543
+ readonly pourcentage: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
544
+ /** Le nom du graphique, deja traduit. */
545
+ readonly etiquette: import("@angular/core").InputSignal<string>;
546
+ /** Ce que la distribution montre, en une ou deux phrases, deja traduites : lu et affiche. */
547
+ readonly resume: import("@angular/core").InputSignal<string>;
548
+ /** La hauteur du trace, en pixels CSS. */
549
+ readonly hauteur: import("@angular/core").InputSignal<number>;
550
+ protected readonly vueDonnees: import("@angular/core").WritableSignal<boolean>;
551
+ private readonly largeur;
552
+ protected readonly identifiants: {
553
+ readonly motif: `${string}-motif`;
554
+ readonly resume: `${string}-resume`;
555
+ };
556
+ private readonly forme;
557
+ protected readonly classesDites: import("@angular/core").Signal<readonly ClasseDite[]>;
558
+ /** Des classes negatives ET positives : la legende dit la hachure. */
559
+ protected readonly deuxSignes: import("@angular/core").Signal<boolean>;
560
+ protected readonly dessin: import("@angular/core").Signal<Dessin | null>;
561
+ /** Les colonnes du tableau equivalent : la classe (nommee par l'axe), son effectif. */
562
+ protected readonly colonnes: import("@angular/core").Signal<readonly ColonneDeTableau[]>;
563
+ /** Une ligne par classe, classes vides comprises, dans l'ordre des bornes. */
564
+ protected readonly lignes: import("@angular/core").Signal<readonly Readonly<Record<string, string>>[]>;
565
+ /** L'histogramme ou le tableau ; le bouton garde le focus, et la bascule s'annonce. */
566
+ protected basculer(): void;
567
+ static ɵfac: i0.ɵɵFactoryDeclaration<StHistogram, never>;
568
+ static ɵcmp: i0.ɵɵComponentDeclaration<StHistogram, "st-histogram", never, {
569
+ "classes": {
570
+ "alias": "classes";
571
+ "required": false;
572
+ "isSignal": true;
573
+ };
574
+ "valeurs": {
575
+ "alias": "valeurs";
576
+ "required": false;
577
+ "isSignal": true;
578
+ };
579
+ "nombreDeClasses": {
580
+ "alias": "nombreDeClasses";
581
+ "required": false;
582
+ "isSignal": true;
583
+ };
584
+ "axe": {
585
+ "alias": "axe";
586
+ "required": true;
587
+ "isSignal": true;
588
+ };
589
+ "devise": {
590
+ "alias": "devise";
591
+ "required": false;
592
+ "isSignal": true;
593
+ };
594
+ "pourcentage": {
595
+ "alias": "pourcentage";
596
+ "required": false;
597
+ "isSignal": true;
598
+ };
599
+ "etiquette": {
600
+ "alias": "etiquette";
601
+ "required": true;
602
+ "isSignal": true;
603
+ };
604
+ "resume": {
605
+ "alias": "resume";
606
+ "required": true;
607
+ "isSignal": true;
608
+ };
609
+ "hauteur": {
610
+ "alias": "hauteur";
611
+ "required": false;
612
+ "isSignal": true;
613
+ };
614
+ }, {}, never, never, true, never>;
615
+ }
420
616
 
421
617
  export {};
@@ -3470,6 +3470,19 @@ export declare class StFileUpload extends ContratDeChamp implements FormValueCon
3470
3470
  readonly nombreMax: import("@angular/core").InputSignal<number | null>;
3471
3471
  /** Texte du bouton de choix. `null` : « Choisir un fichier » ou « Choisir des fichiers ». */
3472
3472
  readonly libelleDuChoix: import("@angular/core").InputSignal<string | null>;
3473
+ /**
3474
+ * Appareil photo natif (P08-17 d'Aplomb) : l'attribut `capture` du champ natif, `environment`
3475
+ * (camera arriere : une piece, un document) ou `user` (camera avant). `null` (defaut) : aucun
3476
+ * attribut, et le selecteur du systeme d'un telephone propose deja l'appareil photo des que
3477
+ * `accept` admet des images.
3478
+ *
3479
+ * ⚠️ Le televersement reste toujours possible (SPEC-ONBOARDING 28) : les navigateurs de bureau
3480
+ * ignorent l'attribut et ouvrent le selecteur de fichiers ; Safari sur iOS propose la photo, la
3481
+ * phototheque et les fichiers ; Chrome sur Android ouvre directement l'appareil photo. Une page
3482
+ * qui veut garder les fichiers sur Android offre un second champ sans `capture`. Aucune capture
3483
+ * en direct ni detection de presence : la photo prise est un fichier comme un autre.
3484
+ */
3485
+ readonly capture: import("@angular/core").InputSignal<"environment" | "user" | null>;
3473
3486
  /**
3474
3487
  * Ou en est chaque fichier, par `cleDeFichier`. Le composant AFFICHE ce trajet,
3475
3488
  * il ne le fait pas : `StTeleversement` de `@starterlib/core` s'en charge.
@@ -3580,6 +3593,11 @@ export declare class StFileUpload extends ContratDeChamp implements FormValueCon
3580
3593
  "required": false;
3581
3594
  "isSignal": true;
3582
3595
  };
3596
+ "capture": {
3597
+ "alias": "capture";
3598
+ "required": false;
3599
+ "isSignal": true;
3600
+ };
3583
3601
  "etats": {
3584
3602
  "alias": "etats";
3585
3603
  "required": false;
@@ -99,5 +99,216 @@ export declare class StVirtualList<T = unknown> {
99
99
  };
100
100
  }, {}, ["ligne"], never, true, never>;
101
101
  }
102
+ /**
103
+ * Une colonne de `st-virtual-table`, decrite en donnees : la forme de `ColonneDeTableau` de
104
+ * `st-data-table` (`@starterlib/ui/listes`), qu'une application passe telle quelle. Ce point
105
+ * d'entree n'importe aucun autre point d'entree du socle : la forme est redite, pas importee.
106
+ */
107
+ export interface ColonneVirtuelle {
108
+ readonly cle: string;
109
+ readonly libelle: string;
110
+ /** `fin` pour les nombres et les montants. */
111
+ readonly alignement?: 'debut' | 'fin';
112
+ /** Seulement si le SERVEUR trie sur cette colonne : le tableau emet `tri`, il ne reordonne rien. */
113
+ readonly triable?: boolean;
114
+ /** Libelle lu mais non affiche : colonne d'actions. Jamais vide. */
115
+ readonly libelleMasque?: boolean;
116
+ }
117
+ export type SensDeTriVirtuel = 'croissant' | 'decroissant';
118
+ export interface TriVirtuel {
119
+ readonly cle: string;
120
+ readonly sens: SensDeTriVirtuel;
121
+ }
122
+ /** Contexte d'un gabarit de cellule : la ligne, sa colonne et son rang dans le tableau ENTIER. */
123
+ export interface ContexteDeCelluleVirtuelle<T> {
124
+ readonly $implicit: T;
125
+ readonly colonne: ColonneVirtuelle;
126
+ readonly index: number;
127
+ }
128
+ /**
129
+ * Rendu d'une cellule de `st-virtual-table` : la meme ecriture que pour `st-data-table`, type par
130
+ * `[stCelluleDe]` :
131
+ *
132
+ * ```html
133
+ * <ng-template stCellule="montant" [stCelluleDe]="lignes()" let-ligne>
134
+ * {{ ligne.montant }}
135
+ * </ng-template>
136
+ * ```
137
+ */
138
+ export declare class StCelluleVirtuelle<T> {
139
+ readonly cle: import("@angular/core").InputSignal<string>;
140
+ /** Sert seulement au typage du contexte ; nom de l'attribut, d'ou l'absence d'alias. */
141
+ readonly stCelluleDe: import("@angular/core").InputSignal<readonly T[] | null | undefined>;
142
+ readonly gabarit: TemplateRef<ContexteDeCelluleVirtuelle<T>>;
143
+ static ngTemplateContextGuard<T>(_directive: StCelluleVirtuelle<T>, _contexte: unknown): _contexte is ContexteDeCelluleVirtuelle<T>;
144
+ static ɵfac: i0.ɵɵFactoryDeclaration<StCelluleVirtuelle<any>, never>;
145
+ static ɵdir: i0.ɵɵDirectiveDeclaration<StCelluleVirtuelle<any>, "ng-template[stCellule]", never, {
146
+ "cle": {
147
+ "alias": "stCellule";
148
+ "required": true;
149
+ "isSignal": true;
150
+ };
151
+ "stCelluleDe": {
152
+ "alias": "stCelluleDe";
153
+ "required": false;
154
+ "isSignal": true;
155
+ };
156
+ }, {}, never, never, true, never>;
157
+ }
158
+ /** Le prochain sens d'un tri : non trie, croissant, decroissant, puis non trie (ou croissant). */
159
+ export declare function prochainSensVirtuel(actuel: SensDeTriVirtuel | null, ternaire?: boolean): SensDeTriVirtuel | null;
160
+ /**
161
+ * Tableau virtualise (P08-19 d'Aplomb ; lot 267, sous la condition ecrite de `README.md`) : des
162
+ * centaines de milliers de lignes AFFICHEES ensemble, dont seules celles de la fenetre (et une
163
+ * marge) existent dans le document, sur un `<table>` NATIF. A l'echelle seulement : au MVP,
164
+ * `st-data-table` et la pagination par curseur suffisent.
165
+ *
166
+ * ```html
167
+ * <st-virtual-table legende="Journal technique" [colonnes]="colonnes" [lignes]="lignes()" cle="id"
168
+ * [(tri)]="tri">
169
+ * <ng-template stCellule="niveau" [stCelluleDe]="lignes()" let-ligne>{{ ligne.niveau }}</ng-template>
170
+ * </st-virtual-table>
171
+ * ```
172
+ *
173
+ * - **Un tableau, pas une grille** : le lecteur d'ecran le parcourt de cellule en cellule. La
174
+ * table porte `aria-rowcount` (lignes de donnees et ligne d'en-tete), chaque ligne rendue son
175
+ * `aria-rowindex` dans le tableau ENTIER : « ligne 4 201 sur 100 001 » alors que trente lignes
176
+ * seulement existent. Legende obligatoire (`caption`), colonne d'en-tete de ligne (la premiere
177
+ * par defaut, `enTeteDeLigne`), en-tete fige en haut de la fenetre.
178
+ * - **Tri PILOTE** : un clic sur une colonne `triable` emet `tri` (croissant, decroissant, puis non
179
+ * trie ; `triTernaire` a faux revient a croissant), porte par `aria-sort` ; le tableau ne
180
+ * reordonne JAMAIS les lignes, le serveur le fait.
181
+ * - **Selection par cle** (`selectionnable`, `[(selection)]`, `cle`) : une case par ligne, nommee
182
+ * par l'en-tete de sa ligne ; la colonne porte `libelleDeSelection`. Aucune selection globale :
183
+ * sur cent mille lignes, elle appartient au serveur. Une SEULE case dans l'ordre de tabulation
184
+ * (tabindex itinerant) : fleches haut et bas, Debut et Fin passent de case en case et amenent la
185
+ * ligne dans la fenetre ; sans cela, Tab parcourait cent mille cases et ne sortait jamais du
186
+ * tableau.
187
+ * - **Hauteur de ligne FIXE** (`hauteurDeLigne`, pixels CSS) : le calcul de la fenetre en depend ;
188
+ * le texte qui deborde se tronque dans sa cellule. Fenetre focalisable et nommee par la legende,
189
+ * qui defile aux fleches et a Page suivante ; hauteur `hauteurDeFenetre` (`24rem` par defaut).
190
+ */
191
+ export declare class StVirtualTable<T = unknown> {
192
+ readonly legende: import("@angular/core").InputSignal<string>;
193
+ readonly colonnes: import("@angular/core").InputSignal<readonly ColonneVirtuelle[]>;
194
+ readonly lignes: import("@angular/core").InputSignal<readonly T[]>;
195
+ /** La propriete qui identifie une ligne : suivi du rendu et selection. */
196
+ readonly cle: import("@angular/core").InputSignal<keyof T & string>;
197
+ /** La colonne d'en-tete de ligne (`th scope="row"`) ; la premiere par defaut. */
198
+ readonly enTeteDeLigne: import("@angular/core").InputSignal<string | null>;
199
+ readonly hauteurDeLigne: import("@angular/core").InputSignalWithTransform<number, unknown>;
200
+ /** Hauteur de la fenetre, longueur CSS : `24rem` par defaut. */
201
+ readonly hauteurDeFenetre: import("@angular/core").InputSignal<string>;
202
+ readonly tri: import("@angular/core").ModelSignal<TriVirtuel | null>;
203
+ readonly triTernaire: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
204
+ readonly selectionnable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
205
+ readonly selection: import("@angular/core").ModelSignal<readonly string[]>;
206
+ /** Le nom, lu, de la colonne des cases (« Selection »), deja traduit. */
207
+ readonly libelleDeSelection: import("@angular/core").InputSignal<string>;
208
+ private readonly cellules;
209
+ private readonly fenetre;
210
+ protected readonly identifiant: string;
211
+ /** Decalage de l'en-tete fige : la fenetre deplace son contenu, l'en-tete revient en haut. */
212
+ protected readonly decalageDeLEnTete: import("@angular/core").WritableSignal<number>;
213
+ protected readonly hauteur: import("@angular/core").Signal<number>;
214
+ /** Marges de rendu : cinq lignes au moins de part et d'autre, dix au plus (60 lignes au plus). */
215
+ protected readonly margeMin: import("@angular/core").Signal<number>;
216
+ protected readonly margeMax: import("@angular/core").Signal<number>;
217
+ protected readonly colonneEnTete: import("@angular/core").Signal<string | null>;
218
+ protected readonly gabarits: import("@angular/core").Signal<Map<string, TemplateRef<ContexteDeCelluleVirtuelle<T>>>>;
219
+ private readonly choisies;
220
+ private readonly hote;
221
+ private readonly document;
222
+ /** La case active (tabindex itinerant) et la plage des lignes rendues. */
223
+ private readonly rangActif;
224
+ private readonly plageRendue;
225
+ /** La case dans l'ordre de tabulation : l'active si elle est rendue, sinon la premiere rendue. */
226
+ protected readonly rangTabulable: import("@angular/core").Signal<number>;
227
+ protected readonly suivi: (_rang: number, ligne: T) => unknown;
228
+ constructor();
229
+ protected cleDe(ligne: T): string;
230
+ /** La valeur brute d'une cellule sans gabarit : un texte, un nombre ou un booleen ; rien d'autre. */
231
+ protected valeur(ligne: T, colonne: ColonneVirtuelle): string;
232
+ protected identifiantDeLigne(rang: number): string;
233
+ protected triDe(colonne: ColonneVirtuelle): 'ascending' | 'descending' | 'none' | null;
234
+ protected trier(colonne: ColonneVirtuelle): void;
235
+ protected estChoisie(ligne: T): boolean;
236
+ protected basculer(ligne: T): void;
237
+ /** La case devient l'active quand elle recoit le focus (clic, Tab). */
238
+ protected activer(rang: number): void;
239
+ /** Fleches haut et bas, Debut et Fin : la case voisine, ou la premiere et la derniere. */
240
+ protected naviguer(evenement: KeyboardEvent, rang: number): void;
241
+ private caseDu;
242
+ /** Focalise la case d'un rang des qu'elle est rendue (quelques images apres un defilement). */
243
+ private focaliser;
244
+ /** Amene une ligne dans la fenetre (« aller a la ligne 42 000 »). */
245
+ allerA(rang: number, comportement?: ScrollBehavior): void;
246
+ static ɵfac: i0.ɵɵFactoryDeclaration<StVirtualTable<any>, never>;
247
+ static ɵcmp: i0.ɵɵComponentDeclaration<StVirtualTable<any>, "st-virtual-table", never, {
248
+ "legende": {
249
+ "alias": "legende";
250
+ "required": true;
251
+ "isSignal": true;
252
+ };
253
+ "colonnes": {
254
+ "alias": "colonnes";
255
+ "required": true;
256
+ "isSignal": true;
257
+ };
258
+ "lignes": {
259
+ "alias": "lignes";
260
+ "required": true;
261
+ "isSignal": true;
262
+ };
263
+ "cle": {
264
+ "alias": "cle";
265
+ "required": true;
266
+ "isSignal": true;
267
+ };
268
+ "enTeteDeLigne": {
269
+ "alias": "enTeteDeLigne";
270
+ "required": false;
271
+ "isSignal": true;
272
+ };
273
+ "hauteurDeLigne": {
274
+ "alias": "hauteurDeLigne";
275
+ "required": false;
276
+ "isSignal": true;
277
+ };
278
+ "hauteurDeFenetre": {
279
+ "alias": "hauteurDeFenetre";
280
+ "required": false;
281
+ "isSignal": true;
282
+ };
283
+ "tri": {
284
+ "alias": "tri";
285
+ "required": false;
286
+ "isSignal": true;
287
+ };
288
+ "triTernaire": {
289
+ "alias": "triTernaire";
290
+ "required": false;
291
+ "isSignal": true;
292
+ };
293
+ "selectionnable": {
294
+ "alias": "selectionnable";
295
+ "required": false;
296
+ "isSignal": true;
297
+ };
298
+ "selection": {
299
+ "alias": "selection";
300
+ "required": false;
301
+ "isSignal": true;
302
+ };
303
+ "libelleDeSelection": {
304
+ "alias": "libelleDeSelection";
305
+ "required": false;
306
+ "isSignal": true;
307
+ };
308
+ }, {
309
+ "tri": "triChange";
310
+ "selection": "selectionChange";
311
+ }, ["cellules"], never, true, never>;
312
+ }
102
313
 
103
314
  export {};