{"version":3,"file":"helpers-01739d22-D8T0fPBR.js","sources":["../../../node_modules/@trv-tds/react/node_modules/@trv-tds/webcomponents/dist/esm/helpers-01739d22.js"],"sourcesContent":["const ID_PARSER_RX = /\\b\\S+\\b/g;\nconst hasShadowDom = (el) => {\n    return !!el.shadowRoot && !!el.attachShadow;\n};\n/**\n * The CustomElement polyfill StencilJS provides does something odd with the `children` property\n * of elements that would be in the shadow DOM. This function works around that by using `childNodes`\n * and filtering nodes that are Elements.\n * @param parentEl The parent element to return chuld elements of\n * @param selector Optional. if provided, returns just those elements that match the selector\n * @returns An arry of child elements\n */\nfunction getChildElements(parentEl, selector) {\n    const children = parentEl\n        ? Array.from(parentEl.childNodes).filter((node) => node.nodeType === Node.ELEMENT_NODE)\n        : [];\n    return selector ? children.filter((el) => el.matches(selector)) : children;\n}\nfunction configFromDataAttributes(el, defaultConfig = {}, conversions) {\n    const config = { ...defaultConfig };\n    for (let data in el.dataset) {\n        const value = el.dataset[data];\n        config[data] =\n            value === 'true' || value === ''\n                ? true\n                : value === 'false'\n                    ? false\n                    : value;\n        if (conversions) {\n            convertDataAttribute(config, data, value, conversions);\n        }\n    }\n    return config;\n}\nfunction convertDataAttribute(config, property, value, conversions) {\n    const propConversions = conversions.filter((conversion) => conversion.convert && conversion.names?.includes(property));\n    propConversions.forEach((propConversion) => {\n        const { convert } = propConversion;\n        let convertedValue;\n        if (typeof convert === 'function') {\n            convertedValue = convert(value, property, config);\n        }\n        else if (typeof convert === 'string') {\n            switch (convert) {\n                case 'integer':\n                    convertedValue = parseInt(value);\n                    break;\n                case 'number':\n                    convertedValue = parseFloat(value);\n                    break;\n                case 'function':\n                case 'object':\n                    convertedValue = convertStringRef(value, convert);\n                    break;\n                case 'json':\n                    if (/^[\\{\\[\\\"].+[\\}\\]\\\"]$/.test(value)) {\n                        try {\n                            convertedValue = JSON.parse(value);\n                        }\n                        catch { }\n                    }\n                    break;\n            }\n        }\n        if (typeof convertedValue !== 'undefined') {\n            config[property] = convertedValue;\n        }\n    });\n}\nfunction getConfigObjectFromString(name, context = window) {\n    const parts = name.split('.');\n    let ref = context;\n    while (ref && parts.length > 1) {\n        ref = ref[parts.shift()];\n    }\n    return ref && ref[parts[0]];\n}\nfunction convertStringRefs(config, names, type) {\n    names.forEach((name) => {\n        const obj = convertStringRef(config[name], type);\n        if (typeof obj !== 'undefined') {\n            config[name] = obj;\n        }\n    });\n}\nfunction convertStringRef(value, type) {\n    if ('string' === typeof value) {\n        const obj = getConfigObjectFromString(value);\n        if (type === typeof obj) {\n            return obj;\n        }\n    }\n    return undefined;\n}\nfunction getLabelledByLabel(el) {\n    const labelledByIds = el.getAttribute('aria-labelledby');\n    return labelledByIds\n        ? labelledByIds\n            .match(ID_PARSER_RX)\n            .map((id) => {\n            const labelledByEl = el.ownerDocument.getElementById(id);\n            return (labelledByEl &&\n                (labelledByEl.getAttribute('aria-label') ||\n                    labelledByEl.textContent ||\n                    '').trim());\n        })\n            .filter((label) => label)\n            .join(' ')\n            .trim()\n        : '';\n}\nfunction getLabelFor(el) {\n    // start with aria label attributes\n    let label = el.getAttribute('aria-label');\n    let labelledby = el.getAttribute('aria-labelledby');\n    if (!label && !labelledby && el.labels instanceof NodeList) {\n        const labels = Array.from(el.labels);\n        const ids = labels.map((label) => label.id).filter(Boolean);\n        if (ids.length === labels.length) {\n            // all labels have ids, so set labelledby\n            labelledby = ids.join(' ');\n        }\n        else {\n            label = labels.map((label) => label.textContent?.trim()).join(' ');\n        }\n    }\n    return {\n        label: label || undefined,\n        labelledby: labelledby || undefined,\n        describedby: el.getAttribute('aria-describedby') || undefined,\n    };\n}\nfunction htmlEncode(text) {\n    return (text || '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/'/g, '&#39;')\n        .replace(/\"/g, '&quot;');\n}\n/**\n * Splits text between visual text and visually hidden text. Use this\n * for converting text from i18n or from configuration into markup that\n * visually hides portion of the text. Square brackets are used to demark\n * screen-reader-only text. e.g. \"[show] menu\" would become\n * \"<span class=\"tds-sr-only\">Show<span><span> menu</span>\"\n * @param text The text to split\n * @param formatter A function to convert the text as needed. e.g.\n * Core would format html string and WC would retrun JSX\n * @returns An array of the items returns by formattter\n */\nfunction splitTextForScreenReader(text, formatter) {\n    const rx = /(\\[[^\\[\\]]+\\])/g;\n    const parts = text.split(rx).filter(Boolean);\n    return parts.map(part => {\n        const srOnly = rx.test(part);\n        part = srOnly ? part.substring(1, part.length - 1) : part;\n        return formatter(part, srOnly);\n    });\n}\nlet _positionStickySupport;\nfunction positionStickySupported() {\n    if (typeof _positionStickySupport === 'undefined') {\n        const style = document.createElement('div').style;\n        style.cssText =\n            'position:sticky;position:-webkit-sticky;position:-ms-sticky;';\n        _positionStickySupport = style.position.indexOf('sticky') !== -1;\n    }\n    return _positionStickySupport;\n}\nlet _pointerEventsSupport;\nfunction pointerEventsSupported() {\n    if (typeof _pointerEventsSupport === 'undefined') {\n        const style = document.createElement('div').style;\n        style.cssText = 'pointer-events:none';\n        _pointerEventsSupport =\n            !!style.pointerEvents && style.pointerEvents == 'none';\n    }\n    return _pointerEventsSupport;\n}\n/**\n * Returns the text an array of strings where split by the matching text.\n * The array items alternate between text before the matching text, then the matching text.\n * e.g. text = 'Banana Cream' and match = 'a' returns:\n * ['B', 'a', 'n', 'a', 'Cre', 'a', 'm']\n * This function is useful for highlighting matched text in a filter list.\n * When processing the array, (index % 2 === 0) is non-matching text, (index % 2 === 1) is the matching text\n * @param text The full text string\n * @param match The string to match on\n * @returns An array of alternating non-match and matching text\n */\nfunction splitTextByMatch(text, match) {\n    if (!match) {\n        return [text];\n    }\n    const result = [];\n    const parts = text.toLowerCase().split(match.toLowerCase());\n    let length = 0;\n    parts.forEach((part) => {\n        result.push(text.substr(length, part.length));\n        length += part.length;\n        if (length < text.length) {\n            result.push(text.substr(length, match.length));\n            length += match.length;\n        }\n    });\n    return result;\n}\n/**\n * Visually hides an element so it is only read by a screen reader. Updates the element's style property\n * Use this when creating elements and you cann;t be certain that the `tds-sr-only` or similar class\n * is implemented.\n *\n * @param el\n */\nfunction visuallyHide(el) {\n    el.style.position = 'absolute';\n    el.style.left = '-10000px';\n    el.style.top = 'auto';\n    el.style.width = '1px';\n    el.style.height = '1px';\n    el.style.overflow = 'hidden';\n}\n//////////////////////////////////////////////////////////////////////////////////////////\n// courtesy of https://github.com/microsoft/sonder-ui/blob/master/src/shared/utils.ts\n// check if an element is currently scrollable\nfunction isScrollable(element) {\n    return element && element.clientHeight < element.scrollHeight;\n}\n// ensure given child element is within the parent's visible scroll area\nfunction maintainScrollVisibility(activeElement, scrollParent, includeMargin, scrollToTop) {\n    const { offsetHeight, offsetTop } = activeElement;\n    const { marginTop, marginBottom } = getComputedStyle(activeElement);\n    const { clientHeight: parentClientHeight, scrollTop: parentScrollTop } = scrollParent;\n    const isAbove = offsetTop < parentScrollTop;\n    const isBelow = offsetTop + offsetHeight > parentScrollTop + parentClientHeight;\n    if (isAbove || scrollToTop) {\n        scrollParent.scrollTo(0, includeMargin ? offsetTop - parseInt(marginTop, 10) : offsetTop);\n    }\n    else if (isBelow) {\n        scrollParent.scrollTo(0, offsetTop -\n            parentClientHeight +\n            (includeMargin\n                ? offsetHeight + parseInt(marginBottom, 10)\n                : offsetHeight));\n    }\n}\n//////////////////////////////////////////////////////////////////////////////////////////\n/**\n * Iterates through an array of class names applying each class name to the element until\n * it finds the one that positions element fully within the browser window. (Or, if in\n * a container with overflow not visible, that container's boundaries) If a class name is\n * not found, reverts to the first setting in the array. This is used primarily for\n * positioning popups for components such as combobox.\n * @param element The element whose position is checked as classes are applied\n * @param classes: string[] An array of classes to apply. An array item could be an empty string,\n * meaning check the element without any class names applied (likely the first item).\n * An array item could also be a space delimited list of multiple classes to apply.\n * @param applyClassTo The element to apply the class names to. If not passed, applies the class names to element.\n */\nfunction bestPositionElement(element, classes, applyClassTo = element) {\n    const windowHeight = window.innerHeight;\n    const windowWidth = window.innerWidth;\n    classes.forEach((classNames) => {\n        classNames\n            .split(' ')\n            .forEach((cls) => cls && applyClassTo.classList.remove(cls));\n    });\n    // add first option to end of list to fallback to the default\n    classes = [...classes, classes[0]];\n    let minTop = 0;\n    let minLeft = 0;\n    let maxRight = windowWidth;\n    let maxBottom = windowHeight;\n    // if the element is contained in an element that does not show overflow, constrain the element to those dimensions;\n    // This logic is not 100%. An absolutely position element can break from its clipping ancestor its offset parent is also\n    // positioned absolute. But that's too complicated and this serves our purpose for now\n    let container = getOverflowParent(element);\n    if (container) {\n        const restoreHidden = element.hidden;\n        element.hidden = true; // hide the element so it does not add scrollbars and change the dimensions of the container\n        const { top: pTop, bottom: pBottom, left: pLeft, right: pRight, } = container.getBoundingClientRect();\n        minTop = Math.max(pTop, 0);\n        minLeft = Math.max(pLeft, 0);\n        maxRight = Math.min(pRight, windowWidth);\n        maxBottom = Math.min(pBottom, windowHeight);\n        element.hidden = restoreHidden;\n    }\n    for (let i = 0; i < classes.length; i++) {\n        const classNames = classes[i];\n        classNames\n            .split(' ')\n            .forEach((cls) => cls && applyClassTo.classList.add(cls));\n        // if we are on the last (default) setting, keep that setting and don't retest\n        if (i < classes.length - 1) {\n            const { top, bottom, left, right } = element.getBoundingClientRect();\n            if (top >= minTop &&\n                left >= minLeft &&\n                right <= maxRight &&\n                bottom <= maxBottom) {\n                // fits\n                break;\n            }\n            classNames\n                .split(' ')\n                .forEach((cls) => cls && applyClassTo.classList.remove(cls));\n        }\n    }\n}\n/**\n * Finds the parent element that clips overflow. Recognizes if element is slotted and steps through shadow DOM if needed\n * @param element The element to start from\n * @returns overflow parent or null if none found\n */\nfunction getOverflowParent(element) {\n    let parent = element.parentElement;\n    if (element.assignedSlot) {\n        parent = element.assignedSlot.parentElement;\n    }\n    if (!parent && element.parentNode) {\n        parent = element.parentNode.host;\n    }\n    if (parent) {\n        let { overflowX, overflowY } = window.getComputedStyle(parent);\n        overflowX = overflowX || 'visible'; // to make the unit test pass\n        overflowY = overflowY || 'visible'; // to make the unit test pass\n        if (overflowX === 'visible' && overflowY == 'visible') {\n            parent = getOverflowParent(parent);\n        }\n    }\n    return parent;\n}\n/**\n * This function is a work around for jsdom, which throws the error \"':focus-within' is not a valid selector\".\n * (https://github.com/jsdom/jsdom/issues/3055)\n * This seems to be related to an issue with the nwsapi package. (https://github.com/dperini/nwsapi/issues/47)\n * We could update nwsapi to the latest version, but we can't be certain other applications\n * using TDS will be current. So, to prevent their unit tests from failing, we'll fallback\n * to checking if it contains a focused element.\n */\nfunction hasFocus(element) {\n    return element.matches(':focus') || !!element.querySelector(':focus');\n}\n/**\n * Adds a leading 0 to single digits. Returns one of three strings:\n * - If the number is less than 10, returns the number with a leading 0\n * - If the number is greater than 10, returns the number unchanged\n * - If a string is provided and it evaluates to NaN, returns an empty string\n *\n * @param value The digit to append to. Can be a string or a number.\n */\nfunction to2Digits(value) {\n    const num = typeof value === 'string' ? parseInt(value, 10) : value;\n    return !isNaN(num) ? (num < 10 ? `0${num}` : num.toString()) : '';\n}\n\nexport { getLabelFor as a, bestPositionElement as b, configFromDataAttributes as c, htmlEncode as d, getConfigObjectFromString as e, hasFocus as f, getChildElements as g, hasShadowDom as h, isScrollable as i, splitTextForScreenReader as j, positionStickySupported as k, getLabelledByLabel as l, maintainScrollVisibility as m, convertStringRefs as n, pointerEventsSupported as p, splitTextByMatch as s, to2Digits as t, visuallyHide as v };\n\n//# sourceMappingURL=helpers-01739d22.js.map"],"names":["ID_PARSER_RX","hasShadowDom","el","getChildElements","parentEl","selector","children","node","configFromDataAttributes","defaultConfig","conversions","config","data","value","getConfigObjectFromString","name","context","parts","ref","convertStringRefs","names","type","obj","convertStringRef","getLabelledByLabel","labelledByIds","id","labelledByEl","label","getLabelFor","labelledby","labels","ids","_a","htmlEncode","text","splitTextForScreenReader","formatter","rx","part","srOnly","_positionStickySupport","positionStickySupported","style","_pointerEventsSupport","pointerEventsSupported","splitTextByMatch","match","result","length","visuallyHide","isScrollable","element","maintainScrollVisibility","activeElement","scrollParent","includeMargin","scrollToTop","offsetHeight","offsetTop","marginTop","marginBottom","parentClientHeight","parentScrollTop","isAbove","isBelow","bestPositionElement","classes","applyClassTo","windowHeight","windowWidth","classNames","cls","minTop","minLeft","maxRight","maxBottom","container","getOverflowParent","restoreHidden","pTop","pBottom","pLeft","pRight","i","top","bottom","left","right","parent","overflowX","overflowY","hasFocus","to2Digits","num"],"mappings":"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","x_google_ignoreList":[0]}