<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sourceworlds.wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-StickyToC.js</id>
	<title>MediaWiki:Gadget-StickyToC.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://sourceworlds.wiki/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-StickyToC.js"/>
	<link rel="alternate" type="text/html" href="https://sourceworlds.wiki/index.php?title=MediaWiki:Gadget-StickyToC.js&amp;action=history"/>
	<updated>2026-11-09T21:59:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://sourceworlds.wiki/index.php?title=MediaWiki:Gadget-StickyToC.js&amp;diff=1626&amp;oldid=prev</id>
		<title>Vizzys: Protected &quot;MediaWiki:Gadget-StickyToC.js&quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://sourceworlds.wiki/index.php?title=MediaWiki:Gadget-StickyToC.js&amp;diff=1626&amp;oldid=prev"/>
		<updated>2026-10-20T01:33:27Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/MediaWiki:Gadget-StickyToC.js&quot; title=&quot;MediaWiki:Gadget-StickyToC.js&quot;&gt;MediaWiki:Gadget-StickyToC.js&lt;/a&gt;&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:33, 20 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Vizzys</name></author>
	</entry>
	<entry>
		<id>https://sourceworlds.wiki/index.php?title=MediaWiki:Gadget-StickyToC.js&amp;diff=1625&amp;oldid=prev</id>
		<title>Vizzys: Created page with &quot;$(function(){     if (!$(&#039;#toc&#039;).length) {         return;     }     var i18n = {         header: &#039;Contents&#039;,         top: &#039;(Top)&#039;     };          var tocCollapsed = (localStorage.getItem(&quot;sidebar_vector_c_p-toc&quot;) === &quot;y&quot;);     $(&#039;&lt;nav id=&quot;p-toc&quot; class=&quot;vector-menu mw-portlet mw-portlet-toc vector-menu-portal portal&quot; aria-labelledby=&quot;p-toc-label&quot; role=&quot;navigation&quot;&gt;&#039;).append(         $(&#039;&lt;h3 id=&quot;p-toc-label&quot; class=&quot;vector-menu-heading&quot; tabindex=&quot;0&quot;&gt;&#039;).append(             $...&quot;</title>
		<link rel="alternate" type="text/html" href="https://sourceworlds.wiki/index.php?title=MediaWiki:Gadget-StickyToC.js&amp;diff=1625&amp;oldid=prev"/>
		<updated>2026-10-20T01:33:21Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;$(function(){     if (!$(&amp;#039;#toc&amp;#039;).length) {         return;     }     var i18n = {         header: &amp;#039;Contents&amp;#039;,         top: &amp;#039;(Top)&amp;#039;     };          var tocCollapsed = (localStorage.getItem(&amp;quot;sidebar_vector_c_p-toc&amp;quot;) === &amp;quot;y&amp;quot;);     $(&amp;#039;&amp;lt;nav id=&amp;quot;p-toc&amp;quot; class=&amp;quot;vector-menu mw-portlet mw-portlet-toc vector-menu-portal portal&amp;quot; aria-labelledby=&amp;quot;p-toc-label&amp;quot; role=&amp;quot;navigation&amp;quot;&amp;gt;&amp;#039;).append(         $(&amp;#039;&amp;lt;h3 id=&amp;quot;p-toc-label&amp;quot; class=&amp;quot;vector-menu-heading&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;#039;).append(             $...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;$(function(){&lt;br /&gt;
    if (!$(&amp;#039;#toc&amp;#039;).length) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    var i18n = {&lt;br /&gt;
        header: &amp;#039;Contents&amp;#039;,&lt;br /&gt;
        top: &amp;#039;(Top)&amp;#039;&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var tocCollapsed = (localStorage.getItem(&amp;quot;sidebar_vector_c_p-toc&amp;quot;) === &amp;quot;y&amp;quot;);&lt;br /&gt;
    $(&amp;#039;&amp;lt;nav id=&amp;quot;p-toc&amp;quot; class=&amp;quot;vector-menu mw-portlet mw-portlet-toc vector-menu-portal portal&amp;quot; aria-labelledby=&amp;quot;p-toc-label&amp;quot; role=&amp;quot;navigation&amp;quot;&amp;gt;&amp;#039;).append(&lt;br /&gt;
        $(&amp;#039;&amp;lt;h3 id=&amp;quot;p-toc-label&amp;quot; class=&amp;quot;vector-menu-heading&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;#039;).append(&lt;br /&gt;
            $(&amp;#039;&amp;lt;span class=&amp;quot;vector-menu-heading-label&amp;quot;&amp;gt;&amp;#039;).text(i18n.header)&lt;br /&gt;
        ).on(&amp;quot;keypress&amp;quot;, function(event) {&lt;br /&gt;
            if (event.which == 13) {&lt;br /&gt;
                $(this).trigger(&amp;quot;click&amp;quot;);&lt;br /&gt;
                event.stopImmediatePropagation();&lt;br /&gt;
            }&lt;br /&gt;
        }).on(&amp;quot;click&amp;quot;, function(event) {&lt;br /&gt;
            var $el = $(this).parent();&lt;br /&gt;
            event.stopPropagation();&lt;br /&gt;
            $el.toggleClass(&amp;quot;collapsed&amp;quot;);&lt;br /&gt;
            if($el.hasClass(&amp;quot;collapsed&amp;quot;)){&lt;br /&gt;
                localStorage.setItem(&amp;quot;sidebar_vector_c_p-toc&amp;quot;, &amp;quot;y&amp;quot;);&lt;br /&gt;
                $el.find(&amp;quot;.vector-menu-content&amp;quot;).slideUp(&amp;quot;fast&amp;quot;);&lt;br /&gt;
                $el.css({&amp;#039;margin-right&amp;#039;: &amp;#039;&amp;#039;, &amp;#039;margin-left&amp;#039;: &amp;#039;&amp;#039;});&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                localStorage.setItem(&amp;quot;sidebar_vector_c_p-toc&amp;quot;, &amp;quot;n&amp;quot;);&lt;br /&gt;
                $el.find(&amp;quot;.vector-menu-content&amp;quot;).slideDown(&amp;quot;fast&amp;quot;);&lt;br /&gt;
                var $toc = $el.find(&amp;quot;.vector-menu-content-list&amp;quot;)[0];&lt;br /&gt;
                if ($toc.clientWidth &amp;lt; $toc.scrollWidth) {&lt;br /&gt;
                    $el.css({&amp;#039;margin-right&amp;#039;: &amp;#039;0&amp;#039;, &amp;#039;margin-left&amp;#039;: &amp;#039;0&amp;#039;});&lt;br /&gt;
                }&lt;br /&gt;
                if (window.innerWidth &amp;gt;= 982 &amp;amp;&amp;amp; $toc.clientWidth &amp;lt; $toc.scrollWidth) {&lt;br /&gt;
                    $el.css({&amp;#039;margin-right&amp;#039;: &amp;#039;-0.5em&amp;#039;, &amp;#039;margin-left&amp;#039;: &amp;#039;-0.5em&amp;#039;});&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }),&lt;br /&gt;
        $(&amp;#039;&amp;lt;div class=&amp;quot;vector-menu-content&amp;quot;&amp;gt;&amp;#039;).append(&lt;br /&gt;
            $(&amp;#039;&amp;lt;ul class=&amp;quot;vector-menu-content-list&amp;quot;&amp;gt;&amp;#039;).append(&lt;br /&gt;
                $(&amp;#039;&amp;lt;li class=&amp;quot;toclevel-1 tocsection-0&amp;quot;&amp;gt;&amp;#039;).append($(&amp;#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039;).append(&lt;br /&gt;
                    $(&amp;#039;&amp;lt;span class=&amp;quot;toctext&amp;quot;&amp;gt;&amp;#039;).text(i18n.top)&lt;br /&gt;
                )),&lt;br /&gt;
                $(&amp;#039;#toc &amp;gt; ul&amp;#039;).children().clone()&lt;br /&gt;
            )&lt;br /&gt;
        ).addClass($(&amp;#039;#toc&amp;#039;).parent().prop(&amp;#039;class&amp;#039;).split(/\s+/).filter(function(classname) {&lt;br /&gt;
            return classname.startsWith(&amp;#039;toc-&amp;#039;);&lt;br /&gt;
        }).join(&amp;#039; &amp;#039;)).css(&amp;#039;display&amp;#039;, tocCollapsed ? &amp;#039;none&amp;#039; : &amp;#039;&amp;#039;)&lt;br /&gt;
    ).addClass(tocCollapsed ? &amp;#039;collapsed&amp;#039; : &amp;#039;&amp;#039;).appendTo(&amp;#039;#mw-panel&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    mw.loader.using( [&amp;#039;ext.gadget.sectionObserver&amp;#039;], function(require) {&lt;br /&gt;
        var initSectionObserver = require(&amp;#039;ext.gadget.sectionObserver&amp;#039;);&lt;br /&gt;
        var allSections = document.querySelectorAll(&amp;#039;#firstHeading, #profile-top, .mw-headline&amp;#039;);&lt;br /&gt;
        var sectionObserver = initSectionObserver({topMargin: 20, onIntersection: onIntersection});&lt;br /&gt;
        sectionObserver.setElements(allSections);&lt;br /&gt;
        sectionObserver.calcIntersection();&lt;br /&gt;
        &lt;br /&gt;
        allSections = Array.from(allSections);&lt;br /&gt;
        var tocList = $(&amp;#039;#p-toc .vector-menu-content-list&amp;#039;)[0];&lt;br /&gt;
        var tocSections = $(&amp;#039;#p-toc .vector-menu-content-list li&amp;#039;);&lt;br /&gt;
        var baseOffset = $(&amp;#039;#p-toc .tocsection-0 .toctext&amp;#039;)[0].offsetTop;&lt;br /&gt;
        &lt;br /&gt;
        function onIntersection(section) {&lt;br /&gt;
            var index = allSections.indexOf(section);&lt;br /&gt;
            $(&amp;#039;#p-toc .tocsection-current&amp;#039;).removeClass(&amp;#039;tocsection-current&amp;#039;);&lt;br /&gt;
            var tocSection = tocSections.eq(index).addClass(&amp;#039;tocsection-current&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
            // Calculate the position of the ToC item within the ToC container&lt;br /&gt;
            var tocItemOffsetTop = tocSection[0].offsetTop - tocList.offsetTop;&lt;br /&gt;
            var tocItemHeight = tocSection.outerHeight();&lt;br /&gt;
        &lt;br /&gt;
            // Adjust the ToC container&amp;#039;s scrollTop to ensure the item is visible&lt;br /&gt;
            if (tocItemOffsetTop &amp;lt; tocList.scrollTop) {&lt;br /&gt;
                // If the item is above the visible area, scroll up to it&lt;br /&gt;
                tocList.scrollTop = tocItemOffsetTop - tocItemHeight;&lt;br /&gt;
            } else if (tocItemOffsetTop + tocItemHeight &amp;gt; tocList.scrollTop + tocList.clientHeight) {&lt;br /&gt;
                // If the item is below the visible area, scroll down to it&lt;br /&gt;
                tocList.scrollTop = tocItemOffsetTop + tocItemHeight - tocList.clientHeight;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Helper function to check if an element is in the viewport within its container&lt;br /&gt;
        function isElementInViewport(el) {&lt;br /&gt;
            var rect = el.getBoundingClientRect();&lt;br /&gt;
            return (&lt;br /&gt;
                rect.top &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
                rect.left &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
                rect.bottom &amp;lt;= (window.innerHeight || document.documentElement.clientHeight) &amp;amp;&amp;amp;&lt;br /&gt;
                rect.right &amp;lt;= (window.innerWidth || document.documentElement.clientWidth)&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Vizzys</name></author>
	</entry>
</feed>