j1-template 2021.2.5 → 2021.2.9

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/modules/connectors/translators/google-translator.html +2 -1
  3. data/_layouts/default.html +0 -1
  4. data/assets/data/iso-639-language-codes-flags.json +224 -0
  5. data/assets/data/{translator_languages.json → iso-639-language-codes.json} +111 -142
  6. data/assets/data/translator.html +23 -19
  7. data/assets/themes/j1/adapter/js/translator.1.js +525 -0
  8. data/assets/themes/j1/adapter/js/translator.js +107 -168
  9. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +27 -12
  10. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  11. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +27 -12
  12. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +1 -1
  13. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +59 -22
  14. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +1 -1
  15. data/assets/themes/j1/modules/translator/js/translator.js +217 -242
  16. data/assets/themes/j1/modules/translator/js/translator.min.js +2 -2
  17. data/lib/j1/version.rb +1 -1
  18. data/lib/starter_web/Gemfile +1 -1
  19. data/lib/starter_web/_config.yml +1 -1
  20. data/lib/starter_web/_data/j1_config.yml +2 -22
  21. data/lib/starter_web/_data/modules/defaults/translator.yml +77 -64
  22. data/lib/starter_web/_data/modules/translator.yml +1 -0
  23. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  24. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  25. data/lib/starter_web/package.json +1 -1
  26. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +3 -3
  27. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  28. data/lib/starter_web/utilsrv/package.json +1 -1
  29. metadata +5 -4
  30. data/assets/data/msdropdown.json +0 -155
@@ -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,29 +356,40 @@ 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 () {
374
+ cbGoogle: function () {
375
+ var logger = log4javascript.getLogger('j1.adapter.translator.cbGoogle');
336
376
  var cookie_names = j1.getCookieNames();
337
377
  var user_state = j1.readCookie(cookie_names.user_state);
338
378
  var user_consent = j1.readCookie(cookie_names.user_consent);
339
379
  var user_translate = j1.readCookie(cookie_names.user_translate);
340
- var head;
341
- var script;
380
+ var msDropdown = document.getElementById('dropdownJSON').msDropdown;
381
+ var selectedTranslationLanguage;
342
382
  var srcLang;
343
383
  var destLang;
344
384
  var transCode;
345
- var cookie_written;
346
385
 
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));
386
+ selectedTranslationLanguage = msDropdown.value;
387
+ logger.info('\n' + 'selected translation language: ' + selectedTranslationLanguage);
350
388
 
351
389
  // update cookie consent settings
352
- user_consent.analysis = user_translate.analysis;
353
- user_consent.personalization = user_translate.personalization;
390
+ user_consent.analysis = user_translate.analysis;
391
+ user_consent.personalization = user_translate.personalization;
392
+
354
393
  cookie_written = j1.writeCookie({
355
394
  name: cookie_names.user_consent,
356
395
  data: user_consent,
@@ -359,130 +398,30 @@ j1.adapter['translator'] = (function (j1, window) {
359
398
  expires: 0
360
399
  });
361
400
 
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
-
378
- // remove class dropcap
379
- // $('.dropcap').children('span').removeClass('j1-dropcap');
380
-
381
- // remove span dropcap !!!
382
- // $('.dropcap').children('span').remove();
401
+ // set transCode settings
402
+ srcLang = "{{site.language}}";
403
+ destLang = translation_language;
404
+ transCode = '/' + srcLang + '/' + selectedTranslationLanguage;
383
405
 
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
- }
406
+ // write the googtrans cookie
407
+ setCookie({
408
+ name: 'googtrans',
409
+ data: transCode
410
+ });
479
411
 
480
- // disable google translate button if visible
481
- if ($('#quickLinksTranslateButton').css('display') === 'block') {
482
- $('#quickLinksTranslateButton').css('display', 'none');
483
- }
412
+ // reload current page (skip cache)
413
+ location.reload(true);
414
+ }, // END cbGoogle
484
415
 
485
- } // END cbCookie
416
+ // -------------------------------------------------------------------------
417
+ // cbDeepl()
418
+ // Called by the translator CORE module after the user made the
419
+ // selection for a translation language
420
+ // -------------------------------------------------------------------------
421
+ cbDeepl: function () {
422
+ var logger = log4javascript.getLogger('j1.adapter.translator.cbDeepl');
423
+ // code for post processing
424
+ } // END cbDeepl
486
425
 
487
426
  }; // END return
488
427
  })(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; }