-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhonor.html
More file actions
300 lines (276 loc) · 16.4 KB
/
Copy pathhonor.html
File metadata and controls
300 lines (276 loc) · 16.4 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Global Governance and Transparency Honor · JRS</title>
<meta name="robots" content="noindex">
<meta name="description" content="Accept the Global Governance and Transparency Honor and confirm how your name and title should appear.">
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Bodoni+Moda:wght@400;500&family=Inter:wght@300;400;500&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root{
--bg:#050505; --surface:#121212; --surface2:#1A1A1A;
--accent:#BE9447; --accent-dim:#7A5E28;
--muted:#B3B3B3; --muted-soft:#8A8A8A; --text:#F2F2F2;
--rule:#2A2A2A; --stop-text:#E88080; --review-text:#D4A055; --ready-text:#5DBF82;
}
*{margin:0;padding:0;box-sizing:border-box}
body{background:var(--bg);color:var(--text);font-family:'Inter',sans-serif;line-height:1.6;min-height:100vh;display:flex;flex-direction:column}
a{color:var(--accent)}
.wrap{max-width:620px;width:100%;margin:0 auto;padding:34px 22px 60px;flex:1}
.wordmark{font-family:'Bodoni Moda',serif;font-size:20px;color:var(--accent);text-decoration:none}
.seal{font-family:'JetBrains Mono',monospace;font-size:8.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--accent);margin:26px 0 10px}
h1{font-family:'Bodoni Moda',serif;font-weight:400;font-size:30px;line-height:1.2;margin:0 0 8px}
.year{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.2em;color:var(--accent-dim);margin-bottom:16px}
.lede{font-size:14px;color:var(--muted);line-height:1.7;margin-bottom:16px}
.citation{border-left:3px solid var(--accent);background:var(--surface);padding:16px 18px;margin:0 0 20px;font-size:13.5px;color:var(--muted);line-height:1.7}
.citation b{color:var(--text);font-weight:500}
.card{background:var(--surface);border:1px solid var(--accent);padding:24px 22px;margin-top:18px}
label.fl{display:block;font-family:'JetBrains Mono',monospace;font-size:8.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted-soft);margin-bottom:6px}
input,textarea{width:100%;background:var(--surface2);border:1px solid var(--rule);color:var(--text);padding:11px 12px;font-size:14px;font-family:'Inter',sans-serif;margin-bottom:13px}
textarea{min-height:110px;resize:vertical;line-height:1.6}
input:focus,textarea:focus{outline:none;border-color:var(--accent-dim)}
.hint{font-size:11.5px;color:var(--muted-soft);line-height:1.55;margin:-9px 0 13px}
label.chk{display:flex;gap:9px;align-items:flex-start;font-size:11.5px;color:var(--muted);line-height:1.55;margin-bottom:10px;cursor:pointer}
label.chk input{width:auto;margin:2px 0 0;flex:0 0 auto}
label.chk.core{border:1px solid var(--accent-dim);background:var(--surface2);padding:12px 13px}
button{width:100%;font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.14em;text-transform:uppercase;background:var(--accent);color:#050505;border:none;padding:14px;cursor:pointer}
button:disabled{opacity:.55;cursor:default}
#msg{font-size:12.5px;min-height:16px;margin-bottom:8px;color:var(--review-text)}
.trust{font-size:11px;color:var(--ready-text);text-align:center;margin-top:9px}
.fine{font-size:10.5px;color:var(--muted-soft);line-height:1.55;margin-top:14px}
footer{border-top:1px solid var(--rule);padding:20px 22px;text-align:center}
.fc{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted-soft)}
</style>
</head>
<body>
<div class="wrap">
<a href="index.html" class="wordmark">JRS<span style="font-size:10px;vertical-align:super;position:relative;top:-3px;">™</span></a>
<div id="stage">
<div class="seal">Global Governance & Transparency Honor</div>
<h1 id="headline">Loading</h1>
<div class="year" id="year"></div>
<p class="lede" id="lede">One moment.</p>
</div>
</div>
<footer>
<div class="fc">© 2026 JRS™ · Justification Review Standard · Phillip Wikes, principal · <a href="privacy.html" style="color:inherit">Privacy</a> · <a href="check.html" style="color:inherit">Record Defensibility Check</a></div>
</footer>
<script>
(function(){
function qp(k){ try { return (new URLSearchParams(location.search)).get(k) || ''; } catch(e){ return ''; } }
function esc(x){ return String(x==null?'':x).replace(/[&<>"']/g, function(c){ return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); }
function el(id){ return document.getElementById(id); }
var key = qp('k');
var stage = el('stage');
if (!key) { render404(); return; }
fetch('/api/honor?k=' + encodeURIComponent(key))
.then(function(r){ if (!r.ok) throw 0; return r.json(); })
.then(function(d){ if (!d || !d.found) throw 0; renderForm(d); })
.catch(function(){ render404(); });
function render404(){
stage.innerHTML =
'<div class="seal">Global Governance & Transparency Honor</div>'
+ '<h1>This link is not recognised</h1>'
+ '<p class="lede">Honor links are issued individually and are not guessable. If you were sent one and it is not working, reply to the message that brought you here, or write to <a href="mailto:info@jrsstandard.com">info@jrsstandard.com</a>.</p>';
}
function renderForm(d){
stage.innerHTML =
'<div class="seal">' + esc(d.honor) + '</div>'
+ '<h1>' + esc(d.first) + ', you have been named an honoree.</h1>'
+ '<div class="year">' + esc(d.year) + ' · ' + esc(d.code) + ' · ' + esc(d.order) + '</div>'
+ '<p class="lede">This is the citation as it will read on your certificate. Nothing is issued until you confirm it below, and nothing is published without your say-so.</p>'
+ '<div class="citation">' + esc(d.citation) + '</div>'
+ '<div class="card">'
+ '<label class="fl" for="h-name">Name, exactly as it should be printed</label>'
+ '<input id="h-name" type="text" value="' + esc(d.name) + '">'
+ '<label class="fl" for="h-title">Title, exactly as it should be printed</label>'
+ '<input id="h-title" type="text" value="' + esc(d.title) + '">'
+ '<label class="fl" for="h-org">Organization</label>'
+ '<input id="h-org" type="text" value="' + esc(d.org) + '">'
+ '<label class="fl" for="h-email">Email</label>'
+ '<input id="h-email" type="email" placeholder="Email" autocomplete="email">'
+ '<label class="fl" for="h-quote">In your own words</label>'
+ '<textarea id="h-quote" placeholder="A sentence or two on why a public-records determination should be able to explain itself. Yours, not ours."></textarea>'
+ '<p class="hint">Optional, and it is the part we cannot write for you. If you give us one, it may appear in the article and in coverage of the work, always attributed and never edited beyond punctuation.</p>'
+ '<label class="chk"><input type="checkbox" id="h-quote-ok"><span>You may use that quote, attributed to me.</span></label>'
+ '<label class="chk"><input type="checkbox" id="h-byline" checked><span>Print my name and title as shown above in the article and its contributor list.</span></label>'
+ '<label class="chk core"><input type="checkbox" id="h-core"><span>I agree to be contacted about this work, and to my details being stored securely under the <a href="privacy.html#consent" id="h-terms-link">registration terms</a>. <span style="color:var(--text)">Your name is <b style="color:var(--ready-text);font-weight:600">not published</b> by ticking this.</span></span></label>'
+ '<div id="h-terms" style="display:none;border:1px solid var(--accent-dim);background:var(--surface2);padding:13px 14px;margin:0 0 10px;font-size:12px;color:var(--muted);line-height:1.6">Ticking the box means three things and no more: contact me about this work, store my details securely, and allow that record to travel with the project if the JRS assets are ever transferred to a successor. It does <b style="color:var(--text)">not</b> publish your name. Being listed publicly as an honoree is the separate optional tick below. Full detail in the <a href="privacy.html#consent">Privacy Policy</a>.</div>'
+ '<label class="chk"><input type="checkbox" id="h-public"><span>Optional: list my name publicly as an honoree.</span></label>'
+ '<div id="msg"></div>'
+ '<button id="go" type="button">Accept the Honor</button>'
+ '<p class="trust">Takes about a minute. Nothing is published without your approval.</p>'
+ '<p class="fine">Your details are stored securely and used only for this project. Request access or deletion any time at <a href="mailto:info@jrsstandard.com">info@jrsstandard.com</a>. See the <a href="privacy.html">Privacy Policy</a>.</p>'
+ '</div>';
el('go').addEventListener('click', function(){ submit(d); });
// Inline terms rather than a new window: the anchor is inside the consent
// label, and in-app browsers block target="_blank" so the link reads as dead.
var htl = el('h-terms-link');
if (htl) htl.addEventListener('click', function(e){
e.preventDefault();
e.stopPropagation();
var p = el('h-terms');
if (!p) return;
var open = (p.style.display === 'none' || !p.style.display);
p.style.display = open ? 'block' : 'none';
// The panel opens below the tick box, which on a phone is usually below
// the fold. Without this the tap produces no visible change.
htl.textContent = open ? 'hide the details' : 'registration terms';
if (open && p.scrollIntoView) p.scrollIntoView({ behavior:'smooth', block:'nearest' });
});
}
function submit(d){
var msg = el('msg'), go = el('go');
var email = el('h-email').value.trim();
var core = el('h-core').checked;
msg.style.color = 'var(--review-text)';
if (!email || email.indexOf('@') < 1 || email.indexOf('.') < 0) {
msg.textContent = 'Please enter a valid email address so the certificate can reach you.';
el('h-email').focus(); return;
}
if (!core) {
msg.textContent = 'Please tick the box so your details can be stored. Your name is not published by ticking it.';
return;
}
go.disabled = true;
msg.style.color = 'var(--muted)';
msg.textContent = 'Recording your acceptance...';
fetch('/api/honor?k=' + encodeURIComponent(qp('k')), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: el('h-name').value.trim(),
title: el('h-title').value.trim(),
organization: el('h-org').value.trim(),
email: email,
quote: el('h-quote').value.trim(),
quote_clearance: el('h-quote-ok').checked,
byline_ok: el('h-byline').checked,
consent_core: true,
consent_public_list: el('h-public').checked
})
})
.then(function(r){ if (!r.ok) throw 0; return r.json(); })
.then(function(res){
stage.innerHTML =
'<div class="seal">' + esc(res.honor) + '</div>'
+ '<h1>Accepted. Thank you, ' + esc(String(res.printed_name).split(' ')[0]) + '.</h1>'
+ '<div class="year">' + esc(res.year) + ' · ' + esc(res.code) + '</div>'
+ '<p class="lede">Your certificate will be issued in the name and title you confirmed, and sent to the address you gave. Here is the citation it carries.</p>'
+ '<div class="citation"><b>' + esc(res.printed_name) + '</b><br>' + esc(res.printed_title) + '<br><br>' + esc(res.citation) + '</div>'
+ '<a href="/api/honor-cert?k=' + encodeURIComponent(qp('k')) + '" target="_blank" rel="noopener" style="text-decoration:none;display:block;margin:0 0 12px"><button type="button">Open my certificate →</button></a>'
+ '<p class="lede">It opens as a printable page. Use your browser\'s print option to save it as a PDF. The link keeps working, so you do not have to do it now.</p>'
+ '<p class="lede">If anything above should read differently, reply to the message that brought you here and it will be changed. Reopen the link afterwards and the certificate carries the correction.</p>';
window.scrollTo(0,0);
})
.catch(function(){
msg.style.color = 'var(--review-text)';
msg.textContent = 'Could not record that just now. Please try again, or write to info@jrsstandard.com.';
go.disabled = false;
});
}
})();
</script>
<script>
/* JRS LINK-CLICK TELEMETRY. Added 2026-08-13. Token-less, no dependencies.
Posts to /api/telemetry, which is a real endpoint in this repository. */
/**
* Zero-Drift Telemetry Dispatcher
* Guarantees event delivery without delaying navigation or blocking the main thread.
*/
function trackClickAndNavigate(event, targetUrl, eventMetaData) {
eventMetaData = eventMetaData || {};
// 1. Prevent default immediate navigation
if (event && typeof event.preventDefault === 'function') {
event.preventDefault();
}
// 2. Construct immutable telemetry payload
var payload = JSON.stringify({
timestamp: new Date().toISOString(),
origin_url: window.location.href,
target_url: targetUrl,
meta: eventMetaData
});
// 3. Primary Dispatch: Non-blocking navigator.sendBeacon
var isDispatched = false;
if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
var blob = new Blob([payload], { type: 'application/json' });
isDispatched = navigator.sendBeacon('/api/telemetry', blob);
}
// 4. Secondary Dispatch: Fetch API with keepalive flag
if (!isDispatched && typeof fetch === 'function') {
fetch('/api/telemetry', {
method: 'POST',
body: payload,
headers: { 'Content-Type': 'application/json' },
keepalive: true
}).catch(function() {
/* Swallowing non-critical network drops to prioritize UX */
});
}
// 5. Deterministic Fail-safe Navigation Fallback (150ms timeout)
setTimeout(function() {
window.location.href = targetUrl;
}, 150);
}
/* DELEGATION LAYER.
One document-level listener, so links rendered by JavaScript after load are
captured too and no per-link handler is needed anywhere.
It decides WHEN to call the dispatcher. It does not alter it.
Three classes of link are deliberately NOT routed through the dispatcher:
- /api/dl and /api/support already count inside their own 302. A redirect
cannot be blocked or raced, so it is strictly stronger than a beacon and
routing them here would double-count.
- mailto, tel, in-page anchors and downloads are not navigations to count.
- modifier and middle clicks. preventDefault on those would break "open in
new tab", so the beacon is sent WITHOUT preventDefault and the browser is
left to do what the reader asked for. */
(function(){
var COUNTED_SERVER_SIDE = /^\/api\/(dl|support)\b/;
function beacon(target, meta){
try {
var payload = JSON.stringify({
timestamp: new Date().toISOString(),
origin_url: window.location.href,
target_url: target,
meta: meta || {}
});
var sent = false;
if (navigator.sendBeacon) {
sent = navigator.sendBeacon('/api/telemetry', new Blob([payload], { type: 'application/json' }));
}
if (!sent && typeof fetch === 'function') {
fetch('/api/telemetry', { method: 'POST', body: payload,
headers: { 'Content-Type': 'application/json' }, keepalive: true }).catch(function(){});
}
} catch (e) { /* never let telemetry break a click */ }
}
document.addEventListener('click', function(ev){
try {
var a = ev.target && ev.target.closest ? ev.target.closest('a[href]') : null;
if (!a) return;
var href = a.getAttribute('href') || '';
if (!href || href.charAt(0) === '#') return;
if (/^(mailto:|tel:|javascript:)/i.test(href)) return;
if (a.hasAttribute('download')) return;
if (COUNTED_SERVER_SIDE.test(href)) return;
var label = (a.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 80);
var meta = { label: label, src: 'link' };
// Modifier or middle click: the reader wants a new tab. Record it, do not
// hijack it.
if (ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey || ev.button !== 0) {
beacon(a.href, meta);
return;
}
if (a.target && a.target !== '_self') { beacon(a.href, meta); return; }
trackClickAndNavigate(ev, a.href, meta);
} catch (e) { /* a telemetry fault must never block navigation */ }
}, true);
})();
</script>
</body>
</html>