From 144acaf332f45e2a182679af708a1ed194a08632 Mon Sep 17 00:00:00 2001 From: bat Date: Sun, 9 Apr 2023 06:59:52 +0000 Subject: [PATCH] Handle links in sandbox --- nav-menu.js | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 nav-menu.js diff --git a/nav-menu.js b/nav-menu.js new file mode 100644 index 0000000..99f6899 --- /dev/null +++ b/nav-menu.js @@ -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) + } +} \ No newline at end of file