L. C. Parker 8/8/2025 5:35:08 PM dbscript-v3.js --- /* Relies on #td-topmenu-alert.v3-header-nav__banner existing in the header. */
(function () { "use strict";
// ---- CONFIG ---- const BANNER_ID = "lcparker37-global-banner"; const DISMISS_KEY = "lcparker37.globalBanner.dismissed"; // change to rotate message const messageHTML = ` <strong>Sandbox Notice:</strong> You are working in <em>LPDB8 Sandbox - John Doe</em>. Changes here do not affect production. `; const showClose = false; // set to true if you want a close (dismiss) button const bannerRole = "status"; // 'status' or 'alert'
// ---- UTIL ---- function ready(fn) { if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", fn); } else { fn(); } }
function findBannerContainer() { return document.getElementById("td-topmenu-alert"); }
function alreadyDismissed() { try { return localStorage.getItem(DISMISS_KEY) === "1"; } catch (_) { return false; } }
function markDismissed() { try { localStorage.setItem(DISMISS_KEY, "1"); } catch (_) {} }
function buildBannerNode() { const wrapper = document.createElement("div"); wrapper.id = BANNER_ID; wrapper.className = "td-banner td-banner--info"; // styled in dbstyles-v3.css wrapper.setAttribute("role", bannerRole); wrapper.setAttribute("aria-live", "polite");
const content = document.createElement("div"); content.className = "td-banner__content"; content.innerHTML = messageHTML;
wrapper.appendChild(content);
if (showClose) { const btn = document.createElement("button"); btn.type = "button"; btn.className = "td-banner__close"; btn.setAttribute("aria-label", "Dismiss banner"); btn.textContent = "×"; btn.addEventListener("click", () => { markDismissed(); wrapper.remove(); }); wrapper.appendChild(btn); }
return wrapper; }
function ensureBanner() { const slot = findBannerContainer(); if (!slot) return; if (showClose && alreadyDismissed()) return; if (slot.querySelector("#" + BANNER_ID)) return; slot.prepend(buildBannerNode()); }
function bootstrap() { ensureBanner(); const header = document.getElementById("td-header"); if (!header) return; const mo = new MutationObserver(() => ensureBanner()); mo.observe(header, { childList: true, subtree: true }); }
ready(bootstrap); })();
|