@pure-ds/core 0.7.5 → 0.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/js/common/common.js", "../../../src/js/common/ask.js"],
4
- "sourcesContent": ["export function isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n\nexport function deepMerge(target, source) {\n const output = { ...target };\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target))\n Object.assign(output, { [key]: source[key] });\n else\n output[key] = deepMerge(target[key], source[key]);\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n }\n\n/**\n * Build a DocumentFragment from a template-like object (strings + values)\n * @param {{strings: string[], values: unknown[]}} templateLike\n * @returns {DocumentFragment}\n */\nexport function fragmentFromTemplateLike(templateLike) {\n const strings = Array.isArray(templateLike?.strings) ? templateLike.strings : [];\n const values = Array.isArray(templateLike?.values) ? templateLike.values : [];\n const consumedValues = new Set();\n const htmlParts = [];\n\n const propBindingPattern = /(\\s)(\\.[\\w-]+)=\\s*$/;\n\n for (let i = 0; i < strings.length; i += 1) {\n let chunk = strings[i] ?? \"\";\n const match = chunk.match(propBindingPattern);\n\n if (match && i < values.length) {\n const propToken = match[2];\n const propName = propToken.slice(1);\n const marker = `pds-val-${i}`;\n chunk = chunk.replace(\n propBindingPattern,\n `$1data-pds-prop=\"${propName}:${marker}\"`\n );\n consumedValues.add(i);\n }\n\n htmlParts.push(chunk);\n\n if (i < values.length && !consumedValues.has(i)) {\n htmlParts.push(`<!--pds-val-${i}-->`);\n }\n }\n\n const tpl = document.createElement(\"template\");\n tpl.innerHTML = htmlParts.join(\"\");\n\n const replaceValueAtMarker = (markerNode, value) => {\n const parent = markerNode.parentNode;\n if (!parent) return;\n\n if (value == null) {\n parent.removeChild(markerNode);\n return;\n }\n\n const insertValue = (val) => {\n if (val == null) return;\n if (val instanceof Node) {\n parent.insertBefore(val, markerNode);\n return;\n }\n if (Array.isArray(val)) {\n val.forEach((item) => insertValue(item));\n return;\n }\n parent.insertBefore(document.createTextNode(String(val)), markerNode);\n };\n\n insertValue(value);\n parent.removeChild(markerNode);\n };\n\n const walker = document.createTreeWalker(tpl.content, NodeFilter.SHOW_COMMENT);\n const markers = [];\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node?.nodeValue?.startsWith(\"pds-val-\")) {\n markers.push(node);\n }\n }\n\n markers.forEach((node) => {\n const index = Number(node.nodeValue.replace(\"pds-val-\", \"\"));\n replaceValueAtMarker(node, values[index]);\n });\n\n const elements = tpl.content.querySelectorAll(\"*\");\n elements.forEach((el) => {\n const propAttr = el.getAttribute(\"data-pds-prop\");\n if (!propAttr) return;\n const [propName, markerValue] = propAttr.split(\":\");\n const index = Number(String(markerValue).replace(\"pds-val-\", \"\"));\n if (propName && Number.isInteger(index)) {\n el[propName] = values[index];\n }\n el.removeAttribute(\"data-pds-prop\");\n });\n\n return tpl.content;\n}\n\n/**\n * Parses an HTML string into a NodeList\n * @param {String} html\n * @returns {NodeListOf<ChildNode>}\n */\nexport function parseHTML(html) {\n return new DOMParser().parseFromString(html, \"text/html\").body.childNodes;\n}", "import { fragmentFromTemplateLike } from \"./common.js\";\r\n\r\n/**\r\n * Get the current page title for dialogs\r\n */\r\nfunction getPageTitle() {\r\n return document.title || \r\n document.querySelector('h1')?.textContent || \r\n 'Application';\r\n}\r\n\r\n/**\r\n * Append message content using vanilla DOM APIs\r\n * @param {HTMLElement} container\r\n * @param {unknown} message\r\n */\r\nfunction appendMessageContent(container, message) {\r\n if (message == null) return;\r\n\r\n if (\r\n typeof message === \"object\" &&\r\n Array.isArray(message.strings) &&\r\n Array.isArray(message.values)\r\n ) {\r\n container.appendChild(fragmentFromTemplateLike(message));\r\n return;\r\n }\r\n\r\n if (message instanceof Node) {\r\n container.appendChild(message);\r\n return;\r\n }\r\n\r\n if (Array.isArray(message)) {\r\n message.forEach((item) => appendMessageContent(container, item));\r\n return;\r\n }\r\n\r\n const text = typeof message === \"string\" ? message : String(message);\r\n container.appendChild(document.createTextNode(text));\r\n}\r\n\r\nfunction isSafariBrowser() {\r\n const userAgent = navigator.userAgent;\r\n const isSafariEngine = /Safari/i.test(userAgent);\r\n const isOtherBrowser = /(Chrome|Chromium|CriOS|FxiOS|EdgiOS|OPiOS|Opera)/i.test(userAgent);\r\n return isSafariEngine && !isOtherBrowser;\r\n}\r\n\r\nfunction playDialogEnterAnimation(dialog) {\r\n if (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) {\r\n return;\r\n }\r\n\r\n const isMobile = window.matchMedia?.('(max-width: 639px)').matches;\r\n const animationName = dialog.classList.contains('dialog-no-scale-animation')\r\n ? 'pds-dialog-fade-enter'\r\n : isMobile\r\n ? 'pds-dialog-enter-mobile'\r\n : 'pds-dialog-enter';\r\n\r\n dialog.style.animation = 'none';\r\n void dialog.offsetWidth;\r\n dialog.style.animation = `${animationName} var(--transition-normal) ease`;\r\n\r\n dialog.addEventListener('animationend', () => {\r\n dialog.style.animation = '';\r\n }, { once: true });\r\n}\r\n\r\nfunction shouldUseLiquidGlass(options = {}) {\r\n return options?.liquidGlassEffects === true;\r\n}\r\n\r\n/**\r\n * Create a PDS-compliant dialog with proper semantic structure\r\n * @param {string|Node|Array} message - Message content (string or DOM nodes)\r\n * @param {Object} options - Dialog options\r\n * @returns {Promise} Resolves with result when dialog closes\r\n */\r\nexport async function ask(message, options = {}) {\r\n \r\n const defaults = {\r\n title: \"Confirm\",\r\n type: \"confirm\", // 'alert', 'confirm', 'custom'\r\n buttons: {\r\n ok: { name: \"OK\", primary: true },\r\n cancel: { name: \"Cancel\", cancel: true },\r\n },\r\n };\r\n \r\n options = { ...defaults, ...options };\r\n \r\n return new Promise((resolve) => {\r\n // Create native dialog element\r\n const dialog = document.createElement(\"dialog\");\r\n\r\n if (isSafariBrowser()) {\r\n dialog.classList.add(\"dialog-no-scale-animation\");\r\n }\r\n \r\n if (shouldUseLiquidGlass(options))\r\n dialog.classList.add(\"liquid-glass\");\r\n \r\n // Add optional CSS classes\r\n if (options.size) {\r\n dialog.classList.add(`dialog-${options.size}`); // dialog-sm, dialog-lg, dialog-xl\r\n }\r\n if (options.type) {\r\n dialog.classList.add(`dialog-${options.type}`);\r\n }\r\n if (options.class) {\r\n if (Array.isArray(options.class)) {\r\n dialog.classList.add(...options.class);\r\n } else {\r\n dialog.classList.add(options.class);\r\n }\r\n }\r\n \r\n // Set maxHeight via CSS custom property (constrained to 90vh by default)\r\n if (options.maxHeight) {\r\n dialog.style.setProperty('--dialog-max-height', options.maxHeight);\r\n }\r\n\r\n // Build button elements\r\n const buttons = Object.entries(options.buttons).map(([code, obj]) => {\r\n const btnClass = obj.primary ? \"btn-primary btn-sm\" : \"btn-outline btn-sm\";\r\n const btnType = obj.cancel ? \"button\" : \"submit\";\r\n return `<button type=\"${btnType}\" class=\"${btnClass}\" value=\"${code}\">${obj.name}</button>`;\r\n });\r\n\r\n // Create PDS-compliant dialog structure\r\n // When useForm is true, don't wrap in a form - let the content provide the form\r\n if (options.useForm) {\r\n // Create a temporary container to render the message content\r\n const tempContainer = document.createElement(\"div\");\r\n appendMessageContent(tempContainer, message);\r\n \r\n // Find the form in the rendered content\r\n const form = tempContainer.querySelector(\"form\");\r\n if (form) {\r\n // Build dialog structure with form as direct child for proper flex layout\r\n dialog.innerHTML = /*html*/ `\r\n <header>\r\n <h2>${options.title}</h2>\r\n </header>\r\n `;\r\n \r\n // Create article wrapper and move form children into it (preserves DOM nodes & bindings)\r\n const article = document.createElement(\"article\");\r\n article.className = \"dialog-body\";\r\n while (form.firstChild) {\r\n article.appendChild(form.firstChild);\r\n }\r\n form.appendChild(article);\r\n \r\n // Add footer with buttons\r\n const footer = document.createElement(\"footer\");\r\n footer.innerHTML = buttons.join(\"\");\r\n form.appendChild(footer);\r\n \r\n // Append the restructured form to dialog\r\n dialog.appendChild(form);\r\n } else {\r\n // No form found, use standard article structure\r\n dialog.innerHTML = /*html*/ `\r\n <header>\r\n <h2>${options.title}</h2>\r\n </header>\r\n <article id=\"msg-container\"></article>\r\n <footer>\r\n ${buttons.join(\"\")}\r\n </footer>\r\n `;\r\n const article = dialog.querySelector(\"#msg-container\");\r\n article.appendChild(tempContainer);\r\n }\r\n } else {\r\n dialog.innerHTML = /*html*/ `\r\n <form method=\"dialog\">\r\n <header>\r\n <h2>${options.title}</h2>\r\n </header>\r\n \r\n <article id=\"msg-container\"></article>\r\n \r\n <footer>\r\n ${buttons.join(\"\")}\r\n </footer>\r\n </form>\r\n `;\r\n\r\n // Render message content\r\n const article = dialog.querySelector(\"#msg-container\");\r\n appendMessageContent(article, message);\r\n }\r\n\r\n // Handle cancel button clicks\r\n dialog.addEventListener(\"click\", (e) => {\r\n const btn = e.target.closest('button[value=\"cancel\"]');\r\n if (btn) {\r\n dialog.close();\r\n resolve(false);\r\n }\r\n });\r\n\r\n // Wait for form to exist before adding submit listener\r\n const setupFormListener = () => {\r\n const form = dialog.querySelector(\"form\");\r\n if (form) {\r\n form.addEventListener(\"submit\", (event) => {\r\n event.preventDefault();\r\n \r\n let result;\r\n if (options.useForm && event.submitter.value === \"ok\") {\r\n console.log(\"Found form:\", form);\r\n console.log(\"Form elements:\", form ? Array.from(form.elements) : \"no form\");\r\n result = new FormData(form);\r\n console.log(\"FormData entries:\", Array.from(result.entries()));\r\n } else {\r\n result = (event.submitter.value === \"ok\");\r\n }\r\n\r\n dialog.close();\r\n resolve(result);\r\n });\r\n } else {\r\n // Form doesn't exist yet, wait and try again\r\n requestAnimationFrame(setupFormListener);\r\n }\r\n };\r\n \r\n setupFormListener();\r\n\r\n // Handle dialog close event\r\n dialog.addEventListener(\"close\", () => {\r\n // Small delay to allow exit animation\r\n setTimeout(() => dialog.remove(), 200);\r\n });\r\n\r\n // Append to body and show\r\n document.body.appendChild(dialog);\r\n\r\n // Call optional rendered callback\r\n if (typeof options.rendered === \"function\") {\r\n options.rendered(dialog);\r\n }\r\n\r\n // Show the dialog as modal\r\n dialog.showModal();\r\n\r\n requestAnimationFrame(() => playDialogEnterAnimation(dialog));\r\n });\r\n}\r\n\r\n/**\r\n * Show an alert dialog\r\n * @param {string|Node|Array} message - Alert message\r\n * @param {Object} options - Optional dialog options\r\n * @returns {Promise}\r\n */\r\nexport async function alert(message, options = {}) {\r\n const defaults = {\r\n title: getPageTitle(),\r\n type: \"alert\",\r\n buttons: {\r\n ok: { name: \"OK\", primary: true },\r\n },\r\n };\r\n\r\n return ask(message, { ...defaults, ...options });\r\n}\r\n\r\n/**\r\n * Show a confirmation dialog\r\n * @param {string|Node|Array} message - Confirmation message\r\n * @param {Object} options - Optional dialog options\r\n * @returns {Promise<boolean>}\r\n */\r\nexport async function confirm(message, options = {}) {\r\n const defaults = {\r\n title: \"Confirm Action\",\r\n type: \"confirm\",\r\n buttons: {\r\n ok: { name: \"Confirm\", primary: true },\r\n cancel: { name: \"Cancel\", cancel: true },\r\n },\r\n };\r\n\r\n return ask(message, { ...defaults, ...options });\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../node_modules/pure-web/src/js/common.js", "../../../node_modules/pure-web/src/js/autocomplete.js"],
4
- "sourcesContent": ["let ctlNr = 1000;\n\n/**\n * Returns a contextual unique identifier with the given prefix\n * @param {String} prefix\n * @param {Number} radix\n * @returns { String} unique identifier\n */\nexport function getUniqueName(prefix = \"df\", radix = 16) {\n return `${prefix}${(ctlNr++).toString(radix)}`;\n}\n\n/**\n * Generates an HTML NodeList by parsing the given HTML string\n * @param {String} html\n * @returns {NodeListOf<ChildNode>} DOM element\n */\nexport function parseHTML(html) {\n return new DOMParser().parseFromString(html, \"text/html\").body.childNodes;\n}\n\n/**\n * Debounces events that occur repeatedly, such as resize and mousemove events.\n * @param {Function} fn\n */\nexport function debounce(fn) {\n // This holds the requestAnimationFrame reference, so we can cancel it if we wish\n let frame;\n\n // The debounce function returns a new function that can receive a variable number of arguments\n return (...params) => {\n // If the frame variable has been defined, clear it now, and queue for next frame\n if (frame) {\n cancelAnimationFrame(frame);\n }\n\n // Queue our function call for the next frame\n frame = requestAnimationFrame(() => {\n // Call our function and pass any params we received\n fn(...params);\n });\n };\n}\n\n/**\n * Throttles execution of any function\n * @param {Function} fn - Function to fire\n * @param {Number} timeoutMs - time in milliseconds to buffer all calls to fn.\n */\nexport function throttle(fn, timeoutMs = 100) {\n let handle;\n return function executedFunction(...args) {\n const fire = () => {\n clearTimeout(handle);\n fn(...args);\n };\n clearTimeout(handle);\n handle = setTimeout(fire, timeoutMs);\n };\n}\n\n/**\n * Queues a call for when the main thread is free.\n * @param {Function} fn - the function to call\n */\nexport function enQueue(fn) {\n setTimeout(fn, 0);\n}\n\n/**\n * Returns true if the given string is a valid URL.\n * @param {String} str\n * @returns { Boolean }\n */\nexport function isUrl(str) {\n try {\n if (typeof str !== \"string\") return false;\n if (str.indexOf(\"\\n\") !== -1 || str.indexOf(\" \") !== -1) return false;\n if (str.startsWith(\"#/\")) return false;\n const newUrl = new URL(str, window.location.origin);\n return newUrl.protocol === \"http:\" || newUrl.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\n/**\n * Opens a window and returns the handle.\n * @param {String} url\n * @param {Number} width\n * @param {Number} height\n * @returns window handle reference\n */\nexport function openCenteredWindow(url, width, height) {\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n return window.open(\n url,\n \"\",\n `toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=${width}, height=${height}, top=${top}, left=${left}`\n );\n}\n\n/**\n * Input Template.\n * @type {string}\n */\nconst inputTemplate = /*html*/ `\n<label>\n <span data-label></span>\n <span class=\"placeholder\"></span>\n</label>`;\n\n/**\n * Enhance inputs having data-label attribute.\n *\n * @param {HTMLElement|Document|null} root On which root element we should apply it.\n */\nexport function enhanceInputWithLabel(input) {\n const labelText = input.getAttribute(\"data-label\") ?? \"\";\n if (labelText.length) {\n const label = parseHTML(inputTemplate)[0];\n const type = input.getAttribute(\"type\") || \"text\";\n input.insertAdjacentElement(\"beforebegin\", label);\n label.querySelector(\".placeholder\").replaceWith(input);\n label.querySelector(\"span[data-label]\").textContent = labelText;\n input.removeAttribute(\"data-label\");\n input.setAttribute(\"type\", type);\n }\n\n const icon = input.getAttribute(\"data-icon\") || \"\";\n if (icon) {\n const iconColor = input.getAttribute(\"data-icon-color\") || \"\";\n const iconSize = input.getAttribute(\"data-icon-size\") || \"\";\n const iconHtml = /*html*/ `<svg-icon icon=\"${icon}\" color=\"${iconColor}\" size=\"${iconSize}\"></svg-icon>`;\n input.insertAdjacentElement(\"afterend\", parseHTML(iconHtml)[0]);\n }\n}\n\nlet uniqueNavId;\n/**\n * Enhances a <nav data-dropdown><button></button><menu></menu></nav> structure\n * to become a dropdown button.\n * @param {HTMLElement} nav\n * @returns {String} return value indicating the enhancement has been applied.\n */\nexport function enhanceNavDropdownButton(nav) {\n const button = nav.querySelector(\"button\");\n if (button.textContent.trim().length === 0) {\n const span = document.createElement(\"span\");\n span.innerHTML = \"&nbsp;\";\n span.setAttribute(\"data-label\", \"\");\n span.setAttribute(\"hidden\", \"\");\n button.appendChild(span);\n }\n const menu = nav.querySelector(\"menu\");\n menu.setAttribute(\"role\", \"menu\");\n menu.setAttribute(\"hidden\", \"\");\n\n uniqueNavId = getUniqueName(\"nav\");\n\n nav.setAttribute(\"aria-controls\", uniqueNavId);\n nav.setAttribute(\"aria-haspopup\", \"true\");\n nav.setAttribute(\"aria-expanded\", \"false\");\n menu.setAttribute(\"id\", uniqueNavId);\n [...menu.children].forEach((li) => {\n li.setAttribute(\"role\", \"menuitem\");\n });\n\n button.addEventListener(\"click\", () => {\n const hidden = menu.hasAttribute(\"hidden\");\n if (hidden) {\n menu.removeAttribute(\"hidden\");\n\n setTimeout(() => {\n document.addEventListener(\n \"click\",\n (e) => {\n if (!nav.contains(e.target)) button.click();\n },\n {\n once: true,\n }\n );\n }, 100);\n } else menu.setAttribute(\"hidden\", \"\");\n });\n return \"nav\";\n}\n\n/**\n * Returns a string that displays the element in a CSS-type,\n * readable way, following CSS selector syntax.\n * @param {HTMLElement} element\n * @returns {String} human readable string that identifies the element.\n */\nexport function getElementSelector(element) {\n const id = element.id ? \"#\" + element.id : \"\";\n let cls = [...element.classList].join(\".\");\n if (cls) cls = \".\" + cls;\n return `${element.nodeName.toLowerCase()}${id}${cls}`;\n}\n\n/**\n * Enhances a regular grid to become a masonry grid\n * @param {HTMLElement} element\n */\nexport function enhanceMasonryGrid(element) {\n element.style.setProperty(\"grid-auto-rows\", \"20px\");\n\n addStyleSheet(/*css*/ `\n .masonry {\n opacity: 0;\n }\n\n .masonry-applied {\n opacity: 1;\n transition: opacity .2s ease\n }\n `);\n\n const resizeGridItem = (item) => {\n const rowHeight = parseInt(\n window.getComputedStyle(element).getPropertyValue(\"grid-auto-rows\")\n );\n const rowGap = parseInt(\n window.getComputedStyle(element).getPropertyValue(\"grid-row-gap\")\n );\n const content = item.querySelector(\":scope > *\") ?? item;\n const rowSpan = Math.ceil(\n (content.getBoundingClientRect().height + rowGap) / (rowHeight + rowGap)\n );\n item.style.gridRowEnd = \"span \" + rowSpan;\n };\n\n const resizeAllGridItems = () => {\n try {\n element.classList.remove(\"masonry-applied\");\n for (const item of element.children) resizeGridItem(item);\n } finally {\n element.classList.add(\"masonry-applied\");\n }\n };\n\n window.addEventListener(\"resize\", throttle(resizeAllGridItems, 100));\n waitForImages(element).then(resizeAllGridItems);\n\n return \"masonry\";\n}\n\n/**\n * Returns a Promise that resolves when all images in the given container have downloaded.\n */\nexport function waitForImages(container) {\n const imgElements = container.querySelectorAll(\"img\");\n\n const imgPromises = Array.from(imgElements).map((img) => {\n return new Promise((resolve, reject) => {\n const imgSrc = img.src;\n const image = new Image();\n image.onload = () => resolve(imgSrc);\n image.onerror = (error) => reject(error);\n image.src = imgSrc;\n });\n });\n return Promise.all(imgPromises);\n}\n\n/**\n * Creates\n * @param {String} cssText\n * @returns {String} id of the style element\n */\nexport function addStyleSheet(cssText) {\n const id = generateHash(cssText);\n let styleElement = document.getElementById(id);\n if (!styleElement) {\n styleElement = document.createElement(\"style\");\n styleElement.id = id;\n styleElement.textContent = cssText;\n document.querySelector(\"head\").appendChild(styleElement);\n }\n return id;\n}\n\n/**\n * Generates a hash that uniquely identifies a string\n * @param {String} str\n * @param {Number} seed\n * @returns {String }\n */\nexport function generateHash(str, seed = 0) {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^\n Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^\n Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n const hashNr = 4294967296 * (2097151 & h2) + (h1 >>> 0);\n const radix = 16;\n return `h${hashNr.toString(radix)}`;\n}\n\n/**\n * Enhance buttons with [data-prepend-icon] and [data-append-icon]\n * @param {HTMLButtonElement} button\n */\nexport function enhanceButtonWithIcon(button) {\n [\"prepend\", \"append\"].forEach((position) => {\n const icon = button.getAttribute(`data-${position}-icon`) ?? \"\";\n if (icon) {\n button.removeAttribute(`data-${position}-icon`);\n button.classList.add(\"icon\", position === \"prepend\" ? \"left\" : \"right\");\n const svgIcon = parseHTML(`<svg-icon icon=\"${icon}\"></svg-icon>`)[0];\n button.insertBefore(svgIcon, button.childNodes[0]);\n }\n return \"icon-button\";\n });\n}\n\n/**\n * Progressively enhances a range input into a social rating control\n * @param {HtmlElement} range input\n */\nexport function enhanceRangeStars(range) {\n if (!(range instanceof HTMLInputElement) || range.type !== \"range\") return;\n\n const inputTemplate = /*html*/ `<span class=\"stars-rating\">\n <span class=\"placeholder\"></span>\n </span>`;\n\n range.classList.remove(\"stars-rating\");\n const surroundingSpan = parseHTML(inputTemplate)[0];\n range.insertAdjacentElement(\"beforebegin\", surroundingSpan);\n surroundingSpan.querySelector(\".placeholder\").replaceWith(range);\n range.max = range.max ?? 5;\n\n range.id = range.id ?? getUniqueName();\n surroundingSpan.style.setProperty(\"--max-value\", Number(range.max));\n\n const output = parseHTML(\n /*html*/ `<output for=\"${range.id}\" data-max=\"${range.max}\"></output>`\n )[0];\n surroundingSpan.appendChild(output);\n const update = (value) => {\n range.setAttribute(\"value\", value);\n output.value = value;\n output.setAttribute(\"data-stars\", \"\u2605\".repeat(parseInt(value)));\n };\n range.addEventListener(\"input\", (e) => {\n update(e.target.value);\n });\n\n update(range.value);\n}\n\n/**\n * Gets a boolean value from a string or number\n * @param {Object} value\n * @returns { Boolean }\n */\nexport function toBoolean(value) {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.toLowerCase() === \"true\";\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n\n/**\n * Converts a CamelCased string to a string with individual words separated by spaces.\n * @param { String } text\n * @returns { String } converted string\n */\nexport function toWords(text) {\n text = text.replace(/([A-Z])/g, \" $1\");\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * Converts kebab-case string into PascalCase\n * @param { String } text\n * @returns { String } CamelCased version of the input string\n */\nexport function kebabToPascal(text) {\n return text\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n", "import {\n enQueue,\n throttle,\n isUrl,\n openCenteredWindow,\n parseHTML,\n} from \"./common\";\n\nconst cssClasses = {\n result: \"ac-suggestion\",\n item: \"ac-itm\",\n};\n\n/**\n * Generic Autocompletion class for enrichment of textboxes\n */\nexport class AutoComplete extends EventTarget {\n constructor(parent, textInput, settings) {\n super();\n this.settings = {\n emptyResultsText: \"\",\n ...settings,\n };\n this.container = parent;\n this.input = textInput;\n this.input.setAttribute(\"autocomplete\", \"off\");\n this.categories = settings.categories || {};\n this.caches = new Map();\n\n enQueue(this.attach.bind(this));\n }\n\n /**\n * Connector logic to call on @focus events.\n * Lit example:\n * <input type=\"search\" @focus=${(e) => {AutoComplete.connect(e, this.autoComplete); }} />\n *\n * @param {*} event focus event\n * @param {*} options AutoComplete options\n */\n static connect(event, options) {\n const input = event.target;\n if (!input._autoComplete) {\n if (!options?.categories) throw Error(\"Missing autocomplete settings\");\n input._autoComplete = new AutoComplete(input.parentNode, input, options);\n\n if (event.type === \"focus\") {\n setTimeout(() => {\n input._autoComplete.focusHandler(event);\n }, 100);\n }\n }\n return input._autoComplete;\n }\n\n on(a, b) {\n this.input.addEventListener(a, b);\n return this;\n }\n\n attach() {\n this.resultsDiv = document.createElement(\"div\");\n this.resultsDiv.title = \"\"; // block\n this.resultsDiv.classList.add(cssClasses.result);\n \n if(this.container.offsetWidth > 100)\n this.resultsDiv.style.width = this.container.offsetWidth;\n\n this.resultsDiv.addEventListener(\"mousedown\", this.resultClick.bind(this));\n this.container.classList.add(\"ac-container\");\n this.input.classList.add(\"ac-input\");\n const inputStyle = getComputedStyle(this.input);\n this.container.style.setProperty(\n \"--ac-bg-default\",\n inputStyle.backgroundColor\n );\n this.container.style.setProperty(\"--ac-color-default\", inputStyle.color);\n const acc = getComputedStyle(this.input).accentColor;\n if (acc !== \"auto\")\n this.container.style.setProperty(\"--ac-accent-color\", acc);\n\n (this.container?.shadowRoot ?? this.container).appendChild(this.resultsDiv);\n\n this.controller().clear(\"attach\");\n\n this.on(\n \"input\",\n throttle(\n this.inputHandler.bind(this),\n this.settings.throttleInputMs ?? 300\n )\n )\n .on(\"focus\", this.focusHandler.bind(this))\n .on(\"focusout\", this.blurHandler.bind(this))\n .on(\"keyup\", this.keyUpHandler.bind(this))\n .on(\"keydown\", this.keyDownHandler.bind(this));\n }\n\n controller() {\n let c = this.internalController();\n\n if (typeof this.settings.controller === \"function\")\n c = this.settings.controller(this) ?? c;\n\n return c;\n }\n\n internalController() {\n return {\n show: this.show.bind(this),\n hide: this.hide.bind(this),\n clear: this.clear.bind(this),\n empty: () => {},\n };\n }\n\n moveResult(add) {\n this.controller().show();\n let length = this.acItems.length;\n this.rowIndex = this.rowIndex + add;\n\n if (this.rowIndex <= 0) {\n this.rowIndex = 0;\n } else if (this.rowIndex > length - 1) {\n this.rowIndex = 0;\n }\n for (const r of this.acItems) {\n r.classList.remove(\"selected\");\n }\n\n let div = this.getSelectedDiv();\n if (div) {\n div.classList.add(\"selected\");\n div.scrollIntoView({\n behavior: \"smooth\",\n block: \"end\",\n inline: \"nearest\",\n });\n } else {\n this.focusHandler({\n target: this.input,\n });\n }\n }\n\n getSelectedDiv() {\n return this.resultsDiv.querySelector(`div:nth-child(${this.rowIndex + 1})`);\n }\n\n // execute action\n selectResult(div) {\n div = div || this.getSelectedDiv();\n\n if (div) {\n let index = parseInt(div.getAttribute(\"data-index\"));\n this.resultClicked = true;\n let result = this.results[index];\n\n let handlingCategory = this.categories[result.category] ?? {};\n handlingCategory.action =\n handlingCategory.action ?? this.setText.bind(this);\n\n if (handlingCategory.newTab) {\n this.tabWindow = openCenteredWindow(\"about:blank\");\n }\n\n let options = {\n ...result,\n search: this.input.value,\n };\n\n div.classList.add(\"ac-active\");\n\n setTimeout(() => {\n this.controller().hide(\"result-selected\");\n\n if (options.action) {\n options.action(options);\n } else {\n handlingCategory.action(options);\n if (handlingCategory.newTab) {\n if (options.url) {\n this.tabWindow.location.href = options.url;\n } else {\n this.tabWindow.close();\n }\n }\n }\n var event = new Event(\"change\", { bubbles: true });\n this.input.dispatchEvent(event);\n\n this.controller().clear(\"result-selected\");\n\n const ev = new Event(\"result-selected\");\n ev.detail = options;\n this.input.dispatchEvent(ev);\n }, 0);\n }\n }\n\n setText(options) {\n let valueSet = false;\n if (this.input) {\n this.input.value = options.text;\n valueSet = true;\n } else if (this.container?.autoCompleteInput) {\n this.container.autoCompleteInput.value = options.text;\n valueSet = true;\n } else if (\"value\" in this.container) {\n this.container.value = options.text;\n valueSet = true;\n }\n\n if (valueSet && this.input) {\n this.input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n\n this.controller().hide(\"settext\");\n }\n\n resultClick(event) {\n this.selectResult(event.target.closest(`.${cssClasses.item}`));\n }\n\n blurHandler() {\n setTimeout(() => {\n if (!this.resultClicked) this.controller().clear(\"blurred\");\n\n this.resultClicked = false;\n }, 100);\n }\n\n clear() {\n if (this.settings.debug) return;\n\n if (!this.resultsDiv) return;\n this.resultsDiv.innerHTML = \"\";\n this.controller().hide(\"clear\");\n\n if (this.cacheTmr) clearTimeout(this.cacheTmr);\n\n this.cacheTmr = setTimeout(() => {\n this.caches.clear();\n }, 60 * 1000 * 5); // 5 minutes\n }\n\n show() {\n // check dropDown/dropUp\n\n if (!this.resultsDiv.classList.contains(\"ac-active\")) {\n const viewBounds = this.getViewBounds();\n\n this.resultsDiv.style.position = \"absolute\";\n\n if(viewBounds.rect.width > 100)\n this.resultsDiv.style.width = `${viewBounds.rect.width}px`;\n\n this.settings.direction = this.settings.direction ?? viewBounds.suggestedDirection;\n this.resultsDiv.setAttribute(\"data-direction\", this.settings.direction);\n\n if (this.settings.direction === \"up\") {\n this.resultsDiv.style.top = \"unset\";\n this.resultsDiv.style.bottom = `${viewBounds.rect.height + 20}px`;\n this.rowIndex = this.acItems.length;\n } else {\n this.resultsDiv.style.bottom = \"unset\";\n this.resultsDiv.style.top = `${viewBounds.rect.height}px`;\n this.rowIndex = -1;\n }\n this.resultsDiv.style.maxWidth = \"unset\";\n this.resultsDiv.classList.toggle(\"ac-active\", true);\n }\n }\n\n getViewBounds() {\n const rect = this.input.getBoundingClientRect();\n\n return {\n rect,\n suggestedDirection:\n rect.top + rect.height + 500 > window.innerHeight ? \"up\" : \"down\",\n };\n }\n\n hide() {\n this.resultsDiv.classList.toggle(\"ac-active\", false);\n }\n\n empty() {\n this.resultsDiv.innerHTML = `<div class=\"ac-empty\">${this.settings.emptyResultsText}</div>`;\n this.controller().show();\n }\n\n inputHandler(e) {\n if (this.cacheTmr) clearTimeout(this.cacheTmr);\n\n let options = {\n search: e.target.value,\n categories: this.categories,\n };\n\n this.container.classList.add(\"search-running\");\n\n this.getItems(options, e).then((r) => {\n this.controller().clear(\"new-results\");\n this.resultsHandler(r, options);\n this.container.classList.remove(\"search-running\");\n });\n }\n\n keyDownHandler(e) {\n switch (e.key) {\n case \"Enter\":\n e.stopPropagation();\n e.preventDefault();\n break;\n case \"ArrowDown\":\n enQueue(this.moveResult(1));\n break;\n case \"ArrowUp\":\n enQueue(this.moveResult(-1));\n break;\n }\n }\n\n keyUpHandler(e) {\n switch (e.key) {\n case \"Escape\":\n this.controller().hide(\"escape\");\n break;\n case \"Enter\":\n if (this.getSelectedDiv()) {\n this.container.preventEnter = true;\n e.stopPropagation();\n e.preventDefault();\n this.selectResult();\n setTimeout(() => {\n this.container.preventEnter = false;\n }, 10);\n }\n\n break;\n default:\n //this.toggle();\n break;\n }\n }\n\n focusHandler(e) {\n this.controller().clear(\"focus\");\n let value = e.target.value;\n this.suggest(value, e);\n }\n\n /**\n * Shows suggestion box\n * @param {string} value - String to suggest results for\n */\n suggest(value, e) {\n this.input.focus();\n\n const options = {\n suggest: true,\n search: value || \"\",\n categories: this.categories,\n };\n this.getItems(options, e).then((r) => {\n this.input.dispatchEvent(\n new CustomEvent(\"show-results\", {\n detail: {\n results: r,\n },\n })\n );\n\n this.resultsHandler(r, options);\n });\n }\n\n // Sort results based on static (integer) or dynamic (function) sortIndex in category.\n sort(r, options) {\n return r.sort((a, b) => {\n const aCat = options.categories[a.category];\n const bCat = options.categories[b.category];\n const aIndex =\n typeof aCat.sortIndex === \"function\"\n ? aCat.sortIndex(options)\n : aCat.sortIndex ?? 0;\n const bIndex =\n typeof bCat.sortIndex === \"function\"\n ? bCat.sortIndex(options)\n : bCat.sortIndex ?? 0;\n return bIndex > aIndex ? 1 : -1;\n });\n }\n\n resultsHandler(r, options) {\n this.results = r;\n this.rowIndex = -1;\n let index = 0;\n\n const singleItemTemplate = (catHandler, i) => {\n return /*html*/ `\n <div title=\"${i.tooltip || \"\"}\" data-index=\"${index}\" class=\"${`${\n cssClasses.item\n } cat-${i.category} ${i.class ?? \"\"}`.trim()}\"${\n i.style ? ` style=\"${i.style}\"` : \"\"\n }>\n ${this.handleImageOrIcon(i)}\n <span class=\"text\">${this.formatResultItem(\n i,\n options,\n catHandler\n )}</span>\n ${\n !this.settings.hideCategory\n ? `<span class=\"category\">${i.category || \"\"}</span>`\n : \"\"\n }\n </div>`;\n };\n\n r.forEach((i) => {\n let catHandler = options.categories[i.category] || {};\n if (i.element) {\n this.resultsDiv.appendChild(i.element);\n } else {\n i = typeof i === \"string\" ? { text: i } : i;\n this.resultsDiv.appendChild(\n parseHTML(singleItemTemplate(catHandler, i))[0]\n );\n }\n\n index++;\n });\n if (r.length) {\n this.acItems = this.resultsDiv.querySelectorAll(\".ac-itm\");\n this.controller().show();\n } else if (options.search.length) this.controller().empty();\n }\n\n handleImageOrIcon(i) {\n if (i.image) {\n return /*html*/ `<img src=\"${i.image}\"/>`;\n }\n\n if(typeof(this.settings.iconHandler) === \"function\") \n return this.settings.iconHandler(i);\n\n return /*html*/ `<svg-icon icon=\"${i.icon}\"></svg-icon>`;\n }\n\n formatResultItem(item, options, catHandler) {\n const i = typeof item === \"string\" ? { text: item } : item;\n let result = i.text;\n\n if (options.search) {\n result = result.replace(\"%search%\", options.search);\n i.description = i.description?.replace(\"%search%\", options.search);\n }\n\n result = this.highlight(result, options.search);\n\n if (i.description) {\n result = `<div>${result}</div><small>${i.description}</small>`;\n }\n\n if (catHandler.format) {\n result = catHandler.format({\n item: i,\n result: result,\n options: options,\n });\n }\n return result;\n }\n\n highlight(str, find) {\n var reg = new RegExp(\"(\" + find + \")\", \"gi\");\n return str.replace(reg, '<span class=\"txt-hl\">$1</span>');\n }\n\n async getItems(options, e) {\n if (this.aborter) {\n this.aborter.abort();\n }\n\n let cache = this.caches.get(options.search);\n if (cache) return cache;\n\n const prop = this.settings.map;\n\n const normalizeItem = (i) => {\n if (typeof i === \"string\") i = { text: i };\n\n return i;\n };\n\n const map = (list) => {\n if (!prop) {\n return list.map((i) => {\n return normalizeItem(i);\n });\n }\n return list.map((i) => {\n return { text: i[prop] };\n });\n };\n\n const max = (list) => {\n if (this.settings.max && this.settings.max > 0) {\n list.length = this.settings.max;\n }\n return list;\n };\n\n // Create a new AbortController instance\n this.aborter = new AbortController();\n this.aborterSignal = this.aborter.signal;\n\n return new Promise((resolve) => {\n const internalResolve = (data) => {\n data = this.sort(data, options);\n\n if (this.settings.cache !== false)\n this.caches.set(options.search, data);\n\n resolve(data);\n };\n\n if (isUrl(this.items)) {\n if (this.settings.minlength > 0) {\n if (\n !options.search ||\n options.search.length < this.settings.minlength\n ) {\n internalResolve([]);\n return;\n }\n }\n let url = this.formatSearch(this.items, options);\n fetch(url).then((x) => {\n if (x.status === 200) {\n x.json().then((items) => {\n items = map(items);\n\n internalResolve(\n max(\n items.filter((i) => {\n return this.isMatch(options, i);\n })\n )\n );\n });\n return;\n }\n throw Error(`HTTP error ${x.status} - ${url}`);\n });\n } else if (Array.isArray(this.items)) {\n let simple = true;\n\n this.items = this.items.map((i) => {\n if (typeof i === \"string\") {\n return { text: i };\n }\n simple = false;\n return i;\n });\n if (simple) {\n this.container.classList.add(\"simple\");\n }\n internalResolve(max(map(this.items)));\n } else if (typeof this.items === \"function\") {\n options.control = this.container;\n let ar = Promise.resolve(this.items(options, e));\n ar.then((ar) => {\n ar = ar.map((i) => {\n return normalizeItem(i);\n });\n\n ar = map(ar);\n\n internalResolve(ar);\n });\n } else {\n return internalResolve(\n Promise.resolve(this.items.apply(this, options))\n );\n }\n });\n }\n\n async items(options) {\n let arr = [];\n options.results = [];\n options.signal = this.aborterSignal;\n\n for (var c in options.categories) {\n let catHandler = options.categories[c];\n catHandler.trigger =\n catHandler.trigger ??\n (() => {\n return true;\n });\n options.results = arr;\n\n if (catHandler.trigger(options)) {\n let catResults = [];\n try {\n catResults = await catHandler.getItems(options);\n } catch (ex) {\n console.warn(`Error loading items for omniBox category '${c}'.`, ex);\n }\n\n arr = arr.concat(\n catResults.map((i) => {\n i.category = c;\n return i;\n })\n );\n }\n }\n\n return arr;\n }\n\n formatSearch(url, options) {\n if (url.indexOf(\"%search%\")) {\n return url.replace(\"%search%\", options.search || \"\");\n }\n\n return url + \"?\" + this.createQueryParam(options);\n }\n\n createQueryParam(options) {\n let suggest = options.suggest ? \"&suggest=true\" : \"\";\n return `q=${options.text}${suggest}`;\n }\n\n isMatch(options, i) {\n if (i.text?.indexOf(\"%search%\") >= 0) return true;\n\n return options.search\n ? i.text?.toLowerCase().indexOf(options.search.toLowerCase()) >= 0\n : options.suggest;\n }\n\n static textFilter(options, propertyName) {\n return function (i) {\n if (!options.search) return true;\n\n if (i.hidden) return false;\n\n const prop = propertyName ? i[propertyName] : i;\n const isMatch = prop.match(new RegExp(options.search, \"gi\"));\n\n if (isMatch) return isMatch;\n\n if (i.config?.tags) {\n return i.config.tags.some((tag) => {\n return tag.match(new RegExp(options.search, \"gi\"));\n });\n }\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["ar"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/js/pds-core/pds-enhancers.js"],
4
- "sourcesContent": ["/**\n * PDS Enhancers - Single Source of Truth\n *\n * This file defines all progressive enhancements for the Pure Design System.\n * Each enhancer has:\n * - selector: CSS selector to target elements\n * - run: Enhancement function (added at the end)\n */\n\n// ============================================================================\n// ENHANCEMENT RUNTIME DEFINITIONS\n// ============================================================================\n\nconst enhancerDefinitions = [\n { selector: \".accordion\" },\n { selector: \"nav[data-dropdown]\" },\n { selector: \"label[data-toggle]\" },\n { selector: \"label[data-color]\" },\n { selector: 'input[type=\"range\"]' },\n { selector: \"form[data-required]\" },\n { selector: \"fieldset[role=group][data-open]\" },\n { selector: \"[data-clip]\" },\n { selector: \"button, a[class*='btn-']\" },\n];\n\n// ============================================================================\n// ENHANCEMENT RUNTIME FUNCTIONS\n// ============================================================================\n\nfunction enhanceAccordion(elem) {\n if (elem.dataset.enhancedAccordion) return;\n elem.dataset.enhancedAccordion = \"true\";\n\n elem.addEventListener(\n \"toggle\",\n (event) => {\n // Only handle toggle events from direct child details elements\n // to avoid closing parent details when nested accordions are used\n if (event.target.open && event.target.parentElement === elem) {\n elem.querySelectorAll(\":scope > details[open]\").forEach((details) => {\n if (details !== event.target) {\n details.open = false;\n }\n });\n }\n },\n true,\n );\n}\n\nfunction enhanceDropdown(elem) {\n if (elem.dataset.enhancedDropdown) return;\n elem.dataset.enhancedDropdown = \"true\";\n const menu = elem.lastElementChild;\n\n if (!menu) return;\n\n const trigger =\n elem.querySelector(\"[data-dropdown-toggle]\") ||\n elem.querySelector(\"button\");\n\n if (trigger && !trigger.hasAttribute(\"type\")) {\n trigger.setAttribute(\"type\", \"button\");\n }\n\n if (!menu.id) {\n menu.id = `dropdown-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n const isMenu = menu.tagName?.toLowerCase() === \"menu\";\n const VIEWPORT_PADDING = 8;\n if (isMenu && !menu.hasAttribute(\"role\")) {\n menu.setAttribute(\"role\", \"menu\");\n }\n if (!menu.hasAttribute(\"aria-hidden\")) {\n menu.setAttribute(\"aria-hidden\", \"true\");\n }\n\n if (trigger) {\n trigger.setAttribute(\"aria-haspopup\", \"true\");\n trigger.setAttribute(\"aria-controls\", menu.id);\n trigger.setAttribute(\"aria-expanded\", \"false\");\n }\n\n const measureMenuSize = () => {\n const previousStyle = menu.getAttribute(\"style\");\n menu.style.visibility = \"hidden\";\n menu.style.display = \"inline-block\";\n menu.style.pointerEvents = \"none\";\n\n const rect = menu.getBoundingClientRect();\n const width = Math.max(menu.offsetWidth || 0, menu.scrollWidth || 0, rect.width || 0, 1);\n const height = Math.max(\n menu.offsetHeight || 0,\n menu.scrollHeight || 0,\n rect.height || 0,\n 1,\n );\n\n if (previousStyle === null) {\n menu.removeAttribute(\"style\");\n } else {\n menu.setAttribute(\"style\", previousStyle);\n }\n\n return { width, height };\n };\n\n const resolveDirection = () => {\n const mode = (\n elem.getAttribute(\"data-direction\") ||\n elem.getAttribute(\"data-dropdown-direction\") ||\n elem.getAttribute(\"data-mode\") ||\n \"auto\"\n ).toLowerCase();\n if (mode === \"up\" || mode === \"down\") return mode;\n const anchorRect = (trigger || elem).getBoundingClientRect();\n const { height: menuHeight } = measureMenuSize();\n const spaceBelow = Math.max(0, window.innerHeight - anchorRect.bottom);\n const spaceAbove = Math.max(0, anchorRect.top);\n const fitsDown = spaceBelow >= menuHeight;\n const fitsUp = spaceAbove >= menuHeight;\n if (fitsDown && !fitsUp) return \"down\";\n if (fitsUp && !fitsDown) return \"up\";\n if (fitsDown && fitsUp) return \"down\";\n return spaceAbove > spaceBelow ? \"up\" : \"down\";\n };\n\n const resolveAlign = () => {\n const align = (\n elem.getAttribute(\"data-align\") ||\n elem.getAttribute(\"data-dropdown-align\") ||\n \"auto\"\n ).toLowerCase();\n if (\n align === \"left\" ||\n align === \"right\" ||\n align === \"start\" ||\n align === \"end\"\n ) {\n return align === \"start\" ? \"left\" : align === \"end\" ? \"right\" : align;\n }\n const anchorRect = (trigger || elem).getBoundingClientRect();\n const { width: menuWidth } = measureMenuSize();\n const spaceForLeftAligned = Math.max(0, window.innerWidth - anchorRect.left);\n const spaceForRightAligned = Math.max(0, anchorRect.right);\n const fitsLeft = spaceForLeftAligned >= menuWidth;\n const fitsRight = spaceForRightAligned >= menuWidth;\n\n if (fitsLeft && !fitsRight) return \"left\";\n if (fitsRight && !fitsLeft) return \"right\";\n if (fitsLeft && fitsRight) return \"left\";\n return spaceForRightAligned > spaceForLeftAligned ? \"right\" : \"left\";\n };\n\n const readLengthToken = (tokenName, fallback = 8) => {\n const raw = getComputedStyle(elem).getPropertyValue(tokenName).trim();\n if (!raw) return fallback;\n const probe = document.createElement(\"span\");\n probe.style.position = \"fixed\";\n probe.style.visibility = \"hidden\";\n probe.style.pointerEvents = \"none\";\n probe.style.height = raw;\n document.body.appendChild(probe);\n const parsed = Number.parseFloat(getComputedStyle(probe).height);\n probe.remove();\n return Number.isFinite(parsed) ? parsed : fallback;\n };\n\n const clearFloatingMenuPosition = () => {\n menu.style.removeProperty(\"position\");\n menu.style.removeProperty(\"left\");\n menu.style.removeProperty(\"top\");\n menu.style.removeProperty(\"right\");\n menu.style.removeProperty(\"bottom\");\n menu.style.removeProperty(\"margin-top\");\n menu.style.removeProperty(\"margin-bottom\");\n menu.style.removeProperty(\"max-width\");\n menu.style.removeProperty(\"max-inline-size\");\n menu.style.removeProperty(\"max-height\");\n menu.style.removeProperty(\"overflow\");\n };\n\n const reattachFloatingMenu = () => {\n if (menu.getAttribute(\"aria-hidden\") !== \"false\") return;\n clearFloatingMenuPosition();\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n positionFloatingMenu();\n });\n });\n };\n\n const positionFloatingMenu = () => {\n if (menu.getAttribute(\"aria-hidden\") !== \"false\") return;\n const anchorRect = (trigger || elem).getBoundingClientRect();\n const viewport = window.visualViewport;\n const viewportWidth =\n viewport?.width || document.documentElement?.clientWidth || window.innerWidth;\n const viewportHeight =\n viewport?.height || document.documentElement?.clientHeight || window.innerHeight;\n const viewportOffsetLeft = viewport?.offsetLeft || 0;\n const viewportOffsetTop = viewport?.offsetTop || 0;\n const maxMenuWidth = Math.max(1, viewportWidth - VIEWPORT_PADDING * 2);\n const maxMenuHeight = Math.max(1, viewportHeight - VIEWPORT_PADDING * 2);\n\n menu.style.maxWidth = `${Math.round(maxMenuWidth)}px`;\n menu.style.maxInlineSize = `${Math.round(maxMenuWidth)}px`;\n menu.style.maxHeight = `${Math.round(maxMenuHeight)}px`;\n menu.style.overflow = \"auto\";\n\n const { width: menuWidth, height: menuHeight } = measureMenuSize();\n const spacing = readLengthToken(\"--spacing-2\", 8);\n const direction = resolveDirection();\n const align = resolveAlign();\n\n elem.dataset.dropdownDirection = direction;\n elem.dataset.dropdownAlign = align;\n\n let left = align === \"right\" ? anchorRect.right - menuWidth : anchorRect.left;\n if (menuWidth >= maxMenuWidth - 1) {\n left = viewportOffsetLeft + VIEWPORT_PADDING;\n } else {\n left = Math.max(\n viewportOffsetLeft + VIEWPORT_PADDING,\n Math.min(\n left,\n viewportOffsetLeft + viewportWidth - menuWidth - VIEWPORT_PADDING,\n ),\n );\n }\n\n let top =\n direction === \"up\"\n ? anchorRect.top - spacing - menuHeight\n : anchorRect.bottom + spacing;\n top = Math.max(\n viewportOffsetTop + VIEWPORT_PADDING,\n Math.min(\n top,\n viewportOffsetTop + viewportHeight - menuHeight - VIEWPORT_PADDING,\n ),\n );\n\n menu.style.position = \"fixed\";\n menu.style.left = `${Math.round(left)}px`;\n menu.style.top = `${Math.round(top)}px`;\n menu.style.right = \"auto\";\n menu.style.bottom = \"auto\";\n menu.style.marginTop = \"0\";\n menu.style.marginBottom = \"0\";\n };\n\n let repositionHandler = null;\n const bindReposition = () => {\n if (repositionHandler) return;\n repositionHandler = () => positionFloatingMenu();\n window.addEventListener(\"resize\", repositionHandler);\n window.addEventListener(\"scroll\", repositionHandler, true);\n };\n\n const unbindReposition = () => {\n if (!repositionHandler) return;\n window.removeEventListener(\"resize\", repositionHandler);\n window.removeEventListener(\"scroll\", repositionHandler, true);\n repositionHandler = null;\n };\n\n let configChangedHandler = null;\n const bindConfigChanged = () => {\n if (configChangedHandler || typeof document === \"undefined\") return;\n configChangedHandler = () => {\n if (menu.getAttribute(\"aria-hidden\") !== \"false\") return;\n elem.dataset.dropdownDirection = resolveDirection();\n elem.dataset.dropdownAlign = resolveAlign();\n reattachFloatingMenu();\n setTimeout(() => {\n if (menu.getAttribute(\"aria-hidden\") !== \"false\") return;\n reattachFloatingMenu();\n }, 50);\n setTimeout(() => {\n if (menu.getAttribute(\"aria-hidden\") !== \"false\") return;\n reattachFloatingMenu();\n }, 150);\n };\n document.addEventListener(\"pds:config-changed\", configChangedHandler);\n };\n\n const unbindConfigChanged = () => {\n if (!configChangedHandler || typeof document === \"undefined\") return;\n document.removeEventListener(\"pds:config-changed\", configChangedHandler);\n configChangedHandler = null;\n };\n\n // Store click handler reference for cleanup\n let clickHandler = null;\n\n const openMenu = () => {\n elem.dataset.dropdownDirection = resolveDirection();\n elem.dataset.dropdownAlign = resolveAlign();\n menu.setAttribute(\"aria-hidden\", \"false\");\n trigger?.setAttribute(\"aria-expanded\", \"true\");\n bindReposition();\n bindConfigChanged();\n reattachFloatingMenu();\n\n // Add click-outside handler when opening\n if (!clickHandler) {\n clickHandler = (event) => {\n // Use composedPath() to handle Shadow DOM\n const path = event.composedPath ? event.composedPath() : [event.target];\n const clickedInside = path.some((node) => node === elem);\n\n if (!clickedInside) {\n closeMenu();\n }\n };\n // Use a slight delay to avoid closing immediately if this was triggered by a click\n setTimeout(() => {\n document.addEventListener(\"click\", clickHandler);\n }, 0);\n }\n };\n\n const closeMenu = () => {\n menu.setAttribute(\"aria-hidden\", \"true\");\n trigger?.setAttribute(\"aria-expanded\", \"false\");\n unbindReposition();\n unbindConfigChanged();\n clearFloatingMenuPosition();\n\n // Remove click-outside handler when closing\n if (clickHandler) {\n document.removeEventListener(\"click\", clickHandler);\n clickHandler = null;\n }\n };\n\n const toggleMenu = () => {\n if (menu.getAttribute(\"aria-hidden\") === \"false\") {\n closeMenu();\n } else {\n openMenu();\n }\n };\n\n trigger?.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n toggleMenu();\n });\n\n elem.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n closeMenu();\n trigger?.focus();\n }\n });\n\n elem.addEventListener(\"focusout\", (event) => {\n // Only close if focus is explicitly moving to an element outside the dropdown\n // Don't close if relatedTarget is null (which happens when clicking non-focusable elements inside)\n // Use composedPath() to handle Shadow DOM properly\n if (event.relatedTarget) {\n const path = event.composedPath ? event.composedPath() : [event.relatedTarget];\n const focusedInside = path.some((node) => node === elem);\n if (!focusedInside) {\n closeMenu();\n }\n }\n });\n}\n\nfunction enhanceToggle(elem) {\n if (elem.dataset.enhancedToggle) return;\n elem.dataset.enhancedToggle = \"true\";\n const checkbox = elem.querySelector('input[type=\"checkbox\"]');\n if (!checkbox) return;\n\n if (!elem.hasAttribute(\"tabindex\")) {\n elem.setAttribute(\"tabindex\", \"0\");\n }\n\n elem.setAttribute(\"role\", \"switch\");\n elem.setAttribute(\"aria-checked\", checkbox.checked ? \"true\" : \"false\");\n\n const toggleSwitch = document.createElement(\"span\");\n toggleSwitch.className = \"toggle-switch\";\n toggleSwitch.setAttribute(\"role\", \"presentation\");\n toggleSwitch.setAttribute(\"aria-hidden\", \"true\");\n const knob = document.createElement(\"span\");\n knob.className = \"toggle-knob\";\n toggleSwitch.appendChild(knob);\n elem.insertBefore(toggleSwitch, checkbox.nextSibling);\n\n const updateAria = () => {\n elem.setAttribute(\"aria-checked\", checkbox.checked ? \"true\" : \"false\");\n };\n\n const toggle = () => {\n if (checkbox.disabled) return;\n checkbox.checked = !checkbox.checked;\n updateAria();\n checkbox.dispatchEvent(new Event(\"change\", { bubbles: true }));\n };\n\n elem.addEventListener(\"click\", (event) => {\n event.preventDefault();\n toggle();\n });\n\n elem.addEventListener(\"keydown\", (event) => {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggle();\n }\n });\n\n checkbox.addEventListener(\"change\", updateAria);\n}\n\nfunction enhanceColorInput(elem) {\n if (elem.dataset.enhancedColorInput) return;\n\n const input = elem.querySelector('input[type=\"color\"]');\n if (!input) return;\n\n elem.dataset.enhancedColorInput = \"true\";\n\n let control = elem.querySelector(':scope > .color-control');\n let swatch = elem.querySelector(':scope > .color-control > .color-swatch');\n let output = elem.querySelector(':scope > .color-control > output');\n\n if (!control) {\n control = document.createElement(\"span\");\n control.className = \"color-control\";\n input.before(control);\n }\n\n if (!swatch) {\n swatch = document.createElement(\"span\");\n swatch.className = \"color-swatch\";\n control.appendChild(swatch);\n }\n\n if (input.parentElement !== swatch) {\n swatch.appendChild(input);\n }\n\n if (!output) {\n output = document.createElement(\"output\");\n control.appendChild(output);\n }\n\n const sync = () => {\n const isUnset = input.dataset.colorUnset === \"1\";\n\n if (isUnset) {\n output.value = \"\";\n output.textContent = \"not set\";\n control.dataset.value = \"\";\n control.dataset.unset = \"1\";\n swatch.dataset.unset = \"1\";\n return;\n }\n\n output.value = input.value;\n output.textContent = input.value;\n control.dataset.value = input.value;\n delete control.dataset.unset;\n delete swatch.dataset.unset;\n };\n\n sync();\n\n const setResolved = () => {\n if (input.dataset.colorUnset === \"1\") {\n input.dataset.colorUnset = \"0\";\n }\n sync();\n };\n\n input.addEventListener(\"input\", setResolved, { passive: true });\n input.addEventListener(\"change\", setResolved, { passive: true });\n}\n\nfunction enhanceRange(elem) {\n if (elem.dataset.enhancedRange) return;\n\n const wireProgrammaticUpdates = (updateFn) => {\n if (elem.dataset.enhancedRangeProgrammatic) return;\n elem.dataset.enhancedRangeProgrammatic = \"1\";\n\n const descriptor =\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(elem), \"value\") ||\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \"value\");\n\n if (descriptor?.get && descriptor?.set) {\n Object.defineProperty(elem, \"value\", {\n configurable: true,\n enumerable: descriptor.enumerable,\n get() {\n return descriptor.get.call(this);\n },\n set(nextValue) {\n descriptor.set.call(this, nextValue);\n updateFn();\n },\n });\n }\n\n const attrObserver = new MutationObserver((mutations) => {\n const shouldUpdate = mutations.some((mutation) => {\n const attr = mutation.attributeName;\n return attr === \"value\" || attr === \"min\" || attr === \"max\";\n });\n if (shouldUpdate) updateFn();\n });\n attrObserver.observe(elem, {\n attributes: true,\n attributeFilter: [\"value\", \"min\", \"max\"],\n });\n };\n\n const label = elem.closest(\"label\");\n const hasRangeOutputClass = label?.classList.contains(\"range-output\");\n\n const inputId =\n elem.id || `range-${Math.random().toString(36).substring(2, 11)}`;\n const outputId = `${inputId}-output`;\n elem.id = inputId;\n\n if (hasRangeOutputClass) {\n const labelSpan = label.querySelector(\"span\");\n if (labelSpan && !labelSpan.classList.contains(\"range-output-wrapper\")) {\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"range-output-wrapper\";\n wrapper.style.display = \"flex\";\n wrapper.style.justifyContent = \"space-between\";\n wrapper.style.alignItems = \"center\";\n\n const textSpan = document.createElement(\"span\");\n textSpan.textContent = labelSpan.textContent;\n wrapper.appendChild(textSpan);\n\n const output = document.createElement(\"output\");\n output.id = outputId;\n output.setAttribute(\"for\", inputId);\n output.style.color =\n \"var(--surface-text-secondary, var(--color-text-secondary))\";\n output.style.fontSize = \"0.875rem\";\n output.textContent = elem.value;\n wrapper.appendChild(output);\n\n labelSpan.textContent = \"\";\n labelSpan.appendChild(wrapper);\n\n const updateOutput = () => {\n output.textContent = elem.value;\n };\n elem.addEventListener(\"input\", updateOutput);\n elem.addEventListener(\"change\", updateOutput);\n wireProgrammaticUpdates(updateOutput);\n updateOutput();\n }\n } else {\n let container = elem.closest(\".range-container\");\n if (!container) {\n container = document.createElement(\"div\");\n container.className = \"range-container\";\n elem.parentNode?.insertBefore(container, elem);\n container.appendChild(elem);\n }\n container.style.position = \"relative\";\n\n const bubble = document.createElement(\"output\");\n bubble.id = outputId;\n bubble.setAttribute(\"for\", inputId);\n bubble.className = \"range-bubble\";\n bubble.setAttribute(\"aria-live\", \"polite\");\n container.appendChild(bubble);\n\n const updateBubble = () => {\n const min = parseFloat(elem.min) || 0;\n const max = parseFloat(elem.max) || 100;\n const value = parseFloat(elem.value);\n const pct = (value - min) / (max - min);\n bubble.style.left = `calc(${pct * 100}% )`;\n bubble.textContent = String(value);\n };\n const show = () => bubble.classList.add(\"visible\");\n const hide = () => bubble.classList.remove(\"visible\");\n elem.addEventListener(\"input\", updateBubble);\n elem.addEventListener(\"pointerdown\", show);\n elem.addEventListener(\"pointerup\", hide);\n elem.addEventListener(\"pointerleave\", hide);\n elem.addEventListener(\"focus\", show);\n elem.addEventListener(\"blur\", hide);\n elem.addEventListener(\"change\", updateBubble);\n wireProgrammaticUpdates(updateBubble);\n updateBubble();\n }\n\n elem.dataset.enhancedRange = \"1\";\n}\n\nfunction enhanceRequired(elem) {\n if (elem.dataset.enhancedRequired) return;\n elem.dataset.enhancedRequired = \"true\";\n\n const enhanceRequiredField = (input) => {\n let label;\n if (input.closest(\"[role$=group]\")) {\n // Handles both radiogroup and group\n label = input.closest(\"[role$=group]\").querySelector(\"legend\");\n } else {\n label = input.closest(\"label\");\n }\n if (!label) return;\n\n if (label.querySelector(\".required-asterisk\")) return;\n\n const asterisk = document.createElement(\"span\");\n asterisk.classList.add(\"required-asterisk\");\n asterisk.textContent = \"*\";\n asterisk.style.marginLeft = \"4px\";\n\n const labelText = label.querySelector(\"span, [data-label]\");\n if (labelText) {\n labelText.appendChild(asterisk);\n } else {\n const field = label.querySelector(\"input, select, textarea\");\n if (field) {\n label.insertBefore(asterisk, field);\n } else {\n label.appendChild(asterisk);\n }\n }\n\n const form = input.closest(\"form\");\n if (form && !form.querySelector(\".required-legend\")) {\n const legend = document.createElement(\"small\");\n legend.classList.add(\"required-legend\");\n legend.textContent = \"* Required fields\";\n form.insertBefore(\n legend,\n form.querySelector(\".form-actions\") || form.lastElementChild,\n );\n }\n };\n\n elem.querySelectorAll(\"[required]\").forEach((input) => {\n enhanceRequiredField(input);\n });\n}\n\nfunction enhanceOpenGroup(elem) {\n if (elem.dataset.enhancedOpenGroup) return;\n elem.dataset.enhancedOpenGroup = \"true\";\n\n elem.classList.add(\"flex\", \"flex-wrap\", \"buttons\");\n\n const addInput = document.createElement(\"input\");\n addInput.type = \"text\";\n addInput.placeholder = \"Add item...\";\n addInput.classList.add(\"input-text\", \"input-sm\");\n addInput.style.width = \"auto\";\n\n const getFirstInput = () =>\n elem.querySelector('input[type=\"radio\"], input[type=\"checkbox\"]');\n\n elem.appendChild(addInput);\n addInput.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n const value = addInput.value.trim();\n if (value) {\n event.preventDefault();\n\n const firstInput = getFirstInput();\n const type = firstInput?.type === \"radio\" ? \"radio\" : \"checkbox\";\n const id = `open-group-${Math.random().toString(36).substring(2, 11)}`;\n const label = document.createElement(\"label\");\n\n const span = document.createElement(\"span\");\n span.setAttribute(\"data-label\", \"\");\n span.textContent = value;\n\n const input = document.createElement(\"input\");\n input.type = type;\n input.name =\n firstInput?.name || elem.getAttribute(\"data-name\") || \"open-group\";\n input.value = value;\n input.id = id;\n\n label.appendChild(span);\n label.appendChild(input);\n\n elem.insertBefore(label, addInput);\n addInput.value = \"\";\n }\n } else if (event.key === \"Backspace\" && addInput.value === \"\") {\n event.preventDefault();\n const labels = elem.querySelectorAll(\"label\");\n if (labels.length > 0) {\n const lastLabel = labels[labels.length - 1];\n lastLabel.remove();\n }\n }\n });\n}\n\nfunction enhanceClip(elem) {\n if (elem.dataset.enhancedClip) return;\n elem.dataset.enhancedClip = \"true\";\n\n if (!elem.hasAttribute(\"tabindex\")) {\n elem.setAttribute(\"tabindex\", \"0\");\n }\n if (!elem.hasAttribute(\"role\")) {\n elem.setAttribute(\"role\", \"button\");\n }\n\n const syncAria = () => {\n const isOpen = elem.getAttribute(\"data-clip-open\") === \"true\";\n elem.setAttribute(\"aria-expanded\", isOpen ? \"true\" : \"false\");\n };\n\n const toggleOpen = () => {\n const isOpen = elem.getAttribute(\"data-clip-open\") === \"true\";\n elem.setAttribute(\"data-clip-open\", isOpen ? \"false\" : \"true\");\n syncAria();\n };\n\n elem.addEventListener(\"click\", (event) => {\n if (event.defaultPrevented) return;\n toggleOpen();\n });\n\n elem.addEventListener(\"keydown\", (event) => {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggleOpen();\n }\n });\n\n syncAria();\n}\n\nfunction enhanceButtonWorking(elem) {\n if (elem.dataset.enhancedBtnWorking) return;\n elem.dataset.enhancedBtnWorking = \"true\";\n\n let originalIcon = null;\n let addedIcon = false;\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === \"class\") {\n const hasWorking = elem.classList.contains(\"btn-working\");\n const icon = elem.querySelector(\"pds-icon\");\n\n if (hasWorking) {\n if (icon) {\n if (!originalIcon) {\n originalIcon = icon.getAttribute(\"icon\");\n }\n icon.setAttribute(\"icon\", \"circle-notch\");\n } else {\n const newIcon = document.createElement(\"pds-icon\");\n newIcon.setAttribute(\"icon\", \"circle-notch\");\n newIcon.setAttribute(\"size\", \"sm\");\n elem.insertBefore(newIcon, elem.firstChild);\n addedIcon = true;\n }\n } else if (mutation.oldValue?.includes(\"btn-working\")) {\n if (icon) {\n if (addedIcon) {\n icon.remove();\n addedIcon = false;\n } else if (originalIcon) {\n icon.setAttribute(\"icon\", originalIcon);\n originalIcon = null;\n }\n }\n }\n }\n });\n });\n\n observer.observe(elem, {\n attributes: true,\n attributeFilter: [\"class\"],\n attributeOldValue: true,\n });\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n// Map selectors to their run functions\nconst enhancerRunners = new Map([\n [\".accordion\", enhanceAccordion],\n [\"nav[data-dropdown]\", enhanceDropdown],\n [\"label[data-toggle]\", enhanceToggle],\n [\"label[data-color]\", enhanceColorInput],\n ['input[type=\"range\"]', enhanceRange],\n [\"form[data-required]\", enhanceRequired],\n [\"fieldset[role=group][data-open]\", enhanceOpenGroup],\n [\"[data-clip]\", enhanceClip],\n [\"button, a[class*='btn-']\", enhanceButtonWorking],\n]);\n\n/**\n * Complete enhancers with runtime functions.\n * Used by PDS.enhancer() and AutoDefiner at runtime.\n *\n * This is the canonical runtime array of enhancer objects.\n */\nexport const defaultPDSEnhancers = enhancerDefinitions.map((meta) => ({\n ...meta,\n run: enhancerRunners.get(meta.selector) || (() => {}),\n}));\n\n// Metadata lives in pds-enhancers-meta.js (live-mode only).\n"],
5
- "mappings": "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",
6
- "names": []
7
- }