@nysds/nys-globalfooter
Version:
The Globalfooter component from the NYS Design System.
91 lines (90 loc) • 7.33 kB
JavaScript
import { LitElement as h, unsafeCSS as m, html as i } from "lit";
import { property as c, state as b } from "lit/decorators.js";
/*!
* █▄ █ █ █ █▀▀▀█ █▀▀▄ █▀▀▀█
* █ █ █ █▄▄▄█ ▀▀▀▄▄ █ █ ▀▀▀▄▄
* █ ▀█ █ █▄▄▄█ █▄▄▀ █▄▄▄█
*
* Global Footer Component v1.19.1
* Part of the New York State Design System
* Repository: https://github.com/its-hcd/nysds
* License: MIT
*/
const _ = ':host{--_nys-globalfooter-color: var( --nys-color-text, var(--nys-color-neutral-900, #1b1b1b) );--_nys-globalfooter-background-color: var( --nys-color-theme-weaker, var(--nys-color-state-blue-50, #eff6fb) );--_nys-globalfooter-gap: var(--nys-space-300, 24px);--_nys-globalfooter-padding--y: var(--nys-space-400, 32px);--_nys-globalfooter-padding--gutter: var(--nys-gutter-sm, 20px);--_nys-globalfooter-font-size--agency: var( --nys-font-size-agency-xl, var(--nys-font-size-2xl, 22px) );--_nys-globalfooter-font-size--link: var( --nys-font-size-body-md, var(--nys-font-size-md, 16px) );--_nys-globalfooter-line-height--agency: normal;--_nys-globalfooter-font-weight--regular: var(--nys-font-weight-regular, 400);--_nys-globalfooter-font-weight--semibold: var( --nys-font-weight-semibold, 600 );--_nys-globalfooter-max-width: var(--nys-max-content-width, 1280px);--_nys-globalfooter-font-family--agency: var( --nys-font-family-agency, "D Sari", Arial, sans-serif );--_nys-globalfooter-column-gap: var(--nys-space-400, 32px);--_nys-globalfooter-row-gap: var(--nys-space-400, 32px);--_nys-globalfooter-line-height--link: var(--nys-font-lineheight-ui-md, 24px);--_nys-globalfooter-letter-spacing: var( --nys-font-letterspacing-ui-md, var(--nys-font-letterspacing-400, .044px) );--_nys-globalfooter-font-family--link: var( --nys-font-family-ui, var( --nys-font-family-sans, "Proxima Nova", "Helvetica Neue", "Helvetica", "Arial", sans-serif ) );--_nys-globalfooter-text-decoration-thickness: var(--nys-size-2px, 2px);--_nys-globalfooter-background--divider: var(--nys-color-theme, #154973);--_nys-globalfooter-margin--divider: var(--nys-space-50, 4px)}.nys-globalfooter{display:flex;padding:var(--_nys-globalfooter-padding--y) var(--_nys-globalfooter-padding--gutter);justify-content:center;background-color:var(--_nys-globalfooter-background-color);color:var(--_nys-globalfooter-color);width:100%;box-sizing:border-box}.nys-globalfooter__main-container{display:flex;flex-direction:column;gap:var(--_nys-globalfooter-gap);width:100%;max-width:var(--_nys-globalfooter-max-width)}.nys-globalfooter__name{text-align:left;margin:0;color:var(--_nys-globalfooter-color);font-family:var(--_nys-globalfooter-font-family--agency);font-size:var(--_nys-globalfooter-font-size--agency);font-style:normal;font-weight:var(--_nys-globalfooter-font-weight--semibold);line-height:var(--_nys-globalfooter-line-height--agency);letter-spacing:normal}ul{list-style-type:none;padding:0;margin:0}li{margin:0;padding:0}a,span{color:var(--_nys-globalfooter-color);text-decoration:none;font-family:var(--_nys-globalfooter-font-family--link);font-size:var(--_nys-globalfooter-font-size--link);font-style:normal;font-weight:var(--_nys-globalfooter-font-weight--semibold);line-height:var(--_nys-globalfooter-line-height--link);letter-spacing:var(--_nys-globalfooter-letter-spacing)}ul li>span+ul li a{font-weight:var(--_nys-globalfooter-font-weight--regular)}a:hover{text-decoration:underline}a:active{text-decoration-thickness:var(--_nys-globalfooter-text-decoration-thickness)}.nys-globalfooter__content{width:100%}.nys-globalfooter__content ul{display:flex;flex-flow:column wrap;gap:var(--_nys-globalfooter-row-gap) var(--_nys-globalfooter-column-gap)}.nys-globalfooter__content ul li:has(span~ul){flex:1;display:flex;flex-direction:column}.nys-globalfooter__content ul:has(li>span~ul){--_nys-globalfooter-column-gap: var(--nys-space-500, 40px)}.nys-globalfooter__content ul li>span~ul{display:flex;flex-direction:column;gap:var(--nys-space-200, 16px)}.divider{margin-top:var(--_nys-globalfooter-margin--divider);margin-bottom:var(--nys-space-300, 24px)}@media(min-width:768px){.nys-globalfooter__content ul{flex-direction:row}.nys-globalfooter__content ul li:has(span~ul){flex:1 0 205px}:host{--_nys-globalfooter-padding--gutter: var(--nys-gutter-lg, 32px);--_nys-globalfooter-row-gap: var(--nys-space-600, 48px)}}@media(min-width:1280px){:host{--_nys-globalfooter-padding--gutter: var(--nys-gutter-xl, 64px)}}';
var v = Object.defineProperty, g = (y, a, l, n) => {
for (var o = void 0, e = y.length - 1, t; e >= 0; e--)
(t = y[e]) && (o = t(a, l, o) || o);
return o && v(a, l, o), o;
};
const f = class f extends h {
constructor() {
super(...arguments), this.agencyName = "", this.homepageLink = "", this.slotHasContent = !0;
}
/**
* Lifecycle Methods
* --------------------------------------------------------------------------
*/
firstUpdated() {
this.shadowRoot?.querySelector("slot")?.addEventListener("slotchange", () => this._handleSlotChange()), this._handleSlotChange();
}
/**
* Functions
* --------------------------------------------------------------------------
*/
// Gets called when the slot content changes and directly appends the slotted elements into the shadow DOM
async _handleSlotChange() {
const a = this.shadowRoot?.querySelector("slot");
if (!a) return;
const l = a?.assignedNodes({ flatten: !0 }).filter((e) => e.nodeType === Node.ELEMENT_NODE);
await Promise.resolve(), this.slotHasContent = l.length > 0;
const n = this.shadowRoot?.querySelector(
".nys-globalfooter__content"
), o = l?.some(
(e) => e.tagName === "H4"
);
n && (n.classList.toggle("columns", o), n.classList.toggle("small", !o), n.innerHTML = "", l.forEach((t) => {
if (t.nodeType === Node.ELEMENT_NODE) {
const r = t.cloneNode(!0);
["script", "iframe", "object", "embed", "img"].forEach((d) => {
r.querySelectorAll(d).forEach((p) => p.remove());
}), n.appendChild(r), t.remove();
}
}), n.querySelectorAll("span").forEach((t) => {
const r = document.createElement("nys-divider");
r.classList.add("divider"), t.insertAdjacentElement("afterend", r);
}));
}
render() {
return i`
<footer class="nys-globalfooter">
<div class="nys-globalfooter__main-container">
${this.homepageLink?.trim() ? i`<a href=${this.homepageLink?.trim()}>
<h2 class="nys-globalfooter__name">${this.agencyName}</h2>
</a>` : i`<h2 class="nys-globalfooter__name">${this.agencyName}</h2>`}
${this.slotHasContent ? i`<div class="nys-globalfooter__content">
<slot
style="display: hidden"
@slotchange="${this._handleSlotChange}"
></slot>
</div>` : ""}
</div>
</footer>
`;
}
};
f.styles = m(_);
let s = f;
g([
c({ type: String })
], s.prototype, "agencyName");
g([
c({ type: String })
], s.prototype, "homepageLink");
g([
b()
], s.prototype, "slotHasContent");
customElements.get("nys-globalfooter") || customElements.define("nys-globalfooter", s);
export {
s as NysGlobalFooter
};
//# sourceMappingURL=nys-globalfooter.js.map