-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlanguage-selector.js
More file actions
126 lines (107 loc) · 3.24 KB
/
Copy pathlanguage-selector.js
File metadata and controls
126 lines (107 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
(function () {
var SLOT_ID = "sdk-language-selector-slot";
var SDK_PATH_PREFIX = "/celesto-sdk/";
var SDK_LANGUAGE_SELECTOR_PATHS = {
"/celesto-sdk/overview": true,
"/celesto-sdk/quickstart": true,
"/celesto-sdk/authentication": true,
"/celesto-sdk/computers": true,
"/celesto-sdk/errors": true,
};
var scheduled = false;
function shouldPromote() {
var pathname = window.location.pathname.replace(/\/$/, "");
return (
pathname.indexOf(SDK_PATH_PREFIX) === 0 &&
SDK_LANGUAGE_SELECTOR_PATHS[pathname] === true
);
}
function isResponsiveDuplicate(dropdown) {
return dropdown.className.indexOf("xl:hidden") !== -1;
}
function getDropdown(slot) {
var dropdowns = Array.prototype.slice.call(
document.querySelectorAll("#multi-view-dropdown")
);
var promoted = dropdowns.find(function (dropdown) {
return dropdown.parentNode === slot && !isResponsiveDuplicate(dropdown);
});
if (promoted) {
return promoted;
}
return (
dropdowns.find(function (dropdown) {
return dropdown.parentNode !== slot && !isResponsiveDuplicate(dropdown);
}) ||
dropdowns.find(function (dropdown) {
return dropdown.parentNode !== slot;
})
);
}
function hideExtraDropdowns(promotedDropdown) {
Array.prototype.slice
.call(document.querySelectorAll("#multi-view-dropdown"))
.forEach(function (dropdown) {
if (dropdown !== promotedDropdown) {
dropdown.setAttribute("data-sdk-language-selector-extra", "true");
} else {
dropdown.removeAttribute("data-sdk-language-selector-extra");
}
});
}
function getOrCreateSlot(header, content) {
var slot = document.getElementById(SLOT_ID);
if (slot) {
return slot;
}
slot = document.createElement("section");
slot.id = SLOT_ID;
slot.setAttribute("aria-label", "SDK language selector");
header.parentNode.insertBefore(slot, content);
return slot;
}
function removeSlot() {
var slot = document.getElementById(SLOT_ID);
if (slot && !slot.querySelector("#multi-view-dropdown")) {
slot.remove();
}
}
function promoteLanguageSelector() {
scheduled = false;
if (!shouldPromote()) {
removeSlot();
return;
}
var header = document.querySelector("#header");
var content = document.querySelector("#content");
if (!header || !content || !header.parentNode) {
return;
}
var existingSlot = document.getElementById(SLOT_ID);
var dropdown = getDropdown(existingSlot);
if (!dropdown) {
removeSlot();
return;
}
var slot = existingSlot || getOrCreateSlot(header, content);
if (dropdown.parentNode !== slot) {
slot.appendChild(dropdown);
}
hideExtraDropdowns(dropdown);
}
function schedulePromotion() {
if (scheduled) {
return;
}
scheduled = true;
window.requestAnimationFrame(promoteLanguageSelector);
}
schedulePromotion();
window.addEventListener("load", schedulePromotion);
window.addEventListener("popstate", schedulePromotion);
var observer = new MutationObserver(schedulePromotion);
observer.observe(document.documentElement, {
childList: true,
subtree: true,
});
})();