{"version":3,"sources":["css-style-compat.ts"],"sourcesContent":["import { UIX } from \"../../uix.ts\";\nimport { Path } from \"datex-core-legacy/utils/path.ts\";\n\n// fake CSSStyleDeclaration element with proxy to update css property names\nexport class PlaceholderCSSStyleDeclaration extends Array /*implements CSSStyleDeclaration*/ {\n    \n    public static toCamelCase(property:string) {\n        // ignore variables\n        if (property.startsWith(\"--\")) return property;\n        return property.replace(/-./g, x=>x[1].toUpperCase());\n    }\n    public static toKebabCase(property:string) {\n        // ignore variables\n        if (property.startsWith(\"--\")) return property;\n        return property.replace(/[A-Z]/g, x => `-${x.toLowerCase()}`);\n    }\n\n    getPropertyPriority(property: string): string {\n        throw new Error(\"PlaceholderCSSStyleDeclaration Method not implemented.\");\n    }\n    getPropertyValue(property: string): string {\n        return this[PlaceholderCSSStyleDeclaration.toCamelCase(property)]\n    }\n    removeProperty(property: string): string {\n        const name = PlaceholderCSSStyleDeclaration.toCamelCase(property);\n        const val = this[name];\n        delete this[name];\n\n        let index = this.indexOf(property);\n        if (index != -1) this.splice(index, 1);\n\n        return val;\n    }\n    setProperty(property: string, value: string | null) {\n        if (!this.includes(property)) this.push(property);\n        \n        this[PlaceholderCSSStyleDeclaration.toCamelCase(property)] = value;\n    }\n\n    item(index:number) {\n        if (typeof index != \"number\") return undefined;\n        return this[index];\n    }\n\n    get cssText() {\n        const css = [];\n        for (let i = 0; i < this.length; i++) {\n            const key = this.item(i);\n            css.push(`${key}: ${this[PlaceholderCSSStyleDeclaration.toCamelCase(key)]};`);\n        }\n        return css.join(\" \");\n    }\n\n    private constructor(){\n        super();\n    }\n\n\n    static create():CSSStyleDeclaration{\n        const dec = new PlaceholderCSSStyleDeclaration();\n        return <CSSStyleDeclaration><any> new Proxy(dec, {\n            set(target, p, newValue, receiver) {\n\n                // number indices or 'length' property\n                if (p == \"length\" || !Number.isNaN(Number(p))) target[p] = newValue; \n\n                // css properties\n                else {\n                    (<any>target)[PlaceholderCSSStyleDeclaration.toCamelCase(p)] = newValue;\n                    const kebabProp = PlaceholderCSSStyleDeclaration.toKebabCase(<string>p);\n                    if (!target.includes(kebabProp)) target.push(kebabProp);\n                }\n\n                return true;\n            },\n            get(target, p, receiver) {\n                // number indices or 'length' property\n                if (p == \"length\" || !Number.isNaN(Number(p))) return target[p]; \n                else {\n                    return target[PlaceholderCSSStyleDeclaration.toCamelCase(<string>p)];\n                }\n            },\n        })\n    }\n}\n\n\n// let constructed_style_sheets_supported = false;\n// try {\n//     new CSSStyleSheet();\n//     constructed_style_sheets_supported = true;\n// } catch {\n//     logger.warn(\"using fallback option for css stylesheet generation\")\n// }\n\n\n\n\n// // only until CSSStyleSheet constructors are supported in SaFaRi...\n// // new CSSStyleSheet(); stylesheet.replace(...)\n// export function CSSStyleSheetCompat(element:HTMLElement|ShadowRoot|Document, styles?:string, styleSheets?:CSSStyleSheet[]):CSSStyleSheet {\n//     // use CSSStyleSheet constructor\n//     if (constructed_style_sheets_supported) {\n//         const styleSheet = new CSSStyleSheet();\n//         // @ts-ignore\n//         styleSheet.replaceSync(styles);\n//         // update adoptedStyleSheets for element\n//         if (styleSheets) {\n//             styleSheets.push(styleSheet);\n//             adoptStyleSheets(element, ...styleSheets)\n//         };\n//         return styleSheet;\n//     }\n//     // fallback only until CSSStyleSheet constructors are supported in SaFaRi...\n//     else {\n//         // document must be document.body\n//         if (element == document) element = document.head;\n//         const styleElement = document.createElement('style');\n//         styleElement.setAttribute('type', 'text/css');\n//         if (styles) styleElement.textContent = styles;\n//         element.appendChild(styleElement);\n//         return styleElement.sheet;\n//     }\n   \n// }\n// // replacement for element.adoptedStyleSheets = [...]\n// export function adoptStyleSheets(element:HTMLElement|ShadowRoot|Document, ...styleSheets:CSSStyleSheet[]) {\n//     if (constructed_style_sheets_supported) {\n//         // @ts-ignore\n//         element.adoptedStyleSheets = styleSheets;\n//     }\n//     else {\n//         // document must be document.body\n//         if (element == document) element = document.head;\n//         // append all new stylesheets (fallback option)\n//         for (let sheet of styleSheets) {\n//             element.appendChild(sheet.ownerNode.cloneNode(true));\n//         }   \n//     }\n// }\n\n// only until CSSStyleSheet constructors are supported in SaFaRi...\n// new CSSStyleSheet(); stylesheet.replace(...)\n\n\nexport function addStyleSheetLink(element:HTMLElement|ShadowRoot, url:string|URL) {\n    return new Promise<HTMLLinkElement>((resolve, reject)=>{\n        const link = document.createElement(\"link\");\n        link.rel = \"stylesheet\";\n        link.onload = ()=>{\n            resolve(link)\n        };\n        link.onerror = ()=>{\n            link.remove();\n            reject(\"Failed to load stylesheet \" + url);\n        };\n        link.href = url.toString();\n        element.appendChild(link);\n\n        // onload not working with JSDom\n        if (UIX.context == \"backend\") {\n\n            // handle non existing css file -> try to fetch corresponding scss file\n            const path = new Path(url);\n            if (path.ext == \"css\" && !path.fs_exists && path.getWithFileExtension(\"scss\").fs_exists) {\n                url = path.getWithFileExtension(\"scss\");\n            }\n\n            (async ()=>{\n                try {\n                    if ((await fetch(url)).ok) {\n                        element.appendChild(link);\n                        resolve(link);\n                    }\n                    else reject(\"Backend failed to load stylesheet \" + url);\n                }\n                catch {reject(\"Backend failed to load stylesheet \" + url);}\n            })()   \n        }\n    })\n}\n\nconst globalStyleSheets = new Set<string>();\n\nexport function recreateGlobalStyleSheetLinks() {\n    const promises = []\n    for (const url of globalStyleSheets) {\n        promises.push(insertGlobalStyleSheetLink(new URL(url), true));\n    }\n    return Promise.all(promises)\n}\n\nexport async function addGlobalStyleSheetLink(url:URL) {\n    await insertGlobalStyleSheetLink(url)\n    globalStyleSheets.add(url.toString())\n}\n\n\nasync function insertGlobalStyleSheetLink(url:URL, allowIfAlreadyInGlobalStylesheets = false) {\n    // removes origin, if current origin (to match style sheet hrefs from SSR)\n    const normalizedUrl = url.origin === globalThis.location.origin ? url.pathname + url.search : url.toString()\n    if (!allowIfAlreadyInGlobalStylesheets && (document.head?.querySelector('link[href=\"'+normalizedUrl+'\"]') || globalStyleSheets.has(url.toString()))) return;\n    const link = await addStyleSheetLink(document.head, url);\n    link.classList.add(\"global-style\");\n}"],"names":["UIX","Path","PlaceholderCSSStyleDeclaration","Array","toCamelCase","property","startsWith","replace","x","toUpperCase","toKebabCase","toLowerCase","getPropertyPriority","Error","getPropertyValue","removeProperty","name","val","index","indexOf","splice","setProperty","value","includes","push","item","cssText","css","i","length","key","join","create","Proxy","set","target","p","newValue","receiver","Number","isNaN","kebabProp","get","addStyleSheetLink","element","url","Promise","resolve","reject","link","document","createElement","rel","onload","onerror","remove","href","toString","appendChild","context","path","ext","fs_exists","getWithFileExtension","fetch","ok","globalStyleSheets","Set","recreateGlobalStyleSheetLinks","promises","insertGlobalStyleSheetLink","URL","all","addGlobalStyleSheetLink","add","allowIfAlreadyInGlobalStylesheets","normalizedUrl","origin","globalThis","location","pathname","search","head","querySelector","has","classList"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/utils/","file":"css-style-compat.ts"}