kcc-gem-theme 1.65.57

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +138 -0
  4. data/_data/cache_bust_css.yml +1 -0
  5. data/_data/navigation.yml +96 -0
  6. data/_data/theme_hash.yml +1 -0
  7. data/_includes/accordion.html +28 -0
  8. data/_includes/alerts.html +2 -0
  9. data/_includes/benefits.html +98 -0
  10. data/_includes/body.html +8 -0
  11. data/_includes/bottom-action-call.html +10 -0
  12. data/_includes/card-section.html +27 -0
  13. data/_includes/chat-now.html +8 -0
  14. data/_includes/check-mark.svg +17 -0
  15. data/_includes/contacts-tan.html +69 -0
  16. data/_includes/contacts.html +67 -0
  17. data/_includes/document-head.html +13 -0
  18. data/_includes/emergency-alert.html +9 -0
  19. data/_includes/emergency-alerts.html +29 -0
  20. data/_includes/foot.html +3 -0
  21. data/_includes/footer.html +168 -0
  22. data/_includes/header-global.html +25 -0
  23. data/_includes/header.html +28 -0
  24. data/_includes/hero-slider.html +23 -0
  25. data/_includes/image-slider.html +23 -0
  26. data/_includes/nav-global-bottom.html +30 -0
  27. data/_includes/nav-global-local.html +29 -0
  28. data/_includes/nav-global-top.html +14 -0
  29. data/_includes/nav-global.html +117 -0
  30. data/_includes/nav-landing.html +111 -0
  31. data/_includes/nav-local.html +34 -0
  32. data/_includes/nav-sub.html +19 -0
  33. data/_includes/old-head.html +28 -0
  34. data/_includes/scripts/custom.html +2 -0
  35. data/_includes/scripts/emergency-alerts.html +2 -0
  36. data/_includes/scripts/google-api.html +2 -0
  37. data/_includes/scripts/google-noscript.html +6 -0
  38. data/_includes/scripts/google-tag.html +24 -0
  39. data/_includes/scripts/kcc-alerts.html +2 -0
  40. data/_includes/scripts/kcc-mega-nav.html +2 -0
  41. data/_includes/scripts/kcc-nav.html +2 -0
  42. data/_includes/scripts/kcc-theme-landing.html +2 -0
  43. data/_includes/scripts/kcc-theme.html +2 -0
  44. data/_includes/scripts/table-cdn.html +6 -0
  45. data/_includes/scripts/translate.html +11 -0
  46. data/_includes/scripts/vendor-cdn.html +6 -0
  47. data/_includes/styles/fonts.html +11 -0
  48. data/_includes/styles/main.html +8 -0
  49. data/_includes/styles/vendor.html +6 -0
  50. data/_includes/svg/check.html +11 -0
  51. data/_includes/svg/goals.html +17 -0
  52. data/_includes/svg/kcc-copy.html +62 -0
  53. data/_includes/svg/kcc.html +59 -0
  54. data/_includes/svg/kcc.svg +59 -0
  55. data/_includes/svg/love.html +6 -0
  56. data/_includes/svg/save-money.html +40 -0
  57. data/_includes/tabbed-content.html +21 -0
  58. data/_includes/targetx-form.html +370 -0
  59. data/_includes/targetx-head.html +48 -0
  60. data/_includes/translate.html +3 -0
  61. data/_layouts/default-core.html +31 -0
  62. data/_layouts/default-landing.html +31 -0
  63. data/_layouts/default.html +32 -0
  64. data/_layouts/landing-page.html +8 -0
  65. data/_layouts/landing-simple.html +29 -0
  66. data/_layouts/markdown.html +13 -0
  67. data/_layouts/page.html +8 -0
  68. data/_layouts/sub-nav.html +6 -0
  69. data/_layouts/thank-you.html +18 -0
  70. data/assets/css/content.css +1 -0
  71. data/assets/css/kcc-theme.css +1 -0
  72. data/assets/css/main.css +1 -0
  73. data/assets/css/translate.css +1 -0
  74. data/assets/img/2016-senior-viewbook.jpg +0 -0
  75. data/assets/img/ATEC-DSC_1033.jpeg +0 -0
  76. data/assets/img/DSC_5650_helpful.jpg +0 -0
  77. data/assets/img/DSC_8724_4x3.jpg +0 -0
  78. data/assets/img/alert.svg +13 -0
  79. data/assets/img/baseball.svg +40 -0
  80. data/assets/img/basketball.svg +17 -0
  81. data/assets/img/blank-contact.svg +10 -0
  82. data/assets/img/blue-next.svg +9 -0
  83. data/assets/img/blue-prev.svg +9 -0
  84. data/assets/img/calendar.svg +24 -0
  85. data/assets/img/cavaliers-16x9-thumb.png +0 -0
  86. data/assets/img/cavaliers-logo.png +0 -0
  87. data/assets/img/cavaliers-logo_white.png +0 -0
  88. data/assets/img/d-daun2.jpg +0 -0
  89. data/assets/img/dbl-next.svg +16 -0
  90. data/assets/img/dbl-next_mobile.svg +16 -0
  91. data/assets/img/dbl-prev.svg +16 -0
  92. data/assets/img/dbl-prev_mobile.svg +16 -0
  93. data/assets/img/e-tech_a-roberts_mar2016_D41_6690.jpg +0 -0
  94. data/assets/img/facebook-f_white.svg +9 -0
  95. data/assets/img/fafsa-early-bird-banner-18.jpg +0 -0
  96. data/assets/img/go_cavs_20171002_193828-web.jpg +0 -0
  97. data/assets/img/heading-bg-underline-tan.png +0 -0
  98. data/assets/img/heading-bg-underline-transparent.png +0 -0
  99. data/assets/img/heading-bg-underline.png +0 -0
  100. data/assets/img/instagram-white.svg +20 -0
  101. data/assets/img/itransfer.png +0 -0
  102. data/assets/img/kankakee-community-college-word-logo.svg +88 -0
  103. data/assets/img/kcc-logo-inverse.svg +21 -0
  104. data/assets/img/kcc-logo.svg +74 -0
  105. data/assets/img/kcc-placeholder-square.png +0 -0
  106. data/assets/img/kcc-placeholder.png +0 -0
  107. data/assets/img/kcc-text-logo.svg +89 -0
  108. data/assets/img/linkedin-white.svg +13 -0
  109. data/assets/img/loader.gif +0 -0
  110. data/assets/img/menu-bg.png +0 -0
  111. data/assets/img/miguel2.jpg +0 -0
  112. data/assets/img/news.svg +19 -0
  113. data/assets/img/pause.svg +20 -0
  114. data/assets/img/pause_mobile.svg +20 -0
  115. data/assets/img/pinterest-p_white.svg +16 -0
  116. data/assets/img/placeholder.png +0 -0
  117. data/assets/img/play.svg +12 -0
  118. data/assets/img/play_mobile.svg +12 -0
  119. data/assets/img/riverfrontcampus.jpg +0 -0
  120. data/assets/img/search.svg +18 -0
  121. data/assets/img/soccer.svg +17 -0
  122. data/assets/img/social-icon.svg +13 -0
  123. data/assets/img/twitter-white.svg +14 -0
  124. data/assets/img/video.svg +10 -0
  125. data/assets/img/volleyball.svg +15 -0
  126. data/assets/img/x.svg +10 -0
  127. data/assets/img/youtube-white.svg +9 -0
  128. data/assets/img/yt-loading.png +0 -0
  129. data/assets/img/zippia.png +0 -0
  130. data/assets/js/dist/main.bundle.js +1 -0
  131. data/assets/js/theme/alerts/alerts.js +5 -0
  132. data/assets/js/theme/alerts/campusAlertsSheetsAPI.js +41 -0
  133. data/assets/js/theme/alerts/createAlertsHtml.js +93 -0
  134. data/assets/js/theme/alerts/parseMarkdownToHTML.js +85 -0
  135. data/assets/js/theme/alerts/simpleSetSheetParameters.js +23 -0
  136. data/assets/js/theme/dist/alerts.bundle.js +1 -0
  137. data/assets/js/theme/dist/kcc-mega-nav.bundle.js +1 -0
  138. data/assets/js/theme/dist/kcc-nav.bundle.js +1 -0
  139. data/assets/js/theme/dist/kcc-theme-landing.bundle.js +1 -0
  140. data/assets/js/theme/dist/kcc-theme.bundle.js +1 -0
  141. data/assets/js/theme/landing/landing.js +5 -0
  142. data/assets/js/theme/landing/landingPage.js +49 -0
  143. data/assets/js/theme/nav/megaNav/closeMegaNavOnClick.js +50 -0
  144. data/assets/js/theme/nav/megaNav/googleCustomSearch.js +112 -0
  145. data/assets/js/theme/nav/megaNav/megaNav.js +13 -0
  146. data/assets/js/theme/nav/megaNav/searchToggleMegaNav.js +96 -0
  147. data/assets/js/theme/nav/megaNav/toggleDropdownOnWindowResize.js +78 -0
  148. data/assets/js/theme/nav/megaNav/toggleDropdownOnWindowResizeTwo.js +54 -0
  149. data/assets/js/theme/nav/megaNav/toggleMenuOnWindowResize.js +26 -0
  150. data/assets/js/theme/nav/megaNav/underlineCurrentSite.js +22 -0
  151. data/assets/js/theme/nav/nav/closeNavOnClick.js +50 -0
  152. data/assets/js/theme/nav/nav/highlightCurrentNav.js +56 -0
  153. data/assets/js/theme/nav/nav/moveSearchIcon.js +94 -0
  154. data/assets/js/theme/nav/nav/nav.js +13 -0
  155. data/assets/js/theme/nav/nav/searchToggleNav.js +40 -0
  156. data/assets/js/theme/nav/nav/toggleNavSearchDropdownOnWindowResize.js +57 -0
  157. data/assets/js/theme/src/all.js +34 -0
  158. data/assets/js/theme/src/babelTest.js +18 -0
  159. data/assets/js/theme/src/footerDate.js +7 -0
  160. data/assets/js/theme/src/lazyLoad.js +13 -0
  161. data/assets/js/theme/src/sliders.js +88 -0
  162. data/assets/js/theme/src/test.js +5 -0
  163. data/assets/js/theme/src/translate.js +56 -0
  164. data/assets/js/theme/src/walkText.js +16 -0
  165. data/assets/js/theme/src/wrapPowerText.js +21 -0
  166. data/assets/js/theme/src/ytEmbed.js +30 -0
  167. data/assets/scss/0-tools/_bootstrap-overrides.scss +72 -0
  168. data/assets/scss/0-tools/_cloudcannon.scss +16 -0
  169. data/assets/scss/0-tools/_google-translate-overrides.scss +114 -0
  170. data/assets/scss/0-tools/_gsc-overrides.scss +144 -0
  171. data/assets/scss/0-tools/_targetx-overrides.scss +76 -0
  172. data/assets/scss/0-tools/_vars.scss +67 -0
  173. data/assets/scss/1-base/_background.scss +5 -0
  174. data/assets/scss/1-base/_buttons.scss +83 -0
  175. data/assets/scss/1-base/_header-global.scss +454 -0
  176. data/assets/scss/1-base/_img.scss +17 -0
  177. data/assets/scss/1-base/_links.scss +120 -0
  178. data/assets/scss/1-base/_typography.scss +641 -0
  179. data/assets/scss/2-modules/_accordion.scss +34 -0
  180. data/assets/scss/2-modules/_benefits.scss +371 -0
  181. data/assets/scss/2-modules/_campus-alerts.scss +3 -0
  182. data/assets/scss/2-modules/_card-section.scss +9 -0
  183. data/assets/scss/2-modules/_contacts.scss +46 -0
  184. data/assets/scss/2-modules/_error.scss +10 -0
  185. data/assets/scss/2-modules/_footer.scss +80 -0
  186. data/assets/scss/2-modules/_header.scss +21 -0
  187. data/assets/scss/2-modules/_hero-slider.scss +330 -0
  188. data/assets/scss/2-modules/_img-hover.scss +70 -0
  189. data/assets/scss/2-modules/_loader.scss +9 -0
  190. data/assets/scss/2-modules/_nav-global.scss +315 -0
  191. data/assets/scss/2-modules/_nav-landing.scss +203 -0
  192. data/assets/scss/2-modules/_nav-local.scss +45 -0
  193. data/assets/scss/2-modules/_sliders.scss +191 -0
  194. data/assets/scss/2-modules/_social-icons.scss +36 -0
  195. data/assets/scss/2-modules/_sub-nav.scss +32 -0
  196. data/assets/scss/2-modules/_yt-embed.scss +14 -0
  197. data/assets/scss/3-layout/_background.scss +3 -0
  198. data/assets/scss/3-layout/_content.scss +37 -0
  199. data/assets/scss/3-layout/_margins.scss +22 -0
  200. data/assets/scss/3-layout/_padding.scss +19 -0
  201. data/assets/scss/3-layout/_positioning.scss +341 -0
  202. data/assets/scss/3-layout/_section.scss +22 -0
  203. data/assets/scss/3-layout/_tables.scss +8 -0
  204. data/assets/scss/3-layout/_thank-you.scss +5 -0
  205. data/assets/scss/4-pages/index/_home.scss +15 -0
  206. data/assets/scss/kcc-theme.scss +49 -0
  207. data/assets/scss/translate.scss +5 -0
  208. data/assets/vendor/css/ajax-loader.gif +0 -0
  209. data/assets/vendor/css/bootstrap.min.css +7 -0
  210. data/assets/vendor/css/fonts/slick.eot +0 -0
  211. data/assets/vendor/css/fonts/slick.ttf +0 -0
  212. data/assets/vendor/css/fonts/slick.woff +0 -0
  213. data/assets/vendor/css/mli7lsm.css +22 -0
  214. data/assets/vendor/css/slick-theme.min.css +8 -0
  215. data/assets/vendor/css/slick.min.css +8 -0
  216. data/assets/vendor/font/slick.woff +0 -0
  217. data/assets/vendor/js/bootstrap.min.js +7 -0
  218. data/assets/vendor/js/jquery.min.js +2 -0
  219. data/assets/vendor/js/popper.min.js +5 -0
  220. data/assets/vendor/js/slick.min.js +1 -0
  221. 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;