1
0

Update nav toggle functionality to pin when not default

This commit is contained in:
suroh 2025-03-22 09:39:53 +01:00
parent 60a8fc2a7a
commit fd4b924b14

@ -1,5 +1,5 @@
<label class="toggle">
<input type="radio" name="alxNav" :checked="activeNav"/>
<input type="radio" name="alxNav" :checked="activeNav" :class="activeNav ? 'locked' : ''"/>
<div class="indicator"></div>
</label>
@ -79,7 +79,15 @@ ul {
height: 100%;
}
input:checked:hover + .indicator:after {
opacity: 0.9;
}
input:checked + .indicator:after {
opacity: 0.5;
}
input.locked:checked + .indicator:after {
opacity: 1;
}
}
@ -89,19 +97,27 @@ ul {
customElements.define('alx-nav', class AlxNav extends HTMLElement {
static hoveredNavs = new Set()
static allNavs = []
#prechecked
#navToggle
constructor() {
super()
const navToggle = this.querySelector('input[type="radio"]')
this.#prechecked = navToggle.checked
this.#navToggle = this.querySelector('input[type="radio"]')
AlxNav.allNavs.push(this)
this.#navToggle.addEventListener('click', () => {
if (!this.#prechecked) {
AlxNav.allNavs.forEach(n => n.unPrecheck())
this.#prechecked = true
}
})
this.addEventListener('mouseenter', () => {
if (!this.classList.contains('hidden')) {
navToggle.checked = true
this.#navToggle.checked = true
AlxNav.hoveredNavs.add(this)
}
})
@ -111,14 +127,30 @@ customElements.define('alx-nav', class AlxNav extends HTMLElement {
if (!AlxNav.hoveredNavs.size) {
AlxNav.allNavs.forEach(n => n.setDefaultState())
} else {
navToggle.checked = false
this.#navToggle.checked = false
}
})
}
set #prechecked(val) {
if (val) {
this.#navToggle.classList.add('locked')
} else {
this.#navToggle.classList.remove('locked')
}
}
get #prechecked() {
return this.#navToggle.classList.contains('locked')
}
setDefaultState() {
const navToggle = this.querySelector('input[type="radio"]')
navToggle.checked = this.#prechecked
this.#navToggle.checked = this.#prechecked
}
unPrecheck() {
this.#prechecked = false
console.log('prechecked toggled', this.#prechecked)
}
})
</script>