j1-template 2021.2.5 → 2021.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/_layouts/default.html +0 -1
  3. data/assets/data/iso-639-language-codes-flags.json +224 -0
  4. data/assets/data/{translator_languages.json → iso-639-language-codes.json} +111 -142
  5. data/assets/data/translator.html +24 -20
  6. data/assets/themes/j1/adapter/js/translator.js +66 -80
  7. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +27 -12
  8. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  9. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +27 -12
  10. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +1 -1
  11. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +59 -22
  12. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +1 -1
  13. data/assets/themes/j1/modules/translator/js/translator.js +208 -236
  14. data/assets/themes/j1/modules/translator/js/translator.min.js +2 -2
  15. data/lib/j1/version.rb +1 -1
  16. data/lib/starter_web/Gemfile +1 -1
  17. data/lib/starter_web/_config.yml +1 -1
  18. data/lib/starter_web/_data/j1_config.yml +2 -22
  19. data/lib/starter_web/_data/modules/defaults/translator.yml +77 -64
  20. data/lib/starter_web/_data/modules/translator.yml +1 -0
  21. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  22. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  23. data/lib/starter_web/package.json +1 -1
  24. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +3 -3
  25. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  26. data/lib/starter_web/utilsrv/package.json +1 -1
  27. metadata +4 -4
  28. data/assets/data/msdropdown.json +0 -155
@@ -64,20 +64,22 @@ exclude_from_search: true
64
64
  {% comment %} i18n: translations
65
65
  -------------------------------------------------------------------------------- {% endcomment %}
66
66
 
67
- {% comment %} Modal translator dialog (default: en-EN)
67
+ {% comment %} Modal Google Translator dialog (default: en-EN)
68
68
  -------------------------------------------------------------------------------- {% endcomment %}
69
69
  <div id="google-data-en">
70
70
  <div id="modal-google-translate-en" class="modal-dialog modal-frame modal-top modal-notify modal-primary" role="document">
71
71
  <div class="modal-content">
72
72
 
73
73
  <div class="modal-header">
74
- <p class="lead">{{translate_options.modal_settings.title.en}}</p>
74
+ <p class="lead">{{translate_options.google.modal_settings.title.en}}</p>
75
75
  </div>
76
76
 
77
77
  <div class="modal-body">
78
78
  <div class="modal-body-text" style="font-size: 90%">
79
- <p class="mb-3">{{translate_options.modal_settings.body_text.en}}</p>
79
+ <p class="mb-3">{{translate_options.google.modal_settings.body_text.en}}</p>
80
80
  </div>
81
+ <p style="font-size: 90%">{{translate_options.google.modal_settings.language_selector_title.en}}</p>
82
+ <div id="dropdownJSON" class="mb-4" style="display:none"></div>
81
83
  <p>
82
84
  <a href="#google-privacy" data-toggle="collapse" class="">Privacy Notice</a>
83
85
  <a href="#google-options" data-toggle="collapse" class="float-right">My Settings</a>
@@ -85,7 +87,7 @@ exclude_from_search: true
85
87
 
86
88
  <div id="google-privacy" class="collapse">
87
89
  <div class="modal-body-text" style="font-size: 90%">
88
- <p class="mb-4">{{translate_options.modal_settings.privacy_notice.en}}</p>
90
+ <p class="mb-4">{{translate_options.google.modal_settings.privacy_notice.en}}</p>
89
91
  </div>
90
92
  </div>
91
93
 
@@ -148,16 +150,16 @@ exclude_from_search: true
148
150
  </div>
149
151
 
150
152
  <div class="modal-footer">
151
- <button id="translator-buttonDoNotAgree" type="button" class="btn btn-link text-decoration-none" style="">
152
- No, disable translation
153
+ <button id="translator-buttonDoNotAgree" type="button" class="btn btn-link text-decoration-none" style="min-width: 20rem">
154
+ No, skip translation
153
155
  </button>
154
- <button id="translator-buttonAgree" type="button" class="btn btn-primary btn-raised" style="">
156
+ <button id="translator-buttonAgree" type="button" class="btn btn-primary btn-raised" style="min-width: 20rem">
155
157
  Yes, please translate
156
158
  </button>
157
- <button id="translator-buttonSave" type="button" class="btn btn-primary" style="display: none;">
159
+ <button id="translator-buttonSave" type="button" class="btn btn-primary" style="display:none; min-width: 20rem">
158
160
  Save selection
159
161
  </button>
160
- <button id="translator-buttonAgreeAll" type="button" class="btn btn-primary btn-raised" style="display: none;">
162
+ <button id="translator-buttonAgreeAll" type="button" class="btn btn-primary btn-raised" style="display:none; min-width: 20rem">
161
163
  I Agree on all
162
164
  </button>
163
165
  </div>
@@ -166,21 +168,23 @@ exclude_from_search: true
166
168
  </div>
167
169
  </div>
168
170
 
169
- {% comment %} END Modal translator dialog (en-EN)
171
+ {% comment %} END Modal Google Translator dialog (en-EN)
170
172
  -------------------------------------------------------------------------------- {% endcomment %}
171
173
 
172
- {% comment %} Modal translator dialog (de-DE)
174
+ {% comment %} Modal Google Translator dialog (de-DE)
173
175
  -------------------------------------------------------------------------------- {% endcomment %}
174
176
  <div id="google-data-de">
175
177
  <div id="modal-google-translate-de" class="modal-dialog modal-frame modal-top modal-notify modal-primary" role="document">
176
178
  <div class="modal-content">
177
179
  <div class="modal-header">
178
- <p class="lead">{{translate_options.modal_settings.title.de}}</p>
180
+ <p class="lead">{{translate_options.google.modal_settings.title.de}}</p>
179
181
  </div>
180
182
  <div class="modal-body">
181
183
  <div class="modal-body-text" style="font-size: 90%">
182
- <p class="mb-4">{{translate_options.modal_settings.body_text.de}}</p>
184
+ <p class="mb-4">{{translate_options.google.modal_settings.body_text.de}}</p>
183
185
  </div>
186
+ <p style="font-size: 90%">{{translate_options.google.modal_settings.language_selector_title.de}}</p>
187
+ <div id="dropdownJSON" class="mb-4" style="display:none"></div>
184
188
  <p>
185
189
  <a href="#google-privacy" data-toggle="collapse" class="">Datenschutzerklärung</a>
186
190
  <a href="#google-options" data-toggle="collapse" class="float-right">Meine Einstellungen</a>
@@ -188,7 +192,7 @@ exclude_from_search: true
188
192
 
189
193
  <div id="google-privacy" class="collapse">
190
194
  <div class="modal-body-text" style="font-size: 90%">
191
- <p class="mb-4">{{translate_options.modal_settings.privacy_notice.de}}</p>
195
+ <p class="mb-4">{{translate_options.google.modal_settings.privacy_notice.de}}</p>
192
196
  </div>
193
197
  </div>
194
198
 
@@ -261,16 +265,16 @@ exclude_from_search: true
261
265
  </div>
262
266
 
263
267
  <div class="modal-footer">
264
- <button id="translator-buttonDoNotAgree" type="button" class="btn btn-link text-decoration-none" style="">
265
- Nein, bitte Übersetzungen abschalten
268
+ <button id="translator-buttonDoNotAgree" type="button" class="btn btn-link text-decoration-none" style="min-width: 20rem">
269
+ Nein, keine Übersetzung
266
270
  </button>
267
- <button id="translator-buttonAgree" type="button" class="btn btn-primary btn-raised" style="">
271
+ <button id="translator-buttonAgree" type="button" class="btn btn-primary btn-raised" style="min-width: 20rem">
268
272
  Ja, bitte übersetzen
269
273
  </button>
270
- <button id="translator-buttonSave" type="button" class="btn btn-primary" style="display: none;">
274
+ <button id="translator-buttonSave" type="button" class="btn btn-primary" style="display:none; min-width: 20rem">
271
275
  Auswahl speichern
272
276
  </button>
273
- <button id="translator-buttonAgreeAll" type="button" class="btn btn-primary btn-raised" style="display: none;">
277
+ <button id="translator-buttonAgreeAll" type="button" class="btn btn-primary btn-raised" style="display:none; min-width: 20rem">
274
278
  Allen zustimmen
275
279
  </button>
276
280
  </div>
@@ -278,7 +282,7 @@ exclude_from_search: true
278
282
  </div>
279
283
  </div>
280
284
  </div>
281
- {% comment %} END Modal translator dialog (de-DE)
285
+ {% comment %} END Modal Google Translator dialog (de-DE)
282
286
  -------------------------------------------------------------------------------- {% endcomment %}
283
287
 
284
288
  {% endcapture %}
@@ -109,20 +109,23 @@ j1.adapter['translator'] = (function (j1, window) {
109
109
  // ---------------------------------------------------------------------------
110
110
  // helper functions
111
111
  // ---------------------------------------------------------------------------
112
+
113
+ // ---------------------------------------------------------------------------
114
+ // setCookie()
115
+ // writes a flat cookie (not using an encoded JSON string)
116
+ // ---------------------------------------------------------------------------
112
117
  function setCookie(options /*cName, cValue, expDays*/) {
113
- var defaults = {
118
+ var defaults = {};
119
+ var settings;
120
+
121
+ defaults = {
114
122
  name: '',
115
123
  path: '/',
116
124
  expires: 0,
117
125
  domain: 'localhost'
118
126
  };
119
- var settings = $.extend(defaults, options);
127
+ settings = $.extend(defaults, options);
120
128
 
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
129
  document.cookie = settings.name + "=" + settings.data + "; path=/";
127
130
  };
128
131
 
@@ -249,17 +252,18 @@ j1.adapter['translator'] = (function (j1, window) {
249
252
  });
250
253
 
251
254
  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()}
255
+ contentURL: moduleOptions.contentURL, // dialog content (modals) for all supported languages
256
+ cookieName: moduleOptions.cookieName, // the name of the User State Cookie (primary data)
257
+ cookieConsentName: moduleOptions.cookieConsentName, // the name of the Cookie Consent Cookie (secondary data)
258
+ disableLanguageSelector: moduleOptions.disableLanguageSelector, // disable language dropdown for translation in dialog (modal)
259
+ dialogContainerID: moduleOptions.dialogContainerID, // dest container, the dialog modal is loaded (dynamically)
260
+ dialogLanguage: moduleOptions.dialogLanguage, // language for the dialog (modal)
261
+ translationLanguage: moduleOptions.translationLanguage, // default language for translation
262
+ translationLanguages: moduleOptions.google.translationLanguages,// supported languages for translation
263
+ translationEnabled: moduleOptions.translationEnabled, // run translation enabled|disabled
264
+ translatorName: moduleOptions.translatorName, // translator used for translation
265
+ xhrDataElement: moduleOptions.xhrDataElement, // container for all language-specific dialogs (modals)
266
+ postSelectionCallback: moduleOptions.google.postSelectionCallback
263
267
  });
264
268
 
265
269
  if (user_consent.analysis && user_consent.personalization && user_translate.translationEnabled) {
@@ -270,9 +274,6 @@ j1.adapter['translator'] = (function (j1, window) {
270
274
  } else {
271
275
  if (moduleOptions.translatorName === 'google') {
272
276
  j1.removeCookie({name: 'googtrans'});
273
- // j1.removeCookie({name: 'CONSENT'});
274
- // j1.removeCookie({name: 'NID'});
275
- // j1.removeCookie({name: 'OTZ'});
276
277
  }
277
278
  }
278
279
 
@@ -328,29 +329,37 @@ j1.adapter['translator'] = (function (j1, window) {
328
329
  }, // END getState
329
330
 
330
331
  // -------------------------------------------------------------------------
331
- // cb()
332
- // Called by the translator CORE module after the user has
333
- // made his selection (callback)
332
+ // cbGoogle()
333
+ // Called by the translator CORE module after the user
334
+ // has made the lanuage selection for translation (callback)
334
335
  // -------------------------------------------------------------------------
335
- cb: function () {
336
+ cbGoogle: function () {
336
337
  var cookie_names = j1.getCookieNames();
337
338
  var user_state = j1.readCookie(cookie_names.user_state);
338
339
  var user_consent = j1.readCookie(cookie_names.user_consent);
339
340
  var user_translate = j1.readCookie(cookie_names.user_translate);
341
+ var msDropdownLang = document.getElementById('dropdownJSON').msDropdown;
342
+ var msDropdown = document.getElementById('dropdownJSON').msDropdown;
340
343
  var head;
341
344
  var script;
342
345
  var srcLang;
343
346
  var destLang;
344
347
  var transCode;
345
348
  var cookie_written;
349
+ var htmlScriptElement;
350
+ var selectedTranslationLanguage;
346
351
 
347
352
  logger.info('\n' + 'entered post selection callback from google_translate');
348
353
  logger.debug('\n' + 'current values from cookie consent: ' + JSON.stringify(user_consent));
349
354
  logger.debug('\n' + 'current values from user state: ' + JSON.stringify(user_state));
350
355
 
356
+ selectedTranslationLanguage = msDropdownLang.value;
357
+ logger.info('\n' + 'selected translation language: ' + selectedTranslationLanguage);
358
+
351
359
  // update cookie consent settings
352
- user_consent.analysis = user_translate.analysis;
353
- user_consent.personalization = user_translate.personalization;
360
+ user_consent.analysis = user_translate.analysis;
361
+ user_consent.personalization = user_translate.personalization;
362
+
354
363
  cookie_written = j1.writeCookie({
355
364
  name: cookie_names.user_consent,
356
365
  data: user_consent,
@@ -359,35 +368,13 @@ j1.adapter['translator'] = (function (j1, window) {
359
368
  expires: 0
360
369
  });
361
370
 
371
+ // translation allowed
362
372
  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();
383
-
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';
373
+ head = document.getElementsByTagName('head')[0];
374
+ script = document.createElement('script');
375
+ script.id = 'google-translate';
376
+ script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
377
+ htmlScriptElement = document.getElementById(script.id);
391
378
 
392
379
  if (user_translate.translationEnabled && moduleOptions.translatorName === 'google') {
393
380
  head.appendChild(script);
@@ -396,11 +383,12 @@ j1.adapter['translator'] = (function (j1, window) {
396
383
  $('google_translate_element').hide();
397
384
  }
398
385
 
386
+ // set transCode settings
399
387
  srcLang = "{{site.language}}";
400
388
  destLang = translation_language;
401
- transCode = '/' + srcLang + '/' + destLang;
389
+ transCode = '/' + srcLang + '/' + selectedTranslationLanguage;
402
390
 
403
- // set language
391
+ // set the transCode cookie (googtrans)
404
392
  setCookie({
405
393
  name: 'googtrans',
406
394
  data: transCode
@@ -410,9 +398,9 @@ j1.adapter['translator'] = (function (j1, window) {
410
398
  if ($('#quickLinksTranslateButton').css('display') === 'none') {
411
399
  $('#quickLinksTranslateButton').css('display', 'block');
412
400
  }
401
+ } else { // translation NOT allowed
413
402
 
414
- } else {
415
-
403
+ // update cookie user translate settings
416
404
  user_translate.translationEnabled = false;
417
405
  cookie_written = j1.writeCookie({
418
406
  name: cookie_names.user_translate,
@@ -421,31 +409,20 @@ j1.adapter['translator'] = (function (j1, window) {
421
409
  secure: secure
422
410
  });
423
411
 
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
-
412
+ // stop translation for all pages
413
+ if (htmlScriptElement) { htmlScriptElement.remove(); }
431
414
  j1.removeCookie({name: 'googtrans'});
432
- // j1.removeCookie({name: '1P_JAR'});
433
- // j1.removeCookie({name: 'CONSENT'});
434
- // j1.removeCookie({name: 'NID'});
435
415
  }
436
-
437
416
  }
438
417
 
418
+ // translation NOT allowed
439
419
  if (!user_translate.analysis || !user_translate.personalization) {
440
420
  head = document.getElementsByTagName('head')[0];
441
421
  script = document.createElement('script');
442
422
  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
423
 
447
424
  // update cookie consent settings
448
- user_consent.analysis = user_translate.analysis;
425
+ user_consent.analysis = user_translate.analysis;
449
426
  user_consent.personalization = user_translate.personalization;
450
427
  cookie_written = j1.writeCookie({
451
428
  name: cookie_names.user_consent,
@@ -455,6 +432,7 @@ j1.adapter['translator'] = (function (j1, window) {
455
432
  expires: 0
456
433
  });
457
434
 
435
+ // update cookie user translate settings
458
436
  user_translate.translationEnabled = false;
459
437
  cookie_written = j1.writeCookie({
460
438
  name: cookie_names.user_translate,
@@ -464,11 +442,8 @@ j1.adapter['translator'] = (function (j1, window) {
464
442
  expires: 0
465
443
  });
466
444
 
467
- if (el) { el.remove(); }
468
-
469
- el = document.getElementById('google_translate_element');
470
- if (el) { el.remove(); }
471
-
445
+ // stop translation for all pages
446
+ if (htmlScriptElement) { htmlScriptElement.remove(); }
472
447
  j1.removeCookie({name: 'googtrans'});
473
448
  }
474
449
 
@@ -482,7 +457,18 @@ j1.adapter['translator'] = (function (j1, window) {
482
457
  $('#quickLinksTranslateButton').css('display', 'none');
483
458
  }
484
459
 
485
- } // END cbCookie
460
+ }, // END cbGoogle
461
+
462
+ // -------------------------------------------------------------------------
463
+ // cbDeepl()
464
+ // Called by the translator CORE module after the user
465
+ // has made the lanuage selection for translation (callback)
466
+ // -------------------------------------------------------------------------
467
+ cbDeepl: function () {
468
+
469
+ // code for post procession on Deepl translations
470
+
471
+ } // END cbDeepl
486
472
 
487
473
  }; // END return
488
474
  })(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; }