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.
Files changed (243) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +138 -0
  4. data/_config.yml +262 -0
  5. data/_data/cache_bust_css.yml +1 -0
  6. data/_includes/accordion.html +36 -0
  7. data/_includes/accordion_path-sorting.html +29 -0
  8. data/_includes/body.html +13 -0
  9. data/_includes/breadcrumbs.html +65 -0
  10. data/_includes/card-section.html +32 -0
  11. data/_includes/chat-now.html +15 -0
  12. data/_includes/contacts.html +90 -0
  13. data/_includes/document-head.html +22 -0
  14. data/_includes/emergency-alerts.html +27 -0
  15. data/_includes/foot.html +3 -0
  16. data/_includes/footer.html +278 -0
  17. data/_includes/hash/theme_hash.yml +1 -0
  18. data/_includes/header-global.html +56 -0
  19. data/_includes/hero-slider.html +42 -0
  20. data/_includes/main-call-to-action.html +32 -0
  21. data/_includes/nav-global-bottom.html +47 -0
  22. data/_includes/nav-global-top.html +34 -0
  23. data/_includes/nav-local.html +29 -0
  24. data/_includes/preconnect.html +22 -0
  25. data/_includes/scripts/custom.html +4 -0
  26. data/_includes/scripts/google-api.html +2 -0
  27. data/_includes/scripts/google-noscript.html +9 -0
  28. data/_includes/scripts/google-tag.html +23 -0
  29. data/_includes/scripts/kcc-theme.html +2 -0
  30. data/_includes/scripts/table-cdn.html +6 -0
  31. data/_includes/scripts/translate.html +11 -0
  32. data/_includes/scripts/vendor-cdn.html +5 -0
  33. data/_includes/styles/fonts.html +4 -0
  34. data/_includes/styles/main.html +12 -0
  35. data/_includes/styles/vendor.html +6 -0
  36. data/_includes/svg/check.html +11 -0
  37. data/_includes/svg/check_circle-24px.html +13 -0
  38. data/_includes/svg/dot.html +1 -0
  39. data/_includes/svg/earn-more.html +30 -0
  40. data/_includes/svg/email-24px.html +13 -0
  41. data/_includes/svg/goals.html +21 -0
  42. data/_includes/svg/kcc-copy.html +62 -0
  43. data/_includes/svg/kcc.html +65 -0
  44. data/_includes/svg/kcc.svg +59 -0
  45. data/_includes/svg/love.html +13 -0
  46. data/_includes/svg/place-24px.html +13 -0
  47. data/_includes/svg/save-money.html +26 -0
  48. data/_includes/tabbed-content.html +27 -0
  49. data/_includes/translate.html +3 -0
  50. data/_layouts/default-core.html +27 -0
  51. data/_layouts/default.html +32 -0
  52. data/_layouts/hero-banner.html +17 -0
  53. data/_layouts/hero-slider.html +17 -0
  54. data/_layouts/markdown.html +13 -0
  55. data/_layouts/page.html +8 -0
  56. data/assets/css/content.css +37 -0
  57. data/assets/img/2016-senior-viewbook.jpg +0 -0
  58. data/assets/img/ATEC-DSC_1033.jpeg +0 -0
  59. data/assets/img/DSC_5650_helpful.jpg +0 -0
  60. data/assets/img/admissions-navigation-menu.jpg +0 -0
  61. data/assets/img/ajax-loader.gif +0 -0
  62. data/assets/img/alert.svg +1 -0
  63. data/assets/img/arrow-right.svg +1 -0
  64. data/assets/img/arrow_right_alt.svg +1 -0
  65. data/assets/img/blue-next.svg +1 -0
  66. data/assets/img/blue-prev.svg +1 -0
  67. data/assets/img/d-daun2.jpg +0 -0
  68. data/assets/img/dbl-next.svg +1 -0
  69. data/assets/img/dbl-next_mobile.svg +1 -0
  70. data/assets/img/dbl-prev.svg +1 -0
  71. data/assets/img/dbl-prev_mobile.svg +1 -0
  72. data/assets/img/dot.svg +13 -0
  73. data/assets/img/e-tech_a-roberts_mar2016_D41_6690.jpg +0 -0
  74. data/assets/img/facebook-f_white.svg +1 -0
  75. data/assets/img/fafsa-early-bird-banner-18.jpg +0 -0
  76. data/assets/img/go_cavs_20171002_193828-web.jpg +0 -0
  77. data/assets/img/heading-bg-underline-tan.png +0 -0
  78. data/assets/img/heading-bg-underline-transparent.png +0 -0
  79. data/assets/img/heading-bg-underline.png +0 -0
  80. data/assets/img/home.svg +8 -0
  81. data/assets/img/instagram-white.svg +1 -0
  82. data/assets/img/itransfer.png +0 -0
  83. data/assets/img/kankakee-community-college-word-logo.svg +1 -0
  84. data/assets/img/kcc-logo-inverse.svg +1 -0
  85. data/assets/img/kcc-logo.svg +1 -0
  86. data/assets/img/kcc-placeholder-square.png +0 -0
  87. data/assets/img/kcc-placeholder.png +0 -0
  88. data/assets/img/kcc-text-logo.svg +1 -0
  89. data/assets/img/keyboard_arrow_right.svg +1 -0
  90. data/assets/img/linkedin-white.svg +1 -0
  91. data/assets/img/loader.gif +0 -0
  92. data/assets/img/miguel2.jpg +0 -0
  93. data/assets/img/pause.svg +1 -0
  94. data/assets/img/pinterest-p_white.svg +1 -0
  95. data/assets/img/placeholder.png +0 -0
  96. data/assets/img/placeholder_16to9.jpg +0 -0
  97. data/assets/img/placeholder_4by3.jpg +0 -0
  98. data/assets/img/placeholder_square.jpg +0 -0
  99. data/assets/img/play.svg +1 -0
  100. data/assets/img/riverfrontcampus.jpg +0 -0
  101. data/assets/img/search.svg +1 -0
  102. data/assets/img/settings.svg +1 -0
  103. data/assets/img/settings_56.svg +1 -0
  104. data/assets/img/soccer.svg +1 -0
  105. data/assets/img/social-icon.svg +1 -0
  106. data/assets/img/toggle-off.svg +1 -0
  107. data/assets/img/toggle-on.svg +1 -0
  108. data/assets/img/twitter-white.svg +1 -0
  109. data/assets/img/video.svg +1 -0
  110. data/assets/img/x.svg +1 -0
  111. data/assets/img/youtube-white.svg +1 -0
  112. data/assets/img/yt-loading.png +0 -0
  113. data/assets/img/zippia.png +0 -0
  114. data/assets/js/alerts/addAccordionOrTabHistoryStates.js +50 -0
  115. data/assets/js/alerts/alerts.js +56 -0
  116. data/assets/js/alerts/cacheResponse.js +23 -0
  117. data/assets/js/alerts/checkForPrefersReducedMotion.js +19 -0
  118. data/assets/js/alerts/contentHashLink.js +94 -0
  119. data/assets/js/alerts/createAlertsHtml.js +73 -0
  120. data/assets/js/alerts/fetchNewAlert.js +33 -0
  121. data/assets/js/alerts/getCachedResponse.js +43 -0
  122. data/assets/js/alerts/parseMarkdownToHTML.js +85 -0
  123. data/assets/js/alerts/refreshAlertButton.js +37 -0
  124. data/assets/js/dist/102.bundle.js +1 -0
  125. data/assets/js/dist/126.bundle.js +1 -0
  126. data/assets/js/dist/154.bundle.js +1 -0
  127. data/assets/js/dist/238.bundle.js +1 -0
  128. data/assets/js/dist/282.bundle.js +1 -0
  129. data/assets/js/dist/315.bundle.js +1 -0
  130. data/assets/js/dist/381.798ee77dce545b7c224a.css +2 -0
  131. data/assets/js/dist/381.bundle.js +1 -0
  132. data/assets/js/dist/391.bundle.js +1 -0
  133. data/assets/js/dist/45.bundle.js +1 -0
  134. data/assets/js/dist/504.bundle.js +1 -0
  135. data/assets/js/dist/526.bundle.js +2 -0
  136. data/assets/js/dist/526.bundle.js.LICENSE.txt +24 -0
  137. data/assets/js/dist/57.bundle.js +1 -0
  138. data/assets/js/dist/576.bundle.js +1 -0
  139. data/assets/js/dist/582.bundle.js +1 -0
  140. data/assets/js/dist/614.bundle.js +1 -0
  141. data/assets/js/dist/640.bundle.js +1 -0
  142. data/assets/js/dist/644.bundle.js +1 -0
  143. data/assets/js/dist/647.798ee77dce545b7c224a.css +2 -0
  144. data/assets/js/dist/647.bundle.js +1 -0
  145. data/assets/js/dist/658.798ee77dce545b7c224a.css +2 -0
  146. data/assets/js/dist/658.bundle.js +1 -0
  147. data/assets/js/dist/707.bundle.js +1 -0
  148. data/assets/js/dist/734.bundle.js +2 -0
  149. data/assets/js/dist/734.bundle.js.LICENSE.txt +30 -0
  150. data/assets/js/dist/747.bundle.js +1 -0
  151. data/assets/js/dist/755.bundle.js +1 -0
  152. data/assets/js/dist/795.bundle.js +1 -0
  153. data/assets/js/dist/814.bundle.js +1 -0
  154. data/assets/js/dist/83.798ee77dce545b7c224a.css +2 -0
  155. data/assets/js/dist/83.bundle.js +1 -0
  156. data/assets/js/dist/853.bundle.js +1 -0
  157. data/assets/js/dist/859.bundle.js +1 -0
  158. data/assets/js/dist/862.bundle.js +1 -0
  159. data/assets/js/dist/909.bundle.js +1 -0
  160. data/assets/js/dist/92.bundle.js +1 -0
  161. data/assets/js/dist/936.bundle.js +1 -0
  162. data/assets/js/dist/968.bundle.js +1 -0
  163. data/assets/js/dist/987.bundle.js +1 -0
  164. data/assets/js/dist/kcc-theme.798ee77dce545b7c224a.css +2 -0
  165. data/assets/js/dist/kcc-theme.bundle.js +1 -0
  166. data/assets/js/nav/megaNav/closeMegaNavOnClick.js +50 -0
  167. data/assets/js/nav/megaNav/googleCustomSearch.js +112 -0
  168. data/assets/js/nav/megaNav/megaNav.js +17 -0
  169. data/assets/js/nav/megaNav/searchToggleMegaNav.js +96 -0
  170. data/assets/js/nav/megaNav/toggleDropdownOnWindowResize.js +78 -0
  171. data/assets/js/nav/megaNav/toggleDropdownOnWindowResizeTwo.js +54 -0
  172. data/assets/js/nav/megaNav/toggleMenuOnWindowResize.js +26 -0
  173. data/assets/js/nav/megaNav/underlineCurrentSite.js +22 -0
  174. data/assets/js/nav/nav/closeNavOnClick.js +50 -0
  175. data/assets/js/nav/nav/highlightCurrentNav.js +56 -0
  176. data/assets/js/nav/nav/moveSearchIcon.js +94 -0
  177. data/assets/js/nav/nav/nav.js +13 -0
  178. data/assets/js/nav/nav/searchToggleNav.js +40 -0
  179. data/assets/js/nav/nav/toggleNavSearchDropdownOnWindowResize.js +57 -0
  180. data/assets/js/src/addClassToOpenNavbar.js +20 -0
  181. data/assets/js/src/all.js +61 -0
  182. data/assets/js/src/darkMode.js +17 -0
  183. data/assets/js/src/errorPageSearch.js +16 -0
  184. data/assets/js/src/footerDate.js +7 -0
  185. data/assets/js/src/lazyLoad.js +13 -0
  186. data/assets/js/src/loadModule.js +13 -0
  187. data/assets/js/src/sliders.js +68 -0
  188. data/assets/js/src/test.js +7 -0
  189. data/assets/js/src/translate.js +1 -0
  190. data/assets/js/src/translateScript.js +54 -0
  191. data/assets/js/src/userSettings.js +53 -0
  192. data/assets/js/src/walkText.js +27 -0
  193. data/assets/js/src/wrapPowerText.js +21 -0
  194. data/assets/js/src/ytEmbed.js +30 -0
  195. data/assets/scss/0-tools/_bootstrap-overrides.scss +89 -0
  196. data/assets/scss/0-tools/_cloudcannon.scss +16 -0
  197. data/assets/scss/0-tools/_google-translate-overrides.scss +114 -0
  198. data/assets/scss/0-tools/_gsc-overrides.scss +144 -0
  199. data/assets/scss/0-tools/_gsc-search-page-overrides.scss +275 -0
  200. data/assets/scss/0-tools/_slick-vars.scss +15 -0
  201. data/assets/scss/0-tools/_vars.scss +98 -0
  202. data/assets/scss/1-base/_background.scss +5 -0
  203. data/assets/scss/1-base/_buttons.scss +200 -0
  204. data/assets/scss/1-base/_header-global.scss +483 -0
  205. data/assets/scss/1-base/_html.scss +4 -0
  206. data/assets/scss/1-base/_img.scss +17 -0
  207. data/assets/scss/1-base/_links.scss +126 -0
  208. data/assets/scss/1-base/_svg.scss +89 -0
  209. data/assets/scss/1-base/_typography.scss +645 -0
  210. data/assets/scss/2-modules/_accordion.scss +43 -0
  211. data/assets/scss/2-modules/_benefits.scss +371 -0
  212. data/assets/scss/2-modules/_breadcrumbs.scss +32 -0
  213. data/assets/scss/2-modules/_campus-alerts.scss +3 -0
  214. data/assets/scss/2-modules/_card-section.scss +9 -0
  215. data/assets/scss/2-modules/_contacts.scss +46 -0
  216. data/assets/scss/2-modules/_dark-mode.scss +350 -0
  217. data/assets/scss/2-modules/_error.scss +10 -0
  218. data/assets/scss/2-modules/_footer.scss +84 -0
  219. data/assets/scss/2-modules/_header.scss +21 -0
  220. data/assets/scss/2-modules/_hero-slider.scss +300 -0
  221. data/assets/scss/2-modules/_loader.scss +25 -0
  222. data/assets/scss/2-modules/_nav-content.scss +11 -0
  223. data/assets/scss/2-modules/_nav-landing.scss +203 -0
  224. data/assets/scss/2-modules/_nav-local.scss +45 -0
  225. data/assets/scss/2-modules/_setting.scss +78 -0
  226. data/assets/scss/2-modules/_sliders.scss +21 -0
  227. data/assets/scss/2-modules/_social-icons.scss +36 -0
  228. data/assets/scss/2-modules/_sub-nav.scss +32 -0
  229. data/assets/scss/2-modules/_yt-embed.scss +14 -0
  230. data/assets/scss/3-layout/_background.scss +3 -0
  231. data/assets/scss/3-layout/_margins.scss +2 -0
  232. data/assets/scss/3-layout/_padding.scss +2 -0
  233. data/assets/scss/3-layout/_positioning.scss +104 -0
  234. data/assets/scss/3-layout/_section.scss +23 -0
  235. data/assets/scss/3-layout/_tables.scss +8 -0
  236. data/assets/scss/4-pages/index/_home.scss +15 -0
  237. data/assets/scss/bootstrap.scss +75 -0
  238. data/assets/scss/darkMode.scss +5 -0
  239. data/assets/scss/kcc-theme.scss +47 -0
  240. data/assets/scss/searchPageOverrides.scss +2 -0
  241. data/assets/scss/slick-carousel.scss +9 -0
  242. data/assets/scss/translate.scss +4 -0
  243. metadata +326 -0
@@ -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_SELECTOR = '.navbar-toggler--multi-collapse'; // 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 nodeList = document.querySelectorAll(NAVBAR_COLLAPSE_SELECTOR);
17
+
18
+ [...nodeList].forEach(el => checkNavbarCollapseState(el));
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;
@@ -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,20 @@
1
+ const NAVBAR_COLLAPSE_ID = 'headerGlobalNavbarContent';
2
+ const HEADER_GLOBAL = '.header-global';
3
+
4
+ function addClassToOpenNavbar() {
5
+ if ( ! document.getElementById(NAVBAR_COLLAPSE_ID) )
6
+ return;
7
+
8
+ const collapse = document.getElementById(NAVBAR_COLLAPSE_ID);
9
+ const header = document.querySelector(HEADER_GLOBAL);
10
+
11
+ $(collapse).on('show.bs.collapse', (e) => {
12
+ header.classList.add('header-global__open');
13
+ });
14
+
15
+ $(collapse).on('hide.bs.collapse', (e) => {
16
+ header.classList.remove('header-global__open');
17
+ });
18
+ }
19
+
20
+ export default addClassToOpenNavbar;
@@ -0,0 +1,61 @@
1
+ import '../../scss/kcc-theme.scss';
2
+ import loadModule from './loadModule'; // loadModule takes the following arguments:
3
+ // arg1 - Name of the module - required
4
+ // arg2 - Modules' default function which becomes the callback function after module is loaded - optional
5
+ // arg3 - Argument to pass to the default function - optional and requires arg2
6
+ // Syntax: loadModule(arg1, arg2, arg3).then(...)... // uses Webpack dynamic imports which is Promise based
7
+ const errorHandler = err => console.error(`Error loading module:\n${err}`, err);
8
+ const path = window.location.pathname;
9
+
10
+ function loadScript(src, callback) {
11
+ const script = document.createElement('script');
12
+
13
+ script.src = src;
14
+ script.addEventListener('load', () => callback())
15
+ document.head.append(script);
16
+ }
17
+
18
+ // window.addEventListener('load', () => {
19
+ // import('../nav/megaNav/megaNav.js') // This JS can wait until window.onload.
20
+ // .then(({ default: megaNav }) => megaNav())
21
+ // .catch(err => errorHandler(err));
22
+ // });
23
+
24
+ window.addEventListener('load', () => {
25
+ loadScript('https://apis.google.com/js/api.js', () => {
26
+ import('jquery').then(({default: $}) => import('bootstrap'))
27
+ .then(() => import('../alerts/alerts.js').then(({ default: alerts }) => alerts()))
28
+ .then(() => {
29
+ if ( document.querySelector('.hero-slider__slider') ) {
30
+ return import('../../scss/slick-carousel.scss')
31
+ .then(() => loadModule('wrapPowerText'))
32
+ .then(() => loadModule('sliders', 'initSliders'))
33
+ }
34
+ })
35
+ .then(() => document.querySelector('img[data-src]') ? loadModule('lazyLoad') : null)
36
+ .then(() => loadModule('walkText', 'walkText', document.body))
37
+ .then(() => loadModule('footerDate'))
38
+ .then(() => loadModule('addClassToOpenNavbar'))
39
+ .then(() => document.getElementById('darkModeButton') ? loadModule('userSettings') : null)
40
+ .then(() => {
41
+ if (window.localStorage.getItem('darkModeSetting') == 'true' || document.getElementById('darkModeButton')) {
42
+ import('./darkMode').then(({ default: darkMode }) => darkMode)
43
+ .then(darkMode => {
44
+ import('../../scss/darkMode.scss').then(() => {
45
+ darkMode();
46
+ });
47
+ })
48
+ }
49
+ })
50
+ .then(() => path == '/search/' ? import('../../scss/searchPageOverrides.scss') : null)
51
+ .then(() => {
52
+ return document.getElementById('google_translate_element') ?
53
+ loadModule('translateScript', 'watchForMenuClicks')
54
+ : null;
55
+ }).then(() => document.getElementById('errorPageSearch') ? loadModule('errorPageSearch', 'errorPageSearch') : null)
56
+ .then(() => {
57
+ return import('../nav/megaNav/megaNav.js').then(({ default: megaNav }) => megaNav())
58
+ })
59
+ .catch( err => errorHandler(err));
60
+ });
61
+ });