j1-template 2022.3.1 → 2022.3.2

Sign up to get free protection for your applications and to get access to all the features.
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; }