Skip to content

Commit f0474ab

Browse files
committed
Versions switcher
1 parent 5b0ed5d commit f0474ab

File tree

4 files changed

+95
-7
lines changed

4 files changed

+95
-7
lines changed

web/scripts/build.mjs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,28 @@ async function buildMenuForVersion(version) {
7070
}
7171
}
7272

73+
async function buildVersionsMenuList(versions, currentVersion) {
74+
let versionsMenuHtml = '';
75+
76+
versionsMenuHtml += '<div class="dropdown-block">';
77+
for (const v of versions) {
78+
if (v === currentVersion) {
79+
versionsMenuHtml += `<a href="/${v}/docs/" class="active">${v}</a>`;
80+
} else {
81+
versionsMenuHtml += `<a href="/${v}/docs/">${v}</a>`;
82+
}
83+
}
84+
versionsMenuHtml += '</div>';
85+
86+
return versionsMenuHtml;
87+
}
88+
89+
async function buildVersionMenu(versions, currentVersion) {
90+
const innerMenu = await buildVersionsMenuList(versions, currentVersion);
91+
92+
return `<div class="dropdown versions-menu"><a href="#" class="current">${currentVersion}</a>${innerMenu}</div>`;
93+
}
94+
7395
async function build() {
7496
const template = await fs.readFile(templatePath, 'utf-8');
7597
let docsMenu = '';
@@ -100,7 +122,6 @@ async function build() {
100122

101123
const mdFiles = await getAllMdFiles(docsDir);
102124
const base = branch ? `/branches/${branch}/` : '/';
103-
let prevVersion = null;
104125
// const base = '/core-js-v4/web/dist/';
105126
const versions = [];
106127
for (const mdPath of mdFiles) {
@@ -111,20 +132,25 @@ async function build() {
111132
versions.push(defaultBranch);
112133
}
113134
}
135+
const uniqueVersions = [...new Set(versions)];
114136

137+
let prevVersion = null;
138+
let version = '';
139+
let versionsMenu = '';
115140
for (const i in mdFiles) {
116141
const mdPath = mdFiles[i];
117142
const mdContent = await fs.readFile(mdPath, 'utf-8');
118143
const content = mdContent.toString();
119144
const isDocs = mdPath.indexOf('/docs') !== -1;
120-
let version = '';
121145
let mobileDocsMenu = '';
122-
if (isDocs) {
146+
147+
if (version !== versions[i]) {
123148
prevVersion = version;
124149
version = versions[i];
125-
if (prevVersion !== version) {
126-
docsMenu = await buildMenuForVersion(version);
127-
}
150+
docsMenu = await buildMenuForVersion(version);
151+
versionsMenu = await buildVersionMenu(uniqueVersions, version);
152+
}
153+
if (isDocs) {
128154
mobileDocsMenu = docsMenu;
129155
}
130156
htmlFileName = mdPath.replace(docsDir, '').replace(/\.md$/i, '.html');
@@ -134,6 +160,8 @@ async function build() {
134160
let resultHtml = template.replace('{content}', `${htmlContent}`);
135161
resultHtml = resultHtml.replace('{docs-menu}', `${mobileDocsMenu}`);
136162
resultHtml = resultHtml.replace('{base}', `${base}`);
163+
resultHtml = resultHtml.replace('{versions-menu}', `${versionsMenu}`);
164+
resultHtml = resultHtml.replaceAll('{current-version}', version);
137165

138166
if (branch) {
139167
resultHtml = resultHtml.replaceAll('{default-version}', '.');

web/src/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
<div class="mobile-docs-menu">{docs-menu}</div>
2121
</div>
2222
<div class="menu-item"><a href="./sandbox.html">Sandbox</a></div>
23+
<div class="menu-item">
24+
{versions-menu}
25+
</div>
2326
<div class="socials">
2427
<div class="menu-item">
2528
<a href="https://github.com/zloirock/core-js/">

web/src/js/main.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ document.addEventListener('DOMContentLoaded', function(_event) {
1414
const menuSwitcher = document.getElementById('menu-switcher');
1515
const menuBackdrop = document.querySelectorAll(".menu .backdrop")[0];
1616
const menu = document.getElementsByClassName('menu')[0];
17-
const collapsibleTrigger = document.querySelectorAll(".collapsible > a")
17+
const collapsibleTrigger = document.querySelectorAll(".collapsible > a");
18+
const dropdownTriggers = document.querySelectorAll(".dropdown > a");
19+
const currentVersion = document.querySelector('.versions-menu a.current');
1820

1921
function toggleMenu() {
2022
if (menu.classList.contains('active')) {
@@ -38,7 +40,18 @@ document.addEventListener('DOMContentLoaded', function(_event) {
3840
e.preventDefault();
3941
this.parentElement.classList.toggle('active');
4042
});
43+
});
44+
45+
dropdownTriggers.forEach(el => {
46+
el.addEventListener('click', function(e) {
47+
e.preventDefault();
48+
this.parentElement.classList.toggle('active');
49+
})
4150
})
4251

52+
currentVersion.addEventListener('click', function(e) {
53+
e.preventDefault();
54+
});
55+
4356
hljs.highlightAll();
4457
});

web/src/scss/parts/header.scss

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,5 +189,49 @@ nav {
189189
padding-left: 1rem;
190190
}
191191
}
192+
193+
.dropdown {
194+
position: relative;
195+
196+
& > a::after {
197+
content: '';
198+
display: inline-block;
199+
width: 0;
200+
height: 0;
201+
margin: 2px 0 0 5px;
202+
vertical-align: middle;
203+
border: 5px solid transparent;
204+
border-top: 5px solid $link-color;
205+
}
206+
207+
.dropdown-block {
208+
display: none;
209+
210+
a {
211+
display: block;
212+
}
213+
}
214+
&.active {
215+
.dropdown-block {
216+
display: block;
217+
position: absolute;
218+
left: 0;
219+
border: 1px solid $border-color-light;
220+
padding: 0.5rem 1rem;
221+
border-radius: 0.5rem;
222+
background-color: $background-color;
223+
224+
@include media("min", "lg") {
225+
right: 0;
226+
left: auto;
227+
}
228+
229+
a.active {
230+
color: $link-color-hover;
231+
font-weight: 500;
232+
}
233+
}
234+
}
235+
}
192236
}
193237
}

0 commit comments

Comments
 (0)