From b06287d8f9cdbf6ce9a1df9e1ad767be35d5c055 Mon Sep 17 00:00:00 2001 From: bat Date: Wed, 15 Mar 2023 20:41:23 +0000 Subject: [PATCH] =?UTF-8?q?A=C3=B1adir=20'components/components/header.js'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/components/header.js | 100 ++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 components/components/header.js diff --git a/components/components/header.js b/components/components/header.js new file mode 100644 index 0000000..ea979e6 --- /dev/null +++ b/components/components/header.js @@ -0,0 +1,100 @@ +export class Header extends HTMLElement { + constructor() { + super() + this.attachShadow({mode: 'open'}) + this.addButton('=', () => { + this.menu.classList.add('open') + this.overlay.classList.add('open') + }) + this.addDivider() + this.addButton('-') + this.addMenu() + } + + addButton(text, onClick) { + const b = document.createElement('button') + b.innerText = text + this.shadowRoot.appendChild(b) + if (onClick) { + b.addEventListener('click', onClick) + } + } + + addDivider() { + const d = document.createElement('div') + d.classList.add('divider') + this.shadowRoot.appendChild(d) + } + + addMenu() { + this.overlay = document.createElement('div') + this.overlay.classList.add('overlay') + this.shadowRoot.appendChild(this.overlay) + this.menu = document.createElement('div') + this.menu.classList.add('menu') + const menuContent = document.createElement('m-nav-menu') + this.menu.appendChild(menuContent) + this.shadowRoot.appendChild(this.menu) + this.overlay.addEventListener('click', () => { + this.overlay.classList.add('closing') + this.overlay.classList.remove('open') + this.menu.classList.remove('open') + setTimeout(() => { + this.overlay.classList.remove('closing') + }, 250) + }) + } + + connectedCallback() { + const style = document.createElement('style') + style.textContent = ` + :host { + width: 100%; + background: #111; + color: #ddd; + display: flex; + direction: row; + } + button { + border: none; + background: inherit; + color: inherit; + font-size: 24px; + width: 24px; + } + div.divider { + flex-grow: 1; + } + div.menu { + position: fixed; + top: 0; + left: -90vw; + height: 100vh; + width: 90vw; + background-color: #fff; + transition: left .25s ease-in-out; + } + div.menu.open { + left: 0; + } + div.overlay { + position: fixed; + top: 0; + left: -100vw; + height: 100vh; + width: 100vw; + opacity: 0%; + transition: opacity .25s ease-in; + background: #777; + } + div.overlay.closing { + left: 0; + } + div.overlay.open { + left: 0; + opacity: 15%; + } + ` + this.shadowRoot.append(style) + } +} \ No newline at end of file