j1-template 2021.2.4 → 2021.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/modules/connectors/ad/google-adsense.html +7 -0
  3. data/_includes/themes/j1/modules/connectors/translators/google-translator.html +2 -1
  4. data/_layouts/default.html +0 -1
  5. data/assets/data/iso-639-language-codes-flags.json +224 -0
  6. data/assets/data/{translator_languages.json → iso-639-language-codes.json} +111 -142
  7. data/assets/data/translator.html +24 -20
  8. data/assets/themes/j1/adapter/js/translator.1.js +525 -0
  9. data/assets/themes/j1/adapter/js/translator.js +104 -181
  10. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +27 -12
  11. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  12. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +27 -12
  13. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +1 -1
  14. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +59 -22
  15. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +1 -1
  16. data/assets/themes/j1/modules/lightGallery/js/modules/lg-thumbnail.js +16 -8
  17. data/assets/themes/j1/modules/translator/js/translator.js +208 -236
  18. data/assets/themes/j1/modules/translator/js/translator.min.js +2 -2
  19. data/lib/j1/version.rb +1 -1
  20. data/lib/starter_web/Gemfile +1 -1
  21. data/lib/starter_web/_config.yml +1 -1
  22. data/lib/starter_web/_data/j1_config.yml +2 -22
  23. data/lib/starter_web/_data/modules/defaults/translator.yml +77 -64
  24. data/lib/starter_web/_data/modules/translator.yml +1 -0
  25. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  26. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  27. data/lib/starter_web/package.json +1 -1
  28. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +3 -3
  29. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  30. data/lib/starter_web/utilsrv/package.json +1 -1
  31. metadata +5 -7
  32. data/assets/data/msdropdown.json +0 -155
  33. data/assets/themes/j1/modules/lightGallery/js/modules/lg-video.js +0 -342
  34. data/assets/themes/j1/modules/lightGallery/js/modules/lg-video.min.js +0 -5
  35. data/lib/starter_web/assets/images/pages/features/percentage_global_mobile_tr.jpg +0 -0
@@ -87,6 +87,7 @@ j1.adapter['translator'] = (function (j1, window) {
87
87
  var user_translate = {};
88
88
  var _this;
89
89
  var $modal;
90
+ var domain;
90
91
  var cookie_names;
91
92
  var user_consent;
92
93
  var logger;
@@ -94,7 +95,7 @@ j1.adapter['translator'] = (function (j1, window) {
94
95
  var baseUrl;
95
96
  var hostname;
96
97
  var domain;
97
- var cookie_domain;
98
+ var cookie_sub_domains;
98
99
  var secure;
99
100
  var logText;
100
101
  var cookie_written;
@@ -109,21 +110,45 @@ j1.adapter['translator'] = (function (j1, window) {
109
110
  // ---------------------------------------------------------------------------
110
111
  // helper functions
111
112
  // ---------------------------------------------------------------------------
113
+
114
+ // ---------------------------------------------------------------------------
115
+ // setCookie()
116
+ // writes a flat cookie (not using an encoded JSON string)
117
+ // ---------------------------------------------------------------------------
112
118
  function setCookie(options /*cName, cValue, expDays*/) {
113
- var defaults = {
119
+ var defaults = {};
120
+ var settings;
121
+ var document_cookie;
122
+ var stringifiedAttributes = '';
123
+
124
+ defaults = {
114
125
  name: '',
115
126
  path: '/',
116
127
  expires: 0,
117
- domain: 'localhost'
128
+ domain: 'localhost',
129
+ samesite: 'Strict',
130
+ http_only: false,
131
+ secure: false
118
132
  };
119
- var settings = $.extend(defaults, options);
120
-
121
- var date = new Date();
122
- date.setTime(date.getTime() + (settings.expires * 24 * 60 * 60 * 1000));
123
- const expires = "expires=" + date.toUTCString();
124
- // document.cookie = cName + "=" + cValue + "; " + expires + "; path=/";
125
- // document.cookie = settings.name + "=" + settings.data + "; " + expires + "; path=/";
126
- document.cookie = settings.name + "=" + settings.data + "; path=/";
133
+ settings = $.extend(defaults, options);
134
+
135
+ stringifiedAttributes += '; ' + 'path=' + settings.path;
136
+
137
+ if (settings.expires > 0) {
138
+ date.setTime(date.getTime() + (settings.expires * 24 * 60 * 60 * 1000));
139
+ stringifiedAttributes += '; ' + 'expires=' + date.toUTCString();
140
+ }
141
+
142
+ stringifiedAttributes += '; ' + 'SameSite=' + settings.samesite;
143
+
144
+ if (settings.secure) {
145
+ stringifiedAttributes += '; ' + 'secure=' + settings.secure;
146
+ }
147
+
148
+ // document_cookie = settings.name + '=' + settings.data + '; path=' + settings.path + '; ' + 'domain=' + settings.domain + '; ' + 'SameSite=' + settings.samesite + ';';
149
+ document_cookie = settings.name + '=' + settings.data + stringifiedAttributes;
150
+
151
+ document.cookie = document_cookie;
127
152
  };
128
153
 
129
154
  // ---------------------------------------------------------------------------
@@ -165,6 +190,14 @@ j1.adapter['translator'] = (function (j1, window) {
165
190
  'translationLanguage': translation_language,
166
191
  };
167
192
 
193
+ // set sub domain settings for cookies
194
+ if(domain !== 'localhost') {
195
+ cookie_sub_domains = '.' + hostname;
196
+ } else {
197
+ cookie_sub_domains = hostname;
198
+ }
199
+
200
+ // load|initialize user translate cookie
168
201
  if (j1.existsCookie(cookie_names.user_translate)) {
169
202
  user_translate = j1.readCookie(cookie_names.user_translate);
170
203
  } else {
@@ -177,13 +210,6 @@ j1.adapter['translator'] = (function (j1, window) {
177
210
  });
178
211
  }
179
212
 
180
- // set domain used by cookies
181
- if(domain !== 'localhost') {
182
- cookie_domain = '.' + hostname;
183
- } else {
184
- cookie_domain = hostname;
185
- }
186
-
187
213
  // initialize state flag
188
214
  _this.state = 'pending';
189
215
  // _this.settings.languageList = '/assets/data/ms_select.json';
@@ -218,6 +244,7 @@ j1.adapter['translator'] = (function (j1, window) {
218
244
  logger.info('\n' + 'state: ' + _this.getState());
219
245
  logger.info('\n' + 'module is being initialized');
220
246
 
247
+ // hide the google translate element if exists
221
248
  if ($('google_translate_element')) {
222
249
  $('google_translate_element').hide();
223
250
  }
@@ -249,31 +276,32 @@ j1.adapter['translator'] = (function (j1, window) {
249
276
  });
250
277
 
251
278
  j1.translator = new Translator({
252
- contentURL: moduleOptions.contentURL, // dialog content (modals) for all supported languages
253
- cookieName: moduleOptions.cookieName, // the name of the User State Cookie (primary data)
254
- cookieConsentName: moduleOptions.cookieConsentName, // the name of the Cookie Consent Cookie (secondary data)
255
- dialogContainerID: moduleOptions.dialogContainerID, // dest container, the dialog modal is loaded (dynamically)
256
- dialogLanguage: moduleOptions.dialogLanguage, // language for the dialog (modal)
257
- translationLanguage: translation_language, // language for translation
258
- translationEnabled: moduleOptions.translationEnabled, // run translation enabled|disabled
259
- translatorName: moduleOptions.translatorName, // translator for translation
260
- translationLanguage: moduleOptions.translationLanguage, // language for translation
261
- xhrDataElement: moduleOptions.xhrDataElement, // container for all language-specific dialogs (modals)
262
- postSelectionCallback: function () {j1.adapter.translator.cb()}
279
+ contentURL: moduleOptions.contentURL, // dialog content (modals) for all supported languages
280
+ cookieName: moduleOptions.cookieName, // the name of the User State Cookie (primary data)
281
+ cookieConsentName: moduleOptions.cookieConsentName, // the name of the Cookie Consent Cookie (secondary data)
282
+ disableLanguageSelector: moduleOptions.disableLanguageSelector, // disable language dropdown for translation in dialog (modal)
283
+ dialogContainerID: moduleOptions.dialogContainerID, // dest container, the dialog modal is loaded (dynamically)
284
+ dialogLanguage: moduleOptions.dialogLanguage, // language for the dialog (modal)
285
+ translationLanguage: moduleOptions.translationLanguage, // default language for translation
286
+ translationLanguages: moduleOptions.google.translationLanguages,// supported languages for translation
287
+ translationEnabled: moduleOptions.translationEnabled, // run translation enabled|disabled
288
+ translatorName: moduleOptions.translatorName, // translator used for translation
289
+ xhrDataElement: moduleOptions.xhrDataElement, // container for all language-specific dialogs (modals)
290
+ postSelectionCallback: moduleOptions.google.postSelectionCallback
263
291
  });
264
292
 
293
+ // enable|disable translation (after callback)
265
294
  if (user_consent.analysis && user_consent.personalization && user_translate.translationEnabled) {
266
295
  if (moduleOptions.translatorName === 'google') {
267
296
  head.appendChild(script);
268
- $('google_translate_element').hide();
297
+ if ($('google_translate_element')) {
298
+ $('google_translate_element').hide();
299
+ }
269
300
  }
270
301
  } else {
271
302
  if (moduleOptions.translatorName === 'google') {
272
- j1.removeCookie({name: 'googtrans'});
273
- // j1.removeCookie({name: 'CONSENT'});
274
- // j1.removeCookie({name: 'NID'});
275
- // j1.removeCookie({name: 'OTZ'});
276
- }
303
+ j1.removeCookie({name: 'googtrans', domain: domain});
304
+ }
277
305
  }
278
306
 
279
307
  _this.setState('finished');
@@ -328,161 +356,56 @@ j1.adapter['translator'] = (function (j1, window) {
328
356
  }, // END getState
329
357
 
330
358
  // -------------------------------------------------------------------------
331
- // cb()
332
- // Called by the translator CORE module after the user has
333
- // made his selection (callback)
359
+ // postTranslateElementInit()
360
+ // ???
361
+ // -------------------------------------------------------------------------
362
+ postTranslateElementInit: function (response) {
363
+ // code for post processing
364
+ logger.info('\n' + 'postTranslateElementInit entered');
365
+ logger.info('\n' + response.T.Dh);
366
+ return;
367
+ }, // END postTranslateElementInit
368
+
369
+ // -------------------------------------------------------------------------
370
+ // cbGoogle()
371
+ // Called by the translator CORE module after the user made the
372
+ // selection for a translation|language
334
373
  // -------------------------------------------------------------------------
335
- cb: function () {
336
- var cookie_names = j1.getCookieNames();
337
- var user_state = j1.readCookie(cookie_names.user_state);
338
- var user_consent = j1.readCookie(cookie_names.user_consent);
339
- var user_translate = j1.readCookie(cookie_names.user_translate);
340
- var head;
341
- var script;
374
+ cbGoogle: function () {
375
+ var logger = log4javascript.getLogger('j1.adapter.translator.cbGoogle');
376
+ var msDropdown = document.getElementById('dropdownJSON').msDropdown;
377
+ var selectedTranslationLanguage;
342
378
  var srcLang;
343
379
  var destLang;
344
380
  var transCode;
345
- var cookie_written;
346
-
347
- logger.info('\n' + 'entered post selection callback from google_translate');
348
- logger.debug('\n' + 'current values from cookie consent: ' + JSON.stringify(user_consent));
349
- logger.debug('\n' + 'current values from user state: ' + JSON.stringify(user_state));
350
-
351
- // update cookie consent settings
352
- user_consent.analysis = user_translate.analysis;
353
- user_consent.personalization = user_translate.personalization;
354
- cookie_written = j1.writeCookie({
355
- name: cookie_names.user_consent,
356
- data: user_consent,
357
- samesite: 'Strict',
358
- secure: secure,
359
- expires: 0
360
- });
361
-
362
- if (user_consent.analysis && user_consent.personalization) {
363
-
364
- // detect changes on the last element on your page, cause then
365
- // you know all elements above is translated.
366
- // $('#j1_footer').bind('DOMSubtreeModified', function() {
367
- // var val = $(this);
368
- // var strlang = "" + val[0].innerText + "";
369
- // console.log(strlang); // print your selected language in console
370
- // });
371
-
372
- // $('#google_translate_element').bind('DOMSubtreeModified', function() {
373
- // var val = $(this);
374
- // var strlang = "" + val[0].innerText + "";
375
- // console.log(strlang); // print your selected language in console
376
- // });
377
381
 
378
- // remove class dropcap
379
- // $('.dropcap').children('span').removeClass('j1-dropcap');
382
+ selectedTranslationLanguage = msDropdown.value;
383
+ logger.info('\n' + 'selected translation language: ' + selectedTranslationLanguage);
380
384
 
381
- // remove span dropcap !!!
382
- // $('.dropcap').children('span').remove();
385
+ // set transCode settings
386
+ srcLang = "{{site.language}}";
387
+ destLang = translation_language;
388
+ transCode = '/' + srcLang + '/' + selectedTranslationLanguage;
383
389
 
384
- // $('.dropcap').children('span').removeClass('j1-dropcap');
385
- // $('.paragraph.dropcap').parent().find('p').removeClass('j1-dropcap');
386
-
387
- head = document.getElementsByTagName('head')[0];
388
- script = document.createElement('script');
389
- script.id = 'google-translate';
390
- script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
391
-
392
- if (user_translate.translationEnabled && moduleOptions.translatorName === 'google') {
393
- head.appendChild(script);
394
-
395
- if ($('google_translate_element')) {
396
- $('google_translate_element').hide();
397
- }
398
-
399
- srcLang = "{{site.language}}";
400
- destLang = translation_language;
401
- transCode = '/' + srcLang + '/' + destLang;
402
-
403
- // set language
404
- setCookie({
405
- name: 'googtrans',
406
- data: transCode
407
- });
408
-
409
- // enable google transalate button if not visible
410
- if ($('#quickLinksTranslateButton').css('display') === 'none') {
411
- $('#quickLinksTranslateButton').css('display', 'block');
412
- }
413
-
414
- } else {
415
-
416
- user_translate.translationEnabled = false;
417
- cookie_written = j1.writeCookie({
418
- name: cookie_names.user_translate,
419
- data: user_translate,
420
- samesite: 'Strict',
421
- secure: secure
422
- });
423
-
424
- var el = document.getElementById(script.id);
425
-
426
- if (el) { el.remove(); }
427
-
428
- el = document.getElementById('google_translate_element');
429
- if (el) { el.remove(); }
430
-
431
- j1.removeCookie({name: 'googtrans'});
432
- // j1.removeCookie({name: '1P_JAR'});
433
- // j1.removeCookie({name: 'CONSENT'});
434
- // j1.removeCookie({name: 'NID'});
435
- }
436
-
437
- }
438
-
439
- if (!user_translate.analysis || !user_translate.personalization) {
440
- head = document.getElementsByTagName('head')[0];
441
- script = document.createElement('script');
442
- script.id = 'google-translate';
443
- // script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
444
-
445
- var el = document.getElementById(script.id);
446
-
447
- // update cookie consent settings
448
- user_consent.analysis = user_translate.analysis;
449
- user_consent.personalization = user_translate.personalization;
450
- cookie_written = j1.writeCookie({
451
- name: cookie_names.user_consent,
452
- data: user_consent,
453
- samesite: 'Strict',
454
- secure: secure,
455
- expires: 0
456
- });
457
-
458
- user_translate.translationEnabled = false;
459
- cookie_written = j1.writeCookie({
460
- name: cookie_names.user_translate,
461
- data: user_consent,
462
- samesite: 'Strict',
463
- secure: secure,
464
- expires: 0
465
- });
466
-
467
- if (el) { el.remove(); }
468
-
469
- el = document.getElementById('google_translate_element');
470
- if (el) { el.remove(); }
471
-
472
- j1.removeCookie({name: 'googtrans'});
473
- }
474
-
475
- if (moduleOptions.reloadPageOnChange) {
476
- // reload current page (skip cache)
477
- location.reload(true);
478
- }
390
+ // write the googtrans cookie
391
+ setCookie({
392
+ name: 'googtrans',
393
+ data: transCode
394
+ });
479
395
 
480
- // disable google translate button if visible
481
- if ($('#quickLinksTranslateButton').css('display') === 'block') {
482
- $('#quickLinksTranslateButton').css('display', 'none');
483
- }
396
+ // reload current page (skip cache)
397
+ location.reload(true);
398
+ }, // END cbGoogle
484
399
 
485
- } // END cbCookie
400
+ // -------------------------------------------------------------------------
401
+ // cbDeepl()
402
+ // Called by the translator CORE module after the user made the
403
+ // selection for a translation language
404
+ // -------------------------------------------------------------------------
405
+ cbDeepl: function () {
406
+ var logger = log4javascript.getLogger('j1.adapter.translator.cbDeepl');
407
+ // code for post processing
408
+ } // END cbDeepl
486
409
 
487
410
  }; // END return
488
411
  })(j1, window);
@@ -13,7 +13,7 @@
13
13
  # -----------------------------------------------------------------------------
14
14
  */
15
15
  /*!
16
- * Bootstrap v4.6.0 (https://getbootstrap.com/)
16
+ * Bootstrap v4.6.1 (https://getbootstrap.com/)
17
17
  * Copyright 2011-2021 The Bootstrap Authors
18
18
  * Copyright 2011-2021 Twitter, Inc.
19
19
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
@@ -1414,9 +1414,6 @@ pre {
1414
1414
  .form-control::-ms-expand {
1415
1415
  background-color: transparent;
1416
1416
  border: 0; }
1417
- .form-control:-moz-focusring {
1418
- color: transparent;
1419
- text-shadow: 0 0 0 #495057; }
1420
1417
  .form-control:focus {
1421
1418
  color: #495057;
1422
1419
  background-color: #fff;
@@ -1436,6 +1433,10 @@ input[type="datetime-local"].form-control,
1436
1433
  input[type="month"].form-control {
1437
1434
  appearance: none; }
1438
1435
 
1436
+ select.form-control:-moz-focusring {
1437
+ color: transparent;
1438
+ text-shadow: 0 0 0 #495057; }
1439
+
1439
1440
  select.form-control:focus::-ms-value {
1440
1441
  color: #495057;
1441
1442
  background-color: #fff; }
@@ -1576,7 +1577,7 @@ textarea.form-control {
1576
1577
 
1577
1578
  .was-validated .form-control:valid, .form-control.is-valid {
1578
1579
  border-color: #28a745;
1579
- padding-right: calc(1.5em + 0.75rem);
1580
+ padding-right: calc(1.5em + 0.75rem) !important;
1580
1581
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
1581
1582
  background-repeat: no-repeat;
1582
1583
  background-position: right calc(0.375em + 0.1875rem) center;
@@ -1585,13 +1586,17 @@ textarea.form-control {
1585
1586
  border-color: #28a745;
1586
1587
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
1587
1588
 
1589
+ .was-validated select.form-control:valid, select.form-control.is-valid {
1590
+ padding-right: 3rem !important;
1591
+ background-position: right 1.5rem center; }
1592
+
1588
1593
  .was-validated textarea.form-control:valid, textarea.form-control.is-valid {
1589
1594
  padding-right: calc(1.5em + 0.75rem);
1590
1595
  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }
1591
1596
 
1592
1597
  .was-validated .custom-select:valid, .custom-select.is-valid {
1593
1598
  border-color: #28a745;
1594
- padding-right: calc(0.75em + 2.3125rem);
1599
+ padding-right: calc(0.75em + 2.3125rem) !important;
1595
1600
  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; }
1596
1601
  .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
1597
1602
  border-color: #28a745;
@@ -1660,7 +1665,7 @@ textarea.form-control {
1660
1665
 
1661
1666
  .was-validated .form-control:invalid, .form-control.is-invalid {
1662
1667
  border-color: #dc3545;
1663
- padding-right: calc(1.5em + 0.75rem);
1668
+ padding-right: calc(1.5em + 0.75rem) !important;
1664
1669
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
1665
1670
  background-repeat: no-repeat;
1666
1671
  background-position: right calc(0.375em + 0.1875rem) center;
@@ -1669,13 +1674,17 @@ textarea.form-control {
1669
1674
  border-color: #dc3545;
1670
1675
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
1671
1676
 
1677
+ .was-validated select.form-control:invalid, select.form-control.is-invalid {
1678
+ padding-right: 3rem !important;
1679
+ background-position: right 1.5rem center; }
1680
+
1672
1681
  .was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
1673
1682
  padding-right: calc(1.5em + 0.75rem);
1674
1683
  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }
1675
1684
 
1676
1685
  .was-validated .custom-select:invalid, .custom-select.is-invalid {
1677
1686
  border-color: #dc3545;
1678
- padding-right: calc(0.75em + 2.3125rem);
1687
+ padding-right: calc(0.75em + 2.3125rem) !important;
1679
1688
  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; }
1680
1689
  .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
1681
1690
  border-color: #dc3545;
@@ -2551,16 +2560,21 @@ input[type="button"].btn-block {
2551
2560
  display: flex;
2552
2561
  align-items: center; }
2553
2562
  .input-group > .custom-file:not(:last-child) .custom-file-label,
2563
+ .input-group > .custom-file:not(:last-child) .custom-file-label::after {
2564
+ border-top-right-radius: 0;
2565
+ border-bottom-right-radius: 0; }
2554
2566
  .input-group > .custom-file:not(:first-child) .custom-file-label {
2555
2567
  border-top-left-radius: 0;
2556
2568
  border-bottom-left-radius: 0; }
2557
2569
  .input-group:not(.has-validation) > .form-control:not(:last-child),
2558
2570
  .input-group:not(.has-validation) > .custom-select:not(:last-child),
2571
+ .input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label,
2559
2572
  .input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after {
2560
2573
  border-top-right-radius: 0;
2561
2574
  border-bottom-right-radius: 0; }
2562
2575
  .input-group.has-validation > .form-control:nth-last-child(n + 3),
2563
2576
  .input-group.has-validation > .custom-select:nth-last-child(n + 3),
2577
+ .input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label,
2564
2578
  .input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label::after {
2565
2579
  border-top-right-radius: 0;
2566
2580
  border-bottom-right-radius: 0; }
@@ -4581,8 +4595,11 @@ a.close.disabled {
4581
4595
  align-items: center;
4582
4596
  justify-content: center;
4583
4597
  width: 15%;
4598
+ padding: 0;
4584
4599
  color: #fff;
4585
4600
  text-align: center;
4601
+ background: none;
4602
+ border: 0;
4586
4603
  opacity: 0.5;
4587
4604
  transition: opacity 0.15s ease; }
4588
4605
  @media (prefers-reduced-motion: reduce) {
@@ -4668,7 +4685,7 @@ a.close.disabled {
4668
4685
  display: inline-block;
4669
4686
  width: 2rem;
4670
4687
  height: 2rem;
4671
- vertical-align: text-bottom;
4688
+ vertical-align: -0.125em;
4672
4689
  border: 0.25em solid currentColor;
4673
4690
  border-right-color: transparent;
4674
4691
  border-radius: 50%;
@@ -4690,7 +4707,7 @@ a.close.disabled {
4690
4707
  display: inline-block;
4691
4708
  width: 2rem;
4692
4709
  height: 2rem;
4693
- vertical-align: text-bottom;
4710
+ vertical-align: -0.125em;
4694
4711
  background-color: currentColor;
4695
4712
  border-radius: 50%;
4696
4713
  opacity: 0;
@@ -7158,8 +7175,6 @@ a.text-dark:hover, a.text-dark:focus {
7158
7175
  blockquote {
7159
7176
  border: 1px solid #adb5bd;
7160
7177
  page-break-inside: avoid; }
7161
- thead {
7162
- display: table-header-group; }
7163
7178
  tr,
7164
7179
  img {
7165
7180
  page-break-inside: avoid; }