kcc-gem-theme 4.0.8 → 4.1.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/body.html +0 -1
  3. data/_includes/emergency-alerts.html +6 -29
  4. data/_includes/hash/theme_hash.yml +1 -1
  5. data/_layouts/default-core.html +5 -3
  6. data/assets/js/alerts/addAccordionOrTabHistoryStates.js +3 -1
  7. data/assets/js/alerts/alerts.js +48 -53
  8. data/assets/js/alerts/contentHashLink.js +42 -34
  9. data/assets/js/alerts/createAlertsHtml.js +126 -43
  10. data/assets/js/dist/123.1666265cfa57a68d5866.bundle.js +1 -0
  11. data/assets/js/dist/{404.0aeb91daeb586b1e55a8.bundle.js → 124.1666265cfa57a68d5866.bundle.js} +1 -1
  12. data/assets/js/dist/124.1666265cfa57a68d5866.css +1 -0
  13. data/assets/js/dist/{453.0aeb91daeb586b1e55a8.bundle.js → 453.1666265cfa57a68d5866.bundle.js} +1 -1
  14. data/assets/js/dist/484.1666265cfa57a68d5866.bundle.js +2 -0
  15. data/assets/js/dist/484.1666265cfa57a68d5866.bundle.js.LICENSE.txt +11 -0
  16. data/assets/js/dist/{885.0aeb91daeb586b1e55a8.bundle.js → 543.1666265cfa57a68d5866.bundle.js} +1 -1
  17. data/assets/js/dist/{635.0aeb91daeb586b1e55a8.bundle.js → 635.1666265cfa57a68d5866.bundle.js} +1 -1
  18. data/assets/js/dist/695.1666265cfa57a68d5866.bundle.js +2 -0
  19. data/assets/js/dist/976.1666265cfa57a68d5866.bundle.js +1 -0
  20. data/assets/js/dist/{kcc-theme-landing.0aeb91daeb586b1e55a8.bundle.js → kcc-theme-landing.1666265cfa57a68d5866.bundle.js} +1 -1
  21. data/assets/js/dist/{kcc-theme.0aeb91daeb586b1e55a8.bundle.js → kcc-theme.1666265cfa57a68d5866.bundle.js} +2 -2
  22. data/assets/js/dist/kcc-theme.1666265cfa57a68d5866.css +1 -0
  23. data/assets/js/src/all.js +10 -4
  24. data/assets/js/src/searchPageJumpLinkFix.js +27 -0
  25. data/assets/scss/0-tools/_gsc-search-page-overrides.scss +14 -1
  26. data/assets/scss/1-base/_buttons.scss +3 -62
  27. data/assets/scss/1-base/_typography.scss +12 -5
  28. data/assets/scss/2-modules/_accordion.scss +4 -2
  29. data/assets/scss/3-layout/_positioning.scss +4 -71
  30. metadata +39 -42
  31. data/assets/js/alerts/cacheResponse.js +0 -23
  32. data/assets/js/alerts/checkForPrefersReducedMotion.js +0 -19
  33. data/assets/js/alerts/fetchNewAlert.js +0 -33
  34. data/assets/js/alerts/getCachedResponse.js +0 -43
  35. data/assets/js/alerts/refreshAlertButton.js +0 -37
  36. data/assets/js/dist/604.0aeb91daeb586b1e55a8.bundle.js +0 -1
  37. data/assets/js/dist/695.0aeb91daeb586b1e55a8.bundle.js +0 -2
  38. data/assets/js/dist/706.0aeb91daeb586b1e55a8.bundle.js +0 -1
  39. data/assets/js/dist/885.0aeb91daeb586b1e55a8.css +0 -1
  40. data/assets/js/dist/923.0aeb91daeb586b1e55a8.bundle.js +0 -1
  41. data/assets/js/dist/kcc-theme.0aeb91daeb586b1e55a8.css +0 -1
  42. /data/assets/js/dist/{102.0aeb91daeb586b1e55a8.bundle.js → 102.1666265cfa57a68d5866.bundle.js} +0 -0
  43. /data/assets/js/dist/{111.0aeb91daeb586b1e55a8.bundle.js → 111.1666265cfa57a68d5866.bundle.js} +0 -0
  44. /data/assets/js/dist/{143.0aeb91daeb586b1e55a8.bundle.js → 143.1666265cfa57a68d5866.bundle.js} +0 -0
  45. /data/assets/js/dist/{172.0aeb91daeb586b1e55a8.bundle.js → 172.1666265cfa57a68d5866.bundle.js} +0 -0
  46. /data/assets/js/dist/{3.0aeb91daeb586b1e55a8.bundle.js → 3.1666265cfa57a68d5866.bundle.js} +0 -0
  47. /data/assets/js/dist/{303.0aeb91daeb586b1e55a8.bundle.js → 303.1666265cfa57a68d5866.bundle.js} +0 -0
  48. /data/assets/js/dist/{354.0aeb91daeb586b1e55a8.bundle.js → 354.1666265cfa57a68d5866.bundle.js} +0 -0
  49. /data/assets/js/dist/{453.0aeb91daeb586b1e55a8.bundle.js.LICENSE.txt → 453.1666265cfa57a68d5866.bundle.js.LICENSE.txt} +0 -0
  50. /data/assets/js/dist/{501.0aeb91daeb586b1e55a8.bundle.js → 501.1666265cfa57a68d5866.bundle.js} +0 -0
  51. /data/assets/js/dist/{404.0aeb91daeb586b1e55a8.css → 543.1666265cfa57a68d5866.css} +0 -0
  52. /data/assets/js/dist/{600.0aeb91daeb586b1e55a8.bundle.js → 600.1666265cfa57a68d5866.bundle.js} +0 -0
  53. /data/assets/js/dist/{635.0aeb91daeb586b1e55a8.bundle.js.LICENSE.txt → 635.1666265cfa57a68d5866.bundle.js.LICENSE.txt} +0 -0
  54. /data/assets/js/dist/{676.0aeb91daeb586b1e55a8.bundle.js → 676.1666265cfa57a68d5866.bundle.js} +0 -0
  55. /data/assets/js/dist/{695.0aeb91daeb586b1e55a8.bundle.js.LICENSE.txt → 695.1666265cfa57a68d5866.bundle.js.LICENSE.txt} +0 -0
  56. /data/assets/js/dist/{731.0aeb91daeb586b1e55a8.bundle.js → 731.1666265cfa57a68d5866.bundle.js} +0 -0
  57. /data/assets/js/dist/{758.0aeb91daeb586b1e55a8.bundle.js → 758.1666265cfa57a68d5866.bundle.js} +0 -0
  58. /data/assets/js/dist/{772.0aeb91daeb586b1e55a8.bundle.js → 772.1666265cfa57a68d5866.bundle.js} +0 -0
  59. /data/assets/js/dist/{818.0aeb91daeb586b1e55a8.bundle.js → 818.1666265cfa57a68d5866.bundle.js} +0 -0
  60. /data/assets/js/dist/{977.0aeb91daeb586b1e55a8.bundle.js → 977.1666265cfa57a68d5866.bundle.js} +0 -0
  61. /data/assets/js/dist/{bootstrap.0aeb91daeb586b1e55a8.bundle.js → bootstrap.1666265cfa57a68d5866.bundle.js} +0 -0
  62. /data/assets/js/dist/{bootstrap.0aeb91daeb586b1e55a8.css → bootstrap.1666265cfa57a68d5866.css} +0 -0
  63. /data/assets/js/dist/{kcc-theme.0aeb91daeb586b1e55a8.bundle.js.LICENSE.txt → kcc-theme.1666265cfa57a68d5866.bundle.js.LICENSE.txt} +0 -0
  64. /data/assets/js/dist/{translate.0aeb91daeb586b1e55a8.bundle.js → translate.1666265cfa57a68d5866.bundle.js} +0 -0
  65. /data/assets/js/dist/{translate.0aeb91daeb586b1e55a8.css → translate.1666265cfa57a68d5866.css} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9c632e8038dbbdb544efe1e4e783f2c8ba7237b3d91e0ad4d003149c7c4c78c
4
- data.tar.gz: 42833e3d1820f776e642dcdd58046dc35b307bd6e7da19712c2dc1dc1c1a137c
3
+ metadata.gz: 330beb1017065384b64d220321220eb66fc6059871f6d44a048b95c1f6fa74d3
4
+ data.tar.gz: 13ee839c2bf619d0dd318e4f8f424b377760254b77df0c3d1cea0cd12c2ebc6c
5
5
  SHA512:
6
- metadata.gz: 8ad7b7c0fc4dd3c8abe1ada52c82742cca65e7eb1edf12cf73474df919e4a884c0ad1bde4996fc720989a828c05e6c443055a9804a852348f65b62864385fe3b
7
- data.tar.gz: 90981c36aaf1b70e3721263aecf1ea5e3e8026c27a35c86f77c4ab22e33bcb2904ad7cd7db921b74cad78c1fd2a1056a90cbaad87cb51f7332fd0b286a7eb881
6
+ metadata.gz: 9a938399207beeb843378515f201d49738031d3e0deebe37b32b3af244eef31109b521f9dddddc53ffbea7105213ebc5ee0bdc71ea81b01f08d62b2a351b359d
7
+ data.tar.gz: d50ab8dac5e210c02effa238a815f6fd1fe103cbe970b940c21f2a2810679d82736d8c00c1d52fc7b74841772a426bc7c3efaad1b6e8b50ec342693e529aa2be
data/_includes/body.html CHANGED
@@ -6,4 +6,3 @@
6
6
  </head>
7
7
  <body data-bs-no-jquery{% if page.homepage == true %} id="homePage"{% endif %}>
8
8
  {% unless site.exclude_nav_skip_link == true or page.exclude_nav_skip_link == true %}<a class="visually-hidden-focusable links__skip-nav" href="#content">Jump to main content</a>{% endunless %}
9
- <h1 class="visually-hidden">{%- if page.outline_title -%}{{ page.outline_title }}{% else %}{{ page.title }}{%- endif -%}</h1>
@@ -1,30 +1,7 @@
1
- <div id="emergencyAlerts" class="position__offset-alert{% if site.core_site == true %} position__offset-alert-core{% endif %}{% if site.core_root == true %} position__offset-alert-core--root{% endif %}{% if page.title == 'Settings' or page.title == 'Search' or page.title == '404' or page.title == 'Amazon Career Choice' or page.core-alert-offset %} positioning__offset--settings{% endif %}{% if site.core_site != true %} position__offset-alert--non-core{% endif %}">
2
- <!-- Alerts get built here via JS if they are set to be active -->
3
- {%- comment -%}
4
- <!-- Example HTML structure of the alert -->
5
- <div class="container position__offset-alert">
6
- <div class="row">
7
- <div class="col">
8
- <div class="alert alert-warning">
9
- <p class="typography__alert mb-0"><strong>Alert</strong>:&nbsp;All KCC facilities will be closed March 18-30. Credit classes resume online March 23. <a href="https://coronavirus.kcc.edu/" target="_blank" rel="noopener noreferrer">coronavirus.kcc.edu</a> has&nbsp;details.</p>
10
- </div>
11
- </div>
12
- </div>
13
- </div>
14
- {% endcomment %}
1
+ <div class="container">
2
+ <div class="row">
3
+ <div class="col">
4
+ <div id="emergencyAlerts" role="status" aria-hidden="true"></div>
15
5
  </div>
16
- {%- comment -%}
17
-
18
- <!-- TODO:
19
-
20
- AFTER CORE IS LAUNCHED
21
-
22
- REMOVE:
23
- ```
24
- {% if site.core_site == true %} position__offset-alert-core{% endif %}{% if site.core_root == true %} position__offset-alert-core--root{% endif %}
25
- ```
26
- (ALSO REMOVE FROM CONFIG)
27
-
28
- ENDTODO -->
29
-
30
- {%- endcomment -%}
6
+ </div>
7
+ </div>
@@ -1 +1 @@
1
- 0aeb91daeb586b1e55a8
1
+ 1666265cfa57a68d5866
@@ -17,9 +17,11 @@ layout: compress
17
17
  {% include scripts/google-noscript.html %}
18
18
  {% if site.translate == true %}{% include translate.html %}{% endif %}
19
19
  {% include header-global.html %}
20
- {% if site.core_root != true and page.no_alert != true %}{% include emergency-alerts.html %}{% endif %}
21
- {{ content }}
22
- {% if page.no_main_call_to_action != true %}{% include main-call-to-action.html %}{% endif %}
20
+ <main id="content" class="positioning__offset-global-header">
21
+ {% if site.core_root != true and page.no_alert != true %}{% include emergency-alerts.html %}{% endif %}
22
+ {{ content }}
23
+ {% if page.no_main_call_to_action != true %}{% include main-call-to-action.html %}{% endif %}
24
+ </main>
23
25
  {% include footer.html %}
24
26
  {% include scripts/vendor-cdn.html %}
25
27
  {% include scripts/google-api.html %}
@@ -20,7 +20,9 @@ function accordionHandler(e) {
20
20
 
21
21
  const accordionIsOpening = Boolean(JSON.parse(e.target.getAttribute('aria-expanded')));
22
22
 
23
- accordionIsOpening ? addHistoryState(e.target, e.target.dataset.bsTarget) : null;
23
+ if (accordionIsOpening) {
24
+ addHistoryState(e.target, e.target.dataset.bsTarget);
25
+ }
24
26
  }
25
27
 
26
28
  function tabHandler(e) {
@@ -3,68 +3,63 @@
3
3
  // © 2020 Kankakee Community College
4
4
  // =================================================== */
5
5
  import createAlertsHtml from './createAlertsHtml';
6
- import cacheResponse from './cacheResponse';
7
- import getCachedResponse from './getCachedResponse';
8
- import checkForPrefersReducedMotion from './checkForPrefersReducedMotion';
9
6
 
10
- const EMERGENCY_ALERT_DIV_ID = 'emergencyAlerts'
11
- const SHEET_PARAMS = {
12
- spreadsheetId: '1plXBiZY5pVbhNT-mszxEuqCl4zy8wMnz9gXXbbT_yLs',
7
+ const apiKey = 'AIzaSyCEBsbXfFcdbkASlg-PodD1rT_Fe3Nw62A';
8
+ const sheetParams = {
9
+ spreadsheetId: '1pqYRAhZvOHB52KqttV_d5P8qWvh9j8pPR15MCoGjMK0',
13
10
  range: 'Alerts'
14
- }; // Configures the Object used for `sheets.spreadsheets.values.get()` parameters
15
- const API_PARAMS = { // This is configuration for API call with spreadsheets that are setup as readonly
16
- 'apiKey': 'AIzaSyCEBsbXfFcdbkASlg-PodD1rT_Fe3Nw62A',
17
- 'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/sheets/v4/rest']
18
11
  };
19
- const pageHasAccordionOrTabs = (document.querySelector('#accordion') || document.querySelector('.navTabs')) ? true : false;
20
12
 
21
- async function loadModule(module) {
22
- const { default: module_func } = await import(`./${module}`);
13
+ const pageHasAccordionOrTabs = (document.querySelector('#accordion') || document.querySelector('.navTabs'));
23
14
 
24
- return module_func();
15
+ function importHashLinkModule(Collapse) {
16
+ import('./contentHashLink')
17
+ .then(({ default: contentHashLink }) => contentHashLink(Collapse));
25
18
  }
26
19
 
27
- export default function alerts(Collapse) {
28
- checkForPrefersReducedMotion();
20
+ async function fetchSheetData(spreadsheetId, range, apiKey) {
21
+ // Use encodeURIComponent to handle spaces and '!' in the range string
22
+ const encodedRange = encodeURIComponent(range);
23
+ const url = `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/${encodedRange}?key=${apiKey}`;
29
24
 
30
- if (!document.getElementById(EMERGENCY_ALERT_DIV_ID)) {
31
- // return pageHasAccordionOrTabs ? loadModule('contentHashLink') : null;
32
- if (pageHasAccordionOrTabs) {
33
- return import('./contentHashLink').then(({default: contentHashLink}) => contentHashLink(Collapse));
25
+ try {
26
+ const response = await fetch(url);
27
+
28
+ if (!response.ok) {
29
+ const error = await response.json();
30
+ throw new Error(`Google Sheets API Error: ${error.error.message}`);
34
31
  }
35
- }
36
32
 
37
- new Promise((resolve, reject) => { // First build the alert, whether by cache or API call
38
-
39
- if (window.sessionStorage.getItem('Alert-Content')) { // If cache exists there will be an `Alert-Content` key in `sessionStorage` (which gets set in `./cacheResponse.js`)
40
- getCachedResponse();
41
- return resolve()
42
- } else {
43
- gapi.load('client', () => {
44
- gapi.client.init(API_PARAMS).then(() => {
45
- return gapi.client.sheets.spreadsheets.values.get(SHEET_PARAMS);
46
- }).then(response => {
47
- createAlertsHtml(response) // Promise is resolved after HTML alert is built
48
- return response;
49
- }).then(response => {
50
- cacheResponse(response);
51
- resolve();
52
- }, err => {
53
- console.error("Error trying to fetch the alert from gapi:", err);
54
- })
55
- });
56
- }
57
- }).then(() => {
58
- window.setTimeout(() => {
59
- if (pageHasAccordionOrTabs) {
60
- import('./contentHashLink').then(({default: contentHashLink}) => contentHashLink(Collapse));
61
- }
62
- }, 100)
63
- }) // Run accordion/tab JS, which includes a `scrollTo()`, after alert has painted
64
- .then(() => {
65
- if (!document.getElementById('syncAlert'))
66
- return;
33
+ const data = await response.json();
34
+
35
+ // Google returns an empty object if the range is empty;
36
+ // we default to an empty array for consistency.
37
+ return data.values || [];
38
+ } catch (err) {
39
+ console.error("Failed to fetch sheet data:", err);
40
+ throw err;
41
+ }
42
+ }
67
43
 
68
- return loadModule('refreshAlertButton')
69
- }) // Allow user to refresh the alert (and check for changes/updates)
44
+ export default function alerts(Collapse) {
45
+ if (!document.getElementById('emergencyAlerts') && pageHasAccordionOrTabs) {
46
+ // Handle page with no emergency alerts
47
+ importHashLinkModule(Collapse);
48
+ } else {
49
+ // Handle pages with alerts
50
+ // const response = await fetchSheetData(sheetParams.spreadsheetId, sheetParams.range, apiKey);
51
+ fetchSheetData(sheetParams.spreadsheetId, sheetParams.range, apiKey)
52
+ .then(response => {
53
+ createAlertsHtml(response);
54
+ if (pageHasAccordionOrTabs) {
55
+ importHashLinkModule(Collapse);
56
+ }
57
+ })
58
+ .catch(error => {
59
+ console.error("Error received:", error.message);
60
+ if (pageHasAccordionOrTabs) {
61
+ importHashLinkModule(Collapse);
62
+ }
63
+ })
64
+ }
70
65
  }
@@ -12,22 +12,16 @@
12
12
  //
13
13
  import Tab from 'bootstrap/js/dist/tab'; // Import Tab from Bootstrap 5
14
14
 
15
- const idRegex = /.*[\?&]id=([^&]+).*$/; // Lets just cache these reused regex's here
15
+ const idRegex = /.*[\?&]id=([^&]+).*$/;
16
16
  const endingSlashRegex = /\/$/g;
17
- const PREFERS_REDUCED_MOTION_LOCALSTORAGE_KEY = 'userPrefersReducedMotion'; // This localStorage key is set by module: './checkForPrefersReducedMotion.js'
18
- const scrollIntoViewOptionsObject = {
19
- behavior: 'smooth',
20
- block: 'start'
21
- }
22
- const reducedMotionscrollIntoViewOptionsObject = {
23
- block: 'start'
24
- }
17
+ const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
25
18
 
26
19
  function focusElement(el) {
27
- const prefersReducedMotion = window.localStorage.getItem(PREFERS_REDUCED_MOTION_LOCALSTORAGE_KEY);
28
-
29
- prefersReducedMotion == 'true' ? el.scrollIntoView(reducedMotionscrollIntoViewOptionsObject) : el.scrollIntoView(scrollIntoViewOptionsObject);
30
- return el.focus();
20
+ el.focus();
21
+ el.scrollIntoView({
22
+ behavior: motionQuery.matches ? 'instant' : 'smooth',
23
+ block: 'start'
24
+ });
31
25
  }
32
26
 
33
27
  function processIdQuery(query, hash) {
@@ -60,28 +54,43 @@ function openAllAccordions(Collapse) {
60
54
  })
61
55
  }
62
56
 
57
+ function handleTabs(hash) {
58
+ const tab = document.querySelector(`.nav-tabs [data-bs-target="${hash}"]`);
59
+ const bsTab = new Tab(tab);
60
+
61
+ tab.addEventListener('shown.bs.tab', _e => {
62
+ if (window.location.search) {
63
+ checkForQuery(window.location.search, hash);
64
+ } else {
65
+ findContentTarget(`${hash}-label`); // You need to .scrollIntoView() & .focus() on the tab-label which is an anchor or button. It won't work to do .scrollIntoView() and .focus() on the div
66
+ }
67
+ });
68
+
69
+ bsTab.show();
70
+ }
71
+
72
+ function handleAccordions(hash, Collapse) {
73
+ const card = document.querySelector(hash);
74
+ const bsCard = new Collapse(card, {toggle: false});
75
+
76
+ card.addEventListener('shown.bs.collapse', _e => {
77
+ if (window.location.search) {
78
+ checkForQuery(window.location.search, hash);
79
+ } else {
80
+ findContentTarget(`button[data-bs-target="${hash}"]`);
81
+ }
82
+ });
83
+
84
+ bsCard.show();
85
+ }
86
+
63
87
  function checkForMatchingTabOrAccordion(hash, Collapse) {
64
88
  if ( document.querySelector(`.nav-tabs [data-bs-target="${hash}"]`) ) { // Looks for a matching BS5 tab element
65
- const tab = document.querySelector(`.nav-tabs [data-bs-target="${hash}"]`);
66
- const bsTab = new Tab(tab);
67
-
68
- tab.addEventListener('shown.bs.tab', _e => {
69
- window.location.search ?
70
- checkForQuery(window.location.search, hash)
71
- : 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
72
- });
73
- bsTab.show();
89
+ handleTabs(hash);
74
90
  } else if ( document.querySelector(`${hash}.collapse`) ) { // Looks for a matching BS5 collapse element
75
- const card = document.querySelector(hash);
76
- const bsCard = new Collapse(card, {toggle: false});
77
-
78
- card.addEventListener('shown.bs.collapse', _e => {
79
- window.location.search ?
80
- checkForQuery(window.location.search, hash)
81
- : findContentTarget(`button[data-bs-target="${hash}"]`);
82
- });
83
- bsCard.show();
91
+ handleAccordions(hash, Collapse);
84
92
  } else if (hash === '#please-open-all-accordions') {
93
+ // The #please-open-all-accordions hash is a helper for accessibility testing
85
94
  openAllAccordions(Collapse);
86
95
  }
87
96
  }
@@ -101,9 +110,8 @@ function contentHashLink(Collapse) {
101
110
  checkForHash(Collapse);
102
111
  }, false);
103
112
 
104
- import('./addAccordionOrTabHistoryStates').then(({ default: addAccordionOrTabHistoryStates }) => {
105
- addAccordionOrTabHistoryStates();
106
- });
113
+ import('./addAccordionOrTabHistoryStates')
114
+ .then(({ default: addAccordionOrTabHistoryStates }) => addAccordionOrTabHistoryStates());
107
115
  }
108
116
 
109
117
  export default contentHashLink;
@@ -1,72 +1,155 @@
1
1
  /*
2
2
  // Custom JS | written by https://github.com/wdzajicek
3
- // © 2020 Kankakee Community College
4
3
  // =================================================== */
5
4
  // JS module to build alert message using data from Google Sheets API v4
6
5
  //
7
6
  // This exported module requires you pass it's default-function the `response` object from the API call, as the only argument
8
7
  //
9
8
  import parseMarkdownToHTML from './parseMarkdownToHTML.js'; // Parses a simplified markdown into html & creates the paragraph el's with appropriate class
10
- //
11
- const CAMPUS_ALERTS_DIV_ID_STRING = 'emergencyAlerts'; // ID of the div to house campus alerts - already built into the page.
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
9
 
15
- function injectAlert(target, alert) {
16
- target.innerHTML = alert;
17
- return target.classList.add(ALERTS_VISIBLE_CLASS);
18
- }
10
+ const parent = document.getElementById('emergencyAlerts'); // This targets an element built into the DOM that we inject everything into.
19
11
 
12
+ // returns the BS5 color class depending on the choice in the Google Sheet
20
13
  function checkAlertType(type) {
21
14
  return type == 'SCHOOL EMERGENCY/CLOSURE - red' ? 'danger'
15
+ : type == 'SCHOOL WARNING - yellow' ? 'warning'
22
16
  : type == 'SCHOOL INFO - blue' ? 'primary'
23
17
  : type == 'SCHOOL INFO - cyan' ? 'info'
24
18
  : 'warning';
25
19
  }
26
20
 
27
- function createAlertsHtml(response) { // Incoming response from our Google Sheet via the Sheets API
28
- let [visibility, allPages, content, expire, start, end, type] = response.result.values[2]; // The 3rd row has our table's data
21
+ // Since the alert systems is rarely used we can get away with a simplified hashing function.
22
+ // There's a tiny possibility of hash clashing but it's not likely and alerts are used a few times a year.
23
+ // If hashes end up clashing a more formal hashing function (from external library) may be needed but will come with bloat.
24
+ function generateAlertKey(alertText) {
25
+ let hash = 0;
26
+
27
+ for (let i = 0; i < alertText.length; i++) {
28
+ const char = alertText.charCodeAt(i);
29
+ // Simple bitwise shifting math to scramble the integer uniquely
30
+ hash = (hash << 5) - hash + char;
31
+ hash |= 0; // Convert to 32bit integer
32
+ }
33
+
34
+ // Math.abs ensures we get a clean positive string ID like "college_alert_293847"
35
+ return `college_alert_${Math.abs(hash)}`;
36
+ }
37
+
38
+ // return true if the alert was dismissed already:
39
+ function isAlertDismissed(alertId) {
40
+ // 1. Grab the history object (default to empty object if it doesn't exist)
41
+ const storage = JSON.parse(localStorage.getItem('alert_history') || '{}');
42
+
43
+ // 2. Check if the specific alertId exists as a key in that object
44
+ // This returns true if found, false if not.
45
+ return alertId in storage;
46
+ }
47
+
48
+ // Returns alert HTML or false if the alert is not current or was dismissed already:
49
+ function createAlert(alertData) {
50
+ const [visibility, allPages, content, expire, start, end, type, today] = alertData;
29
51
  if (visibility === 'FALSE') // Predefined dropdown options in the Sheet are `'TRUE'` & `'FALSE'`
30
- return;
52
+ return false;
53
+
54
+ // Generate a unique key/ID for the alert
55
+ const key = generateAlertKey(content);
31
56
 
32
- const d = new Date;
57
+ if (isAlertDismissed(key))
58
+ return false;
59
+
60
+ const isEmergencyAlert = type == 'SCHOOL EMERGENCY/CLOSURE - red';
61
+ // By letting Google Sheets define today's date (and the Sheet is locked to Chicago time),
62
+ // we need to worry about JS date nonsense and edge cases
63
+ const d = new Date(today);
33
64
  const s = new Date(start);
34
65
  const e = new Date(end);
35
- const alertType = checkAlertType(type);
36
- const alertIsActive = expire === 'FALSE' || expire === 'TRUE' && s.getTime() <= d.getTime() && e.getTime() > d.getTime();
66
+
67
+ [d, s, e].forEach(d => d.setHours(0, 0, 0, 0));
68
+
69
+ const alertType = checkAlertType(type); // Get the suffix for the BS5 class depending on the alert type
70
+ const isCurrent = s.getTime() <= d.getTime() && e.getTime() >= d.getTime();
71
+ const alertIsActive = expire === 'FALSE' || expire === 'TRUE' && isCurrent;
37
72
  const indexPageOnly = allPages === 'TRUE' || allPages === 'FALSE' && window.location.pathname == '/';
38
73
  let alert = `
39
- <div class="container">
40
- <div class="row">
41
- <div class="col">
42
- <div role="alert" class="alert alert-${alertType} d-lg-flex align-items-center pr-lg-1">
43
- <div class="typography__last-p--mb0">
44
- ${parseMarkdownToHTML(content)}
45
- </div>
46
- <button
47
- aria-label="Refresh the alert"
48
- title="Refresh the alert"
49
- id="syncAlert"
50
- type="button"
51
- class="btn btn-link buttons--sync ms-auto">
52
- <svg xmlns="http://www.w3.org/2000/svg"
53
- class="svg__sync"
54
- height="24px"
55
- width="24px"
56
- viewBox="0 0 24 24">
57
- <path d="M0 0h24v24H0z" fill="none"/>
58
- <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
59
- 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
60
- 4.42 3.58 8 8 8v3l4-4-4-4v3z"/>
61
- </svg>
62
- </button>
63
- </div>
64
- </div>
74
+ <div data-alert-id="${key}" class="jsDismissibleAlert alert alert-${alertType} alert-dismissible fade show">
75
+ <div class="typography__last-p--mb0">
76
+ ${parseMarkdownToHTML(content)}
65
77
  </div>
78
+ <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
66
79
  </div>`;
67
80
 
68
- [d,s,e].map(d => d.setHours(0, 0, 0, 0));
69
- return alertIsActive && indexPageOnly ? injectAlert(TARGET, alert) : null;
81
+ if (alertIsActive && indexPageOnly) {
82
+ return alert;
83
+ } else {
84
+ return false;
85
+ }
86
+ }
87
+
88
+ function saveDismissal(alertId) {
89
+ const now = Date.now();
90
+ // 1. Get the existing object or a fresh one
91
+ const storage = JSON.parse(localStorage.getItem('alert_history') || '{}');
92
+
93
+ // 2. Add the new alert with a timestamp
94
+ storage[alertId] = now;
95
+
96
+ // 3. CLEANUP: Remove any alerts older than 30 days
97
+ const thirtyDays = 30 * 24 * 60 * 60 * 1000;
98
+ for (const id in storage) {
99
+ if (now - storage[id] > thirtyDays) {
100
+ delete storage[id];
101
+ }
102
+ }
103
+
104
+ // 4. Save back to localStorage
105
+ localStorage.setItem('alert_history', JSON.stringify(storage));
106
+ }
107
+
108
+ function initAlertDismissal(activeAlertList) {
109
+ // This BS5 module provides the alert dismissing functionality.
110
+ // No need to call any functions, just importing it registers the proper listeners.
111
+ import('bootstrap/js/dist/alert.js');
112
+
113
+ // Listen for dismissal of alerts so that we can save in history
114
+ [...activeAlertList].forEach((alert, i) => {
115
+ alert.addEventListener('closed.bs.alert', e => { // 'closed.bs.alert' is a BS5 event
116
+
117
+ saveDismissal(e.target.dataset.alertId);
118
+ });
119
+ })
120
+ }
121
+
122
+ function createAlertsHtml(response) { // Incoming response from our Google Sheet via the Sheets API
123
+ // row 1 and 2 are instructions and a header row (index 0 and 1)
124
+ // row 3, 4, and 5 can contain an alert (index 2, 3, and 4)
125
+ const alertsHTML = [response[2], response[3], response[4]]
126
+ .map(createAlert)
127
+ .filter(Boolean)
128
+ .join('');
129
+
130
+ if (!alertsHTML) return;
131
+
132
+ parent.insertAdjacentHTML('beforeend', alertsHTML);
133
+ parent.removeAttribute('aria-hidden');
134
+
135
+ // Must happen after alert injection so that we can use it to check for presence of alerts
136
+ const activeAlertList = document.querySelectorAll('.jsDismissibleAlert');
137
+
138
+ // No need to go any further if there are not alerts in the page
139
+ if (activeAlertList.length === 0)
140
+ return;
141
+
142
+ // This BS5 module provides the alert dismissing functionality.
143
+ // No need to call any functions, just importing it registers the proper listeners.
144
+ import('bootstrap/js/dist/alert.js');
145
+
146
+ // Listen for dismissal of alerts so that we can save in history
147
+ [...activeAlertList].forEach((alert, i) => {
148
+ alert.addEventListener('closed.bs.alert', e => { // 'closed.bs.alert' is a BS5 event
149
+
150
+ saveDismissal(e.target.dataset.alertId);
151
+ });
152
+ })
70
153
  }
71
154
 
72
155
  export default createAlertsHtml;
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[123],{5123:function(e,t){const c=document.querySelector('a[href="#content"'),n=window.matchMedia("(prefers-reduced-motion: reduce)");t.default=function(){c.addEventListener("click",e=>{e.preventDefault();const t=e.target.getAttribute("href"),c=document.querySelector(t);c&&(c.hasAttribute("tabindex")||c.setAttribute("tabindex","-1"),c.focus(),c.scrollIntoView({behavior:n.matches?"instant":"smooth"}))})}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[404],{9404:function(e,c,k){k.r(c)}}]);
1
+ "use strict";(self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[124],{7124:function(e,c,k){k.r(c)}}]);
@@ -0,0 +1 @@
1
+ .gsc-results .gsc-cursor-box .gsc-cursor-page{background-color:rgba(0,0,0,.09) !important;border-width:thin;border-style:solid;border-color:#555;border-radius:5px;color:#555 !important;padding:.25rem 1rem}.gsc-results .gsc-cursor-box .gsc-cursor-current-page{background-color:rgba(0,0,0,.25) !important;color:#000 !important;text-decoration:underline !important}.gsc-control-cse{font-family:"Open Sans",sans-serif !important;counter-reset:result}.gsc-webResult.gsc-result{border-bottom:solid thin #0b0e10 !important;margin-left:auto !important;margin-right:auto !important;max-width:630px;padding-left:.75rem !important;padding-right:.75rem !important}.gsc-thumbnail-inside{margin-left:32px}.gsc-thumbnail-inside::before{background-color:#0f3b63;border-radius:50%;border-color:#0b0e10;border-style:solid;border-width:1px;color:#fff;counter-increment:result;content:counter(result);display:block;font-size:14px;font-weight:700;height:26px;margin-left:-32px;line-height:24px;position:absolute;text-align:center;width:26px}.gsc-control-cse,.gsc-control-cse .gsc-table-result{font-size:.99rem !important}.gsc-control-cse .gs-spelling,.gsc-control-cse .gs-result .gs-title,.gsc-control-cse .gs-result .gs-title *{font-size:1.125rem !important}.gs-result .gs-title,.gs-result .gs-title *,.gs-result .gs-title a.gs-title b,.gcsc-find-more-on-google{color:#007bff !important}.gs-result .gs-title a.gs-title:hover,.gs-result .gs-title a.gs-title:hover b{color:#0056b3 !important;text-decoration:underline !important}.gs-result .gs-title a.gs-title:visited,.gs-result .gs-title a.gs-title:visited b{color:#3600b3 !important}.gcsc-find-more-on-google-magnifier{fill:#007bff !important}.gs-webResult div.gs-visibleUrl{color:#148ba9 !important}.gs-bidi-start-align.gs-visibleUrl.gs-visibleUrl-breadcrumb{display:inline-block;border:thin solid rgba(0,0,0,.125);padding:0 .25rem;border-radius:5px;margin-top:.25rem}.gs-webResult:not(.gs-no-results-result):not(.gs-error-result) .gs-snippet,.gs-fileFormatType{color:#555 !important;margin-top:6px;font-family:"Open Sans",sans-serif !important}.gs-bidi-start-align.gs-snippet b{font-weight:700}.gs-web-image-box .gs-image,.gs-promotion-image-box .gs-promotion-image{height:93px;margin-left:-18.25px;max-width:unset !important}.gs-web-image-box,.gs-promotion-image-box{background-color:#555;border-radius:50%;border-color:#ebebeb;border-style:solid;border-width:thin;float:right !important;height:93px;margin-top:.25rem;margin-left:1rem !important;overflow:hidden;padding:0 !important;position:relative;bottom:20px;width:93px !important;top:0}.gs-web-image-box-portrait .gs-image{height:93px;margin-left:-6.25%;transform:scale(1.2)}.gsc-cursor-box.gs-bidi-start-align{margin-top:1.5rem !important}div.gs-title{overflow:visible !important}a.gs-title:focus-visible{outline-offset:3px !important;outline-width:2px !important}.dark-mode .gs-webResult:not(.gs-no-results-result):not(.gs-error-result) .gs-snippet,.dark-mode .gs-fileFormatType{color:#969ca5 !important}.dark-mode .gs-bidi-start-align.gs-visibleUrl.gs-visibleUrl-breadcrumb{border-color:hsla(0,0%,100%,.25)}.dark-mode .gcsc-find-more-on-google-magnifier{fill:#9fc0ed !important}.dark-mode .gs-result .gs-title,.dark-mode .gs-result .gs-title *,.dark-mode .gs-result .gs-title a.gs-title b,.dark-mode .gcsc-find-more-on-google{color:#9fc0ed !important}.dark-mode .gs-result .gs-title a.gs-title:hover,.dark-mode .gs-result .gs-title a.gs-title:hover b{color:#b0d1ff !important}.dark-mode .gs-result .gs-title a.gs-title:visited,.dark-mode .gs-result .gs-title a.gs-title:visited b{color:#7382d7 !important}.dark-mode .gsc-above-wrapper-area{border-bottom-color:hsla(0,0%,100%,.5)}.dark-mode .gsc-control-cse.gsc-control-cse-en{background-color:rgba(0,0,0,0);border-color:hsla(0,0%,100%,.25);border-radius:5px}.dark-mode .gsc-webResult.gsc-result,.dark-mode .gsc-results .gsc-imageResult{background-color:#191d1f;border-color:hsla(0,0%,100%,.125)}.dark-mode .gsc-result-info,.dark-mode .gsc-orderby-label{color:#bababa}.dark-mode .gsc-results .gsc-cursor-box .gsc-cursor-page{background-color:#0b0e10;border-color:hsla(0,0%,100%,.25);border-style:solid}.dark-mode .gsc-results .gsc-cursor-box .gsc-cursor-current-page{color:#ebebeb !important;background-color:rgba(0,0,0,.5) !important}.dark-mode .gsc-webResult.gsc-result:hover{background-color:hsla(0,0%,100%,.0125) !important}.dark-mode .gsc-webResult.gsc-result{border-bottom:solid 1px #fff !important}.dark-mode .gsc-thumbnail-inside::before{background-color:#9bb7dd;border-color:#fff;color:#0b0e10}.dark-mode .gsc-selected-option-container{background-color:#9fc0ed;border-radius:4px;border-color:#fff;border-width:1px;border-style:solid;font-size:13px !important;padding-bottom:1.75rem;padding-left:.75rem !important;padding-right:32px}.dark-mode .gsc-control-cse .gsc-option-selector{right:8px;top:13px;transform:scale(1.5)}.dark-mode .gsc-control-cse .gsc-option-menu{background-color:#0b0e10}.dark-mode .gsc-option-menu-item-highlighted{background-color:#282828;color:#fff}.dark-mode .gs-bidi-start-align.gs-snippet b{color:#c4c4c4}
@@ -1,2 +1,2 @@
1
- /*! For license information please see 453.0aeb91daeb586b1e55a8.bundle.js.LICENSE.txt */
1
+ /*! For license information please see 453.1666265cfa57a68d5866.bundle.js.LICENSE.txt */
2
2
  (self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[453],{1170:function(e,t,n){"use strict";n.r(t),n.d(t,{afterMain:function(){return O},afterRead:function(){return b},afterWrite:function(){return E},applyStyles:function(){return C},arrow:function(){return J},auto:function(){return s},basePlacements:function(){return f},beforeMain:function(){return w},beforeRead:function(){return v},beforeWrite:function(){return _},bottom:function(){return o},clippingParents:function(){return p},computeStyles:function(){return ne},createPopper:function(){return Te},createPopperBase:function(){return ke},createPopperLite:function(){return Ce},detectOverflow:function(){return ve},end:function(){return u},eventListeners:function(){return oe},flip:function(){return ye},hide:function(){return xe},left:function(){return a},main:function(){return x},modifierPhases:function(){return P},offset:function(){return Oe},placements:function(){return g},popper:function(){return d},popperGenerator:function(){return Le},popperOffsets:function(){return _e},preventOverflow:function(){return je},read:function(){return y},reference:function(){return h},right:function(){return i},start:function(){return c},top:function(){return r},variationPlacements:function(){return m},viewport:function(){return l},write:function(){return j}});var r="top",o="bottom",i="right",a="left",s="auto",f=[r,o,i,a],c="start",u="end",p="clippingParents",l="viewport",d="popper",h="reference",m=f.reduce(function(e,t){return e.concat([t+"-"+c,t+"-"+u])},[]),g=[].concat(f,[s]).reduce(function(e,t){return e.concat([t,t+"-"+c,t+"-"+u])},[]),v="beforeRead",y="read",b="afterRead",w="beforeMain",x="main",O="afterMain",_="beforeWrite",j="write",E="afterWrite",P=[v,y,b,w,x,O,_,j,E];function D(e){return e?(e.nodeName||"").toLowerCase():null}function A(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function L(e){return e instanceof A(e).Element||e instanceof Element}function k(e){return e instanceof A(e).HTMLElement||e instanceof HTMLElement}function T(e){return"undefined"!=typeof ShadowRoot&&(e instanceof A(e).ShadowRoot||e instanceof ShadowRoot)}var C={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach(function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];k(o)&&D(o)&&(Object.assign(o.style,n),Object.keys(r).forEach(function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)}))})},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce(function(e,t){return e[t]="",e},{});k(r)&&D(r)&&(Object.assign(r.style,i),Object.keys(o).forEach(function(e){r.removeAttribute(e)}))})}},requires:["computeStyles"]};function M(e){return e.split("-")[0]}var R=Math.max,H=Math.min,S=Math.round;function W(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function B(){return!/^((?!chrome|android).)*safari/i.test(W())}function N(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=e.getBoundingClientRect(),o=1,i=1;t&&k(e)&&(o=e.offsetWidth>0&&S(r.width)/e.offsetWidth||1,i=e.offsetHeight>0&&S(r.height)/e.offsetHeight||1);var a=(L(e)?A(e):window).visualViewport,s=!B()&&n,f=(r.left+(s&&a?a.offsetLeft:0))/o,c=(r.top+(s&&a?a.offsetTop:0))/i,u=r.width/o,p=r.height/i;return{width:u,height:p,top:c,right:f+u,bottom:c+p,left:f,x:f,y:c}}function $(e){var t=N(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function I(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&T(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function V(e){return A(e).getComputedStyle(e)}function q(e){return["table","td","th"].indexOf(D(e))>=0}function U(e){return((L(e)?e.ownerDocument:e.document)||window.document).documentElement}function z(e){return"html"===D(e)?e:e.assignedSlot||e.parentNode||(T(e)?e.host:null)||U(e)}function F(e){return k(e)&&"fixed"!==V(e).position?e.offsetParent:null}function K(e){for(var t=A(e),n=F(e);n&&q(n)&&"static"===V(n).position;)n=F(n);return n&&("html"===D(n)||"body"===D(n)&&"static"===V(n).position)?t:n||function(e){var t=/firefox/i.test(W());if(/Trident/i.test(W())&&k(e)&&"fixed"===V(e).position)return null;var n=z(e);for(T(n)&&(n=n.host);k(n)&&["html","body"].indexOf(D(n))<0;){var r=V(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}function Q(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e,t,n){return R(e,H(t,n))}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce(function(t,n){return t[n]=e,t},{})}var J={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,s=e.name,c=e.options,u=n.elements.arrow,p=n.modifiersData.popperOffsets,l=M(n.placement),d=Q(l),h=[a,i].indexOf(l)>=0?"height":"width";if(u&&p){var m=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,f))}(c.padding,n),g=$(u),v="y"===d?r:a,y="y"===d?o:i,b=n.rects.reference[h]+n.rects.reference[d]-p[d]-n.rects.popper[h],w=p[d]-n.rects.reference[d],x=K(u),O=x?"y"===d?x.clientHeight||0:x.clientWidth||0:0,_=b/2-w/2,j=m[v],E=O-g[h]-m[y],P=O/2-g[h]/2+_,D=X(j,P,E),A=d;n.modifiersData[s]=((t={})[A]=D,t.centerOffset=D-P,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&I(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(e){return e.split("-")[1]}var ee={top:"auto",right:"auto",bottom:"auto",left:"auto"};function te(e){var t,n=e.popper,s=e.popperRect,f=e.placement,c=e.variation,p=e.offsets,l=e.position,d=e.gpuAcceleration,h=e.adaptive,m=e.roundOffsets,g=e.isFixed,v=p.x,y=void 0===v?0:v,b=p.y,w=void 0===b?0:b,x="function"==typeof m?m({x:y,y:w}):{x:y,y:w};y=x.x,w=x.y;var O=p.hasOwnProperty("x"),_=p.hasOwnProperty("y"),j=a,E=r,P=window;if(h){var D=K(n),L="clientHeight",k="clientWidth";D===A(n)&&"static"!==V(D=U(n)).position&&"absolute"===l&&(L="scrollHeight",k="scrollWidth"),(f===r||(f===a||f===i)&&c===u)&&(E=o,w-=(g&&D===P&&P.visualViewport?P.visualViewport.height:D[L])-s.height,w*=d?1:-1),f!==a&&(f!==r&&f!==o||c!==u)||(j=i,y-=(g&&D===P&&P.visualViewport?P.visualViewport.width:D[k])-s.width,y*=d?1:-1)}var T,C=Object.assign({position:l},h&&ee),M=!0===m?function(e,t){var n=e.x,r=e.y,o=t.devicePixelRatio||1;return{x:S(n*o)/o||0,y:S(r*o)/o||0}}({x:y,y:w},A(n)):{x:y,y:w};return y=M.x,w=M.y,d?Object.assign({},C,((T={})[E]=_?"0":"",T[j]=O?"0":"",T.transform=(P.devicePixelRatio||1)<=1?"translate("+y+"px, "+w+"px)":"translate3d("+y+"px, "+w+"px, 0)",T)):Object.assign({},C,((t={})[E]=_?w+"px":"",t[j]=O?y+"px":"",t.transform="",t))}var ne={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,a=void 0===i||i,s=n.roundOffsets,f=void 0===s||s,c={placement:M(t.placement),variation:Z(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,te(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:f})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,te(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:f})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},re={passive:!0},oe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,a=r.resize,s=void 0===a||a,f=A(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach(function(e){e.addEventListener("scroll",n.update,re)}),s&&f.addEventListener("resize",n.update,re),function(){i&&c.forEach(function(e){e.removeEventListener("scroll",n.update,re)}),s&&f.removeEventListener("resize",n.update,re)}},data:{}},ie={left:"right",right:"left",bottom:"top",top:"bottom"};function ae(e){return e.replace(/left|right|bottom|top/g,function(e){return ie[e]})}var se={start:"end",end:"start"};function fe(e){return e.replace(/start|end/g,function(e){return se[e]})}function ce(e){var t=A(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function ue(e){return N(U(e)).left+ce(e).scrollLeft}function pe(e){var t=V(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function le(e){return["html","body","#document"].indexOf(D(e))>=0?e.ownerDocument.body:k(e)&&pe(e)?e:le(z(e))}function de(e,t){var n;void 0===t&&(t=[]);var r=le(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=A(r),a=o?[i].concat(i.visualViewport||[],pe(r)?r:[]):r,s=t.concat(a);return o?s:s.concat(de(z(a)))}function he(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function me(e,t,n){return t===l?he(function(e,t){var n=A(e),r=U(e),o=n.visualViewport,i=r.clientWidth,a=r.clientHeight,s=0,f=0;if(o){i=o.width,a=o.height;var c=B();(c||!c&&"fixed"===t)&&(s=o.offsetLeft,f=o.offsetTop)}return{width:i,height:a,x:s+ue(e),y:f}}(e,n)):L(t)?function(e,t){var n=N(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(t,n):he(function(e){var t,n=U(e),r=ce(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=R(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=R(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),s=-r.scrollLeft+ue(e),f=-r.scrollTop;return"rtl"===V(o||n).direction&&(s+=R(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:a,x:s,y:f}}(U(e)))}function ge(e){var t,n=e.reference,s=e.element,f=e.placement,p=f?M(f):null,l=f?Z(f):null,d=n.x+n.width/2-s.width/2,h=n.y+n.height/2-s.height/2;switch(p){case r:t={x:d,y:n.y-s.height};break;case o:t={x:d,y:n.y+n.height};break;case i:t={x:n.x+n.width,y:h};break;case a:t={x:n.x-s.width,y:h};break;default:t={x:n.x,y:n.y}}var m=p?Q(p):null;if(null!=m){var g="y"===m?"height":"width";switch(l){case c:t[m]=t[m]-(n[g]/2-s[g]/2);break;case u:t[m]=t[m]+(n[g]/2-s[g]/2)}}return t}function ve(e,t){void 0===t&&(t={});var n=t,a=n.placement,s=void 0===a?e.placement:a,c=n.strategy,u=void 0===c?e.strategy:c,m=n.boundary,g=void 0===m?p:m,v=n.rootBoundary,y=void 0===v?l:v,b=n.elementContext,w=void 0===b?d:b,x=n.altBoundary,O=void 0!==x&&x,_=n.padding,j=void 0===_?0:_,E=Y("number"!=typeof j?j:G(j,f)),P=w===d?h:d,A=e.rects.popper,T=e.elements[O?P:w],C=function(e,t,n,r){var o="clippingParents"===t?function(e){var t=de(z(e)),n=["absolute","fixed"].indexOf(V(e).position)>=0&&k(e)?K(e):e;return L(n)?t.filter(function(e){return L(e)&&I(e,n)&&"body"!==D(e)}):[]}(e):[].concat(t),i=[].concat(o,[n]),a=i[0],s=i.reduce(function(t,n){var o=me(e,n,r);return t.top=R(o.top,t.top),t.right=H(o.right,t.right),t.bottom=H(o.bottom,t.bottom),t.left=R(o.left,t.left),t},me(e,a,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(L(T)?T:T.contextElement||U(e.elements.popper),g,y,u),M=N(e.elements.reference),S=ge({reference:M,element:A,strategy:"absolute",placement:s}),W=he(Object.assign({},A,S)),B=w===d?W:M,$={top:C.top-B.top+E.top,bottom:B.bottom-C.bottom+E.bottom,left:C.left-B.left+E.left,right:B.right-C.right+E.right},q=e.modifiersData.offset;if(w===d&&q){var F=q[s];Object.keys($).forEach(function(e){var t=[i,o].indexOf(e)>=0?1:-1,n=[r,o].indexOf(e)>=0?"y":"x";$[e]+=F[n]*t})}return $}var ye={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,u=e.name;if(!t.modifiersData[u]._skip){for(var p=n.mainAxis,l=void 0===p||p,d=n.altAxis,h=void 0===d||d,v=n.fallbackPlacements,y=n.padding,b=n.boundary,w=n.rootBoundary,x=n.altBoundary,O=n.flipVariations,_=void 0===O||O,j=n.allowedAutoPlacements,E=t.options.placement,P=M(E),D=v||(P!==E&&_?function(e){if(M(e)===s)return[];var t=ae(e);return[fe(e),t,fe(t)]}(E):[ae(E)]),A=[E].concat(D).reduce(function(e,n){return e.concat(M(n)===s?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,c=n.allowedAutoPlacements,u=void 0===c?g:c,p=Z(r),l=p?s?m:m.filter(function(e){return Z(e)===p}):f,d=l.filter(function(e){return u.indexOf(e)>=0});0===d.length&&(d=l);var h=d.reduce(function(t,n){return t[n]=ve(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[M(n)],t},{});return Object.keys(h).sort(function(e,t){return h[e]-h[t]})}(t,{placement:n,boundary:b,rootBoundary:w,padding:y,flipVariations:_,allowedAutoPlacements:j}):n)},[]),L=t.rects.reference,k=t.rects.popper,T=new Map,C=!0,R=A[0],H=0;H<A.length;H++){var S=A[H],W=M(S),B=Z(S)===c,N=[r,o].indexOf(W)>=0,$=N?"width":"height",I=ve(t,{placement:S,boundary:b,rootBoundary:w,altBoundary:x,padding:y}),V=N?B?i:a:B?o:r;L[$]>k[$]&&(V=ae(V));var q=ae(V),U=[];if(l&&U.push(I[W]<=0),h&&U.push(I[V]<=0,I[q]<=0),U.every(function(e){return e})){R=S,C=!1;break}T.set(S,U)}if(C)for(var z=function(e){var t=A.find(function(t){var n=T.get(t);if(n)return n.slice(0,e).every(function(e){return e})});if(t)return R=t,"break"},F=_?3:1;F>0&&"break"!==z(F);F--);t.placement!==R&&(t.modifiersData[u]._skip=!0,t.placement=R,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function be(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function we(e){return[r,i,o,a].some(function(t){return e[t]>=0})}var xe={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=ve(t,{elementContext:"reference"}),s=ve(t,{altBoundary:!0}),f=be(a,r),c=be(s,o,i),u=we(f),p=we(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:p},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":p})}},Oe={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,s=n.offset,f=void 0===s?[0,0]:s,c=g.reduce(function(e,n){return e[n]=function(e,t,n){var o=M(e),s=[a,r].indexOf(o)>=0?-1:1,f="function"==typeof n?n(Object.assign({},t,{placement:e})):n,c=f[0],u=f[1];return c=c||0,u=(u||0)*s,[a,i].indexOf(o)>=0?{x:u,y:c}:{x:c,y:u}}(n,t.rects,f),e},{}),u=c[t.placement],p=u.x,l=u.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=p,t.modifiersData.popperOffsets.y+=l),t.modifiersData[o]=c}},_e={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=ge({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,s=e.name,f=n.mainAxis,u=void 0===f||f,p=n.altAxis,l=void 0!==p&&p,d=n.boundary,h=n.rootBoundary,m=n.altBoundary,g=n.padding,v=n.tether,y=void 0===v||v,b=n.tetherOffset,w=void 0===b?0:b,x=ve(t,{boundary:d,rootBoundary:h,padding:g,altBoundary:m}),O=M(t.placement),_=Z(t.placement),j=!_,E=Q(O),P="x"===E?"y":"x",D=t.modifiersData.popperOffsets,A=t.rects.reference,L=t.rects.popper,k="function"==typeof w?w(Object.assign({},t.rects,{placement:t.placement})):w,T="number"==typeof k?{mainAxis:k,altAxis:k}:Object.assign({mainAxis:0,altAxis:0},k),C=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,S={x:0,y:0};if(D){if(u){var W,B="y"===E?r:a,N="y"===E?o:i,I="y"===E?"height":"width",V=D[E],q=V+x[B],U=V-x[N],z=y?-L[I]/2:0,F=_===c?A[I]:L[I],Y=_===c?-L[I]:-A[I],G=t.elements.arrow,J=y&&G?$(G):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[B],ne=ee[N],re=X(0,A[I],J[I]),oe=j?A[I]/2-z-re-te-T.mainAxis:F-re-te-T.mainAxis,ie=j?-A[I]/2+z+re+ne+T.mainAxis:Y+re+ne+T.mainAxis,ae=t.elements.arrow&&K(t.elements.arrow),se=ae?"y"===E?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(W=null==C?void 0:C[E])?W:0,ce=V+ie-fe,ue=X(y?H(q,V+oe-fe-se):q,V,y?R(U,ce):U);D[E]=ue,S[E]=ue-V}if(l){var pe,le="x"===E?r:a,de="x"===E?o:i,he=D[P],me="y"===P?"height":"width",ge=he+x[le],ye=he-x[de],be=-1!==[r,a].indexOf(O),we=null!=(pe=null==C?void 0:C[P])?pe:0,xe=be?ge:he-A[me]-L[me]-we+T.altAxis,Oe=be?he+A[me]+L[me]-we-T.altAxis:ye,_e=y&&be?function(e,t,n){var r=X(e,t,n);return r>n?n:r}(xe,he,Oe):X(y?xe:ge,he,y?Oe:ye);D[P]=_e,S[P]=_e-he}t.modifiersData[s]=S}},requiresIfExists:["offset"]};function Ee(e,t,n){void 0===n&&(n=!1);var r,o,i=k(t),a=k(t)&&function(e){var t=e.getBoundingClientRect(),n=S(t.width)/e.offsetWidth||1,r=S(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),s=U(t),f=N(e,a,n),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==D(t)||pe(s))&&(c=(r=t)!==A(r)&&k(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:ce(r)),k(t)?((u=N(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):s&&(u.x=ue(s))),{x:f.left+c.scrollLeft-u.x,y:f.top+c.scrollTop-u.y,width:f.width,height:f.height}}function Pe(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach(function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}}),r.push(e)}return e.forEach(function(e){t.set(e.name,e)}),e.forEach(function(e){n.has(e.name)||o(e)}),r}var De={placement:"bottom",modifiers:[],strategy:"absolute"};function Ae(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some(function(e){return!(e&&"function"==typeof e.getBoundingClientRect)})}function Le(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?De:o;return function(e,t,n){void 0===n&&(n=i);var o,a,s={placement:"bottom",orderedModifiers:[],options:Object.assign({},De,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},f=[],c=!1,u={state:s,setOptions:function(n){var o="function"==typeof n?n(s.options):n;p(),s.options=Object.assign({},i,s.options,o),s.scrollParents={reference:L(e)?de(e):e.contextElement?de(e.contextElement):[],popper:de(t)};var a,c,l=function(e){var t=Pe(e);return P.reduce(function(e,n){return e.concat(t.filter(function(e){return e.phase===n}))},[])}((a=[].concat(r,s.options.modifiers),c=a.reduce(function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e},{}),Object.keys(c).map(function(e){return c[e]})));return s.orderedModifiers=l.filter(function(e){return e.enabled}),s.orderedModifiers.forEach(function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:s,name:t,instance:u,options:r});f.push(i||function(){})}}),u.update()},forceUpdate:function(){if(!c){var e=s.elements,t=e.reference,n=e.popper;if(Ae(t,n)){s.rects={reference:Ee(t,K(n),"fixed"===s.options.strategy),popper:$(n)},s.reset=!1,s.placement=s.options.placement,s.orderedModifiers.forEach(function(e){return s.modifiersData[e.name]=Object.assign({},e.data)});for(var r=0;r<s.orderedModifiers.length;r++)if(!0!==s.reset){var o=s.orderedModifiers[r],i=o.fn,a=o.options,f=void 0===a?{}:a,p=o.name;"function"==typeof i&&(s=i({state:s,options:f,name:p,instance:u})||s)}else s.reset=!1,r=-1}}},update:(o=function(){return new Promise(function(e){u.forceUpdate(),e(s)})},function(){return a||(a=new Promise(function(e){Promise.resolve().then(function(){a=void 0,e(o())})})),a}),destroy:function(){p(),c=!0}};if(!Ae(e,t))return u;function p(){f.forEach(function(e){return e()}),f=[]}return u.setOptions(n).then(function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)}),u}}var ke=Le(),Te=Le({defaultModifiers:[oe,_e,ne,C,Oe,ye,je,J,xe]}),Ce=Le({defaultModifiers:[oe,_e,ne,C]})},2453:function(e,t,n){e.exports=function(e,t,n,r,o,i){"use strict";function a(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const s=a(e),f="dropdown",c=".bs.dropdown",u=".data-api",p="ArrowUp",l="ArrowDown",d=`hide${c}`,h=`hidden${c}`,m=`show${c}`,g=`shown${c}`,v=`click${c}${u}`,y=`keydown${c}${u}`,b=`keyup${c}${u}`,w="show",x='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',O=`${x}.${w}`,_=".dropdown-menu",j=i.isRTL()?"top-end":"top-start",E=i.isRTL()?"top-start":"top-end",P=i.isRTL()?"bottom-end":"bottom-start",D=i.isRTL()?"bottom-start":"bottom-end",A=i.isRTL()?"left-start":"right-start",L=i.isRTL()?"right-start":"left-start",k={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},T={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class C extends t{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=o.next(this._element,_)[0]||o.prev(this._element,_)[0]||o.findOne(_,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return k}static get DefaultType(){return T}static get NAME(){return f}toggle(){return this._isShown()?this.hide():this.show()}show(){if(i.isDisabled(this._element)||this._isShown())return;const e={relatedTarget:this._element};if(!n.trigger(this._element,m,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const e of[].concat(...document.body.children))n.on(e,"mouseover",i.noop);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(w),this._element.classList.add(w),n.trigger(this._element,g,e)}}hide(){if(i.isDisabled(this._element)||!this._isShown())return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!n.trigger(this._element,d,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))n.off(e,"mouseover",i.noop);this._popper&&this._popper.destroy(),this._menu.classList.remove(w),this._element.classList.remove(w),this._element.setAttribute("aria-expanded","false"),r.removeDataAttribute(this._menu,"popper"),n.trigger(this._element,h,e)}}_getConfig(e){if("object"==typeof(e=super._getConfig(e)).reference&&!i.isElement(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError(`${f.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(void 0===s)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org/docs/v2/)");let e=this._element;"parent"===this._config.reference?e=this._parent:i.isElement(this._config.reference)?e=i.getElement(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const t=this._getPopperConfig();this._popper=s.createPopper(e,this._menu,t)}_isShown(){return this._menu.classList.contains(w)}_getPlacement(){const e=this._parent;if(e.classList.contains("dropend"))return A;if(e.classList.contains("dropstart"))return L;if(e.classList.contains("dropup-center"))return"top";if(e.classList.contains("dropdown-center"))return"bottom";const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?E:j:t?D:P}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(r.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...i.execute(this._config.popperConfig,[void 0,e])}}_selectMenuItem({key:e,target:t}){const n=o.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(e=>i.isVisible(e));n.length&&i.getNextActiveElement(n,t,e===l,!n.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){const t=C.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(2===e.button||"keyup"===e.type&&"Tab"!==e.key)return;const t=o.find(O);for(const n of t){const t=C.getInstance(n);if(!t||!1===t._config.autoClose)continue;const r=e.composedPath(),o=r.includes(t._menu);if(r.includes(t._element)||"inside"===t._config.autoClose&&!o||"outside"===t._config.autoClose&&o)continue;if(t._menu.contains(e.target)&&("keyup"===e.type&&"Tab"===e.key||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;const i={relatedTarget:t._element};"click"===e.type&&(i.clickEvent=e),t._completeHide(i)}}static dataApiKeydownHandler(e){const t=/input|textarea/i.test(e.target.tagName),n="Escape"===e.key,r=[p,l].includes(e.key);if(!r&&!n)return;if(t&&!n)return;e.preventDefault();const i=this.matches(x)?this:o.prev(this,x)[0]||o.next(this,x)[0]||o.findOne(x,e.delegateTarget.parentNode),a=C.getOrCreateInstance(i);if(r)return e.stopPropagation(),a.show(),void a._selectMenuItem(e);a._isShown()&&(e.stopPropagation(),a.hide(),i.focus())}}return n.on(document,y,x,C.dataApiKeydownHandler),n.on(document,y,_,C.dataApiKeydownHandler),n.on(document,v,C.clearMenus),n.on(document,b,C.clearMenus),n.on(document,v,x,function(e){e.preventDefault(),C.getOrCreateInstance(this).toggle()}),i.defineJQueryPlugin(C),C}(n(1170),n(9011),n(7956),n(2333),n(5411),n(4035))}}]);
@@ -0,0 +1,2 @@
1
+ /*! For license information please see 484.1666265cfa57a68d5866.bundle.js.LICENSE.txt */
2
+ (self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[484],{6484:function(e,t,s){e.exports=function(e,t,s,i){"use strict";const n=".bs.alert",r=`close${n}`,c=`closed${n}`;class o extends e{static get NAME(){return"alert"}close(){if(t.trigger(this._element,r).defaultPrevented)return;this._element.classList.remove("show");const e=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,e)}_destroyElement(){this._element.remove(),t.trigger(this._element,c),this.dispose()}static jQueryInterface(e){return this.each(function(){const t=o.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return s.enableDismissTrigger(o,"close"),i.defineJQueryPlugin(o),o}(s(9011),s(7956),s(8248),s(4035))},8248:function(e,t,s){!function(e,t,s,i){"use strict";e.enableDismissTrigger=(e,n="hide")=>{const r=`click.dismiss${e.EVENT_KEY}`,c=e.NAME;t.on(document,r,`[data-bs-dismiss="${c}"]`,function(t){if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),i.isDisabled(this))return;const r=s.getElementFromSelector(this)||this.closest(`.${c}`);e.getOrCreateInstance(r)[n]()})},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}(t,s(7956),s(5411),s(4035))}}]);
@@ -0,0 +1,11 @@
1
+ /*!
2
+ * Bootstrap alert.js v5.3.8 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+
7
+ /*!
8
+ * Bootstrap component-functions.js v5.3.8 (https://getbootstrap.com/)
9
+ * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
10
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11
+ */
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[885],{5885:function(e,c,k){k.r(c)}}]);
1
+ "use strict";(self.webpackChunkkcc_gem_theme=self.webpackChunkkcc_gem_theme||[]).push([[543],{7543:function(e,c,k){k.r(c)}}]);