kcc-gem-theme 1.65.57
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/_data/cache_bust_css.yml +1 -0
- data/_data/navigation.yml +96 -0
- data/_data/theme_hash.yml +1 -0
- data/_includes/accordion.html +28 -0
- data/_includes/alerts.html +2 -0
- data/_includes/benefits.html +98 -0
- data/_includes/body.html +8 -0
- data/_includes/bottom-action-call.html +10 -0
- data/_includes/card-section.html +27 -0
- data/_includes/chat-now.html +8 -0
- data/_includes/check-mark.svg +17 -0
- data/_includes/contacts-tan.html +69 -0
- data/_includes/contacts.html +67 -0
- data/_includes/document-head.html +13 -0
- data/_includes/emergency-alert.html +9 -0
- data/_includes/emergency-alerts.html +29 -0
- data/_includes/foot.html +3 -0
- data/_includes/footer.html +168 -0
- data/_includes/header-global.html +25 -0
- data/_includes/header.html +28 -0
- data/_includes/hero-slider.html +23 -0
- data/_includes/image-slider.html +23 -0
- data/_includes/nav-global-bottom.html +30 -0
- data/_includes/nav-global-local.html +29 -0
- data/_includes/nav-global-top.html +14 -0
- data/_includes/nav-global.html +117 -0
- data/_includes/nav-landing.html +111 -0
- data/_includes/nav-local.html +34 -0
- data/_includes/nav-sub.html +19 -0
- data/_includes/old-head.html +28 -0
- data/_includes/scripts/custom.html +2 -0
- data/_includes/scripts/emergency-alerts.html +2 -0
- data/_includes/scripts/google-api.html +2 -0
- data/_includes/scripts/google-noscript.html +6 -0
- data/_includes/scripts/google-tag.html +24 -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-cdn.html +6 -0
- data/_includes/styles/fonts.html +11 -0
- data/_includes/styles/main.html +8 -0
- data/_includes/styles/vendor.html +6 -0
- data/_includes/svg/check.html +11 -0
- data/_includes/svg/goals.html +17 -0
- data/_includes/svg/kcc-copy.html +62 -0
- data/_includes/svg/kcc.html +59 -0
- data/_includes/svg/kcc.svg +59 -0
- data/_includes/svg/love.html +6 -0
- data/_includes/svg/save-money.html +40 -0
- data/_includes/tabbed-content.html +21 -0
- data/_includes/targetx-form.html +370 -0
- data/_includes/targetx-head.html +48 -0
- data/_includes/translate.html +3 -0
- data/_layouts/default-core.html +31 -0
- data/_layouts/default-landing.html +31 -0
- data/_layouts/default.html +32 -0
- data/_layouts/landing-page.html +8 -0
- data/_layouts/landing-simple.html +29 -0
- data/_layouts/markdown.html +13 -0
- data/_layouts/page.html +8 -0
- data/_layouts/sub-nav.html +6 -0
- data/_layouts/thank-you.html +18 -0
- data/assets/css/content.css +1 -0
- data/assets/css/kcc-theme.css +1 -0
- data/assets/css/main.css +1 -0
- data/assets/css/translate.css +1 -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/DSC_8724_4x3.jpg +0 -0
- data/assets/img/alert.svg +13 -0
- data/assets/img/baseball.svg +40 -0
- data/assets/img/basketball.svg +17 -0
- data/assets/img/blank-contact.svg +10 -0
- data/assets/img/blue-next.svg +9 -0
- data/assets/img/blue-prev.svg +9 -0
- data/assets/img/calendar.svg +24 -0
- data/assets/img/cavaliers-16x9-thumb.png +0 -0
- data/assets/img/cavaliers-logo.png +0 -0
- data/assets/img/cavaliers-logo_white.png +0 -0
- data/assets/img/d-daun2.jpg +0 -0
- data/assets/img/dbl-next.svg +16 -0
- data/assets/img/dbl-next_mobile.svg +16 -0
- data/assets/img/dbl-prev.svg +16 -0
- data/assets/img/dbl-prev_mobile.svg +16 -0
- data/assets/img/e-tech_a-roberts_mar2016_D41_6690.jpg +0 -0
- data/assets/img/facebook-f_white.svg +9 -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/instagram-white.svg +20 -0
- data/assets/img/itransfer.png +0 -0
- data/assets/img/kankakee-community-college-word-logo.svg +88 -0
- data/assets/img/kcc-logo-inverse.svg +21 -0
- data/assets/img/kcc-logo.svg +74 -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 +89 -0
- data/assets/img/linkedin-white.svg +13 -0
- data/assets/img/loader.gif +0 -0
- data/assets/img/menu-bg.png +0 -0
- data/assets/img/miguel2.jpg +0 -0
- data/assets/img/news.svg +19 -0
- data/assets/img/pause.svg +20 -0
- data/assets/img/pause_mobile.svg +20 -0
- data/assets/img/pinterest-p_white.svg +16 -0
- data/assets/img/placeholder.png +0 -0
- data/assets/img/play.svg +12 -0
- data/assets/img/play_mobile.svg +12 -0
- data/assets/img/riverfrontcampus.jpg +0 -0
- data/assets/img/search.svg +18 -0
- data/assets/img/soccer.svg +17 -0
- data/assets/img/social-icon.svg +13 -0
- data/assets/img/twitter-white.svg +14 -0
- data/assets/img/video.svg +10 -0
- data/assets/img/volleyball.svg +15 -0
- data/assets/img/x.svg +10 -0
- data/assets/img/youtube-white.svg +9 -0
- data/assets/img/yt-loading.png +0 -0
- data/assets/img/zippia.png +0 -0
- data/assets/js/dist/main.bundle.js +1 -0
- data/assets/js/theme/alerts/alerts.js +5 -0
- data/assets/js/theme/alerts/campusAlertsSheetsAPI.js +41 -0
- data/assets/js/theme/alerts/createAlertsHtml.js +93 -0
- data/assets/js/theme/alerts/parseMarkdownToHTML.js +85 -0
- data/assets/js/theme/alerts/simpleSetSheetParameters.js +23 -0
- data/assets/js/theme/dist/alerts.bundle.js +1 -0
- data/assets/js/theme/dist/kcc-mega-nav.bundle.js +1 -0
- data/assets/js/theme/dist/kcc-nav.bundle.js +1 -0
- data/assets/js/theme/dist/kcc-theme-landing.bundle.js +1 -0
- data/assets/js/theme/dist/kcc-theme.bundle.js +1 -0
- data/assets/js/theme/landing/landing.js +5 -0
- data/assets/js/theme/landing/landingPage.js +49 -0
- data/assets/js/theme/nav/megaNav/closeMegaNavOnClick.js +50 -0
- data/assets/js/theme/nav/megaNav/googleCustomSearch.js +112 -0
- data/assets/js/theme/nav/megaNav/megaNav.js +13 -0
- data/assets/js/theme/nav/megaNav/searchToggleMegaNav.js +96 -0
- data/assets/js/theme/nav/megaNav/toggleDropdownOnWindowResize.js +78 -0
- data/assets/js/theme/nav/megaNav/toggleDropdownOnWindowResizeTwo.js +54 -0
- data/assets/js/theme/nav/megaNav/toggleMenuOnWindowResize.js +26 -0
- data/assets/js/theme/nav/megaNav/underlineCurrentSite.js +22 -0
- data/assets/js/theme/nav/nav/closeNavOnClick.js +50 -0
- data/assets/js/theme/nav/nav/highlightCurrentNav.js +56 -0
- data/assets/js/theme/nav/nav/moveSearchIcon.js +94 -0
- data/assets/js/theme/nav/nav/nav.js +13 -0
- data/assets/js/theme/nav/nav/searchToggleNav.js +40 -0
- data/assets/js/theme/nav/nav/toggleNavSearchDropdownOnWindowResize.js +57 -0
- data/assets/js/theme/src/all.js +34 -0
- data/assets/js/theme/src/babelTest.js +18 -0
- data/assets/js/theme/src/footerDate.js +7 -0
- data/assets/js/theme/src/lazyLoad.js +13 -0
- data/assets/js/theme/src/sliders.js +88 -0
- data/assets/js/theme/src/test.js +5 -0
- data/assets/js/theme/src/translate.js +56 -0
- data/assets/js/theme/src/walkText.js +16 -0
- data/assets/js/theme/src/wrapPowerText.js +21 -0
- data/assets/js/theme/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 +114 -0
- data/assets/scss/0-tools/_gsc-overrides.scss +144 -0
- data/assets/scss/0-tools/_targetx-overrides.scss +76 -0
- data/assets/scss/0-tools/_vars.scss +67 -0
- data/assets/scss/1-base/_background.scss +5 -0
- data/assets/scss/1-base/_buttons.scss +83 -0
- data/assets/scss/1-base/_header-global.scss +454 -0
- data/assets/scss/1-base/_img.scss +17 -0
- data/assets/scss/1-base/_links.scss +120 -0
- data/assets/scss/1-base/_typography.scss +641 -0
- data/assets/scss/2-modules/_accordion.scss +34 -0
- data/assets/scss/2-modules/_benefits.scss +371 -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 +80 -0
- data/assets/scss/2-modules/_header.scss +21 -0
- data/assets/scss/2-modules/_hero-slider.scss +330 -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/_sliders.scss +191 -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 +341 -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/kcc-theme.scss +49 -0
- data/assets/scss/translate.scss +5 -0
- data/assets/vendor/css/ajax-loader.gif +0 -0
- data/assets/vendor/css/bootstrap.min.css +7 -0
- data/assets/vendor/css/fonts/slick.eot +0 -0
- data/assets/vendor/css/fonts/slick.ttf +0 -0
- data/assets/vendor/css/fonts/slick.woff +0 -0
- data/assets/vendor/css/mli7lsm.css +22 -0
- data/assets/vendor/css/slick-theme.min.css +8 -0
- data/assets/vendor/css/slick.min.css +8 -0
- data/assets/vendor/font/slick.woff +0 -0
- data/assets/vendor/js/bootstrap.min.js +7 -0
- data/assets/vendor/js/jquery.min.js +2 -0
- data/assets/vendor/js/popper.min.js +5 -0
- data/assets/vendor/js/slick.min.js +1 -0
- metadata +304 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const NAV_LINKS_SELECTOR = '.nav-link:not(.dropdown-toggle)'; // Bootstrap 4 class
|
|
2
|
+
const MENU_COLLAPSE_JQUERY = $('#mainNavContent'); // Bootstrap 4 crap that requires $() w/ an ID from the HTML
|
|
3
|
+
const MENU_COLLAPSE = 'mainNavContent'; // ID from the HTML
|
|
4
|
+
const HIDE = 'hide'; // Bootstrap 4 class
|
|
5
|
+
const SHOW = 'show'; // Bootstrap 4 class
|
|
6
|
+
|
|
7
|
+
function hideBootstrapMenu() {
|
|
8
|
+
MENU_COLLAPSE_JQUERY.collapse(HIDE);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function checkIfMenuIsOpen() {
|
|
12
|
+
if ( document.getElementById(MENU_COLLAPSE).classList.contains(SHOW) ) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function hideMenuIfOpen(menuIsOpen) {
|
|
19
|
+
if ( menuIsOpen ) {
|
|
20
|
+
hideBootstrapMenu();
|
|
21
|
+
} else {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function clickHandlerFunction(e) {
|
|
27
|
+
if ( !e.target.matches(NAV_LINKS_SELECTOR) ) // Bail out of the rest of the code if the click event's target is not what we want!
|
|
28
|
+
return;
|
|
29
|
+
|
|
30
|
+
if ( e.target.classList.contains('dropdown-toggle') )
|
|
31
|
+
return;
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
const menuIsOpen = checkIfMenuIsOpen();
|
|
35
|
+
|
|
36
|
+
hideMenuIfOpen(menuIsOpen);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function addEventListenerFunction(element, clickEvent) {
|
|
40
|
+
element.addEventListener(clickEvent, clickHandlerFunction, false);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function closeMenuOnClick() {
|
|
44
|
+
const clickEvent = 'click';
|
|
45
|
+
const element = document;
|
|
46
|
+
|
|
47
|
+
addEventListenerFunction(element, clickEvent);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export default closeMenuOnClick;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Custom Vanilla JS to highlight the user's current location in the navigation bar and the sub-nav navigation bar
|
|
2
|
+
function setActive(thisLink, linkText) {
|
|
3
|
+
let thisAnchor = thisLink.querySelector('a');
|
|
4
|
+
|
|
5
|
+
thisLink.classList.add('active');
|
|
6
|
+
thisAnchor.insertAdjacentHTML('beforeend', ' <span class="sr-only">(current)</span>');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function highlightSubNav(pathname) {
|
|
10
|
+
const subNavItems = document.querySelectorAll('.js-sub-nav-item');
|
|
11
|
+
|
|
12
|
+
for ( let link of subNavItems) {
|
|
13
|
+
const anchor = link.querySelector('a');
|
|
14
|
+
const href = anchor.getAttribute('href').replace(/\.\.\//g, '');
|
|
15
|
+
const linkText = anchor.textContent;
|
|
16
|
+
const urlMatchesLink = pathname.indexOf(href) !== -1;
|
|
17
|
+
|
|
18
|
+
urlMatchesLink ?
|
|
19
|
+
setActive(link, linkText)
|
|
20
|
+
: null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function highlightNav() {
|
|
25
|
+
const pathname = window.location.pathname;
|
|
26
|
+
const locationIsContactHash = window.location.hash === '#contact';
|
|
27
|
+
const locationIsHome = window.location.pathname === '/';
|
|
28
|
+
|
|
29
|
+
document.getElementById('subNavNav') ?
|
|
30
|
+
highlightSubNav(pathname)
|
|
31
|
+
: null;
|
|
32
|
+
|
|
33
|
+
const navigationItems = document.querySelectorAll('.js-nav-item');
|
|
34
|
+
|
|
35
|
+
for ( let link of navigationItems ) {
|
|
36
|
+
const linkAnchor = link.querySelector('a');
|
|
37
|
+
const linkHrefValue = linkAnchor.getAttribute('href').replace(/\.\.\//g, '');
|
|
38
|
+
const linkTextValue = linkAnchor.textContent;
|
|
39
|
+
const linkIsHome = linkTextValue.toLowerCase() === 'home';
|
|
40
|
+
const urlMatchesLink = pathname.indexOf(linkHrefValue) !== -1;
|
|
41
|
+
|
|
42
|
+
if ( locationIsHome || locationIsContactHash ) {
|
|
43
|
+
linkIsHome ? setActive(link, linkTextValue) : null;
|
|
44
|
+
} else {
|
|
45
|
+
urlMatchesLink && !linkIsHome ? setActive(link, linkTextValue) : null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//
|
|
50
|
+
// USEAGE:
|
|
51
|
+
//
|
|
52
|
+
// document.addEventListener('DOMContentLoaded', function() {
|
|
53
|
+
// highlightNav();
|
|
54
|
+
// });
|
|
55
|
+
//
|
|
56
|
+
export default highlightNav;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
function checkXIcon() {
|
|
2
|
+
const checkXIconOnLoad = (function() {
|
|
3
|
+
let executed = false;
|
|
4
|
+
return function() {
|
|
5
|
+
if (!executed) {
|
|
6
|
+
executed = true;
|
|
7
|
+
// do checkXIconOnLoad
|
|
8
|
+
const icon = document.getElementById('xIcon');
|
|
9
|
+
const xIsHidden = icon.getAttribute('style') === 'display: none;';
|
|
10
|
+
xIsHidden ? removeClear() : clearXIcon();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
})();
|
|
14
|
+
checkXIconOnLoad(); // "do checkXIconOnLoad" happens
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function clearXIcon() {
|
|
18
|
+
const targetEl = document.querySelector('button.gsc-search-button-v2');
|
|
19
|
+
targetEl.classList.add('gsc-overrides__clear-x');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function removeClear() {
|
|
23
|
+
const targetEl = document.querySelector('button.gsc-search-button-v2');
|
|
24
|
+
targetEl.classList.remove('gsc-overrides__clear-x');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function addId() {
|
|
28
|
+
const xIcon = document.querySelector('.gsst_a');
|
|
29
|
+
xIcon.setAttribute('id', 'xIcon');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function gscInit() {
|
|
33
|
+
var cx = '006320264078644364913:sy48bet-lr8';
|
|
34
|
+
var gcse = document.createElement('script');
|
|
35
|
+
gcse.type = 'text/javascript';
|
|
36
|
+
gcse.async = true;
|
|
37
|
+
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
|
|
38
|
+
var s = document.getElementsByTagName('script')[0];
|
|
39
|
+
s.parentNode.insertBefore(gcse, s);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function moveSearchIcon() {
|
|
43
|
+
const pageHasGSearch = document.getElementById('searchCollapse');
|
|
44
|
+
|
|
45
|
+
if ( pageHasGSearch ) {
|
|
46
|
+
let initSearchPromise = new Promise((resolve, reject) => {
|
|
47
|
+
gscInit();
|
|
48
|
+
resolve();
|
|
49
|
+
});
|
|
50
|
+
initSearchPromise.then(() => {
|
|
51
|
+
|
|
52
|
+
let addIdPromise = new Promise((resolve, reject) => {
|
|
53
|
+
|
|
54
|
+
const targetNode = document.getElementById('searchCollapse');
|
|
55
|
+
const config = { attributes: true, childList: true, subtree: true };
|
|
56
|
+
const callback = function(mutationsList, observer) {
|
|
57
|
+
for(const mutation of mutationsList) {
|
|
58
|
+
if (mutation.type == 'childList') {
|
|
59
|
+
addId();
|
|
60
|
+
resolve();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const observer = new MutationObserver(callback);
|
|
65
|
+
observer.observe(targetNode, config);
|
|
66
|
+
// Later, you can stop observing
|
|
67
|
+
//observer.disconnect();
|
|
68
|
+
});
|
|
69
|
+
addIdPromise.then(() => {
|
|
70
|
+
checkXIcon();
|
|
71
|
+
const targetNode = document.getElementById('xIcon');
|
|
72
|
+
const config = { attributes: true, childList: true, subtree: true };
|
|
73
|
+
const callback = function(mutationsList, observer) {
|
|
74
|
+
for(const mutation of mutationsList) {
|
|
75
|
+
if (mutation.type == 'attributes') {
|
|
76
|
+
const xIsHidden = targetNode.getAttribute('style') === 'display: none;';
|
|
77
|
+
if (xIsHidden) {
|
|
78
|
+
removeClear();
|
|
79
|
+
} else {
|
|
80
|
+
clearXIcon();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const observer = new MutationObserver(callback);
|
|
86
|
+
observer.observe(targetNode, config);
|
|
87
|
+
// Later, you can stop observing
|
|
88
|
+
//observer.disconnect();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default moveSearchIcon;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import highlightNav from './highlightCurrentNav.js';
|
|
2
|
+
import closeMenuOnClick from './closeNavOnClick.js';
|
|
3
|
+
import moveSearchIcon from './moveSearchIcon.js';
|
|
4
|
+
import searchToggle from './searchToggleNav.js';
|
|
5
|
+
import toggleSearchDropdownOnWindowResize from './toggleNavSearchDropdownOnWindowResize.js';
|
|
6
|
+
|
|
7
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
8
|
+
highlightNav();
|
|
9
|
+
searchToggle();
|
|
10
|
+
moveSearchIcon();
|
|
11
|
+
closeMenuOnClick();
|
|
12
|
+
toggleSearchDropdownOnWindowResize();
|
|
13
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Custom JS to toggle the search form on mobile devices
|
|
2
|
+
function searchToggle() {
|
|
3
|
+
const searchButton = document.getElementById('searchIcon');
|
|
4
|
+
searchButton ?
|
|
5
|
+
document.addEventListener('click', function (event) {
|
|
6
|
+
const searchIconElement = document.getElementById('searchImg');
|
|
7
|
+
const searchCollapse = document.getElementById('searchCollapse');
|
|
8
|
+
const mainNav = document.getElementById('mainNav');
|
|
9
|
+
const globalNav = document.getElementById('globalNav');
|
|
10
|
+
const searchIconBackgroundImage = searchIconElement.style.backgroundImage;
|
|
11
|
+
const iconIsSearch = ( searchIconBackgroundImage.indexOf('assets/img/search.svg') != -1 );
|
|
12
|
+
const collapseAria = searchCollapse.getAttribute('aria-hidden');
|
|
13
|
+
const searchInputField = document.getElementById('gsc-i-id1');
|
|
14
|
+
|
|
15
|
+
function switchToX() {
|
|
16
|
+
searchIconElement.style.backgroundImage = 'url("/assets/img/x.svg")';
|
|
17
|
+
searchIconElement.setAttribute('alt', 'Close icon');
|
|
18
|
+
searchButton.setAttribute('aria-label', 'Toggle Close');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function switchToSearch() {
|
|
22
|
+
searchIconElement.style.backgroundImage = 'url("/assets/img/search.svg")';
|
|
23
|
+
searchIconElement.setAttribute('alt', 'Search icon');
|
|
24
|
+
searchButton.setAttribute('aria-label', 'Toggle Search');
|
|
25
|
+
searchInputField.focus();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// If the clicked element doesn't have the right selector, bail
|
|
29
|
+
if (!event.target.closest('#searchIcon')) return;
|
|
30
|
+
// Don't follow the link
|
|
31
|
+
event.preventDefault();
|
|
32
|
+
iconIsSearch ? switchToX() : switchToSearch();
|
|
33
|
+
searchCollapse.classList.toggle('nav-global__search-collapse--visible');
|
|
34
|
+
(collapseAria === "true") ? searchCollapse.setAttribute('aria-hidden', 'false') : searchCollapse.setAttribute('aria-hidden', 'true');
|
|
35
|
+
mainNav.classList.toggle('nav-local__search-toggle');
|
|
36
|
+
globalNav.classList.toggle('nav-global__search-toggle');
|
|
37
|
+
}, false)
|
|
38
|
+
: null;
|
|
39
|
+
}
|
|
40
|
+
export default searchToggle;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Custom JS to Close the Navigation menu, if its open, & if the screen goes above 992px wide (Bootstrap 4 'lg' devices)
|
|
2
|
+
const SEARCH_COLLAPSE_ID = 'searchCollapse'; // ID built into the sites' HTML
|
|
3
|
+
const SEARCH_COLLAPSE_IS_VISIBLE_CLASS = 'nav-global__search-collapse--visible'; // Class in the HTML when the search collapse is open/visible
|
|
4
|
+
const GLOBAL_NAV_ID = 'globalNav';
|
|
5
|
+
const LOCAL_NAV_ID = 'mainNav';
|
|
6
|
+
const GLOBAL_NAV_SEARCH_IS_VISIBLE_CLASS = 'nav-global__search-toggle';
|
|
7
|
+
const LOCAL_NAV_SEARCH_IS_VISIBLE_CLASS = 'nav-local__search-toggle';
|
|
8
|
+
const SEARCH_ICON_ID = 'searchIcon';
|
|
9
|
+
const SEARCH_ICON_SPAN_QUERY_SELECTOR = '#searchImg';
|
|
10
|
+
|
|
11
|
+
function removeClassFromElement(el, classToRemove) {
|
|
12
|
+
el.classList.remove(classToRemove);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function checkElementCollapseState(el, classToCheckFor) {
|
|
16
|
+
if ( ! el.classList.contains(classToCheckFor) )
|
|
17
|
+
return;
|
|
18
|
+
|
|
19
|
+
removeClassFromElement(el, classToCheckFor);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function toggleSearchIconToX(el) {
|
|
23
|
+
const span = el.querySelector(SEARCH_ICON_SPAN_QUERY_SELECTOR);
|
|
24
|
+
|
|
25
|
+
el.setAttribute('aria-label', 'Toggle Search');
|
|
26
|
+
span.setAttribute('alt', 'Open icon');
|
|
27
|
+
span.setAttribute('style', 'background-image: url("/assets/img/search.svg")');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function checkSearchToggleIcon(el) {
|
|
31
|
+
let ariaLabel = el.getAttribute('aria-label');
|
|
32
|
+
|
|
33
|
+
if ( ! ariaLabel === 'Toggle Close' )
|
|
34
|
+
return;
|
|
35
|
+
|
|
36
|
+
toggleSearchIconToX(el)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function windowResizeHandler() {
|
|
40
|
+
if ( window.innerWidth >= 992 ) {
|
|
41
|
+
const searchCollapseElement = document.getElementById(SEARCH_COLLAPSE_ID);
|
|
42
|
+
const globalNav = document.getElementById(GLOBAL_NAV_ID);
|
|
43
|
+
const localNav = document.getElementById(LOCAL_NAV_ID);
|
|
44
|
+
const searchIcon = document.getElementById(SEARCH_ICON_ID);
|
|
45
|
+
|
|
46
|
+
checkElementCollapseState(searchCollapseElement, SEARCH_COLLAPSE_IS_VISIBLE_CLASS);
|
|
47
|
+
checkElementCollapseState(globalNav, GLOBAL_NAV_SEARCH_IS_VISIBLE_CLASS);
|
|
48
|
+
checkElementCollapseState(localNav, LOCAL_NAV_SEARCH_IS_VISIBLE_CLASS);
|
|
49
|
+
checkSearchToggleIcon(searchIcon);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function toggleSearchDropdownOnWindowResize() {
|
|
54
|
+
window.addEventListener('resize', windowResizeHandler);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export default toggleSearchDropdownOnWindowResize;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import footerDate from './footerDate.js';
|
|
2
|
+
import lazyLoad from './lazyLoad.js';
|
|
3
|
+
import walkText from './walkText.js';
|
|
4
|
+
import initSliders from './sliders.js';
|
|
5
|
+
import watchForMenuClicks from './translate.js';
|
|
6
|
+
import wrapPowerText from './wrapPowerText.js';
|
|
7
|
+
//import ytEmbed from './ytEmbed.js';
|
|
8
|
+
//import test from './test.js';
|
|
9
|
+
|
|
10
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
11
|
+
wrapPowerText();
|
|
12
|
+
initSliders();
|
|
13
|
+
walkText(document.body);
|
|
14
|
+
footerDate();
|
|
15
|
+
lazyLoad();
|
|
16
|
+
watchForMenuClicks();
|
|
17
|
+
|
|
18
|
+
// polyfill for Element.closest() b/c IE can't handle an anchor.match() when the anchor has another element inside it (Like spans used for BS4 menu toggler)
|
|
19
|
+
if (!Element.prototype.matches) {
|
|
20
|
+
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!Element.prototype.closest) {
|
|
24
|
+
Element.prototype.closest = function(s) {
|
|
25
|
+
var el = this;
|
|
26
|
+
|
|
27
|
+
do {
|
|
28
|
+
if (el.matches(s)) return el;
|
|
29
|
+
el = el.parentElement || el.parentNode;
|
|
30
|
+
} while (el !== null && el.nodeType === 1);
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function doStuff() {
|
|
2
|
+
const materials = [
|
|
3
|
+
'Hydrogen',
|
|
4
|
+
'Helium',
|
|
5
|
+
'Lithium',
|
|
6
|
+
'Beryllium',
|
|
7
|
+
'Boron',
|
|
8
|
+
'Carbon',
|
|
9
|
+
'Nitrogen',
|
|
10
|
+
'Oxygen'
|
|
11
|
+
];
|
|
12
|
+
const data = materials.map(material => material.length + '<br>' + material + ' <br><hr>');
|
|
13
|
+
const theDiv = document.getElementById('theDiv');
|
|
14
|
+
theDiv.innerHTML = data;
|
|
15
|
+
}
|
|
16
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
17
|
+
doStuff();
|
|
18
|
+
});
|
|
@@ -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,88 @@
|
|
|
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 HERO_SLIDER_CLASSNAME = '.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
|
+
$(HERO_SLIDER_CLASSNAME).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
|
+
$(HERO_SLIDER_CLASSNAME).slick(slickState);
|
|
36
|
+
setAttributeOnEl(el, 'aria-label', newButtonText);
|
|
37
|
+
el.classList.toggle('hero-slider__button--play');
|
|
38
|
+
el.innerHTML = newButtonText;
|
|
39
|
+
|
|
40
|
+
newButtonTextIsPause ? $(HERO_SLIDER_CLASSNAME).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 SLICK_PARENT_EL = document.querySelector(HERO_SLIDER_CLASSNAME);
|
|
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
|
+
SLICK_PARENT_EL.appendChild(button);
|
|
63
|
+
watchForElementClicks(button);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function watchForSlickInit(initFunction) {
|
|
67
|
+
// slick's on 'init' function (See events in slick docs):
|
|
68
|
+
$(HERO_SLIDER_CLASSNAME).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(HERO_SLIDER_CLASSNAME) )
|
|
76
|
+
return;
|
|
77
|
+
|
|
78
|
+
watchForSlickInit(initSlick);
|
|
79
|
+
}
|
|
80
|
+
//
|
|
81
|
+
// USAGE:
|
|
82
|
+
//
|
|
83
|
+
// import initSliders from './sliders.js';
|
|
84
|
+
//
|
|
85
|
+
// document.addEventListener('DOMContentLoaded', function() {
|
|
86
|
+
// initSliders();
|
|
87
|
+
// });
|
|
88
|
+
export default initSliders;
|