kcc-gem-theme 1.65.57
Sign up to get free protection for your applications and to get access to all the features.
- 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 = $('#headerGlobalNavbarContent'); // Bootstrap 4 crap that requires $() w/ an ID from the HTML
|
3
|
+
const MENU_COLLAPSE = 'headerGlobalNavbarContent'; // 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,112 @@
|
|
1
|
+
import initSearchToggle from './searchToggleMegaNav.js';
|
2
|
+
|
3
|
+
const FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR = [
|
4
|
+
'#gsc-i-id1',
|
5
|
+
'#gs_st50 .gsst_a',
|
6
|
+
'.gsc-search-button .gsc-search-button.gsc-search-button-v2'
|
7
|
+
];
|
8
|
+
const SEARCH_INPUT_ID = 'gsc-i-id1'; // ID OF THE GOOGLE CUSTOM SEARCH (GCS) INPUT ELEMENT // Not in the DOM until the GCS JS fires `gcsInit()`
|
9
|
+
const SEARCH_DIV_WRAPPER_ID = 'searchCollapse'; // ID OF THE DIV BUILT INTO THE SITES HTML WHICH WRAPS THE GCS
|
10
|
+
|
11
|
+
function checkXIcon() {
|
12
|
+
const checkXIconOnLoad = (function() {
|
13
|
+
let executed = false;
|
14
|
+
return function() {
|
15
|
+
if (!executed) {
|
16
|
+
executed = true;
|
17
|
+
// do checkXIconOnLoad
|
18
|
+
const icon = document.getElementById('xIcon');
|
19
|
+
const xIsHidden = icon.getAttribute('style') === 'display: none;';
|
20
|
+
xIsHidden ? removeClear() : clearXIcon();
|
21
|
+
}
|
22
|
+
};
|
23
|
+
})();
|
24
|
+
checkXIconOnLoad(); // "do checkXIconOnLoad" happens
|
25
|
+
}
|
26
|
+
|
27
|
+
function clearXIcon() {
|
28
|
+
const targetEl = document.querySelector('button.gsc-search-button-v2');
|
29
|
+
targetEl.classList.add('gsc-overrides__clear-x');
|
30
|
+
}
|
31
|
+
|
32
|
+
function removeClear() {
|
33
|
+
const targetEl = document.querySelector('button.gsc-search-button-v2');
|
34
|
+
targetEl.classList.remove('gsc-overrides__clear-x');
|
35
|
+
}
|
36
|
+
|
37
|
+
function addId() {
|
38
|
+
const xIcon = document.querySelector('.gsst_a');
|
39
|
+
xIcon.setAttribute('id', 'xIcon');
|
40
|
+
}
|
41
|
+
|
42
|
+
function addAttribute(selector, attr, val) {
|
43
|
+
const el = document.querySelector(selector);
|
44
|
+
|
45
|
+
el.setAttribute(attr, val);
|
46
|
+
}
|
47
|
+
|
48
|
+
function gcsInit() { // Init The GCS JS
|
49
|
+
var cx = '006320264078644364913:sy48bet-lr8';
|
50
|
+
var gcse = document.createElement('script');
|
51
|
+
gcse.type = 'text/javascript';
|
52
|
+
gcse.async = true;
|
53
|
+
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
|
54
|
+
var s = document.getElementsByTagName('script')[0];
|
55
|
+
s.parentNode.insertBefore(gcse, s);
|
56
|
+
}
|
57
|
+
|
58
|
+
function googleCustomSearchInit() {
|
59
|
+
if ( document.getElementById(SEARCH_DIV_WRAPPER_ID) ) {
|
60
|
+
let initSearchPromise = new Promise((resolve, reject) => {
|
61
|
+
gcsInit();
|
62
|
+
resolve();
|
63
|
+
});
|
64
|
+
initSearchPromise.then(() => {
|
65
|
+
let addIdPromise = new Promise((resolve, reject) => {
|
66
|
+
|
67
|
+
const targetNode = document.getElementById('searchCollapse');
|
68
|
+
const config = { attributes: true, childList: true, subtree: true };
|
69
|
+
const callback = function(mutationsList, observer) {
|
70
|
+
for(const mutation of mutationsList) {
|
71
|
+
if (mutation.type == 'childList') {
|
72
|
+
addId();
|
73
|
+
let len = FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR.length;
|
74
|
+
for (var i = 0; i < len; i++) {
|
75
|
+
addAttribute(FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR[i], 'tabindex', '-1'); // Make Elements initially unfocusable, so that screen readers don't pick up the hidden GCS
|
76
|
+
}
|
77
|
+
resolve();
|
78
|
+
}
|
79
|
+
}
|
80
|
+
};
|
81
|
+
const observer = new MutationObserver(callback); // Using a MutationObserver to watch for changes in the Google Custom Search Elements that got built into the page from `gcsInit()`
|
82
|
+
observer.observe(targetNode, config);
|
83
|
+
// Later, you can stop observing
|
84
|
+
//observer.disconnect();
|
85
|
+
});
|
86
|
+
addIdPromise.then(() => {
|
87
|
+
checkXIcon();
|
88
|
+
const targetNode = document.getElementById('xIcon');
|
89
|
+
const config = { attributes: true, childList: true, subtree: true };
|
90
|
+
const callback = function(mutationsList, observer) {
|
91
|
+
for(const mutation of mutationsList) {
|
92
|
+
if (mutation.type == 'attributes') {
|
93
|
+
const xIsHidden = targetNode.getAttribute('style') === 'display: none;';
|
94
|
+
if (xIsHidden) {
|
95
|
+
removeClear();
|
96
|
+
} else {
|
97
|
+
clearXIcon();
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
};
|
102
|
+
const observer = new MutationObserver(callback);
|
103
|
+
observer.observe(targetNode, config);
|
104
|
+
// Later, you can stop observing
|
105
|
+
//observer.disconnect();
|
106
|
+
initSearchToggle();
|
107
|
+
});
|
108
|
+
});
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
export default googleCustomSearchInit;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import toggleMenuOnWindowResize from './toggleMenuOnWindowResize.js';
|
2
|
+
import toggleDropdownOnWindowResize from './toggleDropdownOnWindowResizeTwo.js';
|
3
|
+
import googleCustomSearchInit from './googleCustomSearch.js';
|
4
|
+
import closeMenuOnClick from './closeMegaNavOnClick.js';
|
5
|
+
import underlineCurrentSite from './underlineCurrentSite.js';
|
6
|
+
|
7
|
+
document.addEventListener('DOMContentLoaded', function() {
|
8
|
+
googleCustomSearchInit();
|
9
|
+
underlineCurrentSite();
|
10
|
+
toggleMenuOnWindowResize();
|
11
|
+
toggleDropdownOnWindowResize();
|
12
|
+
closeMenuOnClick();
|
13
|
+
});
|
@@ -0,0 +1,96 @@
|
|
1
|
+
// Custom JS to toggle the search form
|
2
|
+
const FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR = [
|
3
|
+
'#gsc-i-id1',
|
4
|
+
'#gs_st50 .gsst_a',
|
5
|
+
'.gsc-search-button .gsc-search-button.gsc-search-button-v2'
|
6
|
+
]; // Elements that Google Custom Search builds into the page
|
7
|
+
const OPEN_SEARCH_BUTTON_ID = 'openSearchButton';
|
8
|
+
const OPEN_SEARCH_BUTTON_CLASS = 'header-global__search-icon';
|
9
|
+
const CLOSE_SEARCH_BUTTON_ID = 'closeSearchButton';
|
10
|
+
const CLOSE_SEARCH_BUTTON_CLASS = 'header-global__close-icon';
|
11
|
+
const SEARCH_INPUT_ID = 'gsc-i-id1'; // An element that Google Custom Search builds into the page
|
12
|
+
const HEADER_GLOBAL_NAV_ID = 'headerGlobalNavbar';
|
13
|
+
const SEARCH_COLLAPSE_ID = 'searchCollapse';
|
14
|
+
|
15
|
+
function setElementAttribute(selector, attr, val) {
|
16
|
+
const el = document.querySelector(selector);
|
17
|
+
|
18
|
+
el.setAttribute(attr, val);
|
19
|
+
}
|
20
|
+
|
21
|
+
function toggleButtonAttributes(button, removeButtonOption, buttonClass) {
|
22
|
+
if ( removeButtonOption ) {
|
23
|
+
button.classList.add(buttonClass + '--hidden');
|
24
|
+
button.setAttribute('aria-hidden', 'true');
|
25
|
+
button.setAttribute('tabindex', '-1');
|
26
|
+
} else {
|
27
|
+
button.classList.remove(buttonClass + '--hidden');
|
28
|
+
button.setAttribute('aria-hidden', 'false');
|
29
|
+
button.setAttribute('tabindex', '0');
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
function handleSearchToggle(searchButtonWasClicked) {
|
34
|
+
const searchButtonEl = document.getElementById(OPEN_SEARCH_BUTTON_ID);
|
35
|
+
const closeButtonEl = document.getElementById(CLOSE_SEARCH_BUTTON_ID);
|
36
|
+
const searchInputField = document.getElementById(SEARCH_INPUT_ID);
|
37
|
+
let len = FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR.length;
|
38
|
+
|
39
|
+
if ( searchButtonWasClicked ) {
|
40
|
+
toggleButtonAttributes(searchButtonEl, true, OPEN_SEARCH_BUTTON_CLASS);
|
41
|
+
toggleButtonAttributes(closeButtonEl, false, CLOSE_SEARCH_BUTTON_CLASS);
|
42
|
+
for (var i = 0; i < len; i++) {
|
43
|
+
setElementAttribute(FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR[i], 'tabindex', '0');
|
44
|
+
}
|
45
|
+
searchInputField.focus();
|
46
|
+
} else {
|
47
|
+
toggleButtonAttributes(searchButtonEl, false, OPEN_SEARCH_BUTTON_CLASS);
|
48
|
+
toggleButtonAttributes(closeButtonEl, true, CLOSE_SEARCH_BUTTON_CLASS);
|
49
|
+
for (var i = 0; i < len; i++) {
|
50
|
+
setElementAttribute(FOCUSABLE_GOOGLE_CUSTOM_SEARCH_SELECTORS_ARR[i], 'tabindex', '-1');
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
function toggleOtherElements() {
|
56
|
+
const searchCollapse = document.getElementById(SEARCH_COLLAPSE_ID);
|
57
|
+
const headerGlobalNavbar = document.getElementById(HEADER_GLOBAL_NAV_ID);
|
58
|
+
const collapseAria = searchCollapse.getAttribute('aria-hidden');
|
59
|
+
|
60
|
+
searchCollapse.classList.toggle('header-global__search-collapse--visible');
|
61
|
+
(collapseAria === "true") ? searchCollapse.setAttribute('aria-hidden', 'false') : searchCollapse.setAttribute('aria-hidden', 'true');
|
62
|
+
headerGlobalNavbar.classList.toggle('header-global__navbar--search-toggle');
|
63
|
+
}
|
64
|
+
|
65
|
+
function checkClickedButton(event) {
|
66
|
+
let openSearchButtonWasClicked;
|
67
|
+
|
68
|
+
if ( event.target.closest('#openSearchButton') ) {
|
69
|
+
openSearchButtonWasClicked = true;
|
70
|
+
} else if ( event.target.closest('#closeSearchButton') ) {
|
71
|
+
openSearchButtonWasClicked = false;
|
72
|
+
}
|
73
|
+
handleSearchToggle(openSearchButtonWasClicked);
|
74
|
+
toggleOtherElements();
|
75
|
+
}
|
76
|
+
|
77
|
+
function clickEventHandler(event) {
|
78
|
+
if ( event.target.closest('#openSearchButton') || event.target.closest('#closeSearchButton') ) {
|
79
|
+
checkClickedButton(event);
|
80
|
+
} else {
|
81
|
+
return; // Bail-out
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
function addClickEventListener() {
|
86
|
+
document.addEventListener('click', clickEventHandler);
|
87
|
+
}
|
88
|
+
|
89
|
+
function initSearchToggle() {
|
90
|
+
if ( ! document.getElementById('openSearchButton') )
|
91
|
+
return;
|
92
|
+
|
93
|
+
addClickEventListener();
|
94
|
+
}
|
95
|
+
|
96
|
+
export default initSearchToggle;
|
@@ -0,0 +1,78 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
//
|
4
|
+
// TODO: Combine method bellow with a class added to the nav when it is desktop size and above
|
5
|
+
//
|
6
|
+
//
|
7
|
+
//
|
8
|
+
//
|
9
|
+
//
|
10
|
+
// Custom JS to Close the Navigation menu, if its open, & if the screen goes above 992px wide (Bootstrap 4 'lg' devices)
|
11
|
+
const NAV_ELEMENT_ID_STRING = 'headerGlobalNavbar';
|
12
|
+
const NAVBAR_COLLAPSE_ID = 'headerGlobalNavbarContent'; // ID built into the sites' HTML
|
13
|
+
const NAVBAR_IS_DESKTOP = 'header-global__navbar--lg';
|
14
|
+
const NAVBAR_ELEMENT = document.getElementById(NAV_ELEMENT_ID_STRING);
|
15
|
+
|
16
|
+
function removeClassFromElement(el, classString) {
|
17
|
+
el.classList.remove(classString);
|
18
|
+
}
|
19
|
+
|
20
|
+
function collapseElement(dropdownToggle) {
|
21
|
+
//console.log( $(dropdownToggle) );
|
22
|
+
$(dropdownToggle).collapse('hide'); // Bootstrap 4 `.collapse()` method.
|
23
|
+
removeClassFromElement(NAVBAR_ELEMENT, NAVBAR_IS_DESKTOP);
|
24
|
+
|
25
|
+
}
|
26
|
+
|
27
|
+
function checkDropdownCollapseState(el) {
|
28
|
+
let dropdownToggle = el.parentElement
|
29
|
+
//console.log(el.parentElement.classList);
|
30
|
+
if ( dropdownToggle.classList.contains('show') ) { // 'show' is a Bootstrap 4 class that makes `.collapse` items visible. // Checking to see if the Menu is open
|
31
|
+
//console.log(el);
|
32
|
+
collapseElement(dropdownToggle);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
function loopOverNodeList(nodeList) {
|
37
|
+
//console.log(nodeList);
|
38
|
+
let len = nodeList.length;
|
39
|
+
|
40
|
+
for (var i = 0; i < len; i++) {
|
41
|
+
const dropdownMenu = nodeList[i];
|
42
|
+
|
43
|
+
checkDropdownCollapseState(dropdownMenu);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
function windowResizeHandler() {
|
48
|
+
const navbarEl = windowResizeHandler.element;
|
49
|
+
|
50
|
+
if ( window.innerWidth <= 992 && navbarEl.classList.contains(NAVBAR_IS_DESKTOP) ) {
|
51
|
+
const menuCollapseElement = document.getElementById(NAVBAR_COLLAPSE_ID);
|
52
|
+
const dropdownMenuNodeList = menuCollapseElement.querySelectorAll('.dropdown-toggle');
|
53
|
+
|
54
|
+
loopOverNodeList(dropdownMenuNodeList);
|
55
|
+
//checkNavbarCollapseState(menuCollapseElement);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
function addClassToElement(el, classString) {
|
60
|
+
el.classList.add(classString);
|
61
|
+
}
|
62
|
+
|
63
|
+
function checkWindowWidth() {
|
64
|
+
const windowIsWiderThanBootStrapLarge = window.innerWidth >= 992;
|
65
|
+
|
66
|
+
windowIsWiderThanBootStrapLarge ?
|
67
|
+
addClassToElement(NAVBAR_ELEMENT, NAVBAR_IS_DESKTOP)
|
68
|
+
: null;
|
69
|
+
}
|
70
|
+
|
71
|
+
function toggleDropdownOnWindowResize() {
|
72
|
+
|
73
|
+
windowResizeHandler.element = NAVBAR_ELEMENT;
|
74
|
+
checkWindowWidth();
|
75
|
+
window.addEventListener('resize', windowResizeHandler);
|
76
|
+
}
|
77
|
+
|
78
|
+
export default toggleDropdownOnWindowResize;
|
@@ -0,0 +1,54 @@
|
|
1
|
+
// Custom JS to make the site look pretty while ITS shrinks and expands the window with the menu open
|
2
|
+
const NAV_ELEMENT_ID_STRING = 'headerGlobalNavbar'; // ID built into the site's HMTL
|
3
|
+
const NAVBAR_COLLAPSE_ID = 'headerGlobalNavbarContent'; // ID built into the sites' HTML
|
4
|
+
const GLOBAL_NAVIGATION_ITEMS = 'navGlobalBottom'; // ID built into the site's HMTL
|
5
|
+
const NAVBAR_ELEMENT = document.getElementById(NAV_ELEMENT_ID_STRING); // The <nav> element built into the site's HMTL
|
6
|
+
const BOOTSTRAP_COLLAPSE_SHOW_CLASS_STRING = 'show';
|
7
|
+
const BOOTSTRAP_DROPDOWN_TOGGLER_CLASS = '.dropdown-toggle'; // Class specific to Bootstrap 4 code
|
8
|
+
|
9
|
+
function openNavigationCollapse() {
|
10
|
+
|
11
|
+
if ( NAVBAR_ELEMENT.navbar_toggled === true ) // Track if the navbar has already been toggled
|
12
|
+
return; // Bail-out to prevent repetitive calls to the code below (without this the code is called many, many, many times while the screen is resizing)
|
13
|
+
|
14
|
+
const menuCollapseElement = document.getElementById(NAVBAR_COLLAPSE_ID);
|
15
|
+
|
16
|
+
NAVBAR_ELEMENT.navbar_toggled = true;
|
17
|
+
$(menuCollapseElement).collapse(BOOTSTRAP_COLLAPSE_SHOW_CLASS_STRING); // BOOTSTRAP 4 METHOD (requires jQuery (yuck!).)!!! Official BS4 docs on `.collapse()` https://getbootstrap.com/docs/4.4/components/collapse/#via-javascript
|
18
|
+
}
|
19
|
+
|
20
|
+
function checkForOpenDropdownMenus(menuItem) {
|
21
|
+
const dropdown = menuItem.parentElement;
|
22
|
+
|
23
|
+
if ( dropdown.classList.contains(BOOTSTRAP_COLLAPSE_SHOW_CLASS_STRING) ) {
|
24
|
+
openNavigationCollapse();
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
function loopOverDropdownItems(nodeList) {
|
29
|
+
let len = nodeList.length;
|
30
|
+
|
31
|
+
for (var i = 0; i < len; i++) {
|
32
|
+
checkForOpenDropdownMenus(nodeList[i]);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
function windowResizeHandler() {
|
37
|
+
const dropdownToggleNodeList = document.getElementById(GLOBAL_NAVIGATION_ITEMS).querySelectorAll(BOOTSTRAP_DROPDOWN_TOGGLER_CLASS);
|
38
|
+
|
39
|
+
if ( window.innerWidth <= 992 ) {
|
40
|
+
loopOverDropdownItems(dropdownToggleNodeList);
|
41
|
+
} else {
|
42
|
+
NAVBAR_ELEMENT.navbar_toggled = false;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
function toggleDropdownOnWindowResize() {
|
47
|
+
|
48
|
+
if ( ! NAVBAR_ELEMENT )
|
49
|
+
return;
|
50
|
+
|
51
|
+
window.addEventListener('resize', windowResizeHandler);
|
52
|
+
}
|
53
|
+
|
54
|
+
export default toggleDropdownOnWindowResize;
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Custom JS to Close the Navigation menu, if its open, & if the screen goes above 992px wide (Bootstrap 4 'lg' devices)
|
2
|
+
const NAVBAR_COLLAPSE_ID = 'headerGlobalNavbarContent'; // ID built into the sites' HTML
|
3
|
+
|
4
|
+
function collapseElement(el) {
|
5
|
+
$(el).collapse('hide'); // Bootstrap 4 `.collapse()` method.
|
6
|
+
}
|
7
|
+
|
8
|
+
function checkNavbarCollapseState(menuEl) {
|
9
|
+
if ( menuEl.classList.contains('show') ) { // 'show' is a Bootstrap 4 class that makes `.collapse` items visible. // Checking to see if the Menu is open
|
10
|
+
collapseElement(menuEl);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
function windowResizeHandler() {
|
15
|
+
if ( window.innerWidth >= 992 ) {
|
16
|
+
const menuCollapseElement = document.getElementById(NAVBAR_COLLAPSE_ID);
|
17
|
+
|
18
|
+
checkNavbarCollapseState(menuCollapseElement);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
function toggleMenuOnWindowResize() {
|
23
|
+
window.addEventListener('resize', windowResizeHandler);
|
24
|
+
}
|
25
|
+
|
26
|
+
export default toggleMenuOnWindowResize;
|
@@ -0,0 +1,22 @@
|
|
1
|
+
const NAV_GLOBAL_BOTTOM_NAV_ITEMS = document.getElementById('navGlobalBottom'); // ID from the HTML
|
2
|
+
|
3
|
+
function underlineCurrentSite() {
|
4
|
+
// JS is fun!
|
5
|
+
if (window.location.pathname === '/') // YOU DON'T NEED TO RUN THIS ON THE HOMEPAGE!!
|
6
|
+
return;
|
7
|
+
//console.log('execution of further functions has ceased.');
|
8
|
+
const NAV_ITEMS = NAV_GLOBAL_BOTTOM_NAV_ITEMS.querySelectorAll('li'); // Navigation HTML structure uses <ul><li>...</li><li>...</li></ul> which is common markup for a Bootrap's nav (from their documentation)
|
9
|
+
const url = window.location.pathname.replace(/(^\/|\/$)/g, '');
|
10
|
+
//console.log(url);
|
11
|
+
|
12
|
+
for (let i = 0, len = NAV_ITEMS.length; i < len; i++) {
|
13
|
+
let NAV_CATEGORIES = NAV_ITEMS[i].dataset.nav; // Comes from data-set attributes built into the HTML
|
14
|
+
|
15
|
+
if ( url.search(NAV_CATEGORIES) !== -1 ) {
|
16
|
+
let NAV_LINK = NAV_ITEMS[i].querySelector('a'); // Again, pretty standard bootstrap navigation HTML struture to have anchors in the <li>
|
17
|
+
|
18
|
+
return NAV_LINK.classList.add('header-global__nav-bottom--underlined'); // return breaks the loop and this is the class to underline stuff with
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
export default underlineCurrentSite;
|