File tree Expand file tree Collapse file tree 2 files changed +78
-0
lines changed Expand file tree Collapse file tree 2 files changed +78
-0
lines changed Original file line number Diff line number Diff line change
1
+ import * as React from 'react' ;
2
+ import * as ReactDOM from 'react-dom' ;
3
+ import { ThemeConsumer } from 'styled-components' ;
4
+
5
+ export interface IPortalProps {
6
+ children : any ;
7
+ className ?: string ;
8
+ }
9
+
10
+ export class Portal extends React . PureComponent < IPortalProps > {
11
+ private readonly el ?: HTMLDivElement ;
12
+ private readonly root = typeof document === 'object' ? document . body : null ;
13
+
14
+ constructor ( props : IPortalProps ) {
15
+ super ( props ) ;
16
+
17
+ if ( typeof document === 'undefined' || typeof document . createElement !== 'function' ) return ;
18
+
19
+ this . el = document . createElement ( 'div' ) ;
20
+
21
+ if ( props . className !== undefined ) {
22
+ this . el . className = props . className ;
23
+ }
24
+ }
25
+
26
+ public componentDidMount ( ) {
27
+ if ( this . el !== undefined && this . root !== null ) {
28
+ this . root . appendChild ( this . el ) ;
29
+ }
30
+ }
31
+
32
+ public componentWillUnmount ( ) {
33
+ if ( this . el !== undefined && this . root !== null ) {
34
+ this . root . removeChild ( this . el ) ;
35
+ }
36
+ }
37
+
38
+ private renderChildren = ( ) => {
39
+ const { children } = this . props ;
40
+
41
+ if ( typeof children === 'function' ) {
42
+ return children ( ) ;
43
+ }
44
+
45
+ return React . Children . map ( this . props . children , child => React . cloneElement ( child ) ) ;
46
+ } ;
47
+
48
+ public render ( ) {
49
+ if ( this . el === undefined ) {
50
+ return null ;
51
+ }
52
+
53
+ return ReactDOM . createPortal ( < ThemeConsumer > { this . renderChildren } </ ThemeConsumer > , this . el ) ;
54
+ }
55
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * NOTE: any components with meaningful external dependencies should NOT be exported here.
3
+ * Library users will need to `import { Select } from '@stoplight/ui-kit/select` them specifically.
4
+ */
5
+
6
+ // export * from './BlockQuote';
7
+ export * from './Break' ;
8
+ export * from './Button' ;
9
+ // export * from './ContextMenu';
10
+ export * from './Flex' ;
11
+ export * from './Heading' ;
12
+ export * from './Icon' ;
13
+ export * from './Image' ;
14
+ // export * from './List';
15
+ export * from './Link' ;
16
+ // export * from './Popup';
17
+ export * from './Portal' ;
18
+ // export * from './Mark';
19
+ // export * from './Menu';
20
+ // export * from './Table';
21
+ export * from './Text' ;
22
+ // export * from './Toggle';
23
+ export * from './theme/types' ;
You can’t perform that action at this time.
0 commit comments