discovery-media-player 0.1.74 → 0.1.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discovery-media-player",
3
- "version": "0.1.74",
3
+ "version": "0.1.75",
4
4
  "description": "Self-hosted document viewer: per-recipient tracked links, reading analytics, live presentation. The core knows nothing about the application hosting it — everything it borrows arrives through an injected context.",
5
5
  "keywords": [
6
6
  "pdf-viewer",
@@ -0,0 +1,45 @@
1
+ // EXTRAIT DE handler.js (refactor lot 2, 19/08/2026) — texte déplacé À L'IDENTIQUE. Reste à
2
+ // PLAT dans server/ (les gardes de forge ciblent server/*.js).
3
+ const { esc } = require("./texte");
4
+
5
+ let PLAYER = null;
6
+ const init = (ctx) => { PLAYER = ctx; };
7
+
8
+ // ⚠️ UNE MENTION DONT L'OBJET EST D'ÊTRE EXACTE NE DOIT PAS INVENTER UN EXPÉDITEUR.
9
+ //
10
+ // Le texte par défaut disait « transmise à son expéditeur ». Vrai pour un lien nominatif, faux
11
+ // pour un lien que PERSONNE n'a envoyé — la plaquette publique d'un programme, ouverte depuis une
12
+ // carte par un visiteur qui n'a reçu aucun message. Le défaut est antérieur au mode serveur à
13
+ // serveur ; c'est lui qui l'a rendu visible, puisqu'il crée précisément des liens sans
14
+ // destinataire NI créateur.
15
+ //
16
+ // La distinction ne demande aucune donnée nouvelle : c'est déjà la clé d'idempotence de ces
17
+ // liens-là. Signalé par le second hôte en regardant son propre écran — ce qu'aucun test ne fait.
18
+ function legalFooter({ tracked, sansExpediteur }) {
19
+ const L = PLAYER.legal;
20
+ const liens = [
21
+ L.legalUrl ? `<a href="${esc(L.legalUrl)}" target=_blank rel=noreferrer>Mentions légales</a>` : "",
22
+ L.privacyUrl ? `<a href="${esc(L.privacyUrl)}" target=_blank rel=noreferrer>Confidentialité</a>` : "",
23
+ // Obligation AGPL : l'accès au source se propose à qui UTILISE le logiciel, pas seulement à qui le distribue.
24
+ L.sourceUrl ? `<a href="${esc(L.sourceUrl)}" target=_blank rel=noreferrer>Code source</a>` : "",
25
+ ].filter(Boolean).join("<span class=lgl-sep>·</span>");
26
+ // Un contexte qui ne fournit pas le second texte retombe sur le premier : rien ne casse chez un
27
+ // hôte qui n'a pas encore de liens sans expéditeur.
28
+ const texte = sansExpediteur ? (L.trackingNoticeAnonymous || L.trackingNotice) : L.trackingNotice;
29
+ const mesure = tracked ? `<span class=lgl-note>${esc(texte)}</span>` : "";
30
+ if (!liens && !mesure) return "";
31
+ return `<div class=lgl>${mesure}${liens ? `<span class=lgl-links>${liens}</span>` : ""}</div>`;
32
+ }
33
+
34
+ const LEGAL_CSS = `
35
+ .lgl{position:fixed;left:0;right:0;bottom:0;z-index:5;display:flex;flex-wrap:wrap;gap:4px 10px;
36
+ align-items:center;justify-content:center;padding:5px 12px;font-size:10.5px;line-height:1.35;
37
+ color:rgba(255,255,255,.94);background:rgba(0,0,0,.66);backdrop-filter:blur(3px);pointer-events:none}
38
+ .lgl a{color:inherit;text-decoration:underline;text-underline-offset:2px;pointer-events:auto}
39
+ .lgl a:hover{color:#fff}
40
+ .lgl-sep{margin:0 6px;opacity:.8}
41
+ .lgl-note{opacity:1}
42
+ @media (max-width:640px){ .lgl{font-size:10px;padding:4px 10px} }
43
+ `;
44
+
45
+ module.exports = { init, legalFooter, LEGAL_CSS };