UNPKG

@postnord/web-components

Version:
200 lines (199 loc) 8.04 kB
/*! * Built with Stencil * By PostNord. */ import { en, awaitTopbar } from "../../../globals/helpers"; import { h, Host, forceUpdate } from "@stencil/core"; import { arrow_left } from "pn-design-assets/pn-assets/icons.js"; const translations = { sv: 'Tillbaka', en: 'Back', da: 'Tilbage', fi: 'Takaisin', no: 'Tilbake', }; /** * The header component is a simple layout component used to display a page heading with optional text, buttons and tablist menu. * * @slot - The default slot is positioned below the heading and can be used to add additional text or elements. * @slot breadcrumb - This slot is reserved for a `pn-text-link` or another complex breadcrumb links structure. * Do not use this slot and the `go-back-href` prop at the same time. * @slot buttons - This slot is used to align multiple `pn-button` elements. However, we recommend a single button. * @slot menu - This slot is reserved for a `pn-tablist`. * This slot allows you to use the `href` prop on `pn-tab`, turning them into links instead of buttons. */ export class PnHeader { mo; hasBreadcrumb = false; hasButtons = false; hostElement; /** The `h1` text content. */ heading; /** Set a inner container max-width, any width CSS value is accepted. */ maxWidth; setMaxWidth() { if (!this.maxWidth) return; this.hostElement.style.setProperty('--max-width', this.maxWidth); } /** The href for the go back link. If this is provided a button be displayed. */ goBackHref; /** The text for the back link. */ goBackText; /** Set the language manually, only use this prop if the pnTopbar is not loaded. Supported: sv, en, da, fi and no. */ language = null; connectedCallback() { this.mo = new MutationObserver(() => { forceUpdate(this.hostElement); this.checkSlots(); }); this.mo.observe(this.hostElement, { subtree: true, childList: true }); } disconnectedCallback() { this.mo?.disconnect(); } async componentWillLoad() { this.checkSlots(); this.setMaxWidth(); if (this.language === null) await awaitTopbar(this.hostElement); } checkSlots() { this.hasBreadcrumb = !!this.hostElement.querySelector('[slot="breadcrumb"]'); this.hasButtons = !!this.hostElement.querySelector('[slot="buttons"]'); } showBreadcrumb() { return this.hasBreadcrumb || !!this.goBackHref?.length; } getButtonText() { return this.goBackText || translations[this.language || en]; } render() { return (h(Host, { key: 'cffcb3a6763d13783bad5d6b75f5402cfd92798b' }, h("header", { key: '7b6d663687fe12546ed88aaea3b97efd82afac69', class: "pn-header" }, h("div", { key: 'aec8dbf448077f14036f0cd4885add8bb650d647', class: "pn-header-container" }, h("div", { key: 'bff188666b4aa2f5df35476eddf17ac4ba5ba182', class: "pn-header-breadcrumbs", hidden: !this.showBreadcrumb() }, this.goBackHref && (h("pn-text-link", { key: '0f2ad8624741de50b2ed1c13cf7cfcae9ad6c223', label: this.getButtonText(), href: this.goBackHref, icon: arrow_left, leftIcon: true })), h("slot", { key: 'ece3524aafbff34f28e0d9cc6eafc587e1daeba5', name: "breadcrumb" })), h("div", { key: '1356eb7d669666b327575a00abdf86bbf9a9e38a', class: "pn-header-content" }, this.heading && h("h1", { key: 'c3e1419dbf20e789c98ea32bb73a3e5e1021f75a' }, this.heading), h("slot", { key: '94491e7af78f2ee44bc45b3a261f2bcc8af81377' })), h("div", { key: 'e2db0dcd84f2fbeb58ab793cd4220861c2320433', class: "pn-header-buttons", hidden: !this.hasButtons }, h("slot", { key: '1745323caaf67eb3f316f4ff56451ffefb6d9b7e', name: "buttons" })), h("slot", { key: '17d56ba2c125c766c05ae84eb82839391447dd74', name: "menu" }))))); } static get is() { return "pn-header"; } static get originalStyleUrls() { return { "$": ["pn-header.scss"] }; } static get styleUrls() { return { "$": ["pn-header.css"] }; } static get properties() { return { "heading": { "type": "string", "mutable": false, "complexType": { "original": "string", "resolved": "string", "references": {} }, "required": false, "optional": false, "docs": { "tags": [], "text": "The `h1` text content." }, "getter": false, "setter": false, "reflect": false, "attribute": "heading" }, "maxWidth": { "type": "string", "mutable": false, "complexType": { "original": "string", "resolved": "string", "references": {} }, "required": false, "optional": true, "docs": { "tags": [], "text": "Set a inner container max-width, any width CSS value is accepted." }, "getter": false, "setter": false, "reflect": false, "attribute": "max-width" }, "goBackHref": { "type": "string", "mutable": false, "complexType": { "original": "string", "resolved": "string", "references": {} }, "required": false, "optional": true, "docs": { "tags": [], "text": "The href for the go back link. If this is provided a button be displayed." }, "getter": false, "setter": false, "reflect": false, "attribute": "go-back-href" }, "goBackText": { "type": "string", "mutable": false, "complexType": { "original": "string", "resolved": "string", "references": {} }, "required": false, "optional": true, "docs": { "tags": [], "text": "The text for the back link." }, "getter": false, "setter": false, "reflect": false, "attribute": "go-back-text" }, "language": { "type": "string", "mutable": false, "complexType": { "original": "PnLanguages", "resolved": "\"\" | \"da\" | \"en\" | \"fi\" | \"no\" | \"sv\"", "references": { "PnLanguages": { "location": "import", "path": "@/globals/types", "id": "src/globals/types.ts::PnLanguages", "referenceLocation": "PnLanguages" } } }, "required": false, "optional": true, "docs": { "tags": [], "text": "Set the language manually, only use this prop if the pnTopbar is not loaded. Supported: sv, en, da, fi and no." }, "getter": false, "setter": false, "reflect": false, "attribute": "language", "defaultValue": "null" } }; } static get elementRef() { return "hostElement"; } static get watchers() { return [{ "propName": "maxWidth", "methodName": "setMaxWidth" }]; } }