@cleartrip/ct-design-portal 4.0.0 → 5.0.0

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.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # Portal
2
+
3
+ A component that renders its children in a different DOM node.
4
+
5
+ ---
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @cleartrip/ct-design-portal
11
+ # or
12
+ pnpm add @cleartrip/ct-design-portal
13
+ ```
14
+
15
+ ### Peer dependencies
16
+
17
+ ```bash
18
+ # Required for all targets
19
+ npm install react
20
+
21
+ # Web only
22
+ npm install react-dom
23
+
24
+ # React Native only
25
+ npm install react-native
26
+ ```
27
+
28
+ ---
29
+
30
+ ## Usage
31
+
32
+ ### Basic
33
+
34
+ ```tsx
35
+ import { Portal } from '@cleartrip/ct-design-portal';
36
+
37
+ function Example() {
38
+ return (
39
+ <Portal>
40
+ {/* Basic usage */}
41
+ </Portal>
42
+ );
43
+ }
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Props
49
+
50
+ | Prop | Type | Default | Required | Description |
51
+ |------|------|---------|----------|-------------|
52
+ | `children` | `ReactNode` | — | ✅ Yes | The content to be rendered inside the portal. |
53
+ | `id` | `string` | — | ✅ Yes | Unique identifier for the portal instance. On native, this is used by the |
54
+
55
+ ---
56
+
57
+ ## Accessibility
58
+
59
+ - The component follows accessibility best practices
60
+ - Ensure proper ARIA attributes are provided where needed
61
+ - Test with screen readers to ensure usability
62
+
63
+ ---
64
+
65
+ ## Migration
66
+
67
+ If migrating from a previous version:
68
+
69
+ ```diff
70
+ - import { Portal } from 'yagami/core/components';
71
+ + import { Portal } from '@cleartrip/ct-design-portal';
72
+ ```
package/dist/Host.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ declare const Host: () => import("react/jsx-runtime").JSX.Element | null;
2
+ export default Host;
3
+ //# sourceMappingURL=Host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Host.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Host.tsx"],"names":[],"mappings":"AAKA,QAAA,MAAM,IAAI,sDAYT,CAAC;AAEF,eAAe,IAAI,CAAC"}
package/dist/Portal.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import * as React from 'react';
2
- import { PortalProps } from './type';
3
- declare const Portal: React.ForwardRefExoticComponent<PortalProps & React.RefAttributes<any>>;
1
+ import React from 'react';
2
+ import { IPortalProps } from './type';
3
+ declare const Portal: React.FC<IPortalProps>;
4
4
  export default Portal;
5
5
  //# sourceMappingURL=Portal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Portal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGrC,QAAA,MAAM,MAAM,yEAqCV,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Portal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAelC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { IPortalProps } from './type';
2
+ declare const Portal: ({ children, id }: IPortalProps) => null;
3
+ export default Portal;
4
+ //# sourceMappingURL=Portal.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.native.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Portal.native.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,QAAA,MAAM,MAAM,GAAI,kBAAkB,YAAY,SAW7C,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+ import { IPortalContextProps } from './type';
3
+ declare const PortalProvider: ({ children }: {
4
+ children: ReactNode;
5
+ }) => import("react/jsx-runtime").JSX.Element;
6
+ export default PortalProvider;
7
+ export declare const usePortalContext: () => IPortalContextProps;
8
+ //# sourceMappingURL=PortalProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PortalProvider.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/PortalProvider.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAiB,SAAS,EAAqC,MAAM,OAAO,CAAC;AAE3F,OAAO,EAAE,mBAAmB,EAAgB,MAAM,QAAQ,CAAC;AAI3D,QAAA,MAAM,cAAc,GAAI,cAAc;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,4CAoB5D,CAAC;AAEF,eAAe,cAAc,CAAC;AAE9B,eAAO,MAAM,gBAAgB,2BAI5B,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("react-dom"),n=require("@cleartrip/ct-design-use-isomorphic-effect");function u(e){return e&&e.__esModule?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var o=c(r),i=c(t),f=u(n),a=o.forwardRef((function(r,t){var n=r.children,u=r.container,c=r.disablePortal,a=o.useState(null),l=a[0],d=a[1];return f.default((function(){c||d(u||document.body)}),[u,c]),f.default((function(){if(l&&!c)return"function"==typeof t?t(l):t&&(t.current=l),function(){"function"==typeof t?t(l):t&&(t.current=null)}}),[t,l,c]),c?e.jsx(o.Fragment,{children:n}):i.createPortal(n,document.body)}));exports.Portal=a;
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("react-dom");const n=t.createContext(null),o=()=>{const e=t.useContext(n);if(!e)throw new Error("Context out of scope");return e};exports.Portal=({children:n})=>{const o=t.useRef(!1);if(t.useEffect(()=>(o.current=!0,()=>{o.current=!1}),[]),!o.current)return e.jsx(e.Fragment,{children:n});const c=(null===document||void 0===document?void 0:document.getElementById("__next"))||document.body;return r.createPortal(n,c)},exports.PortalHost=()=>{const{componentList:r}=o()||{};return r&&0!==r.length?e.jsx(e.Fragment,{children:r.map(({id:r,children:n},o)=>e.jsx(t.Fragment,{children:n},`${r}-${o}`))}):null},exports.PortalProvider=({children:r})=>{const[o,c]=t.useState([]),l=t.useCallback(({children:e,id:t})=>{c(r=>[...r,{id:t,children:e}])},[]),u=t.useCallback(e=>{c(t=>t.filter(t=>t.id!==e))},[]),s=t.useCallback(()=>{c([])},[]);return e.jsx(n.Provider,{value:{componentList:o,addComponent:l,removeComponent:u,clearAll:s},children:r})},exports.usePortalContext=o;
2
2
  //# sourceMappingURL=ct-design-portal.browser.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ct-design-portal.browser.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["Portal","React","forwardRef","_a","ref","children","container","disablePortal","_b","useState","mountNode","setMountNode","useIsomorphicEffect","document","body","current","_jsx","Fragment","ReactDOM","createPortal"],"mappings":"6fAKMA,EAASC,EAAMC,YAA6B,SAACC,EAAwCC,GAAtC,IAAAC,aAAUC,EAASH,EAAAG,UAAEC,EAAaJ,EAAAI,cAC/EC,EAA4BP,EAAMQ,SAAyB,MAA1DC,EAASF,EAAA,GAAEG,OA8BlB,OA1BAC,EAAAA,SAAoB,WACbL,GACHI,EAAaL,GAAaO,SAASC,KAEvC,GAAG,CAACR,EAAWC,IAEfK,EAAAA,SAAoB,WAClB,GAAIF,IAAcH,EAMhB,MALmB,mBAARH,EACTA,EAAIM,GACKN,IACTA,EAAIW,QAAUL,GAET,WACc,mBAARN,EACTA,EAAIM,GACKN,IACTA,EAAIW,QAAU,KAElB,CAEH,GAAE,CAACX,EAAKM,EAAWH,IAKhBA,EACKS,EAAAA,IAACf,EAAMgB,SAAU,CAAAZ,SAAAA,IAEnBa,EAASC,aAAad,EAAUQ,SAASC,KAGlD"}
1
+ {"version":3,"file":"ct-design-portal.browser.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["PortalContext","createContext","usePortalContext","portals","useContext","Error","children","isMounted","useRef","useEffect","current","_jsx","jsx","_Fragment","Fragment","targetElement","document","getElementById","body","createPortal","componentList","length","map","id","index","setComponentList","useState","addComponent","useCallback","prevComponents","removeComponent","filter","componentsList","clearAll","Provider","value"],"mappings":"0FAMA,MCFMA,EAAgBC,EAAAA,cAA0C,MA0BnDC,EAAmB,KAC9B,MAAMC,EAAUC,aAAWJ,GAC3B,IAAKG,EAAS,MAAM,IAAIE,MAAM,wBAC9B,OAAOF,kBD3B8B,EAAGG,eACxC,MAAMC,EAAYC,UAAgB,GASlC,GAPAC,EAAAA,UAAU,KACRF,EAAUG,SAAU,EACb,KACLH,EAAUG,SAAU,IAErB,KAEEH,EAAUG,QAAS,OAAOC,EAAAC,IAAAC,EAAAC,SAAA,CAAAR,SAAGA,IAElC,MAAMS,GAAwB,OAARC,eAAA,IAAAA,cAAA,EAAAA,SAAUC,eAAe,YAAaD,SAASE,KAErE,OAAOC,EAAYA,aAACb,EAAUS,uBEfnB,KACX,MAAMK,cAAEA,GAAkBlB,KAAsB,CAAA,EAEhD,OAAKkB,GAA0C,IAAzBA,EAAcC,OAGlCV,MAAAE,EAAAA,SAAA,CAAAP,SACGc,EAAcE,IAAI,EAAGC,KAAIjB,YAA0BkB,IAClDb,EAAAA,IAACG,EAAQA,SAAyB,CAAAR,SAAAA,GAAnB,GAAGiB,KAAMC,QAL2B,6BDFpC,EAAGlB,eACxB,MAAOc,EAAeK,GAAoBC,EAAQA,SAAiB,IAE7DC,EAAeC,EAAWA,YAAC,EAAGtB,WAAUiB,SAC5CE,EAAkBI,GAAmB,IAAIA,EAAgB,CAAEN,KAAIjB,eAC9D,IAEGwB,EAAkBF,cAAaL,IACnCE,EAAkBI,GAAmBA,EAAeE,OAAQC,GAAmBA,EAAeT,KAAOA,KACpG,IAEGU,EAAWL,EAAAA,YAAY,KAC3BH,EAAiB,KAChB,IAEH,OACEd,MAACX,EAAckC,SAAS,CAAAC,MAAO,CAAEf,gBAAeO,eAAcG,kBAAiBG,YAC5E3B,SAAAA"}
@@ -1,2 +1,2 @@
1
- import{jsx as r}from"react/jsx-runtime";import*as t from"react";import*as e from"react-dom";import o from"@cleartrip/ct-design-use-isomorphic-effect";var n=t.forwardRef((function(n,c){var i=n.children,f=n.container,u=n.disablePortal,a=t.useState(null),m=a[0],d=a[1];return o((function(){u||d(f||document.body)}),[f,u]),o((function(){if(m&&!u)return"function"==typeof c?c(m):c&&(c.current=m),function(){"function"==typeof c?c(m):c&&(c.current=null)}}),[c,m,u]),u?r(t.Fragment,{children:i}):e.createPortal(i,document.body)}));export{n as Portal};
1
+ import{jsx as r,Fragment as e}from"react/jsx-runtime";import{useRef as n,useEffect as t,createContext as o,useState as c,useCallback as d,useContext as i,Fragment as l}from"react";import{createPortal as m}from"react-dom";const u=({children:o})=>{const c=n(!1);if(t(()=>(c.current=!0,()=>{c.current=!1}),[]),!c.current)return r(e,{children:o});const d=(null===document||void 0===document?void 0:document.getElementById("__next"))||document.body;return m(o,d)},s=o(null),a=({children:e})=>{const[n,t]=c([]),o=d(({children:r,id:e})=>{t(n=>[...n,{id:e,children:r}])},[]),i=d(r=>{t(e=>e.filter(e=>e.id!==r))},[]),l=d(()=>{t([])},[]);return r(s.Provider,{value:{componentList:n,addComponent:o,removeComponent:i,clearAll:l},children:e})},h=()=>{const r=i(s);if(!r)throw new Error("Context out of scope");return r},p=()=>{const{componentList:n}=h()||{};return n&&0!==n.length?r(e,{children:n.map(({id:e,children:n},t)=>r(l,{children:n},`${e}-${t}`))}):null};export{u as Portal,p as PortalHost,a as PortalProvider,h as usePortalContext};
2
2
  //# sourceMappingURL=ct-design-portal.browser.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ct-design-portal.browser.esm.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["Portal","React","forwardRef","_a","ref","children","container","disablePortal","_b","useState","mountNode","setMountNode","useIsomorphicEffect","document","body","current","_jsx","Fragment","ReactDOM","createPortal"],"mappings":"sJAKM,IAAAA,EAASC,EAAMC,YAA6B,SAACC,EAAwCC,GAAtC,IAAAC,aAAUC,EAASH,EAAAG,UAAEC,EAAaJ,EAAAI,cAC/EC,EAA4BP,EAAMQ,SAAyB,MAA1DC,EAASF,EAAA,GAAEG,OA8BlB,OA1BAC,GAAoB,WACbL,GACHI,EAAaL,GAAaO,SAASC,KAEvC,GAAG,CAACR,EAAWC,IAEfK,GAAoB,WAClB,GAAIF,IAAcH,EAMhB,MALmB,mBAARH,EACTA,EAAIM,GACKN,IACTA,EAAIW,QAAUL,GAET,WACc,mBAARN,EACTA,EAAIM,GACKN,IACTA,EAAIW,QAAU,KAElB,CAEH,GAAE,CAACX,EAAKM,EAAWH,IAKhBA,EACKS,EAACf,EAAMgB,SAAU,CAAAZ,SAAAA,IAEnBa,EAASC,aAAad,EAAUQ,SAASC,KAGlD"}
1
+ {"version":3,"file":"ct-design-portal.browser.esm.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["Portal","children","isMounted","useRef","useEffect","current","_jsx","_Fragment","targetElement","document","getElementById","body","createPortal","PortalContext","createContext","PortalProvider","componentList","setComponentList","useState","addComponent","useCallback","id","prevComponents","removeComponent","filter","componentsList","clearAll","Provider","value","usePortalContext","portals","useContext","Error","Host","length","map","index","Fragment"],"mappings":"6NAMA,MAAMA,EAAiC,EAAGC,eACxC,MAAMC,EAAYC,GAAgB,GASlC,GAPAC,EAAU,KACRF,EAAUG,SAAU,EACb,KACLH,EAAUG,SAAU,IAErB,KAEEH,EAAUG,QAAS,OAAOC,EAAAC,EAAA,CAAAN,SAAGA,IAElC,MAAMO,GAAwB,OAARC,eAAA,IAAAA,cAAA,EAAAA,SAAUC,eAAe,YAAaD,SAASE,KAErE,OAAOC,EAAaX,EAAUO,IChB1BK,EAAgBC,EAA0C,MAE1DC,EAAiB,EAAGd,eACxB,MAAOe,EAAeC,GAAoBC,EAAyB,IAE7DC,EAAeC,EAAY,EAAGnB,WAAUoB,SAC5CJ,EAAkBK,GAAmB,IAAIA,EAAgB,CAAED,KAAIpB,eAC9D,IAEGsB,EAAkBH,EAAaC,IACnCJ,EAAkBK,GAAmBA,EAAeE,OAAQC,GAAmBA,EAAeJ,KAAOA,KACpG,IAEGK,EAAWN,EAAY,KAC3BH,EAAiB,KAChB,IAEH,OACEX,EAACO,EAAcc,SAAS,CAAAC,MAAO,CAAEZ,gBAAeG,eAAcI,kBAAiBG,YAC5EzB,SAAAA,KAOM4B,EAAmB,KAC9B,MAAMC,EAAUC,EAAWlB,GAC3B,IAAKiB,EAAS,MAAM,IAAIE,MAAM,wBAC9B,OAAOF,GC5BHG,EAAO,KACX,MAAMjB,cAAEA,GAAkBa,KAAsB,CAAA,EAEhD,OAAKb,GAA0C,IAAzBA,EAAckB,OAGlC5B,EAAAC,EAAA,CAAAN,SACGe,EAAcmB,IAAI,EAAGd,KAAIpB,YAA0BmC,IAClD9B,EAAC+B,EAAiC,CAAApC,SAAAA,GAAnB,GAAGoB,KAAMe,QAL2B"}
@@ -1,65 +1,53 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
5
- var ReactDOM = require('react-dom');
6
- var useIsomorphicEffect = require('@cleartrip/ct-design-use-isomorphic-effect');
4
+ var react = require('react');
5
+ var reactDom = require('react-dom');
7
6
 
8
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+ const Portal = ({ children }) => {
8
+ const isMounted = react.useRef(false);
9
+ react.useEffect(() => {
10
+ isMounted.current = true;
11
+ return () => {
12
+ isMounted.current = false;
13
+ };
14
+ }, []);
15
+ if (!isMounted.current)
16
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
17
+ const targetElement = (document === null || document === void 0 ? void 0 : document.getElementById('__next')) || document.body;
18
+ return reactDom.createPortal(children, targetElement);
19
+ };
9
20
 
10
- function _interopNamespace(e) {
11
- if (e && e.__esModule) return e;
12
- var n = Object.create(null);
13
- if (e) {
14
- Object.keys(e).forEach(function (k) {
15
- if (k !== 'default') {
16
- var d = Object.getOwnPropertyDescriptor(e, k);
17
- Object.defineProperty(n, k, d.get ? d : {
18
- enumerable: true,
19
- get: function () { return e[k]; }
20
- });
21
- }
22
- });
23
- }
24
- n.default = e;
25
- return Object.freeze(n);
26
- }
21
+ const PortalContext = react.createContext(null);
22
+ const PortalProvider = ({ children }) => {
23
+ const [componentList, setComponentList] = react.useState([]);
24
+ const addComponent = react.useCallback(({ children, id }) => {
25
+ setComponentList((prevComponents) => [...prevComponents, { id, children }]);
26
+ }, []);
27
+ const removeComponent = react.useCallback((id) => {
28
+ setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
29
+ }, []);
30
+ const clearAll = react.useCallback(() => {
31
+ setComponentList([]);
32
+ }, []);
33
+ return (jsxRuntime.jsx(PortalContext.Provider, { value: { componentList, addComponent, removeComponent, clearAll }, children: children }));
34
+ };
35
+ const usePortalContext = () => {
36
+ const portals = react.useContext(PortalContext);
37
+ if (!portals)
38
+ throw new Error(`Context out of scope`);
39
+ return portals;
40
+ };
27
41
 
28
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
- var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
30
- var useIsomorphicEffect__default = /*#__PURE__*/_interopDefault(useIsomorphicEffect);
31
-
32
- var Portal = React__namespace.forwardRef(function (_a, ref) {
33
- var children = _a.children, container = _a.container, disablePortal = _a.disablePortal;
34
- var _b = React__namespace.useState(null), mountNode = _b[0], setMountNode = _b[1];
35
- useIsomorphicEffect__default.default(function () {
36
- if (!disablePortal) {
37
- setMountNode(container || document.body);
38
- }
39
- }, [container, disablePortal]);
40
- useIsomorphicEffect__default.default(function () {
41
- if (mountNode && !disablePortal) {
42
- if (typeof ref === 'function') {
43
- ref(mountNode);
44
- }
45
- else if (ref) {
46
- ref.current = mountNode;
47
- }
48
- return function () {
49
- if (typeof ref === 'function') {
50
- ref(mountNode);
51
- }
52
- else if (ref) {
53
- ref.current = null;
54
- }
55
- };
56
- }
57
- }, [ref, mountNode, disablePortal]);
58
- if (disablePortal) {
59
- return jsxRuntime.jsx(React__namespace.Fragment, { children: children });
60
- }
61
- return ReactDOM__namespace.createPortal(children, document.body);
62
- });
42
+ const Host = () => {
43
+ const { componentList } = usePortalContext() || {};
44
+ if (!componentList || componentList.length === 0)
45
+ return null;
46
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: componentList.map(({ id, children }, index) => (jsxRuntime.jsx(react.Fragment, { children: children }, `${id}-${index}`))) }));
47
+ };
63
48
 
64
49
  exports.Portal = Portal;
50
+ exports.PortalHost = Host;
51
+ exports.PortalProvider = PortalProvider;
52
+ exports.usePortalContext = usePortalContext;
65
53
  //# sourceMappingURL=ct-design-portal.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ct-design-portal.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["React","useIsomorphicEffect","_jsx","ReactDOM"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKM,IAAA,MAAM,GAAGA,gBAAK,CAAC,UAAU,CAAmB,UAAC,EAAsC,EAAE,GAAG,EAAA;AAAzC,IAAA,IAAA,QAAQ,cAAA,EAAE,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,aAAa,GAAA,EAAA,CAAA,aAAA,CAAA;AAC/E,IAAA,IAAA,EAA4B,GAAAA,gBAAK,CAAC,QAAQ,CAAiB,IAAI,CAAC,EAA/D,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,QAAwC,CAAC;AAIvE,IAAAC,oCAAmB,CAAC,YAAA;QAClB,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,YAAY,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1C,SAAA;AACH,KAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AAE/B,IAAAA,oCAAmB,CAAC,YAAA;AAClB,QAAA,IAAI,SAAS,IAAI,CAAC,aAAa,EAAE;AAC/B,YAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;gBAC7B,GAAG,CAAC,SAAS,CAAC,CAAC;AAChB,aAAA;AAAM,iBAAA,IAAI,GAAG,EAAE;AACd,gBAAA,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;AACzB,aAAA;YACD,OAAO,YAAA;AACL,gBAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;oBAC7B,GAAG,CAAC,SAAS,CAAC,CAAC;AAChB,iBAAA;AAAM,qBAAA,IAAI,GAAG,EAAE;AACd,oBAAA,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,iBAAA;AACH,aAAC,CAAC;AACH,SAAA;KACF,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AAKpC,IAAA,IAAI,aAAa,EAAE;AACjB,QAAA,OAAOC,eAACF,gBAAK,CAAC,QAAQ,EAAE,EAAA,QAAA,EAAA,QAAQ,GAAkB,CAAC;AACpD,KAAA;IACD,OAAOG,mBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAGxD,CAAC;;;;"}
1
+ {"version":3,"file":"ct-design-portal.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["useRef","useEffect","_jsx","_Fragment","createPortal","createContext","useState","useCallback","useContext","Fragment"],"mappings":";;;;;;AAMA,MAAM,MAAM,GAA2B,CAAC,EAAE,QAAQ,EAAE,KAAI;AACtD,IAAA,MAAM,SAAS,GAAGA,YAAM,CAAU,KAAK,CAAC,CAAC;IAEzCC,eAAS,CAAC,MAAK;AACb,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AACzB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC5B,SAAC,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI,CAAC;AAE/C,IAAA,MAAM,aAAa,GAAG,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,cAAc,CAAC,QAAQ,CAAC,KAAI,QAAQ,CAAC,IAAI,CAAC;AAE1E,IAAA,OAAOC,qBAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC/C;;ACjBA,MAAM,aAAa,GAAGC,mBAAa,CAA6B,IAAI,CAAC,CAAC;AAEtE,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAA2B,KAAI;IAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,CAAiB,EAAE,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAGC,iBAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAgB,KAAI;AAClE,QAAA,gBAAgB,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC7E,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,CAAC,EAAU,KAAI;QACjD,gBAAgB,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KAC3G,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,QAAQ,GAAGA,iBAAW,CAAC,MAAK;QAChC,gBAAgB,CAAC,EAAE,CAAC,CAAC;KACtB,EAAE,EAAE,CAAC,CAAC;IAEP,QACEL,eAAC,aAAa,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,EACtF,QAAA,EAAA,QAAQ,EACc,CAAA,EACzB;AACJ,EAAE;AAIK,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,OAAO,GAAGM,gBAAU,CAAC,aAAa,CAAC,CAAC;AAC1C,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC,CAAC;AACtD,IAAA,OAAO,OAAO,CAAC;AACjB;;AC7BM,MAAA,IAAI,GAAG,MAAK;IAChB,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAEnD,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AAE9D,IAAA,QACEN,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EACG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAgB,EAAE,KAAa,MAC/DD,cAAC,CAAAO,cAAQ,EAAyB,EAAA,QAAA,EAAA,QAAQ,IAA3B,CAAG,EAAA,EAAE,CAAI,CAAA,EAAA,KAAK,EAAE,CAAuB,CACvD,CAAC,EAAA,CACD,EACH;AACJ;;;;;;;"}
@@ -1,39 +1,48 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import * as React from 'react';
3
- import * as ReactDOM from 'react-dom';
4
- import useIsomorphicEffect from '@cleartrip/ct-design-use-isomorphic-effect';
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useRef, useEffect, createContext, useState, useCallback, useContext, Fragment as Fragment$1 } from 'react';
3
+ import { createPortal } from 'react-dom';
5
4
 
6
- var Portal = React.forwardRef(function (_a, ref) {
7
- var children = _a.children, container = _a.container, disablePortal = _a.disablePortal;
8
- var _b = React.useState(null), mountNode = _b[0], setMountNode = _b[1];
9
- useIsomorphicEffect(function () {
10
- if (!disablePortal) {
11
- setMountNode(container || document.body);
12
- }
13
- }, [container, disablePortal]);
14
- useIsomorphicEffect(function () {
15
- if (mountNode && !disablePortal) {
16
- if (typeof ref === 'function') {
17
- ref(mountNode);
18
- }
19
- else if (ref) {
20
- ref.current = mountNode;
21
- }
22
- return function () {
23
- if (typeof ref === 'function') {
24
- ref(mountNode);
25
- }
26
- else if (ref) {
27
- ref.current = null;
28
- }
29
- };
30
- }
31
- }, [ref, mountNode, disablePortal]);
32
- if (disablePortal) {
33
- return jsx(React.Fragment, { children: children });
34
- }
35
- return ReactDOM.createPortal(children, document.body);
36
- });
5
+ const Portal = ({ children }) => {
6
+ const isMounted = useRef(false);
7
+ useEffect(() => {
8
+ isMounted.current = true;
9
+ return () => {
10
+ isMounted.current = false;
11
+ };
12
+ }, []);
13
+ if (!isMounted.current)
14
+ return jsx(Fragment, { children: children });
15
+ const targetElement = (document === null || document === void 0 ? void 0 : document.getElementById('__next')) || document.body;
16
+ return createPortal(children, targetElement);
17
+ };
37
18
 
38
- export { Portal };
19
+ const PortalContext = createContext(null);
20
+ const PortalProvider = ({ children }) => {
21
+ const [componentList, setComponentList] = useState([]);
22
+ const addComponent = useCallback(({ children, id }) => {
23
+ setComponentList((prevComponents) => [...prevComponents, { id, children }]);
24
+ }, []);
25
+ const removeComponent = useCallback((id) => {
26
+ setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
27
+ }, []);
28
+ const clearAll = useCallback(() => {
29
+ setComponentList([]);
30
+ }, []);
31
+ return (jsx(PortalContext.Provider, { value: { componentList, addComponent, removeComponent, clearAll }, children: children }));
32
+ };
33
+ const usePortalContext = () => {
34
+ const portals = useContext(PortalContext);
35
+ if (!portals)
36
+ throw new Error(`Context out of scope`);
37
+ return portals;
38
+ };
39
+
40
+ const Host = () => {
41
+ const { componentList } = usePortalContext() || {};
42
+ if (!componentList || componentList.length === 0)
43
+ return null;
44
+ return (jsx(Fragment, { children: componentList.map(({ id, children }, index) => (jsx(Fragment$1, { children: children }, `${id}-${index}`))) }));
45
+ };
46
+
47
+ export { Portal, Host as PortalHost, PortalProvider, usePortalContext };
39
48
  //# sourceMappingURL=ct-design-portal.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ct-design-portal.esm.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;;AAKM,IAAA,MAAM,GAAG,KAAK,CAAC,UAAU,CAAmB,UAAC,EAAsC,EAAE,GAAG,EAAA;AAAzC,IAAA,IAAA,QAAQ,cAAA,EAAE,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,aAAa,GAAA,EAAA,CAAA,aAAA,CAAA;AAC/E,IAAA,IAAA,EAA4B,GAAA,KAAK,CAAC,QAAQ,CAAiB,IAAI,CAAC,EAA/D,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,QAAwC,CAAC;AAIvE,IAAA,mBAAmB,CAAC,YAAA;QAClB,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,YAAY,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1C,SAAA;AACH,KAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AAE/B,IAAA,mBAAmB,CAAC,YAAA;AAClB,QAAA,IAAI,SAAS,IAAI,CAAC,aAAa,EAAE;AAC/B,YAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;gBAC7B,GAAG,CAAC,SAAS,CAAC,CAAC;AAChB,aAAA;AAAM,iBAAA,IAAI,GAAG,EAAE;AACd,gBAAA,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;AACzB,aAAA;YACD,OAAO,YAAA;AACL,gBAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;oBAC7B,GAAG,CAAC,SAAS,CAAC,CAAC;AAChB,iBAAA;AAAM,qBAAA,IAAI,GAAG,EAAE;AACd,oBAAA,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,iBAAA;AACH,aAAC,CAAC;AACH,SAAA;KACF,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AAKpC,IAAA,IAAI,aAAa,EAAE;AACjB,QAAA,OAAOA,IAAC,KAAK,CAAC,QAAQ,EAAE,EAAA,QAAA,EAAA,QAAQ,GAAkB,CAAC;AACpD,KAAA;IACD,OAAO,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAGxD,CAAC;;;;"}
1
+ {"version":3,"file":"ct-design-portal.esm.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["_jsx","_Fragment","Fragment"],"mappings":";;;;AAMA,MAAM,MAAM,GAA2B,CAAC,EAAE,QAAQ,EAAE,KAAI;AACtD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;IAEzC,SAAS,CAAC,MAAK;AACb,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AACzB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC5B,SAAC,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAOA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI,CAAC;AAE/C,IAAA,MAAM,aAAa,GAAG,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,cAAc,CAAC,QAAQ,CAAC,KAAI,QAAQ,CAAC,IAAI,CAAC;AAE1E,IAAA,OAAO,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC/C;;ACjBA,MAAM,aAAa,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAEtE,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAA2B,KAAI;IAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAgB,KAAI;AAClE,QAAA,gBAAgB,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC7E,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,EAAU,KAAI;QACjD,gBAAgB,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KAC3G,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAK;QAChC,gBAAgB,CAAC,EAAE,CAAC,CAAC;KACtB,EAAE,EAAE,CAAC,CAAC;IAEP,QACED,IAAC,aAAa,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,EACtF,QAAA,EAAA,QAAQ,EACc,CAAA,EACzB;AACJ,EAAE;AAIK,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAC1C,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC,CAAC;AACtD,IAAA,OAAO,OAAO,CAAC;AACjB;;AC7BM,MAAA,IAAI,GAAG,MAAK;IAChB,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAEnD,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AAE9D,IAAA,QACEA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EACG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAgB,EAAE,KAAa,MAC/DD,GAAC,CAAAE,UAAQ,EAAyB,EAAA,QAAA,EAAA,QAAQ,IAA3B,CAAG,EAAA,EAAE,CAAI,CAAA,EAAA,KAAK,EAAE,CAAuB,CACvD,CAAC,EAAA,CACD,EACH;AACJ;;;;"}
@@ -1,66 +1,55 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('react-dom'), require('@cleartrip/ct-design-use-isomorphic-effect')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'react-dom', '@cleartrip/ct-design-use-isomorphic-effect'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CTDesignSystemPortal = {}, global.jsxRuntime, global.React, global.ReactDOM, global.useIsomorphicEffect));
5
- })(this, (function (exports, jsxRuntime, React, ReactDOM, useIsomorphicEffect) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('react-dom')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'react-dom'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CTDesignSystemPortal = {}, global.jsxRuntime, global.React, global.reactDom));
5
+ })(this, (function (exports, jsxRuntime, react, reactDom) { 'use strict';
6
6
 
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+ const Portal = ({ children }) => {
8
+ const isMounted = react.useRef(false);
9
+ react.useEffect(() => {
10
+ isMounted.current = true;
11
+ return () => {
12
+ isMounted.current = false;
13
+ };
14
+ }, []);
15
+ if (!isMounted.current)
16
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
17
+ const targetElement = (document === null || document === void 0 ? void 0 : document.getElementById('__next')) || document.body;
18
+ return reactDom.createPortal(children, targetElement);
19
+ };
8
20
 
9
- function _interopNamespace(e) {
10
- if (e && e.__esModule) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n.default = e;
24
- return Object.freeze(n);
25
- }
21
+ const PortalContext = react.createContext(null);
22
+ const PortalProvider = ({ children }) => {
23
+ const [componentList, setComponentList] = react.useState([]);
24
+ const addComponent = react.useCallback(({ children, id }) => {
25
+ setComponentList((prevComponents) => [...prevComponents, { id, children }]);
26
+ }, []);
27
+ const removeComponent = react.useCallback((id) => {
28
+ setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
29
+ }, []);
30
+ const clearAll = react.useCallback(() => {
31
+ setComponentList([]);
32
+ }, []);
33
+ return (jsxRuntime.jsx(PortalContext.Provider, { value: { componentList, addComponent, removeComponent, clearAll }, children: children }));
34
+ };
35
+ const usePortalContext = () => {
36
+ const portals = react.useContext(PortalContext);
37
+ if (!portals)
38
+ throw new Error(`Context out of scope`);
39
+ return portals;
40
+ };
26
41
 
27
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
- var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
29
- var useIsomorphicEffect__default = /*#__PURE__*/_interopDefault(useIsomorphicEffect);
30
-
31
- var Portal = React__namespace.forwardRef(function (_a, ref) {
32
- var children = _a.children, container = _a.container, disablePortal = _a.disablePortal;
33
- var _b = React__namespace.useState(null), mountNode = _b[0], setMountNode = _b[1];
34
- useIsomorphicEffect__default.default(function () {
35
- if (!disablePortal) {
36
- setMountNode(container || document.body);
37
- }
38
- }, [container, disablePortal]);
39
- useIsomorphicEffect__default.default(function () {
40
- if (mountNode && !disablePortal) {
41
- if (typeof ref === 'function') {
42
- ref(mountNode);
43
- }
44
- else if (ref) {
45
- ref.current = mountNode;
46
- }
47
- return function () {
48
- if (typeof ref === 'function') {
49
- ref(mountNode);
50
- }
51
- else if (ref) {
52
- ref.current = null;
53
- }
54
- };
55
- }
56
- }, [ref, mountNode, disablePortal]);
57
- if (disablePortal) {
58
- return jsxRuntime.jsx(React__namespace.Fragment, { children: children });
59
- }
60
- return ReactDOM__namespace.createPortal(children, document.body);
61
- });
42
+ const Host = () => {
43
+ const { componentList } = usePortalContext() || {};
44
+ if (!componentList || componentList.length === 0)
45
+ return null;
46
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: componentList.map(({ id, children }, index) => (jsxRuntime.jsx(react.Fragment, { children: children }, `${id}-${index}`))) }));
47
+ };
62
48
 
63
49
  exports.Portal = Portal;
50
+ exports.PortalHost = Host;
51
+ exports.PortalProvider = PortalProvider;
52
+ exports.usePortalContext = usePortalContext;
64
53
 
65
54
  }));
66
55
  //# sourceMappingURL=ct-design-portal.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ct-design-portal.umd.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["React","useIsomorphicEffect","_jsx","ReactDOM"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKM,QAAA,MAAM,GAAGA,gBAAK,CAAC,UAAU,CAAmB,UAAC,EAAsC,EAAE,GAAG,EAAA;IAAzC,IAAA,IAAA,QAAQ,cAAA,EAAE,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,aAAa,GAAA,EAAA,CAAA,aAAA,CAAA;IAC/E,IAAA,IAAA,EAA4B,GAAAA,gBAAK,CAAC,QAAQ,CAAiB,IAAI,CAAC,EAA/D,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,QAAwC,CAAC;IAIvE,IAAAC,oCAAmB,CAAC,YAAA;YAClB,IAAI,CAAC,aAAa,EAAE;IAClB,YAAA,YAAY,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,SAAA;IACH,KAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE/B,IAAAA,oCAAmB,CAAC,YAAA;IAClB,QAAA,IAAI,SAAS,IAAI,CAAC,aAAa,EAAE;IAC/B,YAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;oBAC7B,GAAG,CAAC,SAAS,CAAC,CAAC;IAChB,aAAA;IAAM,iBAAA,IAAI,GAAG,EAAE;IACd,gBAAA,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;IACzB,aAAA;gBACD,OAAO,YAAA;IACL,gBAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;wBAC7B,GAAG,CAAC,SAAS,CAAC,CAAC;IAChB,iBAAA;IAAM,qBAAA,IAAI,GAAG,EAAE;IACd,oBAAA,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACpB,iBAAA;IACH,aAAC,CAAC;IACH,SAAA;SACF,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAKpC,IAAA,IAAI,aAAa,EAAE;IACjB,QAAA,OAAOC,eAACF,gBAAK,CAAC,QAAQ,EAAE,EAAA,QAAA,EAAA,QAAQ,GAAkB,CAAC;IACpD,KAAA;QACD,OAAOG,mBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAGxD,CAAC;;;;;;;;"}
1
+ {"version":3,"file":"ct-design-portal.umd.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["useRef","useEffect","_jsx","_Fragment","createPortal","createContext","useState","useCallback","useContext","Fragment"],"mappings":";;;;;;AAMA,UAAM,MAAM,GAA2B,CAAC,EAAE,QAAQ,EAAE,KAAI;IACtD,IAAA,MAAM,SAAS,GAAGA,YAAM,CAAU,KAAK,CAAC,CAAC;QAEzCC,eAAS,CAAC,MAAK;IACb,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;IACzB,QAAA,OAAO,MAAK;IACV,YAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5B,SAAC,CAAC;SACH,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI,CAAC;IAE/C,IAAA,MAAM,aAAa,GAAG,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,cAAc,CAAC,QAAQ,CAAC,KAAI,QAAQ,CAAC,IAAI,CAAC;IAE1E,IAAA,OAAOC,qBAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC/C;;ICjBA,MAAM,aAAa,GAAGC,mBAAa,CAA6B,IAAI,CAAC,CAAC;AAEtE,UAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAA2B,KAAI;QAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,CAAiB,EAAE,CAAC,CAAC;QAEvE,MAAM,YAAY,GAAGC,iBAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAgB,KAAI;IAClE,QAAA,gBAAgB,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;SAC7E,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,CAAC,EAAU,KAAI;YACjD,gBAAgB,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC3G,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,MAAM,QAAQ,GAAGA,iBAAW,CAAC,MAAK;YAChC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACtB,EAAE,EAAE,CAAC,CAAC;QAEP,QACEL,eAAC,aAAa,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,EACtF,QAAA,EAAA,QAAQ,EACc,CAAA,EACzB;IACJ,EAAE;AAIK,UAAM,gBAAgB,GAAG,MAAK;IACnC,IAAA,MAAM,OAAO,GAAGM,gBAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAA,IAAI,CAAC,OAAO;IAAE,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC,CAAC;IACtD,IAAA,OAAO,OAAO,CAAC;IACjB;;AC7BM,UAAA,IAAI,GAAG,MAAK;QAChB,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAEnD,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;IAAE,QAAA,OAAO,IAAI,CAAC;IAE9D,IAAA,QACEN,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EACG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAgB,EAAE,KAAa,MAC/DD,cAAC,CAAAO,cAAQ,EAAyB,EAAA,QAAA,EAAA,QAAQ,IAA3B,CAAG,EAAA,EAAE,CAAI,CAAA,EAAA,KAAK,EAAE,CAAuB,CACvD,CAAC,EAAA,CACD,EACH;IACJ;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { default as Portal } from './Portal';
2
- export * from './type';
2
+ export { default as PortalProvider, usePortalContext } from './PortalProvider';
3
+ export { default as PortalHost } from './Host';
4
+ export type * from './type';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,mBAAmB,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { default as Portal } from './Portal.native';
2
+ export { default as PortalProvider, usePortalContext } from './PortalProvider';
3
+ export { default as PortalHost } from './Host';
4
+ export type * from './type';
5
+ //# sourceMappingURL=index.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,mBAAmB,QAAQ,CAAC"}
package/dist/type.d.ts CHANGED
@@ -1,7 +1,12 @@
1
- import * as React from 'react';
2
- export interface PortalProps {
3
- children?: React.ReactNode;
4
- container?: Element;
5
- disablePortal?: boolean;
1
+ import { ReactNode } from 'react';
2
+ export interface IPortalProps {
3
+ children: ReactNode;
4
+ id: string;
5
+ }
6
+ export interface IPortalContextProps {
7
+ componentList: IPortalProps[];
8
+ addComponent: ({ children, id }: IPortalProps) => void;
9
+ removeComponent: (id: string) => void;
10
+ clearAll: () => void;
6
11
  }
7
12
  //# sourceMappingURL=type.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,WAAW;IAI1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAI3B,SAAS,CAAC,EAAE,OAAO,CAAC;IAKpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,YAAY;IAI3B,QAAQ,EAAE,SAAS,CAAC;IAKpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAIlC,aAAa,EAAE,YAAY,EAAE,CAAC;IAI9B,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;IAIvD,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAItC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,27 +1,37 @@
1
1
  {
2
2
  "name": "@cleartrip/ct-design-portal",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Portal Component",
5
5
  "types": "dist/index.d.ts",
6
- "main": "dist/ct-design-portal.cjs.js",
6
+ "main": "./dist/ct-design-portal.cjs.js",
7
7
  "jsnext:main": "dist/ct-design-portal.esm.js",
8
8
  "module": "dist/ct-design-portal.esm.js",
9
+ "react-native": "src/index.native.ts",
9
10
  "sideEffects": false,
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/ct-design-portal.esm.js",
15
+ "default": "./dist/ct-design-portal.cjs.js"
16
+ }
17
+ },
10
18
  "browser": {
11
19
  "./dist/ct-design-portal.esm.js": "./dist/ct-design-portal.browser.esm.js",
12
20
  "./dist/ct-design-portal.cjs.js": "./dist/ct-design-portal.browser.cjs.js"
13
21
  },
14
22
  "files": [
15
- "dist"
23
+ "dist",
24
+ "src"
16
25
  ],
17
26
  "dependencies": {
18
- "@cleartrip/ct-design-use-isomorphic-effect": "4.0.0"
27
+ "@cleartrip/ct-design-theme": "5.0.0"
28
+ },
29
+ "devDependencies": {
30
+ "@emotion/babel-plugin": "^11.12.0"
19
31
  },
20
- "devDependencies": {},
21
32
  "peerDependencies": {
22
33
  "react": ">=16.8.0",
23
- "react-dom": ">=16.8.0",
24
- "styled-components": "^5.3.6"
34
+ "react-dom": ">=16.8.0"
25
35
  },
26
36
  "publishConfig": {
27
37
  "access": "public"
@@ -32,6 +42,8 @@
32
42
  "test": "echo \"Error: no test specified\" && exit 1",
33
43
  "watch-package": "rollup -c -w",
34
44
  "build-package": "rollup -c",
35
- "build-package:clean": "rm -rf dist && rollup -c"
45
+ "build-package:clean": "rm -rf dist && rollup -c",
46
+ "publish-package:local": "yalc publish --no-scripts",
47
+ "publish-package:local:registry": "pnpm publish --registry http://localhost:4873 --no-git-checks --access public"
36
48
  }
37
49
  }
package/src/Host.tsx ADDED
@@ -0,0 +1,20 @@
1
+ import React, { Fragment } from 'react';
2
+
3
+ import { usePortalContext } from './PortalProvider';
4
+ import { IPortalProps } from './type';
5
+
6
+ const Host = () => {
7
+ const { componentList } = usePortalContext() || {};
8
+
9
+ if (!componentList || componentList.length === 0) return null;
10
+
11
+ return (
12
+ <>
13
+ {componentList.map(({ id, children }: IPortalProps, index: number) => (
14
+ <Fragment key={`${id}-${index}`}>{children}</Fragment>
15
+ ))}
16
+ </>
17
+ );
18
+ };
19
+
20
+ export default Host;
@@ -0,0 +1,19 @@
1
+ import { useEffect } from 'react';
2
+
3
+ import { usePortalContext } from './PortalProvider';
4
+ import { IPortalProps } from './type';
5
+
6
+ const Portal = ({ children, id }: IPortalProps) => {
7
+ const { addComponent, removeComponent } = usePortalContext() || {};
8
+
9
+ useEffect(() => {
10
+ addComponent?.({ children, id });
11
+ return () => {
12
+ removeComponent?.(id);
13
+ };
14
+ }, [addComponent, children, id, removeComponent]);
15
+
16
+ return null;
17
+ };
18
+
19
+ export default Portal;
package/src/Portal.tsx ADDED
@@ -0,0 +1,24 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+
3
+ import { createPortal } from 'react-dom';
4
+
5
+ import { IPortalProps } from './type';
6
+
7
+ const Portal: React.FC<IPortalProps> = ({ children }) => {
8
+ const isMounted = useRef<boolean>(false);
9
+
10
+ useEffect(() => {
11
+ isMounted.current = true;
12
+ return () => {
13
+ isMounted.current = false;
14
+ };
15
+ }, []);
16
+
17
+ if (!isMounted.current) return <>{children}</>;
18
+
19
+ const targetElement = document?.getElementById('__next') || document.body;
20
+
21
+ return createPortal(children, targetElement);
22
+ };
23
+
24
+ export default Portal;
@@ -0,0 +1,35 @@
1
+ import React, { createContext, ReactNode, useCallback, useContext, useState } from 'react';
2
+
3
+ import { IPortalContextProps, IPortalProps } from './type';
4
+
5
+ const PortalContext = createContext<IPortalContextProps | null>(null);
6
+
7
+ const PortalProvider = ({ children }: { children: ReactNode }) => {
8
+ const [componentList, setComponentList] = useState<IPortalProps[]>([]);
9
+
10
+ const addComponent = useCallback(({ children, id }: IPortalProps) => {
11
+ setComponentList((prevComponents) => [...prevComponents, { id, children }]);
12
+ }, []);
13
+
14
+ const removeComponent = useCallback((id: string) => {
15
+ setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
16
+ }, []);
17
+
18
+ const clearAll = useCallback(() => {
19
+ setComponentList([]);
20
+ }, []);
21
+
22
+ return (
23
+ <PortalContext.Provider value={{ componentList, addComponent, removeComponent, clearAll }}>
24
+ {children}
25
+ </PortalContext.Provider>
26
+ );
27
+ };
28
+
29
+ export default PortalProvider;
30
+
31
+ export const usePortalContext = () => {
32
+ const portals = useContext(PortalContext);
33
+ if (!portals) throw new Error(`Context out of scope`);
34
+ return portals;
35
+ };
@@ -0,0 +1,4 @@
1
+ export { default as Portal } from './Portal.native';
2
+ export { default as PortalProvider, usePortalContext } from './PortalProvider';
3
+ export { default as PortalHost } from './Host';
4
+ export type * from './type';
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { default as Portal } from './Portal';
2
+ export { default as PortalProvider, usePortalContext } from './PortalProvider';
3
+ export { default as PortalHost } from './Host';
4
+ export type * from './type';
package/src/type.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface IPortalProps {
4
+ /**
5
+ * The content to be rendered inside the portal.
6
+ */
7
+ children: ReactNode;
8
+ /**
9
+ * Unique identifier for the portal instance. On native, this is used by the
10
+ * PortalProvider to register/unregister the portal from the Host.
11
+ */
12
+ id: string;
13
+ }
14
+
15
+ export interface IPortalContextProps {
16
+ /**
17
+ * List of currently mounted portal entries.
18
+ */
19
+ componentList: IPortalProps[];
20
+ /**
21
+ * Register a portal entry with the host.
22
+ */
23
+ addComponent: ({ children, id }: IPortalProps) => void;
24
+ /**
25
+ * Remove a portal entry by its id.
26
+ */
27
+ removeComponent: (id: string) => void;
28
+ /**
29
+ * Remove every registered portal entry.
30
+ */
31
+ clearAll: () => void;
32
+ }