From 770215f3a6a0fbf72e459fe2bcc74bd1843c097e Mon Sep 17 00:00:00 2001 From: Shogun Date: Tue, 1 Mar 2022 11:20:58 +0100 Subject: [PATCH 1/7] doc: make header smaller and dropdown click-driven when JS is on --- doc/api_assets/README.md | 4 ++ doc/api_assets/api.js | 87 ++++++++++++++++++++++++++++++++++++++++ doc/api_assets/style.css | 40 +++++++++++++++--- doc/template.html | 38 +----------------- 4 files changed, 128 insertions(+), 41 deletions(-) create mode 100644 doc/api_assets/api.js diff --git a/doc/api_assets/README.md b/doc/api_assets/README.md index 07262bba4ce01a..e2c1d90cd0953f 100644 --- a/doc/api_assets/README.md +++ b/doc/api_assets/README.md @@ -1,5 +1,9 @@ # API Reference Document Assets +## api.js + +The main script for API reference documents. + ## hljs.css The syntax theme for code snippets in API reference documents. diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js new file mode 100644 index 00000000000000..9d6e8aa02dfc36 --- /dev/null +++ b/doc/api_assets/api.js @@ -0,0 +1,87 @@ +'use strict'; + +// Check if we have Javascript support +document.querySelector(':root').classList.add('has-js'); + +// Restore user mode preferences +const kCustomPreference = 'customDarkTheme'; +const userSettings = sessionStorage.getItem(kCustomPreference); +const themeToggleButton = document.getElementById('theme-toggle-btn'); +if (userSettings === null && window.matchMedia) { + const mq = window.matchMedia('(prefers-color-scheme: dark)'); + if ('onchange' in mq) { + function mqChangeListener(e) { + document.documentElement.classList.toggle('dark-mode', e.matches); + } + mq.addEventListener('change', mqChangeListener); + if (themeToggleButton) { + themeToggleButton.addEventListener('click', function() { + mq.removeEventListener('change', mqChangeListener); + }, { once: true }); + } + } + if (mq.matches) { + document.documentElement.classList.add('dark-mode'); + } +} else if (userSettings === 'true') { + document.documentElement.classList.add('dark-mode'); +} +if (themeToggleButton) { + themeToggleButton.hidden = false; + themeToggleButton.addEventListener('click', function() { + sessionStorage.setItem( + kCustomPreference, + document.documentElement.classList.toggle('dark-mode') + ); + }); +} + +// Handle pickers with click/taps rather than hovers +const pickers = document.querySelectorAll('.picker-header'); +for(const picker of pickers) { + picker.addEventListener('click', e => { + if (!e.target.closest('.picker')) { + e.preventDefault(); + } + + if (picker.classList.contains('expanded')) { + picker.classList.remove('expanded'); + } else { + for (const other of pickers) { + other.classList.remove('expanded'); + } + + picker.classList.add('expanded'); + } + }); +} + +// Track when the header is in sticky position +const header = document.querySelector(".header"); +let ignoreNextIntersection = false; +new IntersectionObserver( + ([e]) => { + const currentStatus = header.classList.contains('is-pinned'); + const newStatus = e.intersectionRatio < 1; + + // Same status, do nothing + if(currentStatus === newStatus) { + return; + } else if(ignoreNextIntersection) { + ignoreNextIntersection = false; + return; + } + + /* + To avoid flickering, ignore the next change event that is triggered + as the visible elements in the header change once we pin it. + + The timer is reset anyway after few milliseconds + */ + ignoreNextIntersection = true; + setTimeout(() => ignoreNextIntersection = false, 50); + + header.classList.toggle('is-pinned', newStatus); + }, + { threshold: [1] } +).observe(header); \ No newline at end of file diff --git a/doc/api_assets/style.css b/doc/api_assets/style.css index fa12c02ce7dfbb..4a64160edd20df 100644 --- a/doc/api_assets/style.css +++ b/doc/api_assets/style.css @@ -189,19 +189,23 @@ li.picker-header .expanded-arrow { display: none; } -li.picker-header:hover .collapsed-arrow { +li.picker-header.expanded .collapsed-arrow, +:root:not(.has-js) li.picker-header:hover .collapsed-arrow { display: none; } -li.picker-header:hover .expanded-arrow { +li.picker-header.expanded .expanded-arrow, +:root:not(.has-js) li.picker-header:hover .expanded-arrow { display: inline-block; } -li.picker-header:hover > a { +li.picker-header.expanded > a, +:root:not(.has-js) li.picker-header:hover > a { border-radius: 2px 2px 0 0; } -li.picker-header:hover > .picker { +li.picker-header.expanded > .picker, +:root:not(.has-js) li.picker-header:hover > .picker { display: block; z-index: 1; } @@ -807,13 +811,31 @@ kbd { background-color: var(--color-fill-app); } -@media not screen, (max-height: 1000px) { +@media not screen, (max-width: 600px), (max-height: 1000px) { .header { position: relative; top: 0; } } +.header .pinned-header { + display: none; + margin-right: 0.4rem; + font-weight: 700; +} + +.header.is-pinned .header-container { + display: none; +} + +.header.is-pinned .pinned-header { + display: inline; +} + +.header.is-pinned #gtoc { + margin: 0; +} + .header-container { display: flex; align-items: center; @@ -845,6 +867,14 @@ kbd { padding-right: 0; } + .header #gtoc > ul > li.pinned-header { + display: none; + } + + .header.is-pinned #gtoc > ul > li.pinned-header { + display: inline; + } + #gtoc > ul > li.gtoc-picker-header { display: none; } diff --git a/doc/template.html b/doc/template.html index 89dd2fbeac9e01..a65e51d9d46bae 100644 --- a/doc/template.html +++ b/doc/template.html @@ -39,6 +39,7 @@

Node.js __VERSION__ documentation

- + From e94673a376d18ecd1780175a7736965b1b4ba057 Mon Sep 17 00:00:00 2001 From: Shogun Date: Wed, 2 Mar 2022 14:18:26 +0100 Subject: [PATCH 2/7] doc: add assets JS to the linting list --- .eslintignore | 1 + doc/api_assets/api.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.eslintignore b/.eslintignore index 8ab4750abd1685..5941496e1a6280 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,4 +7,5 @@ tools/icu tools/lint-md/lint-md.mjs benchmark/tmp doc/**/*.js +!doc/api_assets/*.js !.eslintrc.js diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js index 9d6e8aa02dfc36..1816f7b2c79ce4 100644 --- a/doc/api_assets/api.js +++ b/doc/api_assets/api.js @@ -1,6 +1,6 @@ 'use strict'; - -// Check if we have Javascript support + +// Check if we have JavaScript support document.querySelector(':root').classList.add('has-js'); // Restore user mode preferences @@ -38,8 +38,8 @@ if (themeToggleButton) { // Handle pickers with click/taps rather than hovers const pickers = document.querySelectorAll('.picker-header'); -for(const picker of pickers) { - picker.addEventListener('click', e => { +for (const picker of pickers) { + picker.addEventListener('click', (e) => { if (!e.target.closest('.picker')) { e.preventDefault(); } @@ -57,7 +57,7 @@ for(const picker of pickers) { } // Track when the header is in sticky position -const header = document.querySelector(".header"); +const header = document.querySelector('.header'); let ignoreNextIntersection = false; new IntersectionObserver( ([e]) => { @@ -65,9 +65,9 @@ new IntersectionObserver( const newStatus = e.intersectionRatio < 1; // Same status, do nothing - if(currentStatus === newStatus) { + if (currentStatus === newStatus) { return; - } else if(ignoreNextIntersection) { + } else if (ignoreNextIntersection) { ignoreNextIntersection = false; return; } @@ -84,4 +84,4 @@ new IntersectionObserver( header.classList.toggle('is-pinned', newStatus); }, { threshold: [1] } -).observe(header); \ No newline at end of file +).observe(header); From 3eae4bc9e05827b45f36cacc9be43d317c4eb24c Mon Sep 17 00:00:00 2001 From: Shogun Date: Fri, 18 Mar 2022 12:36:55 +0100 Subject: [PATCH 3/7] doc: refactored api script --- doc/api_assets/api.js | 182 ++++++++++++++++++++++++--------------- doc/api_assets/style.css | 9 +- 2 files changed, 121 insertions(+), 70 deletions(-) diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js index 1816f7b2c79ce4..546722cd908ce7 100644 --- a/doc/api_assets/api.js +++ b/doc/api_assets/api.js @@ -1,87 +1,131 @@ 'use strict'; -// Check if we have JavaScript support -document.querySelector(':root').classList.add('has-js'); +function setupTheme() { + const kCustomPreference = 'customDarkTheme'; + const userSettings = sessionStorage.getItem(kCustomPreference); + const themeToggleButton = document.getElementById('theme-toggle-btn'); -// Restore user mode preferences -const kCustomPreference = 'customDarkTheme'; -const userSettings = sessionStorage.getItem(kCustomPreference); -const themeToggleButton = document.getElementById('theme-toggle-btn'); -if (userSettings === null && window.matchMedia) { - const mq = window.matchMedia('(prefers-color-scheme: dark)'); - if ('onchange' in mq) { - function mqChangeListener(e) { - document.documentElement.classList.toggle('dark-mode', e.matches); + if (userSettings === null && window.matchMedia) { + const mq = window.matchMedia('(prefers-color-scheme: dark)'); + + if ('onchange' in mq) { + function mqChangeListener(e) { + document.documentElement.classList.toggle('dark-mode', e.matches); + } + mq.addEventListener('change', mqChangeListener); + if (themeToggleButton) { + themeToggleButton.addEventListener('click', function() { + mq.removeEventListener('change', mqChangeListener); + }, { once: true }); + } } - mq.addEventListener('change', mqChangeListener); - if (themeToggleButton) { - themeToggleButton.addEventListener('click', function() { - mq.removeEventListener('change', mqChangeListener); - }, { once: true }); + + if (mq.matches) { + document.documentElement.classList.add('dark-mode'); } - } - if (mq.matches) { + } else if (userSettings === 'true') { document.documentElement.classList.add('dark-mode'); } -} else if (userSettings === 'true') { - document.documentElement.classList.add('dark-mode'); -} -if (themeToggleButton) { - themeToggleButton.hidden = false; - themeToggleButton.addEventListener('click', function() { - sessionStorage.setItem( - kCustomPreference, - document.documentElement.classList.toggle('dark-mode') - ); - }); + + if (themeToggleButton) { + themeToggleButton.hidden = false; + themeToggleButton.addEventListener('click', function() { + sessionStorage.setItem( + kCustomPreference, + document.documentElement.classList.toggle('dark-mode') + ); + }); + } } -// Handle pickers with click/taps rather than hovers -const pickers = document.querySelectorAll('.picker-header'); -for (const picker of pickers) { - picker.addEventListener('click', (e) => { - if (!e.target.closest('.picker')) { - e.preventDefault(); +function setupPickers() { + function closeAllPickers() { + for (const picker of pickers) { + picker.parentNode.classList.remove('expanded'); } - if (picker.classList.contains('expanded')) { - picker.classList.remove('expanded'); - } else { - for (const other of pickers) { - other.classList.remove('expanded'); - } + window.removeEventListener('click', closeAllPickers); + window.removeEventListener('keydown', onKeyDown); + } - picker.classList.add('expanded'); + function onKeyDown(e) { + if (e.key === 'Escape') { + closeAllPickers(); } - }); + } + + const pickers = document.querySelectorAll('.picker-header > a'); + + for (const picker of pickers) { + const parentNode = picker.parentNode; + + picker.addEventListener('click', (e) => { + e.preventDefault(); + + /* + closeAllPickers as window event trigger already closed all the pickers, + if it already closed there is nothing else to do here + */ + if (parentNode.classList.contains('expanded')) { + return; + } + + /* + In the next frame reopen the picker if needed and also setup events + to close pickers if needed. + */ + + requestAnimationFrame(() => { + parentNode.classList.add('expanded'); + window.addEventListener('click', closeAllPickers); + window.addEventListener('keydown', onKeyDown); + }); + }); + } } -// Track when the header is in sticky position -const header = document.querySelector('.header'); -let ignoreNextIntersection = false; -new IntersectionObserver( - ([e]) => { - const currentStatus = header.classList.contains('is-pinned'); - const newStatus = e.intersectionRatio < 1; - - // Same status, do nothing - if (currentStatus === newStatus) { - return; - } else if (ignoreNextIntersection) { - ignoreNextIntersection = false; - return; - } +function setupStickyHeaders() { + const header = document.querySelector('.header'); + let ignoreNextIntersection = false; + + new IntersectionObserver( + ([e]) => { + const currentStatus = header.classList.contains('is-pinned'); + const newStatus = e.intersectionRatio < 1; + + // Same status, do nothing + if (currentStatus === newStatus) { + return; + } else if (ignoreNextIntersection) { + ignoreNextIntersection = false; + return; + } - /* - To avoid flickering, ignore the next change event that is triggered - as the visible elements in the header change once we pin it. + /* + To avoid flickering, ignore the next changes event that is triggered + as the visible elements in the header change once we pin it. - The timer is reset anyway after few milliseconds - */ - ignoreNextIntersection = true; - setTimeout(() => ignoreNextIntersection = false, 50); + The timer is reset anyway after few milliseconds. + */ + ignoreNextIntersection = true; + setTimeout(() => { + ignoreNextIntersection = false; + }, 50); - header.classList.toggle('is-pinned', newStatus); - }, - { threshold: [1] } -).observe(header); + header.classList.toggle('is-pinned', newStatus); + }, + { threshold: [1] } + ).observe(header); +} + +// Check if we have JavaScript support +document.querySelector(':root').classList.add('has-js'); + +// Restore user mode preferences +setupTheme(); + +// Handle pickers with click/taps rather than hovers +setupPickers(); + +// Track when the header is in sticky position +setupStickyHeaders(); diff --git a/doc/api_assets/style.css b/doc/api_assets/style.css index 4a64160edd20df..14302edc061a1d 100644 --- a/doc/api_assets/style.css +++ b/doc/api_assets/style.css @@ -811,13 +811,20 @@ kbd { background-color: var(--color-fill-app); } -@media not screen, (max-width: 600px), (max-height: 1000px) { +@media not screen, (max-width: 600px) { .header { position: relative; top: 0; } } +@media not screen, (max-height: 1000px) { + :root:not(.has-js) .header { + position: relative; + top: 0; + } +} + .header .pinned-header { display: none; margin-right: 0.4rem; From d7851521dcc3851ecae675aeb98ced3abb5e86d3 Mon Sep 17 00:00:00 2001 From: Shogun Date: Fri, 18 Mar 2022 17:58:55 +0100 Subject: [PATCH 4/7] doc: defer script loading --- doc/api_assets/api.js | 18 ++++++++++-------- doc/template.html | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js index 546722cd908ce7..3e7cf017f602ee 100644 --- a/doc/api_assets/api.js +++ b/doc/api_assets/api.js @@ -118,14 +118,16 @@ function setupStickyHeaders() { ).observe(header); } -// Check if we have JavaScript support -document.querySelector(':root').classList.add('has-js'); +document.addEventListener('DOMContentLoaded', function() { + // Check if we have JavaScript support + document.querySelector(':root').classList.add('has-js'); -// Restore user mode preferences -setupTheme(); + // Restore user mode preferences + setupTheme(); -// Handle pickers with click/taps rather than hovers -setupPickers(); + // Handle pickers with click/taps rather than hovers + setupPickers(); -// Track when the header is in sticky position -setupStickyHeaders(); + // Track when the header is in sticky position + setupStickyHeaders(); +}, { once: true }); diff --git a/doc/template.html b/doc/template.html index a65e51d9d46bae..94e2937dcaf897 100644 --- a/doc/template.html +++ b/doc/template.html @@ -74,6 +74,6 @@

Node.js __VERSION__ documentation

- + From 05c4fad99d8d56049aaa9e15b727dc6d239e6d61 Mon Sep 17 00:00:00 2001 From: Shogun Date: Fri, 18 Mar 2022 18:55:38 +0100 Subject: [PATCH 5/7] doc: defer script loading --- doc/api_assets/api.js | 10 ++++++++-- doc/template.html | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js index 3e7cf017f602ee..8a768cf8511e47 100644 --- a/doc/api_assets/api.js +++ b/doc/api_assets/api.js @@ -118,7 +118,7 @@ function setupStickyHeaders() { ).observe(header); } -document.addEventListener('DOMContentLoaded', function() { +function bootstrap() { // Check if we have JavaScript support document.querySelector(':root').classList.add('has-js'); @@ -130,4 +130,10 @@ document.addEventListener('DOMContentLoaded', function() { // Track when the header is in sticky position setupStickyHeaders(); -}, { once: true }); +} + +if (document.readyState === 'complete') { + bootstrap(); +} else { + document.addEventListener('DOMContentLoaded', bootstrap, { once: true }); +} diff --git a/doc/template.html b/doc/template.html index 94e2937dcaf897..86ba3c9581e004 100644 --- a/doc/template.html +++ b/doc/template.html @@ -9,6 +9,7 @@ +
@@ -74,6 +75,5 @@

Node.js __VERSION__ documentation

- From 5e2d37641b4b461e806b11c52f0ca0fc52689432 Mon Sep 17 00:00:00 2001 From: Shogun Date: Tue, 22 Mar 2022 07:57:41 +0100 Subject: [PATCH 6/7] doc: ensure scope to api assets --- doc/api_assets/api.js | 236 +++++++++++++++++++++--------------------- 1 file changed, 119 insertions(+), 117 deletions(-) diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js index 8a768cf8511e47..04a26167379140 100644 --- a/doc/api_assets/api.js +++ b/doc/api_assets/api.js @@ -1,139 +1,141 @@ 'use strict'; -function setupTheme() { - const kCustomPreference = 'customDarkTheme'; - const userSettings = sessionStorage.getItem(kCustomPreference); - const themeToggleButton = document.getElementById('theme-toggle-btn'); - - if (userSettings === null && window.matchMedia) { - const mq = window.matchMedia('(prefers-color-scheme: dark)'); - - if ('onchange' in mq) { - function mqChangeListener(e) { - document.documentElement.classList.toggle('dark-mode', e.matches); +{ + function setupTheme() { + const kCustomPreference = 'customDarkTheme'; + const userSettings = sessionStorage.getItem(kCustomPreference); + const themeToggleButton = document.getElementById('theme-toggle-btn'); + + if (userSettings === null && window.matchMedia) { + const mq = window.matchMedia('(prefers-color-scheme: dark)'); + + if ('onchange' in mq) { + function mqChangeListener(e) { + document.documentElement.classList.toggle('dark-mode', e.matches); + } + mq.addEventListener('change', mqChangeListener); + if (themeToggleButton) { + themeToggleButton.addEventListener('click', function() { + mq.removeEventListener('change', mqChangeListener); + }, { once: true }); + } } - mq.addEventListener('change', mqChangeListener); - if (themeToggleButton) { - themeToggleButton.addEventListener('click', function() { - mq.removeEventListener('change', mqChangeListener); - }, { once: true }); + + if (mq.matches) { + document.documentElement.classList.add('dark-mode'); } + } else if (userSettings === 'true') { + document.documentElement.classList.add('dark-mode'); } - if (mq.matches) { - document.documentElement.classList.add('dark-mode'); + if (themeToggleButton) { + themeToggleButton.hidden = false; + themeToggleButton.addEventListener('click', function() { + sessionStorage.setItem( + kCustomPreference, + document.documentElement.classList.toggle('dark-mode') + ); + }); } - } else if (userSettings === 'true') { - document.documentElement.classList.add('dark-mode'); } - if (themeToggleButton) { - themeToggleButton.hidden = false; - themeToggleButton.addEventListener('click', function() { - sessionStorage.setItem( - kCustomPreference, - document.documentElement.classList.toggle('dark-mode') - ); - }); - } -} + function setupPickers() { + function closeAllPickers() { + for (const picker of pickers) { + picker.parentNode.classList.remove('expanded'); + } -function setupPickers() { - function closeAllPickers() { - for (const picker of pickers) { - picker.parentNode.classList.remove('expanded'); + window.removeEventListener('click', closeAllPickers); + window.removeEventListener('keydown', onKeyDown); } - window.removeEventListener('click', closeAllPickers); - window.removeEventListener('keydown', onKeyDown); - } + function onKeyDown(e) { + if (e.key === 'Escape') { + closeAllPickers(); + } + } + + const pickers = document.querySelectorAll('.picker-header > a'); - function onKeyDown(e) { - if (e.key === 'Escape') { - closeAllPickers(); + for (const picker of pickers) { + const parentNode = picker.parentNode; + + picker.addEventListener('click', (e) => { + e.preventDefault(); + + /* + closeAllPickers as window event trigger already closed all the pickers, + if it already closed there is nothing else to do here + */ + if (parentNode.classList.contains('expanded')) { + return; + } + + /* + In the next frame reopen the picker if needed and also setup events + to close pickers if needed. + */ + + requestAnimationFrame(() => { + parentNode.classList.add('expanded'); + window.addEventListener('click', closeAllPickers); + window.addEventListener('keydown', onKeyDown); + }); + }); } } - const pickers = document.querySelectorAll('.picker-header > a'); - - for (const picker of pickers) { - const parentNode = picker.parentNode; + function setupStickyHeaders() { + const header = document.querySelector('.header'); + let ignoreNextIntersection = false; + + new IntersectionObserver( + ([e]) => { + const currentStatus = header.classList.contains('is-pinned'); + const newStatus = e.intersectionRatio < 1; + + // Same status, do nothing + if (currentStatus === newStatus) { + return; + } else if (ignoreNextIntersection) { + ignoreNextIntersection = false; + return; + } + + /* + To avoid flickering, ignore the next changes event that is triggered + as the visible elements in the header change once we pin it. + + The timer is reset anyway after few milliseconds. + */ + ignoreNextIntersection = true; + setTimeout(() => { + ignoreNextIntersection = false; + }, 50); + + header.classList.toggle('is-pinned', newStatus); + }, + { threshold: [1] } + ).observe(header); + } - picker.addEventListener('click', (e) => { - e.preventDefault(); + function bootstrap() { + // Check if we have JavaScript support + document.documentElement.classList.add('has-js'); - /* - closeAllPickers as window event trigger already closed all the pickers, - if it already closed there is nothing else to do here - */ - if (parentNode.classList.contains('expanded')) { - return; - } + // Restore user mode preferences + setupTheme(); - /* - In the next frame reopen the picker if needed and also setup events - to close pickers if needed. - */ + // Handle pickers with click/taps rather than hovers + setupPickers(); - requestAnimationFrame(() => { - parentNode.classList.add('expanded'); - window.addEventListener('click', closeAllPickers); - window.addEventListener('keydown', onKeyDown); - }); - }); + // Track when the header is in sticky position + setupStickyHeaders(); } -} - -function setupStickyHeaders() { - const header = document.querySelector('.header'); - let ignoreNextIntersection = false; - - new IntersectionObserver( - ([e]) => { - const currentStatus = header.classList.contains('is-pinned'); - const newStatus = e.intersectionRatio < 1; - - // Same status, do nothing - if (currentStatus === newStatus) { - return; - } else if (ignoreNextIntersection) { - ignoreNextIntersection = false; - return; - } - /* - To avoid flickering, ignore the next changes event that is triggered - as the visible elements in the header change once we pin it. - - The timer is reset anyway after few milliseconds. - */ - ignoreNextIntersection = true; - setTimeout(() => { - ignoreNextIntersection = false; - }, 50); - - header.classList.toggle('is-pinned', newStatus); - }, - { threshold: [1] } - ).observe(header); -} - -function bootstrap() { - // Check if we have JavaScript support - document.querySelector(':root').classList.add('has-js'); - - // Restore user mode preferences - setupTheme(); - - // Handle pickers with click/taps rather than hovers - setupPickers(); - - // Track when the header is in sticky position - setupStickyHeaders(); -} - -if (document.readyState === 'complete') { - bootstrap(); -} else { - document.addEventListener('DOMContentLoaded', bootstrap, { once: true }); -} + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', bootstrap, { once: true }); + } else { + bootstrap(); + } +} \ No newline at end of file From 72a2aef7af41dadddcc015ca1340bca18529e320 Mon Sep 17 00:00:00 2001 From: Shogun Date: Tue, 22 Mar 2022 08:06:13 +0100 Subject: [PATCH 7/7] doc: linted code --- doc/api_assets/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js index 04a26167379140..4304a254600da8 100644 --- a/doc/api_assets/api.js +++ b/doc/api_assets/api.js @@ -138,4 +138,4 @@ } else { bootstrap(); } -} \ No newline at end of file +}