import $ from 'jquery'; function initialize() { var codeBlockSelector = '.article--content pre'; var codeBlocks = $(codeBlockSelector); var appendHTML = `
`; // Wrap all codeblocks with a new 'codeblock' div $(codeBlocks).each(function () { $(this).wrap("
"); }); // Append code controls to all codeblock divs $('.codeblock').append(appendHTML); //////////////////////////// CODE CONTROLS TOGGLING //////////////////////////// // Click outside of the code-controls to close them $(document).click(function () { $('.code-controls').removeClass('open'); }); // Click the code controls toggle to open code controls $('.code-controls-toggle').click(function () { $(this).parent('.code-controls').toggleClass('open'); }); // Stop event propagation for clicks inside of the code-controls div $('.code-controls').click(function (e) { e.stopPropagation(); }); /////////////////////////////// COPY TO CLIPBOARD ////////////////////////////// // Update button text during lifecycles function updateText(element, currentText, newText) { let inner = element[0].innerHTML; inner = inner.replace(currentText, newText); element[0].innerHTML = inner; } // Trigger copy success state lifecycle function copyLifeCycle(element, state) { let stateData = state === 'success' ? { state: 'success', message: 'Copied!' } : { state: 'failed', message: 'Copy failed!' }; updateText(element, 'Copy', stateData.message); element.addClass(stateData.state); setTimeout(function () { updateText(element, stateData.message, 'Copy'); element.removeClass(stateData.state); }, 2500); } // Trigger copy failure state lifecycle $('.copy-code').click(function () { let text = $(this).closest('.code-controls').prev('pre')[0].innerText; const copyContent = async () => { try { await navigator.clipboard.writeText(text); copyLifeCycle($(this), 'success'); } catch { copyLifeCycle($(this), 'failed'); } }; copyContent(); }); /////////////////////////////// FULL WINDOW CODE /////////////////////////////// /* On click, open the fullscreen code modal and append a clone of the selected codeblock. Disable scrolling on the body. Disable user selection on everything but the fullscreen codeblock. */ $('.fullscreen-toggle').click(function () { var code = $(this).closest('.code-controls').prev('pre').clone(); $('#fullscreen-code-placeholder').replaceWith(code[0]); $('body').css('overflow', 'hidden'); $('body > div:not(.fullscreen-code)').css('user-select', 'none'); $('.fullscreen-code').fadeIn(); }); /* On click, close the fullscreen code block. Reenable scrolling on the body. Reenable user selection on everything. Close the modal and replace the code block with the placeholder element. */ $('.fullscreen-close').click(function () { $('body').css('overflow', 'auto'); $('body > div:not(.fullscreen-code)').css('user-select', ''); $('.fullscreen-code').fadeOut(); $('.fullscreen-code pre').replaceWith( '
' ); }); } export { initialize };