From 5b7ae33bb19df2a1df93334986524bc7449f4c66 Mon Sep 17 00:00:00 2001 From: bdkopen Date: Sat, 5 Apr 2025 00:40:15 -0400 Subject: [PATCH 1/7] fix: update script to lint files --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65bc52a33f..05f472e154 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "test": "eslint --ignore-path .gitignore --ignore-pattern _includes/readmes/ \"**/*.md\"" + "test": "eslint . --ignore-path .gitignore --ignore-pattern _includes/readmes/ \"**/*.md\"" }, "devDependencies": { "eslint": "^8.54.0", From 9a42f2815ec1ce57b21b81160f59d8de6dec0e3c Mon Sep 17 00:00:00 2001 From: bdkopen Date: Sat, 5 Apr 2025 00:49:13 -0400 Subject: [PATCH 2/7] fix: add `browser` and `jquery` to ESLint environment --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 05f472e154..6958d6f298 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,10 @@ "plugins": [ "markdown" ], + "env": { + "browser": true, + "jquery": true + }, "overrides": [ { "files": "**/*.md", From 08d685626deafdfd118ed0af3a322de5aefe2cc3 Mon Sep 17 00:00:00 2001 From: bdkopen Date: Sat, 5 Apr 2025 01:10:40 -0400 Subject: [PATCH 3/7] fix: resolve ESLint errors --- js/app.js | 135 ++++++++++----------- js/copycode.js | 68 +++++------ js/menu.js | 315 ++++++++++++++++++++++++------------------------- js/theme.js | 33 +++--- 4 files changed, 270 insertions(+), 281 deletions(-) diff --git a/js/app.js b/js/app.js index 2418c2f3a9..1f54c83af4 100644 --- a/js/app.js +++ b/js/app.js @@ -1,122 +1,115 @@ -$(function(){ - var doc = $(document); +$(function () { + const doc = $(document) // top link - $('#top').click(function(e){ - $('html, body').animate({scrollTop : 0}, 500); - return false; - }); + $('#top').click(function (e) { + $('html, body').animate({ scrollTop: 0 }, 500) + return false + }) // scrolling links - var added; - doc.scroll(function(e){ + let added + doc.scroll(function (e) { if (doc.scrollTop() > 5) { - if (added) return; - added = true; - $('body').addClass('scroll'); + if (added) return + added = true + $('body').addClass('scroll') } else { - $('body').removeClass('scroll'); - added = false; + $('body').removeClass('scroll') + added = false } }) // menu bar - var headings = $('h2, h3').map(function(i, el){ + const headings = $('h2, h3').map(function (i, el) { return { top: $(el).offset().top - 200, id: el.id } - }); + }) - function closest() { - var h; - var top = $(window).scrollTop(); - var i = headings.length; + function closest () { + let h + const top = $(window).scrollTop() + let i = headings.length while (i--) { - h = headings[i]; - if (top >= h.top) return h; + h = headings[i] + if (top >= h.top) return h } } - var currentApiPrefix; - var parentMenuSelector; - var lastApiPrefix; + let currentApiPrefix + let parentMenuSelector + let lastApiPrefix if (document.readyState !== 'loading') { - const languageElement = document.getElementById('languageData'); - const languagesData = languageElement ? JSON.parse(languageElement.dataset.languages) : []; + const languageElement = document.getElementById('languageData') + const languagesData = languageElement ? JSON.parse(languageElement.dataset.languages) : [] - const langDisplay = document.getElementById('current-lang'); + const langDisplay = document.getElementById('current-lang') if (langDisplay) { - const currentLanguage = window.location.pathname.split('/')[1]; - const matchedLang = languagesData.find(lang => lang.code === currentLanguage); - langDisplay.textContent = matchedLang ? matchedLang.name : 'English'; - } + const currentLanguage = window.location.pathname.split('/')[1] + const matchedLang = languagesData.find(lang => lang.code === currentLanguage) + langDisplay.textContent = matchedLang ? matchedLang.name : 'English' + } } - $(document).scroll(function() { - var h = closest(); - if (!h) return; + $(document).scroll(function () { + const h = closest() + if (!h) return - currentApiPrefix = h.id.split('.')[0]; - parentMenuSelector = '#'+ currentApiPrefix + '-menu'; + currentApiPrefix = h.id.split('.')[0] + parentMenuSelector = '#' + currentApiPrefix + '-menu' - $(parentMenuSelector).addClass('active'); + $(parentMenuSelector).addClass('active') - if (lastApiPrefix && (lastApiPrefix != currentApiPrefix)) { - $('#'+ lastApiPrefix + '-menu').removeClass('active'); + if (lastApiPrefix && (lastApiPrefix !== currentApiPrefix)) { + $('#' + lastApiPrefix + '-menu').removeClass('active') } - $('#menu li a').removeClass('active'); + $('#menu li a').removeClass('active') - var a = $('a[href="#' + h.id + '"]'); - a.addClass('active'); + const a = $('a[href="#' + h.id + '"]') + a.addClass('active') - lastApiPrefix = currentApiPrefix.split('.')[0]; + lastApiPrefix = currentApiPrefix.split('.')[0] }) // i18n notice if (readCookie('i18nClose')) { - $('#i18n-notice-box').hide(); - $("#i18n-notice-box").addClass("hidden"); - } - else { + $('#i18n-notice-box').hide() + $('#i18n-notice-box').addClass('hidden') + } else { $('#close-i18n-notice-box').on('click', function () { - $('#i18n-notice-box').hide(); - $("#i18n-notice-box").addClass("hidden"); - createCookie('i18nClose', 1); + $('#i18n-notice-box').hide() + $('#i18n-notice-box').addClass('hidden') + createCookie('i18nClose', 1) }) } }) - - -function createCookie(name, value, days) { - var expires; +function createCookie (name, value, days) { + let expires if (days) { - var date = new Date(); - date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); - expires = "; expires=" + date.toGMTString(); + const date = new Date() + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)) + expires = '; expires=' + date.toGMTString() } else { - expires = ""; + expires = '' } - document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + expires + "; path=/"; + document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + expires + '; path=/' } -function readCookie(name) { - var nameEQ = encodeURIComponent(name) + "="; - var ca = document.cookie.split(';'); - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) === ' ') c = c.substring(1, c.length); - if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length)); +function readCookie (name) { + const nameEQ = encodeURIComponent(name) + '=' + const ca = document.cookie.split(';') + for (let i = 0; i < ca.length; i++) { + let c = ca[i] + while (c.charAt(0) === ' ') c = c.substring(1, c.length) + if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length)) } - return null; + return null } - -function eraseCookie(name) { - createCookie(name, "", -1); -} \ No newline at end of file diff --git a/js/copycode.js b/js/copycode.js index 2174710746..56a0dbeb97 100644 --- a/js/copycode.js +++ b/js/copycode.js @@ -1,59 +1,59 @@ -const codeBlocks = document.querySelectorAll("pre:has(code)"); +const codeBlocks = document.querySelectorAll('pre:has(code)') codeBlocks.forEach((block) => { // Only add button if browser supports Clipboard API - if (!navigator.clipboard) return; + if (!navigator.clipboard) return - const button = createCopyButton(); - block.appendChild(button); - block.setAttribute("tabindex", 0); // Add keyboard a11y for

+  const button = createCopyButton()
+  block.appendChild(button)
+  block.setAttribute('tabindex', 0) // Add keyboard a11y for 

 
-  button.addEventListener("click", async () => {
-    await copyCode(block, button);
-  });
-});
+  button.addEventListener('click', async () => {
+    await copyCode(block, button)
+  })
+})
 
-function createCopyButton() {
-  const button = document.createElement("button");
+function createCopyButton () {
+  const button = document.createElement('button')
   setButtonAttributes(button, {
-    type: "button", // button doesn't act as a submit button
-    title: "copy code",
-    "aria-label": "click to copy code",
-  });
-  return button;
+    type: 'button', // button doesn't act as a submit button
+    title: 'copy code',
+    'aria-label': 'click to copy code'
+  })
+  return button
 }
 
-function setButtonAttributes(button, attributes) {
+function setButtonAttributes (button, attributes) {
   for (const [key, value] of Object.entries(attributes)) {
-    button.setAttribute(key, value);
+    button.setAttribute(key, value)
   }
 }
 
-async function copyCode(block, button) {
-  const code = block.querySelector("code");
-  let text = code.innerText;
+async function copyCode (block, button) {
+  const code = block.querySelector('code')
+  let text = code.innerText
   // remove "$" and space if exists at the beginning of the code
-  text = text.replace(/^\$\s?/,"");
+  text = text.replace(/^\$\s?/, '')
 
   try {
-    await navigator.clipboard.writeText(text);
-    updateButtonState(button, "copied", "code is copied!");
+    await navigator.clipboard.writeText(text)
+    updateButtonState(button, 'copied', 'code is copied!')
   } catch {
-    updateButtonState(button, "failed", "failed!");
+    updateButtonState(button, 'failed', 'failed!')
   }
 }
 
-function updateButtonState(button, statusClass, ariaLabel) {
-  button.setAttribute("aria-live", "polite");
-  button.setAttribute("aria-label", ariaLabel);
-  button.classList.add(statusClass);
+function updateButtonState (button, statusClass, ariaLabel) {
+  button.setAttribute('aria-live', 'polite')
+  button.setAttribute('aria-label', ariaLabel)
+  button.classList.add(statusClass)
 
   // Clear any existing timer
-  if (button.dataset.timerId) clearTimeout(Number(button.dataset.timerId));
+  if (button.dataset.timerId) clearTimeout(Number(button.dataset.timerId))
   const timer = setTimeout(() => {
-    button.classList.remove(statusClass);
-    button.setAttribute("aria-label", "click to copy code");
-  }, 1000);
+    button.classList.remove(statusClass)
+    button.setAttribute('aria-label', 'click to copy code')
+  }, 1000)
 
-  button.dataset.timerId = timer;
+  button.dataset.timerId = timer
 }
diff --git a/js/menu.js b/js/menu.js
index a2d7f9b969..8480bd1b7f 100644
--- a/js/menu.js
+++ b/js/menu.js
@@ -1,206 +1,203 @@
 // It uses `window.matchMedia` instead of `window.addEventListener('resize')` because `matchMedia` performs better by not changing its value with every screen resize.
-const mobileScreen = window.matchMedia("(max-width: 1110px)");
-let isSmallScreen = mobileScreen?.matches;
-const tocScreen = window.matchMedia("(max-width: 800px)");
-let isTocScreen = tocScreen.matches;
+const mobileScreen = window.matchMedia('(max-width: 1110px)')
+let isSmallScreen = mobileScreen?.matches
+const tocScreen = window.matchMedia('(max-width: 800px)')
+let isTocScreen = tocScreen.matches
 
-mobileScreen?.addEventListener("change", (event) => {
-	isSmallScreen = event.matches
+mobileScreen?.addEventListener('change', (event) => {
+  isSmallScreen = event.matches
 
   if (!isSmallScreen) {
-		document.body.classList.remove("no-scroll")
-	}
-});
+    document.body.classList.remove('no-scroll')
+  }
+})
 
 // Desktop Menu
 
-const itemsMenu = document.querySelectorAll(".submenu");
+const itemsMenu = document.querySelectorAll('.submenu')
 const navDrawers = document.querySelectorAll('#navmenu > li')
 let activeDrawer // active dropdown nav link
 
-
 for (const el of itemsMenu) {
-	el.addEventListener("click", () => {
-		if (isSmallScreen || 'ontouchstart' in document.documentElement) {
-		// HANDLE ACTIVE LINKS IN DROPDOWN NAV	
-		// if no activeDrawer set then page was set in md logic
-		if (!activeDrawer) {
-			// remove default active link
-			removeActiveFromDrawers(navDrawers)
-			// set new active drawer to clicked
-			activeDrawer = el
-			// add active class
-			addActiveToDrawer(el)
-		// remove prev activeDrawer and set current to active
-		} else if (activeDrawer.id !== el.id) {
-			activeDrawer.querySelector('a').classList.remove('active')
-			addActiveToDrawer(el)
-			activeDrawer = el
-		}
-
-			for (const item of itemsMenu) {
+  el.addEventListener('click', () => {
+    if (isSmallScreen || 'ontouchstart' in document.documentElement) {
+      // HANDLE ACTIVE LINKS IN DROPDOWN NAV
+      // if no activeDrawer set then page was set in md logic
+      if (!activeDrawer) {
+        // remove default active link
+        removeActiveFromDrawers(navDrawers)
+        // set new active drawer to clicked
+        activeDrawer = el
+        // add active class
+        addActiveToDrawer(el)
+        // remove prev activeDrawer and set current to active
+      } else if (activeDrawer.id !== el.id) {
+        activeDrawer.querySelector('a').classList.remove('active')
+        addActiveToDrawer(el)
+        activeDrawer = el
+      }
+
+      for (const item of itemsMenu) {
         // close any open drawers on click next drawer
-				if (item.id !== el.id) {
-					item.classList.remove("open");
-				}
-			}
-			el.classList.toggle("open");
-		}
-	});
-
-	el.addEventListener("mouseenter", () => {
-		if (!isSmallScreen) {
-			el.classList.add("open");
-		}
-	});
-
-	el.addEventListener("mouseleave", () => {
-		if (!isSmallScreen) {
-			el.classList.remove("open");
-		}
-	});
+        if (item.id !== el.id) {
+          item.classList.remove('open')
+        }
+      }
+      el.classList.toggle('open')
+    }
+  })
+
+  el.addEventListener('mouseenter', () => {
+    if (!isSmallScreen) {
+      el.classList.add('open')
+    }
+  })
+
+  el.addEventListener('mouseleave', () => {
+    if (!isSmallScreen) {
+      el.classList.remove('open')
+    }
+  })
 }
 
 // Mobile Menu and Language Picker
 
-const linkItemsMenu = document.querySelectorAll(".submenu > a");
-const languageItems = document.querySelectorAll("#language-picker-menu > #navbar > #navmenu > .submenu > a");
-const languagePickerMenu = document.querySelector("#language-picker-menu > #navbar > #navmenu");
-const menu = document.querySelector("#navmenu");
-const overlay = document.querySelector("#overlay");
-const navButton = document.querySelector("#nav-button");
-const languagePickerButton = document.querySelector("#language-picker-button");
-
+const linkItemsMenu = document.querySelectorAll('.submenu > a')
+const languageItems = document.querySelectorAll('#language-picker-menu > #navbar > #navmenu > .submenu > a')
+const languagePickerMenu = document.querySelector('#language-picker-menu > #navbar > #navmenu')
+const menu = document.querySelector('#navmenu')
+const overlay = document.querySelector('#overlay')
+const navButton = document.querySelector('#nav-button')
+const languagePickerButton = document.querySelector('#language-picker-button')
 
 for (const el of linkItemsMenu) {
-	el.addEventListener("click", (e) => {
-		if (el.classList.contains("open")) {
-			el.classList.remove("open");
-		}
-		
-		if (isSmallScreen || 'ontouchstart' in document.documentElement) {
-			e.preventDefault();
-		}
-	});
-
+  el.addEventListener('click', (e) => {
+    if (el.classList.contains('open')) {
+      el.classList.remove('open')
+    }
+
+    if (isSmallScreen || 'ontouchstart' in document.documentElement) {
+      e.preventDefault()
+    }
+  })
 }
 
 for (const el of languageItems) {
-	el.addEventListener("click", (e) => {
-		const href = el.getAttribute("href");
+  el.addEventListener('click', (e) => {
+    const href = el.getAttribute('href')
 
-		if (href && href !== "#") {
-			languagePickerMenu?.classList.remove("opens");
-			overlay?.classList.remove("blurs");
-			document.body.classList.remove("no-scroll");
+    if (href && href !== '#') {
+      languagePickerMenu?.classList.remove('opens')
+      overlay?.classList.remove('blurs')
+      document.body.classList.remove('no-scroll')
 
-			window.location.href = href;
-		}
-	});
+      window.location.href = href
+    }
+  })
 }
 
-navButton?.addEventListener("click", () => {
-	const isLanguageMenuOpen = languagePickerMenu?.classList.contains("opens");
-	if (isLanguageMenuOpen) {
-		languagePickerMenu?.classList.remove("opens");
-		menu?.classList.toggle("opens");
-	} else {
-		menu?.classList.toggle("opens");
-		overlay?.classList.toggle("blurs");
-		document.body.classList.toggle("no-scroll");
-	}
-});
-
-languagePickerButton?.addEventListener("click", () => {
-	const isMenuOpen = menu?.classList.contains("opens");
-	if (isMenuOpen) {
-		menu?.classList.remove("opens");
-		languagePickerMenu?.classList.toggle("opens");
-	} else {
-		languagePickerMenu?.classList.toggle("opens");
-		overlay?.classList.toggle("blurs");
-		document.body.classList.toggle("no-scroll");
-	}
-});
-
-overlay?.addEventListener("click", () => {
-	if (menu?.classList.contains("opens")) {
-		menu.classList.remove("opens");
-	}
-	if (languagePickerMenu?.classList.contains("opens")) {
-		languagePickerMenu.classList.remove("opens");
-	}
-	overlay.classList.remove("blurs");
-	document.body.classList.remove("no-scroll");
-});
+navButton?.addEventListener('click', () => {
+  const isLanguageMenuOpen = languagePickerMenu?.classList.contains('opens')
+  if (isLanguageMenuOpen) {
+    languagePickerMenu?.classList.remove('opens')
+    menu?.classList.toggle('opens')
+  } else {
+    menu?.classList.toggle('opens')
+    overlay?.classList.toggle('blurs')
+    document.body.classList.toggle('no-scroll')
+  }
+})
+
+languagePickerButton?.addEventListener('click', () => {
+  const isMenuOpen = menu?.classList.contains('opens')
+  if (isMenuOpen) {
+    menu?.classList.remove('opens')
+    languagePickerMenu?.classList.toggle('opens')
+  } else {
+    languagePickerMenu?.classList.toggle('opens')
+    overlay?.classList.toggle('blurs')
+    document.body.classList.toggle('no-scroll')
+  }
+})
+
+overlay?.addEventListener('click', () => {
+  if (menu?.classList.contains('opens')) {
+    menu.classList.remove('opens')
+  }
+  if (languagePickerMenu?.classList.contains('opens')) {
+    languagePickerMenu.classList.remove('opens')
+  }
+  overlay.classList.remove('blurs')
+  document.body.classList.remove('no-scroll')
+})
 
 document
-	.querySelector(`.submenu-content a[href="{document.location.pathname}"]`)
-	?.classList.add("current");
+  .querySelector('.submenu-content a[href="{document.location.pathname}"]')
+  ?.classList.add('current')
 
 // when active is unknown, loop over and remove any active link
-function removeActiveFromDrawers(navDrawers) {
+function removeActiveFromDrawers (navDrawers) {
   for (const item of navDrawers) {
     item.querySelector('a').classList.remove('active')
   }
 }
 // add active to known link
-function addActiveToDrawer(drawer) {
-	drawer.querySelector('a').classList.add('active')
+function addActiveToDrawer (drawer) {
+  drawer.querySelector('a').classList.add('active')
 }
 
-// TOC 
-const toggleBtn = document.getElementById("menu-toggle");
-const tocList = document.getElementById("menu");
+// TOC
+const toggleBtn = document.getElementById('menu-toggle')
+const tocList = document.getElementById('menu')
 
-function updateTocVisibility() {
-	if (isTocScreen) {
-	  toggleBtn?.classList.add("show");
-	} else {
-	  toggleBtn?.classList.remove("show");
-	}
+function updateTocVisibility () {
+  if (isTocScreen) {
+    toggleBtn?.classList.add('show')
+  } else {
+    toggleBtn?.classList.remove('show')
   }
+}
 
 // toc button on page load
-updateTocVisibility();
+updateTocVisibility()
 
 // Listen for changes in screen size
-tocScreen.addEventListener("change", (event) => {
-  isTocScreen = event.matches;
-  updateTocVisibility();
-});
+tocScreen.addEventListener('change', (event) => {
+  isTocScreen = event.matches
+  updateTocVisibility()
+})
 
 // Toggle toc menu on button click
-toggleBtn?.addEventListener("click", (e) => {
-  if(tocList?.classList.contains("open")) {
-	toggleBtn.children[0].innerHTML = "►";
-	tocList.classList.remove("open");
+toggleBtn?.addEventListener('click', (e) => {
+  if (tocList?.classList.contains('open')) {
+    toggleBtn.children[0].innerHTML = '►'
+    tocList.classList.remove('open')
   } else {
-	toggleBtn.children[0].innerHTML = "▼";
-	tocList.classList.add("open");
+    toggleBtn.children[0].innerHTML = '▼'
+    tocList.classList.add('open')
   }
-});
-  
+})
+
 // Open/Close sub TOC content on click
-document.querySelectorAll("#menu > li > a").forEach((link) => {
-	link.addEventListener("click", function (event) {
-	  event.preventDefault(); // stop navigation to submenu
-  
-	  // Find the closest parent 
  • - const closestLiParent = link.closest("li"); - const childUlSubMenu = closestLiParent.children[1]; - - // If submenu is already active, remove "active" class (toggle behavior) - if (childUlSubMenu?.classList.contains("active")) { - childUlSubMenu.classList.remove("active"); - } else { - // Remove "active" from all other submenus - document.querySelectorAll("#menu > li > ul").forEach((subMenu) => { - subMenu.classList.remove("active"); - }); - - // Add "active" to the clicked submenu - childUlSubMenu?.classList.add("active"); - } - }); - }); +document.querySelectorAll('#menu > li > a').forEach((link) => { + link.addEventListener('click', function (event) { + event.preventDefault() // stop navigation to submenu + + // Find the closest parent
  • + const closestLiParent = link.closest('li') + const childUlSubMenu = closestLiParent.children[1] + + // If submenu is already active, remove "active" class (toggle behavior) + if (childUlSubMenu?.classList.contains('active')) { + childUlSubMenu.classList.remove('active') + } else { + // Remove "active" from all other submenus + document.querySelectorAll('#menu > li > ul').forEach((subMenu) => { + subMenu.classList.remove('active') + }) + + // Add "active" to the clicked submenu + childUlSubMenu?.classList.add('active') + } + }) +}) diff --git a/js/theme.js b/js/theme.js index 5e18e0481f..dec6e53867 100644 --- a/js/theme.js +++ b/js/theme.js @@ -1,14 +1,14 @@ -const themeWatcher = watchColorSchemeChange((colorScheme) => { +watchColorSchemeChange((_error, colorScheme) => { if (!hasLocalStorage()) { document?.addEventListener('DOMContentLoaded', () => { // remove icon - toggle not supported document.querySelector('#theme-toggle').remove() - setTheme(colorScheme); + setTheme(colorScheme) }) } else { // user's PS system theme settings const systemTheme = localStorage.getItem('system-theme') - // setting stored in local storage + // setting stored in local storage const localTheme = localStorage.getItem('local-theme') // // if no local theme set - system is default if (localTheme === null) { @@ -16,11 +16,11 @@ const themeWatcher = watchColorSchemeChange((colorScheme) => { localStorage.setItem('system-theme', colorScheme || 'light') // page load - load any stored themes or set theme } else { - // listen for system changes, update if any - if (colorScheme != systemTheme) { + // listen for system changes, update if any + if (colorScheme !== systemTheme) { setTheme(colorScheme) localStorage.setItem('system-theme', colorScheme || 'light') - // override local theme + // override local theme localStorage.removeItem('local-theme') } else { // else load local theme @@ -33,7 +33,6 @@ const themeWatcher = watchColorSchemeChange((colorScheme) => { } // wait for load then and add listner on button document.addEventListener('DOMContentLoaded', () => { - document .querySelector('#theme-toggle') .addEventListener('click', toggleLocalStorageTheme) @@ -41,8 +40,8 @@ const themeWatcher = watchColorSchemeChange((colorScheme) => { } }) // set the theme to given value -function setTheme(theme) { - // only support dark else any other defaults to light +function setTheme (theme) { + // only support dark else any other defaults to light if (theme === 'dark') { darkModeOn() } else { @@ -50,7 +49,7 @@ function setTheme(theme) { } } // toggle btwn themes or set a theme if none set -function toggleLocalStorageTheme(e) { +function toggleLocalStorageTheme (e) { const localTheme = localStorage.getItem('local-theme') if (localTheme === 'light') { localStorage.setItem('local-theme', 'dark') @@ -70,31 +69,31 @@ function toggleLocalStorageTheme(e) { } } } -function darkModeOn() { +function darkModeOn () { document?.documentElement?.classList?.remove('light-mode') document?.documentElement?.classList?.add('dark-mode') } -function lightModeOn() { +function lightModeOn () { document?.documentElement?.classList.remove('dark-mode') document?.documentElement?.classList?.add('light-mode') } -function darkModeState() { +function darkModeState () { return document?.documentElement?.classList.contains('dark-mode') } -function hasLocalStorage() { +function hasLocalStorage () { return typeof Storage !== 'undefined' } -function watchColorSchemeChange(callback) { +function watchColorSchemeChange (callback) { // query user's machine for system setting & use that const darkMediaQuery = window?.matchMedia('(prefers-color-scheme: dark)') const handleChange = (event) => { const newColorScheme = event?.matches ? 'dark' : 'light' - callback(newColorScheme) + callback(undefined, newColorScheme) } darkMediaQuery.addEventListener('change', handleChange) // handle init load value - callback(darkMediaQuery.matches ? 'dark': 'light') + callback(undefined, darkMediaQuery.matches ? 'dark' : 'light') // Return a function to remove the event listener return () => darkMediaQuery.removeEventListener('change', handleChange) } From 7adc042be049282ea677c3748c3e75bd608e9527 Mon Sep 17 00:00:00 2001 From: bdkopen Date: Wed, 14 May 2025 21:11:54 -0400 Subject: [PATCH 4/7] chore: remove unused devDependencies --- package-lock.json | 118 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 5 +- 2 files changed, 109 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce7af6e62f..afc520d36a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,7 @@ "devDependencies": { "eslint": "^8.54.0", "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-markdown": "^2.2.1", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0" + "eslint-plugin-markdown": "^2.2.1" } }, "node_modules/@eslint-community/eslint-utils": { @@ -157,7 +154,8 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/mdast": { "version": "3.0.15", @@ -170,9 +168,9 @@ } }, "node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "dev": true, "license": "MIT" }, @@ -262,6 +260,7 @@ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -279,6 +278,7 @@ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -300,6 +300,7 @@ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -321,6 +322,7 @@ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -340,6 +342,7 @@ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -359,6 +362,7 @@ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -382,6 +386,7 @@ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -416,6 +421,7 @@ "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "semver": "^7.0.0" } @@ -426,6 +432,7 @@ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -439,6 +446,7 @@ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -561,6 +569,7 @@ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -579,6 +588,7 @@ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -597,6 +607,7 @@ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -640,6 +651,7 @@ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -658,6 +670,7 @@ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -689,6 +702,7 @@ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -750,6 +764,7 @@ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -763,6 +778,7 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -773,6 +789,7 @@ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -786,6 +803,7 @@ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -801,6 +819,7 @@ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hasown": "^2.0.0" } @@ -811,6 +830,7 @@ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -928,6 +948,7 @@ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -940,6 +961,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -950,6 +972,7 @@ "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.2.7" }, @@ -968,6 +991,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -978,6 +1002,7 @@ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" @@ -998,6 +1023,7 @@ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -1014,6 +1040,7 @@ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=4" } @@ -1024,6 +1051,7 @@ "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -1056,6 +1084,7 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -1066,6 +1095,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -1095,6 +1125,7 @@ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", @@ -1121,6 +1152,7 @@ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -1134,6 +1166,7 @@ "integrity": "sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1167,6 +1200,7 @@ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -1186,6 +1220,7 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=10" } @@ -1356,6 +1391,7 @@ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -1373,6 +1409,7 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1383,6 +1420,7 @@ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1402,6 +1440,7 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1412,6 +1451,7 @@ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1432,6 +1472,7 @@ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -1501,6 +1542,7 @@ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -1518,6 +1560,7 @@ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1538,6 +1581,7 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1558,6 +1602,7 @@ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -1571,6 +1616,7 @@ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -1584,6 +1630,7 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -1597,6 +1644,7 @@ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -1613,6 +1661,7 @@ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -1682,6 +1731,7 @@ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -1723,6 +1773,7 @@ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -1740,6 +1791,7 @@ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -1753,6 +1805,7 @@ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -1770,6 +1823,7 @@ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -1783,6 +1837,7 @@ "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -1799,6 +1854,7 @@ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-typed-array": "^1.1.13" }, @@ -1815,6 +1871,7 @@ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -1876,6 +1933,7 @@ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -1889,6 +1947,7 @@ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -1915,6 +1974,7 @@ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -1932,6 +1992,7 @@ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7" }, @@ -1948,6 +2009,7 @@ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -1964,6 +2026,7 @@ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -1980,6 +2043,7 @@ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -1996,6 +2060,7 @@ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -2008,7 +2073,8 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/isexe": { "version": "2.0.0", @@ -2057,6 +2123,7 @@ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minimist": "^1.2.0" }, @@ -2180,6 +2247,7 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2204,6 +2272,7 @@ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -2217,6 +2286,7 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -2227,6 +2297,7 @@ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -2246,6 +2317,7 @@ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2265,6 +2337,7 @@ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2280,6 +2353,7 @@ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2419,7 +2493,8 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/possible-typed-array-names": { "version": "1.0.0", @@ -2427,6 +2502,7 @@ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -2478,6 +2554,7 @@ "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -2497,6 +2574,7 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -2510,6 +2588,7 @@ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -2590,6 +2669,7 @@ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -2609,6 +2689,7 @@ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -2627,6 +2708,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -2637,6 +2719,7 @@ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2655,6 +2738,7 @@ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -2694,6 +2778,7 @@ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2713,6 +2798,7 @@ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2732,6 +2818,7 @@ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2747,6 +2834,7 @@ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2778,6 +2866,7 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -2814,6 +2903,7 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -2834,6 +2924,7 @@ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -2873,6 +2964,7 @@ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -2888,6 +2980,7 @@ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -2908,6 +3001,7 @@ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -2929,6 +3023,7 @@ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -2950,6 +3045,7 @@ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -3006,6 +3102,7 @@ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -3023,6 +3120,7 @@ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", diff --git a/package.json b/package.json index 6958d6f298..2b250acfe1 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,7 @@ "devDependencies": { "eslint": "^8.54.0", "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-markdown": "^2.2.1", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0" + "eslint-plugin-markdown": "^2.2.1" }, "eslintConfig": { "extends": [ From 3c970b2dde9578936f7f0ed5d852fa02108adc08 Mon Sep 17 00:00:00 2001 From: bdkopen Date: Wed, 14 May 2025 21:21:35 -0400 Subject: [PATCH 5/7] chore: move ESLint config to .eslintrc.json file --- .eslintrc.json | 43 +++++++++++++++++++++++++++++++++++++++++++ package.json | 43 ------------------------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..d8dfede788 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,43 @@ +{ + "extends": [ + "standard", + "plugin:markdown/recommended" + ], + "plugins": [ + "markdown" + ], + "env": { + "browser": true, + "jquery": true + }, + "overrides": [ + { + "files": "**/*.md", + "processor": "markdown/markdown" + }, + { + "files": "**/*.md/*.js", + "rules": { + "array-callback-return": "off", + "no-var": "error", + "n/handle-callback-err": "off", + "object-shorthand": "error", + "prefer-arrow-callback": "error", + "prefer-template": "error" + } + }, + { + "files": [ + "**/3x/*.md/*.js", + "**/4x/*.md/*.js", + "**/guide/migrating-4.md/*.js" + ], + "rules": { + "no-var": "off", + "object-shorthand": "off", + "prefer-arrow-callback": "off", + "prefer-template": "off" + } + } + ] + } \ No newline at end of file diff --git a/package.json b/package.json index 2b250acfe1..d2c736fc0d 100644 --- a/package.json +++ b/package.json @@ -9,48 +9,5 @@ "eslint": "^8.54.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-markdown": "^2.2.1" - }, - "eslintConfig": { - "extends": [ - "standard", - "plugin:markdown/recommended" - ], - "plugins": [ - "markdown" - ], - "env": { - "browser": true, - "jquery": true - }, - "overrides": [ - { - "files": "**/*.md", - "processor": "markdown/markdown" - }, - { - "files": "**/*.md/*.js", - "rules": { - "array-callback-return": "off", - "no-var": "error", - "n/handle-callback-err": "off", - "object-shorthand": "error", - "prefer-arrow-callback": "error", - "prefer-template": "error" - } - }, - { - "files": [ - "**/3x/*.md/*.js", - "**/4x/*.md/*.js", - "**/guide/migrating-4.md/*.js" - ], - "rules": { - "no-var": "off", - "object-shorthand": "off", - "prefer-arrow-callback": "off", - "prefer-template": "off" - } - } - ] } } From 6f26f320c44653314d578a4920970780c2b76deb Mon Sep 17 00:00:00 2001 From: bdkopen Date: Wed, 21 May 2025 18:03:08 -0400 Subject: [PATCH 6/7] fix: also lint js files --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d2c736fc0d..9d732fece8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "test": "eslint . --ignore-path .gitignore --ignore-pattern _includes/readmes/ \"**/*.md\"" + "test": "eslint --ignore-path .gitignore --ignore-pattern _includes/readmes/ \"**/*.js\" \"**/*.md\"" }, "devDependencies": { "eslint": "^8.54.0", From 703282ff225dd16c3320596b30bfc934131cfaa1 Mon Sep 17 00:00:00 2001 From: bdkopen Date: Sat, 31 May 2025 09:10:45 -0400 Subject: [PATCH 7/7] improve: require semicolon on .js files --- .eslintrc.json | 5 ++ js/app.js | 114 ++++++++++++++++----------------- js/copycode.js | 52 ++++++++-------- js/menu.js | 166 ++++++++++++++++++++++++------------------------- js/theme.js | 78 +++++++++++------------ 5 files changed, 210 insertions(+), 205 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index d8dfede788..24057ce1c6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -10,6 +10,9 @@ "browser": true, "jquery": true }, + "rules": { + "semi": ["error", "always"] + }, "overrides": [ { "files": "**/*.md", @@ -18,6 +21,7 @@ { "files": "**/*.md/*.js", "rules": { + "semi": ["error", "never"], "array-callback-return": "off", "no-var": "error", "n/handle-callback-err": "off", @@ -33,6 +37,7 @@ "**/guide/migrating-4.md/*.js" ], "rules": { + "semi": ["error", "never"], "no-var": "off", "object-shorthand": "off", "prefer-arrow-callback": "off", diff --git a/js/app.js b/js/app.js index 1f54c83af4..d968fde149 100644 --- a/js/app.js +++ b/js/app.js @@ -1,24 +1,24 @@ $(function () { - const doc = $(document) + const doc = $(document); // top link $('#top').click(function (e) { - $('html, body').animate({ scrollTop: 0 }, 500) - return false - }) + $('html, body').animate({ scrollTop: 0 }, 500); + return false; + }); // scrolling links - let added + let added; doc.scroll(function (e) { if (doc.scrollTop() > 5) { - if (added) return - added = true - $('body').addClass('scroll') + if (added) return; + added = true; + $('body').addClass('scroll'); } else { - $('body').removeClass('scroll') - added = false + $('body').removeClass('scroll'); + added = false; } - }) + }); // menu bar @@ -26,90 +26,90 @@ $(function () { return { top: $(el).offset().top - 200, id: el.id - } - }) + }; + }); function closest () { - let h - const top = $(window).scrollTop() - let i = headings.length + let h; + const top = $(window).scrollTop(); + let i = headings.length; while (i--) { - h = headings[i] - if (top >= h.top) return h + h = headings[i]; + if (top >= h.top) return h; } } - let currentApiPrefix - let parentMenuSelector - let lastApiPrefix + let currentApiPrefix; + let parentMenuSelector; + let lastApiPrefix; if (document.readyState !== 'loading') { - const languageElement = document.getElementById('languageData') - const languagesData = languageElement ? JSON.parse(languageElement.dataset.languages) : [] + const languageElement = document.getElementById('languageData'); + const languagesData = languageElement ? JSON.parse(languageElement.dataset.languages) : []; - const langDisplay = document.getElementById('current-lang') + const langDisplay = document.getElementById('current-lang'); if (langDisplay) { - const currentLanguage = window.location.pathname.split('/')[1] - const matchedLang = languagesData.find(lang => lang.code === currentLanguage) - langDisplay.textContent = matchedLang ? matchedLang.name : 'English' + const currentLanguage = window.location.pathname.split('/')[1]; + const matchedLang = languagesData.find(lang => lang.code === currentLanguage); + langDisplay.textContent = matchedLang ? matchedLang.name : 'English'; } } $(document).scroll(function () { - const h = closest() - if (!h) return + const h = closest(); + if (!h) return; - currentApiPrefix = h.id.split('.')[0] - parentMenuSelector = '#' + currentApiPrefix + '-menu' + currentApiPrefix = h.id.split('.')[0]; + parentMenuSelector = '#' + currentApiPrefix + '-menu'; - $(parentMenuSelector).addClass('active') + $(parentMenuSelector).addClass('active'); if (lastApiPrefix && (lastApiPrefix !== currentApiPrefix)) { - $('#' + lastApiPrefix + '-menu').removeClass('active') + $('#' + lastApiPrefix + '-menu').removeClass('active'); } - $('#menu li a').removeClass('active') + $('#menu li a').removeClass('active'); - const a = $('a[href="#' + h.id + '"]') - a.addClass('active') + const a = $('a[href="#' + h.id + '"]'); + a.addClass('active'); - lastApiPrefix = currentApiPrefix.split('.')[0] - }) + lastApiPrefix = currentApiPrefix.split('.')[0]; + }); // i18n notice if (readCookie('i18nClose')) { - $('#i18n-notice-box').hide() - $('#i18n-notice-box').addClass('hidden') + $('#i18n-notice-box').hide(); + $('#i18n-notice-box').addClass('hidden'); } else { $('#close-i18n-notice-box').on('click', function () { - $('#i18n-notice-box').hide() - $('#i18n-notice-box').addClass('hidden') - createCookie('i18nClose', 1) - }) + $('#i18n-notice-box').hide(); + $('#i18n-notice-box').addClass('hidden'); + createCookie('i18nClose', 1); + }); } -}) +}); function createCookie (name, value, days) { - let expires + let expires; if (days) { - const date = new Date() - date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)) - expires = '; expires=' + date.toGMTString() + const date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = '; expires=' + date.toGMTString(); } else { - expires = '' + expires = ''; } - document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + expires + '; path=/' + document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + expires + '; path=/'; } function readCookie (name) { - const nameEQ = encodeURIComponent(name) + '=' - const ca = document.cookie.split(';') + const nameEQ = encodeURIComponent(name) + '='; + const ca = document.cookie.split(';'); for (let i = 0; i < ca.length; i++) { - let c = ca[i] - while (c.charAt(0) === ' ') c = c.substring(1, c.length) - if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length)) + let c = ca[i]; + while (c.charAt(0) === ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) === 0) return decodeURIComponent(c.substring(nameEQ.length, c.length)); } - return null + return null; } diff --git a/js/copycode.js b/js/copycode.js index 56a0dbeb97..b4074846d4 100644 --- a/js/copycode.js +++ b/js/copycode.js @@ -1,59 +1,59 @@ -const codeBlocks = document.querySelectorAll('pre:has(code)') +const codeBlocks = document.querySelectorAll('pre:has(code)'); codeBlocks.forEach((block) => { // Only add button if browser supports Clipboard API - if (!navigator.clipboard) return + if (!navigator.clipboard) return; - const button = createCopyButton() - block.appendChild(button) - block.setAttribute('tabindex', 0) // Add keyboard a11y for
    
    +  const button = createCopyButton();
    +  block.appendChild(button);
    +  block.setAttribute('tabindex', 0); // Add keyboard a11y for 
    
     
       button.addEventListener('click', async () => {
    -    await copyCode(block, button)
    -  })
    -})
    +    await copyCode(block, button);
    +  });
    +});
     
     function createCopyButton () {
    -  const button = document.createElement('button')
    +  const button = document.createElement('button');
       setButtonAttributes(button, {
         type: 'button', // button doesn't act as a submit button
         title: 'copy code',
         'aria-label': 'click to copy code'
    -  })
    -  return button
    +  });
    +  return button;
     }
     
     function setButtonAttributes (button, attributes) {
       for (const [key, value] of Object.entries(attributes)) {
    -    button.setAttribute(key, value)
    +    button.setAttribute(key, value);
       }
     }
     
     async function copyCode (block, button) {
    -  const code = block.querySelector('code')
    -  let text = code.innerText
    +  const code = block.querySelector('code');
    +  let text = code.innerText;
       // remove "$" and space if exists at the beginning of the code
    -  text = text.replace(/^\$\s?/, '')
    +  text = text.replace(/^\$\s?/, '');
     
       try {
    -    await navigator.clipboard.writeText(text)
    -    updateButtonState(button, 'copied', 'code is copied!')
    +    await navigator.clipboard.writeText(text);
    +    updateButtonState(button, 'copied', 'code is copied!');
       } catch {
    -    updateButtonState(button, 'failed', 'failed!')
    +    updateButtonState(button, 'failed', 'failed!');
       }
     }
     
     function updateButtonState (button, statusClass, ariaLabel) {
    -  button.setAttribute('aria-live', 'polite')
    -  button.setAttribute('aria-label', ariaLabel)
    -  button.classList.add(statusClass)
    +  button.setAttribute('aria-live', 'polite');
    +  button.setAttribute('aria-label', ariaLabel);
    +  button.classList.add(statusClass);
     
       // Clear any existing timer
    -  if (button.dataset.timerId) clearTimeout(Number(button.dataset.timerId))
    +  if (button.dataset.timerId) clearTimeout(Number(button.dataset.timerId));
       const timer = setTimeout(() => {
    -    button.classList.remove(statusClass)
    -    button.setAttribute('aria-label', 'click to copy code')
    -  }, 1000)
    +    button.classList.remove(statusClass);
    +    button.setAttribute('aria-label', 'click to copy code');
    +  }, 1000);
     
    -  button.dataset.timerId = timer
    +  button.dataset.timerId = timer;
     }
    diff --git a/js/menu.js b/js/menu.js
    index 8480bd1b7f..c36adfddf5 100644
    --- a/js/menu.js
    +++ b/js/menu.js
    @@ -1,22 +1,22 @@
     // It uses `window.matchMedia` instead of `window.addEventListener('resize')` because `matchMedia` performs better by not changing its value with every screen resize.
    -const mobileScreen = window.matchMedia('(max-width: 1110px)')
    -let isSmallScreen = mobileScreen?.matches
    -const tocScreen = window.matchMedia('(max-width: 800px)')
    -let isTocScreen = tocScreen.matches
    +const mobileScreen = window.matchMedia('(max-width: 1110px)');
    +let isSmallScreen = mobileScreen?.matches;
    +const tocScreen = window.matchMedia('(max-width: 800px)');
    +let isTocScreen = tocScreen.matches;
     
     mobileScreen?.addEventListener('change', (event) => {
    -  isSmallScreen = event.matches
    +  isSmallScreen = event.matches;
     
       if (!isSmallScreen) {
    -    document.body.classList.remove('no-scroll')
    +    document.body.classList.remove('no-scroll');
       }
    -})
    +});
     
     // Desktop Menu
     
    -const itemsMenu = document.querySelectorAll('.submenu')
    -const navDrawers = document.querySelectorAll('#navmenu > li')
    -let activeDrawer // active dropdown nav link
    +const itemsMenu = document.querySelectorAll('.submenu');
    +const navDrawers = document.querySelectorAll('#navmenu > li');
    +let activeDrawer; // active dropdown nav link
     
     for (const el of itemsMenu) {
       el.addEventListener('click', () => {
    @@ -25,179 +25,179 @@ for (const el of itemsMenu) {
           // if no activeDrawer set then page was set in md logic
           if (!activeDrawer) {
             // remove default active link
    -        removeActiveFromDrawers(navDrawers)
    +        removeActiveFromDrawers(navDrawers);
             // set new active drawer to clicked
    -        activeDrawer = el
    +        activeDrawer = el;
             // add active class
    -        addActiveToDrawer(el)
    +        addActiveToDrawer(el);
             // remove prev activeDrawer and set current to active
           } else if (activeDrawer.id !== el.id) {
    -        activeDrawer.querySelector('a').classList.remove('active')
    -        addActiveToDrawer(el)
    -        activeDrawer = el
    +        activeDrawer.querySelector('a').classList.remove('active');
    +        addActiveToDrawer(el);
    +        activeDrawer = el;
           }
     
           for (const item of itemsMenu) {
             // close any open drawers on click next drawer
             if (item.id !== el.id) {
    -          item.classList.remove('open')
    +          item.classList.remove('open');
             }
           }
    -      el.classList.toggle('open')
    +      el.classList.toggle('open');
         }
    -  })
    +  });
     
       el.addEventListener('mouseenter', () => {
         if (!isSmallScreen) {
    -      el.classList.add('open')
    +      el.classList.add('open');
         }
    -  })
    +  });
     
       el.addEventListener('mouseleave', () => {
         if (!isSmallScreen) {
    -      el.classList.remove('open')
    +      el.classList.remove('open');
         }
    -  })
    +  });
     }
     
     // Mobile Menu and Language Picker
     
    -const linkItemsMenu = document.querySelectorAll('.submenu > a')
    -const languageItems = document.querySelectorAll('#language-picker-menu > #navbar > #navmenu > .submenu > a')
    -const languagePickerMenu = document.querySelector('#language-picker-menu > #navbar > #navmenu')
    -const menu = document.querySelector('#navmenu')
    -const overlay = document.querySelector('#overlay')
    -const navButton = document.querySelector('#nav-button')
    -const languagePickerButton = document.querySelector('#language-picker-button')
    +const linkItemsMenu = document.querySelectorAll('.submenu > a');
    +const languageItems = document.querySelectorAll('#language-picker-menu > #navbar > #navmenu > .submenu > a');
    +const languagePickerMenu = document.querySelector('#language-picker-menu > #navbar > #navmenu');
    +const menu = document.querySelector('#navmenu');
    +const overlay = document.querySelector('#overlay');
    +const navButton = document.querySelector('#nav-button');
    +const languagePickerButton = document.querySelector('#language-picker-button');
     
     for (const el of linkItemsMenu) {
       el.addEventListener('click', (e) => {
         if (el.classList.contains('open')) {
    -      el.classList.remove('open')
    +      el.classList.remove('open');
         }
     
         if (isSmallScreen || 'ontouchstart' in document.documentElement) {
    -      e.preventDefault()
    +      e.preventDefault();
         }
    -  })
    +  });
     }
     
     for (const el of languageItems) {
       el.addEventListener('click', (e) => {
    -    const href = el.getAttribute('href')
    +    const href = el.getAttribute('href');
     
         if (href && href !== '#') {
    -      languagePickerMenu?.classList.remove('opens')
    -      overlay?.classList.remove('blurs')
    -      document.body.classList.remove('no-scroll')
    +      languagePickerMenu?.classList.remove('opens');
    +      overlay?.classList.remove('blurs');
    +      document.body.classList.remove('no-scroll');
     
    -      window.location.href = href
    +      window.location.href = href;
         }
    -  })
    +  });
     }
     
     navButton?.addEventListener('click', () => {
    -  const isLanguageMenuOpen = languagePickerMenu?.classList.contains('opens')
    +  const isLanguageMenuOpen = languagePickerMenu?.classList.contains('opens');
       if (isLanguageMenuOpen) {
    -    languagePickerMenu?.classList.remove('opens')
    -    menu?.classList.toggle('opens')
    +    languagePickerMenu?.classList.remove('opens');
    +    menu?.classList.toggle('opens');
       } else {
    -    menu?.classList.toggle('opens')
    -    overlay?.classList.toggle('blurs')
    -    document.body.classList.toggle('no-scroll')
    +    menu?.classList.toggle('opens');
    +    overlay?.classList.toggle('blurs');
    +    document.body.classList.toggle('no-scroll');
       }
    -})
    +});
     
     languagePickerButton?.addEventListener('click', () => {
    -  const isMenuOpen = menu?.classList.contains('opens')
    +  const isMenuOpen = menu?.classList.contains('opens');
       if (isMenuOpen) {
    -    menu?.classList.remove('opens')
    -    languagePickerMenu?.classList.toggle('opens')
    +    menu?.classList.remove('opens');
    +    languagePickerMenu?.classList.toggle('opens');
       } else {
    -    languagePickerMenu?.classList.toggle('opens')
    -    overlay?.classList.toggle('blurs')
    -    document.body.classList.toggle('no-scroll')
    +    languagePickerMenu?.classList.toggle('opens');
    +    overlay?.classList.toggle('blurs');
    +    document.body.classList.toggle('no-scroll');
       }
    -})
    +});
     
     overlay?.addEventListener('click', () => {
       if (menu?.classList.contains('opens')) {
    -    menu.classList.remove('opens')
    +    menu.classList.remove('opens');
       }
       if (languagePickerMenu?.classList.contains('opens')) {
    -    languagePickerMenu.classList.remove('opens')
    +    languagePickerMenu.classList.remove('opens');
       }
    -  overlay.classList.remove('blurs')
    -  document.body.classList.remove('no-scroll')
    -})
    +  overlay.classList.remove('blurs');
    +  document.body.classList.remove('no-scroll');
    +});
     
     document
       .querySelector('.submenu-content a[href="{document.location.pathname}"]')
    -  ?.classList.add('current')
    +  ?.classList.add('current');
     
     // when active is unknown, loop over and remove any active link
     function removeActiveFromDrawers (navDrawers) {
       for (const item of navDrawers) {
    -    item.querySelector('a').classList.remove('active')
    +    item.querySelector('a').classList.remove('active');
       }
     }
     // add active to known link
     function addActiveToDrawer (drawer) {
    -  drawer.querySelector('a').classList.add('active')
    +  drawer.querySelector('a').classList.add('active');
     }
     
     // TOC
    -const toggleBtn = document.getElementById('menu-toggle')
    -const tocList = document.getElementById('menu')
    +const toggleBtn = document.getElementById('menu-toggle');
    +const tocList = document.getElementById('menu');
     
     function updateTocVisibility () {
       if (isTocScreen) {
    -    toggleBtn?.classList.add('show')
    +    toggleBtn?.classList.add('show');
       } else {
    -    toggleBtn?.classList.remove('show')
    +    toggleBtn?.classList.remove('show');
       }
     }
     
     // toc button on page load
    -updateTocVisibility()
    +updateTocVisibility();
     
     // Listen for changes in screen size
     tocScreen.addEventListener('change', (event) => {
    -  isTocScreen = event.matches
    -  updateTocVisibility()
    -})
    +  isTocScreen = event.matches;
    +  updateTocVisibility();
    +});
     
     // Toggle toc menu on button click
     toggleBtn?.addEventListener('click', (e) => {
       if (tocList?.classList.contains('open')) {
    -    toggleBtn.children[0].innerHTML = '►'
    -    tocList.classList.remove('open')
    +    toggleBtn.children[0].innerHTML = '►';
    +    tocList.classList.remove('open');
       } else {
    -    toggleBtn.children[0].innerHTML = '▼'
    -    tocList.classList.add('open')
    +    toggleBtn.children[0].innerHTML = '▼';
    +    tocList.classList.add('open');
       }
    -})
    +});
     
     // Open/Close sub TOC content on click
     document.querySelectorAll('#menu > li > a').forEach((link) => {
       link.addEventListener('click', function (event) {
    -    event.preventDefault() // stop navigation to submenu
    +    event.preventDefault(); // stop navigation to submenu
     
         // Find the closest parent 
  • - const closestLiParent = link.closest('li') - const childUlSubMenu = closestLiParent.children[1] + const closestLiParent = link.closest('li'); + const childUlSubMenu = closestLiParent.children[1]; // If submenu is already active, remove "active" class (toggle behavior) if (childUlSubMenu?.classList.contains('active')) { - childUlSubMenu.classList.remove('active') + childUlSubMenu.classList.remove('active'); } else { // Remove "active" from all other submenus document.querySelectorAll('#menu > li > ul').forEach((subMenu) => { - subMenu.classList.remove('active') - }) + subMenu.classList.remove('active'); + }); // Add "active" to the clicked submenu - childUlSubMenu?.classList.add('active') + childUlSubMenu?.classList.add('active'); } - }) -}) + }); +}); diff --git a/js/theme.js b/js/theme.js index dec6e53867..e1b816655e 100644 --- a/js/theme.js +++ b/js/theme.js @@ -2,32 +2,32 @@ watchColorSchemeChange((_error, colorScheme) => { if (!hasLocalStorage()) { document?.addEventListener('DOMContentLoaded', () => { // remove icon - toggle not supported - document.querySelector('#theme-toggle').remove() - setTheme(colorScheme) - }) + document.querySelector('#theme-toggle').remove(); + setTheme(colorScheme); + }); } else { // user's PS system theme settings - const systemTheme = localStorage.getItem('system-theme') + const systemTheme = localStorage.getItem('system-theme'); // setting stored in local storage - const localTheme = localStorage.getItem('local-theme') + const localTheme = localStorage.getItem('local-theme'); // // if no local theme set - system is default if (localTheme === null) { - setTheme(colorScheme) - localStorage.setItem('system-theme', colorScheme || 'light') + setTheme(colorScheme); + localStorage.setItem('system-theme', colorScheme || 'light'); // page load - load any stored themes or set theme } else { // listen for system changes, update if any if (colorScheme !== systemTheme) { - setTheme(colorScheme) - localStorage.setItem('system-theme', colorScheme || 'light') + setTheme(colorScheme); + localStorage.setItem('system-theme', colorScheme || 'light'); // override local theme - localStorage.removeItem('local-theme') + localStorage.removeItem('local-theme'); } else { // else load local theme if (localTheme === 'light') { - lightModeOn() + lightModeOn(); } else if (localTheme === 'dark') { - darkModeOn() + darkModeOn(); } } } @@ -35,65 +35,65 @@ watchColorSchemeChange((_error, colorScheme) => { document.addEventListener('DOMContentLoaded', () => { document .querySelector('#theme-toggle') - .addEventListener('click', toggleLocalStorageTheme) - }) + .addEventListener('click', toggleLocalStorageTheme); + }); } -}) +}); // set the theme to given value function setTheme (theme) { // only support dark else any other defaults to light if (theme === 'dark') { - darkModeOn() + darkModeOn(); } else { - lightModeOn() + lightModeOn(); } } // toggle btwn themes or set a theme if none set function toggleLocalStorageTheme (e) { - const localTheme = localStorage.getItem('local-theme') + const localTheme = localStorage.getItem('local-theme'); if (localTheme === 'light') { - localStorage.setItem('local-theme', 'dark') - darkModeOn() + localStorage.setItem('local-theme', 'dark'); + darkModeOn(); } else if (localTheme === 'dark') { - localStorage.setItem('local-theme', 'light') - lightModeOn() + localStorage.setItem('local-theme', 'light'); + lightModeOn(); // localTheme still null } else { // need to check page state then set if (darkModeState()) { - localStorage.setItem('local-theme', 'light') - lightModeOn() + localStorage.setItem('local-theme', 'light'); + lightModeOn(); } else { - localStorage.setItem('local-theme', 'dark') - darkModeOn() + localStorage.setItem('local-theme', 'dark'); + darkModeOn(); } } } function darkModeOn () { - document?.documentElement?.classList?.remove('light-mode') - document?.documentElement?.classList?.add('dark-mode') + document?.documentElement?.classList?.remove('light-mode'); + document?.documentElement?.classList?.add('dark-mode'); } function lightModeOn () { - document?.documentElement?.classList.remove('dark-mode') - document?.documentElement?.classList?.add('light-mode') + document?.documentElement?.classList.remove('dark-mode'); + document?.documentElement?.classList?.add('light-mode'); } function darkModeState () { - return document?.documentElement?.classList.contains('dark-mode') + return document?.documentElement?.classList.contains('dark-mode'); } function hasLocalStorage () { - return typeof Storage !== 'undefined' + return typeof Storage !== 'undefined'; } function watchColorSchemeChange (callback) { // query user's machine for system setting & use that - const darkMediaQuery = window?.matchMedia('(prefers-color-scheme: dark)') + const darkMediaQuery = window?.matchMedia('(prefers-color-scheme: dark)'); const handleChange = (event) => { - const newColorScheme = event?.matches ? 'dark' : 'light' - callback(undefined, newColorScheme) - } - darkMediaQuery.addEventListener('change', handleChange) + const newColorScheme = event?.matches ? 'dark' : 'light'; + callback(undefined, newColorScheme); + }; + darkMediaQuery.addEventListener('change', handleChange); // handle init load value - callback(undefined, darkMediaQuery.matches ? 'dark' : 'light') + callback(undefined, darkMediaQuery.matches ? 'dark' : 'light'); // Return a function to remove the event listener - return () => darkMediaQuery.removeEventListener('change', handleChange) + return () => darkMediaQuery.removeEventListener('change', handleChange); }