瀏覽代碼

Fixes #404 Update to Bootstrap 4.6.0

Vince Salvino 4 年之前
父節點
當前提交
fc7dfd8991
共有 65 個文件被更改,包括 1258 次插入1088 次删除
  1. 2 2
      coderedcms/static/coderedcms/vendor/bootstrap/LICENSE
  2. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/README.txt
  3. 3 5
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.css
  4. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.css.map
  5. 3 3
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.min.css
  6. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.min.css.map
  7. 7 7
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.css
  8. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.css.map
  9. 3 3
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.min.css
  10. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.min.css.map
  11. 89 52
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.css
  12. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.css.map
  13. 3 3
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.min.css
  14. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.min.css.map
  15. 184 166
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.js
  16. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.js.map
  17. 2 2
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.min.js
  18. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.min.js.map
  19. 187 169
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.js
  20. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.js.map
  21. 2 2
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.min.js
  22. 0 0
      coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.min.js.map
  23. 16 16
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/alert.js
  24. 34 31
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/button.js
  25. 124 109
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/carousel.js
  26. 37 36
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/collapse.js
  27. 72 68
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/dropdown.js
  28. 102 100
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/modal.js
  29. 26 24
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/popover.js
  30. 62 58
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/scrollspy.js
  31. 25 24
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/tab.js
  32. 26 26
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/toast.js
  33. 3 3
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/tools/sanitizer.js
  34. 105 99
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/tooltip.js
  35. 7 7
      coderedcms/static/coderedcms/vendor/bootstrap/js/src/util.js
  36. 1 0
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_alert.scss
  37. 1 3
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_breadcrumb.scss
  38. 4 4
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_card.scss
  39. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_carousel.scss
  40. 9 6
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_custom-forms.scss
  41. 2 2
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_dropdown.scss
  42. 3 0
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_functions.scss
  43. 20 4
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_input-group.scss
  44. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_list-group.scss
  45. 1 4
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_nav.scss
  46. 10 2
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_navbar.scss
  47. 2 2
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_pagination.scss
  48. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_progress.scss
  49. 16 12
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_reboot.scss
  50. 0 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_root.scss
  51. 13 4
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_spinners.scss
  52. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_type.scss
  53. 10 4
      coderedcms/static/coderedcms/vendor/bootstrap/scss/_variables.scss
  54. 4 3
      coderedcms/static/coderedcms/vendor/bootstrap/scss/bootstrap-grid.scss
  55. 3 3
      coderedcms/static/coderedcms/vendor/bootstrap/scss/bootstrap-reboot.scss
  56. 3 3
      coderedcms/static/coderedcms/vendor/bootstrap/scss/bootstrap.scss
  57. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_border-radius.scss
  58. 8 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_forms.scss
  59. 11 2
      coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_grid.scss
  60. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_image.scss
  61. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_screen-reader.scss
  62. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_transition.scss
  63. 1 1
      coderedcms/static/coderedcms/vendor/bootstrap/scss/utilities/_borders.scss
  64. 2 2
      coderedcms/static/coderedcms/vendor/bootstrap/scss/utilities/_text.scss
  65. 1 1
      coderedcms/templates/coderedcms/pages/base.html

+ 2 - 2
coderedcms/static/coderedcms/vendor/bootstrap/LICENSE

@@ -1,7 +1,7 @@
 The MIT License (MIT)
 
-Copyright (c) 2011-2020 Twitter, Inc.
-Copyright (c) 2011-2020 The Bootstrap Authors
+Copyright (c) 2011-2021 Twitter, Inc.
+Copyright (c) 2011-2021 The Bootstrap Authors
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/README.txt

@@ -1,2 +1,2 @@
-Minimal redistribution of Bootstrap 4.5.1 for CodeRed CMS.
+Minimal redistribution of Bootstrap 4.6.0 for CodeRed CMS.
 Full source and documentation available at: https://getbootstrap.com/.

+ 3 - 5
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.css

@@ -1,7 +1,7 @@
 /*!
- * Bootstrap Grid v4.5.1 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap Grid v4.6.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
 html {
@@ -55,8 +55,6 @@ html {
 .row {
   display: -ms-flexbox;
   display: flex;
-  -ms-flex: 1 0 100%;
-  flex: 1 0 100%;
   -ms-flex-wrap: wrap;
   flex-wrap: wrap;
   margin-right: -15px;

文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.css.map


文件差異過大導致無法顯示
+ 3 - 3
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.min.css


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-grid.min.css.map


+ 7 - 7
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.css

@@ -1,7 +1,7 @@
 /*!
- * Bootstrap Reboot v4.5.1 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
  */
@@ -24,7 +24,7 @@ article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
 
 body {
   margin: 0;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
   font-size: 1rem;
   font-weight: 400;
   line-height: 1.5;
@@ -186,6 +186,7 @@ caption {
 
 th {
   text-align: inherit;
+  text-align: -webkit-match-parent;
 }
 
 label {
@@ -197,9 +198,8 @@ button {
   border-radius: 0;
 }
 
-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
+button:focus:not(:focus-visible) {
+  outline: 0;
 }
 
 input,

文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.css.map


文件差異過大導致無法顯示
+ 3 - 3
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.min.css


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap-reboot.min.css.map


+ 89 - 52
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.css

@@ -1,7 +1,7 @@
 /*!
- * Bootstrap v4.5.1 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap v4.6.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
 :root {
@@ -31,7 +31,7 @@
   --breakpoint-md: 768px;
   --breakpoint-lg: 992px;
   --breakpoint-xl: 1200px;
-  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
   --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
 }
 
@@ -54,7 +54,7 @@ article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
 
 body {
   margin: 0;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
   font-size: 1rem;
   font-weight: 400;
   line-height: 1.5;
@@ -216,6 +216,7 @@ caption {
 
 th {
   text-align: inherit;
+  text-align: -webkit-match-parent;
 }
 
 label {
@@ -227,9 +228,8 @@ button {
   border-radius: 0;
 }
 
-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
+button:focus:not(:focus-visible) {
+  outline: 0;
 }
 
 input,
@@ -579,8 +579,6 @@ pre code {
 .row {
   display: -ms-flexbox;
   display: flex;
-  -ms-flex: 1 0 100%;
-  flex: 1 0 100%;
   -ms-flex-wrap: wrap;
   flex-wrap: wrap;
   margin-right: -15px;
@@ -2242,6 +2240,11 @@ textarea.form-control {
   border-radius: 0.25rem;
 }
 
+.form-row > .col > .valid-tooltip,
+.form-row > [class*="col-"] > .valid-tooltip {
+  left: 5px;
+}
+
 .was-validated :valid ~ .valid-feedback,
 .was-validated :valid ~ .valid-tooltip,
 .is-valid ~ .valid-feedback,
@@ -2271,7 +2274,7 @@ textarea.form-control {
 .was-validated .custom-select:valid, .custom-select.is-valid {
   border-color: #28a745;
   padding-right: calc(0.75em + 2.3125rem);
-  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") no-repeat right 0.75rem center/8px 10px, 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") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+  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;
 }
 
 .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
@@ -2343,6 +2346,11 @@ textarea.form-control {
   border-radius: 0.25rem;
 }
 
+.form-row > .col > .invalid-tooltip,
+.form-row > [class*="col-"] > .invalid-tooltip {
+  left: 5px;
+}
+
 .was-validated :invalid ~ .invalid-feedback,
 .was-validated :invalid ~ .invalid-tooltip,
 .is-invalid ~ .invalid-feedback,
@@ -2372,7 +2380,7 @@ textarea.form-control {
 .was-validated .custom-select:invalid, .custom-select.is-invalid {
   border-color: #dc3545;
   padding-right: calc(0.75em + 2.3125rem);
-  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") no-repeat right 0.75rem center/8px 10px, 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") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+  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;
 }
 
 .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
@@ -3389,7 +3397,7 @@ input[type="button"].btn-block {
 .dropdown-item:hover, .dropdown-item:focus {
   color: #16181b;
   text-decoration: none;
-  background-color: #f8f9fa;
+  background-color: #e9ecef;
 }
 
 .dropdown-item.active, .dropdown-item:active {
@@ -3399,7 +3407,7 @@ input[type="button"].btn-block {
 }
 
 .dropdown-item.disabled, .dropdown-item:disabled {
-  color: #6c757d;
+  color: #adb5bd;
   pointer-events: none;
   background-color: transparent;
 }
@@ -3598,12 +3606,6 @@ input[type="button"].btn-block {
   z-index: 4;
 }
 
-.input-group > .form-control:not(:last-child),
-.input-group > .custom-select:not(:last-child) {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-
 .input-group > .form-control:not(:first-child),
 .input-group > .custom-select:not(:first-child) {
   border-top-left-radius: 0;
@@ -3618,14 +3620,23 @@ input[type="button"].btn-block {
 }
 
 .input-group > .custom-file:not(:last-child) .custom-file-label,
-.input-group > .custom-file:not(:last-child) .custom-file-label::after {
+.input-group > .custom-file:not(:first-child) .custom-file-label {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.input-group:not(.has-validation) > .form-control:not(:last-child),
+.input-group:not(.has-validation) > .custom-select:not(:last-child),
+.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after {
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
 }
 
-.input-group > .custom-file:not(:first-child) .custom-file-label {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
+.input-group.has-validation > .form-control:nth-last-child(n + 3),
+.input-group.has-validation > .custom-select:nth-last-child(n + 3),
+.input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label::after {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
 }
 
 .input-group-prepend,
@@ -3728,8 +3739,10 @@ input[type="button"].btn-block {
 
 .input-group > .input-group-prepend > .btn,
 .input-group > .input-group-prepend > .input-group-text,
-.input-group > .input-group-append:not(:last-child) > .btn,
-.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,
+.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,
+.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn,
+.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text,
 .input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
 .input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
   border-top-right-radius: 0;
@@ -3752,6 +3765,8 @@ input[type="button"].btn-block {
   display: block;
   min-height: 1.5rem;
   padding-left: 1.5rem;
+  -webkit-print-color-adjust: exact;
+  color-adjust: exact;
 }
 
 .custom-control-inline {
@@ -3824,7 +3839,7 @@ input[type="button"].btn-block {
   width: 1rem;
   height: 1rem;
   content: "";
-  background: no-repeat 50% / 50% 50%;
+  background: 50% / 50% 50% no-repeat;
 }
 
 .custom-checkbox .custom-control-label::before {
@@ -3913,7 +3928,7 @@ input[type="button"].btn-block {
   line-height: 1.5;
   color: #495057;
   vertical-align: middle;
-  background: #fff 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") no-repeat right 0.75rem center/8px 10px;
+  background: #fff 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;
   border: 1px solid #ced4da;
   border-radius: 0.25rem;
   -webkit-appearance: none;
@@ -3982,6 +3997,7 @@ input[type="button"].btn-block {
   width: 100%;
   height: calc(1.5em + 0.75rem + 2px);
   margin: 0;
+  overflow: hidden;
   opacity: 0;
 }
 
@@ -4011,6 +4027,7 @@ input[type="button"].btn-block {
   z-index: 1;
   height: calc(1.5em + 0.75rem + 2px);
   padding: 0.375rem 0.75rem;
+  overflow: hidden;
   font-weight: 400;
   line-height: 1.5;
   color: #495057;
@@ -4047,7 +4064,7 @@ input[type="button"].btn-block {
 }
 
 .custom-range:focus {
-  outline: none;
+  outline: 0;
 }
 
 .custom-range:focus::-webkit-slider-thumb {
@@ -4242,11 +4259,8 @@ input[type="button"].btn-block {
   border-bottom: 1px solid #dee2e6;
 }
 
-.nav-tabs .nav-item {
-  margin-bottom: -1px;
-}
-
 .nav-tabs .nav-link {
+  margin-bottom: -1px;
   border: 1px solid transparent;
   border-top-left-radius: 0.25rem;
   border-top-right-radius: 0.25rem;
@@ -4402,8 +4416,12 @@ input[type="button"].btn-block {
   height: 1.5em;
   vertical-align: middle;
   content: "";
-  background: no-repeat center center;
-  background-size: 100% 100%;
+  background: 50% / 100% 100% no-repeat;
+}
+
+.navbar-nav-scroll {
+  max-height: 75vh;
+  overflow-y: auto;
 }
 
 @media (max-width: 575.98px) {
@@ -4437,6 +4455,9 @@ input[type="button"].btn-block {
     -ms-flex-wrap: nowrap;
     flex-wrap: nowrap;
   }
+  .navbar-expand-sm .navbar-nav-scroll {
+    overflow: visible;
+  }
   .navbar-expand-sm .navbar-collapse {
     display: -ms-flexbox !important;
     display: flex !important;
@@ -4479,6 +4500,9 @@ input[type="button"].btn-block {
     -ms-flex-wrap: nowrap;
     flex-wrap: nowrap;
   }
+  .navbar-expand-md .navbar-nav-scroll {
+    overflow: visible;
+  }
   .navbar-expand-md .navbar-collapse {
     display: -ms-flexbox !important;
     display: flex !important;
@@ -4521,6 +4545,9 @@ input[type="button"].btn-block {
     -ms-flex-wrap: nowrap;
     flex-wrap: nowrap;
   }
+  .navbar-expand-lg .navbar-nav-scroll {
+    overflow: visible;
+  }
   .navbar-expand-lg .navbar-collapse {
     display: -ms-flexbox !important;
     display: flex !important;
@@ -4563,6 +4590,9 @@ input[type="button"].btn-block {
     -ms-flex-wrap: nowrap;
     flex-wrap: nowrap;
   }
+  .navbar-expand-xl .navbar-nav-scroll {
+    overflow: visible;
+  }
   .navbar-expand-xl .navbar-collapse {
     display: -ms-flexbox !important;
     display: flex !important;
@@ -4607,6 +4637,10 @@ input[type="button"].btn-block {
   flex-wrap: nowrap;
 }
 
+.navbar-expand .navbar-nav-scroll {
+  overflow: visible;
+}
+
 .navbar-expand .navbar-collapse {
   display: -ms-flexbox !important;
   display: flex !important;
@@ -4971,17 +5005,12 @@ input[type="button"].btn-block {
   border-radius: 0.25rem;
 }
 
-.breadcrumb-item {
-  display: -ms-flexbox;
-  display: flex;
-}
-
 .breadcrumb-item + .breadcrumb-item {
   padding-left: 0.5rem;
 }
 
 .breadcrumb-item + .breadcrumb-item::before {
-  display: inline-block;
+  float: left;
   padding-right: 0.5rem;
   color: #6c757d;
   content: "/";
@@ -5291,6 +5320,7 @@ a.badge-dark:focus, a.badge-dark.focus {
   position: absolute;
   top: 0;
   right: 0;
+  z-index: 2;
   padding: 0.75rem 1.25rem;
   color: inherit;
 }
@@ -5463,8 +5493,8 @@ a.badge-dark:focus, a.badge-dark.focus {
 }
 
 .progress-bar-animated {
-  -webkit-animation: progress-bar-stripes 1s linear infinite;
-  animation: progress-bar-stripes 1s linear infinite;
+  -webkit-animation: 1s linear infinite progress-bar-stripes;
+  animation: 1s linear infinite progress-bar-stripes;
 }
 
 @media (prefers-reduced-motion: reduce) {
@@ -6143,7 +6173,7 @@ a.close.disabled {
   z-index: 1070;
   display: block;
   margin: 0;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
   font-style: normal;
   font-weight: 400;
   line-height: 1.5;
@@ -6256,7 +6286,7 @@ a.close.disabled {
   z-index: 1060;
   display: block;
   max-width: 276px;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
   font-style: normal;
   font-weight: 400;
   line-height: 1.5;
@@ -6544,7 +6574,7 @@ a.close.disabled {
   display: inline-block;
   width: 20px;
   height: 20px;
-  background: no-repeat 50% / 100% 100%;
+  background: 50% / 100% 100% no-repeat;
 }
 
 .carousel-control-prev-icon {
@@ -6633,8 +6663,8 @@ a.close.disabled {
   border: 0.25em solid currentColor;
   border-right-color: transparent;
   border-radius: 50%;
-  -webkit-animation: spinner-border .75s linear infinite;
-  animation: spinner-border .75s linear infinite;
+  -webkit-animation: .75s linear infinite spinner-border;
+  animation: .75s linear infinite spinner-border;
 }
 
 .spinner-border-sm {
@@ -6675,8 +6705,8 @@ a.close.disabled {
   background-color: currentColor;
   border-radius: 50%;
   opacity: 0;
-  -webkit-animation: spinner-grow .75s linear infinite;
-  animation: spinner-grow .75s linear infinite;
+  -webkit-animation: .75s linear infinite spinner-grow;
+  animation: .75s linear infinite spinner-grow;
 }
 
 .spinner-grow-sm {
@@ -6684,6 +6714,14 @@ a.close.disabled {
   height: 1rem;
 }
 
+@media (prefers-reduced-motion: reduce) {
+  .spinner-border,
+  .spinner-grow {
+    -webkit-animation-duration: 1.5s;
+    animation-duration: 1.5s;
+  }
+}
+
 .align-baseline {
   vertical-align: baseline !important;
 }
@@ -7952,7 +7990,6 @@ button.bg-dark:focus {
 .user-select-all {
   -webkit-user-select: all !important;
   -moz-user-select: all !important;
-  -ms-user-select: all !important;
   user-select: all !important;
 }
 
@@ -10165,7 +10202,7 @@ a.text-dark:hover, a.text-dark:focus {
 
 .text-break {
   word-break: break-word !important;
-  overflow-wrap: break-word !important;
+  word-wrap: break-word !important;
 }
 
 .text-reset {

文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.css.map


文件差異過大導致無法顯示
+ 3 - 3
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.min.css


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/css/bootstrap.min.css.map


文件差異過大導致無法顯示
+ 184 - 166
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.js


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.js.map


文件差異過大導致無法顯示
+ 2 - 2
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.min.js


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.bundle.min.js.map


文件差異過大導致無法顯示
+ 187 - 169
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.js


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.js.map


文件差異過大導致無法顯示
+ 2 - 2
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.min.js


文件差異過大導致無法顯示
+ 0 - 0
coderedcms/static/coderedcms/vendor/bootstrap/dist/js/bootstrap.min.js.map


+ 16 - 16
coderedcms/static/coderedcms/vendor/bootstrap/js/src/alert.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): alert.js
+ * Bootstrap (v4.6.0): alert.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,22 +14,22 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME                = 'alert'
-const VERSION             = '4.5.1'
-const DATA_KEY            = 'bs.alert'
-const EVENT_KEY           = `.${DATA_KEY}`
-const DATA_API_KEY        = '.data-api'
-const JQUERY_NO_CONFLICT  = $.fn[NAME]
+const NAME = 'alert'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.alert'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
+const JQUERY_NO_CONFLICT = $.fn[NAME]
 
 const SELECTOR_DISMISS = '[data-dismiss="alert"]'
 
-const EVENT_CLOSE          = `close${EVENT_KEY}`
-const EVENT_CLOSED         = `closed${EVENT_KEY}`
+const EVENT_CLOSE = `close${EVENT_KEY}`
+const EVENT_CLOSED = `closed${EVENT_KEY}`
 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 
 const CLASS_NAME_ALERT = 'alert'
-const CLASS_NAME_FADE  = 'fade'
-const CLASS_NAME_SHOW  = 'show'
+const CLASS_NAME_FADE = 'fade'
+const CLASS_NAME_SHOW = 'show'
 
 /**
  * ------------------------------------------------------------------------
@@ -74,7 +74,7 @@ class Alert {
 
   _getRootElement(element) {
     const selector = Util.getSelectorFromElement(element)
-    let parent     = false
+    let parent = false
 
     if (selector) {
       parent = document.querySelector(selector)
@@ -105,7 +105,7 @@ class Alert {
     const transitionDuration = Util.getTransitionDurationFromElement(element)
 
     $(element)
-      .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
+      .one(Util.TRANSITION_END, event => this._destroyElement(element, event))
       .emulateTransitionEnd(transitionDuration)
   }
 
@@ -121,7 +121,7 @@ class Alert {
   static _jQueryInterface(config) {
     return this.each(function () {
       const $element = $(this)
-      let data       = $element.data(DATA_KEY)
+      let data = $element.data(DATA_KEY)
 
       if (!data) {
         data = new Alert(this)
@@ -163,9 +163,9 @@ $(document).on(
  * ------------------------------------------------------------------------
  */
 
-$.fn[NAME]             = Alert._jQueryInterface
+$.fn[NAME] = Alert._jQueryInterface
 $.fn[NAME].Constructor = Alert
-$.fn[NAME].noConflict  = () => {
+$.fn[NAME].noConflict = () => {
   $.fn[NAME] = JQUERY_NO_CONFLICT
   return Alert._jQueryInterface
 }

+ 34 - 31
coderedcms/static/coderedcms/vendor/bootstrap/js/src/button.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): button.js
+ * Bootstrap (v4.6.0): button.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -13,29 +13,29 @@ import $ from 'jquery'
  * ------------------------------------------------------------------------
  */
 
-const NAME                = 'button'
-const VERSION             = '4.5.1'
-const DATA_KEY            = 'bs.button'
-const EVENT_KEY           = `.${DATA_KEY}`
-const DATA_API_KEY        = '.data-api'
-const JQUERY_NO_CONFLICT  = $.fn[NAME]
+const NAME = 'button'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.button'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
+const JQUERY_NO_CONFLICT = $.fn[NAME]
 
 const CLASS_NAME_ACTIVE = 'active'
 const CLASS_NAME_BUTTON = 'btn'
-const CLASS_NAME_FOCUS  = 'focus'
+const CLASS_NAME_FOCUS = 'focus'
 
-const SELECTOR_DATA_TOGGLE_CARROT   = '[data-toggle^="button"]'
-const SELECTOR_DATA_TOGGLES         = '[data-toggle="buttons"]'
-const SELECTOR_DATA_TOGGLE          = '[data-toggle="button"]'
+const SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'
+const SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'
+const SELECTOR_DATA_TOGGLE = '[data-toggle="button"]'
 const SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'
-const SELECTOR_INPUT                = 'input:not([type="hidden"])'
-const SELECTOR_ACTIVE               = '.active'
-const SELECTOR_BUTTON               = '.btn'
+const SELECTOR_INPUT = 'input:not([type="hidden"])'
+const SELECTOR_ACTIVE = '.active'
+const SELECTOR_BUTTON = '.btn'
 
-const EVENT_CLICK_DATA_API      = `click${EVENT_KEY}${DATA_API_KEY}`
+const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 const EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +
                           `blur${EVENT_KEY}${DATA_API_KEY}`
-const EVENT_LOAD_DATA_API       = `load${EVENT_KEY}${DATA_API_KEY}`
+const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
 
 /**
  * ------------------------------------------------------------------------
@@ -46,6 +46,7 @@ const EVENT_LOAD_DATA_API       = `load${EVENT_KEY}${DATA_API_KEY}`
 class Button {
   constructor(element) {
     this._element = element
+    this.shouldAvoidTriggerChange = false
   }
 
   // Getters
@@ -59,17 +60,14 @@ class Button {
   toggle() {
     let triggerChangeEvent = true
     let addAriaPressed = true
-    const rootElement = $(this._element).closest(
-      SELECTOR_DATA_TOGGLES
-    )[0]
+    const rootElement = $(this._element).closest(SELECTOR_DATA_TOGGLES)[0]
 
     if (rootElement) {
       const input = this._element.querySelector(SELECTOR_INPUT)
 
       if (input) {
         if (input.type === 'radio') {
-          if (input.checked &&
-            this._element.classList.contains(CLASS_NAME_ACTIVE)) {
+          if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
             triggerChangeEvent = false
           } else {
             const activeElement = rootElement.querySelector(SELECTOR_ACTIVE)
@@ -85,7 +83,10 @@ class Button {
           if (input.type === 'checkbox' || input.type === 'radio') {
             input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)
           }
-          $(input).trigger('change')
+
+          if (!this.shouldAvoidTriggerChange) {
+            $(input).trigger('change')
+          }
         }
 
         input.focus()
@@ -95,8 +96,7 @@ class Button {
 
     if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
       if (addAriaPressed) {
-        this._element.setAttribute('aria-pressed',
-          !this._element.classList.contains(CLASS_NAME_ACTIVE))
+        this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE))
       }
 
       if (triggerChangeEvent) {
@@ -112,15 +112,18 @@ class Button {
 
   // Static
 
-  static _jQueryInterface(config) {
+  static _jQueryInterface(config, avoidTriggerChange) {
     return this.each(function () {
-      let data = $(this).data(DATA_KEY)
+      const $element = $(this)
+      let data = $element.data(DATA_KEY)
 
       if (!data) {
         data = new Button(this)
-        $(this).data(DATA_KEY, data)
+        $element.data(DATA_KEY, data)
       }
 
+      data.shouldAvoidTriggerChange = avoidTriggerChange
+
       if (config === 'toggle') {
         data[config]()
       }
@@ -135,7 +138,7 @@ class Button {
  */
 
 $(document)
-  .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, (event) => {
+  .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {
     let button = event.target
     const initialButton = button
 
@@ -153,12 +156,12 @@ $(document)
         return
       }
 
-      if (initialButton.tagName !== 'LABEL' || inputBtn && inputBtn.type !== 'checkbox') {
-        Button._jQueryInterface.call($(button), 'toggle')
+      if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {
+        Button._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT')
       }
     }
   })
-  .on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, (event) => {
+  .on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {
     const button = $(event.target).closest(SELECTOR_BUTTON)[0]
     $(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))
   })

+ 124 - 109
coderedcms/static/coderedcms/vendor/bootstrap/js/src/carousel.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): carousel.js
+ * Bootstrap (v4.6.0): carousel.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,75 +14,75 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME                   = 'carousel'
-const VERSION                = '4.5.1'
-const DATA_KEY               = 'bs.carousel'
-const EVENT_KEY              = `.${DATA_KEY}`
-const DATA_API_KEY           = '.data-api'
-const JQUERY_NO_CONFLICT     = $.fn[NAME]
-const ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key
-const ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key
+const NAME = 'carousel'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.carousel'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
+const JQUERY_NO_CONFLICT = $.fn[NAME]
+const ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key
+const ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key
 const TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch
-const SWIPE_THRESHOLD        = 40
+const SWIPE_THRESHOLD = 40
 
 const Default = {
-  interval : 5000,
-  keyboard : true,
-  slide    : false,
-  pause    : 'hover',
-  wrap     : true,
-  touch    : true
+  interval: 5000,
+  keyboard: true,
+  slide: false,
+  pause: 'hover',
+  wrap: true,
+  touch: true
 }
 
 const DefaultType = {
-  interval : '(number|boolean)',
-  keyboard : 'boolean',
-  slide    : '(boolean|string)',
-  pause    : '(string|boolean)',
-  wrap     : 'boolean',
-  touch    : 'boolean'
+  interval: '(number|boolean)',
+  keyboard: 'boolean',
+  slide: '(boolean|string)',
+  pause: '(string|boolean)',
+  wrap: 'boolean',
+  touch: 'boolean'
 }
 
-const DIRECTION_NEXT     = 'next'
-const DIRECTION_PREV     = 'prev'
-const DIRECTION_LEFT     = 'left'
-const DIRECTION_RIGHT    = 'right'
-
-const EVENT_SLIDE          = `slide${EVENT_KEY}`
-const EVENT_SLID           = `slid${EVENT_KEY}`
-const EVENT_KEYDOWN        = `keydown${EVENT_KEY}`
-const EVENT_MOUSEENTER     = `mouseenter${EVENT_KEY}`
-const EVENT_MOUSELEAVE     = `mouseleave${EVENT_KEY}`
-const EVENT_TOUCHSTART     = `touchstart${EVENT_KEY}`
-const EVENT_TOUCHMOVE      = `touchmove${EVENT_KEY}`
-const EVENT_TOUCHEND       = `touchend${EVENT_KEY}`
-const EVENT_POINTERDOWN    = `pointerdown${EVENT_KEY}`
-const EVENT_POINTERUP      = `pointerup${EVENT_KEY}`
-const EVENT_DRAG_START     = `dragstart${EVENT_KEY}`
-const EVENT_LOAD_DATA_API  = `load${EVENT_KEY}${DATA_API_KEY}`
+const DIRECTION_NEXT = 'next'
+const DIRECTION_PREV = 'prev'
+const DIRECTION_LEFT = 'left'
+const DIRECTION_RIGHT = 'right'
+
+const EVENT_SLIDE = `slide${EVENT_KEY}`
+const EVENT_SLID = `slid${EVENT_KEY}`
+const EVENT_KEYDOWN = `keydown${EVENT_KEY}`
+const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`
+const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`
+const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`
+const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`
+const EVENT_TOUCHEND = `touchend${EVENT_KEY}`
+const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`
+const EVENT_POINTERUP = `pointerup${EVENT_KEY}`
+const EVENT_DRAG_START = `dragstart${EVENT_KEY}`
+const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 
-const CLASS_NAME_CAROUSEL      = 'carousel'
-const CLASS_NAME_ACTIVE        = 'active'
-const CLASS_NAME_SLIDE         = 'slide'
-const CLASS_NAME_RIGHT         = 'carousel-item-right'
-const CLASS_NAME_LEFT          = 'carousel-item-left'
-const CLASS_NAME_NEXT          = 'carousel-item-next'
-const CLASS_NAME_PREV          = 'carousel-item-prev'
+const CLASS_NAME_CAROUSEL = 'carousel'
+const CLASS_NAME_ACTIVE = 'active'
+const CLASS_NAME_SLIDE = 'slide'
+const CLASS_NAME_RIGHT = 'carousel-item-right'
+const CLASS_NAME_LEFT = 'carousel-item-left'
+const CLASS_NAME_NEXT = 'carousel-item-next'
+const CLASS_NAME_PREV = 'carousel-item-prev'
 const CLASS_NAME_POINTER_EVENT = 'pointer-event'
 
-const SELECTOR_ACTIVE      = '.active'
+const SELECTOR_ACTIVE = '.active'
 const SELECTOR_ACTIVE_ITEM = '.active.carousel-item'
-const SELECTOR_ITEM        = '.carousel-item'
-const SELECTOR_ITEM_IMG    = '.carousel-item img'
-const SELECTOR_NEXT_PREV   = '.carousel-item-next, .carousel-item-prev'
-const SELECTOR_INDICATORS  = '.carousel-indicators'
-const SELECTOR_DATA_SLIDE  = '[data-slide], [data-slide-to]'
-const SELECTOR_DATA_RIDE   = '[data-ride="carousel"]'
+const SELECTOR_ITEM = '.carousel-item'
+const SELECTOR_ITEM_IMG = '.carousel-item img'
+const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'
+const SELECTOR_INDICATORS = '.carousel-indicators'
+const SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'
+const SELECTOR_DATA_RIDE = '[data-ride="carousel"]'
 
 const PointerType = {
-  TOUCH : 'touch',
-  PEN   : 'pen'
+  TOUCH: 'touch',
+  PEN: 'pen'
 }
 
 /**
@@ -92,20 +92,20 @@ const PointerType = {
  */
 class Carousel {
   constructor(element, config) {
-    this._items         = null
-    this._interval      = null
+    this._items = null
+    this._interval = null
     this._activeElement = null
-    this._isPaused      = false
-    this._isSliding     = false
-    this.touchTimeout   = null
-    this.touchStartX    = 0
-    this.touchDeltaX    = 0
-
-    this._config            = this._getConfig(config)
-    this._element           = element
+    this._isPaused = false
+    this._isSliding = false
+    this.touchTimeout = null
+    this.touchStartX = 0
+    this.touchDeltaX = 0
+
+    this._config = this._getConfig(config)
+    this._element = element
     this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)
-    this._touchSupported    = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0
-    this._pointerEvent      = Boolean(window.PointerEvent || window.MSPointerEvent)
+    this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0
+    this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)
 
     this._addEventListeners()
   }
@@ -129,10 +129,11 @@ class Carousel {
   }
 
   nextWhenVisible() {
+    const $element = $(this._element)
     // Don't call next when the page isn't visible
     // or the carousel or its parent isn't visible
     if (!document.hidden &&
-      ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {
+      ($element.is(':visible') && $element.css('visibility') !== 'hidden')) {
       this.next()
     }
   }
@@ -168,6 +169,8 @@ class Carousel {
     }
 
     if (this._config.interval && !this._isPaused) {
+      this._updateInterval()
+
       this._interval = setInterval(
         (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),
         this._config.interval
@@ -195,9 +198,9 @@ class Carousel {
       return
     }
 
-    const direction = index > activeIndex
-      ? DIRECTION_NEXT
-      : DIRECTION_PREV
+    const direction = index > activeIndex ?
+      DIRECTION_NEXT :
+      DIRECTION_PREV
 
     this._slide(direction, this._items[index])
   }
@@ -206,13 +209,13 @@ class Carousel {
     $(this._element).off(EVENT_KEY)
     $.removeData(this._element, DATA_KEY)
 
-    this._items             = null
-    this._config            = null
-    this._element           = null
-    this._interval          = null
-    this._isPaused          = null
-    this._isSliding         = null
-    this._activeElement     = null
+    this._items = null
+    this._config = null
+    this._element = null
+    this._interval = null
+    this._isPaused = null
+    this._isSliding = null
+    this._activeElement = null
     this._indicatorsElement = null
   }
 
@@ -251,13 +254,13 @@ class Carousel {
 
   _addEventListeners() {
     if (this._config.keyboard) {
-      $(this._element).on(EVENT_KEYDOWN, (event) => this._keydown(event))
+      $(this._element).on(EVENT_KEYDOWN, event => this._keydown(event))
     }
 
     if (this._config.pause === 'hover') {
       $(this._element)
-        .on(EVENT_MOUSEENTER, (event) => this.pause(event))
-        .on(EVENT_MOUSELEAVE, (event) => this.cycle(event))
+        .on(EVENT_MOUSEENTER, event => this.pause(event))
+        .on(EVENT_MOUSELEAVE, event => this.cycle(event))
     }
 
     if (this._config.touch) {
@@ -270,7 +273,7 @@ class Carousel {
       return
     }
 
-    const start = (event) => {
+    const start = event => {
       if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
         this.touchStartX = event.originalEvent.clientX
       } else if (!this._pointerEvent) {
@@ -278,7 +281,7 @@ class Carousel {
       }
     }
 
-    const move = (event) => {
+    const move = event => {
       // ensure swiping with one touch and not pinching
       if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
         this.touchDeltaX = 0
@@ -287,7 +290,7 @@ class Carousel {
       }
     }
 
-    const end = (event) => {
+    const end = event => {
       if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
         this.touchDeltaX = event.originalEvent.clientX - this.touchStartX
       }
@@ -306,22 +309,23 @@ class Carousel {
         if (this.touchTimeout) {
           clearTimeout(this.touchTimeout)
         }
-        this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
+
+        this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
       }
     }
 
     $(this._element.querySelectorAll(SELECTOR_ITEM_IMG))
-      .on(EVENT_DRAG_START, (e) => e.preventDefault())
+      .on(EVENT_DRAG_START, e => e.preventDefault())
 
     if (this._pointerEvent) {
-      $(this._element).on(EVENT_POINTERDOWN, (event) => start(event))
-      $(this._element).on(EVENT_POINTERUP, (event) => end(event))
+      $(this._element).on(EVENT_POINTERDOWN, event => start(event))
+      $(this._element).on(EVENT_POINTERUP, event => end(event))
 
       this._element.classList.add(CLASS_NAME_POINTER_EVENT)
     } else {
-      $(this._element).on(EVENT_TOUCHSTART, (event) => start(event))
-      $(this._element).on(EVENT_TOUCHMOVE, (event) => move(event))
-      $(this._element).on(EVENT_TOUCHEND, (event) => end(event))
+      $(this._element).on(EVENT_TOUCHSTART, event => start(event))
+      $(this._element).on(EVENT_TOUCHMOVE, event => move(event))
+      $(this._element).on(EVENT_TOUCHEND, event => end(event))
     }
   }
 
@@ -344,29 +348,29 @@ class Carousel {
   }
 
   _getItemIndex(element) {
-    this._items = element && element.parentNode
-      ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM))
-      : []
+    this._items = element && element.parentNode ?
+      [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :
+      []
     return this._items.indexOf(element)
   }
 
   _getItemByDirection(direction, activeElement) {
     const isNextDirection = direction === DIRECTION_NEXT
     const isPrevDirection = direction === DIRECTION_PREV
-    const activeIndex     = this._getItemIndex(activeElement)
-    const lastItemIndex   = this._items.length - 1
-    const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||
+    const activeIndex = this._getItemIndex(activeElement)
+    const lastItemIndex = this._items.length - 1
+    const isGoingToWrap = isPrevDirection && activeIndex === 0 ||
                             isNextDirection && activeIndex === lastItemIndex
 
     if (isGoingToWrap && !this._config.wrap) {
       return activeElement
     }
 
-    const delta     = direction === DIRECTION_PREV ? -1 : 1
+    const delta = direction === DIRECTION_PREV ? -1 : 1
     const itemIndex = (activeIndex + delta) % this._items.length
 
-    return itemIndex === -1
-      ? this._items[this._items.length - 1] : this._items[itemIndex]
+    return itemIndex === -1 ?
+      this._items[this._items.length - 1] : this._items[itemIndex]
   }
 
   _triggerSlideEvent(relatedTarget, eventDirectionName) {
@@ -399,10 +403,27 @@ class Carousel {
     }
   }
 
+  _updateInterval() {
+    const element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM)
+
+    if (!element) {
+      return
+    }
+
+    const elementInterval = parseInt(element.getAttribute('data-interval'), 10)
+
+    if (elementInterval) {
+      this._config.defaultInterval = this._config.defaultInterval || this._config.interval
+      this._config.interval = elementInterval
+    } else {
+      this._config.interval = this._config.defaultInterval || this._config.interval
+    }
+  }
+
   _slide(direction, element) {
     const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)
     const activeElementIndex = this._getItemIndex(activeElement)
-    const nextElement   = element || activeElement &&
+    const nextElement = element || activeElement &&
       this._getItemByDirection(direction, activeElement)
     const nextElementIndex = this._getItemIndex(nextElement)
     const isCycling = Boolean(this._interval)
@@ -443,6 +464,7 @@ class Carousel {
     }
 
     this._setActiveIndicatorElement(nextElement)
+    this._activeElement = nextElement
 
     const slidEvent = $.Event(EVENT_SLID, {
       relatedTarget: nextElement,
@@ -459,14 +481,6 @@ class Carousel {
       $(activeElement).addClass(directionalClassName)
       $(nextElement).addClass(directionalClassName)
 
-      const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)
-      if (nextElementInterval) {
-        this._config.defaultInterval = this._config.defaultInterval || this._config.interval
-        this._config.interval = nextElementInterval
-      } else {
-        this._config.interval = this._config.defaultInterval || this._config.interval
-      }
-
       const transitionDuration = Util.getTransitionDurationFromElement(activeElement)
 
       $(activeElement)
@@ -525,6 +539,7 @@ class Carousel {
         if (typeof data[action] === 'undefined') {
           throw new TypeError(`No method named "${action}"`)
         }
+
         data[action]()
       } else if (_config.interval && _config.ride) {
         data.pause()

+ 37 - 36
coderedcms/static/coderedcms/vendor/bootstrap/js/src/collapse.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): collapse.js
+ * Bootstrap (v4.6.0): collapse.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,38 +14,38 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME                = 'collapse'
-const VERSION             = '4.5.1'
-const DATA_KEY            = 'bs.collapse'
-const EVENT_KEY           = `.${DATA_KEY}`
-const DATA_API_KEY        = '.data-api'
-const JQUERY_NO_CONFLICT  = $.fn[NAME]
+const NAME = 'collapse'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.collapse'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
+const JQUERY_NO_CONFLICT = $.fn[NAME]
 
 const Default = {
-  toggle : true,
-  parent : ''
+  toggle: true,
+  parent: ''
 }
 
 const DefaultType = {
-  toggle : 'boolean',
-  parent : '(string|element)'
+  toggle: 'boolean',
+  parent: '(string|element)'
 }
 
-const EVENT_SHOW           = `show${EVENT_KEY}`
-const EVENT_SHOWN          = `shown${EVENT_KEY}`
-const EVENT_HIDE           = `hide${EVENT_KEY}`
-const EVENT_HIDDEN         = `hidden${EVENT_KEY}`
+const EVENT_SHOW = `show${EVENT_KEY}`
+const EVENT_SHOWN = `shown${EVENT_KEY}`
+const EVENT_HIDE = `hide${EVENT_KEY}`
+const EVENT_HIDDEN = `hidden${EVENT_KEY}`
 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 
-const CLASS_NAME_SHOW       = 'show'
-const CLASS_NAME_COLLAPSE   = 'collapse'
+const CLASS_NAME_SHOW = 'show'
+const CLASS_NAME_COLLAPSE = 'collapse'
 const CLASS_NAME_COLLAPSING = 'collapsing'
-const CLASS_NAME_COLLAPSED  = 'collapsed'
+const CLASS_NAME_COLLAPSED = 'collapsed'
 
-const DIMENSION_WIDTH  = 'width'
+const DIMENSION_WIDTH = 'width'
 const DIMENSION_HEIGHT = 'height'
 
-const SELECTOR_ACTIVES     = '.show, .collapsing'
+const SELECTOR_ACTIVES = '.show, .collapsing'
 const SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]'
 
 /**
@@ -57,9 +57,9 @@ const SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]'
 class Collapse {
   constructor(element, config) {
     this._isTransitioning = false
-    this._element         = element
-    this._config          = this._getConfig(config)
-    this._triggerArray    = [].slice.call(document.querySelectorAll(
+    this._element = element
+    this._config = this._getConfig(config)
+    this._triggerArray = [].slice.call(document.querySelectorAll(
       `[data-toggle="collapse"][href="#${element.id}"],` +
       `[data-toggle="collapse"][data-target="#${element.id}"]`
     ))
@@ -69,7 +69,7 @@ class Collapse {
       const elem = toggleList[i]
       const selector = Util.getSelectorFromElement(elem)
       const filterElement = [].slice.call(document.querySelectorAll(selector))
-        .filter((foundElem) => foundElem === element)
+        .filter(foundElem => foundElem === element)
 
       if (selector !== null && filterElement.length > 0) {
         this._selector = selector
@@ -119,7 +119,7 @@ class Collapse {
 
     if (this._parent) {
       actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))
-        .filter((elem) => {
+        .filter(elem => {
           if (typeof this._config.parent === 'string') {
             return elem.getAttribute('data-parent') === this._config.parent
           }
@@ -254,10 +254,10 @@ class Collapse {
   dispose() {
     $.removeData(this._element, DATA_KEY)
 
-    this._config          = null
-    this._parent          = null
-    this._element         = null
-    this._triggerArray    = null
+    this._config = null
+    this._parent = null
+    this._element = null
+    this._triggerArray = null
     this._isTransitioning = null
   }
 
@@ -324,12 +324,12 @@ class Collapse {
 
   static _jQueryInterface(config) {
     return this.each(function () {
-      const $this   = $(this)
-      let data      = $this.data(DATA_KEY)
+      const $element = $(this)
+      let data = $element.data(DATA_KEY)
       const _config = {
         ...Default,
-        ...$this.data(),
-        ...typeof config === 'object' && config ? config : {}
+        ...$element.data(),
+        ...(typeof config === 'object' && config ? config : {})
       }
 
       if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
@@ -338,13 +338,14 @@ class Collapse {
 
       if (!data) {
         data = new Collapse(this, _config)
-        $this.data(DATA_KEY, data)
+        $element.data(DATA_KEY, data)
       }
 
       if (typeof config === 'string') {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config]()
       }
     })
@@ -369,8 +370,8 @@ $(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
 
   $(selectors).each(function () {
     const $target = $(this)
-    const data    = $target.data(DATA_KEY)
-    const config  = data ? 'toggle' : $trigger.data()
+    const data = $target.data(DATA_KEY)
+    const config = data ? 'toggle' : $trigger.data()
     Collapse._jQueryInterface.call($target, config)
   })
 })

+ 72 - 68
coderedcms/static/coderedcms/vendor/bootstrap/js/src/dropdown.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): dropdown.js
+ * Bootstrap (v4.6.0): dropdown.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -15,66 +15,66 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME                     = 'dropdown'
-const VERSION                  = '4.5.1'
-const DATA_KEY                 = 'bs.dropdown'
-const EVENT_KEY                = `.${DATA_KEY}`
-const DATA_API_KEY             = '.data-api'
-const JQUERY_NO_CONFLICT       = $.fn[NAME]
-const ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key
-const SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key
-const TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key
-const ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key
-const ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key
+const NAME = 'dropdown'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.dropdown'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
+const JQUERY_NO_CONFLICT = $.fn[NAME]
+const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
+const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key
+const TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key
+const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key
+const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key
 const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
-const REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
-
-const EVENT_HIDE             = `hide${EVENT_KEY}`
-const EVENT_HIDDEN           = `hidden${EVENT_KEY}`
-const EVENT_SHOW             = `show${EVENT_KEY}`
-const EVENT_SHOWN            = `shown${EVENT_KEY}`
-const EVENT_CLICK            = `click${EVENT_KEY}`
-const EVENT_CLICK_DATA_API   = `click${EVENT_KEY}${DATA_API_KEY}`
+const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
+
+const EVENT_HIDE = `hide${EVENT_KEY}`
+const EVENT_HIDDEN = `hidden${EVENT_KEY}`
+const EVENT_SHOW = `show${EVENT_KEY}`
+const EVENT_SHOWN = `shown${EVENT_KEY}`
+const EVENT_CLICK = `click${EVENT_KEY}`
+const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`
-const EVENT_KEYUP_DATA_API   = `keyup${EVENT_KEY}${DATA_API_KEY}`
-
-const CLASS_NAME_DISABLED        = 'disabled'
-const CLASS_NAME_SHOW            = 'show'
-const CLASS_NAME_DROPUP          = 'dropup'
-const CLASS_NAME_DROPRIGHT       = 'dropright'
-const CLASS_NAME_DROPLEFT        = 'dropleft'
-const CLASS_NAME_MENURIGHT       = 'dropdown-menu-right'
+const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
+
+const CLASS_NAME_DISABLED = 'disabled'
+const CLASS_NAME_SHOW = 'show'
+const CLASS_NAME_DROPUP = 'dropup'
+const CLASS_NAME_DROPRIGHT = 'dropright'
+const CLASS_NAME_DROPLEFT = 'dropleft'
+const CLASS_NAME_MENURIGHT = 'dropdown-menu-right'
 const CLASS_NAME_POSITION_STATIC = 'position-static'
 
-const SELECTOR_DATA_TOGGLE   = '[data-toggle="dropdown"]'
-const SELECTOR_FORM_CHILD    = '.dropdown form'
-const SELECTOR_MENU          = '.dropdown-menu'
-const SELECTOR_NAVBAR_NAV    = '.navbar-nav'
+const SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]'
+const SELECTOR_FORM_CHILD = '.dropdown form'
+const SELECTOR_MENU = '.dropdown-menu'
+const SELECTOR_NAVBAR_NAV = '.navbar-nav'
 const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
 
-const PLACEMENT_TOP       = 'top-start'
-const PLACEMENT_TOPEND    = 'top-end'
-const PLACEMENT_BOTTOM    = 'bottom-start'
+const PLACEMENT_TOP = 'top-start'
+const PLACEMENT_TOPEND = 'top-end'
+const PLACEMENT_BOTTOM = 'bottom-start'
 const PLACEMENT_BOTTOMEND = 'bottom-end'
-const PLACEMENT_RIGHT     = 'right-start'
-const PLACEMENT_LEFT      = 'left-start'
+const PLACEMENT_RIGHT = 'right-start'
+const PLACEMENT_LEFT = 'left-start'
 
 const Default = {
-  offset       : 0,
-  flip         : true,
-  boundary     : 'scrollParent',
-  reference    : 'toggle',
-  display      : 'dynamic',
-  popperConfig : null
+  offset: 0,
+  flip: true,
+  boundary: 'scrollParent',
+  reference: 'toggle',
+  display: 'dynamic',
+  popperConfig: null
 }
 
 const DefaultType = {
-  offset       : '(number|string|function)',
-  flip         : 'boolean',
-  boundary     : '(string|element)',
-  reference    : '(string|element)',
-  display      : 'string',
-  popperConfig : '(null|object)'
+  offset: '(number|string|function)',
+  flip: 'boolean',
+  boundary: '(string|element)',
+  reference: '(string|element)',
+  display: 'string',
+  popperConfig: '(null|object)'
 }
 
 /**
@@ -85,10 +85,10 @@ const DefaultType = {
 
 class Dropdown {
   constructor(element, config) {
-    this._element  = element
-    this._popper   = null
-    this._config   = this._getConfig(config)
-    this._menu     = this._getMenuElement()
+    this._element = element
+    this._popper = null
+    this._config = this._getConfig(config)
+    this._menu = this._getMenuElement()
     this._inNavbar = this._detectNavbar()
 
     this._addEventListeners()
@@ -143,14 +143,14 @@ class Dropdown {
       return
     }
 
-    // Disable totally Popper.js for Dropdown in Navbar
+    // Totally disable Popper for Dropdowns in Navbar
     if (!this._inNavbar && usePopper) {
       /**
        * Check for Popper dependency
        * Popper - https://popper.js.org
        */
       if (typeof Popper === 'undefined') {
-        throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)')
+        throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)')
       }
 
       let referenceElement = this._element
@@ -172,6 +172,7 @@ class Dropdown {
       if (this._config.boundary !== 'scrollParent') {
         $(parent).addClass(CLASS_NAME_POSITION_STATIC)
       }
+
       this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())
     }
 
@@ -241,7 +242,7 @@ class Dropdown {
   // Private
 
   _addEventListeners() {
-    $(this._element).on(EVENT_CLICK, (event) => {
+    $(this._element).on(EVENT_CLICK, event => {
       event.preventDefault()
       event.stopPropagation()
       this.toggle()
@@ -272,6 +273,7 @@ class Dropdown {
         this._menu = parent.querySelector(SELECTOR_MENU)
       }
     }
+
     return this._menu
   }
 
@@ -281,9 +283,9 @@ class Dropdown {
 
     // Handle dropup
     if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
-      placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT)
-        ? PLACEMENT_TOPEND
-        : PLACEMENT_TOP
+      placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?
+        PLACEMENT_TOPEND :
+        PLACEMENT_TOP
     } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
       placement = PLACEMENT_RIGHT
     } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
@@ -291,6 +293,7 @@ class Dropdown {
     } else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
       placement = PLACEMENT_BOTTOMEND
     }
+
     return placement
   }
 
@@ -302,10 +305,10 @@ class Dropdown {
     const offset = {}
 
     if (typeof this._config.offset === 'function') {
-      offset.fn = (data) => {
+      offset.fn = data => {
         data.offsets = {
           ...data.offsets,
-          ...this._config.offset(data.offsets, this._element) || {}
+          ...(this._config.offset(data.offsets, this._element) || {})
         }
 
         return data
@@ -331,7 +334,7 @@ class Dropdown {
       }
     }
 
-    // Disable Popper.js if we have a static display
+    // Disable Popper if we have a static display
     if (this._config.display === 'static') {
       popperConfig.modifiers.applyStyle = {
         enabled: false
@@ -360,6 +363,7 @@ class Dropdown {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config]()
       }
     })
@@ -444,8 +448,8 @@ class Dropdown {
     //  - If key is other than escape
     //    - If key is not up or down => not a dropdown command
     //    - If trigger inside the menu => not a dropdown command
-    if (/input|textarea/i.test(event.target.tagName)
-      ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
+    if (/input|textarea/i.test(event.target.tagName) ?
+      event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
       (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||
         $(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
       return
@@ -455,7 +459,7 @@ class Dropdown {
       return
     }
 
-    const parent   = Dropdown._getParentFromElement(this)
+    const parent = Dropdown._getParentFromElement(this)
     const isActive = $(parent).hasClass(CLASS_NAME_SHOW)
 
     if (!isActive && event.which === ESCAPE_KEYCODE) {
@@ -465,7 +469,7 @@ class Dropdown {
     event.preventDefault()
     event.stopPropagation()
 
-    if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
+    if (!isActive || (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
       if (event.which === ESCAPE_KEYCODE) {
         $(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus')
       }
@@ -475,7 +479,7 @@ class Dropdown {
     }
 
     const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))
-      .filter((item) => $(item).is(':visible'))
+      .filter(item => $(item).is(':visible'))
 
     if (items.length === 0) {
       return
@@ -514,7 +518,7 @@ $(document)
     event.stopPropagation()
     Dropdown._jQueryInterface.call($(this), 'toggle')
   })
-  .on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, (e) => {
+  .on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => {
     e.stopPropagation()
   })
 

+ 102 - 100
coderedcms/static/coderedcms/vendor/bootstrap/js/src/modal.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): modal.js
+ * Bootstrap (v4.6.0): modal.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,54 +14,54 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME               = 'modal'
-const VERSION            = '4.5.1'
-const DATA_KEY           = 'bs.modal'
-const EVENT_KEY          = `.${DATA_KEY}`
-const DATA_API_KEY       = '.data-api'
+const NAME = 'modal'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.modal'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
 const JQUERY_NO_CONFLICT = $.fn[NAME]
-const ESCAPE_KEYCODE     = 27 // KeyboardEvent.which value for Escape (Esc) key
+const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
 
 const Default = {
-  backdrop : true,
-  keyboard : true,
-  focus    : true,
-  show     : true
+  backdrop: true,
+  keyboard: true,
+  focus: true,
+  show: true
 }
 
 const DefaultType = {
-  backdrop : '(boolean|string)',
-  keyboard : 'boolean',
-  focus    : 'boolean',
-  show     : 'boolean'
+  backdrop: '(boolean|string)',
+  keyboard: 'boolean',
+  focus: 'boolean',
+  show: 'boolean'
 }
 
-const EVENT_HIDE              = `hide${EVENT_KEY}`
-const EVENT_HIDE_PREVENTED    = `hidePrevented${EVENT_KEY}`
-const EVENT_HIDDEN            = `hidden${EVENT_KEY}`
-const EVENT_SHOW              = `show${EVENT_KEY}`
-const EVENT_SHOWN             = `shown${EVENT_KEY}`
-const EVENT_FOCUSIN           = `focusin${EVENT_KEY}`
-const EVENT_RESIZE            = `resize${EVENT_KEY}`
-const EVENT_CLICK_DISMISS     = `click.dismiss${EVENT_KEY}`
-const EVENT_KEYDOWN_DISMISS   = `keydown.dismiss${EVENT_KEY}`
-const EVENT_MOUSEUP_DISMISS   = `mouseup.dismiss${EVENT_KEY}`
+const EVENT_HIDE = `hide${EVENT_KEY}`
+const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
+const EVENT_HIDDEN = `hidden${EVENT_KEY}`
+const EVENT_SHOW = `show${EVENT_KEY}`
+const EVENT_SHOWN = `shown${EVENT_KEY}`
+const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
+const EVENT_RESIZE = `resize${EVENT_KEY}`
+const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
+const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
+const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`
 const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`
-const EVENT_CLICK_DATA_API    = `click${EVENT_KEY}${DATA_API_KEY}`
+const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 
-const CLASS_NAME_SCROLLABLE         = 'modal-dialog-scrollable'
+const CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'
 const CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'
-const CLASS_NAME_BACKDROP           = 'modal-backdrop'
-const CLASS_NAME_OPEN               = 'modal-open'
-const CLASS_NAME_FADE               = 'fade'
-const CLASS_NAME_SHOW               = 'show'
-const CLASS_NAME_STATIC             = 'modal-static'
-
-const SELECTOR_DIALOG         = '.modal-dialog'
-const SELECTOR_MODAL_BODY     = '.modal-body'
-const SELECTOR_DATA_TOGGLE    = '[data-toggle="modal"]'
-const SELECTOR_DATA_DISMISS   = '[data-dismiss="modal"]'
-const SELECTOR_FIXED_CONTENT  = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
+const CLASS_NAME_BACKDROP = 'modal-backdrop'
+const CLASS_NAME_OPEN = 'modal-open'
+const CLASS_NAME_FADE = 'fade'
+const CLASS_NAME_SHOW = 'show'
+const CLASS_NAME_STATIC = 'modal-static'
+
+const SELECTOR_DIALOG = '.modal-dialog'
+const SELECTOR_MODAL_BODY = '.modal-body'
+const SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]'
+const SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]'
+const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
 const SELECTOR_STICKY_CONTENT = '.sticky-top'
 
 /**
@@ -72,15 +72,15 @@ const SELECTOR_STICKY_CONTENT = '.sticky-top'
 
 class Modal {
   constructor(element, config) {
-    this._config              = this._getConfig(config)
-    this._element             = element
-    this._dialog              = element.querySelector(SELECTOR_DIALOG)
-    this._backdrop            = null
-    this._isShown             = false
-    this._isBodyOverflowing   = false
+    this._config = this._getConfig(config)
+    this._element = element
+    this._dialog = element.querySelector(SELECTOR_DIALOG)
+    this._backdrop = null
+    this._isShown = false
+    this._isBodyOverflowing = false
     this._ignoreBackdropClick = false
-    this._isTransitioning     = false
-    this._scrollbarWidth      = 0
+    this._isTransitioning = false
+    this._scrollbarWidth = 0
   }
 
   // Getters
@@ -131,11 +131,11 @@ class Modal {
     $(this._element).on(
       EVENT_CLICK_DISMISS,
       SELECTOR_DATA_DISMISS,
-      (event) => this.hide(event)
+      event => this.hide(event)
     )
 
     $(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => {
-      $(this._element).one(EVENT_MOUSEUP_DISMISS, (event) => {
+      $(this._element).one(EVENT_MOUSEUP_DISMISS, event => {
         if ($(event.target).is(this._element)) {
           this._ignoreBackdropClick = true
         }
@@ -180,10 +180,10 @@ class Modal {
     $(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)
 
     if (transition) {
-      const transitionDuration  = Util.getTransitionDurationFromElement(this._element)
+      const transitionDuration = Util.getTransitionDurationFromElement(this._element)
 
       $(this._element)
-        .one(Util.TRANSITION_END, (event) => this._hideModal(event))
+        .one(Util.TRANSITION_END, event => this._hideModal(event))
         .emulateTransitionEnd(transitionDuration)
     } else {
       this._hideModal()
@@ -192,7 +192,7 @@ class Modal {
 
   dispose() {
     [window, this._element, this._dialog]
-      .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))
+      .forEach(htmlElement => $(htmlElement).off(EVENT_KEY))
 
     /**
      * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
@@ -203,15 +203,15 @@ class Modal {
 
     $.removeData(this._element, DATA_KEY)
 
-    this._config              = null
-    this._element             = null
-    this._dialog              = null
-    this._backdrop            = null
-    this._isShown             = null
-    this._isBodyOverflowing   = null
+    this._config = null
+    this._element = null
+    this._dialog = null
+    this._backdrop = null
+    this._isShown = null
+    this._isBodyOverflowing = null
     this._ignoreBackdropClick = null
-    this._isTransitioning     = null
-    this._scrollbarWidth      = null
+    this._isTransitioning = null
+    this._scrollbarWidth = null
   }
 
   handleUpdate() {
@@ -230,39 +230,35 @@ class Modal {
   }
 
   _triggerBackdropTransition() {
-    if (this._config.backdrop === 'static') {
-      const hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)
+    const hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)
 
-      $(this._element).trigger(hideEventPrevented)
-      if (hideEventPrevented.defaultPrevented) {
-        return
-      }
+    $(this._element).trigger(hideEventPrevented)
+    if (hideEventPrevented.isDefaultPrevented()) {
+      return
+    }
 
-      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight
+    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight
 
-      if (!isModalOverflowing) {
-        this._element.style.overflowY = 'hidden'
-      }
+    if (!isModalOverflowing) {
+      this._element.style.overflowY = 'hidden'
+    }
 
-      this._element.classList.add(CLASS_NAME_STATIC)
+    this._element.classList.add(CLASS_NAME_STATIC)
 
-      const modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)
-      $(this._element).off(Util.TRANSITION_END)
+    const modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)
+    $(this._element).off(Util.TRANSITION_END)
 
-      $(this._element).one(Util.TRANSITION_END, () => {
-        this._element.classList.remove(CLASS_NAME_STATIC)
-        if (!isModalOverflowing) {
-          $(this._element).one(Util.TRANSITION_END, () => {
-            this._element.style.overflowY = ''
-          })
-            .emulateTransitionEnd(this._element, modalTransitionDuration)
-        }
-      })
-        .emulateTransitionEnd(modalTransitionDuration)
-      this._element.focus()
-    } else {
-      this.hide()
-    }
+    $(this._element).one(Util.TRANSITION_END, () => {
+      this._element.classList.remove(CLASS_NAME_STATIC)
+      if (!isModalOverflowing) {
+        $(this._element).one(Util.TRANSITION_END, () => {
+          this._element.style.overflowY = ''
+        })
+          .emulateTransitionEnd(this._element, modalTransitionDuration)
+      }
+    })
+      .emulateTransitionEnd(modalTransitionDuration)
+    this._element.focus()
   }
 
   _showElement(relatedTarget) {
@@ -304,12 +300,13 @@ class Modal {
       if (this._config.focus) {
         this._element.focus()
       }
+
       this._isTransitioning = false
       $(this._element).trigger(shownEvent)
     }
 
     if (transition) {
-      const transitionDuration  = Util.getTransitionDurationFromElement(this._dialog)
+      const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)
 
       $(this._dialog)
         .one(Util.TRANSITION_END, transitionComplete)
@@ -322,7 +319,7 @@ class Modal {
   _enforceFocus() {
     $(document)
       .off(EVENT_FOCUSIN) // Guard against infinite focus loop
-      .on(EVENT_FOCUSIN, (event) => {
+      .on(EVENT_FOCUSIN, event => {
         if (document !== event.target &&
             this._element !== event.target &&
             $(this._element).has(event.target).length === 0) {
@@ -333,7 +330,7 @@ class Modal {
 
   _setEscapeEvent() {
     if (this._isShown) {
-      $(this._element).on(EVENT_KEYDOWN_DISMISS, (event) => {
+      $(this._element).on(EVENT_KEYDOWN_DISMISS, event => {
         if (this._config.keyboard && event.which === ESCAPE_KEYCODE) {
           event.preventDefault()
           this.hide()
@@ -348,7 +345,7 @@ class Modal {
 
   _setResizeEvent() {
     if (this._isShown) {
-      $(window).on(EVENT_RESIZE, (event) => this.handleUpdate(event))
+      $(window).on(EVENT_RESIZE, event => this.handleUpdate(event))
     } else {
       $(window).off(EVENT_RESIZE)
     }
@@ -376,8 +373,8 @@ class Modal {
   }
 
   _showBackdrop(callback) {
-    const animate = $(this._element).hasClass(CLASS_NAME_FADE)
-      ? CLASS_NAME_FADE : ''
+    const animate = $(this._element).hasClass(CLASS_NAME_FADE) ?
+      CLASS_NAME_FADE : ''
 
     if (this._isShown && this._config.backdrop) {
       this._backdrop = document.createElement('div')
@@ -389,16 +386,21 @@ class Modal {
 
       $(this._backdrop).appendTo(document.body)
 
-      $(this._element).on(EVENT_CLICK_DISMISS, (event) => {
+      $(this._element).on(EVENT_CLICK_DISMISS, event => {
         if (this._ignoreBackdropClick) {
           this._ignoreBackdropClick = false
           return
         }
+
         if (event.target !== event.currentTarget) {
           return
         }
 
-        this._triggerBackdropTransition()
+        if (this._config.backdrop === 'static') {
+          this._triggerBackdropTransition()
+        } else {
+          this.hide()
+        }
       })
 
       if (animate) {
@@ -451,8 +453,7 @@ class Modal {
   // ----------------------------------------------------------------------
 
   _adjustDialog() {
-    const isModalOverflowing =
-      this._element.scrollHeight > document.documentElement.clientHeight
+    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight
 
     if (!this._isBodyOverflowing && isModalOverflowing) {
       this._element.style.paddingLeft = `${this._scrollbarWidth}px`
@@ -551,7 +552,7 @@ class Modal {
       const _config = {
         ...Default,
         ...$(this).data(),
-        ...typeof config === 'object' && config ? config : {}
+        ...(typeof config === 'object' && config ? config : {})
       }
 
       if (!data) {
@@ -563,6 +564,7 @@ class Modal {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config](relatedTarget)
       } else if (_config.show) {
         data.show(relatedTarget)
@@ -585,8 +587,8 @@ $(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
     target = document.querySelector(selector)
   }
 
-  const config = $(target).data(DATA_KEY)
-    ? 'toggle' : {
+  const config = $(target).data(DATA_KEY) ?
+    'toggle' : {
       ...$(target).data(),
       ...$(this).data()
     }
@@ -595,7 +597,7 @@ $(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
     event.preventDefault()
   }
 
-  const $target = $(target).one(EVENT_SHOW, (showEvent) => {
+  const $target = $(target).one(EVENT_SHOW, showEvent => {
     if (showEvent.isDefaultPrevented()) {
       // Only register focus restorer if modal will actually get shown
       return

+ 26 - 24
coderedcms/static/coderedcms/vendor/bootstrap/js/src/popover.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): popover.js
+ * Bootstrap (v4.6.0): popover.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,20 +14,20 @@ import Tooltip from './tooltip'
  * ------------------------------------------------------------------------
  */
 
-const NAME                = 'popover'
-const VERSION             = '4.5.1'
-const DATA_KEY            = 'bs.popover'
-const EVENT_KEY           = `.${DATA_KEY}`
-const JQUERY_NO_CONFLICT  = $.fn[NAME]
-const CLASS_PREFIX        = 'bs-popover'
-const BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
+const NAME = 'popover'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.popover'
+const EVENT_KEY = `.${DATA_KEY}`
+const JQUERY_NO_CONFLICT = $.fn[NAME]
+const CLASS_PREFIX = 'bs-popover'
+const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
 
 const Default = {
   ...Tooltip.Default,
-  placement : 'right',
-  trigger   : 'click',
-  content   : '',
-  template  : '<div class="popover" role="tooltip">' +
+  placement: 'right',
+  trigger: 'click',
+  content: '',
+  template: '<div class="popover" role="tooltip">' +
               '<div class="arrow"></div>' +
               '<h3 class="popover-header"></h3>' +
               '<div class="popover-body"></div></div>'
@@ -35,26 +35,26 @@ const Default = {
 
 const DefaultType = {
   ...Tooltip.DefaultType,
-  content : '(string|element|function)'
+  content: '(string|element|function)'
 }
 
 const CLASS_NAME_FADE = 'fade'
 const CLASS_NAME_SHOW = 'show'
 
-const SELECTOR_TITLE   = '.popover-header'
+const SELECTOR_TITLE = '.popover-header'
 const SELECTOR_CONTENT = '.popover-body'
 
 const Event = {
-  HIDE       : `hide${EVENT_KEY}`,
-  HIDDEN     : `hidden${EVENT_KEY}`,
-  SHOW       : `show${EVENT_KEY}`,
-  SHOWN      : `shown${EVENT_KEY}`,
-  INSERTED   : `inserted${EVENT_KEY}`,
-  CLICK      : `click${EVENT_KEY}`,
-  FOCUSIN    : `focusin${EVENT_KEY}`,
-  FOCUSOUT   : `focusout${EVENT_KEY}`,
-  MOUSEENTER : `mouseenter${EVENT_KEY}`,
-  MOUSELEAVE : `mouseleave${EVENT_KEY}`
+  HIDE: `hide${EVENT_KEY}`,
+  HIDDEN: `hidden${EVENT_KEY}`,
+  SHOW: `show${EVENT_KEY}`,
+  SHOWN: `shown${EVENT_KEY}`,
+  INSERTED: `inserted${EVENT_KEY}`,
+  CLICK: `click${EVENT_KEY}`,
+  FOCUSIN: `focusin${EVENT_KEY}`,
+  FOCUSOUT: `focusout${EVENT_KEY}`,
+  MOUSEENTER: `mouseenter${EVENT_KEY}`,
+  MOUSELEAVE: `mouseleave${EVENT_KEY}`
 }
 
 /**
@@ -118,6 +118,7 @@ class Popover extends Tooltip {
     if (typeof content === 'function') {
       content = content.call(this.element)
     }
+
     this.setElementContent($tip.find(SELECTOR_CONTENT), content)
 
     $tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)
@@ -158,6 +159,7 @@ class Popover extends Tooltip {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config]()
       }
     })

+ 62 - 58
coderedcms/static/coderedcms/vendor/bootstrap/js/src/scrollspy.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): scrollspy.js
+ * Bootstrap (v4.6.0): scrollspy.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,42 +14,42 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME               = 'scrollspy'
-const VERSION            = '4.5.1'
-const DATA_KEY           = 'bs.scrollspy'
-const EVENT_KEY          = `.${DATA_KEY}`
-const DATA_API_KEY       = '.data-api'
+const NAME = 'scrollspy'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.scrollspy'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
 const JQUERY_NO_CONFLICT = $.fn[NAME]
 
 const Default = {
-  offset : 10,
-  method : 'auto',
-  target : ''
+  offset: 10,
+  method: 'auto',
+  target: ''
 }
 
 const DefaultType = {
-  offset : 'number',
-  method : 'string',
-  target : '(string|element)'
+  offset: 'number',
+  method: 'string',
+  target: '(string|element)'
 }
 
-const EVENT_ACTIVATE      = `activate${EVENT_KEY}`
-const EVENT_SCROLL        = `scroll${EVENT_KEY}`
+const EVENT_ACTIVATE = `activate${EVENT_KEY}`
+const EVENT_SCROLL = `scroll${EVENT_KEY}`
 const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
 
 const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'
-const CLASS_NAME_ACTIVE        = 'active'
-
-const SELECTOR_DATA_SPY        = '[data-spy="scroll"]'
-const SELECTOR_NAV_LIST_GROUP  = '.nav, .list-group'
-const SELECTOR_NAV_LINKS       = '.nav-link'
-const SELECTOR_NAV_ITEMS       = '.nav-item'
-const SELECTOR_LIST_ITEMS      = '.list-group-item'
-const SELECTOR_DROPDOWN        = '.dropdown'
-const SELECTOR_DROPDOWN_ITEMS  = '.dropdown-item'
+const CLASS_NAME_ACTIVE = 'active'
+
+const SELECTOR_DATA_SPY = '[data-spy="scroll"]'
+const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
+const SELECTOR_NAV_LINKS = '.nav-link'
+const SELECTOR_NAV_ITEMS = '.nav-item'
+const SELECTOR_LIST_ITEMS = '.list-group-item'
+const SELECTOR_DROPDOWN = '.dropdown'
+const SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'
 const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
 
-const METHOD_OFFSET   = 'offset'
+const METHOD_OFFSET = 'offset'
 const METHOD_POSITION = 'position'
 
 /**
@@ -60,18 +60,18 @@ const METHOD_POSITION = 'position'
 
 class ScrollSpy {
   constructor(element, config) {
-    this._element       = element
+    this._element = element
     this._scrollElement = element.tagName === 'BODY' ? window : element
-    this._config        = this._getConfig(config)
-    this._selector      = `${this._config.target} ${SELECTOR_NAV_LINKS},` +
+    this._config = this._getConfig(config)
+    this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +
                           `${this._config.target} ${SELECTOR_LIST_ITEMS},` +
                           `${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`
-    this._offsets       = []
-    this._targets       = []
-    this._activeTarget  = null
-    this._scrollHeight  = 0
+    this._offsets = []
+    this._targets = []
+    this._activeTarget = null
+    this._scrollHeight = 0
 
-    $(this._scrollElement).on(EVENT_SCROLL, (event) => this._process(event))
+    $(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))
 
     this.refresh()
     this._process()
@@ -90,14 +90,14 @@ class ScrollSpy {
   // Public
 
   refresh() {
-    const autoMethod = this._scrollElement === this._scrollElement.window
-      ? METHOD_OFFSET : METHOD_POSITION
+    const autoMethod = this._scrollElement === this._scrollElement.window ?
+      METHOD_OFFSET : METHOD_POSITION
 
-    const offsetMethod = this._config.method === 'auto'
-      ? autoMethod : this._config.method
+    const offsetMethod = this._config.method === 'auto' ?
+      autoMethod : this._config.method
 
-    const offsetBase = offsetMethod === METHOD_POSITION
-      ? this._getScrollTop() : 0
+    const offsetBase = offsetMethod === METHOD_POSITION ?
+      this._getScrollTop() : 0
 
     this._offsets = []
     this._targets = []
@@ -107,7 +107,7 @@ class ScrollSpy {
     const targets = [].slice.call(document.querySelectorAll(this._selector))
 
     targets
-      .map((element) => {
+      .map(element => {
         let target
         const targetSelector = Util.getSelectorFromElement(element)
 
@@ -125,11 +125,12 @@ class ScrollSpy {
             ]
           }
         }
+
         return null
       })
-      .filter((item) => item)
+      .filter(item => item)
       .sort((a, b) => a[0] - b[0])
-      .forEach((item) => {
+      .forEach(item => {
         this._offsets.push(item[0])
         this._targets.push(item[1])
       })
@@ -139,14 +140,14 @@ class ScrollSpy {
     $.removeData(this._element, DATA_KEY)
     $(this._scrollElement).off(EVENT_KEY)
 
-    this._element       = null
+    this._element = null
     this._scrollElement = null
-    this._config        = null
-    this._selector      = null
-    this._offsets       = null
-    this._targets       = null
-    this._activeTarget  = null
-    this._scrollHeight  = null
+    this._config = null
+    this._selector = null
+    this._offsets = null
+    this._targets = null
+    this._activeTarget = null
+    this._scrollHeight = null
   }
 
   // Private
@@ -154,7 +155,7 @@ class ScrollSpy {
   _getConfig(config) {
     config = {
       ...Default,
-      ...typeof config === 'object' && config ? config : {}
+      ...(typeof config === 'object' && config ? config : {})
     }
 
     if (typeof config.target !== 'string' && Util.isElement(config.target)) {
@@ -163,6 +164,7 @@ class ScrollSpy {
         id = Util.getUID(NAME)
         $(config.target).attr('id', id)
       }
+
       config.target = `#${id}`
     }
 
@@ -172,8 +174,8 @@ class ScrollSpy {
   }
 
   _getScrollTop() {
-    return this._scrollElement === window
-      ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop
+    return this._scrollElement === window ?
+      this._scrollElement.pageYOffset : this._scrollElement.scrollTop
   }
 
   _getScrollHeight() {
@@ -184,14 +186,14 @@ class ScrollSpy {
   }
 
   _getOffsetHeight() {
-    return this._scrollElement === window
-      ? window.innerHeight : this._scrollElement.getBoundingClientRect().height
+    return this._scrollElement === window ?
+      window.innerHeight : this._scrollElement.getBoundingClientRect().height
   }
 
   _process() {
-    const scrollTop    = this._getScrollTop() + this._config.offset
+    const scrollTop = this._getScrollTop() + this._config.offset
     const scrollHeight = this._getScrollHeight()
-    const maxScroll    = this._config.offset + scrollHeight - this._getOffsetHeight()
+    const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()
 
     if (this._scrollHeight !== scrollHeight) {
       this.refresh()
@@ -203,6 +205,7 @@ class ScrollSpy {
       if (this._activeTarget !== target) {
         this._activate(target)
       }
+
       return
     }
 
@@ -231,7 +234,7 @@ class ScrollSpy {
 
     const queries = this._selector
       .split(',')
-      .map((selector) => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
+      .map(selector => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
 
     const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))
 
@@ -262,8 +265,8 @@ class ScrollSpy {
 
   _clear() {
     [].slice.call(document.querySelectorAll(this._selector))
-      .filter((node) => node.classList.contains(CLASS_NAME_ACTIVE))
-      .forEach((node) => node.classList.remove(CLASS_NAME_ACTIVE))
+      .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))
+      .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))
   }
 
   // Static
@@ -282,6 +285,7 @@ class ScrollSpy {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config]()
       }
     })

+ 25 - 24
coderedcms/static/coderedcms/vendor/bootstrap/js/src/tab.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): tab.js
+ * Bootstrap (v4.6.0): tab.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,31 +14,31 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME               = 'tab'
-const VERSION            = '4.5.1'
-const DATA_KEY           = 'bs.tab'
-const EVENT_KEY          = `.${DATA_KEY}`
-const DATA_API_KEY       = '.data-api'
+const NAME = 'tab'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.tab'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
 const JQUERY_NO_CONFLICT = $.fn[NAME]
 
-const EVENT_HIDE           = `hide${EVENT_KEY}`
-const EVENT_HIDDEN         = `hidden${EVENT_KEY}`
-const EVENT_SHOW           = `show${EVENT_KEY}`
-const EVENT_SHOWN          = `shown${EVENT_KEY}`
+const EVENT_HIDE = `hide${EVENT_KEY}`
+const EVENT_HIDDEN = `hidden${EVENT_KEY}`
+const EVENT_SHOW = `show${EVENT_KEY}`
+const EVENT_SHOWN = `shown${EVENT_KEY}`
 const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
 
 const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'
-const CLASS_NAME_ACTIVE        = 'active'
-const CLASS_NAME_DISABLED      = 'disabled'
-const CLASS_NAME_FADE          = 'fade'
-const CLASS_NAME_SHOW          = 'show'
-
-const SELECTOR_DROPDOWN              = '.dropdown'
-const SELECTOR_NAV_LIST_GROUP        = '.nav, .list-group'
-const SELECTOR_ACTIVE                = '.active'
-const SELECTOR_ACTIVE_UL             = '> li > .active'
-const SELECTOR_DATA_TOGGLE           = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]'
-const SELECTOR_DROPDOWN_TOGGLE       = '.dropdown-toggle'
+const CLASS_NAME_ACTIVE = 'active'
+const CLASS_NAME_DISABLED = 'disabled'
+const CLASS_NAME_FADE = 'fade'
+const CLASS_NAME_SHOW = 'show'
+
+const SELECTOR_DROPDOWN = '.dropdown'
+const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
+const SELECTOR_ACTIVE = '.active'
+const SELECTOR_ACTIVE_UL = '> li > .active'
+const SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]'
+const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
 const SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active'
 
 /**
@@ -135,9 +135,9 @@ class Tab {
   // Private
 
   _activate(element, container, callback) {
-    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')
-      ? $(container).find(SELECTOR_ACTIVE_UL)
-      : $(container).children(SELECTOR_ACTIVE)
+    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?
+      $(container).find(SELECTOR_ACTIVE_UL) :
+      $(container).children(SELECTOR_ACTIVE)
 
     const active = activeElements[0]
     const isTransitioning = callback && (active && $(active).hasClass(CLASS_NAME_FADE))
@@ -220,6 +220,7 @@ class Tab {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config]()
       }
     })

+ 26 - 26
coderedcms/static/coderedcms/vendor/bootstrap/js/src/toast.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): toast.js
+ * Bootstrap (v4.6.0): toast.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -14,33 +14,33 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME               = 'toast'
-const VERSION            = '4.5.1'
-const DATA_KEY           = 'bs.toast'
-const EVENT_KEY          = `.${DATA_KEY}`
+const NAME = 'toast'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.toast'
+const EVENT_KEY = `.${DATA_KEY}`
 const JQUERY_NO_CONFLICT = $.fn[NAME]
 
 const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
-const EVENT_HIDE          = `hide${EVENT_KEY}`
-const EVENT_HIDDEN        = `hidden${EVENT_KEY}`
-const EVENT_SHOW          = `show${EVENT_KEY}`
-const EVENT_SHOWN         = `shown${EVENT_KEY}`
-
-const CLASS_NAME_FADE    = 'fade'
-const CLASS_NAME_HIDE    = 'hide'
-const CLASS_NAME_SHOW    = 'show'
+const EVENT_HIDE = `hide${EVENT_KEY}`
+const EVENT_HIDDEN = `hidden${EVENT_KEY}`
+const EVENT_SHOW = `show${EVENT_KEY}`
+const EVENT_SHOWN = `shown${EVENT_KEY}`
+
+const CLASS_NAME_FADE = 'fade'
+const CLASS_NAME_HIDE = 'hide'
+const CLASS_NAME_SHOW = 'show'
 const CLASS_NAME_SHOWING = 'showing'
 
 const DefaultType = {
-  animation : 'boolean',
-  autohide  : 'boolean',
-  delay     : 'number'
+  animation: 'boolean',
+  autohide: 'boolean',
+  delay: 'number'
 }
 
 const Default = {
-  animation : true,
-  autohide  : true,
-  delay     : 500
+  animation: true,
+  autohide: true,
+  delay: 500
 }
 
 const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'
@@ -54,7 +54,7 @@ const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'
 class Toast {
   constructor(element, config) {
     this._element = element
-    this._config  = this._getConfig(config)
+    this._config = this._getConfig(config)
     this._timeout = null
     this._setListeners()
   }
@@ -142,7 +142,7 @@ class Toast {
 
     $.removeData(this._element, DATA_KEY)
     this._element = null
-    this._config  = null
+    this._config = null
   }
 
   // Private
@@ -151,7 +151,7 @@ class Toast {
     config = {
       ...Default,
       ...$(this._element).data(),
-      ...typeof config === 'object' && config ? config : {}
+      ...(typeof config === 'object' && config ? config : {})
     }
 
     Util.typeCheckConfig(
@@ -195,8 +195,8 @@ class Toast {
   static _jQueryInterface(config) {
     return this.each(function () {
       const $element = $(this)
-      let data       = $element.data(DATA_KEY)
-      const _config  = typeof config === 'object' && config
+      let data = $element.data(DATA_KEY)
+      const _config = typeof config === 'object' && config
 
       if (!data) {
         data = new Toast(this, _config)
@@ -220,9 +220,9 @@ class Toast {
  * ------------------------------------------------------------------------
  */
 
-$.fn[NAME]             = Toast._jQueryInterface
+$.fn[NAME] = Toast._jQueryInterface
 $.fn[NAME].Constructor = Toast
-$.fn[NAME].noConflict  = () => {
+$.fn[NAME].noConflict = () => {
   $.fn[NAME] = JQUERY_NO_CONFLICT
   return Toast._jQueryInterface
 }

+ 3 - 3
coderedcms/static/coderedcms/vendor/bootstrap/js/src/tools/sanitizer.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): tools/sanitizer.js
+ * Bootstrap (v4.6.0): tools/sanitizer.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -77,7 +77,7 @@ function allowedAttribute(attr, allowedAttributeList) {
     return true
   }
 
-  const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)
+  const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)
 
   // Check if a regular expression validates the attribute.
   for (let i = 0, len = regExp.length; i < len; i++) {
@@ -116,7 +116,7 @@ export function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
     const attributeList = [].slice.call(el.attributes)
     const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
 
-    attributeList.forEach((attr) => {
+    attributeList.forEach(attr => {
       if (!allowedAttribute(attr, whitelistedAttributes)) {
         el.removeAttribute(attr.nodeName)
       }

+ 105 - 99
coderedcms/static/coderedcms/vendor/bootstrap/js/src/tooltip.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): tooltip.js
+ * Bootstrap (v4.6.0): tooltip.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -19,88 +19,90 @@ import Util from './util'
  * ------------------------------------------------------------------------
  */
 
-const NAME                  = 'tooltip'
-const VERSION               = '4.5.1'
-const DATA_KEY              = 'bs.tooltip'
-const EVENT_KEY             = `.${DATA_KEY}`
-const JQUERY_NO_CONFLICT    = $.fn[NAME]
-const CLASS_PREFIX          = 'bs-tooltip'
-const BSCLS_PREFIX_REGEX    = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
+const NAME = 'tooltip'
+const VERSION = '4.6.0'
+const DATA_KEY = 'bs.tooltip'
+const EVENT_KEY = `.${DATA_KEY}`
+const JQUERY_NO_CONFLICT = $.fn[NAME]
+const CLASS_PREFIX = 'bs-tooltip'
+const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
 const DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
 
 const DefaultType = {
-  animation         : 'boolean',
-  template          : 'string',
-  title             : '(string|element|function)',
-  trigger           : 'string',
-  delay             : '(number|object)',
-  html              : 'boolean',
-  selector          : '(string|boolean)',
-  placement         : '(string|function)',
-  offset            : '(number|string|function)',
-  container         : '(string|element|boolean)',
-  fallbackPlacement : '(string|array)',
-  boundary          : '(string|element)',
-  sanitize          : 'boolean',
-  sanitizeFn        : '(null|function)',
-  whiteList         : 'object',
-  popperConfig      : '(null|object)'
+  animation: 'boolean',
+  template: 'string',
+  title: '(string|element|function)',
+  trigger: 'string',
+  delay: '(number|object)',
+  html: 'boolean',
+  selector: '(string|boolean)',
+  placement: '(string|function)',
+  offset: '(number|string|function)',
+  container: '(string|element|boolean)',
+  fallbackPlacement: '(string|array)',
+  boundary: '(string|element)',
+  customClass: '(string|function)',
+  sanitize: 'boolean',
+  sanitizeFn: '(null|function)',
+  whiteList: 'object',
+  popperConfig: '(null|object)'
 }
 
 const AttachmentMap = {
-  AUTO   : 'auto',
-  TOP    : 'top',
-  RIGHT  : 'right',
-  BOTTOM : 'bottom',
-  LEFT   : 'left'
+  AUTO: 'auto',
+  TOP: 'top',
+  RIGHT: 'right',
+  BOTTOM: 'bottom',
+  LEFT: 'left'
 }
 
 const Default = {
-  animation         : true,
-  template          : '<div class="tooltip" role="tooltip">' +
+  animation: true,
+  template: '<div class="tooltip" role="tooltip">' +
                     '<div class="arrow"></div>' +
                     '<div class="tooltip-inner"></div></div>',
-  trigger           : 'hover focus',
-  title             : '',
-  delay             : 0,
-  html              : false,
-  selector          : false,
-  placement         : 'top',
-  offset            : 0,
-  container         : false,
-  fallbackPlacement : 'flip',
-  boundary          : 'scrollParent',
-  sanitize          : true,
-  sanitizeFn        : null,
-  whiteList         : DefaultWhitelist,
-  popperConfig      : null
+  trigger: 'hover focus',
+  title: '',
+  delay: 0,
+  html: false,
+  selector: false,
+  placement: 'top',
+  offset: 0,
+  container: false,
+  fallbackPlacement: 'flip',
+  boundary: 'scrollParent',
+  customClass: '',
+  sanitize: true,
+  sanitizeFn: null,
+  whiteList: DefaultWhitelist,
+  popperConfig: null
 }
 
 const HOVER_STATE_SHOW = 'show'
-const HOVER_STATE_OUT  = 'out'
+const HOVER_STATE_OUT = 'out'
 
 const Event = {
-  HIDE       : `hide${EVENT_KEY}`,
-  HIDDEN     : `hidden${EVENT_KEY}`,
-  SHOW       : `show${EVENT_KEY}`,
-  SHOWN      : `shown${EVENT_KEY}`,
-  INSERTED   : `inserted${EVENT_KEY}`,
-  CLICK      : `click${EVENT_KEY}`,
-  FOCUSIN    : `focusin${EVENT_KEY}`,
-  FOCUSOUT   : `focusout${EVENT_KEY}`,
-  MOUSEENTER : `mouseenter${EVENT_KEY}`,
-  MOUSELEAVE : `mouseleave${EVENT_KEY}`
+  HIDE: `hide${EVENT_KEY}`,
+  HIDDEN: `hidden${EVENT_KEY}`,
+  SHOW: `show${EVENT_KEY}`,
+  SHOWN: `shown${EVENT_KEY}`,
+  INSERTED: `inserted${EVENT_KEY}`,
+  CLICK: `click${EVENT_KEY}`,
+  FOCUSIN: `focusin${EVENT_KEY}`,
+  FOCUSOUT: `focusout${EVENT_KEY}`,
+  MOUSEENTER: `mouseenter${EVENT_KEY}`,
+  MOUSELEAVE: `mouseleave${EVENT_KEY}`
 }
 
 const CLASS_NAME_FADE = 'fade'
 const CLASS_NAME_SHOW = 'show'
 
 const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'
-const SELECTOR_ARROW         = '.arrow'
+const SELECTOR_ARROW = '.arrow'
 
-const TRIGGER_HOVER  = 'hover'
-const TRIGGER_FOCUS  = 'focus'
-const TRIGGER_CLICK  = 'click'
+const TRIGGER_HOVER = 'hover'
+const TRIGGER_FOCUS = 'focus'
+const TRIGGER_CLICK = 'click'
 const TRIGGER_MANUAL = 'manual'
 
 /**
@@ -112,20 +114,20 @@ const TRIGGER_MANUAL = 'manual'
 class Tooltip {
   constructor(element, config) {
     if (typeof Popper === 'undefined') {
-      throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)')
+      throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)')
     }
 
     // private
-    this._isEnabled     = true
-    this._timeout       = 0
-    this._hoverState    = ''
+    this._isEnabled = true
+    this._timeout = 0
+    this._hoverState = ''
     this._activeTrigger = {}
-    this._popper        = null
+    this._popper = null
 
     // Protected
     this.element = element
-    this.config  = this._getConfig(config)
-    this.tip     = null
+    this.config = this._getConfig(config)
+    this.tip = null
 
     this._setListeners()
   }
@@ -220,9 +222,9 @@ class Tooltip {
       $(this.tip).remove()
     }
 
-    this._isEnabled     = null
-    this._timeout       = null
-    this._hoverState    = null
+    this._isEnabled = null
+    this._timeout = null
+    this._hoverState = null
     this._activeTrigger = null
     if (this._popper) {
       this._popper.destroy()
@@ -230,8 +232,8 @@ class Tooltip {
 
     this._popper = null
     this.element = null
-    this.config  = null
-    this.tip     = null
+    this.config = null
+    this.tip = null
   }
 
   show() {
@@ -253,7 +255,7 @@ class Tooltip {
         return
       }
 
-      const tip   = this.getTipElement()
+      const tip = this.getTipElement()
       const tipId = Util.getUID(this.constructor.NAME)
 
       tip.setAttribute('id', tipId)
@@ -265,9 +267,9 @@ class Tooltip {
         $(tip).addClass(CLASS_NAME_FADE)
       }
 
-      const placement  = typeof this.config.placement === 'function'
-        ? this.config.placement.call(this, tip, this.element)
-        : this.config.placement
+      const placement = typeof this.config.placement === 'function' ?
+        this.config.placement.call(this, tip, this.element) :
+        this.config.placement
 
       const attachment = this._getAttachment(placement)
       this.addAttachmentClass(attachment)
@@ -284,6 +286,7 @@ class Tooltip {
       this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))
 
       $(tip).addClass(CLASS_NAME_SHOW)
+      $(tip).addClass(this.config.customClass)
 
       // If this is a touch-enabled device we add extra
       // empty mouseover listeners to the body's immediate children;
@@ -297,8 +300,9 @@ class Tooltip {
         if (this.config.animation) {
           this._fixTransition()
         }
+
         const prevHoverState = this._hoverState
-        this._hoverState     = null
+        this._hoverState = null
 
         $(this.element).trigger(this.constructor.Event.SHOWN)
 
@@ -320,7 +324,7 @@ class Tooltip {
   }
 
   hide(callback) {
-    const tip       = this.getTipElement()
+    const tip = this.getTipElement()
     const hideEvent = $.Event(this.constructor.Event.HIDE)
     const complete = () => {
       if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
@@ -426,9 +430,9 @@ class Tooltip {
     let title = this.element.getAttribute('data-original-title')
 
     if (!title) {
-      title = typeof this.config.title === 'function'
-        ? this.config.title.call(this.element)
-        : this.config.title
+      title = typeof this.config.title === 'function' ?
+        this.config.title.call(this.element) :
+        this.config.title
     }
 
     return title
@@ -451,12 +455,12 @@ class Tooltip {
           boundariesElement: this.config.boundary
         }
       },
-      onCreate: (data) => {
+      onCreate: data => {
         if (data.originalPlacement !== data.placement) {
           this._handlePopperPlacementChange(data)
         }
       },
-      onUpdate: (data) => this._handlePopperPlacementChange(data)
+      onUpdate: data => this._handlePopperPlacementChange(data)
     }
 
     return {
@@ -469,10 +473,10 @@ class Tooltip {
     const offset = {}
 
     if (typeof this.config.offset === 'function') {
-      offset.fn = (data) => {
+      offset.fn = data => {
         data.offsets = {
           ...data.offsets,
-          ...this.config.offset(data.offsets, this.element) || {}
+          ...(this.config.offset(data.offsets, this.element) || {})
         }
 
         return data
@@ -503,24 +507,24 @@ class Tooltip {
   _setListeners() {
     const triggers = this.config.trigger.split(' ')
 
-    triggers.forEach((trigger) => {
+    triggers.forEach(trigger => {
       if (trigger === 'click') {
         $(this.element).on(
           this.constructor.Event.CLICK,
           this.config.selector,
-          (event) => this.toggle(event)
+          event => this.toggle(event)
         )
       } else if (trigger !== TRIGGER_MANUAL) {
-        const eventIn = trigger === TRIGGER_HOVER
-          ? this.constructor.Event.MOUSEENTER
-          : this.constructor.Event.FOCUSIN
-        const eventOut = trigger === TRIGGER_HOVER
-          ? this.constructor.Event.MOUSELEAVE
-          : this.constructor.Event.FOCUSOUT
+        const eventIn = trigger === TRIGGER_HOVER ?
+          this.constructor.Event.MOUSEENTER :
+          this.constructor.Event.FOCUSIN
+        const eventOut = trigger === TRIGGER_HOVER ?
+          this.constructor.Event.MOUSELEAVE :
+          this.constructor.Event.FOCUSOUT
 
         $(this.element)
-          .on(eventIn, this.config.selector, (event) => this._enter(event))
-          .on(eventOut, this.config.selector, (event) => this._leave(event))
+          .on(eventIn, this.config.selector, event => this._enter(event))
+          .on(eventOut, this.config.selector, event => this._leave(event))
       }
     })
 
@@ -647,7 +651,7 @@ class Tooltip {
     const dataAttributes = $(this.element).data()
 
     Object.keys(dataAttributes)
-      .forEach((dataAttr) => {
+      .forEach(dataAttr => {
         if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
           delete dataAttributes[dataAttr]
         }
@@ -656,7 +660,7 @@ class Tooltip {
     config = {
       ...this.constructor.Default,
       ...dataAttributes,
-      ...typeof config === 'object' && config ? config : {}
+      ...(typeof config === 'object' && config ? config : {})
     }
 
     if (typeof config.delay === 'number') {
@@ -734,7 +738,8 @@ class Tooltip {
 
   static _jQueryInterface(config) {
     return this.each(function () {
-      let data = $(this).data(DATA_KEY)
+      const $element = $(this)
+      let data = $element.data(DATA_KEY)
       const _config = typeof config === 'object' && config
 
       if (!data && /dispose|hide/.test(config)) {
@@ -743,13 +748,14 @@ class Tooltip {
 
       if (!data) {
         data = new Tooltip(this, _config)
-        $(this).data(DATA_KEY, data)
+        $element.data(DATA_KEY, data)
       }
 
       if (typeof config === 'string') {
         if (typeof data[config] === 'undefined') {
           throw new TypeError(`No method named "${config}"`)
         }
+
         data[config]()
       }
     })

+ 7 - 7
coderedcms/static/coderedcms/vendor/bootstrap/js/src/util.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.5.1): util.js
+ * Bootstrap (v4.6.0): util.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -34,6 +34,7 @@ function getSpecialTransitionEndEvent() {
       if ($(event.target).is(this)) {
         return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
       }
+
       return undefined
     }
   }
@@ -71,9 +72,9 @@ const Util = {
 
   getUID(prefix) {
     do {
-      // eslint-disable-next-line no-bitwise
       prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
     } while (document.getElementById(prefix))
+
     return prefix
   },
 
@@ -87,7 +88,7 @@ const Util = {
 
     try {
       return document.querySelector(selector) ? selector : null
-    } catch (err) {
+    } catch (_) {
       return null
     }
   },
@@ -124,7 +125,6 @@ const Util = {
     $(element).trigger(TRANSITION_END)
   },
 
-  // TODO: Remove in v5
   supportsTransitionEnd() {
     return Boolean(TRANSITION_END)
   },
@@ -137,9 +137,9 @@ const Util = {
     for (const property in configTypes) {
       if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
         const expectedTypes = configTypes[property]
-        const value         = config[property]
-        const valueType     = value && Util.isElement(value)
-          ? 'element' : toType(value)
+        const value = config[property]
+        const valueType = value && Util.isElement(value) ?
+          'element' : toType(value)
 
         if (!new RegExp(expectedTypes).test(valueType)) {
           throw new Error(

+ 1 - 0
coderedcms/static/coderedcms/vendor/bootstrap/scss/_alert.scss

@@ -34,6 +34,7 @@
     position: absolute;
     top: 0;
     right: 0;
+    z-index: 2;
     padding: $alert-padding-y $alert-padding-x;
     color: inherit;
   }

+ 1 - 3
coderedcms/static/coderedcms/vendor/bootstrap/scss/_breadcrumb.scss

@@ -10,14 +10,12 @@
 }
 
 .breadcrumb-item {
-  display: flex;
-
   // The separator between breadcrumbs (by default, a forward-slash: "/")
   + .breadcrumb-item {
     padding-left: $breadcrumb-item-padding;
 
     &::before {
-      display: inline-block; // Suppress underlining of the separator in modern browsers
+      float: left; // Suppress inline spacings and underlining of the separator
       padding-right: $breadcrumb-item-padding;
       color: $breadcrumb-divider-color;
       content: escape-svg($breadcrumb-divider);

+ 4 - 4
coderedcms/static/coderedcms/vendor/bootstrap/scss/_card.scss

@@ -206,12 +206,12 @@
 
           .card-img-top,
           .card-header {
-            // stylelint-disable-next-line property-blacklist
+            // stylelint-disable-next-line property-disallowed-list
             border-top-right-radius: 0;
           }
           .card-img-bottom,
           .card-footer {
-            // stylelint-disable-next-line property-blacklist
+            // stylelint-disable-next-line property-disallowed-list
             border-bottom-right-radius: 0;
           }
         }
@@ -221,12 +221,12 @@
 
           .card-img-top,
           .card-header {
-            // stylelint-disable-next-line property-blacklist
+            // stylelint-disable-next-line property-disallowed-list
             border-top-left-radius: 0;
           }
           .card-img-bottom,
           .card-footer {
-            // stylelint-disable-next-line property-blacklist
+            // stylelint-disable-next-line property-disallowed-list
             border-bottom-left-radius: 0;
           }
         }

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/_carousel.scss

@@ -127,7 +127,7 @@
   display: inline-block;
   width: $carousel-control-icon-width;
   height: $carousel-control-icon-width;
-  background: no-repeat 50% / 100% 100%;
+  background: 50% / 100% 100% no-repeat;
 }
 .carousel-control-prev-icon {
   background-image: escape-svg($carousel-control-prev-icon-bg);

+ 9 - 6
coderedcms/static/coderedcms/vendor/bootstrap/scss/_custom-forms.scss

@@ -13,6 +13,7 @@
   display: block;
   min-height: $font-size-base * $line-height-base;
   padding-left: $custom-control-gutter + $custom-control-indicator-size;
+  color-adjust: exact; // Keep themed appearance for print
 }
 
 .custom-control-inline {
@@ -38,7 +39,7 @@
   &:focus ~ .custom-control-label::before {
     // the mixin is not used here to make sure there is feedback
     @if $enable-shadows {
-      box-shadow: $input-box-shadow, $input-focus-box-shadow;
+      box-shadow: $input-box-shadow, $custom-control-indicator-focus-box-shadow;
     } @else {
       box-shadow: $custom-control-indicator-focus-box-shadow;
     }
@@ -103,7 +104,7 @@
     width: $custom-control-indicator-size;
     height: $custom-control-indicator-size;
     content: "";
-    background: no-repeat 50% / #{$custom-control-indicator-bg-size};
+    background: 50% / #{$custom-control-indicator-bg-size} no-repeat;
   }
 }
 
@@ -150,7 +151,7 @@
 
 .custom-radio {
   .custom-control-label::before {
-    // stylelint-disable-next-line property-blacklist
+    // stylelint-disable-next-line property-disallowed-list
     border-radius: $custom-radio-indicator-border-radius;
   }
 
@@ -180,7 +181,7 @@
       left: -($custom-switch-width + $custom-control-gutter);
       width: $custom-switch-width;
       pointer-events: all;
-      // stylelint-disable-next-line property-blacklist
+      // stylelint-disable-next-line property-disallowed-list
       border-radius: $custom-switch-indicator-border-radius;
     }
 
@@ -190,7 +191,7 @@
       width: $custom-switch-indicator-size;
       height: $custom-switch-indicator-size;
       background-color: $custom-control-indicator-border-color;
-      // stylelint-disable-next-line property-blacklist
+      // stylelint-disable-next-line property-disallowed-list
       border-radius: $custom-switch-indicator-border-radius;
       @include transition(transform .15s ease-in-out, $custom-forms-transition);
     }
@@ -314,6 +315,7 @@
   width: 100%;
   height: $custom-file-height;
   margin: 0;
+  overflow: hidden;
   opacity: 0;
 
   &:focus ~ .custom-file-label {
@@ -346,6 +348,7 @@
   z-index: 1;
   height: $custom-file-height;
   padding: $custom-file-padding-y $custom-file-padding-x;
+  overflow: hidden;
   font-family: $custom-file-font-family;
   font-weight: $custom-file-font-weight;
   line-height: $custom-file-line-height;
@@ -387,7 +390,7 @@
   appearance: none;
 
   &:focus {
-    outline: none;
+    outline: 0;
 
     // Pseudo-elements must be split across multiple rulesets to have an effect.
     // No box-shadow() mixin for focus accessibility.

+ 2 - 2
coderedcms/static/coderedcms/vendor/bootstrap/scss/_dropdown.scss

@@ -22,7 +22,7 @@
   display: none; // none by default, but block on "open" of the menu
   float: left;
   min-width: $dropdown-min-width;
-  padding: $dropdown-padding-y 0;
+  padding: $dropdown-padding-y $dropdown-padding-x;
   margin: $dropdown-spacer 0 0; // override default ul
   @include font-size($dropdown-font-size);
   color: $dropdown-color;
@@ -100,7 +100,7 @@
   }
 }
 
-// When enabled Popper.js, reset basic dropdown position
+// When Popper is enabled, reset the basic dropdown position
 // stylelint-disable-next-line no-duplicate-selectors
 .dropdown-menu {
   &[x-placement^="top"],

+ 3 - 0
coderedcms/static/coderedcms/vendor/bootstrap/scss/_functions.scss

@@ -51,6 +51,9 @@
 }
 
 // See https://codepen.io/kevinweber/pen/dXWoRw
+//
+// Requires the use of quotes around data URIs.
+
 @function escape-svg($string) {
   @if str-index($string, "data:image/svg+xml") {
     @each $char, $encoded in $escaped-characters {

+ 20 - 4
coderedcms/static/coderedcms/vendor/bootstrap/scss/_input-group.scss

@@ -42,7 +42,6 @@
 
   > .form-control,
   > .custom-select {
-    &:not(:last-child) { @include border-right-radius(0); }
     &:not(:first-child) { @include border-left-radius(0); }
   }
 
@@ -53,9 +52,24 @@
     align-items: center;
 
     &:not(:last-child) .custom-file-label,
-    &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
     &:not(:first-child) .custom-file-label { @include border-left-radius(0); }
   }
+
+  &:not(.has-validation) {
+    > .form-control:not(:last-child),
+    > .custom-select:not(:last-child),
+    > .custom-file:not(:last-child) .custom-file-label::after {
+      @include border-right-radius(0);
+    }
+  }
+
+  &.has-validation {
+    > .form-control:nth-last-child(n + 3),
+    > .custom-select:nth-last-child(n + 3),
+    > .custom-file:nth-last-child(n + 3) .custom-file-label::after {
+      @include border-right-radius(0);
+    }
+  }
 }
 
 
@@ -175,8 +189,10 @@
 
 .input-group > .input-group-prepend > .btn,
 .input-group > .input-group-prepend > .input-group-text,
-.input-group > .input-group-append:not(:last-child) > .btn,
-.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,
+.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,
+.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn,
+.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text,
 .input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
 .input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
   @include border-right-radius(0);

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/_list-group.scss

@@ -111,7 +111,7 @@
           margin-top: 0;
         }
 
-        & + .list-group-item {
+        + .list-group-item {
           border-top-width: $list-group-border-width;
           border-left-width: 0;
 

+ 1 - 4
coderedcms/static/coderedcms/vendor/bootstrap/scss/_nav.scss

@@ -35,11 +35,8 @@
 .nav-tabs {
   border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
 
-  .nav-item {
-    margin-bottom: -$nav-tabs-border-width;
-  }
-
   .nav-link {
+    margin-bottom: -$nav-tabs-border-width;
     border: $nav-tabs-border-width solid transparent;
     @include border-top-radius($nav-tabs-border-radius);
 

+ 10 - 2
coderedcms/static/coderedcms/vendor/bootstrap/scss/_navbar.scss

@@ -136,8 +136,12 @@
   height: 1.5em;
   vertical-align: middle;
   content: "";
-  background: no-repeat center center;
-  background-size: 100% 100%;
+  background: 50% / 100% 100% no-repeat;
+}
+
+.navbar-nav-scroll {
+  max-height: $navbar-nav-scroll-max-height;
+  overflow-y: auto;
 }
 
 // Generate series of `.navbar-expand-*` responsive classes for configuring
@@ -199,6 +203,10 @@
           }
         }
 
+        .navbar-nav-scroll {
+          overflow: visible;
+        }
+
         .navbar-collapse {
           display: flex !important; // stylelint-disable-line declaration-no-important
 

+ 2 - 2
coderedcms/static/coderedcms/vendor/bootstrap/scss/_pagination.scss

@@ -66,9 +66,9 @@
 //
 
 .pagination-lg {
-  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
+  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $pagination-border-radius-lg);
 }
 
 .pagination-sm {
-  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
+  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $pagination-border-radius-sm);
 }

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/_progress.scss

@@ -36,7 +36,7 @@
 
 @if $enable-transitions {
   .progress-bar-animated {
-    animation: progress-bar-stripes $progress-bar-animation-timing;
+    animation: $progress-bar-animation-timing progress-bar-stripes;
 
     @if $enable-prefers-reduced-motion-media-query {
       @media (prefers-reduced-motion: reduce) {

+ 16 - 12
coderedcms/static/coderedcms/vendor/bootstrap/scss/_reboot.scss

@@ -1,4 +1,4 @@
-// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
+// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
 
 // Reboot
 //
@@ -278,10 +278,14 @@ caption {
   caption-side: bottom;
 }
 
+// 1. Removes font-weight bold by inheriting
+// 2. Matches default `<td>` alignment by inheriting `text-align`.
+// 3. Fix alignment for Safari
+
 th {
-  // Matches default `<td>` alignment by inheriting from the `<body>`, or the
-  // closest parent with a set `text-align`.
-  text-align: inherit;
+  font-weight: $table-th-font-weight; // 1
+  text-align: inherit; // 2
+  text-align: -webkit-match-parent; // 3
 }
 
 
@@ -299,17 +303,17 @@ label {
 //
 // Details at https://github.com/twbs/bootstrap/issues/24093
 button {
-  // stylelint-disable-next-line property-blacklist
+  // stylelint-disable-next-line property-disallowed-list
   border-radius: 0;
 }
 
-// Work around a Firefox/IE bug where the transparent `button` background
-// results in a loss of the default `button` focus styles.
-//
-// Credit: https://github.com/suitcss/base/
-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
+// Explicitly remove focus outline in Chromium when it shouldn't be
+// visible (e.g. as result of mouse click or touch tap). It already
+// should be doing this automatically, but seems to currently be
+// confused and applies its very visible two-tone outline anyway.
+
+button:focus:not(:focus-visible) {
+  outline: 0;
 }
 
 input,

+ 0 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/_root.scss

@@ -1,4 +1,3 @@
-// Do not forget to update getting-started/theming.md!
 :root {
   // Custom variable values only support SassScript inside `#{}`.
   @each $color, $value in $colors {

+ 13 - 4
coderedcms/static/coderedcms/vendor/bootstrap/scss/_spinners.scss

@@ -13,9 +13,9 @@
   vertical-align: text-bottom;
   border: $spinner-border-width solid currentColor;
   border-right-color: transparent;
-  // stylelint-disable-next-line property-blacklist
+  // stylelint-disable-next-line property-disallowed-list
   border-radius: 50%;
-  animation: spinner-border .75s linear infinite;
+  animation: .75s linear infinite spinner-border;
 }
 
 .spinner-border-sm {
@@ -44,13 +44,22 @@
   height: $spinner-height;
   vertical-align: text-bottom;
   background-color: currentColor;
-  // stylelint-disable-next-line property-blacklist
+  // stylelint-disable-next-line property-disallowed-list
   border-radius: 50%;
   opacity: 0;
-  animation: spinner-grow .75s linear infinite;
+  animation: .75s linear infinite spinner-grow;
 }
 
 .spinner-grow-sm {
   width: $spinner-width-sm;
   height: $spinner-height-sm;
 }
+
+@if $enable-prefers-reduced-motion-media-query {
+  @media (prefers-reduced-motion: reduce) {
+    .spinner-border,
+    .spinner-grow {
+      animation-duration: 1.5s;
+    }
+  }
+}

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/_type.scss

@@ -1,4 +1,4 @@
-// stylelint-disable declaration-no-important, selector-list-comma-newline-after
+// stylelint-disable selector-list-comma-newline-after
 
 //
 // Headings

+ 10 - 4
coderedcms/static/coderedcms/vendor/bootstrap/scss/_variables.scss

@@ -274,7 +274,7 @@ $embed-responsive-aspect-ratios: join(
 // Font, line-height, and color for body text, headings, and more.
 
 // stylelint-disable value-keyword-case
-$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
+$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
 $font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
 $font-family-base:            $font-family-sans-serif !default;
 // stylelint-enable value-keyword-case
@@ -363,6 +363,7 @@ $table-border-color:          $border-color !default;
 
 $table-head-bg:               $gray-200 !default;
 $table-head-color:            $gray-700 !default;
+$table-th-font-weight:        null !default;
 
 $table-dark-color:            $white !default;
 $table-dark-bg:               $gray-800 !default;
@@ -582,7 +583,7 @@ $custom-select-disabled-bg:         $gray-200 !default;
 $custom-select-bg-size:             8px 10px !default; // In pixels because image dimensions
 $custom-select-indicator-color:     $gray-800 !default;
 $custom-select-indicator:           url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>") !default;
-$custom-select-background:          escape-svg($custom-select-indicator) no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)
+$custom-select-background:          escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)
 
 $custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;
 $custom-select-feedback-icon-position:      center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;
@@ -730,6 +731,8 @@ $navbar-toggler-padding-x:          .75rem !default;
 $navbar-toggler-font-size:          $font-size-lg !default;
 $navbar-toggler-border-radius:      $btn-border-radius !default;
 
+$navbar-nav-scroll-max-height:      75vh !default;
+
 $navbar-dark-color:                 rgba($white, .5) !default;
 $navbar-dark-hover-color:           rgba($white, .75) !default;
 $navbar-dark-active-color:          $white !default;
@@ -755,6 +758,7 @@ $navbar-dark-brand-hover-color:           $navbar-dark-active-color !default;
 // Dropdown menu container and contents.
 
 $dropdown-min-width:                10rem !default;
+$dropdown-padding-x:                0 !default;
 $dropdown-padding-y:                .5rem !default;
 $dropdown-spacer:                   .125rem !default;
 $dropdown-font-size:                $font-size-base !default;
@@ -770,12 +774,12 @@ $dropdown-box-shadow:               0 .5rem 1rem rgba($black, .175) !default;
 
 $dropdown-link-color:               $gray-900 !default;
 $dropdown-link-hover-color:         darken($gray-900, 5%) !default;
-$dropdown-link-hover-bg:            $gray-100 !default;
+$dropdown-link-hover-bg:            $gray-200 !default;
 
 $dropdown-link-active-color:        $component-active-color !default;
 $dropdown-link-active-bg:           $component-active-bg !default;
 
-$dropdown-link-disabled-color:      $gray-600 !default;
+$dropdown-link-disabled-color:      $gray-500 !default;
 
 $dropdown-item-padding-y:           .25rem !default;
 $dropdown-item-padding-x:           1.5rem !default;
@@ -814,6 +818,8 @@ $pagination-disabled-color:         $gray-600 !default;
 $pagination-disabled-bg:            $white !default;
 $pagination-disabled-border-color:  $gray-300 !default;
 
+$pagination-border-radius-sm:       $border-radius-sm !default;
+$pagination-border-radius-lg:       $border-radius-lg !default;
 
 // Jumbotron
 

+ 4 - 3
coderedcms/static/coderedcms/vendor/bootstrap/scss/bootstrap-grid.scss

@@ -1,7 +1,7 @@
 /*!
- * Bootstrap Grid v4.5.1 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap Grid v4.6.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
 
@@ -19,6 +19,7 @@ html {
 @import "functions";
 @import "variables";
 
+@import "mixins/deprecate";
 @import "mixins/breakpoints";
 @import "mixins/grid-framework";
 @import "mixins/grid";

+ 3 - 3
coderedcms/static/coderedcms/vendor/bootstrap/scss/bootstrap-reboot.scss

@@ -1,7 +1,7 @@
 /*!
- * Bootstrap Reboot v4.5.1 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
  */

+ 3 - 3
coderedcms/static/coderedcms/vendor/bootstrap/scss/bootstrap.scss

@@ -1,7 +1,7 @@
 /*!
- * Bootstrap v4.5.1 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
+ * Bootstrap v4.6.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
 

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_border-radius.scss

@@ -1,4 +1,4 @@
-// stylelint-disable property-blacklist
+// stylelint-disable property-disallowed-list
 // Single side border-radius
 
 // Helper function to replace negative values with 0

+ 8 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_forms.scss

@@ -64,6 +64,13 @@
     color: color-yiq($color);
     background-color: rgba($color, $form-feedback-tooltip-opacity);
     @include border-radius($form-feedback-tooltip-border-radius);
+
+    // See https://github.com/twbs/bootstrap/pull/31557
+    // Align tooltip to form elements
+    .form-row > .col > &,
+    .form-row > [class*="col-"] > & {
+      left: $form-grid-gutter-width / 2;
+    }
   }
 
   @include form-validation-state-selector($state) {
@@ -108,7 +115,7 @@
 
       @if $enable-validation-icons {
         padding-right: $custom-select-feedback-icon-padding-right;
-        background: $custom-select-background, escape-svg($icon) $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;
+        background: $custom-select-background, $custom-select-bg escape-svg($icon) $custom-select-feedback-icon-position / $custom-select-feedback-icon-size no-repeat;
       }
 
       &:focus {

+ 11 - 2
coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_grid.scss

@@ -12,12 +12,21 @@
 
 @mixin make-row($gutter: $grid-gutter-width) {
   display: flex;
-  flex: 1 0 100%;
   flex-wrap: wrap;
   margin-right: -$gutter / 2;
   margin-left: -$gutter / 2;
 }
 
+// For each breakpoint, define the maximum width of the container in a media query
+@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {
+  @each $breakpoint, $container-max-width in $max-widths {
+    @include media-breakpoint-up($breakpoint, $breakpoints) {
+      max-width: $container-max-width;
+    }
+  }
+  @include deprecate("The `make-container-max-widths` mixin", "v4.5.2", "v5");
+}
+
 @mixin make-col-ready($gutter: $grid-gutter-width) {
   position: relative;
   // Prevent columns from becoming too narrow when at smaller grid tiers by
@@ -53,7 +62,7 @@
 // numberof columns. Supports wrapping to new lines, but does not do a Masonry
 // style grid.
 @mixin row-cols($count) {
-  & > * {
+  > * {
     flex: 0 0 100% / $count;
     max-width: 100% / $count;
   }

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_image.scss

@@ -26,7 +26,7 @@
   // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,
   // but doesn't convert dppx=>dpi.
   // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.
-  // Compatibility info: https://caniuse.com/#feat=css-media-resolution
+  // Compatibility info: https://caniuse.com/css-media-resolution
   @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx
     only screen and (min-resolution: 2dppx) { // Standardized
     background-image: url($file-2x);

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_screen-reader.scss

@@ -1,6 +1,6 @@
 // Only display content to screen readers
 //
-// See: https://a11yproject.com/posts/how-to-hide-content/
+// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
 // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
 
 @mixin sr-only() {

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/mixins/_transition.scss

@@ -1,4 +1,4 @@
-// stylelint-disable property-blacklist
+// stylelint-disable property-disallowed-list
 @mixin transition($transition...) {
   @if length($transition) == 0 {
     $transition: $transition-base;

+ 1 - 1
coderedcms/static/coderedcms/vendor/bootstrap/scss/utilities/_borders.scss

@@ -1,4 +1,4 @@
-// stylelint-disable property-blacklist, declaration-no-important
+// stylelint-disable property-disallowed-list, declaration-no-important
 
 //
 // Border

+ 2 - 2
coderedcms/static/coderedcms/vendor/bootstrap/scss/utilities/_text.scss

@@ -63,8 +63,8 @@
 .text-decoration-none { text-decoration: none !important; }
 
 .text-break {
-  word-break: break-word !important; // IE & < Edge 18
-  overflow-wrap: break-word !important;
+  word-break: break-word !important; // Deprecated, but avoids issues with flex containers
+  word-wrap: break-word !important; // Used instead of `overflow-wrap` for IE & Edge Legacy
 }
 
 // Reset

+ 1 - 1
coderedcms/templates/coderedcms/pages/base.html

@@ -68,7 +68,7 @@
 
         {% block frontend_assets %}
             {% if settings.coderedcms.LayoutSettings.frontend_theme %}
-            <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/4.5.1/{{settings.coderedcms.LayoutSettings.frontend_theme}}/bootstrap.min.css" />
+            <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/4.6.0/{{settings.coderedcms.LayoutSettings.frontend_theme}}/bootstrap.min.css" />
             {% else %}
             <link rel="stylesheet" href="{% static 'coderedcms/vendor/bootstrap/dist/css/bootstrap.min.css' %}" />
             {% endif %}

部分文件因文件數量過多而無法顯示