kcc-gem-theme 2.11.1 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) 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.c28b5f95745c3ae51033.css} +0 -0
  16. data/assets/js/dist/{647.eb877787e2886ec50c13.css → 647.c28b5f95745c3ae51033.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.c28b5f95745c3ae51033.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.c28b5f95745c3ae51033.css +2 -0
  24. data/assets/js/dist/{translate.eb877787e2886ec50c13.css → translate.c28b5f95745c3ae51033.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 +59 -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 +27 -0
  31. data/assets/scss/2-modules/_loader.scss +16 -0
  32. metadata +13 -8
  33. data/assets/js/alerts/campusAlertsSheetsAPI.js +0 -50
  34. data/assets/js/dist/87.eb877787e2886ec50c13.css +0 -2
  35. 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: 1c9fe676b5ed8a981d3a0d1bdc797b8994c924f0a2048e414b180bfb4a5abcf3
4
+ data.tar.gz: 0f4fe47cf73ba8e105e542f6eddaa5f2e2f432a56e3230807f926c82a5d16f26
5
5
  SHA512:
6
- metadata.gz: fd68d216e39bd6fa5fb7e303561e8cf1bf8c7e1984788ab3467dc019680f3e121ad10af0e2764e84436c4d8b606d781abab6f7ddd3bbe2982733c34e455f7b59
7
- data.tar.gz: def7b9d5acc1bcb3875367d4fb5fbe713aa1176a08fa732e1b43dbe5275a78a04b2a49f6dd4dbb52e99fbc0919c6073cf8a7021689f275e6acd534b031e34122
6
+ metadata.gz: 196a29b0e803963cd0ca72a70fda0d566b5e97a3b9e5d6c8a52f379c5aea8f1b8cc6e0b0084cb83b8eb2eca8c31a76cde7576697f3636aba96d3e7967ea35ebf
7
+ data.tar.gz: 5e71a0d2c3465fcc22bd284d838c98f09ea2c9a93eeba0289e46c10579f81ab0fe8e686ad61854d0ef96c1ed400ca609811ed3d8f5c7829bcf55c326fb9e676f
@@ -1 +1 @@
1
- eb877787e2886ec50c13
1
+ c28b5f95745c3ae51033
@@ -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 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 .header-global,.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:#002348}.dark-mode .header-global__nav-bottom{background-color:#80132e}.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:#002348}.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}
2
+