@@ -244,16 +244,19 @@ namespace pxt.runner {
244244 if ( woptions . run && ! theme . hideDocsSimulator ) {
245245 let $runBtn = snippetBtn ( lf ( "Run" ) , "play icon" ) . click ( ( ) => {
246246 pxt . tickEvent ( "docs.btn" , { button : "sim" } ) ;
247- if ( $c . find ( '.sim' ) [ 0 ] )
247+ if ( $c . find ( '.sim' ) [ 0 ] ) {
248248 $c . find ( '.sim' ) . remove ( ) ; // remove previous simulators
249- else {
249+ scrollJQueryIntoView ( $c ) ;
250+ } else {
250251 let padding = '81.97%' ;
251252 if ( pxt . appTarget . simulator ) padding = ( 100 / pxt . appTarget . simulator . aspectRatio ) + '%' ;
252253 const deps = options . package ? "&deps=" + encodeURIComponent ( options . package ) : "" ;
253254 const url = getRunUrl ( options ) + "#nofooter=1" + deps ;
254255 const data = encodeURIComponent ( $js . text ( ) ) ;
255256 let $embed = $ ( `<div class="ui card sim"><div class="ui content"><div style="position:relative;height:0;padding-bottom:${ padding } ;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="${ url } " data-code="${ data } " allowfullscreen="allowfullscreen" sandbox="allow-popups allow-forms allow-scripts allow-same-origin" frameborder="0"></iframe></div></div></div>` ) ;
256257 $c . append ( $embed ) ;
258+
259+ scrollJQueryIntoView ( $embed ) ;
257260 }
258261 } )
259262 $menu . append ( $runBtn ) ;
@@ -280,11 +283,14 @@ namespace pxt.runner {
280283 if ( ! $svg ) return ;
281284 const $svgBtn = snippetBtn ( lf ( "Blocks" ) , BLOCKS_ICON ) . click ( ( ) => {
282285 pxt . tickEvent ( "docs.btn" , { button : "blocks" } ) ;
283- if ( $c . find ( '.blocks' ) [ 0 ] )
286+ if ( $c . find ( '.blocks' ) [ 0 ] ) {
284287 $c . find ( '.blocks' ) . remove ( ) ;
285- else {
288+ scrollJQueryIntoView ( $c ) ;
289+ } else {
286290 if ( $js ) appendBlocks ( $js . parent ( ) , $svg ) ;
287291 else appendBlocks ( $c , $svg ) ;
292+
293+ scrollJQueryIntoView ( $svg ) ;
288294 }
289295 } )
290296 $menu . append ( $svgBtn ) ;
@@ -297,11 +303,14 @@ namespace pxt.runner {
297303 else {
298304 const $jsBtn = snippetBtn ( "JavaScript" , JS_ICON ) . click ( ( ) => {
299305 pxt . tickEvent ( "docs.btn" , { button : "js" } ) ;
300- if ( $c . find ( '.js' ) [ 0 ] )
306+ if ( $c . find ( '.js' ) [ 0 ] ) {
301307 $c . find ( '.js' ) . remove ( ) ;
302- else {
308+ scrollJQueryIntoView ( $c ) ;
309+ } else {
303310 if ( $svg ) appendJs ( $svg . parent ( ) , $js , woptions ) ;
304311 else appendJs ( $c , $js , woptions ) ;
312+
313+ scrollJQueryIntoView ( $js ) ;
305314 }
306315 } )
307316 $menu . append ( $jsBtn ) ;
@@ -315,16 +324,26 @@ namespace pxt.runner {
315324 } else {
316325 const $pyBtn = snippetBtn ( "Python" , PY_ICON ) . click ( ( ) => {
317326 pxt . tickEvent ( "docs.btn" , { button : "py" } ) ;
318- if ( $c . find ( '.py' ) [ 0 ] )
327+ if ( $c . find ( '.py' ) [ 0 ] ) {
319328 $c . find ( '.py' ) . remove ( ) ;
320- else {
329+ scrollJQueryIntoView ( $c ) ;
330+ } else {
321331 if ( $svg ) appendPy ( $svg . parent ( ) , $py , woptions ) ;
322332 else appendPy ( $c , $py , woptions ) ;
333+
334+ scrollJQueryIntoView ( $py ) ;
323335 }
324336 } )
325337 $menu . append ( $pyBtn ) ;
326338 }
327339 }
340+
341+ function scrollJQueryIntoView ( $toScrollTo : JQuery < HTMLElement > ) {
342+ $toScrollTo [ 0 ] ?. scrollIntoView ( {
343+ behavior : "smooth" ,
344+ block : "center"
345+ } ) ;
346+ }
328347 }
329348
330349 let renderQueue : {
0 commit comments