kcc-gem-theme-original 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +142 -0
- data/_data/navigation.yml +154 -0
- data/_includes/accordion.html +36 -0
- data/_includes/accordion_path-sorting.html +29 -0
- data/_includes/body.html +5 -0
- data/_includes/breadcrumbs.html +44 -0
- data/_includes/card-section.html +26 -0
- data/_includes/chat-now.html +8 -0
- data/_includes/contacts-tan.html +94 -0
- data/_includes/contacts.html +96 -0
- data/_includes/document-head.html +25 -0
- data/_includes/emergency-alerts.html +29 -0
- data/_includes/foot.html +3 -0
- data/_includes/footer.html +193 -0
- data/_includes/hash/theme_hash.yml +1 -0
- data/_includes/hero-slider.html +36 -0
- data/_includes/nav-global.html +40 -0
- data/_includes/nav-local.html +34 -0
- data/_includes/nav-sub.html +19 -0
- data/_includes/preconnect.html +16 -0
- data/_includes/scripts/custom.html +4 -0
- data/_includes/scripts/google-api.html +2 -0
- data/_includes/scripts/google-noscript.html +9 -0
- data/_includes/scripts/google-tag.html +23 -0
- data/_includes/scripts/kcc-alerts.html +2 -0
- data/_includes/scripts/kcc-mega-nav.html +2 -0
- data/_includes/scripts/kcc-nav.html +2 -0
- data/_includes/scripts/kcc-theme-landing.html +2 -0
- data/_includes/scripts/kcc-theme.html +2 -0
- data/_includes/scripts/table-cdn.html +6 -0
- data/_includes/scripts/translate.html +11 -0
- data/_includes/scripts/vendor.html +8 -0
- data/_includes/styles/fonts.html +4 -0
- data/_includes/styles/main.html +6 -0
- data/_includes/styles/vendor.html +8 -0
- data/_includes/svg/check.html +11 -0
- data/_includes/svg/check_circle-24px.html +13 -0
- data/_includes/svg/email-24px.html +13 -0
- data/_includes/svg/goals.html +21 -0
- data/_includes/svg/kcc-copy.html +62 -0
- data/_includes/svg/kcc.html +65 -0
- data/_includes/svg/kcc.svg +59 -0
- data/_includes/svg/love.html +13 -0
- data/_includes/svg/place-24px.html +13 -0
- data/_includes/svg/save-money.html +26 -0
- data/_includes/tabbed-content.html +27 -0
- data/_includes/translate.html +3 -0
- data/_layouts/default.html +31 -0
- data/_layouts/markdown.html +13 -0
- data/_layouts/page.html +8 -0
- data/_layouts/sub-nav.html +6 -0
- data/assets/css/content.css +1 -0
- data/assets/css/main.css +1 -0
- data/assets/img/alert.svg +1 -0
- data/assets/img/arrow-right.svg +1 -0
- data/assets/img/arrow_right_alt.svg +1 -0
- data/assets/img/blank-contact.svg +1 -0
- data/assets/img/blue-next.svg +1 -0
- data/assets/img/blue-prev.svg +1 -0
- data/assets/img/dbl-next.svg +1 -0
- data/assets/img/dbl-next_mobile.svg +1 -0
- data/assets/img/dbl-prev.svg +1 -0
- data/assets/img/dbl-prev_mobile.svg +1 -0
- data/assets/img/facebook-f_white.svg +1 -0
- data/assets/img/facebook.svg +1 -0
- data/assets/img/heading-bg-underline-tan.png +0 -0
- data/assets/img/heading-bg-underline-transparent.png +0 -0
- data/assets/img/heading-bg-underline.png +0 -0
- data/assets/img/home.svg +8 -0
- data/assets/img/iccmc-logo_blue-transparent.png +0 -0
- data/assets/img/instagram-white.svg +1 -0
- data/assets/img/instagram.svg +1 -0
- data/assets/img/itransfer.png +0 -0
- data/assets/img/kankakee-community-college-blue.svg +1 -0
- data/assets/img/kankakee-community-college-word-logo.svg +1 -0
- data/assets/img/kcc-logo-inverse.svg +1 -0
- data/assets/img/kcc-logo-white.svg +1 -0
- data/assets/img/kcc-logo.svg +1 -0
- data/assets/img/kcc-placeholder-square.png +0 -0
- data/assets/img/kcc-placeholder.png +0 -0
- data/assets/img/kcc-text-logo-white.svg +1 -0
- data/assets/img/kcc-text-logo.svg +1 -0
- data/assets/img/keyboard_arrow_right.svg +1 -0
- data/assets/img/linkedin-white.svg +1 -0
- data/assets/img/linkedin.svg +1 -0
- data/assets/img/pause.svg +1 -0
- data/assets/img/pause_mobile.svg +1 -0
- data/assets/img/pinterest-p_white.svg +1 -0
- data/assets/img/pinterest.svg +1 -0
- data/assets/img/placeholder_16to9.jpg +0 -0
- data/assets/img/placeholder_4by3.jpg +0 -0
- data/assets/img/placeholder_square-1by1.jpg +0 -0
- data/assets/img/placeholder_square.jpg +0 -0
- data/assets/img/play.svg +1 -0
- data/assets/img/play_mobile.svg +1 -0
- data/assets/img/search.svg +1 -0
- data/assets/img/social-icon.svg +1 -0
- data/assets/img/twitter.svg +1 -0
- data/assets/img/video.svg +1 -0
- data/assets/img/volleyball.svg +1 -0
- data/assets/img/x-logo.svg +11 -0
- data/assets/img/x.svg +1 -0
- data/assets/img/xitter.svg +1 -0
- data/assets/img/youtube-white.svg +1 -0
- data/assets/img/youtube.svg +1 -0
- data/assets/img/yt-loading.png +0 -0
- data/assets/js/dist/102.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/13.197fcdd9ea9a90f7ba8e.bundle.js +2 -0
- data/assets/js/dist/13.197fcdd9ea9a90f7ba8e.bundle.js.LICENSE.txt +5 -0
- data/assets/js/dist/143.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/183.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/3.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/3.197fcdd9ea9a90f7ba8e.css +1 -0
- data/assets/js/dist/303.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/384.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/453.197fcdd9ea9a90f7ba8e.bundle.js +2 -0
- data/assets/js/dist/453.197fcdd9ea9a90f7ba8e.bundle.js.LICENSE.txt +5 -0
- data/assets/js/dist/635.197fcdd9ea9a90f7ba8e.bundle.js +2 -0
- data/assets/js/dist/635.197fcdd9ea9a90f7ba8e.bundle.js.LICENSE.txt +29 -0
- data/assets/js/dist/723.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/873.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/965.197fcdd9ea9a90f7ba8e.bundle.js +1 -0
- data/assets/js/dist/bootstrap.197fcdd9ea9a90f7ba8e.bundle.js +0 -0
- data/assets/js/dist/bootstrap.197fcdd9ea9a90f7ba8e.css +1 -0
- data/assets/js/dist/theme.197fcdd9ea9a90f7ba8e.bundle.js +2 -0
- data/assets/js/dist/theme.197fcdd9ea9a90f7ba8e.bundle.js.LICENSE.txt +47 -0
- data/assets/js/dist/theme.197fcdd9ea9a90f7ba8e.css +1 -0
- data/assets/js/nav/closeNavOnClick.js +22 -0
- data/assets/js/nav/highlightCurrentNav.js +44 -0
- data/assets/js/nav/moveSearchIcon.js +94 -0
- data/assets/js/nav/nav.js +13 -0
- data/assets/js/nav/searchToggleNav.js +46 -0
- data/assets/js/nav/toggleNavSearchDropdownOnWindowResize.js +52 -0
- data/assets/js/src/alerts.js +24 -0
- data/assets/js/src/all.js +83 -0
- data/assets/js/src/bootstrap.js +4 -0
- data/assets/js/src/cacheResponse.js +22 -0
- data/assets/js/src/campusAlertsSheetsAPI.js +53 -0
- data/assets/js/src/checkForPrefersReducedMotion.js +17 -0
- data/assets/js/src/contentHashLink.js +102 -0
- data/assets/js/src/createAlertsHtml.js +46 -0
- data/assets/js/src/footerDate.js +13 -0
- data/assets/js/src/getCachedResponse.js +37 -0
- data/assets/js/src/lazyLoad.js +13 -0
- data/assets/js/src/parseMarkdownToHTML.js +85 -0
- data/assets/js/src/sliders.js +81 -0
- data/assets/js/src/translate.js +62 -0
- data/assets/js/src/walkText.js +31 -0
- data/assets/js/src/wrapPowerText.js +11 -0
- data/assets/js/src/ytEmbed.js +30 -0
- data/assets/scss/0-tools/_bootstrap-overrides.scss +72 -0
- data/assets/scss/0-tools/_cloudcannon.scss +16 -0
- data/assets/scss/0-tools/_google-translate-overrides.scss +127 -0
- data/assets/scss/0-tools/_gsc-overrides.scss +144 -0
- data/assets/scss/0-tools/_vars.scss +72 -0
- data/assets/scss/1-base/_background.scss +5 -0
- data/assets/scss/1-base/_buttons.scss +121 -0
- data/assets/scss/1-base/_html.scss +4 -0
- data/assets/scss/1-base/_img.scss +12 -0
- data/assets/scss/1-base/_links.scss +126 -0
- data/assets/scss/1-base/_svg.scss +82 -0
- data/assets/scss/1-base/_typography.scss +640 -0
- data/assets/scss/2-modules/_accordion.scss +43 -0
- data/assets/scss/2-modules/_benefits.scss +371 -0
- data/assets/scss/2-modules/_breadcrumbs.scss +32 -0
- data/assets/scss/2-modules/_campus-alerts.scss +3 -0
- data/assets/scss/2-modules/_card-section.scss +9 -0
- data/assets/scss/2-modules/_contacts.scss +46 -0
- data/assets/scss/2-modules/_error.scss +10 -0
- data/assets/scss/2-modules/_footer.scss +122 -0
- data/assets/scss/2-modules/_header.scss +21 -0
- data/assets/scss/2-modules/_hero-slider.scss +331 -0
- data/assets/scss/2-modules/_img-hover.scss +70 -0
- data/assets/scss/2-modules/_loader.scss +9 -0
- data/assets/scss/2-modules/_nav-global.scss +315 -0
- data/assets/scss/2-modules/_nav-landing.scss +203 -0
- data/assets/scss/2-modules/_nav-local.scss +45 -0
- data/assets/scss/2-modules/_social-icons.scss +36 -0
- data/assets/scss/2-modules/_sub-nav.scss +32 -0
- data/assets/scss/2-modules/_yt-embed.scss +14 -0
- data/assets/scss/3-layout/_background.scss +3 -0
- data/assets/scss/3-layout/_content.scss +37 -0
- data/assets/scss/3-layout/_margins.scss +22 -0
- data/assets/scss/3-layout/_padding.scss +19 -0
- data/assets/scss/3-layout/_positioning.scss +343 -0
- data/assets/scss/3-layout/_section.scss +22 -0
- data/assets/scss/3-layout/_tables.scss +8 -0
- data/assets/scss/3-layout/_thank-you.scss +5 -0
- data/assets/scss/4-pages/index/_home.scss +15 -0
- data/assets/scss/bootstrap.scss +98 -0
- data/assets/scss/kcc-theme.scss +50 -0
- data/assets/scss/translate.scss +5 -0
- metadata +278 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
/*
|
2
|
+
// Custom JS | written by https://github.com/wdzajicek
|
3
|
+
// © 2020 Kankakee Community College
|
4
|
+
// =================================================== */
|
5
|
+
// Module to retrieve our cached Google Sheet response from sessionStorage
|
6
|
+
// 1. Create an object that replicates an API response where `response.result.values`
|
7
|
+
// is an array containing an array representing each row in the sheet.
|
8
|
+
// 2. Then we pass our mock-sheet response object to the `createAlertsHtml` module to
|
9
|
+
// build and inject the alert into the DOM.
|
10
|
+
import createAlertsHtml from './createAlertsHtml.js';
|
11
|
+
import contentHashLink from './contentHashLink.js';
|
12
|
+
const cache = window.sessionStorage;
|
13
|
+
|
14
|
+
function createCachedResponseObject(Collapse) {
|
15
|
+
let cachedResponse = { // Reconstructing our own Google Sheet-like response from the sessionStorage items
|
16
|
+
result: {
|
17
|
+
values: [
|
18
|
+
0, // First two rows aren't used by the `createAlertsHtml()` function
|
19
|
+
0,
|
20
|
+
[ cache.Visible, cache.getItem('All-Pages'), cache.getItem('Alert-Content'), cache.getItem('Alert-Expiration'), cache.Start, cache.End ]
|
21
|
+
]
|
22
|
+
}
|
23
|
+
}
|
24
|
+
createAlertsHtml(cachedResponse, Collapse);
|
25
|
+
contentHashLink(Collapse);
|
26
|
+
}
|
27
|
+
|
28
|
+
function getCachedResponse(Collapse) {
|
29
|
+
try {
|
30
|
+
createCachedResponseObject(Collapse);
|
31
|
+
} catch (error) {
|
32
|
+
contentHashLink(Collapse);
|
33
|
+
console.error(`Error retrieving cached response in sessionStorage:\nName: ${error.name}\nMessage: ${error.message}\n${error}`);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
export default getCachedResponse;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// Lazy load images
|
2
|
+
// ex. <img src="/path/to/small-placeholder_image.png" data-src="/path/to/actual_image.jpg" alt="You better not leave it blank">
|
3
|
+
function lazyLoad() {
|
4
|
+
const lazyLoadImages = document.querySelectorAll('img[data-src]');
|
5
|
+
|
6
|
+
[...lazyLoadImages].forEach(img => {
|
7
|
+
img.setAttribute('src', img.getAttribute('data-src'));
|
8
|
+
img.onload = function() {
|
9
|
+
img.removeAttribute('data-src');
|
10
|
+
};
|
11
|
+
});
|
12
|
+
}
|
13
|
+
export default lazyLoad;
|
@@ -0,0 +1,85 @@
|
|
1
|
+
const inlineMarkdownElementsObject = {
|
2
|
+
'strong': /\*\*([^\*]*)\*\*/g,
|
3
|
+
'em': /_([^_]*)_/g
|
4
|
+
}
|
5
|
+
|
6
|
+
function replaceRegex(string, regex, replacement) {
|
7
|
+
const newString = string.replace(regex, replacement);
|
8
|
+
return newString;
|
9
|
+
}
|
10
|
+
|
11
|
+
function escapeCharacters(string, escapeOption) {
|
12
|
+
const escapedCharactersObject = {
|
13
|
+
'\\*': '__asterisk__',
|
14
|
+
'\\_': '__underscore__',
|
15
|
+
'\\[': '__openBracket__',
|
16
|
+
'\\]': '__closeBracket__',
|
17
|
+
'\\(': '__openParenthesis__',
|
18
|
+
'\\)': '__closeParenthesis__'
|
19
|
+
}
|
20
|
+
|
21
|
+
for (let char in escapedCharactersObject) {
|
22
|
+
if (escapedCharactersObject.hasOwnProperty(char)) {
|
23
|
+
escapeOption === true ? string = replaceRegex(string, char, escapedCharactersObject[char])
|
24
|
+
: escapeOption === false ? string = replaceRegex(string, escapedCharactersObject[char], char.replace(/^\\/g, ''))
|
25
|
+
: null;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
return string;
|
29
|
+
}
|
30
|
+
|
31
|
+
function createAnchorElements(string) {
|
32
|
+
return string = string.replace(/\[(?<linkText>[^\]]*)\]\((?<linkHref>[^\)]*)\)/g, '<a href="$<linkHref>" target="_blank" rel="noopener noreferrer">$<linkText></a>');
|
33
|
+
}
|
34
|
+
|
35
|
+
function replacer(match, p1) {
|
36
|
+
if ( p1 === '' ) { // Filters out the '__' (double underscore) matches.
|
37
|
+
return match;
|
38
|
+
} else {
|
39
|
+
for (var el in inlineMarkdownElementsObject) {
|
40
|
+
if (inlineMarkdownElementsObject.hasOwnProperty(el)) {
|
41
|
+
match = match.replace(inlineMarkdownElementsObject[el], '<' + el + '>$1</' + el + '>' );
|
42
|
+
}
|
43
|
+
}
|
44
|
+
return match;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
function createInlineElements(string) {
|
49
|
+
for (var el in inlineMarkdownElementsObject) {
|
50
|
+
if (inlineMarkdownElementsObject.hasOwnProperty(el)) {
|
51
|
+
string = string.replace(inlineMarkdownElementsObject[el], replacer);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
return string;
|
55
|
+
}
|
56
|
+
|
57
|
+
function paragraphReplacer(match, p1) {
|
58
|
+
if ( p1 === '' ) { // Filters out blank lines
|
59
|
+
return match;
|
60
|
+
} else {
|
61
|
+
return match.replace(/^(.*)$/gm, '<p class="typography__alert">$1</p>');
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
function createParagraphElements(string) {
|
66
|
+
return string = string.replace(/^(.*)$/gm, paragraphReplacer);
|
67
|
+
}
|
68
|
+
|
69
|
+
function parseMarkdownToHTML(string) {
|
70
|
+
const escapedString = escapeCharacters(string, true);
|
71
|
+
const stringWithInlineElements = createInlineElements(escapedString);
|
72
|
+
const stringWithAnchorElements = createAnchorElements(stringWithInlineElements);
|
73
|
+
const stringWithParagraphElements = createParagraphElements(stringWithAnchorElements);
|
74
|
+
const unescapedString = escapeCharacters(stringWithParagraphElements, false);
|
75
|
+
//console.log(unescapedString);
|
76
|
+
return unescapedString;
|
77
|
+
}
|
78
|
+
|
79
|
+
//
|
80
|
+
// USAGE:
|
81
|
+
// import parseMarkdownToHTML from './parseMarkdownToHTML.js';
|
82
|
+
//
|
83
|
+
// parseMarkdownToHTML(stringContainingSimplifiedMarkdown);
|
84
|
+
|
85
|
+
export default parseMarkdownToHTML;
|
@@ -0,0 +1,81 @@
|
|
1
|
+
// Custom JS to initialize slick slider (https://github.com/kenwheeler/slick) and then build a play/pause toggle button
|
2
|
+
// Uses slick-specific methods & slick events. See slick events at: https://github.com/kenwheeler/slick/#events
|
3
|
+
const heroSliderClassName = '.hero-slider__slider'; // Our classname for the hero-slider's DOM parent
|
4
|
+
const SLICK_PLAY = 'slickPlay'; // Methods unique to slick
|
5
|
+
const SLICK_PAUSE = 'slickPause'; // Methods unique to slick
|
6
|
+
const SLICK_NEXT_SLIDE = 'slickNext'; // Methods unique to slick
|
7
|
+
const play = 'Play';
|
8
|
+
const pause = 'Pause';
|
9
|
+
// =============================================================================================== //
|
10
|
+
// TODO: //
|
11
|
+
// //
|
12
|
+
// Rewrite below prevArrow & nextArrow as <button> elements (like slick's default arrows). //
|
13
|
+
// //
|
14
|
+
// =============================================================================================== //
|
15
|
+
|
16
|
+
function initSlick() {
|
17
|
+
$(heroSliderClassName).slick({
|
18
|
+
dots: true,
|
19
|
+
slidesToShow: 1,
|
20
|
+
slidesToScroll: 1,
|
21
|
+
autoplay: true,
|
22
|
+
autoplaySpeed: 4000,
|
23
|
+
prevArrow:'<button type="button" data-role="none" class="prev slick-prev" aria-label="Previous" role="button" style="display: block;">Previous</button>', // TODO: change to <button> el
|
24
|
+
nextArrow:'<button type="button" data-role="none" class="next slick-next" aria-label="Next" role="button" style="display: block;">Next</button>' // TODO: change to <button> el
|
25
|
+
});
|
26
|
+
}
|
27
|
+
|
28
|
+
function setAttributeOnEl(el, attr, value) {
|
29
|
+
return el.setAttribute(attr, value);
|
30
|
+
}
|
31
|
+
|
32
|
+
function toggleSlickPlayState(el, slickState, newButtonText) {
|
33
|
+
const newButtonTextIsPause = newButtonText === pause;
|
34
|
+
|
35
|
+
$(heroSliderClassName).slick(slickState);
|
36
|
+
setAttributeOnEl(el, 'aria-label', newButtonText);
|
37
|
+
el.classList.toggle('hero-slider__button--play');
|
38
|
+
el.innerHTML = newButtonText;
|
39
|
+
|
40
|
+
newButtonTextIsPause ? $(heroSliderClassName).slick(SLICK_NEXT_SLIDE) : null;
|
41
|
+
}
|
42
|
+
|
43
|
+
function watchForElementClicks(el) {
|
44
|
+
el.addEventListener('click', function(e) {
|
45
|
+
let buttonTextIsPause = el.innerHTML === 'Pause';
|
46
|
+
|
47
|
+
buttonTextIsPause ? toggleSlickPlayState(el, SLICK_PAUSE, play) : toggleSlickPlayState(el, SLICK_PLAY, pause);
|
48
|
+
});
|
49
|
+
}
|
50
|
+
|
51
|
+
function createButton() {
|
52
|
+
const slickParent = document.querySelector(heroSliderClassName);
|
53
|
+
const button = document.createElement('button');
|
54
|
+
const initialButtonText = 'Pause';
|
55
|
+
|
56
|
+
setAttributeOnEl(button, 'role', 'button');
|
57
|
+
setAttributeOnEl(button, 'type', 'button');
|
58
|
+
setAttributeOnEl(button, 'aria-label', 'Pause');
|
59
|
+
setAttributeOnEl(button, 'style', 'display: block;');
|
60
|
+
button.innerHTML = initialButtonText;
|
61
|
+
button.classList.add('hero-slider__button--toggle');
|
62
|
+
slickParent.appendChild(button);
|
63
|
+
watchForElementClicks(button);
|
64
|
+
}
|
65
|
+
|
66
|
+
function watchForSlickInit(initFunction) {
|
67
|
+
// slick's on 'init' function (See events in slick docs):
|
68
|
+
$(heroSliderClassName).on('init', function(event, slick){ // According to slick doc's; you have to call a $(slick).on('init', function(){ //... }); before you initialize slick
|
69
|
+
createButton();
|
70
|
+
});
|
71
|
+
initFunction(); // Initializing slick after the above `.on('init', function() {})`
|
72
|
+
}
|
73
|
+
|
74
|
+
function initSliders() {
|
75
|
+
if ( ! document.querySelector(heroSliderClassName) )
|
76
|
+
return;
|
77
|
+
|
78
|
+
watchForSlickInit(initSlick);
|
79
|
+
}
|
80
|
+
|
81
|
+
export default initSliders;
|
@@ -0,0 +1,62 @@
|
|
1
|
+
const googleTranslateElement = document.getElementById('google_translate_element');
|
2
|
+
const styleConfigurationObject = { // Setting all the selectors & the styles they should get.
|
3
|
+
'div.VIpgJd-ZVi9od-vH1Gmf *': 'color: #544F4B; font-family: "Roboto", sans-serif; width: 100%;', // Change font fam and color!
|
4
|
+
'span.indicator': 'display: none;', // Change menu's padding
|
5
|
+
'div.VIpgJd-ZVi9od-vH1Gmf': 'overflow-y: scroll; padding: 0px;', // Change menu's padding
|
6
|
+
'div.VIpgJd-ZVi9od-vH1Gmf a div': 'padding: 20px; width: 100%;', // Change the padding of the languages
|
7
|
+
'.goog-te-menu2-item': 'width: 100%;', // Change the width of the languages
|
8
|
+
'td': 'width: 100%; display: block;', // Change the width of the languages
|
9
|
+
'td.VIpgJd-ZVi9od-vH1Gmf-KrhPNb': 'display: none;',
|
10
|
+
'.goog-te-menu2-colpad': 'display: none;', // Change the width of the languages
|
11
|
+
'div.VIpgJd-ZVi9od-vH1Gmf': 'border: none;', // Change Google's default blue border
|
12
|
+
'body': 'background-color: #fff; box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3);',
|
13
|
+
};
|
14
|
+
|
15
|
+
function styleIFrameElement(iframe, iframeStyles) {
|
16
|
+
const combinedStyles = iframe.style.cssText + iframeStyles;
|
17
|
+
|
18
|
+
iframe.style = combinedStyles;
|
19
|
+
}
|
20
|
+
|
21
|
+
function setStyles(selector, styles, iframeMenuElement) {
|
22
|
+
const content = iframeMenuElement.contentWindow;
|
23
|
+
const itemsToStyle = content.document.querySelectorAll(selector);
|
24
|
+
|
25
|
+
[...itemsToStyle].forEach(item => item.style = styles);
|
26
|
+
}
|
27
|
+
|
28
|
+
function translate() {
|
29
|
+
const iframeStyles = ' height: 100%; width: 100%; top: 0px; box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3);';
|
30
|
+
|
31
|
+
googleTranslateElement.addEventListener('click', _e => {
|
32
|
+
const iframeMenuElement = document.querySelector('iframe[title="Language Translate Widget"]');
|
33
|
+
|
34
|
+
// Use this log to find translate menu elements:
|
35
|
+
// console.log(iframeMenuElement.contentWindow.document.body);
|
36
|
+
|
37
|
+
// Target the anchor elements in the translate menu (language options)
|
38
|
+
const anchors = iframeMenuElement.contentWindow.document.body.querySelectorAll('.VIpgJd-ZVi9od-vH1Gmf a');
|
39
|
+
// Color the menu text white when an element is hovered:
|
40
|
+
[...anchors].forEach(a => {
|
41
|
+
a.addEventListener('mouseenter', () => {
|
42
|
+
if (a.querySelector('span.text').innerHTML !== 'Select Language') {
|
43
|
+
a.querySelector('span.text').style = 'color: #fff;';
|
44
|
+
}
|
45
|
+
})
|
46
|
+
a.addEventListener('mouseleave', () => {
|
47
|
+
if (a.querySelector('span.text').innerHTML !== 'Select Language') {
|
48
|
+
a.querySelector('span.text').style = 'color: #544F4B;';
|
49
|
+
}
|
50
|
+
})
|
51
|
+
});
|
52
|
+
|
53
|
+
styleIFrameElement(iframeMenuElement, iframeStyles);
|
54
|
+
|
55
|
+
Object.keys(styleConfigurationObject).forEach(selector => {
|
56
|
+
setStyles(selector, styleConfigurationObject[selector], iframeMenuElement);
|
57
|
+
});
|
58
|
+
|
59
|
+
}, false);
|
60
|
+
}
|
61
|
+
|
62
|
+
export default translate;
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// Replace all occurences of "--" (double-hyphens,) within the page's text-nodes, with em-dashes.
|
2
|
+
// Use a replacer function to omit any occurences of triple-hyphens which appear in our documentation.
|
3
|
+
// For example, YAML Front - matter's opening and closing triple-hyphens
|
4
|
+
// Without the replacer funciton, triple-hyphens get replaced with an em-dash and a hyphen.
|
5
|
+
const emDashOrTripleHyphensRegex = /\\?---?/g;
|
6
|
+
const tripleHyphenRegex = /---/;
|
7
|
+
const emDash = '—' // This is an em-dash, however, it looks like a hyphen in monospace text editor font!
|
8
|
+
|
9
|
+
// Without the replacer function, triple-hyphens get replaced with an em-dash and a hyphen.
|
10
|
+
function replacerFunction(match) {
|
11
|
+
return match.search(tripleHyphenRegex) === -1 ? emDash : match;
|
12
|
+
}
|
13
|
+
|
14
|
+
function walkText(root) {
|
15
|
+
let currentNode;
|
16
|
+
const nodeIterator = document.createNodeIterator(
|
17
|
+
root,
|
18
|
+
NodeFilter.SHOW_TEXT,
|
19
|
+
(node) => (node.nodeValue.search(emDashOrTripleHyphensRegex) !== -1) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT
|
20
|
+
);
|
21
|
+
|
22
|
+
while (currentNode = nodeIterator.nextNode()) {
|
23
|
+
currentNode.data = currentNode.data.replace(emDashOrTripleHyphensRegex, replacerFunction);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
// Note on usage: You don't need to necessarily traverse the entire document.body.
|
27
|
+
// Usage:
|
28
|
+
//
|
29
|
+
// walkText(document.body);
|
30
|
+
//
|
31
|
+
export default walkText;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
const slideHeadingList = document.querySelectorAll('.hero-slider__slider--slide-heading'); // Element from HTML
|
2
|
+
const regEx = /\*\*(\S+)\*\*/g;
|
3
|
+
const replacement = '<span class="typography__power-text">$1</span>';
|
4
|
+
|
5
|
+
function wrapPowerText() {
|
6
|
+
[...slideHeadingList].forEach(heading => {
|
7
|
+
heading.innerHTML = heading.innerHTML.replace(regEx, replacement);
|
8
|
+
})
|
9
|
+
}
|
10
|
+
|
11
|
+
export default wrapPowerText;
|
@@ -0,0 +1,30 @@
|
|
1
|
+
const ytEmbedParent = document.getElementById('yt-embed');
|
2
|
+
const videoId = ytEmbedParent.dataset.video;
|
3
|
+
//<iframe width="560" height="315" src="https://www.youtube.com/embed/LUCrx9chw-c" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
4
|
+
|
5
|
+
function setAttributes(el, arg, argVal) {
|
6
|
+
const argumentIsString = typeof arg == 'string';
|
7
|
+
|
8
|
+
if ( argumentIsString ) {
|
9
|
+
el.setAttribute(arg, argVal)
|
10
|
+
} else {
|
11
|
+
for (let i = 0, len = arg.length; i < len; i++) {
|
12
|
+
el.setAttribute(arg[i], argVal[i])
|
13
|
+
}
|
14
|
+
}
|
15
|
+
return el;
|
16
|
+
}
|
17
|
+
|
18
|
+
function ytEmbed() {
|
19
|
+
const iframe = document.createElement('iframe');
|
20
|
+
|
21
|
+
setAttributes(iframe, ['width', 'height', 'frameborder', 'allow', 'allowfullscreen'], ['560', '315', '0', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture', '']);
|
22
|
+
ytEmbedParent.appendChild(iframe);
|
23
|
+
setAttributes(iframe, 'src', 'https://www.youtube.com/embed/' + videoId + '?showinfo=0&rel=0');
|
24
|
+
iframe.onload = () => {
|
25
|
+
ytEmbedParent.removeChild(ytEmbedParent.querySelector('.yt-embed'));
|
26
|
+
}
|
27
|
+
|
28
|
+
}
|
29
|
+
|
30
|
+
export default ytEmbed;
|
@@ -0,0 +1,72 @@
|
|
1
|
+
// Overrides AND additions/extensions to Bootstrap 4's styling
|
2
|
+
|
3
|
+
.nav-tabs {
|
4
|
+
border-bottom: 1px solid $grey-5;
|
5
|
+
}
|
6
|
+
|
7
|
+
.nav-tabs .nav-link {
|
8
|
+
background-color: $grey-4;
|
9
|
+
border-left-color: $grey-2;
|
10
|
+
border-left-style: solid;
|
11
|
+
border-left-width: 1px;
|
12
|
+
border-right-color: $grey-2;
|
13
|
+
border-right-style: solid;
|
14
|
+
border-right-width: 1px;
|
15
|
+
border-top-color: $grey-2;
|
16
|
+
border-top-style: solid;
|
17
|
+
border-top-width: 1px;
|
18
|
+
border-bottom-color: $grey-5;
|
19
|
+
}
|
20
|
+
|
21
|
+
.nav-tabs .nav-link.active {
|
22
|
+
border-color: $grey-5 $grey-5 $white;
|
23
|
+
}
|
24
|
+
|
25
|
+
.navbar-brand {
|
26
|
+
margin-right: 0;
|
27
|
+
}
|
28
|
+
|
29
|
+
@media screen and (min-width: 768px) {
|
30
|
+
.navbar-brand {
|
31
|
+
margin-right: 1rem;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
.btn {
|
36
|
+
vertical-align: baseline; // Needed so Google Translate's injected <font> tags don't mess with font's alignment in the page
|
37
|
+
}
|
38
|
+
|
39
|
+
.modal-open .gsc-search-button {
|
40
|
+
margin-right: 15px;
|
41
|
+
}
|
42
|
+
|
43
|
+
// Modify the Bootstrap 4 dropdown menu's carot to give it an animated/interactice effect using pure CSS
|
44
|
+
// ======================================
|
45
|
+
// .dropdown-toggle::after controls the BS4 dropdown-menu carot symbol's display
|
46
|
+
@media screen and (max-width: 992px) {
|
47
|
+
.dropdown-toggle::after { // Set starting position & transition Fx
|
48
|
+
transform: rotate(0deg);
|
49
|
+
transition: transform 0.3s ease-in-out;
|
50
|
+
}
|
51
|
+
|
52
|
+
.nav-item.dropdown.show .dropdown-toggle::after { // Selectors that are only present when a dropdown is toggled to the open state.
|
53
|
+
transform: rotate(-180deg);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
.dropdown-toggle.btn::after { // Set starting position & transition Fx
|
58
|
+
transform: rotate(0deg);
|
59
|
+
transition: transform 0.3s ease-in-out;
|
60
|
+
}
|
61
|
+
|
62
|
+
.nav-item.dropdown.show .dropdown-toggle.btn::after { // Selectors that are only present when a dropdown is toggled to the open state.
|
63
|
+
transform: rotate(-180deg);
|
64
|
+
}
|
65
|
+
|
66
|
+
@media screen and (min-width: 992px) {
|
67
|
+
.dropdown-toggle:not(.btn)::after { // Set starting position & transition Fx
|
68
|
+
display: none;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
// End BS4 dropdown-menu carot modifications.
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// Specific classes for the CloudCannon editor/interface.
|
2
|
+
.editor-link {
|
3
|
+
display: none;
|
4
|
+
}
|
5
|
+
|
6
|
+
.cms-editor-active .editor-link {
|
7
|
+
display: block;
|
8
|
+
}
|
9
|
+
|
10
|
+
.editor-button {
|
11
|
+
display: none;
|
12
|
+
}
|
13
|
+
|
14
|
+
.cms-editor-active .editor-button {
|
15
|
+
display: inline-block;
|
16
|
+
}
|
@@ -0,0 +1,127 @@
|
|
1
|
+
// Custom styling for Google Translate
|
2
|
+
// ====================================================== //
|
3
|
+
|
4
|
+
// Top-most element of the Google Translate menu
|
5
|
+
#google_translate_element {
|
6
|
+
position: fixed;
|
7
|
+
bottom: .25rem;
|
8
|
+
right: .25rem!important;
|
9
|
+
z-index: 99999;
|
10
|
+
}
|
11
|
+
|
12
|
+
// First child of translate element
|
13
|
+
.goog-te-gadget {
|
14
|
+
font-family: Roboto, 'Open Sans', sans-serif!important;
|
15
|
+
text-transform: uppercase;
|
16
|
+
font-weight: 500;
|
17
|
+
&:hover {
|
18
|
+
color: $white;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
// Second child of translate element
|
23
|
+
.goog-te-gadget-simple {
|
24
|
+
background-color: rgba(255,255,255,0.85)!important;
|
25
|
+
border: 1px solid rgba(0,0,0,0.95) !important;
|
26
|
+
border-radius: 4px!important;
|
27
|
+
cursor: pointer;
|
28
|
+
display: inline-block;
|
29
|
+
font-size: 1rem!important;
|
30
|
+
height: 100%;
|
31
|
+
line-height:2rem!important;
|
32
|
+
margin-right: 5px;
|
33
|
+
padding: 8px!important;
|
34
|
+
transition: background-color .2s;
|
35
|
+
white-space: nowrap;
|
36
|
+
zoom: 1;
|
37
|
+
&:hover { // Adds a hover effect
|
38
|
+
background-color: rgba(0, 123, 255, 0.85)!important;
|
39
|
+
}
|
40
|
+
&:focus {
|
41
|
+
background-color: rgba(0, 123, 255, 0.85)!important;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
// Adds a hover effect
|
46
|
+
.goog-te-gadget-simple:hover .VIpgJd-ZVi9od-xl07Ob-lTBxed {
|
47
|
+
color: $white !important;
|
48
|
+
}
|
49
|
+
|
50
|
+
// Adds a nice icon from "Material Icons" icons
|
51
|
+
.VIpgJd-ZVi9od-xl07Ob-lTBxed {
|
52
|
+
color: #000 !important;
|
53
|
+
text-decoration: none !important;
|
54
|
+
&:before {
|
55
|
+
font-family: 'Material Icons'; // <https://fonts.google.com/icons?selected=Material+Icons>
|
56
|
+
content: "\E927"; // G translate icon <https://fonts.google.com/icons?selected=Material+Icons&icon.query=translate>
|
57
|
+
margin-right: 16px;
|
58
|
+
font-size: 2rem;
|
59
|
+
vertical-align: -10px;
|
60
|
+
// width:32px!important;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
// Hide span that messes up layout
|
65
|
+
.VIpgJd-ZVi9od-xl07Ob-lTBxed span:nth-child(5) {
|
66
|
+
display:none;
|
67
|
+
}
|
68
|
+
|
69
|
+
// Use a nicer looking dropdown arrow/carrot than the default
|
70
|
+
.VIpgJd-ZVi9od-xl07Ob-lTBxed span:nth-child(3) {
|
71
|
+
border:none!important;
|
72
|
+
font-family: 'Material Icons';
|
73
|
+
&:after {
|
74
|
+
font-family: 'Material Icons';
|
75
|
+
content: "\E5C5"; // <https://fonts.google.com/icons?selected=Material+Icons&icon.query=arrow>
|
76
|
+
font-size: 1.5rem;
|
77
|
+
vertical-align: -6px;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
.goog-te-gadget-icon {
|
82
|
+
background-image: url(https://placehold.it/32)!important;
|
83
|
+
background-position: 0px 0px;
|
84
|
+
height: 32px!important;
|
85
|
+
width: 32px!important;
|
86
|
+
margin-right: 8px!important;
|
87
|
+
// OR
|
88
|
+
display: none;
|
89
|
+
}
|
90
|
+
|
91
|
+
// ============ HIDE TOP BAR ============
|
92
|
+
.VIpgJd-ZVi9od-ORHb-OEVmcd.skiptranslate {display: none!important;}
|
93
|
+
body {top: 0px!important;}
|
94
|
+
|
95
|
+
/* ================================== *\
|
96
|
+
Mediaqueries
|
97
|
+
\* ================================== */
|
98
|
+
@media (max-width: 667px) {
|
99
|
+
#google_translate_element {
|
100
|
+
bottom: .25rem;
|
101
|
+
left: 16px!important;
|
102
|
+
width: 100%!important;
|
103
|
+
.goog-te-gadget {
|
104
|
+
width:100%!important;
|
105
|
+
}
|
106
|
+
.skiptranslate {
|
107
|
+
width:100%!important;
|
108
|
+
}
|
109
|
+
.goog-te-gadget-simple {
|
110
|
+
width: calc(100% - 32px)!important;
|
111
|
+
text-align: center;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
// Prevent underlining when hovered
|
117
|
+
a.VIpgJd-ZVi9od-xl07Ob-lTBxed {
|
118
|
+
text-decoration: none !important;
|
119
|
+
&:hover {
|
120
|
+
text-decoration: none !important;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
// Removes the blue border surrounding the entire translate menu (when opened)
|
125
|
+
.VIpgJd-ZVi9od-vH1Gmf {
|
126
|
+
border: none !important;
|
127
|
+
}
|