Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Join the Playtest on Steam Now: SpiritVale

MediaWiki:Common.js: Difference between revisions

MediaWiki interface page
No edit summary
Tags: Mobile edit Mobile web edit
No edit summary
Tags: Mobile edit Mobile web edit
Line 440: Line 440:
     initAllLevels(document);
     initAllLevels(document);
   }
   }
})();
/* ====================================================================== */
/* LEGACY POPUPS (disabled)                                              */
/*                                                                        */
/* This section is intentionally isolated so it can be deleted in one cut. */
/* To temporarily re-enable legacy behavior, set:                          */
/*  SV.common.enableLegacyPopups = true                                  */
/* ====================================================================== */
(function () {
  var SV = (window.SV = window.SV || {});
  var COMMON = (SV.common = SV.common || {});
  if (!COMMON.enableLegacyPopups) return;
  // Place any legacy popup code blocks here verbatim if needed during transition.
})();
})();


Line 740: Line 723:


     if (opts.pinned) {
     if (opts.pinned) {
       head.addEventListener("click", function (e) {
       head.addEventListener(
        e.preventDefault();
        "click",
        hidePopup();
        function (e) {
      }, { once: true });
          e.preventDefault();
          hidePopup();
        },
        { once: true }
      );
     }
     }


Line 777: Line 764:
       } else if (state.anchorKind === "finger") {
       } else if (state.anchorKind === "finger") {
         left = (vw - w) / 2;
         left = (vw - w) / 2;
         var y = state.anchorY || (vh / 2);
         var y = state.anchorY || vh / 2;
         top = y - h - gap;
         top = y - h - gap;
         if (top < margin) top = y + gap;
         if (top < margin) top = y + gap;
Line 784: Line 771:
         var tr = trigger.getBoundingClientRect();
         var tr = trigger.getBoundingClientRect();
         var isIconish = (tr.width || 0) <= 40;
         var isIconish = (tr.width || 0) <= 40;
         left = isIconish ? (tr.right - w) : tr.left;
         left = isIconish ? tr.right - w : tr.left;
         top = tr.bottom + gap;
         top = tr.bottom + gap;
         left = clamp(left, margin, Math.max(margin, vw - w - margin));
         left = clamp(left, margin, Math.max(margin, vw - w - margin));
Line 871: Line 858:
     }
     }


     if (!attrSize) size = (mode === "click") ? "lg" : "sm";
     if (!attrSize) size = mode === "click" ? "lg" : "sm";


     if (!HOVER_CAPABLE && mode === "hover") {
     if (!HOVER_CAPABLE && mode === "hover") {
Line 878: Line 865:
     }
     }


if (isDef) {
    if (isDef) {
  var tipText = getDefTipText(trigger);
      var tipText = getDefTipText(trigger);
  if (!tipText) return null;
      if (!tipText) return null;


  var linkTitle = getDefLinkTitle(trigger);
      var linkTitle = getDefLinkTitle(trigger);


  var label = trigger.querySelector ? trigger.querySelector(".sv-def-text") : null;
      var label = trigger.querySelector ? trigger.querySelector(".sv-def-text") : null;
  var titleText = label ? String(label.textContent || "").trim()
      var titleText = label ? String(label.textContent || "").trim() : String(trigger.textContent || "").trim();
                        : String(trigger.textContent || "").trim();
      if (!titleText) titleText = "Definition";
  if (!titleText) titleText = "Definition";


  return {
      return {
    pinned: (mode === "click"),
        pinned: mode === "click",
    size: size,
        size: size,
    title: titleText,
        title: titleText,
    titleLink: linkTitle ? buildHeaderLink(linkTitle, titleText) : null,
        titleLink: linkTitle ? buildHeaderLink(linkTitle, titleText) : null,
    bodyText: tipText,
        bodyText: tipText,
    bodyPre: true,
        bodyPre: true,
    bodyNode: null
        bodyNode: null
  };
      };
}
    }


     var source = getContentNodeFromTrigger(trigger);
     var source = getContentNodeFromTrigger(trigger);
Line 904: Line 890:


     return {
     return {
       pinned: (mode === "click"),
       pinned: mode === "click",
       size: size,
       size: size,
       title: guessTitle(trigger, source),
       title: guessTitle(trigger, source),
Line 914: Line 900:
   }
   }


   window.addEventListener("pointerdown", function (e) {
   window.addEventListener(
    if (!e) return;
    "pointerdown",
    function (e) {
      if (!e) return;


    if (isInsidePopup(e.target)) return;
      if (isInsidePopup(e.target)) return;


    var trigger = findTrigger(e.target);
      var trigger = findTrigger(e.target);
    if (!trigger) return;
      if (!trigger) return;
 
      var opts = resolveOpts(trigger);
      if (!opts) return;


    var opts = resolveOpts(trigger);
      if (isSummaryTrigger(trigger)) e.preventDefault();
    if (!opts) return;


    if (isSummaryTrigger(trigger)) e.preventDefault();
      state.anchorKind = !HOVER_CAPABLE || (e.pointerType && e.pointerType !== "mouse") ? "finger" : "trigger";
      state.anchorX = typeof e.clientX === "number" ? e.clientX : 0;
      state.anchorY = typeof e.clientY === "number" ? e.clientY : 0;


    state.anchorKind = (!HOVER_CAPABLE || (e.pointerType && e.pointerType !== "mouse")) ? "finger" : "trigger";
      if (HOVER_CAPABLE && !opts.pinned && (e.pointerType === "mouse" || !e.pointerType)) {
    state.anchorX = (typeof e.clientX === "number") ? e.clientX : 0;
        e.stopPropagation();
    state.anchorY = (typeof e.clientY === "number") ? e.clientY : 0;
        return;
      }


    if (HOVER_CAPABLE && !opts.pinned && (e.pointerType === "mouse" || !e.pointerType)) {
      e.preventDefault();
       e.stopPropagation();
       e.stopPropagation();
      return;
    }


    e.preventDefault();
      if (state.open && state.pinned && state.trigger === trigger) {
    e.stopPropagation();
        hidePopup();
        return;
      }


    if (state.open && state.pinned && state.trigger === trigger) {
      openPopup(trigger, opts);
      hidePopup();
    },
      return;
     true
     }
  );


     openPopup(trigger, opts);
  window.addEventListener(
  }, true);
    "mouseover",
     function (e) {
      if (!HOVER_CAPABLE) return;
      if (isInsidePopup(e.target)) return;


  window.addEventListener("mouseover", function (e) {
      var trigger = findTrigger(e.target);
    if (!HOVER_CAPABLE) return;
      if (!trigger) {
    if (isInsidePopup(e.target)) return;
        if (state.open && !state.pinned) hidePopup();
        return;
      }


    var trigger = findTrigger(e.target);
      var opts = resolveOpts(trigger);
    if (!trigger) {
       if (!opts || opts.pinned) return;
       if (state.open && !state.pinned) hidePopup();
      return;
    }


    var opts = resolveOpts(trigger);
      state.anchorKind = "trigger";
    if (!opts || opts.pinned) return;


    state.anchorKind = "trigger";
      e.stopPropagation();
      clearTimeout(state.hideTimer);
      state.hideTimer = 0;


    e.stopPropagation();
      openPopup(trigger, opts);
     clearTimeout(state.hideTimer);
     },
     state.hideTimer = 0;
     true
  );


     openPopup(trigger, opts);
  window.addEventListener(
  }, true);
     "mouseout",
    function (e) {
      if (!HOVER_CAPABLE) return;
      if (!state.open || state.pinned) return;


  window.addEventListener("mouseout", function (e) {
      var trigger = findTrigger(e.target);
    if (!HOVER_CAPABLE) return;
      if (!trigger || trigger !== state.trigger) return;
    if (!state.open || state.pinned) return;


    var trigger = findTrigger(e.target);
      e.stopPropagation();
    if (!trigger || trigger !== state.trigger) return;


    e.stopPropagation();
      clearTimeout(state.hideTimer);
      state.hideTimer = setTimeout(function () {
        if (state.open && !state.pinned) hidePopup();
      }, 80);
    },
    true
  );


     clearTimeout(state.hideTimer);
  window.addEventListener(
     state.hideTimer = setTimeout(function () {
     "click",
       if (state.open && !state.pinned) hidePopup();
     function (e) {
    }, 80);
       if (!state.open) return;
  }, true);
      if (isInsidePopup(e.target)) return;


  window.addEventListener("click", function (e) {
      var trigger = findTrigger(e.target);
    if (!state.open) return;
      if (trigger) {
    if (isInsidePopup(e.target)) return;
        e.stopPropagation();
        return;
      }


    var trigger = findTrigger(e.target);
      if (state.pinned || !HOVER_CAPABLE) {
    if (trigger) {
        hidePopup();
      e.stopPropagation();
        e.stopPropagation();
       return;
       }
     }
     },
    true
  );


    if (state.pinned || !HOVER_CAPABLE) {
   window.addEventListener(
      hidePopup();
    "keydown",
      e.stopPropagation();
    function (e) {
    }
      if (e.key !== "Escape") return;
  }, true);
      if (state.open) {
 
        hidePopup();
   window.addEventListener("keydown", function (e) {
        e.stopPropagation();
    if (e.key !== "Escape") return;
      }
    if (state.open) {
    },
      hidePopup();
    true
      e.stopPropagation();
  );
    }
  }, true);


   window.addEventListener("scroll", function () {
   window.addEventListener(
    if (!state.open || !state.trigger) return;
    "scroll",
    positionPopup(state.trigger);
    function () {
  }, true);
      if (!state.open || !state.trigger) return;
      positionPopup(state.trigger);
    },
    true
  );


   window.addEventListener("resize", function () {
   window.addEventListener(
    if (!state.open || !state.trigger) return;
    "resize",
    positionPopup(state.trigger);
    function () {
  }, true);
      if (!state.open || !state.trigger) return;
      positionPopup(state.trigger);
    },
    true
  );


   function stripDefTitles(root) {
   function stripDefTitles(root) {
Line 1,031: Line 1,045:


   if (document.readyState === "loading") {
   if (document.readyState === "loading") {
     document.addEventListener("DOMContentLoaded", function () { stripDefTitles(document); });
     document.addEventListener("DOMContentLoaded", function () {
      stripDefTitles(document);
    });
   } else {
   } else {
     stripDefTitles(document);
     stripDefTitles(document);