j1-template 2022.3.1 → 2022.3.2

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/modules/navigator/generator.html +1 -1
  3. data/assets/data/cookieconsent.html +4 -4
  4. data/assets/data/nbinteract.html +128 -0
  5. data/assets/data/quicklinks.html +15 -0
  6. data/assets/data/translator.html +15 -15
  7. data/assets/themes/j1/adapter/js/mmenu.js +25 -3
  8. data/assets/themes/j1/adapter/js/navigator.js +2 -2
  9. data/assets/themes/j1/adapter/js/nbinteract.js +230 -34
  10. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +27 -54
  11. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  12. data/assets/themes/j1/core/js/template.js +14 -3
  13. data/assets/themes/j1/core/js/template.min.js +1 -1
  14. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  15. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.js +1 -1
  16. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.js.map +1 -1
  17. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.min.js +1 -1
  18. data/lib/j1/version.rb +3 -3
  19. data/lib/starter_web/Gemfile +1 -1
  20. data/lib/starter_web/_config.yml +1 -1
  21. data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +51 -41
  22. data/lib/starter_web/_data/modules/defaults/navigator.yml +4 -0
  23. data/lib/starter_web/_data/modules/defaults/nbinteract.yml +95 -1
  24. data/lib/starter_web/_data/modules/defaults/translator.yml +24 -12
  25. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  26. data/lib/starter_web/package.json +1 -1
  27. data/lib/starter_web/pages/public/jupyter/docs/j1-nbinteract-doc.adoc +2 -3
  28. data/lib/starter_web/pages/public/jupyter/docs/nbinteract-doc.adoc +17 -17
  29. data/lib/starter_web/pages/public/jupyter/examples/j1-circular-times-table.adoc +7 -8
  30. data/lib/starter_web/pages/public/jupyter/examples/j1-interactive-widgets.adoc +4 -5
  31. data/lib/starter_web/pages/public/jupyter/examples/j1-odes-in-python.adoc +5 -6
  32. data/lib/starter_web/pages/public/jupyter/examples/j1-testing-plotly.adoc +3 -4
  33. data/lib/starter_web/pages/public/jupyter/examples/j1_climate-change-forecast.adoc +4 -4
  34. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-checkpoint.ipynb +26 -26
  35. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_interactive_widgets.ipynb +26 -26
  36. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_central_limit_theorem-checkpoint.ipynb +247 -0
  37. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_graphing-checkpoint.ipynb +18 -18
  38. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/nbi_docs_examples_central_limit_theorem.ipynb +1 -2
  39. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/nbi_docs_recipes_graphing.ipynb +18 -18
  40. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +919 -919
  41. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_graphing.html +473 -473
  42. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  43. data/lib/starter_web/utilsrv/package.json +1 -1
  44. metadata +4 -2
@@ -106,6 +106,11 @@ j1.adapter.nbinteract = (function (j1, window) {
106
106
  className: 'spinner', // CSS class assined to the spinner
107
107
  position: 'fixed', // element positioning: absolute|fixed
108
108
  };
109
+
110
+ var nbActions = {
111
+ "resetLocalStorage": true
112
+ };
113
+
109
114
  var spinnerStarted = false; // switch to indicate a started spinner
110
115
  var nbiContentModalInfoID = 'nbiModalInfoBody'; // ID of the content (messages) for the INFO modal
111
116
  var nbiContentModalSuccessID = 'nbiModalSuccessBody'; // ID of the content (messages) for the SUCCESS modal
@@ -116,7 +121,8 @@ j1.adapter.nbinteract = (function (j1, window) {
116
121
  var nbiModalErrorID = '#' + 'nbiModalTLDanger'; // ID of the ERROR modal
117
122
  var nbinteract_prepared = false; // switch to indicate if ???
118
123
  var nbiModalSuccessMessagesID = 'nbiModalSuccessMessages'; // UL contalner SUCCESS messages
119
- var nbiModalErrorMessagesID = 'nbiModalErrorMessages'; // UL contalner ERROR messahes
124
+ var nbiModalErrorMessagesID = 'nbiModalErrorMessages'; // UL contalner ERROR messages
125
+ var nbiCellsRendered = false; // flag indicates if all widgets in page are rendered
120
126
  var nbiShowMessages; // switch to show NBI messages
121
127
  var nbiIndicateNbiActivity; // switch to show a spinner while NBI is being initialized
122
128
  var nbiModalAutoClose; // switch to auto-close nbi message modals
@@ -133,6 +139,10 @@ j1.adapter.nbinteract = (function (j1, window) {
133
139
  var logger;
134
140
  var coreLogger;
135
141
  var logText;
142
+ var widgetCells;
143
+ var widgetCellsRendered;
144
+ var nbiNotebookReady;
145
+ var Events;
136
146
 
137
147
  // ---------------------------------------------------------------------------
138
148
  // Helper functions
@@ -148,6 +158,19 @@ j1.adapter.nbinteract = (function (j1, window) {
148
158
  // -------------------------------------------------------------------------
149
159
  init: function (options) {
150
160
 
161
+ // -----------------------------------------------------------------------
162
+ // global event handler
163
+ // -----------------------------------------------------------------------
164
+ Events = {
165
+ documentReady: function (onDocumentReady) {
166
+ if (document.readyState !== 'loading') {
167
+ onDocumentReady();
168
+ } else {
169
+ document.addEventListener('DOMContentLoaded', onDocumentReady);
170
+ }
171
+ }
172
+ };
173
+
151
174
  // -----------------------------------------------------------------------
152
175
  // Default module settings
153
176
  // -----------------------------------------------------------------------
@@ -169,6 +192,7 @@ j1.adapter.nbinteract = (function (j1, window) {
169
192
  nbiShowMessages = moduleOptions.show_nbi_messages;
170
193
  nbiIndicateNbiActivity = moduleOptions.indicate_nbi_activity;
171
194
  nbiInitMathJax = moduleOptions.nbi_init_mathjax;
195
+ nbiNotebookReady = moduleOptions.notebook_ready;
172
196
 
173
197
  // -----------------------------------------------------------------------
174
198
  // load|configure Mathjax
@@ -176,22 +200,25 @@ j1.adapter.nbinteract = (function (j1, window) {
176
200
  if (nbiInitMathJax) {
177
201
  _this.initMathJax();
178
202
  }
203
+ // -----------------------------------------------------------------------
204
+ // load|configure NBI dialog (modal)
205
+ // -----------------------------------------------------------------------
206
+ _this.loadDialog(moduleOptions);
179
207
 
180
208
  // -----------------------------------------------------------------------
181
- // load HTML data for all modals used by nbInteract
209
+ // load all modals (HTML portion) used by NBI
182
210
  // -----------------------------------------------------------------------
183
211
  _this.loadNbiModals();
184
212
 
185
213
  // -----------------------------------------------------------------------
186
- // load the HTML portion for all textbooks configured|enabled
214
+ // load all textbooks (HTML portion) configured|enabled
187
215
  // -----------------------------------------------------------------------
188
216
  _this.loadNbiTextbooks(moduleOptions);
189
217
 
190
- // -------------------------------------------------------------------
218
+ // -----------------------------------------------------------------------
191
219
  // run a spinner to indicate activity of 'nbInteract' if enabled
192
- // -------------------------------------------------------------------
220
+ // -----------------------------------------------------------------------
193
221
  $(document).ready(function() {
194
-
195
222
  if (nbiIndicateNbiActivity && !spinnerStarted) {
196
223
  spinnerStarted = true;
197
224
  target = document.getElementById('content');
@@ -214,6 +241,19 @@ j1.adapter.nbinteract = (function (j1, window) {
214
241
  // -----------------------------------------------------------------------
215
242
  _this.interactNbiTextbooks(moduleOptions);
216
243
 
244
+ // toggle hide|show the FAB button, if to wait on 'last_widget' rendered
245
+ //
246
+ if (nbiNotebookReady == 'last_widget') {
247
+ var dependencies_met_page_rendered = setInterval(function() {
248
+ if (nbiCellsRendered) {
249
+ $('.fab-btn').show();
250
+ clearInterval(dependencies_met_page_rendered);
251
+ } else {
252
+ $('.fab-btn').hide();
253
+ }
254
+ }, 25); // END interval dependencies_met_page_rendered
255
+ }
256
+
217
257
  }, // END init
218
258
 
219
259
  // -------------------------------------------------------------------------
@@ -564,7 +604,7 @@ j1.adapter.nbinteract = (function (j1, window) {
564
604
 
565
605
  // ------------------------------------------------------------------
566
606
  // see: https://www.codingexercises.com/replace-all-instances-of-css-class-in-vanilla-js
567
- // see: https://wiki.selfhtml.org/wiki/JavaScript/Operatoren/Rest-_oder_Spread-Operator
607
+ // see: https://wiki.thishtml.org/wiki/JavaScript/Operatoren/Rest-_oder_Spread-Operator
568
608
  // ------------------------------------------------------------------
569
609
 
570
610
  // disable (Google) translation for all HTML 'output_wrapper' elements
@@ -1007,13 +1047,9 @@ j1.adapter.nbinteract = (function (j1, window) {
1007
1047
  // -----------------------------------------------------------------------
1008
1048
 
1009
1049
  // -----------------------------------------------------------------------
1010
- // command|nbi_init_finished
1011
- //
1012
- if (message.type === 'command' && message.action === 'nbi_init_finished') {
1013
-
1014
- _this.setState('finished');
1015
- logger.debug('\n' + 'state: ' + _this.getState());
1016
- logger.info('\n' + 'initializing module finished');
1050
+ // command|nbi_init_started
1051
+ // -----------------------------------------------------------------------
1052
+ if (message.type === 'command' && message.action === 'nbi_init_started') {
1017
1053
 
1018
1054
  if (nbiShowMessages) {
1019
1055
  if (nbiModalAutoClose) {
@@ -1023,21 +1059,42 @@ j1.adapter.nbinteract = (function (j1, window) {
1023
1059
  }
1024
1060
  }
1025
1061
 
1026
- if (nbiIndicateNbiActivity) {
1027
- spinner.stop();
1028
- }
1062
+ widgetCells = document.querySelectorAll('.output_widget_view').length;
1063
+ var dependencies_met_page_rendered = setInterval(function() {
1064
+ widgetCellsRendered = document.querySelectorAll('.widget-vbox').length;
1065
+ if (widgetCellsRendered >= widgetCells) {
1066
+ logger.info('\n' + 'widgets rendered in page (interactive|total) : ' + widgetCells + '|' + widgetCellsRendered);
1067
+ nbiCellsRendered = true;
1068
+ if (nbiIndicateNbiActivity) spinner.stop();
1069
+ _this.setState('finished');
1070
+ logger.debug('\n' + 'state: ' + _this.getState());
1071
+ logger.info('\n' + 'initializing module finished');
1072
+
1073
+ clearInterval(dependencies_met_page_rendered);
1074
+ }
1075
+ }, 25); // END interval dependencies_met_page_rendered
1029
1076
 
1030
- } // END message command/nbi_init_finished
1077
+ // ---------------------------------------------------------------------
1078
+ // show the quicklinks icon
1079
+ // ---------------------------------------------------------------------
1080
+ $('#quickLinksNotebookseButton').show();
1081
+
1082
+ } // END message command/nbi_init_started
1031
1083
 
1084
+ // -----------------------------------------------------------------------
1085
+ // command|mathjax
1086
+ // -----------------------------------------------------------------------
1032
1087
  if (message.type === 'command' && message.action === 'mathjax') {
1033
1088
  logger.error('\n' + 'New Math, ID: ' + message.text);
1034
1089
 
1035
- MathJax.Hub.Startup.signal.Interest(function (message) {
1036
- logger.error("Startup: " + message)
1037
- // if (message.contains('End')) {
1038
- // logger.error("Startup: " + message)
1039
- // }
1040
- });
1090
+ // Register a MathJax callback if page is FULLY rendered
1091
+ // TODO: Dosn't for now tha way !!!
1092
+ // MathJax.Hub.Startup.signal.Interest(function (message) {
1093
+ // logger.error("Startup: " + message)
1094
+ // if (message.contains('End')) {
1095
+ // logger.error("Startup: " + message)
1096
+ // }
1097
+ // });
1041
1098
 
1042
1099
  var dependencies_met_mathjax_rendered = setInterval(function() {
1043
1100
  var elm = document.getElementById('MathJax-Element-6' + '-Frame');
@@ -1051,15 +1108,23 @@ j1.adapter.nbinteract = (function (j1, window) {
1051
1108
  clearInterval(dependencies_met_mathjax_rendered);
1052
1109
  }, 25); // END interval dependencies_met_mathjax_rendered
1053
1110
 
1054
- } // END message command/nbi_init_finished
1111
+ } // END message command/mathjax
1055
1112
 
1056
1113
  // -----------------------------------------------------------------------
1057
- // command|info
1058
- //
1114
+ // command|info
1115
+ // TODO: count messages contain 'Pulling image'.
1116
+ // Potentially a enless loop
1117
+ // -----------------------------------------------------------------------
1059
1118
  if (message.type === 'command' && message.action === 'info') {
1060
1119
  // var reMessageTS = new RegExp('/(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})?(?:Z|[+-][01]\d:[0-5]\d)/');
1061
1120
  var messageTS;
1062
1121
 
1122
+ // widget render info messages for logging
1123
+ //
1124
+ if (message.text.includes('Displaying widget') || message.text.includes('First widget')) {
1125
+ logger.debug('\n' + message.text);
1126
+ }
1127
+
1063
1128
  // remove timestamp|loglevel from message if exists
1064
1129
  //
1065
1130
  messageTS = message.text.split('] ')[1];
@@ -1068,7 +1133,6 @@ j1.adapter.nbinteract = (function (j1, window) {
1068
1133
  }
1069
1134
 
1070
1135
  _this.appendModalMessage(messageSuccessUL, message.text)
1071
-
1072
1136
  logger.debug('\n' + message.text);
1073
1137
 
1074
1138
  // show the info modal
@@ -1083,10 +1147,24 @@ j1.adapter.nbinteract = (function (j1, window) {
1083
1147
 
1084
1148
  // -----------------------------------------------------------------------
1085
1149
  // command|error
1086
- //
1150
+ // -----------------------------------------------------------------------
1087
1151
  if (message.type === 'command' && message.action === 'error') {
1088
1152
  var messageTS;
1089
1153
 
1154
+ if (messageTS.contains('Too many users') || messageTS.contains('Insufficent nodes')) {
1155
+ var modaBodyText = `
1156
+ The <i>Binder Service</i> is currently not available or is overloaded.
1157
+ All interactive components on the page are <b>not</b> available.
1158
+ You can reload the page or re-open later again.
1159
+ `;
1160
+ logger.error('\n', 'Binder access: failed');
1161
+ if ($(nbiModalTRInfo).is(':hidden')) {
1162
+ document.getElementById('nbiModalTRInfoBody').innerHTML = modaBodyText;
1163
+ $(nbiModalTRInfo).modal('show');
1164
+ }
1165
+ return;
1166
+ }
1167
+
1090
1168
  // remove timestamp|loglevel from message if exists
1091
1169
  //
1092
1170
  messageTS = message.text.split('] ')[1];
@@ -1095,14 +1173,13 @@ j1.adapter.nbinteract = (function (j1, window) {
1095
1173
  }
1096
1174
 
1097
1175
  _this.appendModalMessage(messageErrorUL, message.text)
1098
-
1099
1176
  logger.error('\n' + message.text);
1100
1177
 
1101
- // stop the (progress) spinner (currently NOT used)
1178
+ // stop the (progress) spinner
1102
1179
  //
1103
- // if (moduleOptions.indicate_nbi_activity) {
1104
- // spinner.stop();
1105
- // }
1180
+ if (moduleOptions.indicate_nbi_activity) {
1181
+ spinner.stop();
1182
+ }
1106
1183
 
1107
1184
  if (nbiShowMessages) {
1108
1185
  // hide the info modal if shown
@@ -1189,6 +1266,125 @@ j1.adapter.nbinteract = (function (j1, window) {
1189
1266
  });
1190
1267
 
1191
1268
  }, // END checkURL
1269
+
1270
+ // -------------------------------------------------------------------------
1271
+ // loadDialog()
1272
+ // Loads the NBI dialog (modal)
1273
+ // -------------------------------------------------------------------------
1274
+ loadDialog: function (options) {
1275
+ Events.documentReady(function () {
1276
+
1277
+ _this.modal = document.getElementById(options.dialogContainerID);
1278
+ if (!_this.modal) {
1279
+ logger.info('\n' + 'load consent modal');
1280
+
1281
+ _this.modal = document.createElement('div');
1282
+ _this.modal.id = options.dialogContainerID;
1283
+ _this.modal.style.display = 'none';
1284
+
1285
+ _this.modal.setAttribute('class', 'modal fade');
1286
+ _this.modal.setAttribute('tabindex', '-1');
1287
+ _this.modal.setAttribute('role', 'dialog');
1288
+ _this.modal.setAttribute('aria-labelledby', options.dialogContainerID);
1289
+ document.body.append(_this.modal);
1290
+ _this.$modal = $(_this.modal);
1291
+
1292
+ // -------------------------------------------------------------------
1293
+ // load|initialize the dialog (modal content)
1294
+ // -------------------------------------------------------------------
1295
+ var templateUrl = options.contentURL + '/' + 'index.html';
1296
+ $.get(templateUrl)
1297
+ .done(function (data) {
1298
+ // load ALL modals HTML
1299
+ _this.modal.innerHTML = data;
1300
+ // select only the requested modal
1301
+ _this.modal.innerHTML = $('#' + options.xhrDataElement).eq(0).html();
1302
+
1303
+ // set dialog type to 'modal'
1304
+ //
1305
+ $(_this.modal).modal({
1306
+ backdrop: 'static',
1307
+ keyboard: false
1308
+ });
1309
+
1310
+ // register all button links
1311
+ //
1312
+ _this.$buttonDoNotAgree = $('#nbi-buttonDoNotAgree');
1313
+ _this.$buttonAgree = $('#nbi-buttonAgree');
1314
+ _this.$buttonSave = $('#nbi-buttonSave');
1315
+ _this.$buttonAgreeAll = $('#nbi-buttonAgreeAll');
1316
+
1317
+ // register all actions
1318
+ //
1319
+ _this.registerActions();
1320
+
1321
+ // register button event handler
1322
+ //
1323
+ _this.$buttonDoNotAgree.click(function () {
1324
+ _this.doNotAgree();
1325
+ });
1326
+
1327
+ _this.$buttonAgree.click(function () {
1328
+ _this.agreeAll();
1329
+ });
1330
+ })
1331
+ .fail(function () {
1332
+ logger.error('\n' + 'loading nbi dialog (modal): failed');
1333
+ logger.warn('\n' + 'probably no|wrong `contentURL` set');
1334
+ });
1335
+ }
1336
+ }.bind(_this));
1337
+ }, // END loadDialog
1338
+
1339
+ // -------------------------------------------------------------------------
1340
+ // showDialog()
1341
+ // Show the NBI dialog (modal)
1342
+ // -------------------------------------------------------------------------
1343
+ showDialog: function () {
1344
+ this.$modal.modal('show');
1345
+ }, // END showDialog
1346
+
1347
+ // -------------------------------------------------------------------------
1348
+ // registerActions()
1349
+ // register actions to run
1350
+ // -------------------------------------------------------------------------
1351
+ registerActions: function () {
1352
+
1353
+ $('input:checkbox[name="checkboxClearLocalStorage"]').on('click', function (e) {
1354
+ nbActions.resetLocalStorage = $(this).is(':checked');
1355
+ logText = '\n' + 'action ClearLocalStorage changed to: ' + value;
1356
+ logger.info(logText);
1357
+
1358
+ e.stopPropagation();
1359
+ });
1360
+
1361
+ }, // END registerActions
1362
+
1363
+ // -------------------------------------------------------------------------
1364
+ // doNotAgree()
1365
+ // action to run ...
1366
+ // -------------------------------------------------------------------------
1367
+ doNotAgree: function (elmID, msg) {
1368
+ _this.$modal.modal('hide');
1369
+ }, // END doNotAgree
1370
+
1371
+ // -------------------------------------------------------------------------
1372
+ // agreeAll()
1373
+ // caction to run ...
1374
+ // -------------------------------------------------------------------------
1375
+ agreeAll: function (elmID, msg) {
1376
+
1377
+ if (nbActions.resetLocalStorage) {
1378
+ logText = '\n' + 'run action: "Clear Binder Settings"';
1379
+ logger.info(logText);
1380
+ localStorage.removeItem('serverParams');
1381
+ localStorage.removeItem('kernelId');
1382
+ }
1383
+
1384
+ _this.$modal.modal('hide');
1385
+ location.reload(true);
1386
+ }, // END agreeAll
1387
+
1192
1388
  // -------------------------------------------------------------------------
1193
1389
  // appendModalMessage()
1194
1390
  // Appends a message to given (NBI) modal
@@ -25186,15 +25186,16 @@ li.dropdown.nav-item.nav-sub-item:before {
25186
25186
  transition: all 1s ease-in-out;
25187
25187
  background-color: transparent;
25188
25188
  border-bottom: 0; }
25189
+ nav.navbar.navigator.navbar-transparent .quicklink-nav {
25190
+ padding-left: 15px;
25191
+ margin-left: 30px; }
25189
25192
  nav.navbar.navigator.navbar-transparent.light {
25190
25193
  background-color: rgba(255, 255, 255, 0.3); }
25191
25194
  nav.navbar.navigator.navbar-transparent.dark {
25192
25195
  background-color: rgba(0, 0, 0, 0.3); }
25193
25196
  nav.navbar.navigator.menu-center .container {
25194
25197
  position: relative; }
25195
- nav.navbar.navigator.menu-center .navbar-header {
25196
- position: absolute; }
25197
- nav.navbar.navigator.menu-center .attr-nav {
25198
+ nav.navbar.navigator.menu-center .quicklink-nav {
25198
25199
  position: absolute;
25199
25200
  right: 15px; }
25200
25201
  nav.navbar.navigator.menu-center ul.nav.navbar-center {
@@ -25227,25 +25228,26 @@ li.dropdown.nav-item.nav-sub-item:before {
25227
25228
  background-color: rgba(0, 0, 0, 0.3);
25228
25229
  border-bottom: solid 3px #212121;
25229
25230
  border-left: solid 1px #212121; }
25230
- .attr-nav {
25231
+ .quicklink-nav {
25231
25232
  margin-left: 0;
25232
25233
  margin-right: -20px;
25233
25234
  float: right;
25234
25235
  position: relative;
25235
25236
  display: inline-block;
25236
25237
  margin-right: 1.5rem; }
25237
- .attr-nav > ul {
25238
+ .quicklink-nav > ul {
25238
25239
  list-style: none;
25239
25240
  overflow: hidden; }
25240
- .attr-nav > ul > li {
25241
+ .quicklink-nav > ul > li {
25241
25242
  float: left;
25242
25243
  display: block; }
25243
- .attr-nav > ul > li > a {
25244
+ .quicklink-nav > ul > li > a {
25244
25245
  color: rgba(255, 255, 255, 0.5);
25245
25246
  display: block;
25246
25247
  padding: 10px 5px;
25247
- position: relative; }
25248
- .attr-nav > ul > li > a span.badge {
25248
+ position: relative;
25249
+ border-bottom: unset; }
25250
+ .quicklink-nav > ul > li > a span.badge {
25249
25251
  position: absolute;
25250
25252
  top: 50%;
25251
25253
  margin-top: -15px;
@@ -25255,7 +25257,7 @@ li.dropdown.nav-item.nav-sub-item:before {
25255
25257
  width: 15px;
25256
25258
  height: 15px;
25257
25259
  padding-top: 2px; }
25258
- .attr-nav > ul > li.dropdown ul.dropdown-menu {
25260
+ .quicklink-nav > ul > li.dropdown ul.dropdown-menu {
25259
25261
  border-radius: 0;
25260
25262
  box-shadow: 0 0 0;
25261
25263
  border: solid 1px #e0e0e0;
@@ -25487,11 +25489,11 @@ li.dropdown.nav-item.nav-sub-item:before {
25487
25489
  border: none;
25488
25490
  margin-bottom: 0; }
25489
25491
  nav.navbar.navigator .navbar-collapse.collapse {
25490
- display: none !important; }
25492
+ display: none; }
25491
25493
  nav.navbar.navigator .navbar-collapse.collapse.in {
25492
- display: block !important; }
25494
+ display: block; }
25493
25495
  nav.navbar.navigator .navbar-collapse.collapse.show {
25494
- display: block !important; }
25496
+ display: block; }
25495
25497
  nav.navbar.navigator .navbar-nav {
25496
25498
  padding-top: 5px;
25497
25499
  padding-left: 15px;
@@ -25621,11 +25623,10 @@ li.dropdown.nav-item.nav-sub-item:before {
25621
25623
  border: 0;
25622
25624
  border-color: transparent;
25623
25625
  border-radius: 0;
25626
+ box-shadow: unset;
25624
25627
  z-index: 2; }
25625
25628
  nav.navbar.navigator .navbar-toggler:hover {
25626
25629
  color: rgba(255, 255, 255, 0.9); }
25627
- nav.navbar.navigator .navbar-toggler:focus {
25628
- color: rgba(255, 255, 255, 0.9); }
25629
25630
  nav.navbar.navigator .dropdown-item:focus {
25630
25631
  background-color: rgba(0, 0, 0, 0.5) !important; }
25631
25632
  nav.navbar.navigator .dropdown-item:hover {
@@ -25679,19 +25680,19 @@ li.dropdown.nav-item.nav-sub-item:before {
25679
25680
  nav.navbar.navigator.navbar-transparent.light {
25680
25681
  background-color: rgba(0, 0, 0, 0.4) !important;
25681
25682
  border-bottom: 0; }
25682
- .attr-nav {
25683
+ .quicklink-nav {
25683
25684
  position: absolute;
25684
25685
  right: 1.5rem;
25685
25686
  margin-right: 0;
25686
25687
  overflow: hidden; }
25687
- .attr-nav > ul {
25688
+ .quicklink-nav > ul {
25688
25689
  padding: 0;
25689
25690
  margin: 0 -15px -7px 0; }
25690
- .attr-nav > ul > li > a {
25691
+ .quicklink-nav > ul > li > a {
25691
25692
  padding: 16px 15px 15px; }
25692
- .attr-nav > ul > li.dropdown > a.dropdown-toggle:before {
25693
+ .quicklink-nav > ul > li.dropdown > a.dropdown-toggle:before {
25693
25694
  display: none; }
25694
- .attr-nav > ul > li.dropdown ul.dropdown-menu {
25695
+ .quicklink-nav > ul > li.dropdown ul.dropdown-menu {
25695
25696
  margin-top: 2px;
25696
25697
  margin-left: 55px;
25697
25698
  width: 350px;
@@ -25711,45 +25712,17 @@ li.dropdown.nav-item.nav-sub-item:before {
25711
25712
  .nav-item + .nav-item {
25712
25713
  margin-left: 0 !important; } }
25713
25714
 
25714
- @media screen and (min-width: 768px), screen and (max-width: 575px) {
25715
- nav.navbar.navigator .navbar-header {
25716
- padding-left: 15px;
25717
- padding-right: 15px; }
25718
- nav.navbar.navigator .navbar-nav {
25719
- padding-top: 5px;
25720
- padding-left: 15px;
25721
- padding-right: 35px; }
25722
- nav.navbar.navigator.navbar-mobile .navbar-collapse {
25723
- margin-left: 0; }
25724
- nav.navbar.navigator.navbar-mobile.navbar-sidebar .share {
25725
- padding: 30px 15px !important;
25726
- margin-bottom: 0; }
25727
- nav.navbar.navigator.navbar-mobile ul.nav {
25728
- margin-left: -15px;
25729
- border-top: solid 1px #ffffff; }
25730
- nav.navbar.navigator.navbar-sidebar .share {
25731
- padding: 30px 15px !important;
25732
- padding: 30px 0 !important;
25733
- margin-bottom: 0; }
25734
- nav.navigator.navbar-full .navbar-collapse {
25735
- left: 15px; }
25736
- nav.navigator.navbar-full .navbar-header {
25737
- padding-right: 0; }
25738
- nav.navigator.navbar-full .navbar-toggle {
25739
- margin-right: -15px; }
25740
- nav.navigator.navbar-full ul.nav > li > a {
25741
- color: rgba(255, 255, 255, 0.5);
25742
- font-size: 18px !important;
25743
- line-height: 24px !important;
25744
- padding: 5px 10px !important; }
25745
- .attr-nav > ul {
25715
+ @media screen and (max-width: 992px), screen and (max-width: 575px) {
25716
+ ul#desktop_menu {
25717
+ display: none; }
25718
+ .quicklink-nav > ul {
25746
25719
  margin-right: -10px; }
25747
- .attr-nav > ul > li > a {
25720
+ .quicklink-nav > ul > li > a {
25748
25721
  color: rgba(255, 255, 255, 0.5);
25749
25722
  padding: 16px 10px 15px;
25750
25723
  padding-left: 0;
25751
25724
  border-bottom: unset; }
25752
- .attr-nav > ul > li.dropdown ul.dropdown-menu {
25725
+ .quicklink-nav > ul > li.dropdown ul.dropdown-menu {
25753
25726
  left: -275px; }
25754
25727
  .top-search .container {
25755
25728
  padding: 0 15px; }