@xanui/core 1.2.42 → 1.2.43

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.
Files changed (49) hide show
  1. package/AppRoot/{context.js → AppRootProvider.js} +1 -1
  2. package/AppRoot/AppRootProvider.js.map +1 -0
  3. package/AppRoot/{context.mjs → AppRootProvider.mjs} +1 -1
  4. package/AppRoot/AppRootProvider.mjs.map +1 -0
  5. package/AppRoot/index.d.ts +2 -2
  6. package/AppRoot/index.js +13 -94
  7. package/AppRoot/index.js.map +1 -1
  8. package/AppRoot/index.mjs +13 -91
  9. package/AppRoot/index.mjs.map +1 -1
  10. package/Iframe/index.d.ts +1 -0
  11. package/Iframe/index.js +3 -3
  12. package/Iframe/index.js.map +1 -1
  13. package/Iframe/index.mjs +4 -4
  14. package/Iframe/index.mjs.map +1 -1
  15. package/Tag/useTagProps.js +4 -1
  16. package/Tag/useTagProps.js.map +1 -1
  17. package/Tag/useTagProps.mjs +4 -1
  18. package/Tag/useTagProps.mjs.map +1 -1
  19. package/css/CSSCacheProvider.d.ts +7 -0
  20. package/css/CSSCacheProvider.js +34 -0
  21. package/css/CSSCacheProvider.js.map +1 -0
  22. package/css/CSSCacheProvider.mjs +29 -0
  23. package/css/CSSCacheProvider.mjs.map +1 -0
  24. package/hooks/useAnimation.js +9 -2
  25. package/hooks/useAnimation.js.map +1 -1
  26. package/hooks/useAnimation.mjs +7 -0
  27. package/hooks/useAnimation.mjs.map +1 -1
  28. package/hooks/usePortal.js +2 -2
  29. package/hooks/usePortal.js.map +1 -1
  30. package/hooks/usePortal.mjs +1 -1
  31. package/hooks/usePortal.mjs.map +1 -1
  32. package/hooks/useTransition/index.js +9 -7
  33. package/hooks/useTransition/index.js.map +1 -1
  34. package/hooks/useTransition/index.mjs +9 -7
  35. package/hooks/useTransition/index.mjs.map +1 -1
  36. package/index.d.ts +3 -2
  37. package/index.js +7 -4
  38. package/index.js.map +1 -1
  39. package/index.mjs +3 -2
  40. package/index.mjs.map +1 -1
  41. package/package.json +2 -2
  42. package/theme/ThemeProvider.d.ts +3 -1
  43. package/theme/ThemeProvider.js +94 -5
  44. package/theme/ThemeProvider.js.map +1 -1
  45. package/theme/ThemeProvider.mjs +94 -5
  46. package/theme/ThemeProvider.mjs.map +1 -1
  47. package/AppRoot/context.js.map +0 -1
  48. package/AppRoot/context.mjs.map +0 -1
  49. /package/AppRoot/{context.d.ts → AppRootProvider.d.ts} +0 -0
@@ -0,0 +1,29 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import React__default from 'react';
3
+ import { ONCSS_CACHE } from 'oncss';
4
+
5
+ const CSSCacheContext = React__default.createContext(null);
6
+ const CSSCacheProvider = ({ cacheId, children }) => {
7
+ return (jsx(CSSCacheContext.Provider, { value: cacheId, children: children }));
8
+ };
9
+ const useCSSCacheId = () => {
10
+ return React__default.useContext(CSSCacheContext);
11
+ };
12
+ const useCSSCache = () => {
13
+ const cacheId = React__default.useContext(CSSCacheContext);
14
+ if (typeof window === 'undefined') {
15
+ return null;
16
+ }
17
+ const caches = ONCSS_CACHE.caches();
18
+ return {
19
+ cacheId,
20
+ cache: caches.get(cacheId)
21
+ };
22
+ };
23
+ const getCSSCache = (cacheId) => {
24
+ const caches = ONCSS_CACHE.caches();
25
+ return caches.get(cacheId);
26
+ };
27
+
28
+ export { CSSCacheProvider, getCSSCache, useCSSCache, useCSSCacheId };
29
+ //# sourceMappingURL=CSSCacheProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSSCacheProvider.mjs","sources":["../../src/css/CSSCacheProvider.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { ONCSS_CACHE } from 'oncss'\r\n\r\nconst CSSCacheContext = React.createContext<string | null>(null);\r\n\r\nexport const CSSCacheProvider: React.FC<{ cacheId: string | null; children: React.ReactNode }> = ({ cacheId, children }) => {\r\n return (\r\n <CSSCacheContext.Provider value={cacheId}>\r\n {children}\r\n </CSSCacheContext.Provider>\r\n );\r\n}\r\n\r\nexport const useCSSCacheId = () => {\r\n return React.useContext(CSSCacheContext) as string\r\n}\r\n\r\nexport const useCSSCache = () => {\r\n const cacheId = React.useContext(CSSCacheContext);\r\n if (typeof window === 'undefined') {\r\n return null as any;\r\n }\r\n const caches = ONCSS_CACHE.caches()\r\n\r\n return {\r\n cacheId,\r\n cache: caches.get(cacheId!)\r\n }\r\n}\r\n\r\nexport const getCSSCache = (cacheId: string) => {\r\n const caches = ONCSS_CACHE.caches()\r\n return caches.get(cacheId)\r\n}"],"names":["React","_jsx"],"mappings":";;;;AAGA,MAAM,eAAe,GAAGA,cAAK,CAAC,aAAa,CAAgB,IAAI,CAAC;AAEzD,MAAM,gBAAgB,GAAoE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAI;AACxH,IAAA,QACGC,GAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,OAAO,EAAA,QAAA,EACpC,QAAQ,EAAA,CACe;AAEjC;AAEO,MAAM,aAAa,GAAG,MAAK;AAC/B,IAAA,OAAOD,cAAK,CAAC,UAAU,CAAC,eAAe,CAAW;AACrD;AAEO,MAAM,WAAW,GAAG,MAAK;IAC7B,MAAM,OAAO,GAAGA,cAAK,CAAC,UAAU,CAAC,eAAe,CAAC;AACjD,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAChC,QAAA,OAAO,IAAW;IACrB;AACA,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE;IAEnC,OAAO;QACJ,OAAO;AACP,QAAA,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAQ;KAC5B;AACJ;AAEO,MAAM,WAAW,GAAG,CAAC,OAAe,KAAI;AAC5C,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE;AACnC,IAAA,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7B;;;;"}
@@ -3,8 +3,10 @@
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
- var index = require('../css/index.js');
6
+ var index$1 = require('../css/index.js');
7
7
  var React = require('react');
8
+ var index = require('../Document/index.js');
9
+ var CSSCacheProvider = require('../css/CSSCacheProvider.js');
8
10
 
9
11
  const animationEases = {
10
12
  standard: "cubic-bezier(0.4, 0, 0.2, 1)",
@@ -18,7 +20,9 @@ const useAnimation = ({ from, to, delay, ease, duration }) => {
18
20
  let _duration = duration || 600;
19
21
  let _ease = ease || "standard";
20
22
  const id = "anim" + React.useId().replace(/:/g, "");
21
- const anim = index.css({
23
+ const doc = index.useDocument();
24
+ const cacheId = CSSCacheProvider.useCSSCacheId();
25
+ const anim = index$1.css({
22
26
  animationName: id,
23
27
  animationDelay: _delay + "ms",
24
28
  animationDuration: _duration + "ms",
@@ -27,6 +31,9 @@ const useAnimation = ({ from, to, delay, ease, duration }) => {
27
31
  from: from,
28
32
  to: to
29
33
  }
34
+ }, {
35
+ container: doc,
36
+ cacheId
30
37
  });
31
38
  return anim.classname;
32
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimation.js","sources":["../../src/hooks/useAnimation.ts"],"sourcesContent":["\"use client\";\r\nimport { css } from '../css'\r\nimport { useId } from 'react'\r\nimport { CSSProps } from '../css/types'\r\n\r\nexport const animationEases = {\r\n standard: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n fast: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n smooth: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n linear: \"cubic-bezier(0, 0, 1, 1)\",\r\n bounce: \"cubic-bezier(0.34, 1.50, 0.64, 1)\",\r\n};\r\n\r\nexport interface UseAnimationProps {\r\n delay?: number;\r\n duration?: number;\r\n from: CSSProps;\r\n to: CSSProps;\r\n ease?: keyof typeof animationEases;\r\n}\r\n\r\nconst useAnimation = ({ from, to, delay, ease, duration }: UseAnimationProps) => {\r\n let _delay = delay || 0;\r\n let _duration = duration || 600;\r\n let _ease = ease || \"standard\"\r\n const id = \"anim\" + useId().replace(/:/g, \"\")\r\n const anim = css({\r\n animationName: id,\r\n animationDelay: _delay + \"ms\",\r\n animationDuration: _duration + \"ms\",\r\n animationTimingFunction: animationEases[_ease] || animationEases.standard,\r\n [`@keyframes ${id}`]: {\r\n from: from as any,\r\n to: to as any\r\n }\r\n })\r\n return anim.classname\r\n}\r\n\r\nexport default useAnimation"],"names":[],"mappings":";;;;;;;;AAKO;AACH;AACA;AACA;AACA;AACA;;AAWJ;AACI;AACA;AACA;AACA;;AAEI;;;;AAIA;AACI;AACA;AACH;AACJ;;AAEL;;;"}
1
+ {"version":3,"file":"useAnimation.js","sources":["../../src/hooks/useAnimation.ts"],"sourcesContent":["\"use client\";\r\nimport { css } from '../css'\r\nimport { useId } from 'react'\r\nimport { CSSProps } from '../css/types'\r\nimport { useDocument } from '../Document';\r\nimport { useCSSCacheId } from '../css/CSSCacheProvider';\r\n\r\nexport const animationEases = {\r\n standard: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n fast: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n smooth: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n linear: \"cubic-bezier(0, 0, 1, 1)\",\r\n bounce: \"cubic-bezier(0.34, 1.50, 0.64, 1)\",\r\n};\r\n\r\nexport interface UseAnimationProps {\r\n delay?: number;\r\n duration?: number;\r\n from: CSSProps;\r\n to: CSSProps;\r\n ease?: keyof typeof animationEases;\r\n}\r\n\r\nconst useAnimation = ({ from, to, delay, ease, duration }: UseAnimationProps) => {\r\n let _delay = delay || 0;\r\n let _duration = duration || 600;\r\n let _ease = ease || \"standard\"\r\n const id = \"anim\" + useId().replace(/:/g, \"\")\r\n const doc = useDocument()\r\n const cacheId = useCSSCacheId()\r\n\r\n const anim = css({\r\n animationName: id,\r\n animationDelay: _delay + \"ms\",\r\n animationDuration: _duration + \"ms\",\r\n animationTimingFunction: animationEases[_ease] || animationEases.standard,\r\n [`@keyframes ${id}`]: {\r\n from: from as any,\r\n to: to as any\r\n }\r\n }, {\r\n container: doc,\r\n cacheId\r\n })\r\n return anim.classname\r\n}\r\n\r\nexport default useAnimation"],"names":[],"mappings":";;;;;;;;;;AAOO;AACH;AACA;AACA;AACA;AACA;;AAWJ;AACI;AACA;AACA;AACA;AACA;AACA;;AAGI;;;;AAIA;AACI;AACA;AACH;;AAED;;AAEH;;AAEL;;;"}
@@ -1,6 +1,8 @@
1
1
  "use client";
2
2
  import { css } from '../css/index.mjs';
3
3
  import { useId } from 'react';
4
+ import { useDocument } from '../Document/index.mjs';
5
+ import { useCSSCacheId } from '../css/CSSCacheProvider.mjs';
4
6
 
5
7
  const animationEases = {
6
8
  standard: "cubic-bezier(0.4, 0, 0.2, 1)",
@@ -14,6 +16,8 @@ const useAnimation = ({ from, to, delay, ease, duration }) => {
14
16
  let _duration = duration || 600;
15
17
  let _ease = ease || "standard";
16
18
  const id = "anim" + useId().replace(/:/g, "");
19
+ const doc = useDocument();
20
+ const cacheId = useCSSCacheId();
17
21
  const anim = css({
18
22
  animationName: id,
19
23
  animationDelay: _delay + "ms",
@@ -23,6 +27,9 @@ const useAnimation = ({ from, to, delay, ease, duration }) => {
23
27
  from: from,
24
28
  to: to
25
29
  }
30
+ }, {
31
+ container: doc,
32
+ cacheId
26
33
  });
27
34
  return anim.classname;
28
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimation.mjs","sources":["../../src/hooks/useAnimation.ts"],"sourcesContent":["\"use client\";\r\nimport { css } from '../css'\r\nimport { useId } from 'react'\r\nimport { CSSProps } from '../css/types'\r\n\r\nexport const animationEases = {\r\n standard: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n fast: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n smooth: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n linear: \"cubic-bezier(0, 0, 1, 1)\",\r\n bounce: \"cubic-bezier(0.34, 1.50, 0.64, 1)\",\r\n};\r\n\r\nexport interface UseAnimationProps {\r\n delay?: number;\r\n duration?: number;\r\n from: CSSProps;\r\n to: CSSProps;\r\n ease?: keyof typeof animationEases;\r\n}\r\n\r\nconst useAnimation = ({ from, to, delay, ease, duration }: UseAnimationProps) => {\r\n let _delay = delay || 0;\r\n let _duration = duration || 600;\r\n let _ease = ease || \"standard\"\r\n const id = \"anim\" + useId().replace(/:/g, \"\")\r\n const anim = css({\r\n animationName: id,\r\n animationDelay: _delay + \"ms\",\r\n animationDuration: _duration + \"ms\",\r\n animationTimingFunction: animationEases[_ease] || animationEases.standard,\r\n [`@keyframes ${id}`]: {\r\n from: from as any,\r\n to: to as any\r\n }\r\n })\r\n return anim.classname\r\n}\r\n\r\nexport default useAnimation"],"names":[],"mappings":";;;;AAKO;AACH;AACA;AACA;AACA;AACA;;AAWJ;AACI;AACA;AACA;AACA;;AAEI;;;;AAIA;AACI;AACA;AACH;AACJ;;AAEL;;"}
1
+ {"version":3,"file":"useAnimation.mjs","sources":["../../src/hooks/useAnimation.ts"],"sourcesContent":["\"use client\";\r\nimport { css } from '../css'\r\nimport { useId } from 'react'\r\nimport { CSSProps } from '../css/types'\r\nimport { useDocument } from '../Document';\r\nimport { useCSSCacheId } from '../css/CSSCacheProvider';\r\n\r\nexport const animationEases = {\r\n standard: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n fast: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n smooth: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n linear: \"cubic-bezier(0, 0, 1, 1)\",\r\n bounce: \"cubic-bezier(0.34, 1.50, 0.64, 1)\",\r\n};\r\n\r\nexport interface UseAnimationProps {\r\n delay?: number;\r\n duration?: number;\r\n from: CSSProps;\r\n to: CSSProps;\r\n ease?: keyof typeof animationEases;\r\n}\r\n\r\nconst useAnimation = ({ from, to, delay, ease, duration }: UseAnimationProps) => {\r\n let _delay = delay || 0;\r\n let _duration = duration || 600;\r\n let _ease = ease || \"standard\"\r\n const id = \"anim\" + useId().replace(/:/g, \"\")\r\n const doc = useDocument()\r\n const cacheId = useCSSCacheId()\r\n\r\n const anim = css({\r\n animationName: id,\r\n animationDelay: _delay + \"ms\",\r\n animationDuration: _duration + \"ms\",\r\n animationTimingFunction: animationEases[_ease] || animationEases.standard,\r\n [`@keyframes ${id}`]: {\r\n from: from as any,\r\n to: to as any\r\n }\r\n }, {\r\n container: doc,\r\n cacheId\r\n })\r\n return anim.classname\r\n}\r\n\r\nexport default useAnimation"],"names":[],"mappings":";;;;;;AAOO;AACH;AACA;AACA;AACA;AACA;;AAWJ;AACI;AACA;AACA;AACA;AACA;AACA;;AAGI;;;;AAIA;AACI;AACA;AACH;;AAED;;AAEH;;AAEL;;"}
@@ -9,7 +9,7 @@ require('../css/getValue.js');
9
9
  require('oncss');
10
10
  var ThemeProvider = require('../theme/ThemeProvider.js');
11
11
  require('react-state-bucket');
12
- var context = require('../AppRoot/context.js');
12
+ var AppRootProvider = require('../AppRoot/AppRootProvider.js');
13
13
 
14
14
  function usePortal(children, options) {
15
15
  options = options || {};
@@ -18,7 +18,7 @@ function usePortal(children, options) {
18
18
  }
19
19
  const [mounted, setMounted] = React.useState(options.autoMount);
20
20
  const theme = core.useTheme();
21
- const appRoot = context.useAppRootElement();
21
+ const appRoot = AppRootProvider.useAppRootElement();
22
22
  const { el, root } = React.useMemo(() => {
23
23
  const el = document.createElement("div");
24
24
  const root = client.createRoot(el);
@@ -1 +1 @@
1
- {"version":3,"file":"usePortal.js","sources":["../../src/hooks/usePortal.tsx"],"sourcesContent":["\"use client\";\r\nimport React, { useEffect, useMemo } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { ThemeProvider, useTheme } from \"../theme\";\r\nimport { useAppRootElement } from \"../AppRoot/context\";\r\n\r\nexport type UsePortalOptions = {\r\n container?: HTMLElement;\r\n autoMount?: boolean;\r\n}\r\n\r\nfunction usePortal(children: React.ReactNode, options?: UsePortalOptions) {\r\n options = options || {};\r\n if (options.autoMount === undefined) {\r\n options.autoMount = true;\r\n }\r\n const [mounted, setMounted] = React.useState(options.autoMount);\r\n const theme = useTheme();\r\n const appRoot = useAppRootElement();\r\n const { el, root } = useMemo(() => {\r\n const el = document.createElement(\"div\");\r\n const root = createRoot(el);\r\n return { el, root };\r\n }, [options.autoMount]);\r\n\r\n const container = () => {\r\n const container = options?.container || appRoot\r\n if (!container) throw new Error(`Container not found for portal. Please ensure that AppRoot is present in the application tree.`);\r\n return container;\r\n }\r\n\r\n const mount = () => {\r\n const cont = container();\r\n if (!cont.contains(el)) {\r\n cont.appendChild(el);\r\n }\r\n root.render(<ThemeProvider theme={theme.name}>{children}</ThemeProvider>)\r\n }\r\n\r\n const unmount = () => {\r\n root.render(null)\r\n el.remove();\r\n }\r\n\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n } else {\r\n unmount()\r\n }\r\n }, [mounted]);\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n }\r\n }, [children]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n unmount()\r\n };\r\n }, []);\r\n\r\n return {\r\n isMount: () => mounted,\r\n mount: () => setMounted(true),\r\n unmount: () => setMounted(false)\r\n }\r\n}\r\n\r\n\r\nexport default usePortal;"],"names":[],"mappings":";;;;;;;;;;;;;AAWA;AACG;AACA;AACG;;AAEH;AACA;AACA;;;AAGG;AACA;AACH;;AAGG;AACA;AAAgB;AAChB;AACH;;AAGG;;AAEG;;AAEH;AACH;;AAGG;;AAEH;;;AAKM;;;AAEA;;AAEN;;;AAIM;;AAEN;;AAGG;AACG;AACH;;;AAIA;AACA;AACA;;AAEN;;"}
1
+ {"version":3,"file":"usePortal.js","sources":["../../src/hooks/usePortal.tsx"],"sourcesContent":["\"use client\";\r\nimport React, { useEffect, useMemo } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { ThemeProvider, useTheme } from \"../theme\";\r\nimport { useAppRootElement } from \"../AppRoot/AppRootProvider\";\r\n\r\nexport type UsePortalOptions = {\r\n container?: HTMLElement;\r\n autoMount?: boolean;\r\n}\r\n\r\nfunction usePortal(children: React.ReactNode, options?: UsePortalOptions) {\r\n options = options || {};\r\n if (options.autoMount === undefined) {\r\n options.autoMount = true;\r\n }\r\n const [mounted, setMounted] = React.useState(options.autoMount);\r\n const theme = useTheme();\r\n const appRoot = useAppRootElement();\r\n const { el, root } = useMemo(() => {\r\n const el = document.createElement(\"div\");\r\n const root = createRoot(el);\r\n return { el, root };\r\n }, [options.autoMount]);\r\n\r\n const container = () => {\r\n const container = options?.container || appRoot\r\n if (!container) throw new Error(`Container not found for portal. Please ensure that AppRoot is present in the application tree.`);\r\n return container;\r\n }\r\n\r\n const mount = () => {\r\n const cont = container();\r\n if (!cont.contains(el)) {\r\n cont.appendChild(el);\r\n }\r\n root.render(<ThemeProvider theme={theme.name}>{children}</ThemeProvider>)\r\n }\r\n\r\n const unmount = () => {\r\n root.render(null)\r\n el.remove();\r\n }\r\n\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n } else {\r\n unmount()\r\n }\r\n }, [mounted]);\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n }\r\n }, [children]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n unmount()\r\n };\r\n }, []);\r\n\r\n return {\r\n isMount: () => mounted,\r\n mount: () => setMounted(true),\r\n unmount: () => setMounted(false)\r\n }\r\n}\r\n\r\n\r\nexport default usePortal;"],"names":[],"mappings":";;;;;;;;;;;;;AAWA;AACG;AACA;AACG;;AAEH;AACA;AACA;;;AAGG;AACA;AACH;;AAGG;AACA;AAAgB;AAChB;AACH;;AAGG;;AAEG;;AAEH;AACH;;AAGG;;AAEH;;;AAKM;;;AAEA;;AAEN;;;AAIM;;AAEN;;AAGG;AACG;AACH;;;AAIA;AACA;AACA;;AAEN;;"}
@@ -7,7 +7,7 @@ import '../css/getValue.mjs';
7
7
  import 'oncss';
8
8
  import ThemeProvider from '../theme/ThemeProvider.mjs';
9
9
  import 'react-state-bucket';
10
- import { useAppRootElement } from '../AppRoot/context.mjs';
10
+ import { useAppRootElement } from '../AppRoot/AppRootProvider.mjs';
11
11
 
12
12
  function usePortal(children, options) {
13
13
  options = options || {};
@@ -1 +1 @@
1
- {"version":3,"file":"usePortal.mjs","sources":["../../src/hooks/usePortal.tsx"],"sourcesContent":["\"use client\";\r\nimport React, { useEffect, useMemo } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { ThemeProvider, useTheme } from \"../theme\";\r\nimport { useAppRootElement } from \"../AppRoot/context\";\r\n\r\nexport type UsePortalOptions = {\r\n container?: HTMLElement;\r\n autoMount?: boolean;\r\n}\r\n\r\nfunction usePortal(children: React.ReactNode, options?: UsePortalOptions) {\r\n options = options || {};\r\n if (options.autoMount === undefined) {\r\n options.autoMount = true;\r\n }\r\n const [mounted, setMounted] = React.useState(options.autoMount);\r\n const theme = useTheme();\r\n const appRoot = useAppRootElement();\r\n const { el, root } = useMemo(() => {\r\n const el = document.createElement(\"div\");\r\n const root = createRoot(el);\r\n return { el, root };\r\n }, [options.autoMount]);\r\n\r\n const container = () => {\r\n const container = options?.container || appRoot\r\n if (!container) throw new Error(`Container not found for portal. Please ensure that AppRoot is present in the application tree.`);\r\n return container;\r\n }\r\n\r\n const mount = () => {\r\n const cont = container();\r\n if (!cont.contains(el)) {\r\n cont.appendChild(el);\r\n }\r\n root.render(<ThemeProvider theme={theme.name}>{children}</ThemeProvider>)\r\n }\r\n\r\n const unmount = () => {\r\n root.render(null)\r\n el.remove();\r\n }\r\n\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n } else {\r\n unmount()\r\n }\r\n }, [mounted]);\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n }\r\n }, [children]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n unmount()\r\n };\r\n }, []);\r\n\r\n return {\r\n isMount: () => mounted,\r\n mount: () => setMounted(true),\r\n unmount: () => setMounted(false)\r\n }\r\n}\r\n\r\n\r\nexport default usePortal;"],"names":[],"mappings":";;;;;;;;;;;AAWA;AACG;AACA;AACG;;AAEH;AACA;AACA;;;AAGG;AACA;AACH;;AAGG;AACA;AAAgB;AAChB;AACH;;AAGG;;AAEG;;AAEH;AACH;;AAGG;;AAEH;;;AAKM;;;AAEA;;AAEN;;;AAIM;;AAEN;;AAGG;AACG;AACH;;;AAIA;AACA;AACA;;AAEN;;"}
1
+ {"version":3,"file":"usePortal.mjs","sources":["../../src/hooks/usePortal.tsx"],"sourcesContent":["\"use client\";\r\nimport React, { useEffect, useMemo } from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\nimport { ThemeProvider, useTheme } from \"../theme\";\r\nimport { useAppRootElement } from \"../AppRoot/AppRootProvider\";\r\n\r\nexport type UsePortalOptions = {\r\n container?: HTMLElement;\r\n autoMount?: boolean;\r\n}\r\n\r\nfunction usePortal(children: React.ReactNode, options?: UsePortalOptions) {\r\n options = options || {};\r\n if (options.autoMount === undefined) {\r\n options.autoMount = true;\r\n }\r\n const [mounted, setMounted] = React.useState(options.autoMount);\r\n const theme = useTheme();\r\n const appRoot = useAppRootElement();\r\n const { el, root } = useMemo(() => {\r\n const el = document.createElement(\"div\");\r\n const root = createRoot(el);\r\n return { el, root };\r\n }, [options.autoMount]);\r\n\r\n const container = () => {\r\n const container = options?.container || appRoot\r\n if (!container) throw new Error(`Container not found for portal. Please ensure that AppRoot is present in the application tree.`);\r\n return container;\r\n }\r\n\r\n const mount = () => {\r\n const cont = container();\r\n if (!cont.contains(el)) {\r\n cont.appendChild(el);\r\n }\r\n root.render(<ThemeProvider theme={theme.name}>{children}</ThemeProvider>)\r\n }\r\n\r\n const unmount = () => {\r\n root.render(null)\r\n el.remove();\r\n }\r\n\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n } else {\r\n unmount()\r\n }\r\n }, [mounted]);\r\n\r\n useEffect(() => {\r\n if (mounted) {\r\n mount()\r\n }\r\n }, [children]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n unmount()\r\n };\r\n }, []);\r\n\r\n return {\r\n isMount: () => mounted,\r\n mount: () => setMounted(true),\r\n unmount: () => setMounted(false)\r\n }\r\n}\r\n\r\n\r\nexport default usePortal;"],"names":[],"mappings":";;;;;;;;;;;AAWA;AACG;AACA;AACG;;AAEH;AACA;AACA;;;AAGG;AACA;AACH;;AAGG;AACA;AAAgB;AAChB;AACH;;AAGG;;AAEG;;AAEH;AACH;;AAGG;;AAEH;;;AAKM;;;AAEA;;AAEN;;;AAIM;;AAEN;;AAGG;AACG;AACH;;;AAIA;AACA;AACA;;AAEN;;"}
@@ -8,9 +8,10 @@ var index$1 = require('../../css/index.js');
8
8
  var oncss = require('oncss');
9
9
  var variants = require('./variants.js');
10
10
  var index = require('../../Document/index.js');
11
+ var CSSCacheProvider = require('../../css/CSSCacheProvider.js');
11
12
 
12
- const style = (obj = {}, doc) => {
13
- return index$1.css(obj, { selector: "#", container: doc }).classname;
13
+ const style = (obj = {}, doc, cacheId) => {
14
+ return index$1.css(obj, { selector: "#", container: doc, cacheId }).classname;
14
15
  };
15
16
  const getVariant = (rect, variant) => {
16
17
  let fn = typeof variant === 'string' ? variants[variant] : variant;
@@ -22,11 +23,12 @@ const useTransition = (_a) => {
22
23
  var { open } = _a, props = tslib.__rest(_a, ["open"]);
23
24
  let { disableInitialTransition = false, variant = "fade", duration = 400, delay, ease, easing, exitOnUnmount = false, onOpen, onOpened, onClose, onClosed, onState } = props;
24
25
  const doc = index.useDocument();
26
+ const cacheId = CSSCacheProvider.useCSSCacheId();
25
27
  let _ease = ease || useAnimation.animationEases[easing] || useAnimation.animationEases.bounce;
26
28
  const id = "xui-transition-" + React.useId();
27
29
  const [state, setState] = React.useState({
28
30
  initial: false,
29
- classname: style({ visibility: "hidden" }, doc),
31
+ classname: style({ visibility: "hidden" }, doc, cacheId),
30
32
  variant: variant,
31
33
  rect: null,
32
34
  stage: open ? "open" : "closed",
@@ -40,7 +42,7 @@ const useTransition = (_a) => {
40
42
  setState(s => (Object.assign(Object.assign({}, s), { initial: false, classname: "", unmounted: true, variant: variant })));
41
43
  }
42
44
  else {
43
- setState(s => (Object.assign(Object.assign({}, s), { variant: variant, classname: style({ visibility: "hidden" }, doc), stage: "open" })));
45
+ setState(s => (Object.assign(Object.assign({}, s), { variant: variant, classname: style({ visibility: "hidden" }, doc, cacheId), stage: "open" })));
44
46
  }
45
47
  }
46
48
  }, [open, state.stage, exitOnUnmount, variant]);
@@ -54,7 +56,7 @@ const useTransition = (_a) => {
54
56
  const rect = getBoundary();
55
57
  let { from } = getVariant(rect, state.variant);
56
58
  if (open && !state.initial) {
57
- setState(s => (Object.assign(Object.assign({}, s), { classname: (!disableInitialTransition || state.unmounted) ? style(from, doc) : "", initial: true, rect: rect })));
59
+ setState(s => (Object.assign(Object.assign({}, s), { classname: (!disableInitialTransition || state.unmounted) ? style(from, doc, cacheId) : "", initial: true, rect: rect })));
58
60
  let stimer = null;
59
61
  let etimer = null;
60
62
  ele.ontransitionstart = () => {
@@ -79,7 +81,7 @@ const useTransition = (_a) => {
79
81
  };
80
82
  }
81
83
  else if (!state.initial) {
82
- setState(s => (Object.assign(Object.assign({}, s), { classname: style(from, doc), rect: rect })));
84
+ setState(s => (Object.assign(Object.assign({}, s), { classname: style(from, doc, cacheId), rect: rect })));
83
85
  }
84
86
  }, [open, state.initial, state.stage, exitOnUnmount]);
85
87
  React.useEffect(() => {
@@ -89,7 +91,7 @@ const useTransition = (_a) => {
89
91
  let _css = open ? to : from;
90
92
  let trans = ` ${duration}ms ${_ease} ${delay || 0}ms`;
91
93
  let _ = Object.assign(Object.assign({}, _css), { transition: Object.keys(_css || {}).map(k => oncss.formatCSSProp(k)).join(trans + ", ") + trans });
92
- setState(s => (Object.assign(Object.assign({}, s), { classname: style(_, doc), variant: _variant })));
94
+ setState(s => (Object.assign(Object.assign({}, s), { classname: style(_, doc, cacheId), variant: _variant })));
93
95
  }
94
96
  }, [open, state.initial, variant]);
95
97
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/hooks/useTransition/index.ts"],"sourcesContent":["\"use client\";\r\nimport { useState, useEffect, useId } from 'react';\r\nimport { animationEases } from '../useAnimation';\r\nimport { css } from '../../css';\r\nimport { formatCSSProp } from 'oncss';\r\nimport { CSSProps } from '../../css/types';\r\nimport * as variants from './variants'\r\nimport { useDocument } from '../../Document';\r\n\r\nexport type UseTransitionVariantTypes = keyof typeof variants\r\nexport type UseTransitionState = \"open\" | \"opened\" | \"close\" | \"closed\"\r\n\r\nexport type UseTransitionVariant = (rect: DOMRect) => ({ from: CSSProps, to: CSSProps })\r\n\r\nexport type UseTransitionProps = {\r\n open: boolean;\r\n variant: UseTransitionVariant | UseTransitionVariantTypes;\r\n ease?: string;\r\n easing?: keyof typeof animationEases;\r\n duration?: number;\r\n delay?: number;\r\n disableInitialTransition?: boolean;\r\n exitOnUnmount?: boolean;\r\n onOpen?: () => void;\r\n onOpened?: () => void;\r\n onClose?: () => void;\r\n onClosed?: () => void;\r\n onState?: (state: UseTransitionState) => void;\r\n}\r\n\r\n\r\nconst style = (obj = {}, doc: Document) => {\r\n return css(obj, { selector: \"#\", container: doc }).classname;\r\n}\r\n\r\nconst getVariant = (rect: DOMRect | null, variant: UseTransitionProps['variant']) => {\r\n let fn = typeof variant === 'string' ? variants[variant] : variant\r\n if (!fn) throw new Error(`Transition variant \"${variant}\" not found.`)\r\n return fn(rect as DOMRect);\r\n}\r\n\r\nconst useTransition = ({ open, ...props }: UseTransitionProps) => {\r\n let {\r\n disableInitialTransition = false,\r\n variant = \"fade\",\r\n duration = 400,\r\n delay,\r\n ease,\r\n easing,\r\n exitOnUnmount = false,\r\n onOpen,\r\n onOpened,\r\n onClose,\r\n onClosed,\r\n onState\r\n } = props\r\n const doc = useDocument();\r\n let _ease = ease || (animationEases as any)[easing as any] || animationEases.bounce\r\n const id = \"xui-transition-\" + useId()\r\n const [state, setState] = useState({\r\n initial: false,\r\n classname: style({ visibility: \"hidden\" }, doc),\r\n variant: variant,\r\n rect: null as DOMRect | null,\r\n stage: open ? \"open\" : \"closed\",\r\n unmounted: false,\r\n })\r\n\r\n const getEle = () => doc.querySelector(`[data-transition=\"${id}\"]`) as HTMLElement;\r\n const getBoundary = () => state.rect || getEle()?.getBoundingClientRect() || new DOMRect(0, 0, 0, 0);\r\n\r\n useEffect(() => {\r\n if (exitOnUnmount && state.stage === 'closed') {\r\n if (!open) {\r\n setState(s => ({\r\n ...s,\r\n initial: false,\r\n classname: \"\",\r\n unmounted: true,\r\n variant: variant,\r\n }))\r\n } else {\r\n setState(s => ({\r\n ...s,\r\n variant: variant,\r\n classname: style({ visibility: \"hidden\" }, doc),\r\n stage: \"open\",\r\n }))\r\n }\r\n }\r\n }, [open, state.stage, exitOnUnmount, variant])\r\n\r\n // initial effect\r\n useEffect(() => {\r\n const ele = getEle()\r\n if (!ele) return\r\n if (exitOnUnmount && state.stage === 'closed') return\r\n\r\n const rect = getBoundary();\r\n let { from } = getVariant(rect, state.variant)\r\n if (open && !state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: (!disableInitialTransition || state.unmounted) ? style(from, doc) : \"\",\r\n initial: true,\r\n rect: rect,\r\n }))\r\n let stimer: any = null\r\n let etimer: any = null\r\n ele.ontransitionstart = () => {\r\n clearTimeout(stimer)\r\n stimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpen && isOpen) && onOpen();\r\n (onClose && !isOpen) && onClose()\r\n onState && onState(isOpen ? \"open\" : \"close\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"open\" : \"close\"\r\n }))\r\n }, 1)\r\n }\r\n\r\n ele.ontransitionend = () => {\r\n clearTimeout(etimer)\r\n etimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpened && isOpen) && onOpened();\r\n (onClosed && !isOpen) && onClosed();\r\n onState && onState(isOpen ? \"opened\" : \"closed\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"opened\" : \"closed\"\r\n }))\r\n }, 1)\r\n }\r\n } else if (!state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: style(from, doc),\r\n rect: rect,\r\n }))\r\n }\r\n }, [open, state.initial, state.stage, exitOnUnmount])\r\n\r\n\r\n useEffect(() => {\r\n if (state.initial) {\r\n let _variant = state.variant !== variant ? variant : state.variant\r\n const { from, to } = getVariant(state.rect, _variant)\r\n let _css: CSSProps = open ? to : from\r\n let trans = ` ${duration}ms ${_ease} ${delay || 0}ms`\r\n let _ = {\r\n ..._css,\r\n transition: Object.keys(_css || {}).map(k => formatCSSProp(k)).join(trans + \", \") + trans,\r\n }\r\n setState(s => ({\r\n ...s,\r\n classname: style(_, doc),\r\n variant: _variant\r\n }))\r\n }\r\n }, [open, state.initial, variant])\r\n\r\n return {\r\n exited: exitOnUnmount && state.stage === 'closed',\r\n props: {\r\n 'id': state.classname,\r\n 'data-transition': id,\r\n 'data-transition-state': open ? 'open' : 'close',\r\n }\r\n }\r\n}\r\n\r\n\r\nexport default useTransition"],"names":[],"mappings":";;;;;;;;;;;AA+BA;AACG;AACH;AAEA;AACG;AACA;AAAS;AACT;AACH;AAEA;AAAuB;AACpB;AAcA;AACA;AACA;AACA;AACG;;AAEA;AACA;;AAEA;AACF;AAED;AACA;;;;;;;AAaS;;;AAQT;;;AAIG;AACA;;AACA;;AAEA;AACA;AACA;AACG;;;AAQA;;AAEG;;AAEG;;AAEA;;;AAMN;AAEA;;AAEG;;AAEG;;AAEA;;;AAMN;;AACI;;;AAOV;;AAIG;AACG;AACA;;;AAGA;;;;;AAaH;AACA;;AAEG;;AAEF;;AAEP;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/hooks/useTransition/index.ts"],"sourcesContent":["\"use client\";\r\nimport { useState, useEffect, useId } from 'react';\r\nimport { animationEases } from '../useAnimation';\r\nimport { css } from '../../css';\r\nimport { formatCSSProp } from 'oncss';\r\nimport { CSSProps } from '../../css/types';\r\nimport * as variants from './variants'\r\nimport { useDocument } from '../../Document';\r\nimport { useCSSCacheId } from '../../css/CSSCacheProvider';\r\n\r\nexport type UseTransitionVariantTypes = keyof typeof variants\r\nexport type UseTransitionState = \"open\" | \"opened\" | \"close\" | \"closed\"\r\n\r\nexport type UseTransitionVariant = (rect: DOMRect) => ({ from: CSSProps, to: CSSProps })\r\n\r\nexport type UseTransitionProps = {\r\n open: boolean;\r\n variant: UseTransitionVariant | UseTransitionVariantTypes;\r\n ease?: string;\r\n easing?: keyof typeof animationEases;\r\n duration?: number;\r\n delay?: number;\r\n disableInitialTransition?: boolean;\r\n exitOnUnmount?: boolean;\r\n onOpen?: () => void;\r\n onOpened?: () => void;\r\n onClose?: () => void;\r\n onClosed?: () => void;\r\n onState?: (state: UseTransitionState) => void;\r\n}\r\n\r\n\r\nconst style = (obj = {}, doc: Document, cacheId: string) => {\r\n return css(obj, { selector: \"#\", container: doc, cacheId }).classname;\r\n}\r\n\r\nconst getVariant = (rect: DOMRect | null, variant: UseTransitionProps['variant']) => {\r\n let fn = typeof variant === 'string' ? variants[variant] : variant\r\n if (!fn) throw new Error(`Transition variant \"${variant}\" not found.`)\r\n return fn(rect as DOMRect);\r\n}\r\n\r\nconst useTransition = ({ open, ...props }: UseTransitionProps) => {\r\n let {\r\n disableInitialTransition = false,\r\n variant = \"fade\",\r\n duration = 400,\r\n delay,\r\n ease,\r\n easing,\r\n exitOnUnmount = false,\r\n onOpen,\r\n onOpened,\r\n onClose,\r\n onClosed,\r\n onState\r\n } = props\r\n const doc = useDocument();\r\n const cacheId = useCSSCacheId()\r\n let _ease = ease || (animationEases as any)[easing as any] || animationEases.bounce\r\n const id = \"xui-transition-\" + useId()\r\n const [state, setState] = useState({\r\n initial: false,\r\n classname: style({ visibility: \"hidden\" }, doc, cacheId),\r\n variant: variant,\r\n rect: null as DOMRect | null,\r\n stage: open ? \"open\" : \"closed\",\r\n unmounted: false,\r\n })\r\n\r\n const getEle = () => doc.querySelector(`[data-transition=\"${id}\"]`) as HTMLElement;\r\n const getBoundary = () => state.rect || getEle()?.getBoundingClientRect() || new DOMRect(0, 0, 0, 0);\r\n\r\n useEffect(() => {\r\n if (exitOnUnmount && state.stage === 'closed') {\r\n if (!open) {\r\n setState(s => ({\r\n ...s,\r\n initial: false,\r\n classname: \"\",\r\n unmounted: true,\r\n variant: variant,\r\n }))\r\n } else {\r\n setState(s => ({\r\n ...s,\r\n variant: variant,\r\n classname: style({ visibility: \"hidden\" }, doc, cacheId),\r\n stage: \"open\",\r\n }))\r\n }\r\n }\r\n }, [open, state.stage, exitOnUnmount, variant])\r\n\r\n // initial effect\r\n useEffect(() => {\r\n const ele = getEle()\r\n if (!ele) return\r\n if (exitOnUnmount && state.stage === 'closed') return\r\n\r\n const rect = getBoundary();\r\n let { from } = getVariant(rect, state.variant)\r\n if (open && !state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: (!disableInitialTransition || state.unmounted) ? style(from, doc, cacheId) : \"\",\r\n initial: true,\r\n rect: rect,\r\n }))\r\n let stimer: any = null\r\n let etimer: any = null\r\n ele.ontransitionstart = () => {\r\n clearTimeout(stimer)\r\n stimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpen && isOpen) && onOpen();\r\n (onClose && !isOpen) && onClose()\r\n onState && onState(isOpen ? \"open\" : \"close\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"open\" : \"close\"\r\n }))\r\n }, 1)\r\n }\r\n\r\n ele.ontransitionend = () => {\r\n clearTimeout(etimer)\r\n etimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpened && isOpen) && onOpened();\r\n (onClosed && !isOpen) && onClosed();\r\n onState && onState(isOpen ? \"opened\" : \"closed\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"opened\" : \"closed\"\r\n }))\r\n }, 1)\r\n }\r\n } else if (!state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: style(from, doc, cacheId),\r\n rect: rect,\r\n }))\r\n }\r\n }, [open, state.initial, state.stage, exitOnUnmount])\r\n\r\n\r\n useEffect(() => {\r\n if (state.initial) {\r\n let _variant = state.variant !== variant ? variant : state.variant\r\n const { from, to } = getVariant(state.rect, _variant)\r\n let _css: CSSProps = open ? to : from\r\n let trans = ` ${duration}ms ${_ease} ${delay || 0}ms`\r\n let _ = {\r\n ..._css,\r\n transition: Object.keys(_css || {}).map(k => formatCSSProp(k)).join(trans + \", \") + trans,\r\n }\r\n setState(s => ({\r\n ...s,\r\n classname: style(_, doc, cacheId),\r\n variant: _variant\r\n }))\r\n }\r\n }, [open, state.initial, variant])\r\n\r\n return {\r\n exited: exitOnUnmount && state.stage === 'closed',\r\n props: {\r\n 'id': state.classname,\r\n 'data-transition': id,\r\n 'data-transition-state': open ? 'open' : 'close',\r\n }\r\n }\r\n}\r\n\r\n\r\nexport default useTransition"],"names":[],"mappings":";;;;;;;;;;;;AAgCA;AACG;AACH;AAEA;AACG;AACA;AAAS;AACT;AACH;AAEA;AAAuB;AACpB;AAcA;AACA;AACA;AACA;AACA;AACG;AACA;AACA;AACA;;AAEA;AACF;AAED;AACA;;;;;;;AAaS;;;AAQT;;;AAIG;AACA;;AACA;;AAEA;AACA;AACA;AACG;;;AAQA;;AAEG;;AAEG;;AAEA;;;AAMN;AAEA;;AAEG;;AAEG;;AAEA;;;AAMN;;AACI;;;AAOV;;AAIG;AACG;AACA;;;AAGA;;;;;AAaH;AACA;;AAEG;;AAEF;;AAEP;;"}
@@ -6,9 +6,10 @@ import { css } from '../../css/index.mjs';
6
6
  import { formatCSSProp } from 'oncss';
7
7
  import * as variants from './variants.mjs';
8
8
  import { useDocument } from '../../Document/index.mjs';
9
+ import { useCSSCacheId } from '../../css/CSSCacheProvider.mjs';
9
10
 
10
- const style = (obj = {}, doc) => {
11
- return css(obj, { selector: "#", container: doc }).classname;
11
+ const style = (obj = {}, doc, cacheId) => {
12
+ return css(obj, { selector: "#", container: doc, cacheId }).classname;
12
13
  };
13
14
  const getVariant = (rect, variant) => {
14
15
  let fn = typeof variant === 'string' ? variants[variant] : variant;
@@ -20,11 +21,12 @@ const useTransition = (_a) => {
20
21
  var { open } = _a, props = __rest(_a, ["open"]);
21
22
  let { disableInitialTransition = false, variant = "fade", duration = 400, delay, ease, easing, exitOnUnmount = false, onOpen, onOpened, onClose, onClosed, onState } = props;
22
23
  const doc = useDocument();
24
+ const cacheId = useCSSCacheId();
23
25
  let _ease = ease || animationEases[easing] || animationEases.bounce;
24
26
  const id = "xui-transition-" + useId();
25
27
  const [state, setState] = useState({
26
28
  initial: false,
27
- classname: style({ visibility: "hidden" }, doc),
29
+ classname: style({ visibility: "hidden" }, doc, cacheId),
28
30
  variant: variant,
29
31
  rect: null,
30
32
  stage: open ? "open" : "closed",
@@ -38,7 +40,7 @@ const useTransition = (_a) => {
38
40
  setState(s => (Object.assign(Object.assign({}, s), { initial: false, classname: "", unmounted: true, variant: variant })));
39
41
  }
40
42
  else {
41
- setState(s => (Object.assign(Object.assign({}, s), { variant: variant, classname: style({ visibility: "hidden" }, doc), stage: "open" })));
43
+ setState(s => (Object.assign(Object.assign({}, s), { variant: variant, classname: style({ visibility: "hidden" }, doc, cacheId), stage: "open" })));
42
44
  }
43
45
  }
44
46
  }, [open, state.stage, exitOnUnmount, variant]);
@@ -52,7 +54,7 @@ const useTransition = (_a) => {
52
54
  const rect = getBoundary();
53
55
  let { from } = getVariant(rect, state.variant);
54
56
  if (open && !state.initial) {
55
- setState(s => (Object.assign(Object.assign({}, s), { classname: (!disableInitialTransition || state.unmounted) ? style(from, doc) : "", initial: true, rect: rect })));
57
+ setState(s => (Object.assign(Object.assign({}, s), { classname: (!disableInitialTransition || state.unmounted) ? style(from, doc, cacheId) : "", initial: true, rect: rect })));
56
58
  let stimer = null;
57
59
  let etimer = null;
58
60
  ele.ontransitionstart = () => {
@@ -77,7 +79,7 @@ const useTransition = (_a) => {
77
79
  };
78
80
  }
79
81
  else if (!state.initial) {
80
- setState(s => (Object.assign(Object.assign({}, s), { classname: style(from, doc), rect: rect })));
82
+ setState(s => (Object.assign(Object.assign({}, s), { classname: style(from, doc, cacheId), rect: rect })));
81
83
  }
82
84
  }, [open, state.initial, state.stage, exitOnUnmount]);
83
85
  useEffect(() => {
@@ -87,7 +89,7 @@ const useTransition = (_a) => {
87
89
  let _css = open ? to : from;
88
90
  let trans = ` ${duration}ms ${_ease} ${delay || 0}ms`;
89
91
  let _ = Object.assign(Object.assign({}, _css), { transition: Object.keys(_css || {}).map(k => formatCSSProp(k)).join(trans + ", ") + trans });
90
- setState(s => (Object.assign(Object.assign({}, s), { classname: style(_, doc), variant: _variant })));
92
+ setState(s => (Object.assign(Object.assign({}, s), { classname: style(_, doc, cacheId), variant: _variant })));
91
93
  }
92
94
  }, [open, state.initial, variant]);
93
95
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/hooks/useTransition/index.ts"],"sourcesContent":["\"use client\";\r\nimport { useState, useEffect, useId } from 'react';\r\nimport { animationEases } from '../useAnimation';\r\nimport { css } from '../../css';\r\nimport { formatCSSProp } from 'oncss';\r\nimport { CSSProps } from '../../css/types';\r\nimport * as variants from './variants'\r\nimport { useDocument } from '../../Document';\r\n\r\nexport type UseTransitionVariantTypes = keyof typeof variants\r\nexport type UseTransitionState = \"open\" | \"opened\" | \"close\" | \"closed\"\r\n\r\nexport type UseTransitionVariant = (rect: DOMRect) => ({ from: CSSProps, to: CSSProps })\r\n\r\nexport type UseTransitionProps = {\r\n open: boolean;\r\n variant: UseTransitionVariant | UseTransitionVariantTypes;\r\n ease?: string;\r\n easing?: keyof typeof animationEases;\r\n duration?: number;\r\n delay?: number;\r\n disableInitialTransition?: boolean;\r\n exitOnUnmount?: boolean;\r\n onOpen?: () => void;\r\n onOpened?: () => void;\r\n onClose?: () => void;\r\n onClosed?: () => void;\r\n onState?: (state: UseTransitionState) => void;\r\n}\r\n\r\n\r\nconst style = (obj = {}, doc: Document) => {\r\n return css(obj, { selector: \"#\", container: doc }).classname;\r\n}\r\n\r\nconst getVariant = (rect: DOMRect | null, variant: UseTransitionProps['variant']) => {\r\n let fn = typeof variant === 'string' ? variants[variant] : variant\r\n if (!fn) throw new Error(`Transition variant \"${variant}\" not found.`)\r\n return fn(rect as DOMRect);\r\n}\r\n\r\nconst useTransition = ({ open, ...props }: UseTransitionProps) => {\r\n let {\r\n disableInitialTransition = false,\r\n variant = \"fade\",\r\n duration = 400,\r\n delay,\r\n ease,\r\n easing,\r\n exitOnUnmount = false,\r\n onOpen,\r\n onOpened,\r\n onClose,\r\n onClosed,\r\n onState\r\n } = props\r\n const doc = useDocument();\r\n let _ease = ease || (animationEases as any)[easing as any] || animationEases.bounce\r\n const id = \"xui-transition-\" + useId()\r\n const [state, setState] = useState({\r\n initial: false,\r\n classname: style({ visibility: \"hidden\" }, doc),\r\n variant: variant,\r\n rect: null as DOMRect | null,\r\n stage: open ? \"open\" : \"closed\",\r\n unmounted: false,\r\n })\r\n\r\n const getEle = () => doc.querySelector(`[data-transition=\"${id}\"]`) as HTMLElement;\r\n const getBoundary = () => state.rect || getEle()?.getBoundingClientRect() || new DOMRect(0, 0, 0, 0);\r\n\r\n useEffect(() => {\r\n if (exitOnUnmount && state.stage === 'closed') {\r\n if (!open) {\r\n setState(s => ({\r\n ...s,\r\n initial: false,\r\n classname: \"\",\r\n unmounted: true,\r\n variant: variant,\r\n }))\r\n } else {\r\n setState(s => ({\r\n ...s,\r\n variant: variant,\r\n classname: style({ visibility: \"hidden\" }, doc),\r\n stage: \"open\",\r\n }))\r\n }\r\n }\r\n }, [open, state.stage, exitOnUnmount, variant])\r\n\r\n // initial effect\r\n useEffect(() => {\r\n const ele = getEle()\r\n if (!ele) return\r\n if (exitOnUnmount && state.stage === 'closed') return\r\n\r\n const rect = getBoundary();\r\n let { from } = getVariant(rect, state.variant)\r\n if (open && !state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: (!disableInitialTransition || state.unmounted) ? style(from, doc) : \"\",\r\n initial: true,\r\n rect: rect,\r\n }))\r\n let stimer: any = null\r\n let etimer: any = null\r\n ele.ontransitionstart = () => {\r\n clearTimeout(stimer)\r\n stimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpen && isOpen) && onOpen();\r\n (onClose && !isOpen) && onClose()\r\n onState && onState(isOpen ? \"open\" : \"close\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"open\" : \"close\"\r\n }))\r\n }, 1)\r\n }\r\n\r\n ele.ontransitionend = () => {\r\n clearTimeout(etimer)\r\n etimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpened && isOpen) && onOpened();\r\n (onClosed && !isOpen) && onClosed();\r\n onState && onState(isOpen ? \"opened\" : \"closed\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"opened\" : \"closed\"\r\n }))\r\n }, 1)\r\n }\r\n } else if (!state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: style(from, doc),\r\n rect: rect,\r\n }))\r\n }\r\n }, [open, state.initial, state.stage, exitOnUnmount])\r\n\r\n\r\n useEffect(() => {\r\n if (state.initial) {\r\n let _variant = state.variant !== variant ? variant : state.variant\r\n const { from, to } = getVariant(state.rect, _variant)\r\n let _css: CSSProps = open ? to : from\r\n let trans = ` ${duration}ms ${_ease} ${delay || 0}ms`\r\n let _ = {\r\n ..._css,\r\n transition: Object.keys(_css || {}).map(k => formatCSSProp(k)).join(trans + \", \") + trans,\r\n }\r\n setState(s => ({\r\n ...s,\r\n classname: style(_, doc),\r\n variant: _variant\r\n }))\r\n }\r\n }, [open, state.initial, variant])\r\n\r\n return {\r\n exited: exitOnUnmount && state.stage === 'closed',\r\n props: {\r\n 'id': state.classname,\r\n 'data-transition': id,\r\n 'data-transition-state': open ? 'open' : 'close',\r\n }\r\n }\r\n}\r\n\r\n\r\nexport default useTransition"],"names":[],"mappings":";;;;;;;;;AA+BA;AACG;AACH;AAEA;AACG;AACA;AAAS;AACT;AACH;AAEA;AAAuB;AACpB;AAcA;AACA;AACA;AACA;AACG;;AAEA;AACA;;AAEA;AACF;AAED;AACA;;;;;;;AAaS;;;AAQT;;;AAIG;AACA;;AACA;;AAEA;AACA;AACA;AACG;;;AAQA;;AAEG;;AAEG;;AAEA;;;AAMN;AAEA;;AAEG;;AAEG;;AAEA;;;AAMN;;AACI;;;AAOV;;AAIG;AACG;AACA;;;AAGA;;;;;AAaH;AACA;;AAEG;;AAEF;;AAEP;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/hooks/useTransition/index.ts"],"sourcesContent":["\"use client\";\r\nimport { useState, useEffect, useId } from 'react';\r\nimport { animationEases } from '../useAnimation';\r\nimport { css } from '../../css';\r\nimport { formatCSSProp } from 'oncss';\r\nimport { CSSProps } from '../../css/types';\r\nimport * as variants from './variants'\r\nimport { useDocument } from '../../Document';\r\nimport { useCSSCacheId } from '../../css/CSSCacheProvider';\r\n\r\nexport type UseTransitionVariantTypes = keyof typeof variants\r\nexport type UseTransitionState = \"open\" | \"opened\" | \"close\" | \"closed\"\r\n\r\nexport type UseTransitionVariant = (rect: DOMRect) => ({ from: CSSProps, to: CSSProps })\r\n\r\nexport type UseTransitionProps = {\r\n open: boolean;\r\n variant: UseTransitionVariant | UseTransitionVariantTypes;\r\n ease?: string;\r\n easing?: keyof typeof animationEases;\r\n duration?: number;\r\n delay?: number;\r\n disableInitialTransition?: boolean;\r\n exitOnUnmount?: boolean;\r\n onOpen?: () => void;\r\n onOpened?: () => void;\r\n onClose?: () => void;\r\n onClosed?: () => void;\r\n onState?: (state: UseTransitionState) => void;\r\n}\r\n\r\n\r\nconst style = (obj = {}, doc: Document, cacheId: string) => {\r\n return css(obj, { selector: \"#\", container: doc, cacheId }).classname;\r\n}\r\n\r\nconst getVariant = (rect: DOMRect | null, variant: UseTransitionProps['variant']) => {\r\n let fn = typeof variant === 'string' ? variants[variant] : variant\r\n if (!fn) throw new Error(`Transition variant \"${variant}\" not found.`)\r\n return fn(rect as DOMRect);\r\n}\r\n\r\nconst useTransition = ({ open, ...props }: UseTransitionProps) => {\r\n let {\r\n disableInitialTransition = false,\r\n variant = \"fade\",\r\n duration = 400,\r\n delay,\r\n ease,\r\n easing,\r\n exitOnUnmount = false,\r\n onOpen,\r\n onOpened,\r\n onClose,\r\n onClosed,\r\n onState\r\n } = props\r\n const doc = useDocument();\r\n const cacheId = useCSSCacheId()\r\n let _ease = ease || (animationEases as any)[easing as any] || animationEases.bounce\r\n const id = \"xui-transition-\" + useId()\r\n const [state, setState] = useState({\r\n initial: false,\r\n classname: style({ visibility: \"hidden\" }, doc, cacheId),\r\n variant: variant,\r\n rect: null as DOMRect | null,\r\n stage: open ? \"open\" : \"closed\",\r\n unmounted: false,\r\n })\r\n\r\n const getEle = () => doc.querySelector(`[data-transition=\"${id}\"]`) as HTMLElement;\r\n const getBoundary = () => state.rect || getEle()?.getBoundingClientRect() || new DOMRect(0, 0, 0, 0);\r\n\r\n useEffect(() => {\r\n if (exitOnUnmount && state.stage === 'closed') {\r\n if (!open) {\r\n setState(s => ({\r\n ...s,\r\n initial: false,\r\n classname: \"\",\r\n unmounted: true,\r\n variant: variant,\r\n }))\r\n } else {\r\n setState(s => ({\r\n ...s,\r\n variant: variant,\r\n classname: style({ visibility: \"hidden\" }, doc, cacheId),\r\n stage: \"open\",\r\n }))\r\n }\r\n }\r\n }, [open, state.stage, exitOnUnmount, variant])\r\n\r\n // initial effect\r\n useEffect(() => {\r\n const ele = getEle()\r\n if (!ele) return\r\n if (exitOnUnmount && state.stage === 'closed') return\r\n\r\n const rect = getBoundary();\r\n let { from } = getVariant(rect, state.variant)\r\n if (open && !state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: (!disableInitialTransition || state.unmounted) ? style(from, doc, cacheId) : \"\",\r\n initial: true,\r\n rect: rect,\r\n }))\r\n let stimer: any = null\r\n let etimer: any = null\r\n ele.ontransitionstart = () => {\r\n clearTimeout(stimer)\r\n stimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpen && isOpen) && onOpen();\r\n (onClose && !isOpen) && onClose()\r\n onState && onState(isOpen ? \"open\" : \"close\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"open\" : \"close\"\r\n }))\r\n }, 1)\r\n }\r\n\r\n ele.ontransitionend = () => {\r\n clearTimeout(etimer)\r\n etimer = setTimeout(() => {\r\n const isOpen = ele.getAttribute('data-transition-state') === 'open';\r\n (onOpened && isOpen) && onOpened();\r\n (onClosed && !isOpen) && onClosed();\r\n onState && onState(isOpen ? \"opened\" : \"closed\")\r\n setState(s => ({\r\n ...s,\r\n stage: isOpen ? \"opened\" : \"closed\"\r\n }))\r\n }, 1)\r\n }\r\n } else if (!state.initial) {\r\n setState(s => ({\r\n ...s,\r\n classname: style(from, doc, cacheId),\r\n rect: rect,\r\n }))\r\n }\r\n }, [open, state.initial, state.stage, exitOnUnmount])\r\n\r\n\r\n useEffect(() => {\r\n if (state.initial) {\r\n let _variant = state.variant !== variant ? variant : state.variant\r\n const { from, to } = getVariant(state.rect, _variant)\r\n let _css: CSSProps = open ? to : from\r\n let trans = ` ${duration}ms ${_ease} ${delay || 0}ms`\r\n let _ = {\r\n ..._css,\r\n transition: Object.keys(_css || {}).map(k => formatCSSProp(k)).join(trans + \", \") + trans,\r\n }\r\n setState(s => ({\r\n ...s,\r\n classname: style(_, doc, cacheId),\r\n variant: _variant\r\n }))\r\n }\r\n }, [open, state.initial, variant])\r\n\r\n return {\r\n exited: exitOnUnmount && state.stage === 'closed',\r\n props: {\r\n 'id': state.classname,\r\n 'data-transition': id,\r\n 'data-transition-state': open ? 'open' : 'close',\r\n }\r\n }\r\n}\r\n\r\n\r\nexport default useTransition"],"names":[],"mappings":";;;;;;;;;;AAgCA;AACG;AACH;AAEA;AACG;AACA;AAAS;AACT;AACH;AAEA;AAAuB;AACpB;AAcA;AACA;AACA;AACA;AACA;AACG;AACA;AACA;AACA;;AAEA;AACF;AAED;AACA;;;;;;;AAaS;;;AAQT;;;AAIG;AACA;;AACA;;AAEA;AACA;AACA;AACG;;;AAQA;;AAEG;;AAEG;;AAEA;;;AAMN;AAEA;;AAEG;;AAEG;;AAEA;;;AAMN;;AACI;;;AAOV;;AAIG;AACG;AACA;;;AAGA;;;;;AAaH;AACA;;AAEG;;AAEF;;AAEP;;"}
package/index.d.ts CHANGED
@@ -8,11 +8,12 @@ export { default as useInterface } from './hooks/useInterface.js';
8
8
  export { UseTransitionProps, UseTransitionState, UseTransitionVariant, UseTransitionVariantTypes, default as useTransition } from './hooks/useTransition/index.js';
9
9
  export { default as useMergeRefs } from './hooks/useMergeRefs.js';
10
10
  export { default as Transition, TransitionProps } from './Transition/index.js';
11
- export { APP_ROOT_CLASSNAME, default as AppRoot, AppRootProps } from './AppRoot/index.js';
11
+ export { default as AppRoot, AppRootProps } from './AppRoot/index.js';
12
12
  export { default as usePortal } from './hooks/usePortal.js';
13
13
  export { Renderar } from './AppRoot/Renderar.js';
14
14
  export { useDocument } from './Document/index.js';
15
- export { useAppRootElement } from './AppRoot/context.js';
15
+ export { useAppRootElement } from './AppRoot/AppRootProvider.js';
16
+ export { getCSSCache, useCSSCache, useCSSCacheId } from './css/CSSCacheProvider.js';
16
17
  export { default as Iframe, IframeProps } from './Iframe/index.js';
17
18
  export { adjustColor, adjustTextContrast, alpha, breakpoints, css } from './css/index.js';
18
19
  export { themeRootClass } from './theme/index.js';
package/index.js CHANGED
@@ -14,7 +14,8 @@ var index = require('./AppRoot/index.js');
14
14
  var usePortal = require('./hooks/usePortal.js');
15
15
  var Renderar = require('./AppRoot/Renderar.js');
16
16
  var index$3 = require('./Document/index.js');
17
- var context = require('./AppRoot/context.js');
17
+ var AppRootProvider = require('./AppRoot/AppRootProvider.js');
18
+ var CSSCacheProvider = require('./css/CSSCacheProvider.js');
18
19
  var index$1 = require('./Iframe/index.js');
19
20
  var index$6 = require('./css/index.js');
20
21
  var index$7 = require('./theme/index.js');
@@ -38,12 +39,14 @@ exports.useInterface = useInterface;
38
39
  exports.useTransition = index$5;
39
40
  exports.useMergeRefs = useMergeRefs;
40
41
  exports.Transition = index$4;
41
- exports.APP_ROOT_CLASSNAME = index.APP_ROOT_CLASSNAME;
42
- exports.AppRoot = index.default;
42
+ exports.AppRoot = index;
43
43
  exports.usePortal = usePortal;
44
44
  exports.Renderar = Renderar.Renderar;
45
45
  exports.useDocument = index$3.useDocument;
46
- exports.useAppRootElement = context.useAppRootElement;
46
+ exports.useAppRootElement = AppRootProvider.useAppRootElement;
47
+ exports.getCSSCache = CSSCacheProvider.getCSSCache;
48
+ exports.useCSSCache = CSSCacheProvider.useCSSCache;
49
+ exports.useCSSCacheId = CSSCacheProvider.useCSSCacheId;
47
50
  exports.Iframe = index$1;
48
51
  exports.adjustColor = index$6.adjustColor;
49
52
  exports.adjustTextContrast = index$6.adjustTextContrast;
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/index.mjs CHANGED
@@ -8,11 +8,12 @@ export { default as useInterface } from './hooks/useInterface.mjs';
8
8
  export { default as useTransition } from './hooks/useTransition/index.mjs';
9
9
  export { default as useMergeRefs } from './hooks/useMergeRefs.mjs';
10
10
  export { default as Transition } from './Transition/index.mjs';
11
- export { APP_ROOT_CLASSNAME, default as AppRoot } from './AppRoot/index.mjs';
11
+ export { default as AppRoot } from './AppRoot/index.mjs';
12
12
  export { default as usePortal } from './hooks/usePortal.mjs';
13
13
  export { Renderar } from './AppRoot/Renderar.mjs';
14
14
  export { useDocument } from './Document/index.mjs';
15
- export { useAppRootElement } from './AppRoot/context.mjs';
15
+ export { useAppRootElement } from './AppRoot/AppRootProvider.mjs';
16
+ export { getCSSCache, useCSSCache, useCSSCacheId } from './css/CSSCacheProvider.mjs';
16
17
  export { default as Iframe } from './Iframe/index.mjs';
17
18
  export { adjustColor, adjustTextContrast, alpha, breakpoints, css } from './css/index.mjs';
18
19
  export { themeRootClass } from './theme/index.mjs';
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xanui/core",
3
- "version": "1.2.42",
3
+ "version": "1.2.43",
4
4
  "description": "Xanui Core Library",
5
5
  "private": false,
6
6
  "main": "./index.js",
@@ -8,7 +8,7 @@
8
8
  "types": "./index.d.ts",
9
9
  "sideEffects": false,
10
10
  "dependencies": {
11
- "oncss": "^1.2.9",
11
+ "oncss": "^1.2.10",
12
12
  "pretty-class": "^1.0.8",
13
13
  "react-state-bucket": "^1.2.11"
14
14
  },
@@ -3,8 +3,10 @@ import { TagComponentType, TagProps } from '../Tag/types.js';
3
3
 
4
4
  type ThemeProviderProps<T extends TagComponentType = 'div'> = TagProps<T> & {
5
5
  theme: string;
6
+ isRoot?: boolean;
7
+ noScrollbarCss?: boolean;
6
8
  };
7
- declare const ThemeProvider: <T extends TagComponentType = "div">({ children, theme, ...props }: ThemeProviderProps<T>) => React.JSX.Element;
9
+ declare const ThemeProvider: <T extends TagComponentType = "div">({ children, theme, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => React.JSX.Element;
8
10
 
9
11
  export { ThemeProvider as default };
10
12
  export type { ThemeProviderProps };
@@ -4,13 +4,15 @@
4
4
  var tslib = require('tslib');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var React = require('react');
7
- var index$2 = require('../Tag/index.js');
7
+ var index$3 = require('../Tag/index.js');
8
8
  var core = require('./core.js');
9
9
  var ThemeCssVars = require('./ThemeCssVars.js');
10
10
  var index$1 = require('../css/index.js');
11
11
  var ThemeDefaultOptions = require('./ThemeDefaultOptions.js');
12
12
  var ServerStyleTag = require('../Tag/ServerStyleTag.js');
13
13
  var index = require('../Document/index.js');
14
+ var index$2 = require('./index.js');
15
+ var CSSCacheProvider = require('../css/CSSCacheProvider.js');
14
16
 
15
17
  function _interopNamespaceDefault(e) {
16
18
  var n = Object.create(null);
@@ -33,14 +35,15 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
33
35
 
34
36
  ThemeDefaultOptions.createDefaultThemes();
35
37
  const ThemeProvider = (_a) => {
36
- var { children, theme } = _a, props = tslib.__rest(_a, ["children", "theme"]);
38
+ var { children, theme, isRoot, noScrollbarCss } = _a, props = tslib.__rest(_a, ["children", "theme", "isRoot", "noScrollbarCss"]);
37
39
  let THEME = core.ThemeFactory.get(theme);
38
40
  if (!THEME) {
39
41
  console.error(`ThemeProvider: The theme '${theme}' is not defined. Please make sure to use a valid theme name.`);
40
42
  THEME = core.ThemeFactory.get("light");
41
43
  }
42
44
  const doc = index.useDocument();
43
- const globalStyle = React__namespace.useMemo(() => {
45
+ const cacheId = CSSCacheProvider.useCSSCacheId();
46
+ const themeGlobalStyle = React__namespace.useMemo(() => {
44
47
  const root_cls = `.xui-${theme}-theme-root`;
45
48
  let gkeys = Object.keys(THEME.globalStyle || {});
46
49
  let gstyles = {};
@@ -52,9 +55,95 @@ const ThemeProvider = (_a) => {
52
55
  }, {
53
56
  injectStyle: typeof window !== 'undefined',
54
57
  container: doc,
58
+ cacheId
55
59
  });
56
- }, [theme]);
57
- return (jsxRuntime.jsxs(core.ThemeContex.Provider, { value: theme, children: [jsxRuntime.jsx(ServerStyleTag, { factory: globalStyle }), jsxRuntime.jsx(index$2, Object.assign({ minHeight: "100%", bgcolor: "background.primary", color: "text.primary", fontSize: "text", fontWeight: "text", lineHeight: "text", fontFamily: `system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` }, props, { sxr: {
60
+ }, [theme, doc]);
61
+ const resetCss = React__namespace.useMemo(() => {
62
+ if (!isRoot)
63
+ return;
64
+ return index$1.css({
65
+ "@global": {
66
+ "*": {
67
+ m: 0,
68
+ p: 0,
69
+ outline: "none",
70
+ boxSizing: "border-box",
71
+ verticalAlign: "baseline",
72
+ },
73
+ "html, body": {
74
+ minHeight: "100%",
75
+ "-webkit-font-smoothing": "antialiased",
76
+ "-moz-osx-font-smoothing": "grayscale",
77
+ },
78
+ "img, picture, video, canvas, svg": {
79
+ maxWidth: "100%",
80
+ display: "block"
81
+ },
82
+ "input, button, textarea, select": {
83
+ font: "inherit"
84
+ },
85
+ "table": {
86
+ borderCollapse: "collapse",
87
+ borderSpacing: 0,
88
+ },
89
+ "ol, ul": {
90
+ listStyle: "none",
91
+ padding: 0,
92
+ margin: 0,
93
+ },
94
+ "a": {
95
+ display: "inline-block",
96
+ color: "inherit",
97
+ textDecoration: "none",
98
+ cursor: "pointer",
99
+ "&:hover": {
100
+ textDecoration: "underline"
101
+ }
102
+ },
103
+ "p, h1, h2, h3, h4, h5, h6": {
104
+ overflowWrap: "break-word",
105
+ },
106
+ }
107
+ }, {
108
+ injectStyle: typeof window !== 'undefined',
109
+ container: doc,
110
+ cacheId
111
+ });
112
+ }, []);
113
+ const scrollbarCss = React__namespace.useMemo(() => {
114
+ if (noScrollbarCss)
115
+ return;
116
+ const cls = (cls) => `${index$2.themeRootClass(theme)} ${cls}`;
117
+ let thumbSize = 6;
118
+ let thumbColor = "var(--color-text-secondary)";
119
+ let trackColor = "transparent";
120
+ return index$1.css({
121
+ "@global": {
122
+ [cls('*::-webkit-scrollbar')]: {
123
+ width: thumbSize,
124
+ height: thumbSize,
125
+ },
126
+ [cls("*::-webkit-scrollbar-thumb")]: {
127
+ backgroundColor: thumbColor,
128
+ borderRadius: "6px",
129
+ opacity: 0.6,
130
+ },
131
+ [cls("*::-webkit-scrollbar-thumb:hover")]: {
132
+ backgroundColor: thumbColor,
133
+ opacity: 0.0,
134
+ },
135
+ [cls("*::-webkit-scrollbar-track")]: {
136
+ backgroundColor: trackColor,
137
+ borderRadius: "6px",
138
+ },
139
+ }
140
+ }, {
141
+ injectStyle: typeof window !== 'undefined',
142
+ container: doc,
143
+ cacheId
144
+ });
145
+ }, [noScrollbarCss, theme]);
146
+ return (jsxRuntime.jsxs(core.ThemeContex.Provider, { value: theme, children: [isRoot && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ServerStyleTag, { factory: resetCss }), !noScrollbarCss && jsxRuntime.jsx(ServerStyleTag, { factory: scrollbarCss })] }), jsxRuntime.jsx(ServerStyleTag, { factory: themeGlobalStyle }), jsxRuntime.jsx(index$3, Object.assign({ minHeight: "100%", bgcolor: "background.primary", color: "text.primary", fontSize: "text", fontWeight: "text", lineHeight: "text", fontFamily: `system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` }, props, { sxr: {
58
147
  "& a": {
59
148
  color: "brand.primary",
60
149
  },