MediaWiki:Mobile.js: Difference between revisions

Content deleted Content added
No edit summary
Tag: Manual revert
No edit summary
Tag: Reverted
Line 156:
}, { passive: true });
})();
/* Auto‑expand all H2 sections on mobile (Minerva + Vector 2022) */
(function (mw, $) {
// Only do this on narrow viewports (mobile-ish).
if (!matchMedia('(max-width: 760px)').matches) return;
 
// Expand any collapsed section controls inside article content
function expandAllSections(root) {
var scope = root || document;
 
// Strategy 1: click real toggles that MobileFrontend/Vector attach
scope.querySelectorAll(
// Collapsed toggles inside the article content
'.mw-parser-output [aria-expanded="false"], ' +
// …or the <section> wrapper itself (Parsoid/section wrapping)
'section[data-mw-section-id][aria-expanded="false"]'
).forEach(function (toggle) {
// Avoid menus or other UI; stick to the article area
if (!toggle.closest('.mw-parser-output')) return;
 
// Only click if it looks like a heading/section control
var isHeadingToggle =
toggle.closest('section[data-mw-section-id]') ||
toggle.closest('.mw-heading') ||
toggle.tagName.match(/^H[2-6]$/);
 
if (isHeadingToggle) {
// Prefer letting the skin/extension handle state via its own click
toggle.dispatchEvent(new MouseEvent('click', { bubbles: true }));
// Belt‑and‑suspenders: normalise state in case the click didn’t attach yet
toggle.setAttribute('aria-expanded', 'true');
toggle.classList.remove('is-collapsed', 'collapsible-heading-collapsed');
var sec = toggle.closest('section[data-mw-section-id]');
if (sec) {
sec.setAttribute('aria-expanded', 'true');
sec.classList.remove('is-collapsed');
}
}
});
 
// Strategy 2: if a section wrapper exists, ensure its first content block is visible
scope.querySelectorAll('section[data-mw-section-id]').forEach(function (sec) {
var contentAfterHeading =
// New heading wrapper (1.43+)
sec.querySelector('.mw-heading + *') ||
// Legacy structure
sec.querySelector('h2 + *');
if (contentAfterHeading) {
contentAfterHeading.style.removeProperty('display');
contentAfterHeading.style.removeProperty('height');
contentAfterHeading.style.removeProperty('overflow');
sec.setAttribute('aria-expanded', 'true');
}
});
}
 
// Run when page content is ready, plus a couple of retries because MF decorates async
mw.hook('wikipage.content').add(function ($content) {
var node = ($content && $content[0]) || document;
[0, 300, 900].forEach(function (delay) {
setTimeout(function () { expandAllSections(node); }, delay);
});
});
 
// If anything inserts new headings later (e.g., gadgets), expand those too
new MutationObserver(function (mutations) {
for (var m of mutations) {
if ([...m.addedNodes].some(function (n) {
return n.querySelector &&
(n.querySelector('[aria-expanded="false"]') ||
n.querySelector('section[data-mw-section-id]'));
})) {
expandAllSections();
break;
}
}
}).observe(document.documentElement, { childList: true, subtree: true });
 
})(mw, jQuery);