82 lines
3.1 KiB
JavaScript
82 lines
3.1 KiB
JavaScript
// shared/logo.js — turn the inert <svg class="app-header__logo"> on
|
|
// every tool's header into a clickable link. The destination is the
|
|
// nearest "home" the user can sensibly back out to:
|
|
//
|
|
// file:// → no wrap (no server home)
|
|
// http(s)://host/ → wrap, href = /
|
|
// http(s)://host/<tool>.html (deployment root)→ wrap, href = /
|
|
// http(s)://host/<project>/... → wrap, href = /<project>
|
|
//
|
|
// When inside a project, the logo takes the user to the project
|
|
// landing (synthetic page with the four lifecycle-stage cards + MDL
|
|
// instructions). When at the deployment root, the logo points at /
|
|
// (the project picker). Offline, the logo stays decorative — there's
|
|
// no real "home" to go to.
|
|
//
|
|
// Mounts as a sibling-replacement on DOMContentLoaded: wraps the
|
|
// existing logo SVG in an <a>, preserving classes and attributes.
|
|
// Idempotent: re-mounting on an already-wrapped logo is a no-op.
|
|
//
|
|
// Tools that want to override (e.g. a deployment that pins logo to
|
|
// an external URL) can set window.zddc.logo.disabled = true before
|
|
// DOMContentLoaded and inject their own anchor.
|
|
(function () {
|
|
'use strict';
|
|
|
|
if (!window.zddc) window.zddc = {};
|
|
if (window.zddc.logo) return;
|
|
|
|
function projectSegment(pathname) {
|
|
var parts = pathname.split('/').filter(Boolean);
|
|
if (parts.length === 0) return null;
|
|
var first = parts[0];
|
|
// Tool HTMLs at the deployment root (index.html, archive.html
|
|
// with ?projects=...) don't carry a project segment.
|
|
if (first.indexOf('.') !== -1) return null;
|
|
return first;
|
|
}
|
|
|
|
function targetHref() {
|
|
if (typeof location === 'undefined') return null;
|
|
if (location.protocol !== 'http:' && location.protocol !== 'https:') {
|
|
return null;
|
|
}
|
|
if (window.zddc.logo && window.zddc.logo.disabled) return null;
|
|
var seg = projectSegment(location.pathname);
|
|
return seg ? '/' + encodeURIComponent(seg) : '/';
|
|
}
|
|
|
|
function mount() {
|
|
var logo = document.querySelector('.app-header__logo');
|
|
if (!logo) return;
|
|
// Already wrapped (template-supplied anchor, or a previous mount).
|
|
if (logo.parentElement && logo.parentElement.tagName === 'A' &&
|
|
logo.parentElement.classList.contains('app-header__logo-link')) {
|
|
return;
|
|
}
|
|
var href = targetHref();
|
|
if (!href) return;
|
|
var a = document.createElement('a');
|
|
a.href = href;
|
|
a.className = 'app-header__logo-link';
|
|
var label = href === '/' ? 'ZDDC home' : 'Project home';
|
|
a.title = label;
|
|
a.setAttribute('aria-label', label);
|
|
logo.parentNode.insertBefore(a, logo);
|
|
a.appendChild(logo);
|
|
}
|
|
|
|
window.zddc.logo = {
|
|
mount: mount,
|
|
// Test seam.
|
|
_projectSegment: projectSegment,
|
|
_targetHref: targetHref,
|
|
disabled: false,
|
|
};
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', mount, { once: true });
|
|
} else {
|
|
mount();
|
|
}
|
|
})();
|