<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-TwinkleMobile.js</id>
	<title>MediaWiki:Gadget-TwinkleMobile.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-TwinkleMobile.js"/>
	<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=MediaWiki:Gadget-TwinkleMobile.js&amp;action=history"/>
	<updated>2026-11-07T10:11:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://en.bharatpedia.org/w/index.php?title=MediaWiki:Gadget-TwinkleMobile.js&amp;diff=732440&amp;oldid=prev</id>
		<title>Bharatwiki Socrates: Twinkle mobile adapter: on-screen panel for the Minerva skin</title>
		<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=MediaWiki:Gadget-TwinkleMobile.js&amp;diff=732440&amp;oldid=prev"/>
		<updated>2026-11-01T00:10:01Z</updated>

		<summary type="html">&lt;p&gt;Twinkle mobile adapter: on-screen panel for the Minerva skin&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// TwinkleMobile adapter&lt;br /&gt;
// Makes Twinkle usable in the mobile view (Minerva skin).&lt;br /&gt;
//&lt;br /&gt;
// Why this is needed: Twinkle adds its menu links to the portlet&lt;br /&gt;
// &amp;quot;p-cactions&amp;quot;. Desktop skins render that portlet, but Minerva does&lt;br /&gt;
// not render it at all, so on mobile the links used to have nowhere&lt;br /&gt;
// to appear and Twinkle seemed missing.&lt;br /&gt;
//&lt;br /&gt;
// What this does (Minerva skin only):&lt;br /&gt;
//  * Creates the missing &amp;quot;p-cactions&amp;quot; portlet as a floating panel.&lt;br /&gt;
//  * Adds a &amp;quot;Twinkle&amp;quot; entry to the page actions (&amp;quot;More&amp;quot;) menu.&lt;br /&gt;
//    Tapping it closes the menu and opens the panel on screen with&lt;br /&gt;
//    all Twinkle options (the same behaviour as the desktop menu).&lt;br /&gt;
//  * On pages without that menu, a floating &amp;quot;TW&amp;quot; button opens the&lt;br /&gt;
//    panel instead.&lt;br /&gt;
//  * Sizes Twinkle dialogs so they fit a phone screen.&lt;br /&gt;
// On every other skin this script does nothing.&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
	if ( mw.config.get( &amp;#039;skin&amp;#039; ) !== &amp;#039;minerva&amp;#039; ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.util.addCSS(&lt;br /&gt;
		&amp;#039;.ui-dialog { max-width: 96vw !important; left: 2vw !important; }&amp;#039; +&lt;br /&gt;
		&amp;#039;.morebits-dialog { max-width: 96vw !important; }&amp;#039; +&lt;br /&gt;
		&amp;#039;.morebits-dialog-content { overflow-x: auto; }&amp;#039; +&lt;br /&gt;
		&amp;#039;.select2-container { max-width: 90vw; }&amp;#039; +&lt;br /&gt;
		&amp;#039;#p-cactions.twinkle-mobile-panel { position: fixed;&amp;#039; +&lt;br /&gt;
		&amp;#039; top: 52px; left: 2vw; width: 96vw; max-height: 72vh;&amp;#039; +&lt;br /&gt;
		&amp;#039; overflow-y: auto; z-index: 999; background: #fff;&amp;#039; +&lt;br /&gt;
		&amp;#039; border: 1px solid #a2a9b1; border-radius: 4px;&amp;#039; +&lt;br /&gt;
		&amp;#039; box-shadow: 0 4px 16px rgba(0,0,0,0.35); padding: 0 0 6px; }&amp;#039; +&lt;br /&gt;
		&amp;#039;#p-cactions.twinkle-mobile-panel ul { list-style: none;&amp;#039; +&lt;br /&gt;
		&amp;#039; margin: 0; padding: 0; }&amp;#039; +&lt;br /&gt;
		&amp;#039;#p-cactions.twinkle-mobile-panel li a { display: block;&amp;#039; +&lt;br /&gt;
		&amp;#039; padding: 12px 16px; color: #202122; text-decoration: none;&amp;#039; +&lt;br /&gt;
		&amp;#039; font-size: 1em; border-top: 1px solid #eaecf0; }&amp;#039; +&lt;br /&gt;
		&amp;#039;#p-cactions.twinkle-mobile-panel li a:active {&amp;#039; +&lt;br /&gt;
		&amp;#039; background: #eaecf0; }&amp;#039; +&lt;br /&gt;
		&amp;#039;.twinkle-panel-head { display: flex;&amp;#039; +&lt;br /&gt;
		&amp;#039; justify-content: space-between; align-items: center;&amp;#039; +&lt;br /&gt;
		&amp;#039; padding: 10px 16px; font-weight: bold; }&amp;#039; +&lt;br /&gt;
		&amp;#039;.twinkle-panel-close { background: none; border: 0;&amp;#039; +&lt;br /&gt;
		&amp;#039; font-size: 20px; line-height: 1; padding: 4px 8px;&amp;#039; +&lt;br /&gt;
		&amp;#039; cursor: pointer; }&amp;#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	var panel = null;&lt;br /&gt;
	function togglePanel( show ) {&lt;br /&gt;
		if ( panel ) {&lt;br /&gt;
			panel.style.display = show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	function closeOverflow() {&lt;br /&gt;
		var cb = document.getElementById(&lt;br /&gt;
			&amp;#039;page-actions-overflow-checkbox&amp;#039; );&lt;br /&gt;
		if ( cb ) {&lt;br /&gt;
			cb.checked = false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function createPortlet() {&lt;br /&gt;
		var existing = document.getElementById( &amp;#039;p-cactions&amp;#039; );&lt;br /&gt;
		if ( existing ) {&lt;br /&gt;
			panel = existing;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( !document.body ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		// The floating panel IS the p-cactions portlet.&lt;br /&gt;
		panel = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
		panel.id = &amp;#039;p-cactions&amp;#039;;&lt;br /&gt;
		panel.className = &amp;#039;twinkle-mobile-panel&amp;#039;;&lt;br /&gt;
		panel.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
		var head = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
		head.className = &amp;#039;twinkle-panel-head&amp;#039;;&lt;br /&gt;
		var title = document.createElement( &amp;#039;span&amp;#039; );&lt;br /&gt;
		title.textContent = &amp;#039;Twinkle&amp;#039;;&lt;br /&gt;
		var closeBtn = document.createElement( &amp;#039;button&amp;#039; );&lt;br /&gt;
		closeBtn.className = &amp;#039;twinkle-panel-close&amp;#039;;&lt;br /&gt;
		closeBtn.textContent = &amp;#039;×&amp;#039;;&lt;br /&gt;
		closeBtn.addEventListener( &amp;#039;click&amp;#039;, function () {&lt;br /&gt;
			togglePanel( false );&lt;br /&gt;
		} );&lt;br /&gt;
		head.appendChild( title );&lt;br /&gt;
		head.appendChild( closeBtn );&lt;br /&gt;
		panel.appendChild( head );&lt;br /&gt;
		panel.appendChild( document.createElement( &amp;#039;ul&amp;#039; ) );&lt;br /&gt;
		document.body.appendChild( panel );&lt;br /&gt;
		// Tapping a module link closes the panel (its dialog opens).&lt;br /&gt;
		panel.addEventListener( &amp;#039;click&amp;#039;, function ( e ) {&lt;br /&gt;
			if ( e.target.closest( &amp;#039;li a&amp;#039; ) &amp;amp;&amp;amp;&lt;br /&gt;
				!e.target.closest( &amp;#039;.twinkle-panel-head&amp;#039; ) ) {&lt;br /&gt;
				togglePanel( false );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		// Entry inside the More (overflow) menu toggles the panel.&lt;br /&gt;
		var overflow = document.querySelector( &amp;#039;ul#p-tb&amp;#039; ) ||&lt;br /&gt;
			document.querySelector( &amp;#039;.page-actions-overflow-list&amp;#039; );&lt;br /&gt;
		if ( overflow ) {&lt;br /&gt;
			var li = document.createElement( &amp;#039;li&amp;#039; );&lt;br /&gt;
			li.className = &amp;#039;toggle-list-item&amp;#039;;&lt;br /&gt;
			var a = document.createElement( &amp;#039;a&amp;#039; );&lt;br /&gt;
			a.className = &amp;#039;toggle-list-item__anchor&amp;#039;;&lt;br /&gt;
			a.href = &amp;#039;#&amp;#039;;&lt;br /&gt;
			var label = document.createElement( &amp;#039;span&amp;#039; );&lt;br /&gt;
			label.className = &amp;#039;toggle-list-item__label&amp;#039;;&lt;br /&gt;
			label.textContent = &amp;#039;Twinkle&amp;#039;;&lt;br /&gt;
			a.appendChild( label );&lt;br /&gt;
			a.addEventListener( &amp;#039;click&amp;#039;, function ( e ) {&lt;br /&gt;
				e.preventDefault();&lt;br /&gt;
				closeOverflow();&lt;br /&gt;
				togglePanel( true );&lt;br /&gt;
			} );&lt;br /&gt;
			li.appendChild( a );&lt;br /&gt;
			overflow.appendChild( li );&lt;br /&gt;
		} else {&lt;br /&gt;
			// Fallback: floating TW button toggles the panel.&lt;br /&gt;
			var btn = document.createElement( &amp;#039;button&amp;#039; );&lt;br /&gt;
			btn.textContent = &amp;#039;TW&amp;#039;;&lt;br /&gt;
			btn.style.cssText = &amp;#039;position:fixed;right:12px;&amp;#039; +&lt;br /&gt;
				&amp;#039;bottom:64px;z-index:998;padding:10px 14px;&amp;#039; +&lt;br /&gt;
				&amp;#039;border-radius:20px;background:#202122;color:#fff;&amp;#039; +&lt;br /&gt;
				&amp;#039;border:0;&amp;#039;;&lt;br /&gt;
			btn.addEventListener( &amp;#039;click&amp;#039;, function () {&lt;br /&gt;
				togglePanel( panel.style.display === &amp;#039;none&amp;#039; );&lt;br /&gt;
			} );&lt;br /&gt;
			document.body.appendChild( btn );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Run immediately and again when the DOM is ready, whichever&lt;br /&gt;
	// comes first wins; the portlet must exist before Twinkle adds&lt;br /&gt;
	// its links.&lt;br /&gt;
	createPortlet();&lt;br /&gt;
	$( createPortlet );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Bharatwiki Socrates</name></author>
	</entry>
</feed>