Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
119 lines (106 loc) · 4.39 KB
/
Copy pathscript.js
File metadata and controls
119 lines (106 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Menu de navigation mobile : bascule accessible, fermeture après sélection ou avec Échap.
(function () {
var toggle = document.querySelector('.nav-toggle');
var nav = document.getElementById('navigation');
if (!toggle || !nav) return;
function setOpen(open) {
nav.classList.toggle('is-open', open);
toggle.setAttribute('aria-expanded', String(open));
}
toggle.addEventListener('click', function () {
setOpen(!nav.classList.contains('is-open'));
});
nav.addEventListener('click', function (event) {
if (event.target.closest('a')) setOpen(false);
});
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape' && nav.classList.contains('is-open')) {
setOpen(false);
toggle.focus();
}
});
})();
// Compte à rebours vers une échéance réglementaire (data-countdown="AAAA-MM-JJ").
// Sans JavaScript, la date reste affichée telle quelle.
(function () {
var DAY = 86400000;
var en = document.documentElement.lang === 'en';
document.querySelectorAll('[data-countdown]').forEach(function (el) {
var parts = el.getAttribute('data-countdown').split('-').map(Number);
var target = Date.UTC(parts[0], parts[1] - 1, parts[2]);
var now = new Date();
var today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());
var days = Math.round((target - today) / DAY);
if (days > 0) {
el.textContent = 'J-' + days;
el.setAttribute('title', (en ? 'Deadline: ' : 'Échéance : ') + new Date(target).toLocaleDateString(en ? 'en-GB' : 'fr-FR', { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' }));
} else {
el.textContent = en ? 'In force' : 'En vigueur';
}
});
})();
// Partage : partage natif (mobile), copie du message ou du lien, choix de l'instance Mastodon.
(function () {
function flash(button) {
var label = button.innerHTML;
button.classList.add('is-done');
button.textContent = button.getAttribute('data-copied') || '✓';
setTimeout(function () {
button.innerHTML = label;
button.classList.remove('is-done');
}, 2000);
}
function copy(text, button) {
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(text).then(function () { flash(button); });
}
}
document.querySelectorAll('[data-copy-target]').forEach(function (button) {
button.addEventListener('click', function () {
var source = document.getElementById(button.getAttribute('data-copy-target'));
if (source) copy(source.textContent.trim(), button);
});
});
document.querySelectorAll('[data-copy-text]').forEach(function (button) {
button.addEventListener('click', function () {
copy(button.getAttribute('data-copy-text'), button);
});
});
// Le partage natif n'a de sens que sur mobile (feuille de partage du système) ; sur ordinateur, les liens directs suffisent.
if (navigator.share && window.matchMedia('(pointer: coarse)').matches) {
document.querySelectorAll('.share-native').forEach(function (button) {
button.hidden = false;
button.addEventListener('click', function () {
navigator.share({
title: button.getAttribute('data-share-title'),
text: button.getAttribute('data-share-text'),
url: button.getAttribute('data-share-url')
}).catch(function () {});
});
});
}
var STORAGE_KEY = 'otspi-mastodon-instance';
document.querySelectorAll('[data-mastodon]').forEach(function (button) {
var form = document.getElementById(button.getAttribute('aria-controls'));
if (!form) return;
var input = form.querySelector('input');
try { input.value = localStorage.getItem(STORAGE_KEY) || ''; } catch (e) {}
button.addEventListener('click', function () {
var open = form.hidden;
form.hidden = !open;
button.setAttribute('aria-expanded', String(open));
if (open) input.focus();
});
form.addEventListener('submit', function (event) {
event.preventDefault();
var instance = input.value.trim().replace(/^https?:\/\//, '').replace(/[\/@].*$/, '');
if (!/^[a-z0-9.-]+\.[a-z]{2,}$/i.test(instance)) {
input.focus();
return;
}
try { localStorage.setItem(STORAGE_KEY, instance); } catch (e) {}
var text = encodeURIComponent(button.getAttribute('data-mastodon'));
window.open('https://' + instance + '/share?text=' + text, '_blank', 'noopener');
});
});
})();