kcc-gem-theme 2.11.1 → 2.13.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/hash/theme_hash.yml +1 -1
  3. data/assets/js/alerts/addAccordionOrTabHistoryStates.js +1 -1
  4. data/assets/js/alerts/alerts.js +36 -7
  5. data/assets/js/alerts/cacheResponse.js +3 -3
  6. data/assets/js/alerts/checkForAccordionOrTab.js +1 -1
  7. data/assets/js/alerts/checkForPrefersReducedMotion.js +1 -1
  8. data/assets/js/alerts/contentHashLink.js +5 -5
  9. data/assets/js/alerts/createAlertsHtml.js +41 -15
  10. data/assets/js/alerts/fetchNewAlert.js +33 -0
  11. data/assets/js/alerts/getCachedResponse.js +7 -13
  12. data/assets/js/alerts/refreshAlertButton.js +37 -0
  13. data/assets/js/dist/243.bundle.js +1 -0
  14. data/assets/js/dist/528.bundle.js +1 -0
  15. data/assets/js/dist/{618.eb877787e2886ec50c13.css → 618.caf5fc19b7bad1928a93.css} +0 -0
  16. data/assets/js/dist/{647.eb877787e2886ec50c13.css → 647.caf5fc19b7bad1928a93.css} +0 -0
  17. data/assets/js/dist/853.bundle.js +1 -0
  18. data/assets/js/dist/859.bundle.js +1 -0
  19. data/assets/js/dist/87.caf5fc19b7bad1928a93.css +2 -0
  20. data/assets/js/dist/alerts.bundle.js +1 -1
  21. data/assets/js/dist/contentHashLink.bundle.js +1 -1
  22. data/assets/js/dist/kcc-theme.bundle.js +1 -1
  23. data/assets/js/dist/kcc-theme.caf5fc19b7bad1928a93.css +2 -0
  24. data/assets/js/dist/{translate.eb877787e2886ec50c13.css → translate.caf5fc19b7bad1928a93.css} +0 -0
  25. data/assets/scss/0-tools/_bootstrap-overrides.scss +18 -0
  26. data/assets/scss/0-tools/_vars.scss +13 -1
  27. data/assets/scss/1-base/_buttons.scss +65 -0
  28. data/assets/scss/1-base/_svg.scss +12 -0
  29. data/assets/scss/1-base/_typography.scss +6 -5
  30. data/assets/scss/2-modules/_dark-mode.scss +76 -23
  31. data/assets/scss/2-modules/_hero-slider.scss +13 -4
  32. data/assets/scss/2-modules/_loader.scss +16 -0
  33. metadata +13 -8
  34. data/assets/js/alerts/campusAlertsSheetsAPI.js +0 -50
  35. data/assets/js/dist/87.eb877787e2886ec50c13.css +0 -2
  36. data/assets/js/dist/kcc-theme.eb877787e2886ec50c13.css +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eee1416b1aee1032460313082d10360627fd1489a97b68237c8bfa91b2efec50
4
- data.tar.gz: c409106fa684c12720830f7942328657d5de14d84139ec2ff1ab73f48cc7660c
3
+ metadata.gz: aefdad4640874a0916ba41419412f4e96ac2134a646b63d18e3f3cbba247cb8e
4
+ data.tar.gz: 66167c7dc2695e22c520dff5bf6230d7a8bb31cbf8c21cd271a5bb162a671f66
5
5
  SHA512:
6
- metadata.gz: fd68d216e39bd6fa5fb7e303561e8cf1bf8c7e1984788ab3467dc019680f3e121ad10af0e2764e84436c4d8b606d781abab6f7ddd3bbe2982733c34e455f7b59
7
- data.tar.gz: def7b9d5acc1bcb3875367d4fb5fbe713aa1176a08fa732e1b43dbe5275a78a04b2a49f6dd4dbb52e99fbc0919c6073cf8a7021689f275e6acd534b031e34122
6
+ metadata.gz: 8cdf1291f296acb55cf544d59178e39d41aa04473903263a3e453df8437fb668391a9a86c715f0de1ceb5cb1893e082e171144beb19f8f512547a98322902497
7
+ data.tar.gz: 83b995b44c6cfbb99102d934b0fb6677fc3c6c2b144d4655a2fa1889ec1fba9c82b0205dcffc37463ffc8fd8affc66ee0315cf33143d46083d2f741332baa31e
@@ -1 +1 @@
1
- eb877787e2886ec50c13
1
+ caf5fc19b7bad1928a93
@@ -47,4 +47,4 @@ function addAccordionOrTabHistoryStates() {
47
47
  }
48
48
  }
49
49
 
50
- export default addAccordionOrTabHistoryStates;
50
+ export default addAccordionOrTabHistoryStates;
@@ -2,10 +2,23 @@
2
2
  // Custom JS | written by https://github.com/wdzajicek
3
3
  // © 2020 Kankakee Community College
4
4
  // =================================================== */
5
- import start from './campusAlertsSheetsAPI.js';
6
- import getCachedResponse from './getCachedResponse.js';
7
- import checkForPrefersReducedMotion from './checkForPrefersReducedMotion.js';
8
- import checkForAccordionOrTab from './checkForAccordionOrTab.js';
5
+ import createAlertsHtml from './createAlertsHtml';
6
+ import cacheResponse from './cacheResponse';
7
+ import getCachedResponse from './getCachedResponse';
8
+ import checkForPrefersReducedMotion from './checkForPrefersReducedMotion';
9
+
10
+ const SHEET_KEY = '1plXBiZY5pVbhNT-mszxEuqCl4zy8wMnz9gXXbbT_yLs'; // Corresponds to the ID of the Google Sheet
11
+ const SHEET_TAB = 'Alerts'; // Corresponds to the tab of workbook: either 'Alerts' or 'Alerts Testing' unless you make a new one.
12
+ const EMERGENCY_ALERT_DIV_ID = 'emergencyAlerts'
13
+ const SHEET_PARAMS = {spreadsheetId: SHEET_KEY, range: SHEET_TAB}; // Configures the Object used for `sheets.spreadsheets.values.get()` parameters
14
+ const API_PARAMS = { // This is configuration for API call with spreadsheets that are setup as readonly
15
+ 'apiKey': 'AIzaSyCEBsbXfFcdbkASlg-PodD1rT_Fe3Nw62A',
16
+ 'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/sheets/v4/rest']
17
+ };
18
+
19
+ function loadModule(module) {
20
+ import(`./${module}`).then(({default: module}) => module())
21
+ }
9
22
 
10
23
  document.addEventListener('DOMContentLoaded', () => {
11
24
  checkForPrefersReducedMotion();
@@ -13,7 +26,23 @@ document.addEventListener('DOMContentLoaded', () => {
13
26
  if (!document.getElementById('emergencyAlerts'))
14
27
  return checkForAccordionOrTab()
15
28
 
16
- ! window.sessionStorage.getItem('Alert-Content') ? // Checks if our cached alert is already in sessionStorage
17
- gapi.load('client', start) // If not, build the alert from a new Google API response
18
- : getCachedResponse(); // Otherwise, build the alert from our cached response
29
+ new Promise((resolve, reject) => { // First build the alert, whether by cache or API call
30
+ if (! window.sessionStorage.getItem('Alert-Content')) { // If cache exists there will be an `Alert-Content` key in `sessionStorage` (which gets set in `./cacheResponse.js`)
31
+ gapi.load('client', () => {
32
+ gapi.client.init(API_PARAMS).then(() => {
33
+ return gapi.client.sheets.spreadsheets.values.get(SHEET_PARAMS);
34
+ }).then(response => {
35
+ createAlertsHtml(response, resolve) // Promise is resolved after HTML alert is built
36
+ return response;
37
+ }).then(response => {
38
+ cacheResponse(response);
39
+ }, err => {
40
+ console.error("Error trying to fetch the alert from gapi:", err);
41
+ })
42
+ });
43
+ } else {
44
+ getCachedResponse(resolve); // Promise is resolved after HTML alert is built
45
+ }
46
+ }).then(() => loadModule('checkForAccordionOrTab')) // Run accordion/tab JS, which includes a `scrollTo()`, after alert has painted
47
+ .then(() => loadModule('refreshAlertButton')) // Allow user to refresh the alert (and check for changes/updates)
19
48
  });
@@ -1,5 +1,5 @@
1
1
  /*
2
- // Custom JS | written by https://github.com/wdzajicek
2
+ // Custom JS | written by https://github.com/wdzajicek for,
3
3
  // © 2020 Kankakee Community College
4
4
  // =================================================== */
5
5
  // Modules' default function stores our Google Sheet response in sessionStorage to be retrieved later
@@ -15,9 +15,9 @@ function cacheResponse(response) { // response from Google API's spreadsheet.val
15
15
  const cell = TABLE_BODY_ROW[i];
16
16
  const column = TABLE_HEADER_ROW[i];
17
17
 
18
- window.sessionStorage.setItem(column.replace(' ', '-'), cell);
18
+ window.sessionStorage.setItem(column.replace(/\s/g, '-'), cell);
19
19
  }
20
20
  //window.sessionStorage.clear();
21
21
  }
22
22
 
23
- export default cacheResponse;
23
+ export default cacheResponse;
@@ -8,4 +8,4 @@ export default function checkForAccordionOrTab() {
8
8
  contentHashLink();
9
9
  });
10
10
  }
11
- };
11
+ };
@@ -16,4 +16,4 @@ function checkForPrefersReduceMotion() {
16
16
  });
17
17
  }
18
18
 
19
- export default checkForPrefersReduceMotion;
19
+ export default checkForPrefersReduceMotion;
@@ -57,9 +57,9 @@ function checkForMatchingTabOrAccordion(hash) {
57
57
  .on('shown.bs.tab', () => { // Bootstrap 4 method for tab events // Must be defined before the tab is activated
58
58
  window.location.search ?
59
59
  checkForQuery(window.location.search.replace(queryStartRegex, ''), hash)
60
- : null; })
60
+ : findContentTarget(`${hash}-label`); // You need to .scrollIntoView() & .focus() on the tab-label which is an <a href="...">. It won't work to do .scrollIntoView() and .focus() on the div
61
+ })
61
62
  .tab('show'); // Bootstrap 4 Tab method
62
- findContentTarget(`${hash}-label`); // You need to .scrollIntoView() & .focus() on the tab-label which is an <a href="...">. It won't work to do .scrollIntoView() and .focus() on the div
63
63
  } else if ( document.querySelector(`${hash}.collapse`) ) { // Looks for a matching BS4 collapse element
64
64
  let card = $(hash); // **SIGH**, BS4 requires JQuery
65
65
 
@@ -67,9 +67,9 @@ function checkForMatchingTabOrAccordion(hash) {
67
67
  .on('shown.bs.collapse', () => { // Bootstrap 4 Collapse method // Must be defined before the collapse is activated
68
68
  window.location.search ?
69
69
  checkForQuery(window.location.search.replace(queryStartRegex, ''), hash)
70
- : null; })
70
+ : findContentTarget(`button[data-target="${hash}"]`);
71
+ })
71
72
  .collapse('show'); // Bootstrap 4 Collapse method
72
- findContentTarget(`button[data-target="${hash}"]`);
73
73
  }
74
74
  }
75
75
 
@@ -98,4 +98,4 @@ function contentHashLink() {
98
98
  });
99
99
  }
100
100
 
101
- export default contentHashLink;
101
+ export default contentHashLink;
@@ -6,43 +6,69 @@
6
6
  //
7
7
  // This exported module requires you pass it's default-function the `response` object from the API call, as the only argument
8
8
  //
9
- import checkForAccordionOrTab from './checkForAccordionOrTab.js';
10
9
  import parseMarkdownToHTML from './parseMarkdownToHTML.js'; // Parses a simplified markdown into html & creates the paragraph el's with appropriate class
11
10
  //
12
11
  const CAMPUS_ALERTS_DIV_ID_STRING = 'emergencyAlerts'; // ID of the div to house campus alerts - already built into the page.
13
12
  const ALERTS_VISIBLE_CLASS = 'position__offset-alert--visible';
13
+ const TARGET = document.getElementById(CAMPUS_ALERTS_DIV_ID_STRING); // This targets an element built into the DOM that we inject everything into.
14
14
 
15
- function injectAlert(target, alert) {
15
+ function injectAlert(target, alert, resolve) {
16
16
  target.innerHTML = alert;
17
- return target.classList.add(ALERTS_VISIBLE_CLASS);
17
+ target.classList.add(ALERTS_VISIBLE_CLASS);
18
+ return resolve != undefined ? resolve() : null;
18
19
  }
19
20
 
20
- function createAlertsHtml(response) { // Incoming response from our Google Sheet via the Sheets API
21
- // This is where the cell values hide in the response object from the Google API.
21
+ function checkAlertType(type) {
22
+ return type == 'SCHOOL EMERGENCY/CLOSURE - red' ? 'danger'
23
+ : type == 'SCHOOL INFO - blue' ? 'primary'
24
+ : type == 'SCHOOL INFO - cyan' ? 'info'
25
+ : 'warning';
26
+ }
22
27
 
23
- let [visibility, allPages, content, expire, start, end] = response.result.values[2]; // The 3rd row has our table's data
24
- if (visibility === 'FALSE') return checkForAccordionOrTab(); // Predefined dropdown options in the Sheet are `'TRUE'` & `'FALSE'`
28
+ function createAlertsHtml(response, resolve) { // Incoming response from our Google Sheet via the Sheets API
29
+ let [visibility, allPages, content, expire, start, end, type] = response.result.values[2]; // The 3rd row has our table's data
30
+ if (visibility === 'FALSE') // Predefined dropdown options in the Sheet are `'TRUE'` & `'FALSE'`
31
+ return;
25
32
 
26
- const TARGET = document.getElementById(CAMPUS_ALERTS_DIV_ID_STRING); // This targets an element built into the DOM that we inject everything into.
27
- let d = new Date;
28
- let s = new Date(start);
29
- let e = new Date(end);
33
+ const d = new Date;
34
+ const s = new Date(start);
35
+ const e = new Date(end);
36
+ const alertTypeClass = checkAlertType(type);
37
+ const alertType = checkAlertType(type);
30
38
  const alertIsActive = expire === 'FALSE' || expire === 'TRUE' && s.getTime() <= d.getTime() && e.getTime() > d.getTime();
31
39
  const indexPageOnly = allPages === 'TRUE' || allPages === 'FALSE' && window.location.pathname == '/';
32
40
  let alert = `
33
41
  <div class="container">
34
42
  <div class="row">
35
43
  <div class="col">
36
- <div class="alert alert-warning">
37
- ${parseMarkdownToHTML(content)}
44
+ <div role="alert" class="alert alert-${alertType} d-lg-flex align-items-center pr-lg-1">
45
+ <div class="typography__last-p--mb0">
46
+ ${parseMarkdownToHTML(content)}
47
+ </div>
48
+ <button
49
+ aria-label="Refresh the alert"
50
+ title="Refresh the alert"
51
+ id="syncAlert"
52
+ type="button"
53
+ class="btn btn-link buttons--sync ml-auto">
54
+ <svg xmlns="http://www.w3.org/2000/svg"
55
+ class="svg__sync"
56
+ height="24px"
57
+ width="24px"
58
+ viewBox="0 0 24 24">
59
+ <path d="M0 0h24v24H0z" fill="none"/>
60
+ <path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20
61
+ 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0
62
+ 4.42 3.58 8 8 8v3l4-4-4-4v3z"/>
63
+ </svg>
64
+ </button>
38
65
  </div>
39
66
  </div>
40
67
  </div>
41
68
  </div>`;
42
69
 
43
70
  [d,s,e].map(d => d.setHours(0, 0, 0, 0));
44
- alertIsActive && indexPageOnly ? injectAlert(TARGET, alert) : null;
45
- return checkForAccordionOrTab();
71
+ alertIsActive && indexPageOnly ? injectAlert(TARGET, alert, resolve) : null;
46
72
  }
47
73
 
48
74
  export default createAlertsHtml;
@@ -0,0 +1,33 @@
1
+ // Custom JS to make a Google API call to the alerts spreadsheet
2
+ // Then paint the alert into the DOM using module `./createAlertsHtml.js`
3
+ //
4
+ const SHEET_KEY = '1plXBiZY5pVbhNT-mszxEuqCl4zy8wMnz9gXXbbT_yLs'; // Corresponds to the ID of the Google Sheet
5
+ const SHEET_TAB = 'Alerts'; // Corresponds to the tab of workbook: either 'Alerts' or 'Alerts Testing' unless you make a new one.
6
+ const EMERGENCY_ALERT_DIV_ID = 'emergencyAlerts'
7
+ const SHEET_PARAMS = {spreadsheetId: SHEET_KEY, range: SHEET_TAB}; // Configures the Object used for `sheets.spreadsheets.values.get()` parameters
8
+ const API_PARAMS = { // This is configuration for API call with spreadsheets that are setup as readonly
9
+ 'apiKey': 'AIzaSyCEBsbXfFcdbkASlg-PodD1rT_Fe3Nw62A',
10
+ 'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/sheets/v4/rest']
11
+ };
12
+
13
+ function fetchNewAlert() {
14
+ gapi.client.init(API_PARAMS).then(() => {
15
+ return gapi.client.sheets.spreadsheets.values.get(SHEET_PARAMS); // Get the new values from the spreadsheet
16
+ }).then(response => {
17
+ import('./createAlertsHtml').then(({default: createAlertsHtml}) => {
18
+ // Since everything in the page has already loaded, `createAlertsHtml()` can be lazily loaded w/ ES6 import()
19
+ // createAlertsHtml expects 2 args: 1.) `response` object and 2.) either `resolve()` (from `./alert.js`) or `undefined`
20
+ createAlertsHtml(response, undefined); // We don't need to resolve a promise this time so use `undefined` as 2nd arg
21
+ });
22
+ return response;
23
+ }).then(response => {
24
+ import('./cacheResponse').then(({default: cacheResponse}) => {
25
+ // Lazy load cacheResponse() using ES6 imports() w/ Webpack 5
26
+ cacheResponse(response);
27
+ })
28
+ }, err => {
29
+ console.error('Error fetching new alert from gapi:', err);
30
+ });
31
+ }
32
+
33
+ export default fetchNewAlert;
@@ -8,16 +8,10 @@
8
8
  // 2. Then we pass our mock-sheet response object to the `createAlertsHtml` module to
9
9
  // build and inject the alert into the DOM.
10
10
  import createAlertsHtml from './createAlertsHtml.js';
11
- import checkForAccordionOrTab from './checkForAccordionOrTab.js';
12
11
 
13
12
  const cache = window.sessionStorage;
14
13
 
15
- function processCachedResponse(response, callback) {
16
- createAlertsHtml(response);
17
- return callback();
18
- }
19
-
20
- function createCachedResponseObject() {
14
+ function createCachedResponseObject(resolve) {
21
15
  let cachedResponse = { // Reconstructing our own Google Sheet-like response from the sessionStorage items
22
16
  result: {
23
17
  values: [
@@ -29,21 +23,21 @@ function createCachedResponseObject() {
29
23
  cache.getItem('Alert-Content'),
30
24
  cache.getItem('Alert-Expiration'),
31
25
  cache.Start,
32
- cache.End
26
+ cache.End,
27
+ cache.getItem('Alert-type/Color-scheme')
33
28
  ]
34
29
  ]
35
30
  }
36
31
  }
37
- processCachedResponse(cachedResponse, checkForAccordionOrTab);
32
+ createAlertsHtml(cachedResponse, resolve);
38
33
  }
39
34
 
40
- function getCachedResponse() {
35
+ function getCachedResponse(resolve) {
41
36
  try {
42
- createCachedResponseObject();
37
+ createCachedResponseObject(resolve);
43
38
  } catch (error) {
44
- checkForAccordionOrTab();
45
39
  console.error(`Error retrieving cached response in sessionStorage:\nName: ${error.name}\nMessage: ${error.message}\n${error}`);
46
40
  }
47
41
  }
48
42
 
49
- export default getCachedResponse;
43
+ export default getCachedResponse;
@@ -0,0 +1,37 @@
1
+ // Custom JS to give functionality to the "Refresh the alert" button
2
+ // Button HTML is build into DOM by ./alert.js
3
+ // Styling is located in /assets/scss/{ _buttons, _loader, _svg}.scss
4
+ const BUTTON = document.getElementById('syncAlert');
5
+
6
+ function syncHandler(e) {
7
+ const SVG = BUTTON.querySelector('.svg__sync');
8
+
9
+ Promise.resolve()
10
+ .then(() => {
11
+ BUTTON.classList.add('buttons--sync--visible');
12
+ SVG.classList.add('loader__sync--animate');
13
+ }).then(() => {
14
+ // Add a short delay before fetching the new alert
15
+ window.setTimeout(() => { // (alert fetches too fast for the loading animation without this delay)
16
+ import('./fetchNewAlert').then(({default: fetchNewAlert}) => {
17
+ gapi.load('client', fetchNewAlert); // Runs a new call to gapi and repaints the alert HTML
18
+ });
19
+ }, 1000);
20
+ })
21
+ }
22
+
23
+ function showButtonOnInitialLoad(button) {
24
+ button.classList.add('buttons--sync--preview'); // This class has an animation that shows the button for 3-sec.
25
+ window.setTimeout(() => {
26
+ button.classList.remove('buttons--sync--preview'); // Remove the class after enough time for animations has elapsed
27
+ }, 3000);
28
+ }
29
+
30
+ function refreshAlertButton() {
31
+ window.setTimeout(() => { // Short delay before showing the refresh button
32
+ showButtonOnInitialLoad(BUTTON);
33
+ }, 500);
34
+ BUTTON.addEventListener('click', syncHandler);
35
+ }
36
+
37
+ export default refreshAlertButton;
@@ -0,0 +1 @@
1
+ (self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[243],{9243:function(e,n,c){"use strict";function t(){(document.querySelector("#accordion")||document.querySelector(".navTabs"))&&c.e(663).then(c.bind(c,9640)).then((function(e){(0,e.default)()}))}c.r(n),c.d(n,{default:function(){return t}}),c(6992),c(1539),c(8674),c(8783),c(3948)}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[528],{6528:function(e,c,t){"use strict";t.r(c),c.default=function(e,c){var t,n={};return n.spreadsheetId=e,t=c,n.range=t,n}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[853],{2853:function(e,t,n){"use strict";n.r(t),n(1539),n(8674),n(6992),n(8783),n(3948);var s=document.getElementById("syncAlert");function c(e){var t=s.querySelector(".svg__sync");Promise.resolve().then((function(){s.classList.add("buttons--sync--visible"),t.classList.add("loader__sync--animate")})).then((function(){window.setTimeout((function(){n.e(859).then(n.bind(n,6859)).then((function(e){var t=e.default;gapi.load("client",t)}))}),1e3)}))}t.default=function(){window.setTimeout((function(){var e;(e=s).classList.add("buttons--sync--preview"),window.setTimeout((function(){e.classList.remove("buttons--sync--preview")}),3e3)}),500),s.addEventListener("click",c)}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[859],{6859:function(e,t,n){"use strict";n.r(t),n(6992),n(1539),n(3948),n(8674),n(8783);var s={spreadsheetId:"1plXBiZY5pVbhNT-mszxEuqCl4zy8wMnz9gXXbbT_yLs",range:"Alerts"},i={apiKey:"AIzaSyCEBsbXfFcdbkASlg-PodD1rT_Fe3Nw62A",discoveryDocs:["https://www.googleapis.com/discovery/v1/apis/sheets/v4/rest"]};t.default=function(){gapi.client.init(i).then((function(){return gapi.client.sheets.spreadsheets.values.get(s)})).then((function(e){return Promise.resolve().then(n.bind(n,3169)).then((function(t){(0,t.default)(e,void 0)})),e})).then((function(e){Promise.resolve().then(n.bind(n,6525)).then((function(t){(0,t.default)(e)}))}),(function(e){console.error("Error fetching new alert from gapi:",e)}))}}}]);
@@ -0,0 +1,2 @@
1
+ .dark-mode body{background-color:#191f25}.dark-mode{background-color:#191f25}.dark-mode .header-global__nav--search-icon,.dark-mode .header-global__nav--close-icon{filter:brightness(0.9)}.dark-mode .header-global__brand--svg{color:#bfbfbf}.dark-mode p,.dark-mode ol,.dark-mode ul:not(.navbar-nav),.dark-mode .typography__h2,.dark-mode .typography__h5,.dark-mode .typography__h6,.dark-mode .typography__contacts--title{color:#7e848f}.dark-mode .typography__h4{color:#e46181}.dark-mode .accordion__typography--card-header .btn-link,.dark-mode .typography__h3,.dark-mode .typography__header-global--nav-top,.dark-mode .typography__contacts--name{color:#9bb7dd}.dark-mode .typography__h5--description{color:#7e848f}.dark-mode .typography__h5--oswald{color:#9a9faa}.dark-mode .footer-icons,.dark-mode .buttons__action,.dark-mode iframe[title="calendar"],.dark-mode .hero-slider__slider,.dark-mode #emergencyAlerts{filter:brightness(0.75)}.dark-mode .buttons__action{border-color:rgba(255,255,255,0.65)}.dark-mode .buttons__action:hover{background-color:#002348;border-color:rgba(255,255,255,0.4)}.dark-mode footer{background-color:#14191d;border-top-color:rgba(255,255,255,0.5);border-top-width:1px;border-top-style:solid}.dark-mode .breadcrumbs{border-bottom-color:rgba(255,255,255,0.5)}.dark-mode .background__color--tan{background-color:#1e1b15}.dark-mode .benefits__background-color{background-color:#1c282c}.dark-mode .news__h3{color:#abaeb3}.dark-mode .header-global .dropdown-menu{background-color:#151a1e}.dark-mode .header-global .dropdown-menu .dropdown-item{color:#ccc}.dark-mode .header-global .dropdown-menu .dropdown-item:hover,.dark-mode .header-global .dropdown-menu .dropdown-item:focus{background-color:#000;color:#efefef}.dark-mode .benefits__typography--img-cap{color:#abaeb3}.dark-mode .news__li{border-bottom-color:#abaeb3}.dark-mode .svg--fill-blue{stroke:#abaeb3}.dark-mode .svg__fill--blue{fill:#abaeb3}.dark-mode .benefits__borders--circle-img{border-color:#000;filter:drop-shadow(5px 5px 12px rgba(0,0,0,0.5)) brightness(0.75)}.dark-mode .news__span{box-shadow:inset 0 0 0 1.4px #7e848f}.dark-mode .news__div--img{border:solid thin #ccc;filter:brightness(0.75)}.dark-mode .btn-primary{background-color:#002348;border-color:#8db2e5}.dark-mode .btn-primary:hover{background-color:#8db2e5;color:#002348 !important}.dark-mode .alert-warning{background-color:#664d03;border-color:#fff3cd}.dark-mode .alert-warning p{color:#fff3cd}.dark-mode .alert-primary{background-color:#003670;border-color:#cce5ff}.dark-mode .alert-primary p{color:#cce5ff}.dark-mode .alert-info{background-color:#0a4752;border-color:#d1ecf1}.dark-mode .alert-info p{color:#d1ecf1}.dark-mode .alert-danger{background-color:#461116;border-color:#f8d7da}.dark-mode .alert-danger p{color:#f8d7da}.dark-mode a:not(.nav-link),.dark-mode .links__darker-link{color:#8db2e5}.dark-mode a:not(.btn):hover,.dark-mode .links__darker-link:hover{color:#bfd7f9}.dark-mode iframe[title="calendar"]{filter:contrast(0.5)}.dark-mode .header-global__nav-top{background-color:#011a36}.dark-mode .header-global__nav-bottom{background-color:#600f23}.dark-mode .buttons__action{color:#fff !important;background-color:#80132e}.dark-mode img{filter:brightness(0.75)}.dark-mode .card{background-color:#151a1c;border-color:rgba(255,255,255,0.4)}.dark-mode .card-body{background-color:#192125}.dark-mode .accordion>.card>.card-header{margin-bottom:0;border-bottom-color:rgba(255,255,255,0.125)}.dark-mode .accordion__button::before{border-style:solid;border-color:rgba(255,255,255,0.25);border-width:thin}.dark-mode .nav-tabs .nav-link{border-left-color:rgba(255,255,255,0.325);border-right-color:rgba(255,255,255,0.325);border-top-color:rgba(255,255,255,0.325);border-bottom-color:rgba(255,255,255,0.5);background-color:#151a1c}.dark-mode .nav-tabs .nav-link.active{border-color:rgba(255,255,255,0.6) !important;background-color:#192125;border-bottom:thin solid #192125 !important}.dark-mode .nav-tabs{border-bottom-color:rgba(255,255,255,0.5)}.dark-mode .nav-tabs .nav-item.show .nav-link,.dark-mode .nav-tabs .nav-link.active{color:#abaeb3}.dark-mode .tab-pane{background-color:#192125;border-bottom:thin solid rgba(255,255,255,0.5);border-left:thin solid rgba(255,255,255,0.5);border-right:thin solid rgba(255,255,255,0.5);border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;padding:.5rem}.dark-mode td,.dark-mode th,.dark-mode thead th{border-color:#454d55}.dark-mode .table{background-color:#262a2e;color:#abaeb3}.dark-mode .table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.dark-mode .table-hover tbody tr:hover{background-color:rgba(255,255,255,0.25);color:#fff}.dark-mode .modal-content{background-color:#2a2f34;border-color:rgba(255,255,255,0.4)}.dark-mode .modal-header{border-bottom-color:rgba(255,255,255,0.5);color:#abaeb3}.dark-mode .modal-footer{border-bottom-color:rgba(255,255,255,0.5)}.dark-mode .close{color:#abaeb3}.dark-mode .close:hover,.dark-mode .close:focus{color:rgba(255,255,255,0.6)}.dark-mode .header-global__navbar--toggler .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.75)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.dark-mode .header-global__navbar--toggler{border-color:rgba(255,255,255,0.5)}.dark-mode #headerGlobalNavbarContent.collapse.show .navbar-nav,.dark-mode #headerGlobalNavbarContent.collapsing .navbar-nav{background-color:#14181d}.dark-mode #___gcse_0{filter:invert(1)}.dark-mode pre{background-color:#272934;border-radius:8px;color:#0f0;padding-top:1rem}.dark-mode hr{border-top-color:rgba(255,255,255,0.325)}.dark-mode div.dt-button-collection{filter:invert(1) brightness(2.5)}.dark-mode div.dataTables_scrollBody{filter:brightness(0.95)}@media screen and (min-width: 992px){.dark-mode .header-global__navbar--search-toggle:before{background-color:#011a36}.dark-mode .header-global__nav-bottom .dropdown:hover{background-color:#0f1417}.dark-mode .header-global .dropdown-menu{border:thin solid rgba(255,255,255,0.325)}}@media screen and (max-width: 991px){.dark-mode .header-global__core:after{background-color:#272b30;border-top:1px solid #b1b1b1}.dark-mode .header-global .dropdown-menu{border:thin solid rgba(255,255,255,0.325)}}.dark-mode #board-of-trustees{border:none !important}.dark-mode #agendas-and-minutes{border:none !important}.dark-mode #v-pills-tabContent .tab-pane{border:none}.dark-mode .sub-nav__navbar{background-color:#141a1c !important}.dark-mode .sub-nav__nav-link{color:#8db2e5}.dark-mode .typography__sub-nav--red-h2,.dark-mode .typography__section--heading{color:#e46181}.dark-mode .error__main-heading{color:#e46181}.dark-mode .error__sub-heading{color:#9bb7dd}.dark-mode .svg__sync{fill:#8db2e5}.dark-mode button:hover .svg__sync,.dark-mode button:focus .svg__sync{fill:#bfd7f9}.buttons--sync:hover,.buttons--sync:focus{border-color:rgba(141,178,229,0.75);border-style:solid;border-width:1px}
2
+