|
|
| Line 1: |
Line 1: |
| /* All JavaScript here will be loaded for users of the Citizen skin */ | | /* All JavaScript here will be loaded for users of the Citizen skin */ |
|
| |
|
| // Collapse specific headers by default on Desktop
| | // Helper: Expand any collapsed citizen-section containing the heading |
| mw.hook('wikipage.content').add(function($content) {
| |
| if (window.innerWidth >= 768) {
| |
| const idsToCollapse = [
| |
| 'Muling', 'Misc', 'Anti-ban', 'Anti-PK', 'Trip_Settings', 'Skills_Settings', 'Equipment'
| |
| ];
| |
| | |
| idsToCollapse.forEach(function(rawId) {
| |
| const id = rawId.replace(/ /g, "_");
| |
| const heading = document.getElementById(id);
| |
| | |
| if (!heading) return;
| |
| | |
| const sectionHeading = heading.closest('.citizen-section-heading');
| |
| const content = sectionHeading?.nextElementSibling;
| |
| | |
| if (content && content.classList.contains('citizen-section')) {
| |
| content.hidden = 'until-found'; // collapse by default
| |
| }
| |
| });
| |
| }
| |
| });
| |
| | |
| // Helper: Expand any collapsed parent citizen-section containing the heading | |
| function expandCitizenSectionFromHeading(heading) { | | function expandCitizenSectionFromHeading(heading) { |
| if (!heading) return; | | if (!heading) return; |
| Line 45: |
Line 22: |
| } | | } |
|
| |
|
| | // Helper: Scroll to a heading and adjust for Citizen header offset |
| | function scrollHeadingIntoView(heading) { |
| | if (!heading) return; |
| | heading.scrollIntoView({ behavior: 'smooth', block: 'start' }); |
| | setTimeout(() => { |
| | window.scrollBy(0, -80); // Adjust this value if your header is larger or smaller |
| | }, 100); |
| | } |
|
| |
|
| // === Handle direct URL loads with a hash (on page load) === | | // Collapse specific headers by default on Desktop |
| mw.hook('wikipage.content').add(function() { | | mw.hook('wikipage.content').add(function($content) { |
| if (window.innerWidth >= 768) { | | if (window.innerWidth >= 768) { |
| const hash = window.location.hash; | | const idsToCollapse = [ |
| if (hash && hash.length > 1) {
| | 'Muling', 'Misc', 'Anti-ban', 'Anti-PK', 'Trip_Settings', 'Skills_Settings', 'Equipment' |
| const headingId = decodeURIComponent(hash.substring(1)); | | ]; |
| setTimeout(() => {
| |
| const heading = document.getElementById(headingId);
| |
| if (heading) {
| |
| expandCitizenSectionFromHeading(heading);
| |
|
| |
|
| setTimeout(() => {
| | idsToCollapse.forEach(function(rawId) { |
| heading.scrollIntoView({ behavior: 'smooth', block: 'start' });
| | const id = rawId.replace(/ /g, "_"); |
| }, 50);
| | const heading = document.getElementById(id); |
| }
| |
| }, 100); | |
| }
| |
| }
| |
| });
| |
|
| |
|
| // === Hook into Citizen TOC (Contents Menu) clicks ===
| | if (!heading) return; |
| mw.hook('wikipage.content').add(function() {
| |
| if (window.innerWidth >= 768) {
| |
| mw.loader.using('skins.citizen.toc').then(function() {
| |
| const citizenToc = require('skins.citizen.toc');
| |
| const originalOnHeadingClick = citizenToc.props.onHeadingClick;
| |
|
| |
|
| citizenToc.props.onHeadingClick = function(id) { | | const sectionHeading = heading.closest('.citizen-section-heading'); |
| const headingId = id.replace(/^toc-/, '');
| | const content = sectionHeading?.nextElementSibling; |
| const heading = document.getElementById(headingId);
| |
| if (heading) {
| |
| expandCitizenSectionFromHeading(heading);
| |
|
| |
|
| setTimeout(() => {
| | if (content && content.classList.contains('citizen-section')) { |
| heading.scrollIntoView({ behavior: 'smooth', block: 'start' });
| | content.hidden = 'until-found'; // collapse by default |
| }, 50);
| | } |
| } | |
| | |
| if (originalOnHeadingClick) {
| |
| originalOnHeadingClick(id);
| |
| }
| |
| }; | |
| }); | | }); |
| } | | } |
| }); | | }); |
|
| |
|
| // === Safely intercept TOC clicks directly to fix expand timing === | | // === Handle direct URL loads with a hash (on page load) === |
| mw.hook('wikipage.content').add(function() { | | mw.hook('wikipage.content |
| if (window.innerWidth >= 768) {
| |
| setTimeout(() => { // Small delay to let TOC fully render
| |
| document.querySelectorAll('#mw-panel-toc a[href^="#"]').forEach(function(anchor) {
| |
| anchor.addEventListener('click', function(e) {
| |
| const hash = decodeURIComponent(this.getAttribute('href')).substring(1);
| |
| const heading = document.getElementById(hash);
| |
| | |
| if (heading) {
| |
| e.preventDefault(); // Prevent default browser jump
| |
| expandCitizenSectionFromHeading(heading);
| |
| | |
| setTimeout(() => {
| |
| heading.scrollIntoView({ behavior: 'smooth', block: 'start' });
| |
| }, 50);
| |
| }
| |
| });
| |
| });
| |
| }, 200);
| |
| }
| |
| });
| |