From acbe0f685f139b14dc7cabe35f110c3364277ec6 Mon Sep 17 00:00:00 2001 From: Nicolas Langle Date: Wed, 5 Feb 2025 17:19:41 +0100 Subject: [PATCH 1/4] feat (theme): more concise isPlainObject function --- src/js/utils/isPlainObject.js | 36 +++-------------------------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/src/js/utils/isPlainObject.js b/src/js/utils/isPlainObject.js index 246a602b..e7c4651d 100644 --- a/src/js/utils/isPlainObject.js +++ b/src/js/utils/isPlainObject.js @@ -1,39 +1,9 @@ /*! - * is-plain-object + * isPlainObject * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. + * Copyright https://stackoverflow.com/users/6023279/trunow. */ -function isObject(o) { - return Object.prototype.toString.call(o) === '[object Object]' -} - export default function isPlainObject(o) { - let ctor, prot - - if (isObject(o) === false) { - return false - } - - // If has modified constructor - ctor = o.constructor - if (ctor === undefined) { - return true - } - - // If has modified prototype - prot = ctor.prototype - if (isObject(prot) === false) { - return false - } - - // If constructor does not have an Object-specific method - // eslint-disable-next-line no-prototype-builtins - if (prot.hasOwnProperty('isPrototypeOf') === false) { - return false - } - - // Most likely a plain Object - return true + return o?.constructor === Object || Object.getPrototypeOf(o ?? 0) === null } From cfa1e155e6901e17df184ec5f485865d8ad1b929 Mon Sep 17 00:00:00 2001 From: Nicolas Langle Date: Wed, 5 Feb 2025 17:27:07 +0100 Subject: [PATCH 2/4] feat (theme): isRTL, allow tests on tags other than html --- src/js/utils/isRTL.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/utils/isRTL.js b/src/js/utils/isRTL.js index 0fb72ec4..4a86dbaa 100644 --- a/src/js/utils/isRTL.js +++ b/src/js/utils/isRTL.js @@ -1,4 +1,4 @@ -export default function isRTL() { +export default function isRTL(container = document.documentElement) { const rtlLanguages = [ 'ar', // Arabic 'fa', // Persian (Farsi) @@ -13,5 +13,5 @@ export default function isRTL() { 'yi', // Yiddish ] - return document.documentElement.dir === 'rtl' || rtlLanguages.includes(document.documentElement.lang) + return container.dir === 'rtl' || rtlLanguages.includes(container.lang) } From 676e602de742896966c103b73924e0be4dee6ec9 Mon Sep 17 00:00:00 2001 From: Nicolas Langle Date: Wed, 5 Feb 2025 17:34:46 +0100 Subject: [PATCH 3/4] feat (theme): remove js each function --- src/js/classes/Header.js | 23 +++++++++-------------- src/js/utils/each.js | 8 -------- 2 files changed, 9 insertions(+), 22 deletions(-) delete mode 100644 src/js/utils/each.js diff --git a/src/js/classes/Header.js b/src/js/classes/Header.js index e0cf95cd..a5c5d0dc 100644 --- a/src/js/classes/Header.js +++ b/src/js/classes/Header.js @@ -1,5 +1,4 @@ import AbstractDomElement from './AbstractDomElement' -import each from '../utils/each' import { Tween } from 'oneloop.js' import isRTL from '../utils/isRTL' @@ -14,10 +13,10 @@ class Header extends AbstractDomElement { const that = this const el = this._element - const toggle = el.getElementsByClassName('header__menu-toggle')[0] - const menuList = el.getElementsByClassName('header__menu-list')[0] - const liWithChidren = el.getElementsByClassName('menu-item-has-children') - const menu = el.getElementsByClassName('header__menu')[0] + const toggle = el.querySelector('.header__menu-toggle') + const menuList = el.querySelector('.header__menu-list') + const liWithChidren = el.querySelectorAll('.menu-item-has-children') + const menu = el.querySelector('.header__menu') this._menu = menu this._toggle = toggle @@ -30,11 +29,7 @@ class Header extends AbstractDomElement { easing: 'easeInOutExpo', onUpdate: function (timestamp, tick, percent) { const bp = 768 - let direction = window.innerWidth >= bp ? -1 : 1 - - if (isRTL()) { - direction = window.innerWidth >= bp ? 1 : -1 - } + let direction = (window.innerWidth >= bp ? -1 : 1) * (isRTL() ? -1 : 1) menu.style.transform = 'translateX(' + 100 * (percent - 1) * direction + '%)' }, @@ -48,18 +43,18 @@ class Header extends AbstractDomElement { // avoid error for empty theme if (menuList) { - each(menuList.children, function (li) { + for (const li of menuList.children) { li.addEventListener('mouseenter', onMouseEnterFirstLevelLi.bind(that)) - }) + } - each(liWithChidren, function (li) { + for (const li of liWithChidren) { const subMenuToggle = li.children[1] li.addEventListener('mouseenter', onMouseEnterLi.bind(that)) li.addEventListener('mouseleave', onMouseLeaveLi.bind(that)) subMenuToggle.addEventListener('keypress', onKeyPressSubMenuToggle.bind(that)) subMenuToggle.addEventListener('touchstart', onTouchStartSubMenuToggle.bind(that)) - }) + } toggle.addEventListener('click', onClickToggle.bind(this)) document.addEventListener('keyup', onKeyup.bind(this)) diff --git a/src/js/utils/each.js b/src/js/utils/each.js deleted file mode 100644 index 9262a26b..00000000 --- a/src/js/utils/each.js +++ /dev/null @@ -1,8 +0,0 @@ -export default function (array, callback) { - const l = array.length - var i - - for (i = 0; i < l; i++) { - callback(array[i], i, l) - } -} From 9f4e77ecd150cacc20137fed02809031e31b0243 Mon Sep 17 00:00:00 2001 From: Nicolas Langle Date: Wed, 5 Feb 2025 17:37:46 +0100 Subject: [PATCH 4/4] feat (theme): remove var in extend function --- src/js/utils/extend.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/js/utils/extend.js b/src/js/utils/extend.js index 61212b6c..e4a49555 100644 --- a/src/js/utils/extend.js +++ b/src/js/utils/extend.js @@ -6,11 +6,9 @@ export default function extend() { const deep = firstArgIsBool ? args[0] : false const start = firstArgIsBool ? 1 : 0 const rt = isPlainObject(args[start]) ? args[start] : {} - var i - var prop - for (i = start + 1; i < args.length; i++) { - for (prop in args[i]) { + for (let i = start + 1; i < args.length; i++) { + for (let prop in args[i]) { if (deep && isPlainObject(args[i][prop])) { rt[prop] = extend(true, {}, rt[prop], args[i][prop]) } else if (typeof args[i][prop] !== 'undefined') {