1 changed files with 96 additions and 0 deletions
@ -0,0 +1,96 @@ |
|||||
|
export class NavMenu extends HTMLElement { |
||||
|
constructor() { |
||||
|
super() |
||||
|
this.attachShadow({mode: 'open'}) |
||||
|
this.language = navigator.language |
||||
|
this.pages = [] |
||||
|
this.handleLinks = false |
||||
|
} |
||||
|
|
||||
|
connectedCallback() { |
||||
|
const style = document.createElement('style') |
||||
|
style.textContent = ` |
||||
|
:host { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
color: #000; |
||||
|
max-height: 100dvh; |
||||
|
} |
||||
|
h1 { |
||||
|
width: 100%; |
||||
|
text-align: center; |
||||
|
font-size: 18px; |
||||
|
margin: 0; |
||||
|
padding: 5px; |
||||
|
} |
||||
|
.page-list { |
||||
|
flex-grow: 1; |
||||
|
overflow-y: auto; |
||||
|
padding-bottom: 50px; |
||||
|
} |
||||
|
a { |
||||
|
display: block; |
||||
|
margin: 8px 10px; |
||||
|
} |
||||
|
` |
||||
|
this.shadowRoot.append(style) |
||||
|
this.header = document.createElement('h1') |
||||
|
this.header.innerText = this.pagesText |
||||
|
this.shadowRoot.append(this.header) |
||||
|
this.pageList = document.createElement('div') |
||||
|
this.pageList.classList.add('page-list') |
||||
|
this.shadowRoot.append(this.pageList) |
||||
|
this.renderPageList() |
||||
|
this.shadowRoot.addEventListener('click', e => { |
||||
|
if (this.handleLinks) { |
||||
|
e.preventDefault() |
||||
|
} |
||||
|
if (e.target.classList.contains('page')) { |
||||
|
this.dispatchEvent(new CustomEvent( |
||||
|
'close-menu', {bubbles: true} |
||||
|
)) |
||||
|
} |
||||
|
if (this.handleLinks) { |
||||
|
location.hash = `#${e.target.innerText}` |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
get language() { |
||||
|
return this._language |
||||
|
} |
||||
|
|
||||
|
set language(language) { |
||||
|
this._language = language |
||||
|
} |
||||
|
|
||||
|
get langEs() { |
||||
|
return /^es\b/.test(this.language) |
||||
|
} |
||||
|
|
||||
|
get pagesText() { |
||||
|
return this.langEs ? 'Páginas' : 'Pages' |
||||
|
} |
||||
|
|
||||
|
set pages(pages) { |
||||
|
this._pages = pages |
||||
|
if (this.pageList) { |
||||
|
this.renderPageList() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
get pages() { |
||||
|
return this._pages |
||||
|
} |
||||
|
|
||||
|
renderPageList() { |
||||
|
const els = this.pages.map(page => { |
||||
|
const el = document.createElement('a') |
||||
|
el.href = `#${page.replace(/^#/, '%23')}` |
||||
|
el.innerText = page |
||||
|
el.classList.add('page') |
||||
|
return el |
||||
|
}) |
||||
|
this.pageList.replaceChildren(...els) |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue