import { LitElement, html } from 'lit'; import { customElement, queryAssignedElements } from 'lit/decorators.js'; import UiShellScss from './uiShell.scss'; /** * Container to help with positioning and padding of the global elements such as: adds padding for the fixed Header and Local Nav, adds main content gutters, and makes Footer sticky. This takes the onus off of the consuming app to configure these values. * @slot unnamed - Slot for global elements. */ @customElement('kyn-ui-shell') export class UiShell extends LitElement { static override styles = UiShellScss; /** @internal */ @queryAssignedElements({ selector: 'kyn-header' }) _headerEl!: any; /** @internal */ @queryAssignedElements({ selector: 'kyn-local-nav' }) _localNavEl!: any; /** @internal */ @queryAssignedElements({ selector: 'kyn-footer' }) _footerEl!: any; /** @internal */ @queryAssignedElements({ selector: 'main' }) _mainEl!: any; override render() { return html` `; } override firstUpdated() { if (this._localNavEl.length) { const LocalNav = this._localNavEl[0]; const Main = this._mainEl[0]; LocalNav.addEventListener('on-toggle', (e: any) => { e.detail.pinned ? Main.classList.add('pinned') : Main.classList.remove('pinned'); if (this._footerEl.length) { e.detail.pinned ? this._footerEl[0].classList.add('pinned') : this._footerEl[0].classList.remove('pinned'); } }); } } private handleSlotChange() { const Main = this._mainEl[0]; if (this._localNavEl.length) { const LocalNav = this._localNavEl[0]; Main.classList.add('has-local-nav'); LocalNav.pinned ? Main.classList.add('pinned') : Main.classList.remove('pinned'); if (this._footerEl.length) { this._footerEl[0].classList.add('has-local-nav'); LocalNav.pinned ? this._footerEl[0].classList.add('pinned') : this._footerEl[0].classList.remove('pinned'); } } else { Main.classList.remove('has-local-nav'); Main.classList.remove('pinned'); if (this._footerEl.length) { this._footerEl[0].classList.remove('pinned'); } } this.requestUpdate(); } } declare global { interface HTMLElementTagNameMap { 'kyn-ui-shell': UiShell; } }