@@ -19,6 +19,7 @@ import DemoFrame from 'docs/src/modules/components/DemoFrame';
1919import DemoLanguages from 'docs/src/modules/components/DemoLanguages' ;
2020import getDemoConfig from 'docs/src/modules/utils/getDemoConfig' ;
2121import compose from 'docs/src/modules/utils/compose' ;
22+ import { getCookie } from 'docs/src/modules/utils/helpers' ;
2223import { ACTION_TYPES , CODE_VARIANTS } from 'docs/src/modules/constants' ;
2324
2425function compress ( object ) {
@@ -95,8 +96,14 @@ class Demo extends React.Component {
9596 state = {
9697 anchorEl : null ,
9798 codeOpen : false ,
99+ demoHovered : false ,
100+ sourceHintSeen : false ,
98101 } ;
99102
103+ componentDidMount ( ) {
104+ this . setState ( { sourceHintSeen : getCookie ( 'sourceHintSeen' ) } ) ;
105+ }
106+
100107 handleClickMore = event => {
101108 this . setState ( { anchorEl : event . currentTarget } ) ;
102109 } ;
@@ -183,11 +190,17 @@ class Demo extends React.Component {
183190 } ;
184191
185192 handleClickCodeOpen = ( ) => {
193+ document . cookie = `sourceHintSeen=true;path=/;max-age=31536000` ;
186194 this . setState ( state => ( {
187195 codeOpen : ! state . codeOpen ,
196+ sourceHintSeen : true ,
188197 } ) ) ;
189198 } ;
190199
200+ handleDemoHover = event => {
201+ this . setState ( { demoHovered : event . type === 'mouseenter' } ) ;
202+ } ;
203+
191204 getDemoData = ( ) => {
192205 const { codeVariant, demo, githubLocation } = this . props ;
193206 if ( codeVariant === CODE_VARIANTS . HOOK && demo . rawHooks ) {
@@ -217,11 +230,13 @@ class Demo extends React.Component {
217230
218231 render ( ) {
219232 const { classes, codeVariant, demo, demoOptions } = this . props ;
220- const { anchorEl, codeOpen } = this . state ;
233+ const { anchorEl, codeOpen, demoHovered, sourceHintSeen } = this . state ;
234+ const showSourceHint = demoHovered && ! sourceHintSeen ;
221235 const category = demoOptions . demo ;
222236 const demoData = this . getDemoData ( ) ;
223237 const DemoComponent = demoData . js ;
224238 const sourceLanguage = demoData . codeVariant === CODE_VARIANTS . TS ? 'tsx' : 'jsx' ;
239+ const Frame = demoOptions . iframe ? DemoFrame : React . Fragment ;
225240
226241 return (
227242 < div className = { classes . root } >
@@ -236,12 +251,18 @@ class Demo extends React.Component {
236251 onLanguageClick = { this . handleCodeLanguageClick }
237252 />
238253 < div >
239- < Tooltip title = { codeOpen ? 'Hide the source' : 'Show the source' } placement = "top" >
254+ < Tooltip
255+ key = { showSourceHint }
256+ open = { showSourceHint ? true : undefined }
257+ title = { codeOpen ? 'Hide the source' : 'Show the source' }
258+ placement = "top"
259+ >
240260 < IconButton
241261 data-ga-event-category = { category }
242262 data-ga-event-action = "expand"
243263 onClick = { this . handleClickCodeOpen }
244264 aria-label = { codeOpen ? 'Hide the source' : 'Show the source' }
265+ color = { demoHovered ? 'primary' : 'default' }
245266 >
246267 < CodeIcon />
247268 </ IconButton >
@@ -324,14 +345,12 @@ class Demo extends React.Component {
324345 className = { clsx ( classes . demo , {
325346 [ classes . demoHiddenHeader ] : demoOptions . hideHeader ,
326347 } ) }
348+ onMouseEnter = { this . handleDemoHover }
349+ onMouseLeave = { this . handleDemoHover }
327350 >
328- { demoOptions . iframe ? (
329- < DemoFrame >
330- < DemoComponent />
331- </ DemoFrame >
332- ) : (
351+ < Frame >
333352 < DemoComponent />
334- ) }
353+ </ Frame >
335354 </ div >
336355 </ div >
337356 ) ;
0 commit comments