Skip to content

Commit 7749361

Browse files
authored
Scroll snippets into view in docs (microsoft#6844)
* when appending snippet (or removing), scroll into view * oh also scroll sim into view * cleanup, sanity null check
1 parent 4d981d5 commit 7749361

1 file changed

Lines changed: 27 additions & 8 deletions

File tree

pxtrunner/renderer.ts

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)