Skip to content

Commit fdb2c2e

Browse files
committed
CI deploy to gh-pages from publish@7037a5572ea5e787b7cebd25d3130bda4397ad2e
1 parent e901dbd commit fdb2c2e

454 files changed

Lines changed: 60851 additions & 21796 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

404.html

Lines changed: 136 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919

2020
<link rel="author" type="text/plain" href="humans.txt" />
2121

22-
23-
<link href='https://fonts.googleapis.com/css?family=Raleway:800' rel='stylesheet' type='text/css'>
24-
<link href='https://fonts.googleapis.com/css?family=Lato:400|Hind:700,300,600' rel='stylesheet' type='text/css'>
22+
<!-- Self-hosted fonts for GDPR compliance -->
2523

2624
<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"
2725
integrity="sha512-3n19xznO0ubPpSwYCRRBgHh63DrV+bdZfHK52b1esvId4GsfwStQNPJFjeQos2h3JwCmZl0/LgLxSKMAI55hgw=="
@@ -304,22 +302,153 @@ <h3 style="text-align: center"><a href="/beginner">Help us map the world.</h3>
304302
</div>
305303
<div class="footer-mm center-text">
306304
CC-BY Missing Maps
305+
<a href="/privacy-policy/" class="privacy-link">Privacy Policy</a>
307306
</div>
308307
</div>
309308
</div>
310309
</footer>
311310

312311

313-
<!-- Global site tag (gtag.js) - Google Analytics -->
312+
<!-- GDPR-Compliant Google Analytics -->
314313
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-55969124-1"></script>
315314
<script>
316315
window.dataLayer = window.dataLayer || [];
317-
const gtag = (...args) => { dataLayer.push(args); };
316+
function gtag(){dataLayer.push(arguments);}
318317
gtag('js', new Date());
319-
320-
gtag('config', 'UA-55969124-1');
318+
319+
// Initialize in a disabled state - will be enabled by consent manager
320+
gtag('config', 'UA-55969124-1', {
321+
'anonymize_ip': true,
322+
'cookie_flags': 'SameSite=Strict;Secure',
323+
'send_page_view': false
324+
});
325+
326+
// Disable by default until user consents
327+
window['ga-disable-UA-55969124-1'] = true;
321328
</script>
322329

330+
<!-- GDPR Cookie Consent Banner -->
331+
<!-- GDPR Cookie Consent Banner -->
332+
<div id="cookie-consent-banner" style="display: none;">
333+
<div class="cookie-banner-content">
334+
<div class="cookie-banner-text">
335+
<h3>Cookie Consent</h3>
336+
<p>We use cookies to analyze website traffic and improve your experience. By accepting our use of cookies, your data will be aggregated with all other user data for analytics purposes.</p>
337+
</div>
338+
<div class="cookie-banner-actions">
339+
<button id="cookie-accept" class="btn btn-primary">Accept</button>
340+
<button id="cookie-reject" class="btn btn-secondary">Reject</button>
341+
<a href="/privacy-policy/" class="cookie-learn-more">Learn More</a>
342+
</div>
343+
</div>
344+
</div>
345+
346+
<!-- Cookie consent JavaScript -->
347+
<script>
348+
(function() {
349+
'use strict';
350+
351+
// Cookie utility functions
352+
function setCookie(name, value, days) {
353+
var expires = "";
354+
if (days) {
355+
var date = new Date();
356+
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
357+
expires = "; expires=" + date.toUTCString();
358+
}
359+
document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=Strict";
360+
}
361+
362+
function getCookie(name) {
363+
var nameEQ = name + "=";
364+
var ca = document.cookie.split(';');
365+
for (var i = 0; i < ca.length; i++) {
366+
var c = ca[i];
367+
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
368+
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
369+
}
370+
return null;
371+
}
372+
373+
// Initialize Google Analytics based on consent
374+
function initializeAnalytics() {
375+
var consent = getCookie('gdpr_consent');
376+
377+
if (consent === 'accepted') {
378+
// Enable Google Analytics
379+
if (typeof gtag !== 'undefined') {
380+
gtag('config', 'UA-55969124-1', {
381+
'anonymize_ip': true,
382+
'cookie_flags': 'SameSite=Strict;Secure'
383+
});
384+
}
385+
console.log('Analytics enabled by user consent');
386+
} else if (consent === 'rejected') {
387+
// Disable Google Analytics
388+
if (typeof gtag !== 'undefined') {
389+
gtag('config', 'UA-55969124-1', {
390+
'anonymize_ip': true,
391+
'cookie_flags': 'SameSite=Strict;Secure',
392+
'send_page_view': false
393+
});
394+
// Disable all tracking
395+
window['ga-disable-UA-55969124-1'] = true;
396+
}
397+
console.log('Analytics disabled by user consent');
398+
}
399+
}
400+
401+
// Show consent banner if no decision has been made
402+
function showConsentBanner() {
403+
var consent = getCookie('gdpr_consent');
404+
var banner = document.getElementById('cookie-consent-banner');
405+
406+
if (!consent && banner) {
407+
banner.style.display = 'block';
408+
}
409+
}
410+
411+
// Handle consent decisions
412+
function handleConsentDecision(decision) {
413+
setCookie('gdpr_consent', decision, 365); // Store for 1 year
414+
document.getElementById('cookie-consent-banner').style.display = 'none';
415+
416+
if (decision === 'accepted') {
417+
// Reload page to enable analytics
418+
window.location.reload();
419+
} else {
420+
// Initialize analytics in disabled state
421+
initializeAnalytics();
422+
}
423+
}
424+
425+
// Initialize when DOM is ready
426+
document.addEventListener('DOMContentLoaded', function() {
427+
// Show banner if needed
428+
showConsentBanner();
429+
430+
// Initialize analytics based on existing consent
431+
initializeAnalytics();
432+
433+
// Bind button events
434+
var acceptBtn = document.getElementById('cookie-accept');
435+
var rejectBtn = document.getElementById('cookie-reject');
436+
437+
if (acceptBtn) {
438+
acceptBtn.addEventListener('click', function() {
439+
handleConsentDecision('accepted');
440+
});
441+
}
442+
443+
if (rejectBtn) {
444+
rejectBtn.addEventListener('click', function() {
445+
handleConsentDecision('rejected');
446+
});
447+
}
448+
});
449+
})();
450+
</script>
451+
323452
<!-- build:js assets/scripts/main.js -->
324453
<script src="/assets/scripts/main.min.js"></script>
325454
<!-- endbuild -->

about/index.html

Lines changed: 136 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919

2020
<link rel="author" type="text/plain" href="humans.txt" />
2121

22-
23-
<link href='https://fonts.googleapis.com/css?family=Raleway:800' rel='stylesheet' type='text/css'>
24-
<link href='https://fonts.googleapis.com/css?family=Lato:400|Hind:700,300,600' rel='stylesheet' type='text/css'>
22+
<!-- Self-hosted fonts for GDPR compliance -->
2523

2624
<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"
2725
integrity="sha512-3n19xznO0ubPpSwYCRRBgHh63DrV+bdZfHK52b1esvId4GsfwStQNPJFjeQos2h3JwCmZl0/LgLxSKMAI55hgw=="
@@ -461,22 +459,153 @@ <h1 class="title feature-header">About</h1>
461459
</div>
462460
<div class="footer-mm center-text">
463461
CC-BY Missing Maps
462+
<a href="/privacy-policy/" class="privacy-link">Privacy Policy</a>
464463
</div>
465464
</div>
466465
</div>
467466
</footer>
468467

469468

470-
<!-- Global site tag (gtag.js) - Google Analytics -->
469+
<!-- GDPR-Compliant Google Analytics -->
471470
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-55969124-1"></script>
472471
<script>
473472
window.dataLayer = window.dataLayer || [];
474-
const gtag = (...args) => { dataLayer.push(args); };
473+
function gtag(){dataLayer.push(arguments);}
475474
gtag('js', new Date());
476-
477-
gtag('config', 'UA-55969124-1');
475+
476+
// Initialize in a disabled state - will be enabled by consent manager
477+
gtag('config', 'UA-55969124-1', {
478+
'anonymize_ip': true,
479+
'cookie_flags': 'SameSite=Strict;Secure',
480+
'send_page_view': false
481+
});
482+
483+
// Disable by default until user consents
484+
window['ga-disable-UA-55969124-1'] = true;
478485
</script>
479486

487+
<!-- GDPR Cookie Consent Banner -->
488+
<!-- GDPR Cookie Consent Banner -->
489+
<div id="cookie-consent-banner" style="display: none;">
490+
<div class="cookie-banner-content">
491+
<div class="cookie-banner-text">
492+
<h3>Cookie Consent</h3>
493+
<p>We use cookies to analyze website traffic and improve your experience. By accepting our use of cookies, your data will be aggregated with all other user data for analytics purposes.</p>
494+
</div>
495+
<div class="cookie-banner-actions">
496+
<button id="cookie-accept" class="btn btn-primary">Accept</button>
497+
<button id="cookie-reject" class="btn btn-secondary">Reject</button>
498+
<a href="/privacy-policy/" class="cookie-learn-more">Learn More</a>
499+
</div>
500+
</div>
501+
</div>
502+
503+
<!-- Cookie consent JavaScript -->
504+
<script>
505+
(function() {
506+
'use strict';
507+
508+
// Cookie utility functions
509+
function setCookie(name, value, days) {
510+
var expires = "";
511+
if (days) {
512+
var date = new Date();
513+
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
514+
expires = "; expires=" + date.toUTCString();
515+
}
516+
document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=Strict";
517+
}
518+
519+
function getCookie(name) {
520+
var nameEQ = name + "=";
521+
var ca = document.cookie.split(';');
522+
for (var i = 0; i < ca.length; i++) {
523+
var c = ca[i];
524+
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
525+
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
526+
}
527+
return null;
528+
}
529+
530+
// Initialize Google Analytics based on consent
531+
function initializeAnalytics() {
532+
var consent = getCookie('gdpr_consent');
533+
534+
if (consent === 'accepted') {
535+
// Enable Google Analytics
536+
if (typeof gtag !== 'undefined') {
537+
gtag('config', 'UA-55969124-1', {
538+
'anonymize_ip': true,
539+
'cookie_flags': 'SameSite=Strict;Secure'
540+
});
541+
}
542+
console.log('Analytics enabled by user consent');
543+
} else if (consent === 'rejected') {
544+
// Disable Google Analytics
545+
if (typeof gtag !== 'undefined') {
546+
gtag('config', 'UA-55969124-1', {
547+
'anonymize_ip': true,
548+
'cookie_flags': 'SameSite=Strict;Secure',
549+
'send_page_view': false
550+
});
551+
// Disable all tracking
552+
window['ga-disable-UA-55969124-1'] = true;
553+
}
554+
console.log('Analytics disabled by user consent');
555+
}
556+
}
557+
558+
// Show consent banner if no decision has been made
559+
function showConsentBanner() {
560+
var consent = getCookie('gdpr_consent');
561+
var banner = document.getElementById('cookie-consent-banner');
562+
563+
if (!consent && banner) {
564+
banner.style.display = 'block';
565+
}
566+
}
567+
568+
// Handle consent decisions
569+
function handleConsentDecision(decision) {
570+
setCookie('gdpr_consent', decision, 365); // Store for 1 year
571+
document.getElementById('cookie-consent-banner').style.display = 'none';
572+
573+
if (decision === 'accepted') {
574+
// Reload page to enable analytics
575+
window.location.reload();
576+
} else {
577+
// Initialize analytics in disabled state
578+
initializeAnalytics();
579+
}
580+
}
581+
582+
// Initialize when DOM is ready
583+
document.addEventListener('DOMContentLoaded', function() {
584+
// Show banner if needed
585+
showConsentBanner();
586+
587+
// Initialize analytics based on existing consent
588+
initializeAnalytics();
589+
590+
// Bind button events
591+
var acceptBtn = document.getElementById('cookie-accept');
592+
var rejectBtn = document.getElementById('cookie-reject');
593+
594+
if (acceptBtn) {
595+
acceptBtn.addEventListener('click', function() {
596+
handleConsentDecision('accepted');
597+
});
598+
}
599+
600+
if (rejectBtn) {
601+
rejectBtn.addEventListener('click', function() {
602+
handleConsentDecision('rejected');
603+
});
604+
}
605+
});
606+
})();
607+
</script>
608+
480609
<!-- build:js assets/scripts/main.js -->
481610
<script src="/assets/scripts/main.min.js"></script>
482611
<!-- endbuild -->

0 commit comments

Comments
 (0)