/*!
 * Built with Stencil
 * By PostNord.
 */
'use strict';

var index = require('./index-CfUQZtlH.js');
var chevron_right = require('./chevron_right-CApgqZb0.js');
var index$1 = require('./index.cjs.js');

var translations = {
    LEFT: {
        sv: 'Bläddra åt vänster',
        en: 'Scroll to the left',
        da: 'Rul til venstre',
        fi: 'Vieritä vasemmalle',
        no: 'Rull til venstre',
    },
    RIGHT: {
        sv: 'Bläddra åt höger',
        en: 'Scroll to the right',
        da: 'Rul til højre',
        fi: 'Vieritä oikealle',
        no: 'Rull til høyre',
    },
};

const pnTablistCss = () => `${index.transformTag("pn-tablist")}{width:100%;min-width:0;position:relative;border-bottom:0.0625em solid #d3cecb;display:block}${index.transformTag("pn-tablist")} .pn-tablist,${index.transformTag("pn-tablist")} ol,${index.transformTag("pn-tablist")} ul{display:flex;width:100%;flex-direction:row;gap:1em;position:relative;list-style:none;padding:0;margin:0}${index.transformTag("pn-tablist")} .pn-tablist[data-stacked] .pn-tab,${index.transformTag("pn-tablist")} ol[data-stacked] .pn-tab,${index.transformTag("pn-tablist")} ul[data-stacked] .pn-tab{margin:0.5em 0.25em 0.75em;gap:0.25em;flex-direction:column}${index.transformTag("pn-tablist")} .pn-tablist[data-small] .pn-tab,${index.transformTag("pn-tablist")} ol[data-small] .pn-tab,${index.transformTag("pn-tablist")} ul[data-small] .pn-tab{margin:0.25em 0.25em 0.75em}${index.transformTag("pn-tablist")} .pn-tablist[data-small] .pn-tab>*:not(${index.transformTag("pn-icon")}),${index.transformTag("pn-tablist")} ol[data-small] .pn-tab>*:not(${index.transformTag("pn-icon")}),${index.transformTag("pn-tablist")} ul[data-small] .pn-tab>*:not(${index.transformTag("pn-icon")}){font-size:0.875em}${index.transformTag("pn-tablist")} .pn-tablist[data-large] .pn-tab>*:not(${index.transformTag("pn-icon")}),${index.transformTag("pn-tablist")} ol[data-large] .pn-tab>*:not(${index.transformTag("pn-icon")}),${index.transformTag("pn-tablist")} ul[data-large] .pn-tab>*:not(${index.transformTag("pn-icon")}){font-size:1.25em}${index.transformTag("pn-tablist")} .pn-tablist[data-scroll],${index.transformTag("pn-tablist")} ol[data-scroll],${index.transformTag("pn-tablist")} ul[data-scroll]{overflow-y:hidden;overflow-x:auto;scroll-snap-type:x mandatory}${index.transformTag("pn-tablist")} .pn-tablist::-webkit-scrollbar,${index.transformTag("pn-tablist")} ol::-webkit-scrollbar,${index.transformTag("pn-tablist")} ul::-webkit-scrollbar{display:none}${index.transformTag("pn-tablist")} .pn-tablist-line{height:0.25em;position:absolute;bottom:0}${index.transformTag("pn-tablist")} .pn-tablist-line-item{position:absolute;width:100%;height:inherit;border-radius:0.25em 0.25em 0 0;transform-origin:left center;opacity:0;transition-property:transform, opacity, width;transition-duration:0.4s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){${index.transformTag("pn-tablist")} .pn-tablist-line-item{transition-duration:0s;transition-delay:0s}}${index.transformTag("pn-tablist")} .pn-tablist-line-active{z-index:1;background-color:#005d92;width:var(--pn-active-width);transform:translateX(var(--pn-active-offset));opacity:var(--pn-active-opacity)}${index.transformTag("pn-tablist")} .pn-tablist-line-hovered{background-color:#00a0d6;width:var(--pn-hover-width);transform:translateX(var(--pn-hover-offset));opacity:var(--pn-hover-opacity)}${index.transformTag("pn-tablist")} .pn-tablist-scroll{position:absolute;top:50%;left:0;right:0;pointer-events:none;transform:translateY(-50%);display:flex;justify-content:space-between;align-items:center;z-index:1;height:100%}${index.transformTag("pn-tablist")} .pn-tablist-arrow{pointer-events:all;transform:scaleY(0);opacity:0;visibility:hidden;transition-property:transform, opacity, visibility;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.7, 0, 0.3, 1)}@media (prefers-reduced-motion: reduce){${index.transformTag("pn-tablist")} .pn-tablist-arrow{transition-duration:0s;transition-delay:0s}}${index.transformTag("pn-tablist")} .pn-tablist-arrow[data-show]{opacity:1;visibility:visible;transform:scaleY(1)}`;

const PnTablist = class {
    constructor(hostRef) {
        index.registerInstance(this, hostRef);
        this.tabchange = index.createEvent(this, "tabchange");
    }
    mo;
    isMenu = false;
    isTabHovered = false;
    tabListEl;
    lineActive;
    lineHovered;
    tabElement;
    get hostElement() { return index.getElement(this); }
    /** Display the scrolling arrows */
    showScrollArrows = false;
    /** Display the scroll arrow to the left */
    arrowLeft = false;
    /** Display the scroll arrow to the right */
    arrowRight = false;
    /** Give the tablist a name for screenreaders. */
    label;
    /** The value of the tab that is currently active, each `<pn-tab value="example-value">` also expects a unique value */
    value;
    /** Make the tablist smaller */
    small;
    /** Icons are stacked vertically instead of the default rows */
    stackedicons = false;
    /** Manually set the language. */
    language = null;
    /**
     * This will emit when a tab is changed. The detail property of the event will contain the value of the selected tab.
     * This is the event and value you listen to when you toggle the visibility among your tabpanels.
     **/
    tabchange;
    setValue() {
        const tabs = Array.from(this.hostElement.querySelectorAll(`${index.transformTag("pn-tab")}`));
        tabs.forEach(tab => {
            tab.activeTab = this.value;
        });
    }
    scrollHandler() {
        if (this.showScrollArrows) {
            this.tabListEl.addEventListener('scroll', this.scrollIndicators.bind(this));
        }
        else {
            this.tabListEl.removeEventListener('scroll', this.scrollIndicators);
        }
    }
    setActiveTabHandler({ detail }) {
        this.tabElement = detail.el;
        requestAnimationFrame(() => this.activateTab(detail.el));
        if (this.value === detail.val)
            return;
        this.value = detail.val;
        this.tabchange.emit(this.value);
        this.tabElement.querySelector('.pn-tab').focus();
    }
    rerender() {
        requestAnimationFrame(() => {
            this.scrollIndicators();
            this.isTabHovered = false;
        });
    }
    handleEnter(e) {
        this.isTabHovered = true;
        this.styleLines(e.target);
    }
    handleLeave() {
        this.isTabHovered = false;
        setTimeout(() => {
            if (!this.isTabHovered)
                this.lineHovered.style.setProperty('--pn-hover-opacity', '0');
        }, 500);
    }
    connectedCallback() {
        this.mo = new MutationObserver(() => {
            index.forceUpdate(this.hostElement);
            this.setValue();
            this.rerender();
        });
        this.mo.observe(this.hostElement, { subtree: true, childList: true });
    }
    disconnectedCallback() {
        this.mo?.disconnect();
    }
    async componentWillLoad() {
        this.isMenu = this.hostElement.slot === 'menu';
        if (this.language === null)
            await index$1.awaitTopbar(this.hostElement);
    }
    componentDidRender() {
        this.setValue();
        this.rerender();
    }
    getRect(element) {
        return element.getBoundingClientRect();
    }
    activateTab(element) {
        this.styleLines(element, true);
        this.styleLines(element, false);
    }
    styleLines(element, active = false) {
        const tabListCoords = this.getRect(this.tabListEl);
        const scrollOffset = this.tabListEl.scrollLeft;
        const line = this.getRect(element);
        const width = line.width;
        const offset = line.left + scrollOffset - tabListCoords.left;
        const cssVar = active ? 'active' : 'hover';
        const prop = active ? 'lineActive' : 'lineHovered';
        this[prop].style.setProperty(`--pn-${cssVar}-width`, `${width}px`);
        this[prop].style.setProperty(`--pn-${cssVar}-offset`, `${offset}px`);
        this[prop].style.setProperty(`--pn-${cssVar}-opacity`, '1');
    }
    scrollIndicators() {
        const { scrollWidth, scrollLeft } = this.tabListEl;
        const { clientWidth } = this.hostElement;
        this.showScrollArrows = scrollWidth > clientWidth;
        this.arrowLeft = this.showScrollArrows && scrollLeft > 0;
        this.arrowRight = this.showScrollArrows && clientWidth + 16 + scrollLeft < scrollWidth;
    }
    scroll({ right = false } = {}) {
        const tabList = this.tabListEl;
        const { scrollLeft, clientWidth } = tabList;
        let left = scrollLeft;
        // The width of the scroll arrow is 32px, so we remove that from this calculation so the scroll
        const scrollAmount = clientWidth - 64;
        if (right)
            left += scrollAmount;
        else
            left -= scrollAmount;
        tabList.scrollTo({
            left,
            behavior: 'smooth',
        });
    }
    translate(prop) {
        return translations?.[prop]?.[this.language || index$1.en];
    }
    render() {
        return (index.h(index.Host, { key: '41730f7c2c9bf8dcd0094e3485daaef03d32077d' }, index.h("nav", { key: '671968d8fc09799313c5cc84182c0f574c4c32c2', class: "pn-tablist", role: this.isMenu ? null : 'tablist', "aria-label": this.label, "data-stacked": this.stackedicons, "data-small": !this.isMenu && this.small, "data-large": this.isMenu, "data-scroll": this.showScrollArrows, ref: el => (this.tabListEl = el) }, index.h("slot", { key: '9a29c7b0b2be65f13f0c54782f95381b44184928' }), index.h("div", { key: '5c7d7811e65c236592cbc86ccb36a1f4b9c2d83f', class: "pn-tablist-line" }, index.h("div", { key: 'fa070fd0ad1bd2baaaaedcd83d3a184f9acd8775', ref: el => (this.lineActive = el), class: "pn-tablist-line-item pn-tablist-line-active" }), index.h("div", { key: 'f1d81e3ba4363412d5f35cae105766fbb77ba31e', ref: el => (this.lineHovered = el), class: "pn-tablist-line-item pn-tablist-line-hovered" }))), index.h("div", { key: '14d644cb2ae344966b8056422ce52966fb06058b', class: "pn-tablist-scroll" }, index.h("pn-button", { key: 'f8c8f0f36459b6415208679196ed15fb9cd482d2', class: "pn-tablist-arrow", "data-show": this.arrowLeft, onClick: () => this.scroll(), noTab: true, appearance: "light", variant: "outlined", icon: chevron_right.chevron_left, iconOnly: true, arialabel: this.translate('LEFT'), small: true }), index.h("pn-button", { key: '588b9a9619087bd05a9d359b139240d054431848', class: "pn-tablist-arrow", "data-show": this.arrowRight, onClick: () => this.scroll({ right: true }), noTab: true, appearance: "light", variant: "outlined", icon: chevron_right.chevron_right, iconOnly: true, arialabel: this.translate('RIGHT'), small: true }))));
    }
    static get watchers() { return {
        "value": [{
                "setValue": 0
            }],
        "showScrollArrows": [{
                "scrollHandler": 0
            }]
    }; }
};
PnTablist.style = pnTablistCss();

exports.pn_tablist = PnTablist;
