export class Layout extends HTMLElement { constructor() { super() this.attachShadow({mode: 'open'}) this.csp = "default-src 'self' 'unsafe-inline' 'unsafe-eval'" this.header = document.createElement('m-header') } connectedCallback() { const style = document.createElement('style') style.textContent = ` :host { display: flex; flex-direction: column; } .m-page { flex-grow: 1; } ` this.shadowRoot.appendChild(style) this.header.editing = this.editing this.header.addEventListener('click-edit', () => { this.editing = !this.editing }) this.shadowRoot.appendChild(this.header) this.load() addEventListener('hashchange', () => { this.load() }) } load() { const path = this.path const prevPage = this.page this.page = document.createElement('m-page') this.page.csp = this.csp this.page.path = path this.editing = this.editing if (prevPage !== undefined) { prevPage.remove() } this.shadowRoot.appendChild(this.page) this.header.path = path } get path() { const hash = ( window.location.hash.slice(1) || '/' ) return hash.startsWith('/') ? new URL( hash, window.location ).pathname : hash } set editing(value) { sessionStorage.setItem( 'editing', value ? 'true' : 'false' ) this.header.editing = this.editing if (this.page) { this.page.editing = this.editing } } get editing() { try { return ( sessionStorage.getItem('editing') === 'true' ) } catch (e) { return false } } }