{"version":3,"mappings":"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","names":["callback","ICON_CACHE","FALLBACK_ICON","loadIcon","key","name","variant","svg","__variableDynamicImportRuntimeHelper","data","getVariant","sharp","filled","rtl","resolveIcon","v_sharp","v_filled","v_rtl","icon","transformIcon","el","tmp","transformIcons","icons","batchSize","i","batch","promises","init"],"sources":["../../src/helpers/onPageLoad.ts","../../src/components/icon.ts"],"sourcesContent":["export const onPageLoad = (callback: () => void) => {\r\n\tdocument.addEventListener('DOMContentLoaded', callback);\r\n};\r\n","/**\r\n * This script watches the entire dom for special icon shortcuts and transforms them into fully qualified SVGs.\r\n */\r\n\r\nexport type Icon = {\r\n\tkey: string;\r\n\tname: string;\r\n\tvariant: string;\r\n\tdata: string;\r\n};\r\n\r\nconst ICON_CACHE: Record = {};\r\n\r\nconst FALLBACK_ICON = `\r\n\t\r\n`;\r\n\r\nconst loadIcon = async (key: string, name: string, variant: string): Promise => {\r\n\ttry {\r\n\t\t// dynamically import the raw SVG contents from src/icons/**/*.svg\r\n\t\tconst svg = await import(`../icons/${name}/${name}_${variant}.svg?raw`);\r\n\t\tif (!svg?.default) return null;\r\n\r\n\t\tconst data = svg.default;\r\n\t\treturn { key, name, variant, data };\r\n\t} catch (e) {\r\n\t\tconsole.warn(`Failed to import icon: [${name}:${variant}]\\n`, e);\r\n\t\treturn null;\r\n\t}\r\n};\r\n\r\nconst getVariant = (sharp: boolean, filled: boolean, rtl: boolean) => {\r\n\treturn `${sharp ? 'sharp' : 'round'}_${filled ? 'filled' : 'lined'}${rtl ? '_rtl' : ''}`;\r\n};\r\n\r\nconst resolveIcon = async (name: string, variant?: string): Promise => {\r\n\t// check the cache\r\n\tconst key = `${name}:${variant ?? ''}`;\r\n\tif (key in ICON_CACHE) return ICON_CACHE[key];\r\n\r\n\tconst v_sharp = variant?.includes('sharp') ?? false;\r\n\tconst v_filled = variant?.includes('filled') ?? false;\r\n\tconst v_rtl = variant?.includes('rtl') ?? false;\r\n\r\n\tlet icon = await loadIcon(key, name, getVariant(v_sharp, v_filled, v_rtl));\r\n\tif (!icon) icon = await loadIcon(key, name, getVariant(!v_sharp, v_filled, v_rtl));\r\n\tif (!icon) icon = await loadIcon(key, name, getVariant(v_sharp, !v_filled, v_rtl));\r\n\tif (!icon) icon = await loadIcon(key, name, getVariant(!v_sharp, !v_filled, v_rtl));\r\n\r\n\t// fall back to non-RTL only if RTL is specifically specified in the variant\r\n\tif (v_rtl) {\r\n\t\tif (!icon) icon = await loadIcon(key, name, getVariant(v_sharp, v_filled, !v_rtl));\r\n\t\tif (!icon) icon = await loadIcon(key, name, getVariant(!v_sharp, v_filled, !v_rtl));\r\n\t\tif (!icon) icon = await loadIcon(key, name, getVariant(v_sharp, !v_filled, !v_rtl));\r\n\t\tif (!icon) icon = await loadIcon(key, name, getVariant(!v_sharp, !v_filled, !v_rtl));\r\n\t}\r\n\r\n\tif (icon) {\r\n\t\t// save to cache\r\n\t\tICON_CACHE[icon.key] = icon;\r\n\t\treturn icon;\r\n\t} else {\r\n\t\treturn { key: '[placeholder]', name: '[placeholder]', variant: '', data: FALLBACK_ICON };\r\n\t}\r\n};\r\n\r\nconst transformIcon = async (el: HTMLElement, name: string) => {\r\n\tif (!name) return;\r\n\r\n\t// load the icon\r\n\tconst icon = await resolveIcon(name, el.dataset.v);\r\n\r\n\t// use a placeholder to generated the transformable SVG node\r\n\tconst tmp = document.createElement('div');\r\n\ttmp.innerHTML = icon.data;\r\n\tconst svg = tmp.querySelector('svg');\r\n\tif (!svg) return;\r\n\tsvg.setAttribute('class', 'icon' + (el.className ? ' ' + el.className : ''));\r\n\tsvg.dataset.icon = icon.name;\r\n\tif (icon.variant) svg.dataset.v = icon.variant;\r\n\r\n\t// replace the span with the svg\r\n\tel.insertAdjacentElement('afterend', svg);\r\n\tel.parentElement?.removeChild(el);\r\n};\r\n\r\nconst transformIcons = async () => {\r\n\tconst icons = Array.from(document.querySelectorAll('span[data-icon]'));\r\n\r\n\t// Immediately delete the [data-icon] attribute to prevent processing this tag multiple times while loading.\r\n\t// We save the icon name here on a different attribute so the batch procesor can still read it internally.\r\n\tfor (const icon of icons) {\r\n\t\ticon.dataset.iconLoading = icon.dataset.icon;\r\n\t\tdelete icon.dataset.icon;\r\n\t}\r\n\r\n\t// process icons per batch in case there are too many icons on the page\r\n\tconst batchSize = 20;\r\n\tfor (let i = 0; i < icons.length; i += batchSize) {\r\n\t\tconst batch = icons.slice(i, i + batchSize);\r\n\t\tconst promises: Promise[] = [];\r\n\t\tfor (const icon of batch) {\r\n\t\t\tconst name = icon.dataset.iconLoading || '';\r\n\t\t\tpromises.push(transformIcon(icon, name));\r\n\t\t}\r\n\t\tawait Promise.allSettled(promises);\r\n\t}\r\n};\r\n\r\nexport const init = () => {\r\n\t// first pass\r\n\ttransformIcons();\r\n\r\n\t// start a full-page mutation observer to look for matching icon shortcuts\r\n\tconst observer = new MutationObserver(transformIcons);\r\n\r\n\tobserver.observe(document.body, {\r\n\t\tsubtree: true,\r\n\t\tchildList: true,\r\n\t\tattributes: true,\r\n\t\tattributeFilter: ['data-icon']\r\n\t});\r\n};\r\n\r\nexport default {\r\n\tinit\r\n};\r\n"],"file":"shared/icon.js"}