@zevra/ui 0.32.0 → 0.34.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.
@@ -1 +1 @@
1
- {"version":3,"file":"css-inline.js","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAE1E;;;iEAGiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAW,22tRAA22tR,CAAA;AAE94tR;;;yBAGyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAW,03BAA03B,CAAA"}
1
+ {"version":3,"file":"css-inline.js","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAE1E;;;iEAGiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAW,+/uRAA+/uR,CAAA;AAElivR;;;yBAGyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAW,03BAA03B,CAAA"}
@@ -7,4 +7,7 @@ export declare const MOT_ZEVRA = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0
7
7
  export declare const NOMS_PRODUITS: Record<GlypheId, string>;
8
8
  /** Ce que chaque produit FAIT, en deux mots — pour le lanceur d'apps. */
9
9
  export declare const ACCROCHES_PRODUITS: Record<GlypheId, string>;
10
+ /** L'adresse des produits EN LIGNE. Partielle À DESSEIN : un produit qui n'a
11
+ * rien à ouvrir n'entre pas dans le lanceur. */
12
+ export declare const ADRESSES_PRODUITS: Partial<Record<GlypheId, string>>;
10
13
  //# sourceMappingURL=glyph-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"glyph-data.d.ts","sourceRoot":"","sources":["../react/glyph-data.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,SAAS,GACT,KAAK,GACL,SAAS,GACT,OAAO,GACP,YAAY,GACZ,OAAO,CAAA;AAEX,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQ5C,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,SAAS,mgLAAmgL,CAAA;AAEzhL,iEAAiE;AACjE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQlD,CAAA;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQvD,CAAA"}
1
+ {"version":3,"file":"glyph-data.d.ts","sourceRoot":"","sources":["../react/glyph-data.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,SAAS,GACT,KAAK,GACL,SAAS,GACT,OAAO,GACP,YAAY,GACZ,OAAO,CAAA;AAEX,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQ5C,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,SAAS,mgLAAmgL,CAAA;AAEzhL,iEAAiE;AACjE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQlD,CAAA;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAQvD,CAAA;AAED;iDACiD;AACjD,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAM/D,CAAA"}
@@ -32,4 +32,13 @@ export const ACCROCHES_PRODUITS = {
32
32
  'supernovia': "Contenu sourcé",
33
33
  'zevra': "La suite",
34
34
  };
35
+ /** L'adresse des produits EN LIGNE. Partielle À DESSEIN : un produit qui n'a
36
+ * rien à ouvrir n'entre pas dans le lanceur. */
37
+ export const ADRESSES_PRODUITS = {
38
+ 'campus': "https://campus.zevra.tech/",
39
+ 'lexform': "https://lexform.zevra.tech/",
40
+ 'mcp': "https://mcp.zevra.tech/",
41
+ 'memoire': "https://memoire.zevra.tech/",
42
+ 'zevra': "https://zevra.tech/",
43
+ };
35
44
  //# sourceMappingURL=glyph-data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"glyph-data.js","sourceRoot":"","sources":["../react/glyph-data.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sEAAsE;AAWtE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,OAAO,GAA6B;IAC/C,QAAQ,EAAE,w/XAAw/X;IAClgY,SAAS,EAAE,wjRAAwjR;IACnkR,KAAK,EAAE,4jZAA4jZ;IACnkZ,SAAS,EAAE,40OAA40O;IACv1O,OAAO,EAAE,omYAAomY;IAC7mY,YAAY,EAAE,w1cAAw1c;IACt2c,OAAO,EAAE,40ZAA40Z;CACt1Z,CAAA;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,ggLAAggL,CAAA;AAEzhL,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,eAAe;IACtB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,YAAY;IAC1B,OAAO,EAAE,OAAO;CACjB,CAAA;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IAC1D,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,eAAe;IAC1B,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,gBAAgB;IAC9B,OAAO,EAAE,UAAU;CACpB,CAAA"}
1
+ {"version":3,"file":"glyph-data.js","sourceRoot":"","sources":["../react/glyph-data.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sEAAsE;AAWtE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,OAAO,GAA6B;IAC/C,QAAQ,EAAE,w/XAAw/X;IAClgY,SAAS,EAAE,wjRAAwjR;IACnkR,KAAK,EAAE,4jZAA4jZ;IACnkZ,SAAS,EAAE,40OAA40O;IACv1O,OAAO,EAAE,omYAAomY;IAC7mY,YAAY,EAAE,w1cAAw1c;IACt2c,OAAO,EAAE,40ZAA40Z;CACt1Z,CAAA;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,ggLAAggL,CAAA;AAEzhL,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,eAAe;IACtB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,YAAY;IAC1B,OAAO,EAAE,OAAO;CACjB,CAAA;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IAC1D,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,eAAe;IAC1B,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,gBAAgB;IAC9B,OAAO,EAAE,UAAU;CACpB,CAAA;AAED;iDACiD;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAsC;IAClE,QAAQ,EAAE,4BAA4B;IACtC,SAAS,EAAE,6BAA6B;IACxC,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,6BAA6B;IACxC,OAAO,EAAE,qBAAqB;CAC/B,CAAA"}
package/dist/glyphes.d.ts CHANGED
@@ -1,6 +1,19 @@
1
- import { ACCROCHES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS, type GlypheId } from './glyph-data.js';
1
+ import { ACCROCHES_PRODUITS, ADRESSES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS, type GlypheId } from './glyph-data.js';
2
2
  export type { GlypheId };
3
- export { ACCROCHES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS };
3
+ export { ACCROCHES_PRODUITS, ADRESSES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS };
4
4
  /** Les sept identifiants, triés. */
5
5
  export declare const PRODUITS: GlypheId[];
6
+ /**
7
+ * Les produits À METTRE DANS LE LANCEUR — ceux qui ont une adresse.
8
+ *
9
+ * ⚠️ CE N'EST PAS `PRODUITS`, et l'écart est le sujet. Plume et Supernovia
10
+ * ont leur glyphe depuis le 26/08 et rien à ouvrir : une tuile qui mène à
11
+ * rien est pire qu'une absence — elle promet un produit, le visiteur clique,
12
+ * et il tombe. Le lanceur se construit sur CETTE liste.
13
+ *
14
+ * Elle se déduit du registre, elle n'est pas recopiée : le jour où Plume
15
+ * ouvre, une ligne dans `logos/index.json` la fait apparaître dans les sept
16
+ * apps sans qu'aucune ne soit touchée.
17
+ */
18
+ export declare const APPS: GlypheId[];
6
19
  //# sourceMappingURL=glyphes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"glyphes.d.ts","sourceRoot":"","sources":["../react/glyphes.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,aAAa,EACb,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,QAAQ,EAAE,CAAA;AACxB,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAEhE,oCAAoC;AACpC,eAAO,MAAM,QAAQ,EAA2B,QAAQ,EAAE,CAAA"}
1
+ {"version":3,"file":"glyphes.d.ts","sourceRoot":"","sources":["../react/glyphes.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,aAAa,EACb,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,QAAQ,EAAE,CAAA;AACxB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAEnF,oCAAoC;AACpC,eAAO,MAAM,QAAQ,EAA2B,QAAQ,EAAE,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,YAAiD,CAAA"}
package/dist/glyphes.js CHANGED
@@ -13,8 +13,21 @@
13
13
  // charte l'interdit. Sous 24 px, la charte demande une version monochrome :
14
14
  // elle n'existe pas encore (retirée le 24/08, à regénérer), et ces glyphes
15
15
  // ne doivent donc pas descendre sous cette taille.
16
- import { ACCROCHES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS, } from './glyph-data.js';
17
- export { ACCROCHES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS };
16
+ import { ACCROCHES_PRODUITS, ADRESSES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS, } from './glyph-data.js';
17
+ export { ACCROCHES_PRODUITS, ADRESSES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS };
18
18
  /** Les sept identifiants, triés. */
19
19
  export const PRODUITS = Object.keys(GLYPHES);
20
+ /**
21
+ * Les produits À METTRE DANS LE LANCEUR — ceux qui ont une adresse.
22
+ *
23
+ * ⚠️ CE N'EST PAS `PRODUITS`, et l'écart est le sujet. Plume et Supernovia
24
+ * ont leur glyphe depuis le 26/08 et rien à ouvrir : une tuile qui mène à
25
+ * rien est pire qu'une absence — elle promet un produit, le visiteur clique,
26
+ * et il tombe. Le lanceur se construit sur CETTE liste.
27
+ *
28
+ * Elle se déduit du registre, elle n'est pas recopiée : le jour où Plume
29
+ * ouvre, une ligne dans `logos/index.json` la fait apparaître dans les sept
30
+ * apps sans qu'aucune ne soit touchée.
31
+ */
32
+ export const APPS = PRODUITS.filter((id) => ADRESSES_PRODUITS[id]);
20
33
  //# sourceMappingURL=glyphes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"glyphes.js","sourceRoot":"","sources":["../react/glyphes.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,uCAAuC;AACvC,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,mDAAmD;AAEnD,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,aAAa,GAEd,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAEhE,oCAAoC;AACpC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAe,CAAA"}
1
+ {"version":3,"file":"glyphes.js","sourceRoot":"","sources":["../react/glyphes.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,uCAAuC;AACvC,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,mDAAmD;AAEnD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,aAAa,GAEd,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAEnF,oCAAoC;AACpC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAe,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAA"}
package/logos/index.json CHANGED
@@ -18,6 +18,13 @@
18
18
  "plume": "Éditeur",
19
19
  "supernovia": "Contenu sourcé"
20
20
  },
21
+ "adresses": {
22
+ "zevra": "https://zevra.tech/",
23
+ "campus": "https://campus.zevra.tech/",
24
+ "lexform": "https://lexform.zevra.tech/",
25
+ "mcp": "https://mcp.zevra.tech/",
26
+ "memoire": "https://memoire.zevra.tech/"
27
+ },
21
28
  "formes": {
22
29
  "glyph": "Glyphe",
23
30
  "lockup": "Lockup",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zevra/ui",
3
- "version": "0.32.0",
3
+ "version": "0.34.0",
4
4
  "description": "Design system Zevra « Encre & Papier » — tokens, CSS des composants et logos officiels.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -39,7 +39,9 @@ import {
39
39
  import { ICONES, Icon, IconButton, IconTile, NOMS_ICONES } from './icon.js'
40
40
  // Les glyphes sont INLINÉS (data-URI) : le catalogue est rendu hors du dépôt
41
41
  // — planche, kit de canvas, page d'admin — où un chemin d'image ne résout pas.
42
- import { ACCROCHES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS, PRODUITS } from './glyphes.js'
42
+ import {
43
+ ACCROCHES_PRODUITS, ADRESSES_PRODUITS, APPS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS,
44
+ } from './glyphes.js'
43
45
  import {
44
46
  Banner, CTA, Carousel, CarouselItem, Col, Compte, CompteLien, Footer,
45
47
  FooterMini, Grid, Grid12, Lanceur, LanceurApp, LanceurApps, LanceurGroupe, NavActions,
@@ -343,7 +345,6 @@ function DemoPopover() {
343
345
  * du CSS, il n'y a rien à hydrater. La réserve sous chaque barre existe pour
344
346
  * que le panneau ait la place de s'ouvrir sans être coupé. */
345
347
  function DemoNav() {
346
- const APPS = PRODUITS
347
348
  const barre = (utilisateur?: { nom: string; email: string }) => (
348
349
  <div style={{ border: '1px solid var(--hairline)', background: 'var(--white)' }}>
349
350
  <Nav className="zv-nav--riche" style={{ padding: '0 20px', minHeight: 64 }}>
@@ -394,7 +395,7 @@ function DemoNav() {
394
395
  {APPS.map((id) => (
395
396
  <LanceurApp
396
397
  key={id}
397
- href="#"
398
+ href={ADRESSES_PRODUITS[id]}
398
399
  nom={NOMS_PRODUITS[id]}
399
400
  accroche={ACCROCHES_PRODUITS[id]}
400
401
  glyphe={GLYPHES[id]}
@@ -1028,10 +1029,12 @@ export const CATALOGUE: GroupeCatalogue[] = [
1028
1029
  id: 'page-erreur',
1029
1030
  nom: 'Page d’erreur',
1030
1031
  resume:
1031
- '404, 403, 410, 500. ⚠️ Le composant ne porte AUCUN texte : une plaisanterie câblée dans un design system part dans les sept apps, dans une seule langue, et n’en revient jamais. La copie ci-dessous est la RÉFÉRENCE, à copier et à adapter. Elle plaisante en vocabulaire juridique — un mot juste employé de travers, pas une blague sur un ton qu’Encre & Papier n’a pas — et l’ordre est fixe : le titre dit la panne en clair, l’esprit vient ensuite et se dédit lui-même. Une page d’erreur qui fait rire avant d’informer est ratée.',
1032
+ '404, 403, 410, 500. ⚠️ Le glyphe est DÉCORATIF par défaut (glypheAlt=""), et le mot « Erreur » se passe en prop : la 0.32.0 posait alt="Zevra" et « Erreur » en dur, si bien que la 404 de Mémoire annonçait « Zevra » au lecteur d’écran et affichait « Erreur 404 » sous /en/. Le composant ne porte AUCUN texte : une plaisanterie câblée dans un design system part dans les sept apps, dans une seule langue, et n’en revient jamais. La copie ci-dessous est la RÉFÉRENCE, à copier et à adapter. Elle plaisante en vocabulaire juridique — un mot juste employé de travers, pas une blague sur un ton qu’Encre & Papier n’a pas — et l’ordre est fixe : le titre dit la panne en clair, l’esprit vient ensuite et se dédit lui-même. Une page d’erreur qui fait rire avant d’informer est ratée.',
1032
1033
  code: `<PageErreur
1033
1034
  code="404"
1034
- glyphe={GLYPHES.zevra}
1035
+ libelle="Erreur" {/* le mot est À VOUS : « Error » sous /en/ */}
1036
+ glyphe={GLYPHES.memoire} {/* le glyphe de VOTRE produit */}
1037
+ glypheAlt="" {/* vide = décoratif, et c'est le bon défaut */}
1035
1038
  titre="Page introuvable"
1036
1039
  reference={<>Réf. 404 · GET /dossier/2019</>}
1037
1040
  actions={<>
@@ -1046,6 +1049,7 @@ export const CATALOGUE: GroupeCatalogue[] = [
1046
1049
  rendu: (
1047
1050
  <PageErreur
1048
1051
  code="404"
1052
+ libelle="Erreur"
1049
1053
  glyphe={GLYPHES.zevra}
1050
1054
  titre="Page introuvable"
1051
1055
  reference={<>Réf. 404 · GET /dossier/2019</>}
@@ -2128,11 +2132,18 @@ export const CATALOGUE: GroupeCatalogue[] = [
2128
2132
 
2129
2133
  {/* RESTE à toutes les largeurs */}
2130
2134
  <NavActions>
2135
+ {/* APPS = les produits QUI ONT UNE ADRESSE, pas les sept glyphes :
2136
+ une tuile qui mène à rien promet un produit et fait tomber le
2137
+ visiteur. Plume et Supernovia y entreront le jour où ils ouvrent,
2138
+ par une ligne dans logos/index.json — sans toucher aux apps. */}
2131
2139
  <Lanceur> {/* titre="Applications" par défaut, filet de spectre */}
2132
2140
  <LanceurGroupe>Suite Zevra</LanceurGroupe>
2133
2141
  <LanceurApps>
2134
- <LanceurApp href="…" nom="Mémoire" accroche="Recherche IA"
2135
- glyphe={GLYPHES.memoire} />
2142
+ {APPS.map((id) => (
2143
+ <LanceurApp key={id} href={ADRESSES_PRODUITS[id]}
2144
+ nom={NOMS_PRODUITS[id]} accroche={ACCROCHES_PRODUITS[id]}
2145
+ glyphe={GLYPHES[id]} courant={id === 'memoire'} />
2146
+ ))}
2136
2147
  </LanceurApps>
2137
2148
  </Lanceur>
2138
2149
  <Compte utilisateur={utilisateur /* absent = visiteur */}>
package/react/content.tsx CHANGED
@@ -732,10 +732,28 @@ export function LegalPage({
732
732
  export interface PageErreurProps extends Div {
733
733
  /** Le code, tel qu'il s'affiche dans le kicker (`404`, `403`, `500`). */
734
734
  code: string
735
- /** L'URL du glyphe Zevra — `GLYPHES.zevra` de `@zevra/ui/glyphes`. Sur une
735
+ /** Le mot qui précède le code (« Erreur », « Error », « Error »). Absent,
736
+ * seul le code s'affiche.
737
+ *
738
+ * ⚠️ EN PROP, et pas en dur : une 404 anglaise de Mémoire affichait
739
+ * « Erreur 404 ». Le composant est censé ne porter aucun texte — c'est
740
+ * écrit dans son arbitrage —, et il en portait quand même. */
741
+ libelle?: string
742
+ /** L'URL du glyphe — `GLYPHES.memoire` de `@zevra/ui/glyphes`. Sur une
736
743
  * page qui n'a plus de contenu, c'est le seul repère qui dise encore où
737
744
  * l'on se trouve. */
738
745
  glyphe?: string
746
+ /** Le texte alternatif du glyphe. VIDE par défaut, donc décoratif : sur
747
+ * une page d'erreur, la marque n'apporte rien que le titre et le kicker
748
+ * ne disent déjà, et l'annoncer place un nom de produit devant
749
+ * l'information que le lecteur est venu chercher.
750
+ *
751
+ * ⚠️ Il valait `"Zevra"` en dur jusqu'à la 0.33.0 : sur la 404 de
752
+ * Mémoire, un lecteur d'écran annonçait « Zevra » devant le M de Mémoire,
753
+ * et aucune prop ne permettait de le corriger. Une valeur qu'une app aura
754
+ * légitimement besoin d'ajuster ne se pose pas en dur — c'est la règle du
755
+ * dépôt, et celle-ci l'enfreignait. */
756
+ glypheAlt?: string
739
757
  /** Le titre. ⚠️ Il dit la panne EN CLAIR : « Page introuvable », pas un
740
758
  * jeu de mots. L'esprit vient dans le texte, jamais avant l'information. */
741
759
  titre: ReactNode
@@ -761,7 +779,9 @@ export interface PageErreurProps extends Div {
761
779
  */
762
780
  export function PageErreur({
763
781
  code,
782
+ libelle,
764
783
  glyphe,
784
+ glypheAlt = '',
765
785
  titre,
766
786
  actions,
767
787
  reference,
@@ -771,10 +791,10 @@ export function PageErreur({
771
791
  }: PageErreurProps) {
772
792
  return (
773
793
  <div className={cx('zv-errpage', className)} {...reste}>
774
- {glyphe && <img src={glyphe} alt="Zevra" className="zv-errpage__glyphe" />}
794
+ {glyphe && <img src={glyphe} alt={glypheAlt} className="zv-errpage__glyphe" />}
775
795
  <p className="zv-errpage__kicker">
776
796
  <span className="zv-spec" aria-hidden="true" />
777
- <span className="zv-mono zv-mono--label">Erreur {code}</span>
797
+ <span className="zv-mono zv-mono--label">{libelle ? `${libelle} ${code}` : code}</span>
778
798
  </p>
779
799
  <h1 className="zv-errpage__titre">{titre}</h1>
780
800
  {children && <p className="zv-errpage__texte">{children}</p>}