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,17 @@
1
+ const htmlElement = document.querySelector('html');
2
+ const DARK_MODE_BUTTON_ID = 'darkModeButton';
3
+
4
+ function darkModeClickHandler(e) {
5
+ return htmlElement.classList.toggle('dark-mode');
6
+ }
7
+
8
+ function darkMode() {
9
+ console.info('Dark Mode (is the best)!');
10
+ window.localStorage.getItem('darkModeSetting') === 'true' ? htmlElement.classList.add('dark-mode') : null;
11
+ if (window.location.pathname !== '/settings/') return;
12
+ const darkModeButton = document.getElementById(DARK_MODE_BUTTON_ID);
13
+
14
+ darkModeButton.addEventListener('click', darkModeClickHandler);
15
+ }
16
+
17
+ export default darkMode;
@@ -0,0 +1,16 @@
1
+ // Custom JS to toggle the search field at the top of the 404 page when
2
+ // User clicks the search button.
3
+ const BUTTON_ID = 'errorPageSearch';
4
+ const SEARCH_ID = 'openSearchButton';
5
+
6
+ function errorPageSearch() {
7
+ const button = document.getElementById(BUTTON_ID);
8
+ const searchToggle = document.getElementById(SEARCH_ID);
9
+
10
+ button.addEventListener('click', (e) => {
11
+ e.preventDefault();
12
+ searchToggle.click();
13
+ });
14
+ }
15
+
16
+ export default errorPageSearch;
@@ -0,0 +1,7 @@
1
+ // Sets copyright year
2
+ function footerDate() {
3
+ const d = new Date();
4
+ const fullYear = d.getFullYear();
5
+ document.getElementById('currentYear').innerHTML = fullYear;
6
+ }
7
+ export default footerDate;
@@ -0,0 +1,13 @@
1
+ // Lazy load images
2
+ // ex. <img src="/path/to/small-placeholder_image.png" data-src="/path/to/actual_image.jpg" alt="You better not leave it blank">
3
+ function lazyLoad() {
4
+ const lazyLoadImages = document.querySelectorAll('img[data-src]');
5
+
6
+ for (let img of lazyLoadImages) {
7
+ img.setAttribute('src', img.getAttribute('data-src'));
8
+ img.onload = function() {
9
+ img.removeAttribute('data-src');
10
+ };
11
+ }
12
+ }
13
+ export default lazyLoad;
@@ -0,0 +1,13 @@
1
+ function loadModule(...moduleArgs) {
2
+ const module = moduleArgs[0];
3
+ let defaultFunc;
4
+ let funcArg = undefined;
5
+
6
+ moduleArgs.length > 1 ? defaultFunc = moduleArgs[1] : defaultFunc = moduleArgs[0];
7
+ moduleArgs.length > 2 ? funcArg = moduleArgs[2] : null;
8
+ import(`./${module}`).then(({ default: defaultFunc }) => {
9
+ funcArg = undefined ? defaultFunc() : defaultFunc(funcArg);
10
+ });
11
+ }
12
+
13
+ export default loadModule;
@@ -0,0 +1,68 @@
1
+ // Custom JS to initialize slick slider (https://github.com/kenwheeler/slick) and then build a play/pause toggle button
2
+ // Uses slick-specific methods & slick events. See slick events at: https://github.com/kenwheeler/slick/#events
3
+ import $ from 'jquery';
4
+ import 'slick-carousel';
5
+ window.jQuery = window.$ = $; // Slick is older and requires jquery to be defined in window.
6
+
7
+ const HERO_SLIDER_CLASSNAME = '.hero-slider__slider'; // Our classname for the hero-slider's DOM parent
8
+ const SLICK_PLAY = 'slickPlay'; // Methods unique to slick
9
+ const SLICK_PAUSE = 'slickPause'; // Methods unique to slick
10
+ const SLICK_NEXT_SLIDE = 'slickNext'; // Methods unique to slick
11
+ const play = 'Play';
12
+ const pause = 'Pause';
13
+
14
+ function initSlick() {
15
+ $(HERO_SLIDER_CLASSNAME).slick({
16
+ dots: true,
17
+ slidesToShow: 1,
18
+ slidesToScroll: 1,
19
+ autoplay: true,
20
+ autoplaySpeed: 4000,
21
+ prevArrow:'<button type="button" data-role="none" class="prev slick-prev" aria-label="Previous" role="button" style="display: block;">Previous</button>', // TODO: change to <button> el
22
+ nextArrow:'<button type="button" data-role="none" class="next slick-next" aria-label="Next" role="button" style="display: block;">Next</button>' // TODO: change to <button> el
23
+ });
24
+ }
25
+
26
+ function toggleSlickPlayState(el, slickState, newButtonText) {
27
+ const newButtonTextIsPause = newButtonText === pause;
28
+
29
+ $(HERO_SLIDER_CLASSNAME).slick(slickState);
30
+ el.setAttribute('aria-label', newButtonText);
31
+ el.classList.toggle('hero-slider__button--play');
32
+ el.innerHTML = newButtonText;
33
+
34
+ newButtonTextIsPause ? $(HERO_SLIDER_CLASSNAME).slick(SLICK_NEXT_SLIDE) : null;
35
+ }
36
+
37
+ function watchForElementClicks(el) {
38
+ el.addEventListener('click', function(e) {
39
+ let buttonTextIsPause = el.innerHTML === 'Pause';
40
+
41
+ buttonTextIsPause ? toggleSlickPlayState(el, SLICK_PAUSE, play) : toggleSlickPlayState(el, SLICK_PLAY, pause);
42
+ });
43
+ }
44
+
45
+ function createButton() {
46
+ const SLICK_PARENT_EL = document.querySelector(HERO_SLIDER_CLASSNAME);
47
+ const button = document.createElement('button');
48
+ const initialButtonText = 'Pause';
49
+
50
+ button.setAttribute('aria-label', 'Pause');
51
+ button.type = 'button';
52
+ button.style = 'display: block;'
53
+ button.innerHTML = initialButtonText;
54
+ button.classList.add('hero-slider__button--toggle');
55
+ SLICK_PARENT_EL.appendChild(button);
56
+ watchForElementClicks(button);
57
+ }
58
+
59
+ function initSliders() {
60
+ // slick's on 'init' function (See "events" in slick docs):
61
+ // According to slick's docs; you have to call a $(slick).on('init', function(){ //... }); before you initialize slick:
62
+ $(HERO_SLIDER_CLASSNAME).on('init', function(event, slick){
63
+ createButton();
64
+ });
65
+ initSlick();
66
+ }
67
+
68
+ export default initSliders;
@@ -0,0 +1,7 @@
1
+ // THIS IS A TEST
2
+ function test() {
3
+ // Code to test here
4
+
5
+ }
6
+
7
+ export default test;
@@ -0,0 +1 @@
1
+ import '../../scss/translate.scss';
@@ -0,0 +1,54 @@
1
+ function styleIFrameElement(IFRAME_MENU_ELEMENT, iframeStyles) {
2
+ const combinedStyles = IFRAME_MENU_ELEMENT.style.cssText += iframeStyles
3
+ IFRAME_MENU_ELEMENT.style.cssText = combinedStyles;
4
+ }
5
+
6
+ function setIframeStyles() {
7
+ const iframeStyles = ' height: 100%; width: 100%; top: 0px; box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3);';
8
+ return iframeStyles;
9
+ }
10
+
11
+ function createStyleConfigurationObject() {
12
+ const styleConfigurationObject = { // Setting all the selectors & the styles they should get.
13
+ '.goog-te-menu2-item div, .goog-te-menu2-item:link div, .goog-te-menu2-item:visited div, .goog-te-menu2-item:active div, .goog-te-menu2 *': 'color: #544F4B; font-family: "Roboto", sans-serif; width: 100%;', // Change font fam and color!
14
+ '.goog-te-menu2-item-selected': 'display: none;', // Change menu's padding
15
+ '.goog-te-menu2': 'overflow-y: scroll; padding: 0px;', // Change menu's padding
16
+ '.goog-te-menu2-item div': 'padding: 20px;', // Change the padding of the languages
17
+ '.goog-te-menu2-item': 'width: 100%;', // Change the width of the languages
18
+ 'td': 'width: 100%; display: block;', // Change the width of the languages
19
+ '.goog-te-menu2-colpad': 'display: none;', // Change the width of the languages
20
+ '.goog-te-menu2': 'border: none;', // Change Google's default blue border
21
+ '.goog-te-menu2': 'height: 100%; width: 100%;'
22
+ }
23
+ return styleConfigurationObject;
24
+ }
25
+
26
+ function setStyles(selector, styles, IFRAME_MENU_ELEMENT) {
27
+ const content = IFRAME_MENU_ELEMENT.contentWindow;
28
+ const itemsToStyle = content.document.querySelectorAll(selector);
29
+ for (let i = 0; i < itemsToStyle.length; i++) {
30
+ const items = itemsToStyle[i];
31
+ items.setAttribute('style', styles);
32
+ }
33
+ }
34
+
35
+ function translate() {
36
+ // RESTYLE THE DROPDOWN MENU
37
+ if (document.getElementById('google_translate_element')) {
38
+ const GOOGLE_TRANSLATE_ELEMENT = document.getElementById('google_translate_element');
39
+ const styleConfigurationObject = createStyleConfigurationObject();
40
+ const iframeStyles = setIframeStyles();
41
+ GOOGLE_TRANSLATE_ELEMENT.addEventListener('click', function (event) {
42
+ const IFRAME_MENU_ELEMENT = document.querySelector('iframe[class*="goog-te-menu-frame"]');
43
+
44
+ //event.preventDefault();
45
+ styleIFrameElement(IFRAME_MENU_ELEMENT, iframeStyles);
46
+ Object.keys(styleConfigurationObject).forEach(function(selector) {
47
+ setStyles(selector, styleConfigurationObject[selector], IFRAME_MENU_ELEMENT);
48
+ });
49
+
50
+ }, false);
51
+ }
52
+ }
53
+
54
+ export default translate;
@@ -0,0 +1,53 @@
1
+ const VIDEO_SETTING_BUTTON = document.getElementById('videoButton');
2
+ const SETTING_BUTTON_CLASS = '.setting__button';
3
+
4
+ function recallSetting(button) {
5
+ const setting = button.dataset.setting;
6
+ let savedSetting;
7
+
8
+ if (!window.localStorage.getItem(setting)) return;
9
+ if (button.dataset.value === window.localStorage.getItem(setting)) return;
10
+
11
+ window.localStorage.getItem(setting) == 'false' ? savedSetting = false : savedSetting = true;
12
+ const settingSpan = `<span class="sr-only sr-only-focusable">Turn setting ${!savedSetting ? 'on' : 'off'}</span>`;
13
+
14
+ button.dataset.value = savedSetting.toString();
15
+ button.classList.remove(`setting__button--${!savedSetting ? 'on' : 'off'}`);
16
+ button.classList.add(`setting__button--${!savedSetting ? 'off' : 'on'}`);
17
+ return button.innerHTML = settingSpan;
18
+ }
19
+
20
+ function settingsButtonClickHandler(e) {
21
+ let currentSettingState;
22
+ let settingButton = e.target;
23
+
24
+ settingButton.dataset.value === 'true' ? currentSettingState = true
25
+ : settingButton.dataset.value === 'false' ? currentSettingState = false
26
+ : null;
27
+
28
+ currentSettingState === null ? new Error(
29
+ `Error in userSettings.js module
30
+ "currentSettingState" is undefined:
31
+ Make sure you have a "data-value" attribute set to "true" or "false"`
32
+ ) : null;
33
+
34
+ const settingMessage = `<span class="sr-only">Turn setting ${currentSettingState ? 'on' : 'off'}</span>`;
35
+
36
+ window.localStorage.setItem(settingButton.dataset.setting, (!currentSettingState).toString());
37
+
38
+ settingButton.classList.toggle(`setting__button--${currentSettingState ? 'on' : 'off'}`);
39
+ settingButton.classList.toggle(`setting__button--${currentSettingState ? 'off' : 'on'}`);
40
+ settingButton.dataset.value = (!currentSettingState).toString()
41
+ return settingButton.innerHTML = settingMessage;
42
+ }
43
+
44
+ function userSettings() {
45
+ const settingButtons = [...document.querySelectorAll(SETTING_BUTTON_CLASS)];
46
+
47
+ settingButtons.forEach(button => {
48
+ button.addEventListener('click', settingsButtonClickHandler);
49
+ recallSetting(button);
50
+ });
51
+ }
52
+
53
+ export default userSettings;
@@ -0,0 +1,27 @@
1
+ // Replace all occurences of "--" (double-hyphens,) within the page's text-nodes, with em-dashes.
2
+ // Use a replacer function to omit any occurences of triple-hyphens which appear in our documentation.
3
+ // For example, YAML Front - matter's opening and closing triple-hyphens
4
+ // Without the replacer funciton, triple-hyphens get replaced with an em-dash and a hyphen.
5
+ const emDashOrTripleHyphensRegex = /---?/g;
6
+ const tripleHyphenRegex = /---/;
7
+ const emDashReplacement = '—' // This is an em-dash, however, it looks like a hyphen in monospace text editor font!
8
+
9
+ function replacerFunction(match) {
10
+ return match.search(tripleHyphenRegex) === -1 ? emDashReplacement : match;
11
+ }
12
+ function walkText(node) {
13
+ if (node.nodeType == 3) {
14
+ node.data = node.data.replace(emDashOrTripleHyphensRegex, replacerFunction);
15
+ }
16
+ if (node.nodeType == 1 && node.nodeName != 'SCRIPT') {
17
+ for (var i = 0; i < node.childNodes.length; i++) {
18
+ walkText(node.childNodes[i]);
19
+ }
20
+ }
21
+ }
22
+ // Note on usage: You don't need to necessarily traverse the entire document.body.
23
+ // Usage:
24
+ //
25
+ // walkText(document.body);
26
+ //
27
+ export default walkText;
@@ -0,0 +1,21 @@
1
+ const SLIDE_HEADING_ELEMENTS = document.querySelectorAll('.hero-slider__slider--slide-heading'); // Element from HTML
2
+ const regEx = /\*\*(\S+)\*\*/g;
3
+ const replacement = '<span class="typography__power-text">$1</span>';
4
+
5
+ function replaceRegex(el) {
6
+ return el.innerHTML = el.innerHTML.replace(regEx, replacement);
7
+ }
8
+
9
+ function loopOverNodeList(nodeList) {
10
+ for (var i = 0; i < nodeList.length; i++) {
11
+ replaceRegex(nodeList[i]);
12
+ }
13
+ }
14
+
15
+ function wrapPowerText() {
16
+ if ( !document.querySelectorAll('.hero-slider__slider--slide-heading') )
17
+ return; // Bail out of theres no slider in the page.
18
+ loopOverNodeList(SLIDE_HEADING_ELEMENTS);
19
+ }
20
+
21
+ export default wrapPowerText;
@@ -0,0 +1,30 @@
1
+ const YT_EMBED_PARENT = document.getElementById('yt-embed');
2
+ const YT_EMBED_PARENT_VIDEO_ID = YT_EMBED_PARENT.dataset.video;
3
+ //<iframe width="560" height="315" src="https://www.youtube.com/embed/LUCrx9chw-c" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
4
+
5
+ function setAttributes(el, arg, argVal) {
6
+ const argumentIsString = typeof arg == 'string';
7
+
8
+ if ( argumentIsString ) {
9
+ el.setAttribute(arg, argVal)
10
+ } else {
11
+ for (let i = 0, len = arg.length; i < len; i++) {
12
+ el.setAttribute(arg[i], argVal[i])
13
+ }
14
+ }
15
+ return el;
16
+ }
17
+
18
+ function ytEmbed() {
19
+ const iframe = document.createElement('iframe');
20
+
21
+ setAttributes(iframe, ['width', 'height', 'frameborder', 'allow', 'allowfullscreen'], ['560', '315', '0', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture', '']);
22
+ YT_EMBED_PARENT.appendChild(iframe);
23
+ setAttributes(iframe, 'src', 'https://www.youtube.com/embed/' + YT_EMBED_PARENT_VIDEO_ID + '?showinfo=0&rel=0');
24
+ iframe.onload = () => {
25
+ YT_EMBED_PARENT.removeChild(YT_EMBED_PARENT.querySelector('.yt-embed'));
26
+ }
27
+
28
+ }
29
+
30
+ export default ytEmbed;
@@ -0,0 +1,89 @@
1
+ // Overrides AND additions/extensions to Bootstrap 4's styling
2
+
3
+ .nav-tabs {
4
+ border-bottom: 1px solid $grey-5;
5
+ }
6
+
7
+ .nav-tabs .nav-link {
8
+ background-color: $grey-4;
9
+ border-left-color: $grey-2;
10
+ border-left-style: solid;
11
+ border-left-width: 1px;
12
+ border-right-color: $grey-2;
13
+ border-right-style: solid;
14
+ border-right-width: 1px;
15
+ border-top-color: $grey-2;
16
+ border-top-style: solid;
17
+ border-top-width: 1px;
18
+ border-bottom-color: $grey-5;
19
+ }
20
+
21
+ .nav-tabs .nav-link.active {
22
+ border-color: $grey-5 $grey-5 $white;
23
+ }
24
+
25
+ .navbar-brand {
26
+ margin-right: 0;
27
+ }
28
+
29
+ @media screen and (min-width: 768px) {
30
+ .navbar-brand {
31
+ margin-right: 1rem;
32
+ }
33
+ }
34
+
35
+ .btn {
36
+ vertical-align: baseline; // Needed so Google Translate's injected <font> tags don't mess with font's alignment in the page
37
+ }
38
+
39
+ .modal-open .gsc-search-button {
40
+ margin-right: 15px;
41
+ }
42
+
43
+ // Modify the Bootstrap 4 dropdown menu's carot to give it an animated/interactice effect using pure CSS
44
+ // ======================================
45
+ // .dropdown-toggle::after controls the BS4 dropdown-menu carot symbol's display
46
+ @media screen and (max-width: 992px) {
47
+ .dropdown-toggle::after { // Set starting position & transition Fx
48
+ transform: rotate(-90deg);
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+
52
+ .nav-item.dropdown.show .dropdown-toggle::after { // Selectors that are only present when a dropdown is toggled to the open state.
53
+ transform: rotate(0deg);
54
+ }
55
+ }
56
+
57
+ .dropdown-toggle.btn::after { // Set starting position & transition Fx
58
+ transform: rotate(-90deg);
59
+ transition: transform 0.3s ease-in-out;
60
+ }
61
+
62
+ .nav-item.dropdown.show .dropdown-toggle.btn::after { // Selectors that are only present when a dropdown is toggled to the open state.
63
+ transform: rotate(0deg);
64
+ }
65
+
66
+ @media screen and (min-width: 992px) {
67
+ .dropdown-toggle:not(.btn)::after { // Set starting position & transition Fx
68
+ display: none;
69
+ }
70
+ }
71
+
72
+ // Customizations to alert color-schemes
73
+ // Creates a more visible border around the alerts
74
+ // BS4 default alert border-colors are almost imperceivable
75
+ .alert-warning {
76
+ border-color: $color-alert-warning-border;
77
+ }
78
+
79
+ .alert-danger {
80
+ border-color: $color-alert-danger-border;
81
+ }
82
+
83
+ .alert-info {
84
+ border-color: $color-alert-info-border;
85
+ }
86
+
87
+ .alert-primary {
88
+ border-color: $color-alert-primary-border;
89
+ }
@@ -0,0 +1,16 @@
1
+ // Specific classes for the CloudCannon editor/interface.
2
+ .editor-link {
3
+ display: none;
4
+ }
5
+
6
+ .cms-editor-active .editor-link {
7
+ display: block;
8
+ }
9
+
10
+ .editor-button {
11
+ display: none;
12
+ }
13
+
14
+ .cms-editor-active .editor-button {
15
+ display: inline-block;
16
+ }
@@ -0,0 +1,114 @@
1
+ .goog-te-gadget-simple {
2
+ white-space: nowrap;
3
+ border-radius: 20px;
4
+ padding-left: 10px;
5
+ padding-right: 10px;
6
+ margin-right: 5px;
7
+ height: 100%;
8
+ }
9
+
10
+ #google_translate_element {
11
+ position: fixed;
12
+ bottom: .25rem;
13
+ right: .25rem!important;
14
+ z-index: 99999;
15
+ }
16
+ .goog-te-gadget {
17
+ font-family: Roboto, 'Open Sans', sans-serif!important;
18
+ text-transform: uppercase;
19
+ font-weight: 500;
20
+ &:hover {
21
+ color: $white;
22
+ }
23
+ }
24
+ .goog-te-gadget-simple {
25
+ background-color: rgba(255,255,255,0.85)!important;
26
+ border: 1px solid rgba(0,0,0,0.95) !important;
27
+ padding: 8px!important;
28
+ border-radius: 4px!important;
29
+ font-size: 1rem!important;
30
+ line-height:2rem!important;
31
+ display: inline-block;
32
+ transition: background-color .2s;
33
+ cursor: pointer;
34
+ zoom: 1;
35
+ &:hover {
36
+ background-color: rgba(0, 123, 255, 0.85)!important;
37
+ }
38
+ &:focus {
39
+ background-color: rgba(0, 123, 255, 0.85)!important;
40
+ }
41
+ }
42
+ .goog-te-menu2 {
43
+ max-width: 100%;
44
+ width: 100%;
45
+ }
46
+ .goog-te-gadget-simple:hover .goog-te-menu-value {
47
+ color: $white !important;
48
+ }
49
+ .goog-te-menu-value {
50
+ color: #000 !important;
51
+ text-decoration: none !important;
52
+ &:before {
53
+ font-family: 'Material Icons';
54
+ content: "\E927";
55
+ margin-right: 16px;
56
+ font-size: 2rem;
57
+ vertical-align: -10px;
58
+ // width:32px!important;
59
+ }
60
+ }
61
+ .goog-te-menu-value span:nth-child(5) {
62
+ display:none;
63
+ }
64
+ .goog-te-menu-value span:nth-child(3) {
65
+ border:none!important;
66
+ font-family: 'Material Icons';
67
+ &:after {
68
+ font-family: 'Material Icons';
69
+ content: "\E5C5";
70
+ font-size: 1.5rem;
71
+ vertical-align: -6px;
72
+ }
73
+ }
74
+
75
+ .goog-te-gadget-icon {
76
+ background-image: url(https://placehold.it/32)!important;
77
+ background-position: 0px 0px;
78
+ height: 32px!important;
79
+ width: 32px!important;
80
+ margin-right: 8px!important;
81
+ // OR
82
+ display: none;
83
+ }
84
+
85
+ // ============ HIDE TOP BAR ============
86
+ .goog-te-banner-frame.skiptranslate {display: none!important;}
87
+ body {top: 0px!important;}
88
+
89
+ /* ================================== *\
90
+ Mediaqueries
91
+ \* ================================== */
92
+ @media (max-width: 667px) {
93
+ #google_translate_element {
94
+ bottom: .25rem;
95
+ left: 16px!important;
96
+ width: 100%!important;
97
+ goog-te-gadget {
98
+ width:100%!important;
99
+ }
100
+ .skiptranslate {
101
+ width:100%!important;
102
+ }
103
+ .goog-te-gadget-simple {
104
+ width: calc(100% - 32px)!important;
105
+ text-align: center;
106
+ }
107
+ }
108
+ }
109
+ a.goog-te-menu-value {
110
+ text-decoration: none !important;
111
+ &:hover {
112
+ text-decoration: none !important;
113
+ }
114
+ }