{"version":3,"file":"useThemeDocumentScope.hook.cjs","sources":["../../../../../../../src/components/theme-provider/hooks/use-theme-provider/helpers/use-theme-document-scope/useThemeDocumentScope.hook.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react'\r\n\r\nimport type { ThemeProviderScope } from '@components/theme-provider/types/ThemeProvider.props.ts'\r\nimport type { ThemeTokens } from '@components/theme-provider/hooks/use-theme-provider/types'\r\nimport {\r\n    THEME_TRANSITION_ATTRIBUTE,\r\n    THEME_TRANSITION_DURATION_VAR,\r\n} from '@constants/theme'\r\n\r\nconst useIsomorphicLayoutEffect =\r\n  typeof window === 'undefined' ? useEffect : useLayoutEffect\r\n\r\n/**\r\n * Synchronizes document-scoped theme values with `<html>` for body-mounted portals.\r\n */\r\nexport const useThemeDocumentScope = (\r\n    scope: ThemeProviderScope,\r\n    resolvedTheme: string,\r\n    tokens?: ThemeTokens,\r\n    isTransitioning = false,\r\n    transitionDuration = 0,\r\n) => {\r\n    useIsomorphicLayoutEffect(() => {\r\n        if (scope !== 'document' || typeof document === 'undefined') {\r\n            return\r\n        }\r\n\r\n        const root = document.documentElement\r\n        const previousTheme = root.getAttribute('data-theme')\r\n        root.setAttribute('data-theme', resolvedTheme)\r\n\r\n        return () => {\r\n            if (previousTheme === null) {\r\n                root.removeAttribute('data-theme')\r\n            } else {\r\n                root.setAttribute('data-theme', previousTheme)\r\n            }\r\n        }\r\n    }, [resolvedTheme, scope])\r\n\r\n    useIsomorphicLayoutEffect(() => {\r\n        if (scope !== 'document' || typeof document === 'undefined') {\r\n            return\r\n        }\r\n\r\n        const root = document.documentElement\r\n        const previousTokens = new Map<string, string>()\r\n\r\n        for (const [key, value] of Object.entries(tokens ?? {})) {\r\n            if (value === undefined) {\r\n                continue\r\n            }\r\n            const property = `--color-${key}`\r\n            previousTokens.set(property, root.style.getPropertyValue(property))\r\n            root.style.setProperty(property, value)\r\n        }\r\n\r\n        return () => {\r\n            for (const [property, value] of previousTokens) {\r\n                if (value) {\r\n                    root.style.setProperty(property, value)\r\n                } else {\r\n                    root.style.removeProperty(property)\r\n                }\r\n            }\r\n        }\r\n    }, [scope, tokens])\r\n\r\n    useIsomorphicLayoutEffect(() => {\r\n        if (scope !== 'document' || typeof document === 'undefined') {\r\n            return\r\n        }\r\n\r\n        const root = document.documentElement\r\n        const previousAttribute = root.getAttribute(THEME_TRANSITION_ATTRIBUTE)\r\n        const previousDuration = root.style.getPropertyValue(\r\n            THEME_TRANSITION_DURATION_VAR,\r\n        )\r\n\r\n        if (isTransitioning) {\r\n            root.setAttribute(THEME_TRANSITION_ATTRIBUTE, '')\r\n            root.style.setProperty(\r\n                THEME_TRANSITION_DURATION_VAR,\r\n                `${Math.max(0, transitionDuration)}ms`,\r\n            )\r\n        }\r\n\r\n        return () => {\r\n            if (previousAttribute === null) {\r\n                root.removeAttribute(THEME_TRANSITION_ATTRIBUTE)\r\n            } else {\r\n                root.setAttribute(THEME_TRANSITION_ATTRIBUTE, previousAttribute)\r\n            }\r\n\r\n            if (previousDuration) {\r\n                root.style.setProperty(THEME_TRANSITION_DURATION_VAR, previousDuration)\r\n            } else {\r\n                root.style.removeProperty(THEME_TRANSITION_DURATION_VAR)\r\n            }\r\n        }\r\n    }, [isTransitioning, scope, transitionDuration])\r\n}\r\n"],"names":["useIsomorphicLayoutEffect","useEffect","useLayoutEffect","useThemeDocumentScope","scope","resolvedTheme","tokens","isTransitioning","transitionDuration","root","previousTheme","previousTokens","key","value","property","previousAttribute","THEME_TRANSITION_ATTRIBUTE","previousDuration","THEME_TRANSITION_DURATION_VAR"],"mappings":"4JASMA,EACJ,OAAO,OAAW,IAAcC,EAAAA,UAAYC,EAAAA,gBAKjCC,EAAwB,CACjCC,EACAC,EACAC,EACAC,EAAkB,GAClBC,EAAqB,IACpB,CACDR,EAA0B,IAAM,CAC5B,GAAII,IAAU,YAAc,OAAO,SAAa,IAC5C,OAGJ,MAAMK,EAAO,SAAS,gBAChBC,EAAgBD,EAAK,aAAa,YAAY,EACpD,OAAAA,EAAK,aAAa,aAAcJ,CAAa,EAEtC,IAAM,CACLK,IAAkB,KAClBD,EAAK,gBAAgB,YAAY,EAEjCA,EAAK,aAAa,aAAcC,CAAa,CAErD,CACJ,EAAG,CAACL,EAAeD,CAAK,CAAC,EAEzBJ,EAA0B,IAAM,CAC5B,GAAII,IAAU,YAAc,OAAO,SAAa,IAC5C,OAGJ,MAAMK,EAAO,SAAS,gBAChBE,MAAqB,IAE3B,SAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQP,GAAU,CAAA,CAAE,EAAG,CACrD,GAAIO,IAAU,OACV,SAEJ,MAAMC,EAAW,WAAWF,CAAG,GAC/BD,EAAe,IAAIG,EAAUL,EAAK,MAAM,iBAAiBK,CAAQ,CAAC,EAClEL,EAAK,MAAM,YAAYK,EAAUD,CAAK,CAC1C,CAEA,MAAO,IAAM,CACT,SAAW,CAACC,EAAUD,CAAK,IAAKF,EACxBE,EACAJ,EAAK,MAAM,YAAYK,EAAUD,CAAK,EAEtCJ,EAAK,MAAM,eAAeK,CAAQ,CAG9C,CACJ,EAAG,CAACV,EAAOE,CAAM,CAAC,EAElBN,EAA0B,IAAM,CAC5B,GAAII,IAAU,YAAc,OAAO,SAAa,IAC5C,OAGJ,MAAMK,EAAO,SAAS,gBAChBM,EAAoBN,EAAK,aAAaO,4BAA0B,EAChEC,EAAmBR,EAAK,MAAM,iBAChCS,EAAAA,6BAAA,EAGJ,OAAIX,IACAE,EAAK,aAAaO,EAAAA,2BAA4B,EAAE,EAChDP,EAAK,MAAM,YACPS,EAAAA,8BACA,GAAG,KAAK,IAAI,EAAGV,CAAkB,CAAC,IAAA,GAInC,IAAM,CACLO,IAAsB,KACtBN,EAAK,gBAAgBO,4BAA0B,EAE/CP,EAAK,aAAaO,EAAAA,2BAA4BD,CAAiB,EAG/DE,EACAR,EAAK,MAAM,YAAYS,EAAAA,8BAA+BD,CAAgB,EAEtER,EAAK,MAAM,eAAeS,+BAA6B,CAE/D,CACJ,EAAG,CAACX,EAAiBH,EAAOI,CAAkB,CAAC,CACnD"}