feat: easter egg théière 418 + Konami obfusqué via global.js centralisé

- /418/ (et /fr|en/418) : vraie page HTTP 418 'Je suis une théière', SVG
  animé (vapeur), boutons café (refus RFC 2324) / thé (toast), noindex.
- Nouveau public/js/global.js chargé sur toutes les pages (statiques,
  dynamiques articles/blog, page d'erreur) qui :
  * écoute le code Konami ↑↑↓↓←→←→BA → redirige vers /418/ ;
  * charge ses clés par codes de caractères (aucune chaîne révélatrice en
    clair : ni 'ArrowUp', ni '/418/', ni 'b/a' dans la source) ;
  * sert de dispatcher centralisé : injecte par page (components/discord/
    zfprobe) via <body data-page=...> ou règles de chemin, sans doublon.
- easter.js supprimé au profit de global.js unique sur 22 pages statiques.
This commit is contained in:
riricdev 2026-09-07 15:16:20 +02:00
commit 1482c6aaf0
24 changed files with 217 additions and 0 deletions

View file

@ -47,6 +47,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -47,6 +47,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -121,6 +121,7 @@
<link rel="me" href="https://piaille.fr/@zektyc" />
<link rel="stylesheet" href="/css/style.css?v=8" />
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
<script src="/js/i18n.js?v=3" defer></script>
<script src="/js/discord.js?v=1" defer></script>

View file

@ -57,6 +57,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -57,6 +57,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -10,6 +10,7 @@
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="stylesheet" href="/css/style.css?v=8" />
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/i18n.js" defer></script>
<script>document.addEventListener("click",function(e){var t=e.target.closest?e.target.closest(".site-nav"):null;if(t){var n=document.getElementById("nav-toggle");if(n)n.checked=false}})</script>
<style>

View file

@ -161,6 +161,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
<script src="/js/zfprobe.js?v=15" defer></script>
</body>

View file

@ -159,6 +159,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
<script src="/js/zfprobe.js?v=15" defer></script>
</body>

View file

@ -124,6 +124,7 @@
<script src="/js/components.js?v=6" defer></script>
<script src="/js/i18n.js?v=3" defer></script>
<script src="/js/discord.js?v=1" defer></script>
<script src="/js/global.js?v=1" defer></script>
</head>
<body>
<header id="h"></header>

81
public/js/global.js Normal file
View file

@ -0,0 +1,81 @@
(function (w, d) {
"use strict";
function dc() {
var a = [].slice.call(arguments), o = "";
for (var i = 0; i < a.length; i++) o += String.fromCharCode(a[i]);
return o;
}
function bt() {
var p = dc(65, 114, 114, 111, 119);
var u = p + dc(85, 112);
var dn = p + dc(68, 111, 119, 110);
var lf = p + dc(76, 101, 102, 116);
var rt = p + dc(82, 105, 103, 104, 116);
var b = String.fromCharCode(98);
var A = String.fromCharCode(97);
return [u, u, dn, dn, lf, rt, lf, rt, b, A];
}
var _s = null;
function seq() { if (!_s) _s = bt(); return _s; }
var dst = dc(47, 52, 49, 56, 47);
var idx = 0, timer = null;
function reset() { idx = 0; if (timer) { clearTimeout(timer); timer = null; } }
function notField(t) {
if (!t) return false;
var g = (t.tagName || "").toUpperCase();
return g === "INPUT" || g === "TEXTAREA" || g === "SELECT" || t.isContentEditable;
}
w.addEventListener("keydown", function (e) {
if (notField(e.target)) return;
if (e.ctrlKey || e.metaKey || e.altKey) { reset(); return; }
var k = e.key;
if (k && k.length === 1) k = k.toLowerCase();
var s = seq();
if (k === s[idx]) {
idx++;
if (timer) clearTimeout(timer);
timer = setTimeout(reset, 4000);
if (idx === s.length) {
reset();
var a = d.createElement("a");
a.href = encodeURI(dst);
a.rel = "noreferrer";
w.location.assign(a.href);
}
} else reset();
});
var pathname = w.location.pathname || "/";
function isHome() {
return pathname === "/" || pathname === "/index.html"
|| pathname === "/fr/" || pathname === "/fr/index.html"
|| pathname === "/en/" || pathname === "/en/index.html";
}
function isFp() { return pathname.indexOf(dc(102, 105, 110, 103, 101, 114, 112, 114, 105, 110, 116)) !== -1; }
function shouldLoad(name) {
var at = (d.body && d.body.getAttribute("data-page")) || "";
if (at === name) return true;
var rules = { discord: isHome(), zfprobe: isFp(), components: true };
return !!rules[name];
}
function loadScript(name) {
if (!shouldLoad(name)) return;
var needle = "/js/" + name + ".js";
if (d.querySelector('script[src*="' + needle + '"]')) return;
var s = d.createElement("script");
s.src = needle + dc(63, 118, 61, 49);
s.defer = true;
d.head.appendChild(s);
}
(function () {
var want = ["components", "discord", "zfprobe"];
for (var i = 0; i < want.length; i++) loadScript(want[i]);
})();
})(window, document);

View file

@ -210,6 +210,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -210,6 +210,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -73,6 +73,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -73,6 +73,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -236,6 +236,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -236,6 +236,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -61,6 +61,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -106,6 +106,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -106,6 +106,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -121,6 +121,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -127,6 +127,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -202,6 +202,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>

View file

@ -210,6 +210,7 @@
<footer id="f"></footer>
<script src="/js/theme.js" defer></script>
<script src="/js/global.js?v=1" defer></script>
<script src="/js/components.js?v=6" defer></script>
</body>
</html>