@@ -20,33 +20,45 @@ import {
20
20
import { FormattedMessage , useIntl } from 'react-intl' ;
21
21
import * as ParagonReact from '~paragon-react' ;
22
22
import * as ParagonIcons from '~paragon-icons' ;
23
+ import { ContentCopy } from '~paragon-icons' ;
23
24
import MiyazakiCard from './exampleComponents/MiyazakiCard' ;
24
25
import HipsterIpsum from './exampleComponents/HipsterIpsum' ;
25
26
import ExamplePropsForm from './exampleComponents/ExamplePropsForm' ;
26
27
27
- const { Button, Collapsible } = ParagonReact ;
28
+ const {
29
+ Collapsible, Toast, IconButton, Icon,
30
+ } = ParagonReact ;
28
31
29
32
export type CollapsibleLiveEditorTypes = {
30
- children : React . ReactNode ,
33
+ children : React . ReactNode ;
34
+ clickToCopy : ( ) => void ;
31
35
} ;
32
36
33
- function CollapsibleLiveEditor ( { children } : CollapsibleLiveEditorTypes ) {
37
+ function CollapsibleLiveEditor ( { children, clickToCopy } : CollapsibleLiveEditorTypes ) {
34
38
const [ collapseIsOpen , setCollapseIsOpen ] = useState ( false ) ;
35
39
return (
36
40
< div className = "pgn-doc__collapsible-live-editor" >
37
- < Collapsible . Advanced
41
+ < Collapsible
38
42
unmountOnExit = { false }
43
+ styling = "card-lg"
39
44
open = { collapseIsOpen }
40
45
onToggle = { ( isOpen : boolean ) => setCollapseIsOpen ( isOpen ) }
46
+ withIcon
47
+ title = { < strong > { collapseIsOpen ? 'Hide' : 'Show' } editable code example</ strong > }
41
48
>
42
- < Collapsible . Trigger tag = { Button } variant = "link" >
43
- < Collapsible . Visible whenClosed > Show code example</ Collapsible . Visible >
44
- < Collapsible . Visible whenOpen > Hide code example</ Collapsible . Visible >
45
- </ Collapsible . Trigger >
46
- < Collapsible . Body className = "mt-2" >
49
+ < p className = "small text-gray mb-2" > Any Paragon component or export may be added to the code example.</ p >
50
+ < div className = "pgn-doc__collapsible-code-wrapper" >
47
51
{ children }
48
- </ Collapsible . Body >
49
- </ Collapsible . Advanced >
52
+ < IconButton
53
+ className = "pgn-doc__collapsible-live-editor-copy-btn"
54
+ src = { ContentCopy }
55
+ iconAs = { Icon }
56
+ alt = "Copy code example"
57
+ onClick = { clickToCopy }
58
+ invertColors
59
+ />
60
+ </ div >
61
+ </ Collapsible >
50
62
</ div >
51
63
) ;
52
64
}
@@ -68,6 +80,12 @@ function CodeBlock({
68
80
} : ICodeBlock ) {
69
81
const intl = useIntl ( ) ;
70
82
const language : any = className ? className . replace ( / l a n g u a g e - / , '' ) : 'jsx' ;
83
+ const [ showToast , setShowToast ] = useState ( false ) ;
84
+
85
+ const isCodeExampleCopied = ( ) => {
86
+ navigator . clipboard . writeText ( children ) ;
87
+ setShowToast ( true ) ;
88
+ } ;
71
89
72
90
if ( live ) {
73
91
return (
@@ -98,11 +116,18 @@ function CodeBlock({
98
116
theme = { theme }
99
117
>
100
118
< LivePreview className = "pgn-doc__code-block-preview" />
101
- < CollapsibleLiveEditor >
119
+ < CollapsibleLiveEditor clickToCopy = { isCodeExampleCopied } >
102
120
< LiveEditor className = "pgn-doc__code-block-editor" />
103
121
</ CollapsibleLiveEditor >
104
122
< LiveError className = "pgn-doc__code-block-error" />
105
123
</ LiveProvider >
124
+ < Toast
125
+ onClose = { ( ) => setShowToast ( false ) }
126
+ show = { showToast }
127
+ delay = { 2000 }
128
+ >
129
+ Code example copied to clipboard!
130
+ </ Toast >
106
131
</ div >
107
132
) ;
108
133
}
0 commit comments