<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dev.anandamakaranda.in/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-readerchrome.js</id>
	<title>MediaWiki:Gadget-readerchrome.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://dev.anandamakaranda.in/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-readerchrome.js"/>
	<link rel="alternate" type="text/html" href="https://dev.anandamakaranda.in/index.php?title=MediaWiki:Gadget-readerchrome.js&amp;action=history"/>
	<updated>2026-08-03T19:08:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://dev.anandamakaranda.in/index.php?title=MediaWiki:Gadget-readerchrome.js&amp;diff=6936&amp;oldid=prev</id>
		<title>Vaishnavi at 18:10, 2 July 2026</title>
		<link rel="alternate" type="text/html" href="https://dev.anandamakaranda.in/index.php?title=MediaWiki:Gadget-readerchrome.js&amp;diff=6936&amp;oldid=prev"/>
		<updated>2026-07-02T18:10:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://dev.anandamakaranda.in/index.php?title=MediaWiki:Gadget-readerchrome.js&amp;amp;diff=6936&amp;amp;oldid=6935&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Vaishnavi</name></author>
	</entry>
	<entry>
		<id>https://dev.anandamakaranda.in/index.php?title=MediaWiki:Gadget-readerchrome.js&amp;diff=6935&amp;oldid=prev</id>
		<title>Vaishnavi: Created page with &quot;/**  * readerChrome.js — site-wide reader chrome (NOT part of the editor).  *  * Provides two always-available reader aids that used to live inside the  * Editor extension&#039;s siteNav.js:  *   • [📚] document navigator  (bottom-right FAB + panel)  *   • [↑]  scroll-to-top       (appears after 300px scroll)  *  * Why it&#039;s separate from the editor: these are reading aids, useful on every  * page for every visitor — they have nothing to do with editing. Keeping th...&quot;</title>
		<link rel="alternate" type="text/html" href="https://dev.anandamakaranda.in/index.php?title=MediaWiki:Gadget-readerchrome.js&amp;diff=6935&amp;oldid=prev"/>
		<updated>2026-07-02T17:55:23Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;/**  * readerChrome.js — site-wide reader chrome (NOT part of the editor).  *  * Provides two always-available reader aids that used to live inside the  * Editor extension&amp;#039;s siteNav.js:  *   • [📚] document navigator  (bottom-right FAB + panel)  *   • [↑]  scroll-to-top       (appears after 300px scroll)  *  * Why it&amp;#039;s separate from the editor: these are reading aids, useful on every  * page for every visitor — they have nothing to do with editing. Keeping th...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * readerChrome.js — site-wide reader chrome (NOT part of the editor).&lt;br /&gt;
 *&lt;br /&gt;
 * Provides two always-available reader aids that used to live inside the&lt;br /&gt;
 * Editor extension&amp;#039;s siteNav.js:&lt;br /&gt;
 *   • [📚] document navigator  (bottom-right FAB + panel)&lt;br /&gt;
 *   • [↑]  scroll-to-top       (appears after 300px scroll)&lt;br /&gt;
 *&lt;br /&gt;
 * Why it&amp;#039;s separate from the editor: these are reading aids, useful on every&lt;br /&gt;
 * page for every visitor — they have nothing to do with editing. Keeping them&lt;br /&gt;
 * in the editor module meant they only made sense in edit context and leaked&lt;br /&gt;
 * onto all pages awkwardly. This module owns them, loads site-wide, and the&lt;br /&gt;
 * editor no longer touches them.&lt;br /&gt;
 *&lt;br /&gt;
 * Docslist is DERIVED from the JSON: namespace (NS 3000): every document has a&lt;br /&gt;
 * JSON: page, so listing that namespace is the authoritative, self-maintaining&lt;br /&gt;
 * document list. When the editor creates a new document (writes its JSON page),&lt;br /&gt;
 * it appears here automatically — no hardcoded list to maintain.&lt;br /&gt;
 *&lt;br /&gt;
 * Install: add as a Gadget (or load via MediaWiki:Common.js /&lt;br /&gt;
 * wgResourceModules) so it runs on every page. Requires jQuery + mediawiki.util&lt;br /&gt;
 * (both default). The FAB image /images/docs.svg is optional (emoji fallback).&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	/* The JSON: namespace id — the authoritative document catalogue. */&lt;br /&gt;
	var JSON_NS = 3000;&lt;br /&gt;
&lt;br /&gt;
	function boot() {&lt;br /&gt;
		if ( document.getElementById( &amp;#039;se-docnav&amp;#039; ) ) return;&lt;br /&gt;
&lt;br /&gt;
		var FAB_BG       = &amp;#039;#c0521a&amp;#039;;&lt;br /&gt;
		var FAB_BG_HOVER = &amp;#039;#a0410e&amp;#039;;&lt;br /&gt;
		var FAB_RIGHT    = &amp;#039;20px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		/* ── Styles (scoped, class-based, no page-CSS dependency) ─────── */&lt;br /&gt;
		var css = [&lt;br /&gt;
			&amp;#039;#se-docnav-btn{&amp;#039;,&lt;br /&gt;
			&amp;#039;  position:fixed;bottom:22px;right:&amp;#039; + FAB_RIGHT + &amp;#039;;z-index:9998;&amp;#039;,&lt;br /&gt;
			&amp;#039;  width:48px;height:48px;border-radius:50%;&amp;#039;,&lt;br /&gt;
			&amp;#039;  background:&amp;#039; + FAB_BG + &amp;#039;;border:none;cursor:pointer;padding:0;&amp;#039;,&lt;br /&gt;
			&amp;#039;  box-shadow:0 3px 12px rgba(0,0,0,0.22);&amp;#039;,&lt;br /&gt;
			&amp;#039;  display:flex;align-items:center;justify-content:center;&amp;#039;,&lt;br /&gt;
			&amp;#039;  transition:background .15s,transform .15s,box-shadow .15s;user-select:none;&amp;#039;,&lt;br /&gt;
			&amp;#039;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav-btn:hover{background:&amp;#039; + FAB_BG_HOVER + &amp;#039;;transform:scale(1.07);box-shadow:0 4px 16px rgba(0,0,0,0.3);}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav-btn .se-fab-img{width:22px;height:22px;filter:brightness(0) invert(1);display:block;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav-btn .se-fab-emoji{font-size:20px;line-height:1;}&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
			&amp;#039;#se-scrolltop{&amp;#039;,&lt;br /&gt;
			&amp;#039;  position:fixed;bottom:78px;right:&amp;#039; + FAB_RIGHT + &amp;#039;;z-index:9997;&amp;#039;,&lt;br /&gt;
			&amp;#039;  width:48px;height:48px;border-radius:50%;&amp;#039;,&lt;br /&gt;
			&amp;#039;  background:&amp;#039; + FAB_BG + &amp;#039;;border:none;cursor:pointer;padding:0;&amp;#039;,&lt;br /&gt;
			&amp;#039;  box-shadow:0 3px 12px rgba(0,0,0,0.22);&amp;#039;,&lt;br /&gt;
			&amp;#039;  display:flex;align-items:center;justify-content:center;&amp;#039;,&lt;br /&gt;
			&amp;#039;  opacity:0;pointer-events:none;&amp;#039;,&lt;br /&gt;
			&amp;#039;  transition:opacity .25s,transform .15s,background .15s;transform:translateY(8px);&amp;#039;,&lt;br /&gt;
			&amp;#039;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-scrolltop.se-scrolltop-visible{opacity:1;pointer-events:auto;transform:translateY(0);}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-scrolltop:hover{background:&amp;#039; + FAB_BG_HOVER + &amp;#039;;transform:scale(1.07);}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-scrolltop svg{pointer-events:none;}&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
			&amp;#039;#se-docnav-btn .se-tip,#se-scrolltop .se-tip{&amp;#039;,&lt;br /&gt;
			&amp;#039;  position:absolute;right:calc(100% + 10px);top:50%;transform:translateY(-50%);&amp;#039;,&lt;br /&gt;
			&amp;#039;  white-space:nowrap;background:rgba(30,30,30,.82);color:#fff;&amp;#039;,&lt;br /&gt;
			&amp;#039;  font-size:11px;font-family:system-ui,sans-serif;font-weight:500;&amp;#039;,&lt;br /&gt;
			&amp;#039;  padding:3px 9px;border-radius:999px;pointer-events:none;opacity:0;transition:opacity .18s;&amp;#039;,&lt;br /&gt;
			&amp;#039;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav-btn:hover .se-tip,#se-scrolltop:hover .se-tip{opacity:1;}&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
			&amp;#039;#se-docnav{&amp;#039;,&lt;br /&gt;
			&amp;#039;  position:fixed;bottom:134px;right:&amp;#039; + FAB_RIGHT + &amp;#039;;z-index:9999;&amp;#039;,&lt;br /&gt;
			&amp;#039;  width:300px;max-height:calc(100vh - 164px);&amp;#039;,&lt;br /&gt;
			&amp;#039;  background:#fff;border-radius:14px;&amp;#039;,&lt;br /&gt;
			&amp;#039;  box-shadow:0 8px 32px rgba(0,0,0,0.18),0 1.5px 4px rgba(0,0,0,0.08);&amp;#039;,&lt;br /&gt;
			&amp;#039;  border:0.5px solid #e0e0e0;&amp;#039;,&lt;br /&gt;
			&amp;#039;  display:none;flex-direction:column;overflow:hidden;&amp;#039;,&lt;br /&gt;
			&amp;#039;  font-family:system-ui,sans-serif;transform-origin:bottom right;animation:se-dn-pop .18s ease;&amp;#039;,&lt;br /&gt;
			&amp;#039;}&amp;#039;,&lt;br /&gt;
			&amp;#039;@keyframes se-dn-pop{from{opacity:0;transform:scale(.93) translateY(6px)}to{opacity:1;transform:none}}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav.se-dn-open{display:flex;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-head{display:flex;align-items:center;justify-content:space-between;padding:13px 16px 10px;border-bottom:.5px solid #eee;flex-shrink:0;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-head-title{font-size:13px;font-weight:700;color:#1a2e40;letter-spacing:.01em;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-close{background:none;border:none;cursor:pointer;padding:2px 5px;font-size:16px;color:#999;line-height:1;border-radius:4px;transition:background .12s,color .12s;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-close:hover{background:#f1f3f4;color:#333;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-search{padding:9px 12px;border-bottom:.5px solid #eee;flex-shrink:0;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-search input{width:100%;padding:6px 10px;border:.5px solid #ddd;border-radius:8px;font-size:13px;font-family:inherit;color:#333;outline:none;box-sizing:border-box;transition:border-color .15s;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-search input:focus{border-color:&amp;#039; + FAB_BG + &amp;#039;;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-list{overflow-y:auto;flex:1;padding:6px 0;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-item{display:flex;align-items:center;gap:10px;padding:9px 16px;cursor:pointer;font-size:13.5px;color:#222;border-left:3px solid transparent;transition:background .1s,border-color .1s;text-decoration:none;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-item:hover{background:#fdf3ed;border-left-color:&amp;#039; + FAB_BG + &amp;#039;;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-item.se-dn-current{background:#fdf3ed;border-left-color:&amp;#039; + FAB_BG + &amp;#039;;font-weight:600;color:&amp;#039; + FAB_BG + &amp;#039;;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-icon{font-size:15px;flex-shrink:0;opacity:.7;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-status{padding:18px 16px;text-align:center;color:#999;font-size:13px;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-footer{border-top:.5px solid #eee;flex-shrink:0;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-footer a{display:flex;align-items:center;gap:8px;padding:10px 16px;font-size:12.5px;color:#666;text-decoration:none;transition:background .12s,color .12s;}&amp;#039;,&lt;br /&gt;
			&amp;#039;#se-docnav .se-dn-footer a:hover{background:#fdf3ed;color:&amp;#039; + FAB_BG + &amp;#039;;}&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
			&amp;#039;@media(max-width:768px){&amp;#039;,&lt;br /&gt;
			&amp;#039;  #se-docnav-btn{bottom:18px;right:16px;width:44px;height:44px;}&amp;#039;,&lt;br /&gt;
			&amp;#039;  #se-scrolltop{bottom:74px;right:16px;width:44px;height:44px;}&amp;#039;,&lt;br /&gt;
			&amp;#039;  #se-docnav{right:16px;width:calc(100vw - 32px);bottom:128px;}&amp;#039;,&lt;br /&gt;
			&amp;#039;}&amp;#039;,&lt;br /&gt;
			&amp;#039;@media print{#se-docnav,#se-docnav-btn,#se-scrolltop{display:none!important}}&amp;#039;&lt;br /&gt;
		].join( &amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
		var styleEl = document.createElement( &amp;#039;style&amp;#039; );&lt;br /&gt;
		styleEl.id  = &amp;#039;se-readerchrome-css&amp;#039;;&lt;br /&gt;
		styleEl.textContent = css;&lt;br /&gt;
		document.head.appendChild( styleEl );&lt;br /&gt;
&lt;br /&gt;
		/* ── Build DOM ───────────────────────────────────────── */&lt;br /&gt;
		var mainPage = ( mw.config.get( &amp;#039;wgArticlePath&amp;#039; ) || &amp;#039;/wiki/$1&amp;#039; )&lt;br /&gt;
			.replace( &amp;#039;$1&amp;#039;, encodeURIComponent( mw.config.get( &amp;#039;wgMainPageTitle&amp;#039; ) || &amp;#039;Main_Page&amp;#039; ) );&lt;br /&gt;
		var currentTitle = mw.config.get( &amp;#039;wgPageName&amp;#039; ) || &amp;#039;&amp;#039;;&lt;br /&gt;
		var currentRoot  = currentTitle.split( &amp;#039;/&amp;#039; )[ 0 ];&lt;br /&gt;
&lt;br /&gt;
		var panel = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
		panel.id  = &amp;#039;se-docnav&amp;#039;;&lt;br /&gt;
		panel.innerHTML = [&lt;br /&gt;
			&amp;#039;&amp;lt;div class=&amp;quot;se-dn-head&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;  &amp;lt;span class=&amp;quot;se-dn-head-title&amp;quot;&amp;gt;📚 Documents&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;  &amp;lt;button class=&amp;quot;se-dn-close&amp;quot; title=&amp;quot;Close&amp;quot;&amp;gt;✕&amp;lt;/button&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;&amp;lt;div class=&amp;quot;se-dn-search&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; placeholder=&amp;quot;Search documents…&amp;quot; id=&amp;quot;se-dn-input&amp;quot; autocomplete=&amp;quot;off&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;&amp;lt;div class=&amp;quot;se-dn-list&amp;quot; id=&amp;quot;se-dn-list&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;se-dn-status&amp;quot;&amp;gt;Loading…&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;&amp;lt;div class=&amp;quot;se-dn-footer&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + mainPage + &amp;#039;&amp;quot;&amp;gt;⌂&amp;amp;ensp;Go to Main Page&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		].join( &amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
		var triggerBtn = document.createElement( &amp;#039;button&amp;#039; );&lt;br /&gt;
		triggerBtn.id    = &amp;#039;se-docnav-btn&amp;#039;;&lt;br /&gt;
		triggerBtn.title = &amp;#039;Browse documents&amp;#039;;&lt;br /&gt;
		triggerBtn.setAttribute( &amp;#039;aria-label&amp;#039;, &amp;#039;Browse documents&amp;#039; );&lt;br /&gt;
		triggerBtn.innerHTML =&lt;br /&gt;
			&amp;#039;&amp;lt;img class=&amp;quot;se-fab-img&amp;quot; src=&amp;quot;/images/docs.svg&amp;quot; alt=&amp;quot;&amp;quot; aria-hidden=&amp;quot;true&amp;quot; &amp;#039; +&lt;br /&gt;
			&amp;#039;     onerror=&amp;quot;this.outerHTML=\&amp;#039;&amp;lt;span class=&amp;amp;quot;se-fab-emoji&amp;amp;quot; aria-hidden=&amp;amp;quot;true&amp;amp;quot;&amp;gt;📚&amp;lt;/span&amp;gt;\&amp;#039;&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;se-tip&amp;quot;&amp;gt;Browse documents&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		var scrollBtn = document.createElement( &amp;#039;button&amp;#039; );&lt;br /&gt;
		scrollBtn.id    = &amp;#039;se-scrolltop&amp;#039;;&lt;br /&gt;
		scrollBtn.title = &amp;#039;Back to top&amp;#039;;&lt;br /&gt;
		scrollBtn.setAttribute( &amp;#039;aria-label&amp;#039;, &amp;#039;Scroll to top&amp;#039; );&lt;br /&gt;
		scrollBtn.innerHTML =&lt;br /&gt;
			&amp;#039;&amp;lt;svg width=&amp;quot;20&amp;quot; height=&amp;quot;20&amp;quot; viewBox=&amp;quot;0 0 20 20&amp;quot; fill=&amp;quot;none&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
			&amp;#039;  &amp;lt;path d=&amp;quot;M10 3.5L3.5 11H7.5V16.5H12.5V11H16.5L10 3.5Z&amp;quot; fill=&amp;quot;white&amp;quot;/&amp;gt;&amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;/svg&amp;gt;&amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;se-tip&amp;quot;&amp;gt;Back to top&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		document.body.appendChild( panel );&lt;br /&gt;
		document.body.appendChild( triggerBtn );&lt;br /&gt;
		document.body.appendChild( scrollBtn );&lt;br /&gt;
&lt;br /&gt;
		/* ── Docs logic — DERIVED from the JSON: namespace ───── */&lt;br /&gt;
		var allDocs = [], loaded = false, open = false;&lt;br /&gt;
&lt;br /&gt;
		function artPath( title ) {&lt;br /&gt;
			return ( mw.config.get( &amp;#039;wgArticlePath&amp;#039; ) || &amp;#039;/wiki/$1&amp;#039; ).replace( &amp;#039;$1&amp;#039;, title.replace( / /g, &amp;#039;_&amp;#039; ) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function renderList( filter ) {&lt;br /&gt;
			var list  = document.getElementById( &amp;#039;se-dn-list&amp;#039; );&lt;br /&gt;
			var q     = ( filter || &amp;#039;&amp;#039; ).toLowerCase().trim();&lt;br /&gt;
			var shown = q ? allDocs.filter( function ( d ) {&lt;br /&gt;
				return d.title.toLowerCase().indexOf( q ) !== -1 ||&lt;br /&gt;
					( d.display &amp;amp;&amp;amp; d.display.toLowerCase().indexOf( q ) !== -1 );&lt;br /&gt;
			} ) : allDocs;&lt;br /&gt;
			if ( !shown.length ) {&lt;br /&gt;
				list.innerHTML = &amp;#039;&amp;lt;div class=&amp;quot;se-dn-status&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
					( q ? &amp;#039;No results for &amp;quot;&amp;#039; + q + &amp;#039;&amp;quot;&amp;#039; : &amp;#039;No documents found.&amp;#039; ) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var html = &amp;#039;&amp;#039;;&lt;br /&gt;
			shown.forEach( function ( d ) {&lt;br /&gt;
				var cur = d.title === currentRoot;&lt;br /&gt;
				html += &amp;#039;&amp;lt;a class=&amp;quot;se-dn-item&amp;#039; + ( cur ? &amp;#039; se-dn-current&amp;#039; : &amp;#039;&amp;#039; ) + &amp;#039;&amp;quot; href=&amp;quot;&amp;#039; + d.href + &amp;#039;&amp;quot; title=&amp;quot;&amp;#039; + d.title + &amp;#039;&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
					&amp;#039;&amp;lt;span class=&amp;quot;se-dn-icon&amp;quot;&amp;gt;📖&amp;lt;/span&amp;gt;&amp;#039; +&lt;br /&gt;
					&amp;#039;&amp;lt;span class=&amp;quot;se-dn-name&amp;quot;&amp;gt;&amp;#039; + d.display + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; +&lt;br /&gt;
					( cur ? &amp;#039;&amp;lt;span style=&amp;quot;font-size:11px;color:&amp;#039; + FAB_BG + &amp;#039;;flex-shrink:0&amp;quot;&amp;gt;← here&amp;lt;/span&amp;gt;&amp;#039; : &amp;#039;&amp;#039; ) +&lt;br /&gt;
					&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
			} );&lt;br /&gt;
			list.innerHTML = html;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function loadDocs() {&lt;br /&gt;
			if ( loaded ) return;&lt;br /&gt;
			loaded = true;&lt;br /&gt;
			var accumulated = [];&lt;br /&gt;
			function fetchBatch( apcontinue ) {&lt;br /&gt;
				/* List the JSON: namespace — the authoritative doc catalogue.&lt;br /&gt;
				   Each JSON: page title IS a document slug, so new docs created&lt;br /&gt;
				   by the editor appear here automatically. */&lt;br /&gt;
				var params = {&lt;br /&gt;
					action: &amp;#039;query&amp;#039;, list: &amp;#039;allpages&amp;#039;,&lt;br /&gt;
					apnamespace: JSON_NS, aplimit: &amp;#039;max&amp;#039;, format: &amp;#039;json&amp;#039;&lt;br /&gt;
				};&lt;br /&gt;
				if ( apcontinue ) params.apcontinue = apcontinue;&lt;br /&gt;
				$.ajax( { url: mw.util.wikiScript( &amp;#039;api&amp;#039; ), data: params, dataType: &amp;#039;json&amp;#039; } )&lt;br /&gt;
					.then( function ( data ) {&lt;br /&gt;
						var pages = ( data.query &amp;amp;&amp;amp; data.query.allpages ) || [];&lt;br /&gt;
						pages.forEach( function ( p ) {&lt;br /&gt;
							/* p.title is like &amp;quot;JSON:Anuvyakhyana&amp;quot; — strip the ns&lt;br /&gt;
							   prefix to get the reader page slug. Only top-level&lt;br /&gt;
							   docs (no subpage slash after the slug). */&lt;br /&gt;
							var slug = p.title.replace( /^[^:]+:/, &amp;#039;&amp;#039; );&lt;br /&gt;
							if ( slug.indexOf( &amp;#039;/&amp;#039; ) === -1 ) {&lt;br /&gt;
								accumulated.push( {&lt;br /&gt;
									title: slug,&lt;br /&gt;
									display: slug.replace( /_/g, &amp;#039; &amp;#039; ),&lt;br /&gt;
									href: artPath( slug )&lt;br /&gt;
								} );&lt;br /&gt;
							}&lt;br /&gt;
						} );&lt;br /&gt;
						if ( data.continue &amp;amp;&amp;amp; data.continue.apcontinue ) {&lt;br /&gt;
							fetchBatch( data.continue.apcontinue );&lt;br /&gt;
						} else {&lt;br /&gt;
							accumulated.sort( function ( a, b ) { return a.title.localeCompare( b.title ); } );&lt;br /&gt;
							allDocs = accumulated;&lt;br /&gt;
							renderList( &amp;#039;&amp;#039; );&lt;br /&gt;
						}&lt;br /&gt;
					} ).fail( function () {&lt;br /&gt;
						var list = document.getElementById( &amp;#039;se-dn-list&amp;#039; );&lt;br /&gt;
						if ( list ) list.innerHTML = &amp;#039;&amp;lt;div class=&amp;quot;se-dn-status&amp;quot;&amp;gt;Could not load documents.&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
					} );&lt;br /&gt;
			}&lt;br /&gt;
			fetchBatch( null );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function openPanel() {&lt;br /&gt;
			open = true; panel.classList.add( &amp;#039;se-dn-open&amp;#039; ); loadDocs();&lt;br /&gt;
			setTimeout( function () { var i = document.getElementById( &amp;#039;se-dn-input&amp;#039; ); if ( i ) i.focus(); }, 60 );&lt;br /&gt;
		}&lt;br /&gt;
		function closePanel() { open = false; panel.classList.remove( &amp;#039;se-dn-open&amp;#039; ); }&lt;br /&gt;
&lt;br /&gt;
		triggerBtn.addEventListener( &amp;#039;click&amp;#039;, function ( e ) { e.stopPropagation(); open ? closePanel() : openPanel(); } );&lt;br /&gt;
		panel.querySelector( &amp;#039;.se-dn-close&amp;#039; ).addEventListener( &amp;#039;click&amp;#039;, closePanel );&lt;br /&gt;
		document.addEventListener( &amp;#039;click&amp;#039;, function ( e ) { if ( open &amp;amp;&amp;amp; !panel.contains( e.target ) &amp;amp;&amp;amp; e.target !== triggerBtn ) closePanel(); } );&lt;br /&gt;
		document.addEventListener( &amp;#039;input&amp;#039;, function ( e ) { if ( e.target &amp;amp;&amp;amp; e.target.id === &amp;#039;se-dn-input&amp;#039; ) renderList( e.target.value ); } );&lt;br /&gt;
		document.addEventListener( &amp;#039;keydown&amp;#039;, function ( e ) { if ( open &amp;amp;&amp;amp; ( e.key === &amp;#039;Escape&amp;#039; || e.keyCode === 27 ) ) closePanel(); } );&lt;br /&gt;
&lt;br /&gt;
		/* ── Scroll-to-top (window + Minerva #mw-mf-viewport) ── */&lt;br /&gt;
		var _scrollRaf = null;&lt;br /&gt;
		function updateScrollBtn( y ) { scrollBtn.classList.toggle( &amp;#039;se-scrolltop-visible&amp;#039;, y &amp;gt; 300 ); }&lt;br /&gt;
		function onWindowScroll() {&lt;br /&gt;
			if ( _scrollRaf ) return;&lt;br /&gt;
			_scrollRaf = requestAnimationFrame( function () {&lt;br /&gt;
				_scrollRaf = null;&lt;br /&gt;
				updateScrollBtn( window.scrollY || window.pageYOffset || 0 );&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
		function onViewportScroll() {&lt;br /&gt;
			if ( _scrollRaf ) return;&lt;br /&gt;
			_scrollRaf = requestAnimationFrame( function () {&lt;br /&gt;
				_scrollRaf = null;&lt;br /&gt;
				var vp = document.getElementById( &amp;#039;mw-mf-viewport&amp;#039; );&lt;br /&gt;
				updateScrollBtn( vp ? vp.scrollTop : 0 );&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
		scrollBtn.addEventListener( &amp;#039;click&amp;#039;, function () {&lt;br /&gt;
			var vp = document.getElementById( &amp;#039;mw-mf-viewport&amp;#039; );&lt;br /&gt;
			if ( vp &amp;amp;&amp;amp; vp.scrollTop &amp;gt; 0 ) { vp.scrollTo( { top: 0, behavior: &amp;#039;smooth&amp;#039; } ); }&lt;br /&gt;
			else { window.scrollTo( { top: 0, behavior: &amp;#039;smooth&amp;#039; } ); }&lt;br /&gt;
		} );&lt;br /&gt;
		window.addEventListener( &amp;#039;scroll&amp;#039;, onWindowScroll, { passive: true } );&lt;br /&gt;
		var _vpEl = document.getElementById( &amp;#039;mw-mf-viewport&amp;#039; );&lt;br /&gt;
		if ( _vpEl ) {&lt;br /&gt;
			_vpEl.addEventListener( &amp;#039;scroll&amp;#039;, onViewportScroll, { passive: true } );&lt;br /&gt;
		} else {&lt;br /&gt;
			setTimeout( function () {&lt;br /&gt;
				var vp = document.getElementById( &amp;#039;mw-mf-viewport&amp;#039; );&lt;br /&gt;
				if ( vp ) vp.addEventListener( &amp;#039;scroll&amp;#039;, onViewportScroll, { passive: true } );&lt;br /&gt;
			}, 500 );&lt;br /&gt;
		}&lt;br /&gt;
		onWindowScroll();&lt;br /&gt;
		onViewportScroll();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( window.mw &amp;amp;&amp;amp; mw.hook ) {&lt;br /&gt;
		mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( boot );&lt;br /&gt;
	} else if ( document.readyState === &amp;#039;loading&amp;#039; ) {&lt;br /&gt;
		document.addEventListener( &amp;#039;DOMContentLoaded&amp;#039;, boot );&lt;br /&gt;
	} else {&lt;br /&gt;
		boot();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Vaishnavi</name></author>
	</entry>
</feed>