@zevra/ui 0.33.0 → 0.35.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.
@@ -45,3 +45,13 @@ export const ACCROCHES_PRODUITS: Record<GlypheId, string> = {
45
45
  'supernovia': "Contenu sourcé",
46
46
  'zevra': "La suite",
47
47
  }
48
+
49
+ /** L'adresse des produits EN LIGNE. Partielle À DESSEIN : un produit qui n'a
50
+ * rien à ouvrir n'entre pas dans le lanceur. */
51
+ export const ADRESSES_PRODUITS: Partial<Record<GlypheId, string>> = {
52
+ 'campus': "https://campus.zevra.tech/",
53
+ 'lexform': "https://lexform.zevra.tech/",
54
+ 'mcp': "https://mcp.zevra.tech/",
55
+ 'memoire': "https://memoire.zevra.tech/",
56
+ 'zevra': "https://zevra.tech/",
57
+ }
package/react/glyphes.ts CHANGED
@@ -16,6 +16,7 @@
16
16
 
17
17
  import {
18
18
  ACCROCHES_PRODUITS,
19
+ ADRESSES_PRODUITS,
19
20
  GLYPHES,
20
21
  MOT_ZEVRA,
21
22
  NOMS_PRODUITS,
@@ -23,7 +24,21 @@ import {
23
24
  } from './glyph-data.js'
24
25
 
25
26
  export type { GlypheId }
26
- export { ACCROCHES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS }
27
+ export { ACCROCHES_PRODUITS, ADRESSES_PRODUITS, GLYPHES, MOT_ZEVRA, NOMS_PRODUITS }
27
28
 
28
29
  /** Les sept identifiants, triés. */
29
30
  export const PRODUITS = Object.keys(GLYPHES) as GlypheId[]
31
+
32
+ /**
33
+ * Les produits À METTRE DANS LE LANCEUR — ceux qui ont une adresse.
34
+ *
35
+ * ⚠️ CE N'EST PAS `PRODUITS`, et l'écart est le sujet. Plume et Supernovia
36
+ * ont leur glyphe depuis le 26/08 et rien à ouvrir : une tuile qui mène à
37
+ * rien est pire qu'une absence — elle promet un produit, le visiteur clique,
38
+ * et il tombe. Le lanceur se construit sur CETTE liste.
39
+ *
40
+ * Elle se déduit du registre, elle n'est pas recopiée : le jour où Plume
41
+ * ouvre, une ligne dans `logos/index.json` la fait apparaître dans les sept
42
+ * apps sans qu'aucune ne soit touchée.
43
+ */
44
+ export const APPS = PRODUITS.filter((id) => ADRESSES_PRODUITS[id])
@@ -1199,6 +1199,19 @@ a.zv-menu__item:hover {
1199
1199
  padding: 6px 8px 10px;
1200
1200
  }
1201
1201
 
1202
+ /* ⚠️ CINQ tuiles — le compte du jour, depuis que le lanceur ne liste que les
1203
+ * produits joignables. Dans quatre colonnes, elles donnent 4 + 1 : une
1204
+ * dernière rangée d'UNE tuile avec trois cases vides à sa droite, exactement
1205
+ * ce que le passage à quatre colonnes avait servi à supprimer pour sept.
1206
+ *
1207
+ * La règle ne vise QUE ce compte, et se désarme d'elle-même : à six on
1208
+ * retombe sur 4 + 2, à sept sur 4 + 3, et la grille reprend ses quatre
1209
+ * colonnes sans que personne y touche. Le jour où Plume ouvre, il n'y a rien
1210
+ * à corriger ici. */
1211
+ .zv-lanceur__apps:has(> :nth-child(5):last-child) {
1212
+ grid-template-columns: repeat(3, 104px);
1213
+ }
1214
+
1202
1215
  .zv-lanceur__app {
1203
1216
  display: flex;
1204
1217
  flex-direction: column;
@@ -1346,9 +1359,40 @@ a.zv-menu__item:hover {
1346
1359
  display: none;
1347
1360
  }
1348
1361
 
1349
- /* Les deux panneaux sont plafonnés à l'écran, comme le menu et le
1350
- * popover : au bord droit d'un téléphone, un panneau de 300px pousserait
1351
- * la page en défilement horizontal. */
1362
+ /* ⚠️ ANCRÉS À L'ÉCRAN, plus à leur déclencheur. Hors média ils sont en
1363
+ * `right: 0`, donc calés sur le bord droit du BOUTON — or le lanceur n'est
1364
+ * pas au bord de l'écran : le compte et le burger le suivent. Le panneau
1365
+ * avait donc la bonne largeur et la mauvaise place. Mesuré à 375px sur
1366
+ * mcp-factory : largeur 343, bord gauche à −65 ; deux tuiles sur cinq
1367
+ * coupées, et la partie hors écran inatteignable.
1368
+ *
1369
+ * Et c'est SILENCIEUX : un débordement par la gauche n'engendre aucun
1370
+ * défilement horizontal, le navigateur le rogne sans rien dire.
1371
+ *
1372
+ * COMMENT : le déclencheur cesse d'être le repère (`position: static`), et
1373
+ * le panneau se résout alors contre `.zv-nav`, qui est déjà positionnée et
1374
+ * qui fait la largeur de la barre. `top: 100%` tombe donc sous la barre, et
1375
+ * `left`/`right` la bordent. Largeur pleine, marges de 16 : le motif que
1376
+ * tout le monde connaît sur téléphone, et qui ne dépend plus de ce qui est
1377
+ * posé à droite du déclencheur.
1378
+ *
1379
+ * ⚠️ Poser `left`/`right` SANS neutraliser le `relative` du déclencheur ne
1380
+ * marche pas — je l'ai écrit ainsi d'abord : les offsets se résolvaient
1381
+ * contre le bouton, large de 40px, et le panneau tombait à 8px de large.
1382
+ * C'est scopé à `.zv-nav` : un lanceur posé ailleurs garde son ancrage. */
1383
+ .zv-nav .zv-lanceur,
1384
+ .zv-nav .zv-compte {
1385
+ position: static;
1386
+ }
1387
+
1388
+ .zv-nav .zv-lanceur__panneau,
1389
+ .zv-nav .zv-compte__panneau {
1390
+ left: 16px;
1391
+ right: 16px;
1392
+ }
1393
+
1394
+ /* Le plafond devient redondant pour ces deux-là — il ne coûte rien et
1395
+ * protège un panneau qu'on poserait ailleurs. */
1352
1396
  .zv-lanceur__panneau .zv-menu,
1353
1397
  .zv-compte__panneau .zv-menu {
1354
1398
  max-width: calc(100vw - 32px);