kcc-gem-theme-core 0.0.1
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 +138 -0
- data/_config.yml +262 -0
- data/_data/cache_bust_css.yml +1 -0
- data/_includes/accordion.html +36 -0
- data/_includes/accordion_path-sorting.html +29 -0
- data/_includes/body.html +13 -0
- data/_includes/breadcrumbs.html +65 -0
- data/_includes/card-section.html +32 -0
- data/_includes/chat-now.html +15 -0
- data/_includes/contacts.html +90 -0
- data/_includes/document-head.html +22 -0
- data/_includes/emergency-alerts.html +27 -0
- data/_includes/foot.html +3 -0
- data/_includes/footer.html +278 -0
- data/_includes/hash/theme_hash.yml +1 -0
- data/_includes/header-global.html +56 -0
- data/_includes/hero-slider.html +42 -0
- data/_includes/main-call-to-action.html +32 -0
- data/_includes/nav-global-bottom.html +47 -0
- data/_includes/nav-global-top.html +34 -0
- data/_includes/nav-local.html +29 -0
- data/_includes/preconnect.html +22 -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-theme.html +2 -0
- data/_includes/scripts/table-cdn.html +6 -0
- data/_includes/scripts/translate.html +11 -0
- data/_includes/scripts/vendor-cdn.html +5 -0
- data/_includes/styles/fonts.html +4 -0
- data/_includes/styles/main.html +12 -0
- data/_includes/styles/vendor.html +6 -0
- data/_includes/svg/check.html +11 -0
- data/_includes/svg/check_circle-24px.html +13 -0
- data/_includes/svg/dot.html +1 -0
- data/_includes/svg/earn-more.html +30 -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-core.html +27 -0
- data/_layouts/default.html +32 -0
- data/_layouts/hero-banner.html +17 -0
- data/_layouts/hero-slider.html +17 -0
- data/_layouts/markdown.html +13 -0
- data/_layouts/page.html +8 -0
- data/assets/css/content.css +37 -0
- data/assets/img/2016-senior-viewbook.jpg +0 -0
- data/assets/img/ATEC-DSC_1033.jpeg +0 -0
- data/assets/img/DSC_5650_helpful.jpg +0 -0
- data/assets/img/admissions-navigation-menu.jpg +0 -0
- data/assets/img/ajax-loader.gif +0 -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/blue-next.svg +1 -0
- data/assets/img/blue-prev.svg +1 -0
- data/assets/img/d-daun2.jpg +0 -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/dot.svg +13 -0
- data/assets/img/e-tech_a-roberts_mar2016_D41_6690.jpg +0 -0
- data/assets/img/facebook-f_white.svg +1 -0
- data/assets/img/fafsa-early-bird-banner-18.jpg +0 -0
- data/assets/img/go_cavs_20171002_193828-web.jpg +0 -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/instagram-white.svg +1 -0
- data/assets/img/itransfer.png +0 -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.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.svg +1 -0
- data/assets/img/keyboard_arrow_right.svg +1 -0
- data/assets/img/linkedin-white.svg +1 -0
- data/assets/img/loader.gif +0 -0
- data/assets/img/miguel2.jpg +0 -0
- data/assets/img/pause.svg +1 -0
- data/assets/img/pinterest-p_white.svg +1 -0
- data/assets/img/placeholder.png +0 -0
- data/assets/img/placeholder_16to9.jpg +0 -0
- data/assets/img/placeholder_4by3.jpg +0 -0
- data/assets/img/placeholder_square.jpg +0 -0
- data/assets/img/play.svg +1 -0
- data/assets/img/riverfrontcampus.jpg +0 -0
- data/assets/img/search.svg +1 -0
- data/assets/img/settings.svg +1 -0
- data/assets/img/settings_56.svg +1 -0
- data/assets/img/soccer.svg +1 -0
- data/assets/img/social-icon.svg +1 -0
- data/assets/img/toggle-off.svg +1 -0
- data/assets/img/toggle-on.svg +1 -0
- data/assets/img/twitter-white.svg +1 -0
- data/assets/img/video.svg +1 -0
- data/assets/img/x.svg +1 -0
- data/assets/img/youtube-white.svg +1 -0
- data/assets/img/yt-loading.png +0 -0
- data/assets/img/zippia.png +0 -0
- data/assets/js/alerts/addAccordionOrTabHistoryStates.js +50 -0
- data/assets/js/alerts/alerts.js +56 -0
- data/assets/js/alerts/cacheResponse.js +23 -0
- data/assets/js/alerts/checkForPrefersReducedMotion.js +19 -0
- data/assets/js/alerts/contentHashLink.js +94 -0
- data/assets/js/alerts/createAlertsHtml.js +73 -0
- data/assets/js/alerts/fetchNewAlert.js +33 -0
- data/assets/js/alerts/getCachedResponse.js +43 -0
- data/assets/js/alerts/parseMarkdownToHTML.js +85 -0
- data/assets/js/alerts/refreshAlertButton.js +37 -0
- data/assets/js/dist/102.bundle.js +1 -0
- data/assets/js/dist/126.bundle.js +1 -0
- data/assets/js/dist/154.bundle.js +1 -0
- data/assets/js/dist/238.bundle.js +1 -0
- data/assets/js/dist/282.bundle.js +1 -0
- data/assets/js/dist/315.bundle.js +1 -0
- data/assets/js/dist/381.798ee77dce545b7c224a.css +2 -0
- data/assets/js/dist/381.bundle.js +1 -0
- data/assets/js/dist/391.bundle.js +1 -0
- data/assets/js/dist/45.bundle.js +1 -0
- data/assets/js/dist/504.bundle.js +1 -0
- data/assets/js/dist/526.bundle.js +2 -0
- data/assets/js/dist/526.bundle.js.LICENSE.txt +24 -0
- data/assets/js/dist/57.bundle.js +1 -0
- data/assets/js/dist/576.bundle.js +1 -0
- data/assets/js/dist/582.bundle.js +1 -0
- data/assets/js/dist/614.bundle.js +1 -0
- data/assets/js/dist/640.bundle.js +1 -0
- data/assets/js/dist/644.bundle.js +1 -0
- data/assets/js/dist/647.798ee77dce545b7c224a.css +2 -0
- data/assets/js/dist/647.bundle.js +1 -0
- data/assets/js/dist/658.798ee77dce545b7c224a.css +2 -0
- data/assets/js/dist/658.bundle.js +1 -0
- data/assets/js/dist/707.bundle.js +1 -0
- data/assets/js/dist/734.bundle.js +2 -0
- data/assets/js/dist/734.bundle.js.LICENSE.txt +30 -0
- data/assets/js/dist/747.bundle.js +1 -0
- data/assets/js/dist/755.bundle.js +1 -0
- data/assets/js/dist/795.bundle.js +1 -0
- data/assets/js/dist/814.bundle.js +1 -0
- data/assets/js/dist/83.798ee77dce545b7c224a.css +2 -0
- data/assets/js/dist/83.bundle.js +1 -0
- data/assets/js/dist/853.bundle.js +1 -0
- data/assets/js/dist/859.bundle.js +1 -0
- data/assets/js/dist/862.bundle.js +1 -0
- data/assets/js/dist/909.bundle.js +1 -0
- data/assets/js/dist/92.bundle.js +1 -0
- data/assets/js/dist/936.bundle.js +1 -0
- data/assets/js/dist/968.bundle.js +1 -0
- data/assets/js/dist/987.bundle.js +1 -0
- data/assets/js/dist/kcc-theme.798ee77dce545b7c224a.css +2 -0
- data/assets/js/dist/kcc-theme.bundle.js +1 -0
- data/assets/js/nav/megaNav/closeMegaNavOnClick.js +50 -0
- data/assets/js/nav/megaNav/googleCustomSearch.js +112 -0
- data/assets/js/nav/megaNav/megaNav.js +17 -0
- data/assets/js/nav/megaNav/searchToggleMegaNav.js +96 -0
- data/assets/js/nav/megaNav/toggleDropdownOnWindowResize.js +78 -0
- data/assets/js/nav/megaNav/toggleDropdownOnWindowResizeTwo.js +54 -0
- data/assets/js/nav/megaNav/toggleMenuOnWindowResize.js +26 -0
- data/assets/js/nav/megaNav/underlineCurrentSite.js +22 -0
- data/assets/js/nav/nav/closeNavOnClick.js +50 -0
- data/assets/js/nav/nav/highlightCurrentNav.js +56 -0
- data/assets/js/nav/nav/moveSearchIcon.js +94 -0
- data/assets/js/nav/nav/nav.js +13 -0
- data/assets/js/nav/nav/searchToggleNav.js +40 -0
- data/assets/js/nav/nav/toggleNavSearchDropdownOnWindowResize.js +57 -0
- data/assets/js/src/addClassToOpenNavbar.js +20 -0
- data/assets/js/src/all.js +61 -0
- data/assets/js/src/darkMode.js +17 -0
- data/assets/js/src/errorPageSearch.js +16 -0
- data/assets/js/src/footerDate.js +7 -0
- data/assets/js/src/lazyLoad.js +13 -0
- data/assets/js/src/loadModule.js +13 -0
- data/assets/js/src/sliders.js +68 -0
- data/assets/js/src/test.js +7 -0
- data/assets/js/src/translate.js +1 -0
- data/assets/js/src/translateScript.js +54 -0
- data/assets/js/src/userSettings.js +53 -0
- data/assets/js/src/walkText.js +27 -0
- data/assets/js/src/wrapPowerText.js +21 -0
- data/assets/js/src/ytEmbed.js +30 -0
- data/assets/scss/0-tools/_bootstrap-overrides.scss +89 -0
- data/assets/scss/0-tools/_cloudcannon.scss +16 -0
- data/assets/scss/0-tools/_google-translate-overrides.scss +114 -0
- data/assets/scss/0-tools/_gsc-overrides.scss +144 -0
- data/assets/scss/0-tools/_gsc-search-page-overrides.scss +275 -0
- data/assets/scss/0-tools/_slick-vars.scss +15 -0
- data/assets/scss/0-tools/_vars.scss +98 -0
- data/assets/scss/1-base/_background.scss +5 -0
- data/assets/scss/1-base/_buttons.scss +200 -0
- data/assets/scss/1-base/_header-global.scss +483 -0
- data/assets/scss/1-base/_html.scss +4 -0
- data/assets/scss/1-base/_img.scss +17 -0
- data/assets/scss/1-base/_links.scss +126 -0
- data/assets/scss/1-base/_svg.scss +89 -0
- data/assets/scss/1-base/_typography.scss +645 -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/_dark-mode.scss +350 -0
- data/assets/scss/2-modules/_error.scss +10 -0
- data/assets/scss/2-modules/_footer.scss +84 -0
- data/assets/scss/2-modules/_header.scss +21 -0
- data/assets/scss/2-modules/_hero-slider.scss +300 -0
- data/assets/scss/2-modules/_loader.scss +25 -0
- data/assets/scss/2-modules/_nav-content.scss +11 -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/_setting.scss +78 -0
- data/assets/scss/2-modules/_sliders.scss +21 -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/_margins.scss +2 -0
- data/assets/scss/3-layout/_padding.scss +2 -0
- data/assets/scss/3-layout/_positioning.scss +104 -0
- data/assets/scss/3-layout/_section.scss +23 -0
- data/assets/scss/3-layout/_tables.scss +8 -0
- data/assets/scss/4-pages/index/_home.scss +15 -0
- data/assets/scss/bootstrap.scss +75 -0
- data/assets/scss/darkMode.scss +5 -0
- data/assets/scss/kcc-theme.scss +47 -0
- data/assets/scss/searchPageOverrides.scss +2 -0
- data/assets/scss/slick-carousel.scss +9 -0
- data/assets/scss/translate.scss +4 -0
- metadata +326 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
const htmlElement = document.querySelector('html');
|
2
|
+
const DARK_MODE_BUTTON_ID = 'darkModeButton';
|
3
|
+
|
4
|
+
function darkModeClickHandler(e) {
|
5
|
+
return htmlElement.classList.toggle('dark-mode');
|
6
|
+
}
|
7
|
+
|
8
|
+
function darkMode() {
|
9
|
+
console.info('Dark Mode (is the best)!');
|
10
|
+
window.localStorage.getItem('darkModeSetting') === 'true' ? htmlElement.classList.add('dark-mode') : null;
|
11
|
+
if (window.location.pathname !== '/settings/') return;
|
12
|
+
const darkModeButton = document.getElementById(DARK_MODE_BUTTON_ID);
|
13
|
+
|
14
|
+
darkModeButton.addEventListener('click', darkModeClickHandler);
|
15
|
+
}
|
16
|
+
|
17
|
+
export default darkMode;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// Custom JS to toggle the search field at the top of the 404 page when
|
2
|
+
// User clicks the search button.
|
3
|
+
const BUTTON_ID = 'errorPageSearch';
|
4
|
+
const SEARCH_ID = 'openSearchButton';
|
5
|
+
|
6
|
+
function errorPageSearch() {
|
7
|
+
const button = document.getElementById(BUTTON_ID);
|
8
|
+
const searchToggle = document.getElementById(SEARCH_ID);
|
9
|
+
|
10
|
+
button.addEventListener('click', (e) => {
|
11
|
+
e.preventDefault();
|
12
|
+
searchToggle.click();
|
13
|
+
});
|
14
|
+
}
|
15
|
+
|
16
|
+
export default errorPageSearch;
|
@@ -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
|
+
for (let img of lazyLoadImages) {
|
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,13 @@
|
|
1
|
+
function loadModule(...moduleArgs) {
|
2
|
+
const module = moduleArgs[0];
|
3
|
+
let defaultFunc;
|
4
|
+
let funcArg = undefined;
|
5
|
+
|
6
|
+
moduleArgs.length > 1 ? defaultFunc = moduleArgs[1] : defaultFunc = moduleArgs[0];
|
7
|
+
moduleArgs.length > 2 ? funcArg = moduleArgs[2] : null;
|
8
|
+
import(`./${module}`).then(({ default: defaultFunc }) => {
|
9
|
+
funcArg = undefined ? defaultFunc() : defaultFunc(funcArg);
|
10
|
+
});
|
11
|
+
}
|
12
|
+
|
13
|
+
export default loadModule;
|
@@ -0,0 +1,68 @@
|
|
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
|
+
import $ from 'jquery';
|
4
|
+
import 'slick-carousel';
|
5
|
+
window.jQuery = window.$ = $; // Slick is older and requires jquery to be defined in window.
|
6
|
+
|
7
|
+
const HERO_SLIDER_CLASSNAME = '.hero-slider__slider'; // Our classname for the hero-slider's DOM parent
|
8
|
+
const SLICK_PLAY = 'slickPlay'; // Methods unique to slick
|
9
|
+
const SLICK_PAUSE = 'slickPause'; // Methods unique to slick
|
10
|
+
const SLICK_NEXT_SLIDE = 'slickNext'; // Methods unique to slick
|
11
|
+
const play = 'Play';
|
12
|
+
const pause = 'Pause';
|
13
|
+
|
14
|
+
function initSlick() {
|
15
|
+
$(HERO_SLIDER_CLASSNAME).slick({
|
16
|
+
dots: true,
|
17
|
+
slidesToShow: 1,
|
18
|
+
slidesToScroll: 1,
|
19
|
+
autoplay: true,
|
20
|
+
autoplaySpeed: 4000,
|
21
|
+
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
|
22
|
+
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
|
23
|
+
});
|
24
|
+
}
|
25
|
+
|
26
|
+
function toggleSlickPlayState(el, slickState, newButtonText) {
|
27
|
+
const newButtonTextIsPause = newButtonText === pause;
|
28
|
+
|
29
|
+
$(HERO_SLIDER_CLASSNAME).slick(slickState);
|
30
|
+
el.setAttribute('aria-label', newButtonText);
|
31
|
+
el.classList.toggle('hero-slider__button--play');
|
32
|
+
el.innerHTML = newButtonText;
|
33
|
+
|
34
|
+
newButtonTextIsPause ? $(HERO_SLIDER_CLASSNAME).slick(SLICK_NEXT_SLIDE) : null;
|
35
|
+
}
|
36
|
+
|
37
|
+
function watchForElementClicks(el) {
|
38
|
+
el.addEventListener('click', function(e) {
|
39
|
+
let buttonTextIsPause = el.innerHTML === 'Pause';
|
40
|
+
|
41
|
+
buttonTextIsPause ? toggleSlickPlayState(el, SLICK_PAUSE, play) : toggleSlickPlayState(el, SLICK_PLAY, pause);
|
42
|
+
});
|
43
|
+
}
|
44
|
+
|
45
|
+
function createButton() {
|
46
|
+
const SLICK_PARENT_EL = document.querySelector(HERO_SLIDER_CLASSNAME);
|
47
|
+
const button = document.createElement('button');
|
48
|
+
const initialButtonText = 'Pause';
|
49
|
+
|
50
|
+
button.setAttribute('aria-label', 'Pause');
|
51
|
+
button.type = 'button';
|
52
|
+
button.style = 'display: block;'
|
53
|
+
button.innerHTML = initialButtonText;
|
54
|
+
button.classList.add('hero-slider__button--toggle');
|
55
|
+
SLICK_PARENT_EL.appendChild(button);
|
56
|
+
watchForElementClicks(button);
|
57
|
+
}
|
58
|
+
|
59
|
+
function initSliders() {
|
60
|
+
// slick's on 'init' function (See "events" in slick docs):
|
61
|
+
// According to slick's docs; you have to call a $(slick).on('init', function(){ //... }); before you initialize slick:
|
62
|
+
$(HERO_SLIDER_CLASSNAME).on('init', function(event, slick){
|
63
|
+
createButton();
|
64
|
+
});
|
65
|
+
initSlick();
|
66
|
+
}
|
67
|
+
|
68
|
+
export default initSliders;
|
@@ -0,0 +1 @@
|
|
1
|
+
import '../../scss/translate.scss';
|
@@ -0,0 +1,54 @@
|
|
1
|
+
function styleIFrameElement(IFRAME_MENU_ELEMENT, iframeStyles) {
|
2
|
+
const combinedStyles = IFRAME_MENU_ELEMENT.style.cssText += iframeStyles
|
3
|
+
IFRAME_MENU_ELEMENT.style.cssText = combinedStyles;
|
4
|
+
}
|
5
|
+
|
6
|
+
function setIframeStyles() {
|
7
|
+
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);';
|
8
|
+
return iframeStyles;
|
9
|
+
}
|
10
|
+
|
11
|
+
function createStyleConfigurationObject() {
|
12
|
+
const styleConfigurationObject = { // Setting all the selectors & the styles they should get.
|
13
|
+
'.goog-te-menu2-item div, .goog-te-menu2-item:link div, .goog-te-menu2-item:visited div, .goog-te-menu2-item:active div, .goog-te-menu2 *': 'color: #544F4B; font-family: "Roboto", sans-serif; width: 100%;', // Change font fam and color!
|
14
|
+
'.goog-te-menu2-item-selected': 'display: none;', // Change menu's padding
|
15
|
+
'.goog-te-menu2': 'overflow-y: scroll; padding: 0px;', // Change menu's padding
|
16
|
+
'.goog-te-menu2-item div': 'padding: 20px;', // Change the padding of the languages
|
17
|
+
'.goog-te-menu2-item': 'width: 100%;', // Change the width of the languages
|
18
|
+
'td': 'width: 100%; display: block;', // Change the width of the languages
|
19
|
+
'.goog-te-menu2-colpad': 'display: none;', // Change the width of the languages
|
20
|
+
'.goog-te-menu2': 'border: none;', // Change Google's default blue border
|
21
|
+
'.goog-te-menu2': 'height: 100%; width: 100%;'
|
22
|
+
}
|
23
|
+
return styleConfigurationObject;
|
24
|
+
}
|
25
|
+
|
26
|
+
function setStyles(selector, styles, IFRAME_MENU_ELEMENT) {
|
27
|
+
const content = IFRAME_MENU_ELEMENT.contentWindow;
|
28
|
+
const itemsToStyle = content.document.querySelectorAll(selector);
|
29
|
+
for (let i = 0; i < itemsToStyle.length; i++) {
|
30
|
+
const items = itemsToStyle[i];
|
31
|
+
items.setAttribute('style', styles);
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
function translate() {
|
36
|
+
// RESTYLE THE DROPDOWN MENU
|
37
|
+
if (document.getElementById('google_translate_element')) {
|
38
|
+
const GOOGLE_TRANSLATE_ELEMENT = document.getElementById('google_translate_element');
|
39
|
+
const styleConfigurationObject = createStyleConfigurationObject();
|
40
|
+
const iframeStyles = setIframeStyles();
|
41
|
+
GOOGLE_TRANSLATE_ELEMENT.addEventListener('click', function (event) {
|
42
|
+
const IFRAME_MENU_ELEMENT = document.querySelector('iframe[class*="goog-te-menu-frame"]');
|
43
|
+
|
44
|
+
//event.preventDefault();
|
45
|
+
styleIFrameElement(IFRAME_MENU_ELEMENT, iframeStyles);
|
46
|
+
Object.keys(styleConfigurationObject).forEach(function(selector) {
|
47
|
+
setStyles(selector, styleConfigurationObject[selector], IFRAME_MENU_ELEMENT);
|
48
|
+
});
|
49
|
+
|
50
|
+
}, false);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
export default translate;
|
@@ -0,0 +1,53 @@
|
|
1
|
+
const VIDEO_SETTING_BUTTON = document.getElementById('videoButton');
|
2
|
+
const SETTING_BUTTON_CLASS = '.setting__button';
|
3
|
+
|
4
|
+
function recallSetting(button) {
|
5
|
+
const setting = button.dataset.setting;
|
6
|
+
let savedSetting;
|
7
|
+
|
8
|
+
if (!window.localStorage.getItem(setting)) return;
|
9
|
+
if (button.dataset.value === window.localStorage.getItem(setting)) return;
|
10
|
+
|
11
|
+
window.localStorage.getItem(setting) == 'false' ? savedSetting = false : savedSetting = true;
|
12
|
+
const settingSpan = `<span class="sr-only sr-only-focusable">Turn setting ${!savedSetting ? 'on' : 'off'}</span>`;
|
13
|
+
|
14
|
+
button.dataset.value = savedSetting.toString();
|
15
|
+
button.classList.remove(`setting__button--${!savedSetting ? 'on' : 'off'}`);
|
16
|
+
button.classList.add(`setting__button--${!savedSetting ? 'off' : 'on'}`);
|
17
|
+
return button.innerHTML = settingSpan;
|
18
|
+
}
|
19
|
+
|
20
|
+
function settingsButtonClickHandler(e) {
|
21
|
+
let currentSettingState;
|
22
|
+
let settingButton = e.target;
|
23
|
+
|
24
|
+
settingButton.dataset.value === 'true' ? currentSettingState = true
|
25
|
+
: settingButton.dataset.value === 'false' ? currentSettingState = false
|
26
|
+
: null;
|
27
|
+
|
28
|
+
currentSettingState === null ? new Error(
|
29
|
+
`Error in userSettings.js module
|
30
|
+
"currentSettingState" is undefined:
|
31
|
+
Make sure you have a "data-value" attribute set to "true" or "false"`
|
32
|
+
) : null;
|
33
|
+
|
34
|
+
const settingMessage = `<span class="sr-only">Turn setting ${currentSettingState ? 'on' : 'off'}</span>`;
|
35
|
+
|
36
|
+
window.localStorage.setItem(settingButton.dataset.setting, (!currentSettingState).toString());
|
37
|
+
|
38
|
+
settingButton.classList.toggle(`setting__button--${currentSettingState ? 'on' : 'off'}`);
|
39
|
+
settingButton.classList.toggle(`setting__button--${currentSettingState ? 'off' : 'on'}`);
|
40
|
+
settingButton.dataset.value = (!currentSettingState).toString()
|
41
|
+
return settingButton.innerHTML = settingMessage;
|
42
|
+
}
|
43
|
+
|
44
|
+
function userSettings() {
|
45
|
+
const settingButtons = [...document.querySelectorAll(SETTING_BUTTON_CLASS)];
|
46
|
+
|
47
|
+
settingButtons.forEach(button => {
|
48
|
+
button.addEventListener('click', settingsButtonClickHandler);
|
49
|
+
recallSetting(button);
|
50
|
+
});
|
51
|
+
}
|
52
|
+
|
53
|
+
export default userSettings;
|
@@ -0,0 +1,27 @@
|
|
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 emDashReplacement = '—' // This is an em-dash, however, it looks like a hyphen in monospace text editor font!
|
8
|
+
|
9
|
+
function replacerFunction(match) {
|
10
|
+
return match.search(tripleHyphenRegex) === -1 ? emDashReplacement : match;
|
11
|
+
}
|
12
|
+
function walkText(node) {
|
13
|
+
if (node.nodeType == 3) {
|
14
|
+
node.data = node.data.replace(emDashOrTripleHyphensRegex, replacerFunction);
|
15
|
+
}
|
16
|
+
if (node.nodeType == 1 && node.nodeName != 'SCRIPT') {
|
17
|
+
for (var i = 0; i < node.childNodes.length; i++) {
|
18
|
+
walkText(node.childNodes[i]);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
// Note on usage: You don't need to necessarily traverse the entire document.body.
|
23
|
+
// Usage:
|
24
|
+
//
|
25
|
+
// walkText(document.body);
|
26
|
+
//
|
27
|
+
export default walkText;
|
@@ -0,0 +1,21 @@
|
|
1
|
+
const SLIDE_HEADING_ELEMENTS = 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 replaceRegex(el) {
|
6
|
+
return el.innerHTML = el.innerHTML.replace(regEx, replacement);
|
7
|
+
}
|
8
|
+
|
9
|
+
function loopOverNodeList(nodeList) {
|
10
|
+
for (var i = 0; i < nodeList.length; i++) {
|
11
|
+
replaceRegex(nodeList[i]);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
function wrapPowerText() {
|
16
|
+
if ( !document.querySelectorAll('.hero-slider__slider--slide-heading') )
|
17
|
+
return; // Bail out of theres no slider in the page.
|
18
|
+
loopOverNodeList(SLIDE_HEADING_ELEMENTS);
|
19
|
+
}
|
20
|
+
|
21
|
+
export default wrapPowerText;
|
@@ -0,0 +1,30 @@
|
|
1
|
+
const YT_EMBED_PARENT = document.getElementById('yt-embed');
|
2
|
+
const YT_EMBED_PARENT_VIDEO_ID = YT_EMBED_PARENT.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
|
+
YT_EMBED_PARENT.appendChild(iframe);
|
23
|
+
setAttributes(iframe, 'src', 'https://www.youtube.com/embed/' + YT_EMBED_PARENT_VIDEO_ID + '?showinfo=0&rel=0');
|
24
|
+
iframe.onload = () => {
|
25
|
+
YT_EMBED_PARENT.removeChild(YT_EMBED_PARENT.querySelector('.yt-embed'));
|
26
|
+
}
|
27
|
+
|
28
|
+
}
|
29
|
+
|
30
|
+
export default ytEmbed;
|
@@ -0,0 +1,89 @@
|
|
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(-90deg);
|
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(0deg);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
.dropdown-toggle.btn::after { // Set starting position & transition Fx
|
58
|
+
transform: rotate(-90deg);
|
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(0deg);
|
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
|
+
// Customizations to alert color-schemes
|
73
|
+
// Creates a more visible border around the alerts
|
74
|
+
// BS4 default alert border-colors are almost imperceivable
|
75
|
+
.alert-warning {
|
76
|
+
border-color: $color-alert-warning-border;
|
77
|
+
}
|
78
|
+
|
79
|
+
.alert-danger {
|
80
|
+
border-color: $color-alert-danger-border;
|
81
|
+
}
|
82
|
+
|
83
|
+
.alert-info {
|
84
|
+
border-color: $color-alert-info-border;
|
85
|
+
}
|
86
|
+
|
87
|
+
.alert-primary {
|
88
|
+
border-color: $color-alert-primary-border;
|
89
|
+
}
|
@@ -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,114 @@
|
|
1
|
+
.goog-te-gadget-simple {
|
2
|
+
white-space: nowrap;
|
3
|
+
border-radius: 20px;
|
4
|
+
padding-left: 10px;
|
5
|
+
padding-right: 10px;
|
6
|
+
margin-right: 5px;
|
7
|
+
height: 100%;
|
8
|
+
}
|
9
|
+
|
10
|
+
#google_translate_element {
|
11
|
+
position: fixed;
|
12
|
+
bottom: .25rem;
|
13
|
+
right: .25rem!important;
|
14
|
+
z-index: 99999;
|
15
|
+
}
|
16
|
+
.goog-te-gadget {
|
17
|
+
font-family: Roboto, 'Open Sans', sans-serif!important;
|
18
|
+
text-transform: uppercase;
|
19
|
+
font-weight: 500;
|
20
|
+
&:hover {
|
21
|
+
color: $white;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
.goog-te-gadget-simple {
|
25
|
+
background-color: rgba(255,255,255,0.85)!important;
|
26
|
+
border: 1px solid rgba(0,0,0,0.95) !important;
|
27
|
+
padding: 8px!important;
|
28
|
+
border-radius: 4px!important;
|
29
|
+
font-size: 1rem!important;
|
30
|
+
line-height:2rem!important;
|
31
|
+
display: inline-block;
|
32
|
+
transition: background-color .2s;
|
33
|
+
cursor: pointer;
|
34
|
+
zoom: 1;
|
35
|
+
&:hover {
|
36
|
+
background-color: rgba(0, 123, 255, 0.85)!important;
|
37
|
+
}
|
38
|
+
&:focus {
|
39
|
+
background-color: rgba(0, 123, 255, 0.85)!important;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
.goog-te-menu2 {
|
43
|
+
max-width: 100%;
|
44
|
+
width: 100%;
|
45
|
+
}
|
46
|
+
.goog-te-gadget-simple:hover .goog-te-menu-value {
|
47
|
+
color: $white !important;
|
48
|
+
}
|
49
|
+
.goog-te-menu-value {
|
50
|
+
color: #000 !important;
|
51
|
+
text-decoration: none !important;
|
52
|
+
&:before {
|
53
|
+
font-family: 'Material Icons';
|
54
|
+
content: "\E927";
|
55
|
+
margin-right: 16px;
|
56
|
+
font-size: 2rem;
|
57
|
+
vertical-align: -10px;
|
58
|
+
// width:32px!important;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
.goog-te-menu-value span:nth-child(5) {
|
62
|
+
display:none;
|
63
|
+
}
|
64
|
+
.goog-te-menu-value span:nth-child(3) {
|
65
|
+
border:none!important;
|
66
|
+
font-family: 'Material Icons';
|
67
|
+
&:after {
|
68
|
+
font-family: 'Material Icons';
|
69
|
+
content: "\E5C5";
|
70
|
+
font-size: 1.5rem;
|
71
|
+
vertical-align: -6px;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
.goog-te-gadget-icon {
|
76
|
+
background-image: url(https://placehold.it/32)!important;
|
77
|
+
background-position: 0px 0px;
|
78
|
+
height: 32px!important;
|
79
|
+
width: 32px!important;
|
80
|
+
margin-right: 8px!important;
|
81
|
+
// OR
|
82
|
+
display: none;
|
83
|
+
}
|
84
|
+
|
85
|
+
// ============ HIDE TOP BAR ============
|
86
|
+
.goog-te-banner-frame.skiptranslate {display: none!important;}
|
87
|
+
body {top: 0px!important;}
|
88
|
+
|
89
|
+
/* ================================== *\
|
90
|
+
Mediaqueries
|
91
|
+
\* ================================== */
|
92
|
+
@media (max-width: 667px) {
|
93
|
+
#google_translate_element {
|
94
|
+
bottom: .25rem;
|
95
|
+
left: 16px!important;
|
96
|
+
width: 100%!important;
|
97
|
+
goog-te-gadget {
|
98
|
+
width:100%!important;
|
99
|
+
}
|
100
|
+
.skiptranslate {
|
101
|
+
width:100%!important;
|
102
|
+
}
|
103
|
+
.goog-te-gadget-simple {
|
104
|
+
width: calc(100% - 32px)!important;
|
105
|
+
text-align: center;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}
|
109
|
+
a.goog-te-menu-value {
|
110
|
+
text-decoration: none !important;
|
111
|
+
&:hover {
|
112
|
+
text-decoration: none !important;
|
113
|
+
}
|
114
|
+
}
|