@@ -27,11 +28,4 @@ const Tab = ({
);
};
-Tab.propTypes = {
- activeTabLabel: PropTypes.string.isRequired,
- label: PropTypes.string.isRequired,
- onClick: PropTypes.func.isRequired,
- title: PropTypes.string,
-};
-
export default Tab;
diff --git a/client/src/components/ui/Tabler.css b/client/src/components/ui/Tabler.css
index d49810e2..ba0760bb 100644
--- a/client/src/components/ui/Tabler.css
+++ b/client/src/components/ui/Tabler.css
@@ -42,8 +42,9 @@ Dashboard UI
--breakpoint-md: 768px;
--breakpoint-lg: 992px;
--breakpoint-xl: 1280px;
- --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
- --font-family-monospace: Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --font-family-sans-serif: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+ --font-family-monospace: Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
}
*,
@@ -81,7 +82,7 @@ section {
body {
margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
font-size: 0.9375rem;
font-weight: 400;
line-height: 1.5;
@@ -90,7 +91,7 @@ body {
background-color: var(--bgcolor);
}
-[tabindex="-1"]:focus {
+[tabindex='-1']:focus {
outline: 0 !important;
}
@@ -190,7 +191,7 @@ a {
color: #467fcf;
text-decoration: none;
background-color: transparent;
- -webkittext-decoration-skip-ink: objects
+ -webkittext-decoration-skip-ink: objects;
}
a:hover {
@@ -293,30 +294,30 @@ select {
}
button,
-html [type="button"],
-[type="reset"],
-[type="submit"] {
+html [type='button'],
+[type='reset'],
+[type='submit'] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
padding: 0;
border-style: none;
}
-input[type="radio"],
-input[type="checkbox"] {
+input[type='radio'],
+input[type='checkbox'] {
box-sizing: border-box;
padding: 0;
}
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
-webkit-appearance: listbox;
}
@@ -348,18 +349,18 @@ progress {
vertical-align: baseline;
}
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
height: auto;
}
-[type="search"] {
+[type='search'] {
outline-offset: -2px;
-webkit-appearance: none;
}
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
-webkit-appearance: none;
}
@@ -470,7 +471,7 @@ hr {
border-top: 1px solid rgba(0, 40, 100, 0.12);
}
-[data-theme=dark] hr {
+[data-theme='dark'] hr {
border-color: var(--card-border-color);
}
@@ -521,7 +522,7 @@ mark,
}
.blockquote-footer::before {
- content: "\2014 \00A0";
+ content: '\2014 \00A0';
}
.img-fluid {
@@ -556,7 +557,7 @@ code,
kbd,
pre,
samp {
- font-family: Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-family: Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
}
code {
@@ -565,7 +566,7 @@ code {
word-break: break-word;
}
-a>code {
+a > code {
color: inherit;
}
@@ -654,8 +655,8 @@ pre code {
margin-left: 0;
}
-.no-gutters>.col,
-.no-gutters>[class*="col-"] {
+.no-gutters > .col,
+.no-gutters > [class*='col-'] {
padding-right: 0;
padding-left: 0;
}
@@ -1654,8 +1655,8 @@ pre code {
border-bottom: 2px solid #dee2e6;
}
-.table tbody+tbody,
-.text-wrap table tbody+tbody {
+.table tbody + tbody,
+.text-wrap table tbody + tbody {
border-top: 2px solid #dee2e6;
}
@@ -1700,8 +1701,8 @@ pre code {
}
.table-primary,
-.table-primary>th,
-.table-primary>td {
+.table-primary > th,
+.table-primary > td {
background-color: #cbdbf2;
}
@@ -1709,14 +1710,14 @@ pre code {
background-color: #b7cded;
}
-.table-hover .table-primary:hover>td,
-.table-hover .table-primary:hover>th {
+.table-hover .table-primary:hover > td,
+.table-hover .table-primary:hover > th {
background-color: #b7cded;
}
.table-secondary,
-.table-secondary>th,
-.table-secondary>td {
+.table-secondary > th,
+.table-secondary > td {
background-color: #dddfe2;
}
@@ -1724,14 +1725,14 @@ pre code {
background-color: #cfd2d6;
}
-.table-hover .table-secondary:hover>td,
-.table-hover .table-secondary:hover>th {
+.table-hover .table-secondary:hover > td,
+.table-hover .table-secondary:hover > th {
background-color: #cfd2d6;
}
.table-success,
-.table-success>th,
-.table-success>td {
+.table-success > th,
+.table-success > td {
background-color: #d2ecb8;
}
@@ -1739,14 +1740,14 @@ pre code {
background-color: #c5e7a4;
}
-.table-hover .table-success:hover>td,
-.table-hover .table-success:hover>th {
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
background-color: #c5e7a4;
}
.table-info,
-.table-info>th,
-.table-info>td {
+.table-info > th,
+.table-info > td {
background-color: #cbe7fb;
}
@@ -1754,14 +1755,14 @@ pre code {
background-color: #b3dcf9;
}
-.table-hover .table-info:hover>td,
-.table-hover .table-info:hover>th {
+.table-hover .table-info:hover > td,
+.table-hover .table-info:hover > th {
background-color: #b3dcf9;
}
.table-warning,
-.table-warning>th,
-.table-warning>td {
+.table-warning > th,
+.table-warning > td {
background-color: #fbeebc;
}
@@ -1769,14 +1770,14 @@ pre code {
background-color: #fae8a4;
}
-.table-hover .table-warning:hover>td,
-.table-hover .table-warning:hover>th {
+.table-hover .table-warning:hover > td,
+.table-hover .table-warning:hover > th {
background-color: #fae8a4;
}
.table-danger,
-.table-danger>th,
-.table-danger>td {
+.table-danger > th,
+.table-danger > td {
background-color: #f1c1c0;
}
@@ -1784,14 +1785,14 @@ pre code {
background-color: #ecacab;
}
-.table-hover .table-danger:hover>td,
-.table-hover .table-danger:hover>th {
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
background-color: #ecacab;
}
.table-light,
-.table-light>th,
-.table-light>td {
+.table-light > th,
+.table-light > td {
background-color: #fdfdfe;
}
@@ -1799,14 +1800,14 @@ pre code {
background-color: #ececf6;
}
-.table-hover .table-light:hover>td,
-.table-hover .table-light:hover>th {
+.table-hover .table-light:hover > td,
+.table-hover .table-light:hover > th {
background-color: #ececf6;
}
.table-dark,
-.table-dark>th,
-.table-dark>td {
+.table-dark > th,
+.table-dark > td {
background-color: #c6c8ca;
}
@@ -1814,14 +1815,14 @@ pre code {
background-color: #b9bbbe;
}
-.table-hover .table-dark:hover>td,
-.table-hover .table-dark:hover>th {
+.table-hover .table-dark:hover > td,
+.table-hover .table-dark:hover > th {
background-color: #b9bbbe;
}
.table-active,
-.table-active>th,
-.table-active>td {
+.table-active > th,
+.table-active > td {
background-color: rgba(0, 0, 0, 0.04);
}
@@ -1829,8 +1830,8 @@ pre code {
background-color: rgba(0, 0, 0, 0.04);
}
-.table-hover .table-active:hover>td,
-.table-hover .table-active:hover>th {
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
background-color: rgba(0, 0, 0, 0.04);
}
@@ -1880,8 +1881,8 @@ pre code {
-webkit-overflow-scrolling: touch;
-ms-overflow-style: -ms-autohiding-scrollbar;
}
- .table-responsive-sm>.table-bordered,
- .text-wrap .table-responsive-sm>table {
+ .table-responsive-sm > .table-bordered,
+ .text-wrap .table-responsive-sm > table {
border: 0;
}
}
@@ -1894,8 +1895,8 @@ pre code {
-webkit-overflow-scrolling: touch;
-ms-overflow-style: -ms-autohiding-scrollbar;
}
- .table-responsive-md>.table-bordered,
- .text-wrap .table-responsive-md>table {
+ .table-responsive-md > .table-bordered,
+ .text-wrap .table-responsive-md > table {
border: 0;
}
}
@@ -1908,8 +1909,8 @@ pre code {
-webkit-overflow-scrolling: touch;
-ms-overflow-style: -ms-autohiding-scrollbar;
}
- .table-responsive-lg>.table-bordered,
- .text-wrap .table-responsive-lg>table {
+ .table-responsive-lg > .table-bordered,
+ .text-wrap .table-responsive-lg > table {
border: 0;
}
}
@@ -1922,8 +1923,8 @@ pre code {
-webkit-overflow-scrolling: touch;
-ms-overflow-style: -ms-autohiding-scrollbar;
}
- .table-responsive-xl>.table-bordered,
- .text-wrap .table-responsive-xl>table {
+ .table-responsive-xl > .table-bordered,
+ .text-wrap .table-responsive-xl > table {
border: 0;
}
}
@@ -1936,8 +1937,8 @@ pre code {
-ms-overflow-style: -ms-autohiding-scrollbar;
}
-.table-responsive>.table-bordered,
-.text-wrap .table-responsive>table {
+.table-responsive > .table-bordered,
+.text-wrap .table-responsive > table {
border: 0;
}
@@ -1952,7 +1953,9 @@ pre code {
background-clip: padding-box;
border: 1px solid var(--card-border-color);
border-radius: 3px;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition:
+ border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
}
.form-control::-ms-expand {
@@ -2050,27 +2053,27 @@ select.form-control:focus::-ms-value {
}
.form-control-plaintext.form-control-sm,
-.input-group-sm>.form-control-plaintext.form-control,
-.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text,
-.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,
-.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,
-.input-group-sm>.input-group-append>.form-control-plaintext.btn,
+.input-group-sm > .form-control-plaintext.form-control,
+.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,
+.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,
+.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,
+.input-group-sm > .input-group-append > .form-control-plaintext.btn,
.form-control-plaintext.form-control-lg,
-.input-group-lg>.form-control-plaintext.form-control,
-.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,
-.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,
-.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,
-.input-group-lg>.input-group-append>.form-control-plaintext.btn {
+.input-group-lg > .form-control-plaintext.form-control,
+.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,
+.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,
+.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,
+.input-group-lg > .input-group-append > .form-control-plaintext.btn {
padding-right: 0;
padding-left: 0;
}
.form-control-sm,
-.input-group-sm>.form-control,
-.input-group-sm>.input-group-prepend>.input-group-text,
-.input-group-sm>.input-group-append>.input-group-text,
-.input-group-sm>.input-group-prepend>.btn,
-.input-group-sm>.input-group-append>.btn {
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-prepend > .input-group-text,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-append > .btn {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
line-height: 1.14285714;
@@ -2078,20 +2081,20 @@ select.form-control:focus::-ms-value {
}
select.form-control-sm:not([size]):not([multiple]),
-.input-group-sm>select.form-control:not([size]):not([multiple]),
-.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),
-.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),
-.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),
-.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]) {
+.input-group-sm > select.form-control:not([size]):not([multiple]),
+.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),
+.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),
+.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),
+.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {
height: calc(1.8125rem + 2px);
}
.form-control-lg,
-.input-group-lg>.form-control,
-.input-group-lg>.input-group-prepend>.input-group-text,
-.input-group-lg>.input-group-append>.input-group-text,
-.input-group-lg>.input-group-prepend>.btn,
-.input-group-lg>.input-group-append>.btn {
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-prepend > .input-group-text,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-append > .btn {
padding: 0.5rem 1rem;
font-size: 1.125rem;
line-height: 1.44444444;
@@ -2099,11 +2102,11 @@ select.form-control-sm:not([size]):not([multiple]),
}
select.form-control-lg:not([size]):not([multiple]),
-.input-group-lg>select.form-control:not([size]):not([multiple]),
-.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),
-.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),
-.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),
-.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]) {
+.input-group-lg > select.form-control:not([size]):not([multiple]),
+.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),
+.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),
+.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),
+.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {
height: calc(2.6875rem + 2px);
}
@@ -2125,8 +2128,8 @@ select.form-control-lg:not([size]):not([multiple]),
margin-left: -5px;
}
-.form-row>.col,
-.form-row>[class*="col-"] {
+.form-row > .col,
+.form-row > [class*='col-'] {
padding-right: 5px;
padding-left: 5px;
}
@@ -2143,7 +2146,7 @@ select.form-control-lg:not([size]):not([multiple]),
margin-left: -1.25rem;
}
-.form-check-input:disabled~.form-check-label {
+.form-check-input:disabled ~ .form-check-label {
color: #9aa0ac;
}
@@ -2205,75 +2208,77 @@ select.form-control-lg:not([size]):not([multiple]),
box-shadow: 0 0 0 2px rgba(94, 186, 0, 0.25);
}
-.was-validated .form-control:valid~.valid-feedback,
-.was-validated .form-control:valid~.valid-tooltip,
-.form-control.is-valid~.valid-feedback,
-.form-control.is-valid~.valid-tooltip,
-.was-validated .custom-select:valid~.valid-feedback,
-.was-validated .custom-select:valid~.valid-tooltip,
-.custom-select.is-valid~.valid-feedback,
-.custom-select.is-valid~.valid-tooltip {
+.was-validated .form-control:valid ~ .valid-feedback,
+.was-validated .form-control:valid ~ .valid-tooltip,
+.form-control.is-valid ~ .valid-feedback,
+.form-control.is-valid ~ .valid-tooltip,
+.was-validated .custom-select:valid ~ .valid-feedback,
+.was-validated .custom-select:valid ~ .valid-tooltip,
+.custom-select.is-valid ~ .valid-feedback,
+.custom-select.is-valid ~ .valid-tooltip {
display: block;
}
-.was-validated .form-check-input:valid~.form-check-label,
-.form-check-input.is-valid~.form-check-label {
+.was-validated .form-check-input:valid ~ .form-check-label,
+.form-check-input.is-valid ~ .form-check-label {
color: #5eba00;
}
-.was-validated .form-check-input:valid~.valid-feedback,
-.was-validated .form-check-input:valid~.valid-tooltip,
-.form-check-input.is-valid~.valid-feedback,
-.form-check-input.is-valid~.valid-tooltip {
+.was-validated .form-check-input:valid ~ .valid-feedback,
+.was-validated .form-check-input:valid ~ .valid-tooltip,
+.form-check-input.is-valid ~ .valid-feedback,
+.form-check-input.is-valid ~ .valid-tooltip {
display: block;
}
-.was-validated .custom-control-input:valid~.custom-control-label,
-.custom-control-input.is-valid~.custom-control-label {
+.was-validated .custom-control-input:valid ~ .custom-control-label,
+.custom-control-input.is-valid ~ .custom-control-label {
color: #5eba00;
}
-.was-validated .custom-control-input:valid~.custom-control-label::before,
-.custom-control-input.is-valid~.custom-control-label::before {
+.was-validated .custom-control-input:valid ~ .custom-control-label::before,
+.custom-control-input.is-valid ~ .custom-control-label::before {
background-color: #9eff3b;
}
-.was-validated .custom-control-input:valid~.valid-feedback,
-.was-validated .custom-control-input:valid~.valid-tooltip,
-.custom-control-input.is-valid~.valid-feedback,
-.custom-control-input.is-valid~.valid-tooltip {
+.was-validated .custom-control-input:valid ~ .valid-feedback,
+.was-validated .custom-control-input:valid ~ .valid-tooltip,
+.custom-control-input.is-valid ~ .valid-feedback,
+.custom-control-input.is-valid ~ .valid-tooltip {
display: block;
}
-.was-validated .custom-control-input:valid:checked~.custom-control-label::before,
-.custom-control-input.is-valid:checked~.custom-control-label::before {
+.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,
+.custom-control-input.is-valid:checked ~ .custom-control-label::before {
background-color: #78ed00;
}
-.was-validated .custom-control-input:valid:focus~.custom-control-label::before,
-.custom-control-input.is-valid:focus~.custom-control-label::before {
- box-shadow: 0 0 0 1px #f5f7fb, 0 0 0 2px rgba(94, 186, 0, 0.25);
+.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,
+.custom-control-input.is-valid:focus ~ .custom-control-label::before {
+ box-shadow:
+ 0 0 0 1px #f5f7fb,
+ 0 0 0 2px rgba(94, 186, 0, 0.25);
}
-.was-validated .custom-file-input:valid~.custom-file-label,
-.custom-file-input.is-valid~.custom-file-label {
+.was-validated .custom-file-input:valid ~ .custom-file-label,
+.custom-file-input.is-valid ~ .custom-file-label {
border-color: #5eba00;
}
-.was-validated .custom-file-input:valid~.custom-file-label::before,
-.custom-file-input.is-valid~.custom-file-label::before {
+.was-validated .custom-file-input:valid ~ .custom-file-label::before,
+.custom-file-input.is-valid ~ .custom-file-label::before {
border-color: inherit;
}
-.was-validated .custom-file-input:valid~.valid-feedback,
-.was-validated .custom-file-input:valid~.valid-tooltip,
-.custom-file-input.is-valid~.valid-feedback,
-.custom-file-input.is-valid~.valid-tooltip {
+.was-validated .custom-file-input:valid ~ .valid-feedback,
+.was-validated .custom-file-input:valid ~ .valid-tooltip,
+.custom-file-input.is-valid ~ .valid-feedback,
+.custom-file-input.is-valid ~ .valid-tooltip {
display: block;
}
-.was-validated .custom-file-input:valid:focus~.custom-file-label,
-.custom-file-input.is-valid:focus~.custom-file-label {
+.was-validated .custom-file-input:valid:focus ~ .custom-file-label,
+.custom-file-input.is-valid:focus ~ .custom-file-label {
box-shadow: 0 0 0 2px rgba(94, 186, 0, 0.25);
}
@@ -2315,75 +2320,77 @@ select.form-control-lg:not([size]):not([multiple]),
box-shadow: 0 0 0 2px rgba(205, 32, 31, 0.25);
}
-.was-validated .form-control:invalid~.invalid-feedback,
-.was-validated .form-control:invalid~.invalid-tooltip,
-.form-control.is-invalid~.invalid-feedback,
-.form-control.is-invalid~.invalid-tooltip,
-.was-validated .custom-select:invalid~.invalid-feedback,
-.was-validated .custom-select:invalid~.invalid-tooltip,
-.custom-select.is-invalid~.invalid-feedback,
-.custom-select.is-invalid~.invalid-tooltip {
+.was-validated .form-control:invalid ~ .invalid-feedback,
+.was-validated .form-control:invalid ~ .invalid-tooltip,
+.form-control.is-invalid ~ .invalid-feedback,
+.form-control.is-invalid ~ .invalid-tooltip,
+.was-validated .custom-select:invalid ~ .invalid-feedback,
+.was-validated .custom-select:invalid ~ .invalid-tooltip,
+.custom-select.is-invalid ~ .invalid-feedback,
+.custom-select.is-invalid ~ .invalid-tooltip {
display: block;
}
-.was-validated .form-check-input:invalid~.form-check-label,
-.form-check-input.is-invalid~.form-check-label {
+.was-validated .form-check-input:invalid ~ .form-check-label,
+.form-check-input.is-invalid ~ .form-check-label {
color: #cd201f;
}
-.was-validated .form-check-input:invalid~.invalid-feedback,
-.was-validated .form-check-input:invalid~.invalid-tooltip,
-.form-check-input.is-invalid~.invalid-feedback,
-.form-check-input.is-invalid~.invalid-tooltip {
+.was-validated .form-check-input:invalid ~ .invalid-feedback,
+.was-validated .form-check-input:invalid ~ .invalid-tooltip,
+.form-check-input.is-invalid ~ .invalid-feedback,
+.form-check-input.is-invalid ~ .invalid-tooltip {
display: block;
}
-.was-validated .custom-control-input:invalid~.custom-control-label,
-.custom-control-input.is-invalid~.custom-control-label {
+.was-validated .custom-control-input:invalid ~ .custom-control-label,
+.custom-control-input.is-invalid ~ .custom-control-label {
color: #cd201f;
}
-.was-validated .custom-control-input:invalid~.custom-control-label::before,
-.custom-control-input.is-invalid~.custom-control-label::before {
+.was-validated .custom-control-input:invalid ~ .custom-control-label::before,
+.custom-control-input.is-invalid ~ .custom-control-label::before {
background-color: #ec8080;
}
-.was-validated .custom-control-input:invalid~.invalid-feedback,
-.was-validated .custom-control-input:invalid~.invalid-tooltip,
-.custom-control-input.is-invalid~.invalid-feedback,
-.custom-control-input.is-invalid~.invalid-tooltip {
+.was-validated .custom-control-input:invalid ~ .invalid-feedback,
+.was-validated .custom-control-input:invalid ~ .invalid-tooltip,
+.custom-control-input.is-invalid ~ .invalid-feedback,
+.custom-control-input.is-invalid ~ .invalid-tooltip {
display: block;
}
-.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,
-.custom-control-input.is-invalid:checked~.custom-control-label::before {
+.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,
+.custom-control-input.is-invalid:checked ~ .custom-control-label::before {
background-color: #e23e3d;
}
-.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,
-.custom-control-input.is-invalid:focus~.custom-control-label::before {
- box-shadow: 0 0 0 1px #f5f7fb, 0 0 0 2px rgba(205, 32, 31, 0.25);
+.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,
+.custom-control-input.is-invalid:focus ~ .custom-control-label::before {
+ box-shadow:
+ 0 0 0 1px #f5f7fb,
+ 0 0 0 2px rgba(205, 32, 31, 0.25);
}
-.was-validated .custom-file-input:invalid~.custom-file-label,
-.custom-file-input.is-invalid~.custom-file-label {
+.was-validated .custom-file-input:invalid ~ .custom-file-label,
+.custom-file-input.is-invalid ~ .custom-file-label {
border-color: #cd201f;
}
-.was-validated .custom-file-input:invalid~.custom-file-label::before,
-.custom-file-input.is-invalid~.custom-file-label::before {
+.was-validated .custom-file-input:invalid ~ .custom-file-label::before,
+.custom-file-input.is-invalid ~ .custom-file-label::before {
border-color: inherit;
}
-.was-validated .custom-file-input:invalid~.invalid-feedback,
-.was-validated .custom-file-input:invalid~.invalid-tooltip,
-.custom-file-input.is-invalid~.invalid-feedback,
-.custom-file-input.is-invalid~.invalid-tooltip {
+.was-validated .custom-file-input:invalid ~ .invalid-feedback,
+.was-validated .custom-file-input:invalid ~ .invalid-tooltip,
+.custom-file-input.is-invalid ~ .invalid-feedback,
+.custom-file-input.is-invalid ~ .invalid-tooltip {
display: block;
}
-.was-validated .custom-file-input:invalid:focus~.custom-file-label,
-.custom-file-input.is-invalid:focus~.custom-file-label {
+.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,
+.custom-file-input.is-invalid:focus ~ .custom-file-label {
box-shadow: 0 0 0 2px rgba(205, 32, 31, 0.25);
}
@@ -2474,7 +2481,11 @@ select.form-control-lg:not([size]):not([multiple]),
font-size: 0.9375rem;
line-height: 1.84615385;
border-radius: 3px;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition:
+ color 0.15s ease-in-out,
+ background-color 0.15s ease-in-out,
+ border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
}
.btn:hover,
@@ -2533,7 +2544,7 @@ fieldset:disabled a.btn {
.btn-primary:not(:disabled):not(.disabled):active,
.btn-primary:not(:disabled):not(.disabled).active,
-.show>.btn-primary.dropdown-toggle {
+.show > .btn-primary.dropdown-toggle {
color: #fff;
background-color: #2f66b3;
border-color: #2c60a9;
@@ -2541,7 +2552,7 @@ fieldset:disabled a.btn {
.btn-primary:not(:disabled):not(.disabled):active:focus,
.btn-primary:not(:disabled):not(.disabled).active:focus,
-.show>.btn-primary.dropdown-toggle:focus {
+.show > .btn-primary.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.5);
}
@@ -2571,7 +2582,7 @@ fieldset:disabled a.btn {
.btn-secondary:not(:disabled):not(.disabled):active,
.btn-secondary:not(:disabled):not(.disabled).active,
-.show>.btn-secondary.dropdown-toggle {
+.show > .btn-secondary.dropdown-toggle {
color: #fff;
background-color: #6c757d;
border-color: #666e76;
@@ -2579,49 +2590,49 @@ fieldset:disabled a.btn {
.btn-secondary:not(:disabled):not(.disabled):active:focus,
.btn-secondary:not(:disabled):not(.disabled).active:focus,
-.show>.btn-secondary.dropdown-toggle:focus {
+.show > .btn-secondary.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
}
-[data-theme=dark] .btn-secondary {
+[data-theme='dark'] .btn-secondary {
color: #868e96;
background-color: transparent;
background-image: none;
border-color: #868e96;
}
-[data-theme=dark] .btn-secondary:hover {
+[data-theme='dark'] .btn-secondary:hover {
color: #fff;
background-color: #868e96;
border-color: #868e96;
}
-[data-theme=dark] .btn-secondary:focus,
-[data-theme=dark] .btn-secondary.focus {
+[data-theme='dark'] .btn-secondary:focus,
+[data-theme='dark'] .btn-secondary.focus {
box-shadow: none;
}
-[data-theme=dark] .btn-secondary:focus-visible,
-[data-theme=dark] .btn-secondary.focus {
+[data-theme='dark'] .btn-secondary:focus-visible,
+[data-theme='dark'] .btn-secondary.focus {
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
}
-[data-theme=dark] .btn-secondary.disabled,
-[data-theme=dark] .btn-secondary:disabled {
+[data-theme='dark'] .btn-secondary.disabled,
+[data-theme='dark'] .btn-secondary:disabled {
color: #868e96;
background-color: transparent;
border: none;
}
-[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled):active,
-[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled).active {
+[data-theme='dark'] .btn-secondary:not(:disabled):not(.disabled):active,
+[data-theme='dark'] .btn-secondary:not(:disabled):not(.disabled).active {
color: #fff;
background-color: #868e96;
border-color: #868e96;
}
-[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled):active:focus,
-[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled).active:focus {
+[data-theme='dark'] .btn-secondary:not(:disabled):not(.disabled):active:focus,
+[data-theme='dark'] .btn-secondary:not(:disabled):not(.disabled).active:focus {
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
}
@@ -2651,7 +2662,7 @@ fieldset:disabled a.btn {
.btn-success:not(:disabled):not(.disabled):active,
.btn-success:not(:disabled):not(.disabled).active,
-.show>.btn-success.dropdown-toggle {
+.show > .btn-success.dropdown-toggle {
color: #fff;
background-color: #448700;
border-color: #448700;
@@ -2659,7 +2670,7 @@ fieldset:disabled a.btn {
.btn-success:not(:disabled):not(.disabled):active:focus,
.btn-success:not(:disabled):not(.disabled).active:focus,
-.show>.btn-success.dropdown-toggle:focus {
+.show > .btn-success.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(94, 186, 0, 0.5);
}
@@ -2689,7 +2700,7 @@ fieldset:disabled a.btn {
.btn-info:not(:disabled):not(.disabled):active,
.btn-info:not(:disabled):not(.disabled).active,
-.show>.btn-info.dropdown-toggle {
+.show > .btn-info.dropdown-toggle {
color: #fff;
background-color: #1594ef;
border-color: #108ee7;
@@ -2697,7 +2708,7 @@ fieldset:disabled a.btn {
.btn-info:not(:disabled):not(.disabled):active:focus,
.btn-info:not(:disabled):not(.disabled).active:focus,
-.show>.btn-info.dropdown-toggle:focus {
+.show > .btn-info.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(69, 170, 242, 0.5);
}
@@ -2727,7 +2738,7 @@ fieldset:disabled a.btn {
.btn-warning:not(:disabled):not(.disabled):active,
.btn-warning:not(:disabled):not(.disabled).active,
-.show>.btn-warning.dropdown-toggle {
+.show > .btn-warning.dropdown-toggle {
color: #fff;
background-color: #c29d0b;
border-color: #b6940b;
@@ -2735,7 +2746,7 @@ fieldset:disabled a.btn {
.btn-warning:not(:disabled):not(.disabled):active:focus,
.btn-warning:not(:disabled):not(.disabled).active:focus,
-.show>.btn-warning.dropdown-toggle:focus {
+.show > .btn-warning.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(241, 196, 15, 0.5);
}
@@ -2765,7 +2776,7 @@ fieldset:disabled a.btn {
.btn-danger:not(:disabled):not(.disabled):active,
.btn-danger:not(:disabled):not(.disabled).active,
-.show>.btn-danger.dropdown-toggle {
+.show > .btn-danger.dropdown-toggle {
color: #fff;
background-color: #a11918;
border-color: #961717;
@@ -2773,7 +2784,7 @@ fieldset:disabled a.btn {
.btn-danger:not(:disabled):not(.disabled):active:focus,
.btn-danger:not(:disabled):not(.disabled).active:focus,
-.show>.btn-danger.dropdown-toggle:focus {
+.show > .btn-danger.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(205, 32, 31, 0.5);
}
@@ -2803,7 +2814,7 @@ fieldset:disabled a.btn {
.btn-light:not(:disabled):not(.disabled):active,
.btn-light:not(:disabled):not(.disabled).active,
-.show>.btn-light.dropdown-toggle {
+.show > .btn-light.dropdown-toggle {
color: #495057;
background-color: #dae0e5;
border-color: #d3d9df;
@@ -2811,7 +2822,7 @@ fieldset:disabled a.btn {
.btn-light:not(:disabled):not(.disabled):active:focus,
.btn-light:not(:disabled):not(.disabled).active:focus,
-.show>.btn-light.dropdown-toggle:focus {
+.show > .btn-light.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(248, 249, 250, 0.5);
}
@@ -2841,7 +2852,7 @@ fieldset:disabled a.btn {
.btn-dark:not(:disabled):not(.disabled):active,
.btn-dark:not(:disabled):not(.disabled).active,
-.show>.btn-dark.dropdown-toggle {
+.show > .btn-dark.dropdown-toggle {
color: #fff;
background-color: #1d2124;
border-color: #171a1d;
@@ -2849,7 +2860,7 @@ fieldset:disabled a.btn {
.btn-dark:not(:disabled):not(.disabled):active:focus,
.btn-dark:not(:disabled):not(.disabled).active:focus,
-.show>.btn-dark.dropdown-toggle:focus {
+.show > .btn-dark.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(52, 58, 64, 0.5);
}
@@ -2884,7 +2895,7 @@ fieldset:disabled a.btn {
.btn-outline-primary:not(:disabled):not(.disabled):active,
.btn-outline-primary:not(:disabled):not(.disabled).active,
-.show>.btn-outline-primary.dropdown-toggle {
+.show > .btn-outline-primary.dropdown-toggle {
color: #fff;
background-color: #467fcf;
border-color: #467fcf;
@@ -2892,7 +2903,7 @@ fieldset:disabled a.btn {
.btn-outline-primary:not(:disabled):not(.disabled):active:focus,
.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-primary.dropdown-toggle:focus {
+.show > .btn-outline-primary.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.5);
}
@@ -2927,7 +2938,7 @@ fieldset:disabled a.btn {
.btn-outline-secondary:not(:disabled):not(.disabled):active,
.btn-outline-secondary:not(:disabled):not(.disabled).active,
-.show>.btn-outline-secondary.dropdown-toggle {
+.show > .btn-outline-secondary.dropdown-toggle {
color: #fff;
background-color: #868e96;
border-color: #868e96;
@@ -2935,7 +2946,7 @@ fieldset:disabled a.btn {
.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,
.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-secondary.dropdown-toggle:focus {
+.show > .btn-outline-secondary.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
}
@@ -2965,7 +2976,7 @@ fieldset:disabled a.btn {
.btn-outline-success:not(:disabled):not(.disabled):active,
.btn-outline-success:not(:disabled):not(.disabled).active,
-.show>.btn-outline-success.dropdown-toggle {
+.show > .btn-outline-success.dropdown-toggle {
color: #fff;
background-color: #5eba00;
border-color: #5eba00;
@@ -2973,7 +2984,7 @@ fieldset:disabled a.btn {
.btn-outline-success:not(:disabled):not(.disabled):active:focus,
.btn-outline-success:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-success.dropdown-toggle:focus {
+.show > .btn-outline-success.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(94, 186, 0, 0.5);
}
@@ -3003,7 +3014,7 @@ fieldset:disabled a.btn {
.btn-outline-info:not(:disabled):not(.disabled):active,
.btn-outline-info:not(:disabled):not(.disabled).active,
-.show>.btn-outline-info.dropdown-toggle {
+.show > .btn-outline-info.dropdown-toggle {
color: #fff;
background-color: #45aaf2;
border-color: #45aaf2;
@@ -3011,7 +3022,7 @@ fieldset:disabled a.btn {
.btn-outline-info:not(:disabled):not(.disabled):active:focus,
.btn-outline-info:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-info.dropdown-toggle:focus {
+.show > .btn-outline-info.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(69, 170, 242, 0.5);
}
@@ -3041,7 +3052,7 @@ fieldset:disabled a.btn {
.btn-outline-warning:not(:disabled):not(.disabled):active,
.btn-outline-warning:not(:disabled):not(.disabled).active,
-.show>.btn-outline-warning.dropdown-toggle {
+.show > .btn-outline-warning.dropdown-toggle {
color: #fff;
background-color: #f1c40f;
border-color: #f1c40f;
@@ -3049,7 +3060,7 @@ fieldset:disabled a.btn {
.btn-outline-warning:not(:disabled):not(.disabled):active:focus,
.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-warning.dropdown-toggle:focus {
+.show > .btn-outline-warning.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(241, 196, 15, 0.5);
}
@@ -3079,7 +3090,7 @@ fieldset:disabled a.btn {
.btn-outline-danger:not(:disabled):not(.disabled):active,
.btn-outline-danger:not(:disabled):not(.disabled).active,
-.show>.btn-outline-danger.dropdown-toggle {
+.show > .btn-outline-danger.dropdown-toggle {
color: #fff;
background-color: #cd201f;
border-color: #cd201f;
@@ -3087,7 +3098,7 @@ fieldset:disabled a.btn {
.btn-outline-danger:not(:disabled):not(.disabled):active:focus,
.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-danger.dropdown-toggle:focus {
+.show > .btn-outline-danger.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(205, 32, 31, 0.5);
}
@@ -3117,7 +3128,7 @@ fieldset:disabled a.btn {
.btn-outline-light:not(:disabled):not(.disabled):active,
.btn-outline-light:not(:disabled):not(.disabled).active,
-.show>.btn-outline-light.dropdown-toggle {
+.show > .btn-outline-light.dropdown-toggle {
color: #495057;
background-color: #f8f9fa;
border-color: #f8f9fa;
@@ -3125,7 +3136,7 @@ fieldset:disabled a.btn {
.btn-outline-light:not(:disabled):not(.disabled):active:focus,
.btn-outline-light:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-light.dropdown-toggle:focus {
+.show > .btn-outline-light.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(248, 249, 250, 0.5);
}
@@ -3155,7 +3166,7 @@ fieldset:disabled a.btn {
.btn-outline-dark:not(:disabled):not(.disabled):active,
.btn-outline-dark:not(:disabled):not(.disabled).active,
-.show>.btn-outline-dark.dropdown-toggle {
+.show > .btn-outline-dark.dropdown-toggle {
color: #fff;
background-color: #343a40;
border-color: #343a40;
@@ -3163,7 +3174,7 @@ fieldset:disabled a.btn {
.btn-outline-dark:not(:disabled):not(.disabled):active:focus,
.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
-.show>.btn-outline-dark.dropdown-toggle:focus {
+.show > .btn-outline-dark.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(52, 58, 64, 0.5);
}
@@ -3193,7 +3204,7 @@ fieldset:disabled a.btn {
}
.btn-lg,
-.btn-group-lg>.btn {
+.btn-group-lg > .btn {
padding: 0.5rem 1rem;
font-size: 1.125rem;
line-height: 1.625;
@@ -3201,7 +3212,7 @@ fieldset:disabled a.btn {
}
.btn-sm,
-.btn-group-sm>.btn {
+.btn-group-sm > .btn {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
line-height: 1.33333333;
@@ -3213,13 +3224,13 @@ fieldset:disabled a.btn {
width: 100%;
}
-.btn-block+.btn-block {
+.btn-block + .btn-block {
margin-top: 0.5rem;
}
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
+input[type='submit'].btn-block,
+input[type='reset'].btn-block,
+input[type='button'].btn-block {
width: 100%;
}
@@ -3266,7 +3277,7 @@ tbody.collapse.show {
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
- content: "";
+ content: '';
border-top: 0.3em solid;
border-right: 0.3em solid transparent;
border-bottom: 0;
@@ -3297,7 +3308,7 @@ tbody.collapse.show {
border-radius: 3px;
}
-[data-theme=dark] .dropdown-menu {
+[data-theme='dark'] .dropdown-menu {
border: 1px solid var(--card-border-color);
}
@@ -3312,7 +3323,7 @@ tbody.collapse.show {
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
- content: "";
+ content: '';
border-top: 0;
border-right: 0.3em solid transparent;
border-bottom: 0.3em solid;
@@ -3334,7 +3345,7 @@ tbody.collapse.show {
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
- content: "";
+ content: '';
border-top: 0.3em solid transparent;
border-bottom: 0.3em solid transparent;
border-left: 0.3em solid;
@@ -3359,7 +3370,7 @@ tbody.collapse.show {
height: 0;
margin-left: 0.255em;
vertical-align: 0.255em;
- content: "";
+ content: '';
}
.dropleft .dropdown-toggle::after {
@@ -3372,7 +3383,7 @@ tbody.collapse.show {
height: 0;
margin-right: 0.255em;
vertical-align: 0.255em;
- content: "";
+ content: '';
border-top: 0.3em solid transparent;
border-right: 0.3em solid;
border-bottom: 0.3em solid transparent;
@@ -3447,35 +3458,35 @@ tbody.collapse.show {
vertical-align: middle;
}
-.btn-group>.btn,
-.btn-group-vertical>.btn {
+.btn-group > .btn,
+.btn-group-vertical > .btn {
position: relative;
-ms-flex: 0 1 auto;
flex: 0 1 auto;
}
-.btn-group>.btn:hover,
-.btn-group-vertical>.btn:hover {
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover {
z-index: 1;
}
-.btn-group>.btn:focus,
-.btn-group>.btn:active,
-.btn-group>.btn.active,
-.btn-group-vertical>.btn:focus,
-.btn-group-vertical>.btn:active,
-.btn-group-vertical>.btn.active {
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
z-index: 1;
}
-.btn-group .btn+.btn,
-.btn-group .btn+.btn-group,
-.btn-group .btn-group+.btn,
-.btn-group .btn-group+.btn-group,
-.btn-group-vertical .btn+.btn,
-.btn-group-vertical .btn+.btn-group,
-.btn-group-vertical .btn-group+.btn,
-.btn-group-vertical .btn-group+.btn-group {
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group,
+.btn-group-vertical .btn + .btn,
+.btn-group-vertical .btn + .btn-group,
+.btn-group-vertical .btn-group + .btn,
+.btn-group-vertical .btn-group + .btn-group {
margin-left: -1px;
}
@@ -3492,18 +3503,18 @@ tbody.collapse.show {
width: auto;
}
-.btn-group>.btn:first-child {
+.btn-group > .btn:first-child {
margin-left: 0;
}
-.btn-group>.btn:not(:last-child):not(.dropdown-toggle),
-.btn-group>.btn-group:not(:last-child)>.btn {
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group > .btn-group:not(:last-child) > .btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
-.btn-group>.btn:not(:first-child),
-.btn-group>.btn-group:not(:first-child)>.btn {
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
@@ -3517,14 +3528,14 @@ tbody.collapse.show {
margin-left: 0;
}
-.btn-sm+.dropdown-toggle-split,
-.btn-group-sm>.btn+.dropdown-toggle-split {
+.btn-sm + .dropdown-toggle-split,
+.btn-group-sm > .btn + .dropdown-toggle-split {
padding-right: 0.375rem;
padding-left: 0.375rem;
}
-.btn-lg+.dropdown-toggle-split,
-.btn-group-lg>.btn+.dropdown-toggle-split {
+.btn-lg + .dropdown-toggle-split,
+.btn-group-lg > .btn + .dropdown-toggle-split {
padding-right: 0.75rem;
padding-left: 0.75rem;
}
@@ -3543,35 +3554,35 @@ tbody.collapse.show {
width: 100%;
}
-.btn-group-vertical>.btn+.btn,
-.btn-group-vertical>.btn+.btn-group,
-.btn-group-vertical>.btn-group+.btn,
-.btn-group-vertical>.btn-group+.btn-group {
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
margin-top: -1px;
margin-left: 0;
}
-.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),
-.btn-group-vertical>.btn-group:not(:last-child)>.btn {
+.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group-vertical > .btn-group:not(:last-child) > .btn {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
-.btn-group-vertical>.btn:not(:first-child),
-.btn-group-vertical>.btn-group:not(:first-child)>.btn {
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
-.btn-group-toggle>.btn,
-.btn-group-toggle>.btn-group>.btn {
+.btn-group-toggle > .btn,
+.btn-group-toggle > .btn-group > .btn {
margin-bottom: 0;
}
-.btn-group-toggle>.btn input[type="radio"],
-.btn-group-toggle>.btn input[type="checkbox"],
-.btn-group-toggle>.btn-group>.btn input[type="radio"],
-.btn-group-toggle>.btn-group>.btn input[type="checkbox"] {
+.btn-group-toggle > .btn input[type='radio'],
+.btn-group-toggle > .btn input[type='checkbox'],
+.btn-group-toggle > .btn-group > .btn input[type='radio'],
+.btn-group-toggle > .btn-group > .btn input[type='checkbox'] {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
@@ -3588,9 +3599,9 @@ tbody.collapse.show {
width: 100%;
}
-.input-group>.form-control,
-.input-group>.custom-select,
-.input-group>.custom-file {
+.input-group > .form-control,
+.input-group > .custom-select,
+.input-group > .custom-file {
position: relative;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
@@ -3598,51 +3609,51 @@ tbody.collapse.show {
margin-bottom: 0;
}
-.input-group>.form-control:focus,
-.input-group>.custom-select:focus,
-.input-group>.custom-file:focus {
+.input-group > .form-control:focus,
+.input-group > .custom-select:focus,
+.input-group > .custom-file:focus {
z-index: 3;
}
-.input-group>.form-control+.form-control,
-.input-group>.form-control+.custom-select,
-.input-group>.form-control+.custom-file,
-.input-group>.custom-select+.form-control,
-.input-group>.custom-select+.custom-select,
-.input-group>.custom-select+.custom-file,
-.input-group>.custom-file+.form-control,
-.input-group>.custom-file+.custom-select,
-.input-group>.custom-file+.custom-file {
+.input-group > .form-control + .form-control,
+.input-group > .form-control + .custom-select,
+.input-group > .form-control + .custom-file,
+.input-group > .custom-select + .form-control,
+.input-group > .custom-select + .custom-select,
+.input-group > .custom-select + .custom-file,
+.input-group > .custom-file + .form-control,
+.input-group > .custom-file + .custom-select,
+.input-group > .custom-file + .custom-file {
margin-left: -1px;
}
-.input-group>.form-control:not(:last-child),
-.input-group>.custom-select:not(:last-child) {
+.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) {
+.input-group > .form-control:not(:first-child),
+.input-group > .custom-select:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
-.input-group>.custom-file {
+.input-group > .custom-file {
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
}
-.input-group>.custom-file:not(:last-child) .custom-file-label,
-.input-group>.custom-file:not(:last-child) .custom-file-label::before {
+.input-group > .custom-file:not(:last-child) .custom-file-label,
+.input-group > .custom-file:not(:last-child) .custom-file-label::before {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
-.input-group>.custom-file:not(:first-child) .custom-file-label,
-.input-group>.custom-file:not(:first-child) .custom-file-label::before {
+.input-group > .custom-file:not(:first-child) .custom-file-label,
+.input-group > .custom-file:not(:first-child) .custom-file-label::before {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
@@ -3659,14 +3670,14 @@ tbody.collapse.show {
z-index: 2;
}
-.input-group-prepend .btn+.btn,
-.input-group-prepend .btn+.input-group-text,
-.input-group-prepend .input-group-text+.input-group-text,
-.input-group-prepend .input-group-text+.btn,
-.input-group-append .btn+.btn,
-.input-group-append .btn+.input-group-text,
-.input-group-append .input-group-text+.input-group-text,
-.input-group-append .input-group-text+.btn {
+.input-group-prepend .btn + .btn,
+.input-group-prepend .btn + .input-group-text,
+.input-group-prepend .input-group-text + .input-group-text,
+.input-group-prepend .input-group-text + .btn,
+.input-group-append .btn + .btn,
+.input-group-append .btn + .input-group-text,
+.input-group-append .input-group-text + .input-group-text,
+.input-group-append .input-group-text + .btn {
margin-left: -1px;
}
@@ -3696,27 +3707,27 @@ tbody.collapse.show {
border-radius: 3px;
}
-.input-group-text input[type="radio"],
-.input-group-text input[type="checkbox"] {
+.input-group-text input[type='radio'],
+.input-group-text input[type='checkbox'] {
margin-top: 0;
}
-.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>.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) {
+.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 > .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;
border-bottom-right-radius: 0;
}
-.input-group>.input-group-append>.btn,
-.input-group>.input-group-append>.input-group-text,
-.input-group>.input-group-prepend:not(:first-child)>.btn,
-.input-group>.input-group-prepend:not(:first-child)>.input-group-text,
-.input-group>.input-group-prepend:first-child>.btn:not(:first-child),
-.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child) {
+.input-group > .input-group-append > .btn,
+.input-group > .input-group-append > .input-group-text,
+.input-group > .input-group-prepend:not(:first-child) > .btn,
+.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
+.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
+.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
@@ -3740,25 +3751,27 @@ tbody.collapse.show {
opacity: 0;
}
-.custom-control-input:checked~.custom-control-label::before {
+.custom-control-input:checked ~ .custom-control-label::before {
color: #fff;
background-color: #467fcf;
}
-.custom-control-input:focus~.custom-control-label::before {
- box-shadow: 0 0 0 1px #f5f7fb, 0 0 0 2px rgba(70, 127, 207, 0.25);
+.custom-control-input:focus ~ .custom-control-label::before {
+ box-shadow:
+ 0 0 0 1px #f5f7fb,
+ 0 0 0 2px rgba(70, 127, 207, 0.25);
}
-.custom-control-input:active~.custom-control-label::before {
+.custom-control-input:active ~ .custom-control-label::before {
color: #fff;
background-color: #d4e1f4;
}
-.custom-control-input:disabled~.custom-control-label {
+.custom-control-input:disabled ~ .custom-control-label {
color: #868e96;
}
-.custom-control-input:disabled~.custom-control-label::before {
+.custom-control-input:disabled ~ .custom-control-label::before {
background-color: #e9ecef;
}
@@ -3774,7 +3787,7 @@ tbody.collapse.show {
width: 1rem;
height: 1rem;
pointer-events: none;
- content: "";
+ content: '';
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
@@ -3789,7 +3802,7 @@ tbody.collapse.show {
display: block;
width: 1rem;
height: 1rem;
- content: "";
+ content: '';
background-repeat: no-repeat;
background-position: center center;
background-size: 50% 50%;
@@ -3799,27 +3812,27 @@ tbody.collapse.show {
border-radius: 3px;
}
-.custom-checkbox .custom-control-input:checked~.custom-control-label::before {
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {
background-color: #467fcf;
}
-.custom-checkbox .custom-control-input:checked~.custom-control-label::after {
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
}
-.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before {
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
background-color: #467fcf;
}
-.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after {
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
}
-.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before {
+.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
background-color: rgba(70, 127, 207, 0.5);
}
-.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before {
+.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
background-color: rgba(70, 127, 207, 0.5);
}
@@ -3827,15 +3840,15 @@ tbody.collapse.show {
border-radius: 50%;
}
-.custom-radio .custom-control-input:checked~.custom-control-label::before {
+.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
background-color: #467fcf;
}
-.custom-radio .custom-control-input:checked~.custom-control-label::after {
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
}
-.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before {
+.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
background-color: rgba(70, 127, 207, 0.5);
}
@@ -3847,7 +3860,9 @@ tbody.collapse.show {
line-height: 1.5;
color: var(--mcolor);
vertical-align: middle;
- background: var(--card-bgcolor) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMCA1Jz48cGF0aCBmaWxsPScjOTk5JyBkPSdNMCAwTDEwIDBMNSA1TDAgMCcvPjwvc3ZnPg==") no-repeat right 0.75rem center;
+ background: var(--card-bgcolor)
+ url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMCA1Jz48cGF0aCBmaWxsPScjOTk5JyBkPSdNMCAwTDEwIDBMNSA1TDAgMCcvPjwvc3ZnPg==')
+ no-repeat right 0.75rem center;
background-size: 8px 10px;
border: 1px solid var(--card-border-color);
border-radius: 3px;
@@ -3859,7 +3874,9 @@ tbody.collapse.show {
.custom-select:focus {
border-color: #1991eb;
outline: 0;
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(25, 145, 235, 0.5);
+ box-shadow:
+ inset 0 1px 2px rgba(0, 0, 0, 0.075),
+ 0 0 5px rgba(25, 145, 235, 0.5);
}
.custom-select:focus::-ms-value {
@@ -3868,7 +3885,7 @@ tbody.collapse.show {
}
.custom-select[multiple],
-.custom-select[size]:not([size="1"]) {
+.custom-select[size]:not([size='1']) {
height: auto;
padding-right: 0.75rem;
background-image: none;
@@ -3914,17 +3931,17 @@ tbody.collapse.show {
opacity: 0;
}
-.custom-file-input:focus~.custom-file-control {
+.custom-file-input:focus ~ .custom-file-control {
border-color: #1991eb;
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
}
-.custom-file-input:focus~.custom-file-control::before {
+.custom-file-input:focus ~ .custom-file-control::before {
border-color: #1991eb;
}
-.custom-file-input:lang(en)~.custom-file-label::after {
- content: "Browse";
+.custom-file-input:lang(en) ~ .custom-file-label::after {
+ content: 'Browse';
}
.custom-file-label {
@@ -3953,7 +3970,7 @@ tbody.collapse.show {
padding: 0.375rem 0.75rem;
line-height: 1.5;
color: #495057;
- content: "Browse";
+ content: 'Browse';
background-color: #fbfbfc;
border-left: 1px solid rgba(0, 40, 100, 0.12);
border-radius: 0 3px 3px 0;
@@ -4026,7 +4043,7 @@ tbody.collapse.show {
}
.nav-pills .nav-link.active,
-.nav-pills .show>.nav-link {
+.nav-pills .show > .nav-link {
color: #fff;
background-color: #467fcf;
}
@@ -4045,11 +4062,11 @@ tbody.collapse.show {
text-align: center;
}
-.tab-content>.tab-pane {
+.tab-content > .tab-pane {
display: none;
}
-.tab-content>.active {
+.tab-content > .active {
display: block;
}
@@ -4066,8 +4083,8 @@ tbody.collapse.show {
padding: 0.5rem 1rem;
}
-.navbar>.container,
-.navbar>.container-fluid {
+.navbar > .container,
+.navbar > .container-fluid {
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
@@ -4151,14 +4168,14 @@ tbody.collapse.show {
width: 1.5em;
height: 1.5em;
vertical-align: middle;
- content: "";
+ content: '';
background: no-repeat center center;
background-size: 100% 100%;
}
@media (max-width: 575.98px) {
- .navbar-expand-sm>.container,
- .navbar-expand-sm>.container-fluid {
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
padding-right: 0;
padding-left: 0;
}
@@ -4186,8 +4203,8 @@ tbody.collapse.show {
padding-right: 0.5rem;
padding-left: 0.5rem;
}
- .navbar-expand-sm>.container,
- .navbar-expand-sm>.container-fluid {
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
@@ -4207,8 +4224,8 @@ tbody.collapse.show {
}
@media (max-width: 767.98px) {
- .navbar-expand-md>.container,
- .navbar-expand-md>.container-fluid {
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
padding-right: 0;
padding-left: 0;
}
@@ -4236,8 +4253,8 @@ tbody.collapse.show {
padding-right: 0.5rem;
padding-left: 0.5rem;
}
- .navbar-expand-md>.container,
- .navbar-expand-md>.container-fluid {
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
@@ -4257,8 +4274,8 @@ tbody.collapse.show {
}
@media (max-width: 991.98px) {
- .navbar-expand-lg>.container,
- .navbar-expand-lg>.container-fluid {
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
padding-right: 0;
padding-left: 0;
}
@@ -4286,8 +4303,8 @@ tbody.collapse.show {
padding-right: 0.5rem;
padding-left: 0.5rem;
}
- .navbar-expand-lg>.container,
- .navbar-expand-lg>.container-fluid {
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
@@ -4307,8 +4324,8 @@ tbody.collapse.show {
}
@media (max-width: 1279.98px) {
- .navbar-expand-xl>.container,
- .navbar-expand-xl>.container-fluid {
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
padding-right: 0;
padding-left: 0;
}
@@ -4336,8 +4353,8 @@ tbody.collapse.show {
padding-right: 0.5rem;
padding-left: 0.5rem;
}
- .navbar-expand-xl>.container,
- .navbar-expand-xl>.container-fluid {
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
@@ -4363,8 +4380,8 @@ tbody.collapse.show {
justify-content: flex-start;
}
-.navbar-expand>.container,
-.navbar-expand>.container-fluid {
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
padding-right: 0;
padding-left: 0;
}
@@ -4388,8 +4405,8 @@ tbody.collapse.show {
padding-left: 0.5rem;
}
-.navbar-expand>.container,
-.navbar-expand>.container-fluid {
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
@@ -4432,8 +4449,8 @@ tbody.collapse.show {
color: rgba(0, 0, 0, 0.3);
}
-.navbar-light .navbar-nav .show>.nav-link,
-.navbar-light .navbar-nav .active>.nav-link,
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
.navbar-light .navbar-nav .nav-link.show,
.navbar-light .navbar-nav .nav-link.active {
color: rgba(0, 0, 0, 0.9);
@@ -4483,8 +4500,8 @@ tbody.collapse.show {
color: rgba(255, 255, 255, 0.25);
}
-.navbar-dark .navbar-nav .show>.nav-link,
-.navbar-dark .navbar-nav .active>.nav-link,
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .active > .nav-link,
.navbar-dark .navbar-nav .nav-link.show,
.navbar-dark .navbar-nav .nav-link.active {
color: #fff;
@@ -4526,17 +4543,17 @@ tbody.collapse.show {
border-radius: 3px;
}
-.card>hr {
+.card > hr {
margin-right: 0;
margin-left: 0;
}
-.card>.list-group:first-child .list-group-item:first-child {
+.card > .list-group:first-child .list-group-item:first-child {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
-.card>.list-group:last-child .list-group-item:last-child {
+.card > .list-group:last-child .list-group-item:last-child {
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
@@ -4564,7 +4581,7 @@ tbody.collapse.show {
text-decoration: none;
}
-.card-link+.card-link {
+.card-link + .card-link {
margin-left: 1.5rem;
}
@@ -4579,7 +4596,7 @@ tbody.collapse.show {
border-radius: calc(3px - 1px) calc(3px - 1px) 0 0;
}
-.card-header+.list-group .list-group-item:first-child {
+.card-header + .list-group .list-group-item:first-child {
border-top: 0;
}
@@ -4669,7 +4686,7 @@ tbody.collapse.show {
flex-direction: column;
}
-.card-group>.card {
+.card-group > .card {
margin-bottom: 0.75rem;
}
@@ -4678,59 +4695,59 @@ tbody.collapse.show {
-ms-flex-flow: row wrap;
flex-flow: row wrap;
}
- .card-group>.card {
+ .card-group > .card {
-ms-flex: 1 0 0%;
flex: 1 0 0%;
margin-bottom: 0;
}
- .card-group>.card+.card {
+ .card-group > .card + .card {
margin-left: 0;
border-left: 0;
}
- .card-group>.card:first-child {
+ .card-group > .card:first-child {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
- .card-group>.card:first-child .card-img-top,
- .card-group>.card:first-child .card-header {
+ .card-group > .card:first-child .card-img-top,
+ .card-group > .card:first-child .card-header {
border-top-right-radius: 0;
}
- .card-group>.card:first-child .card-img-bottom,
- .card-group>.card:first-child .card-footer {
+ .card-group > .card:first-child .card-img-bottom,
+ .card-group > .card:first-child .card-footer {
border-bottom-right-radius: 0;
}
- .card-group>.card:last-child {
+ .card-group > .card:last-child {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
- .card-group>.card:last-child .card-img-top,
- .card-group>.card:last-child .card-header {
+ .card-group > .card:last-child .card-img-top,
+ .card-group > .card:last-child .card-header {
border-top-left-radius: 0;
}
- .card-group>.card:last-child .card-img-bottom,
- .card-group>.card:last-child .card-footer {
+ .card-group > .card:last-child .card-img-bottom,
+ .card-group > .card:last-child .card-footer {
border-bottom-left-radius: 0;
}
- .card-group>.card:only-child {
+ .card-group > .card:only-child {
border-radius: 3px;
}
- .card-group>.card:only-child .card-img-top,
- .card-group>.card:only-child .card-header {
+ .card-group > .card:only-child .card-img-top,
+ .card-group > .card:only-child .card-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
- .card-group>.card:only-child .card-img-bottom,
- .card-group>.card:only-child .card-footer {
+ .card-group > .card:only-child .card-img-bottom,
+ .card-group > .card:only-child .card-footer {
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
- .card-group>.card:not(:first-child):not(:last-child):not(:only-child) {
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {
border-radius: 0;
}
- .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,
- .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,
- .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,
- .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer {
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,
+ .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {
border-radius: 0;
}
}
@@ -4766,19 +4783,19 @@ tbody.collapse.show {
border-radius: 3px;
}
-.breadcrumb-item+.breadcrumb-item::before {
+.breadcrumb-item + .breadcrumb-item::before {
display: inline-block;
padding-right: 0.5rem;
padding-left: 0.5rem;
color: #868e96;
- content: "/";
+ content: '/';
}
-.breadcrumb-item+.breadcrumb-item:hover::before {
+.breadcrumb-item + .breadcrumb-item:hover::before {
text-decoration: underline;
}
-.breadcrumb-item+.breadcrumb-item:hover::before {
+.breadcrumb-item + .breadcrumb-item:hover::before {
text-decoration: none;
}
@@ -5204,7 +5221,16 @@ tbody.collapse.show {
}
.progress-bar-striped {
- background-image: linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(
+ 45deg,
+ rgba(255, 255, 255, 0.15) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(255, 255, 255, 0.15) 50%,
+ rgba(255, 255, 255, 0.15) 75%,
+ transparent 75%,
+ transparent
+ );
background-size: 1rem 1rem;
}
@@ -5500,7 +5526,9 @@ button.close {
.modal.fade .modal-dialog {
transition: -webkit-transform 0.3s ease-out;
transition: transform 0.3s ease-out;
- transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
+ transition:
+ transform 0.3s ease-out,
+ -webkit-transform 0.3s ease-out;
-webkit-transform: translate(0, -25%);
transform: translate(0, -25%);
}
@@ -5592,11 +5620,11 @@ button.close {
border-top: 1px solid var(--card-border-color);
}
-.modal-footer> :not(:first-child) {
+.modal-footer > :not(:first-child) {
margin-left: 0.25rem;
}
-.modal-footer> :not(:last-child) {
+.modal-footer > :not(:last-child) {
margin-right: 0.25rem;
}
@@ -5632,7 +5660,14 @@ button.close {
z-index: 1070;
display: block;
margin: 0;
- font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
+ font-family:
+ 'Source Sans Pro',
+ -apple-system,
+ BlinkMacSystemFont,
+ 'Segoe UI',
+ 'Helvetica Neue',
+ Arial,
+ sans-serif;
font-style: normal;
font-weight: 400;
line-height: 1.5;
@@ -5664,78 +5699,78 @@ button.close {
.tooltip .arrow::before {
position: absolute;
- content: "";
+ content: '';
border-color: transparent;
border-style: solid;
}
.bs-tooltip-top,
-.bs-tooltip-auto[x-placement^="top"] {
+.bs-tooltip-auto[x-placement^='top'] {
padding: 0.4rem 0;
}
.bs-tooltip-top .arrow,
-.bs-tooltip-auto[x-placement^="top"] .arrow {
+.bs-tooltip-auto[x-placement^='top'] .arrow {
bottom: 0;
}
.bs-tooltip-top .arrow::before,
-.bs-tooltip-auto[x-placement^="top"] .arrow::before {
+.bs-tooltip-auto[x-placement^='top'] .arrow::before {
top: 0;
border-width: 0.4rem 0.4rem 0;
border-top-color: #000;
}
.bs-tooltip-right,
-.bs-tooltip-auto[x-placement^="right"] {
+.bs-tooltip-auto[x-placement^='right'] {
padding: 0 0.4rem;
}
.bs-tooltip-right .arrow,
-.bs-tooltip-auto[x-placement^="right"] .arrow {
+.bs-tooltip-auto[x-placement^='right'] .arrow {
left: 0;
width: 0.4rem;
height: 0.8rem;
}
.bs-tooltip-right .arrow::before,
-.bs-tooltip-auto[x-placement^="right"] .arrow::before {
+.bs-tooltip-auto[x-placement^='right'] .arrow::before {
right: 0;
border-width: 0.4rem 0.4rem 0.4rem 0;
border-right-color: #000;
}
.bs-tooltip-bottom,
-.bs-tooltip-auto[x-placement^="bottom"] {
+.bs-tooltip-auto[x-placement^='bottom'] {
padding: 0.4rem 0;
}
.bs-tooltip-bottom .arrow,
-.bs-tooltip-auto[x-placement^="bottom"] .arrow {
+.bs-tooltip-auto[x-placement^='bottom'] .arrow {
top: 0;
}
.bs-tooltip-bottom .arrow::before,
-.bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+.bs-tooltip-auto[x-placement^='bottom'] .arrow::before {
bottom: 0;
border-width: 0 0.4rem 0.4rem;
border-bottom-color: #000;
}
.bs-tooltip-left,
-.bs-tooltip-auto[x-placement^="left"] {
+.bs-tooltip-auto[x-placement^='left'] {
padding: 0 0.4rem;
}
.bs-tooltip-left .arrow,
-.bs-tooltip-auto[x-placement^="left"] .arrow {
+.bs-tooltip-auto[x-placement^='left'] .arrow {
right: 0;
width: 0.4rem;
height: 0.8rem;
}
.bs-tooltip-left .arrow::before,
-.bs-tooltip-auto[x-placement^="left"] .arrow::before {
+.bs-tooltip-auto[x-placement^='left'] .arrow::before {
left: 0;
border-width: 0.4rem 0 0.4rem 0.4rem;
border-left-color: #000;
@@ -5757,7 +5792,14 @@ button.close {
z-index: 1060;
display: block;
max-width: 276px;
- font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
+ font-family:
+ 'Source Sans Pro',
+ -apple-system,
+ BlinkMacSystemFont,
+ 'Segoe UI',
+ 'Helvetica Neue',
+ Arial,
+ sans-serif;
font-style: normal;
font-weight: 400;
line-height: 1.5;
@@ -5791,47 +5833,47 @@ button.close {
.popover .arrow::after {
position: absolute;
display: block;
- content: "";
+ content: '';
border-color: transparent;
border-style: solid;
}
.bs-popover-top,
-.bs-popover-auto[x-placement^="top"] {
+.bs-popover-auto[x-placement^='top'] {
margin-bottom: 0.5rem;
}
.bs-popover-top .arrow,
-.bs-popover-auto[x-placement^="top"] .arrow {
+.bs-popover-auto[x-placement^='top'] .arrow {
bottom: calc((0.5rem + 1px) * -1);
}
.bs-popover-top .arrow::before,
-.bs-popover-auto[x-placement^="top"] .arrow::before,
+.bs-popover-auto[x-placement^='top'] .arrow::before,
.bs-popover-top .arrow::after,
-.bs-popover-auto[x-placement^="top"] .arrow::after {
+.bs-popover-auto[x-placement^='top'] .arrow::after {
border-width: 0.5rem 0.25rem 0;
}
.bs-popover-top .arrow::before,
-.bs-popover-auto[x-placement^="top"] .arrow::before {
+.bs-popover-auto[x-placement^='top'] .arrow::before {
bottom: 0;
border-top-color: #dee3eb;
}
.bs-popover-top .arrow::after,
-.bs-popover-auto[x-placement^="top"] .arrow::after {
+.bs-popover-auto[x-placement^='top'] .arrow::after {
bottom: 1px;
border-top-color: #fff;
}
.bs-popover-right,
-.bs-popover-auto[x-placement^="right"] {
+.bs-popover-auto[x-placement^='right'] {
margin-left: 0.5rem;
}
.bs-popover-right .arrow,
-.bs-popover-auto[x-placement^="right"] .arrow {
+.bs-popover-auto[x-placement^='right'] .arrow {
left: calc((0.5rem + 1px) * -1);
width: 0.5rem;
height: 0.5rem;
@@ -5839,72 +5881,72 @@ button.close {
}
.bs-popover-right .arrow::before,
-.bs-popover-auto[x-placement^="right"] .arrow::before,
+.bs-popover-auto[x-placement^='right'] .arrow::before,
.bs-popover-right .arrow::after,
-.bs-popover-auto[x-placement^="right"] .arrow::after {
+.bs-popover-auto[x-placement^='right'] .arrow::after {
border-width: 0.25rem 0.5rem 0.25rem 0;
}
.bs-popover-right .arrow::before,
-.bs-popover-auto[x-placement^="right"] .arrow::before {
+.bs-popover-auto[x-placement^='right'] .arrow::before {
left: 0;
border-right-color: #dee3eb;
}
.bs-popover-right .arrow::after,
-.bs-popover-auto[x-placement^="right"] .arrow::after {
+.bs-popover-auto[x-placement^='right'] .arrow::after {
left: 1px;
border-right-color: #fff;
}
.bs-popover-bottom,
-.bs-popover-auto[x-placement^="bottom"] {
+.bs-popover-auto[x-placement^='bottom'] {
margin-top: 0.5rem;
}
.bs-popover-bottom .arrow,
-.bs-popover-auto[x-placement^="bottom"] .arrow {
+.bs-popover-auto[x-placement^='bottom'] .arrow {
top: calc((0.5rem + 1px) * -1);
}
.bs-popover-bottom .arrow::before,
-.bs-popover-auto[x-placement^="bottom"] .arrow::before,
+.bs-popover-auto[x-placement^='bottom'] .arrow::before,
.bs-popover-bottom .arrow::after,
-.bs-popover-auto[x-placement^="bottom"] .arrow::after {
+.bs-popover-auto[x-placement^='bottom'] .arrow::after {
border-width: 0 0.25rem 0.5rem 0.25rem;
}
.bs-popover-bottom .arrow::before,
-.bs-popover-auto[x-placement^="bottom"] .arrow::before {
+.bs-popover-auto[x-placement^='bottom'] .arrow::before {
top: 0;
border-bottom-color: #dee3eb;
}
.bs-popover-bottom .arrow::after,
-.bs-popover-auto[x-placement^="bottom"] .arrow::after {
+.bs-popover-auto[x-placement^='bottom'] .arrow::after {
top: 1px;
border-bottom-color: #fff;
}
.bs-popover-bottom .popover-header::before,
-.bs-popover-auto[x-placement^="bottom"] .popover-header::before {
+.bs-popover-auto[x-placement^='bottom'] .popover-header::before {
position: absolute;
top: 0;
left: 50%;
display: block;
width: 0.5rem;
margin-left: -0.25rem;
- content: "";
+ content: '';
border-bottom: 1px solid #f7f7f7;
}
.bs-popover-left,
-.bs-popover-auto[x-placement^="left"] {
+.bs-popover-auto[x-placement^='left'] {
margin-right: 0.5rem;
}
.bs-popover-left .arrow,
-.bs-popover-auto[x-placement^="left"] .arrow {
+.bs-popover-auto[x-placement^='left'] .arrow {
right: calc((0.5rem + 1px) * -1);
width: 0.5rem;
height: 0.5rem;
@@ -5912,20 +5954,20 @@ button.close {
}
.bs-popover-left .arrow::before,
-.bs-popover-auto[x-placement^="left"] .arrow::before,
+.bs-popover-auto[x-placement^='left'] .arrow::before,
.bs-popover-left .arrow::after,
-.bs-popover-auto[x-placement^="left"] .arrow::after {
+.bs-popover-auto[x-placement^='left'] .arrow::after {
border-width: 0.25rem 0 0.25rem 0.5rem;
}
.bs-popover-left .arrow::before,
-.bs-popover-auto[x-placement^="left"] .arrow::before {
+.bs-popover-auto[x-placement^='left'] .arrow::before {
right: 0;
border-left-color: #dee3eb;
}
.bs-popover-left .arrow::after,
-.bs-popover-auto[x-placement^="left"] .arrow::after {
+.bs-popover-auto[x-placement^='left'] .arrow::after {
right: 1px;
border-left-color: #fff;
}
@@ -5968,7 +6010,9 @@ button.close {
width: 100%;
transition: -webkit-transform 0.6s ease;
transition: transform 0.6s ease;
- transition: transform 0.6s ease, -webkit-transform 0.6s ease;
+ transition:
+ transform 0.6s ease,
+ -webkit-transform 0.6s ease;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-perspective: 1000px;
@@ -6116,7 +6160,7 @@ button.close {
display: inline-block;
width: 100%;
height: 10px;
- content: "";
+ content: '';
}
.carousel-indicators li::after {
@@ -6126,7 +6170,7 @@ button.close {
display: inline-block;
width: 100%;
height: 10px;
- content: "";
+ content: '';
}
.carousel-indicators .active {
@@ -6376,7 +6420,7 @@ button.bg-dark:focus {
.clearfix::after {
display: block;
clear: both;
- content: "";
+ content: '';
}
.d-none {
@@ -6587,7 +6631,7 @@ button.bg-dark:focus {
.embed-responsive::before {
display: block;
- content: "";
+ content: '';
}
.embed-responsive .embed-responsive-item,
@@ -9821,7 +9865,7 @@ a.text-dark:focus {
text-decoration: underline;
}
abbr[title]::after {
- content: " (" attr(title) ")";
+ content: ' (' attr(title) ')';
}
pre {
white-space: pre-wrap !important;
@@ -9895,8 +9939,8 @@ body {
-webkit-text-size-adjust: none;
-ms-touch-action: manipulation;
touch-action: manipulation;
- -webkit-font-feature-settings: "liga" 0;
- font-feature-settings: "liga" 0;
+ -webkit-font-feature-settings: 'liga' 0;
+ font-feature-settings: 'liga' 0;
height: 100%;
overflow-y: scroll;
position: relative;
@@ -9928,7 +9972,7 @@ body *:hover::-webkit-scrollbar-thumb {
a {
-webkit-text-decoration-skip: auto;
- text-decoration-skip-ink: auto
+ text-decoration-skip-ink: auto;
}
h1 a,
@@ -9975,7 +10019,7 @@ blockquote cite {
}
blockquote cite:before {
- content: "— ";
+ content: '— ';
}
code {
@@ -10024,20 +10068,20 @@ img {
line-height: 1.66;
}
-.text-wrap> :first-child {
+.text-wrap > :first-child {
margin-top: 0;
}
-.text-wrap> :last-child {
+.text-wrap > :last-child {
margin-bottom: 0;
}
-.text-wrap>h1,
-.text-wrap>h2,
-.text-wrap>h3,
-.text-wrap>h4,
-.text-wrap>h5,
-.text-wrap>h6 {
+.text-wrap > h1,
+.text-wrap > h2,
+.text-wrap > h3,
+.text-wrap > h4,
+.text-wrap > h5,
+.text-wrap > h6 {
margin-top: 1em;
}
@@ -10051,7 +10095,7 @@ img {
}
.section-nav:before {
- content: "Table of contents:";
+ content: 'Table of contents:';
display: block;
font-weight: 600;
}
@@ -10062,24 +10106,24 @@ img {
}
}
-.row-cards>.col,
-.row-cards>[class*="col-"] {
+.row-cards > .col,
+.row-cards > [class*='col-'] {
display: -ms-flexbox;
display: flex;
-ms-flex-direction: column;
flex-direction: column;
}
-.row-deck>.col,
-.row-deck>[class*="col-"] {
+.row-deck > .col,
+.row-deck > [class*='col-'] {
display: -ms-flexbox;
display: flex;
-ms-flex-align: stretch;
align-items: stretch;
}
-.row-deck>.col .card,
-.row-deck>[class*="col-"] .card {
+.row-deck > .col .card,
+.row-deck > [class*='col-'] .card {
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}
@@ -10097,8 +10141,8 @@ img {
margin-left: 0;
}
-.gutters-0>.col,
-.gutters-0>[class*="col-"] {
+.gutters-0 > .col,
+.gutters-0 > [class*='col-'] {
padding-right: 0;
padding-left: 0;
}
@@ -10112,8 +10156,8 @@ img {
margin-left: -0.25rem;
}
-.gutters-xs>.col,
-.gutters-xs>[class*="col-"] {
+.gutters-xs > .col,
+.gutters-xs > [class*='col-'] {
padding-right: 0.25rem;
padding-left: 0.25rem;
}
@@ -10127,8 +10171,8 @@ img {
margin-left: -0.5rem;
}
-.gutters-sm>.col,
-.gutters-sm>[class*="col-"] {
+.gutters-sm > .col,
+.gutters-sm > [class*='col-'] {
padding-right: 0.5rem;
padding-left: 0.5rem;
}
@@ -10142,8 +10186,8 @@ img {
margin-left: -1rem;
}
-.gutters-lg>.col,
-.gutters-lg>[class*="col-"] {
+.gutters-lg > .col,
+.gutters-lg > [class*='col-'] {
padding-right: 1rem;
padding-left: 1rem;
}
@@ -10157,8 +10201,8 @@ img {
margin-left: -1.5rem;
}
-.gutters-xl>.col,
-.gutters-xl>[class*="col-"] {
+.gutters-xl > .col,
+.gutters-xl > [class*='col-'] {
padding-right: 1.5rem;
padding-left: 1.5rem;
}
@@ -10388,8 +10432,8 @@ body.fixed-header .header {
width: auto;
}
-[data-theme=dark] .header-brand-img {
- filter:invert(1);
+[data-theme='dark'] .header-brand-img {
+ filter: invert(1);
}
.header-avatar {
@@ -10414,7 +10458,7 @@ body.fixed-header .header {
}
.header-btn.has-new:before {
- content: "";
+ content: '';
width: 6px;
height: 6px;
background: #cd201f;
@@ -10445,7 +10489,9 @@ body.fixed-header .header {
top: 50%;
left: 50%;
margin: -2px 0 0 -0.5rem;
- box-shadow: 0 5px currentColor, 0 -5px currentColor;
+ box-shadow:
+ 0 5px currentColor,
+ 0 -5px currentColor;
}
.footer {
@@ -11920,7 +11966,7 @@ a.icon:hover {
.btn-secondary:not(:disabled):not(.disabled):active,
.btn-secondary:not(:disabled):not(.disabled).active,
-.show>.btn-secondary.dropdown-toggle {
+.show > .btn-secondary.dropdown-toggle {
color: #495057;
background-color: #e6e5e5;
border-color: rgba(0, 15, 36, 0.12);
@@ -11928,7 +11974,7 @@ a.icon:hover {
.btn-secondary:not(:disabled):not(.disabled):active:focus,
.btn-secondary:not(:disabled):not(.disabled).active:focus,
-.show>.btn-secondary.dropdown-toggle:focus {
+.show > .btn-secondary.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(0, 40, 100, 0.5);
}
@@ -11968,7 +12014,7 @@ a.icon:hover {
.btn-facebook:not(:disabled):not(.disabled):active,
.btn-facebook:not(:disabled):not(.disabled).active,
-.show>.btn-facebook.dropdown-toggle {
+.show > .btn-facebook.dropdown-toggle {
color: #fff;
background-color: #2d4373;
border-color: #293e6a;
@@ -11976,7 +12022,7 @@ a.icon:hover {
.btn-facebook:not(:disabled):not(.disabled):active:focus,
.btn-facebook:not(:disabled):not(.disabled).active:focus,
-.show>.btn-facebook.dropdown-toggle:focus {
+.show > .btn-facebook.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(59, 89, 152, 0.5);
}
@@ -12006,7 +12052,7 @@ a.icon:hover {
.btn-twitter:not(:disabled):not(.disabled):active,
.btn-twitter:not(:disabled):not(.disabled).active,
-.show>.btn-twitter.dropdown-toggle {
+.show > .btn-twitter.dropdown-toggle {
color: #fff;
background-color: #0c85d0;
border-color: #0b7ec4;
@@ -12014,7 +12060,7 @@ a.icon:hover {
.btn-twitter:not(:disabled):not(.disabled):active:focus,
.btn-twitter:not(:disabled):not(.disabled).active:focus,
-.show>.btn-twitter.dropdown-toggle:focus {
+.show > .btn-twitter.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(29, 161, 242, 0.5);
}
@@ -12044,7 +12090,7 @@ a.icon:hover {
.btn-google:not(:disabled):not(.disabled):active,
.btn-google:not(:disabled):not(.disabled).active,
-.show>.btn-google.dropdown-toggle {
+.show > .btn-google.dropdown-toggle {
color: #fff;
background-color: #c63224;
border-color: #bb2f22;
@@ -12052,7 +12098,7 @@ a.icon:hover {
.btn-google:not(:disabled):not(.disabled):active:focus,
.btn-google:not(:disabled):not(.disabled).active:focus,
-.show>.btn-google.dropdown-toggle:focus {
+.show > .btn-google.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(220, 78, 65, 0.5);
}
@@ -12082,7 +12128,7 @@ a.icon:hover {
.btn-youtube:not(:disabled):not(.disabled):active,
.btn-youtube:not(:disabled):not(.disabled).active,
-.show>.btn-youtube.dropdown-toggle {
+.show > .btn-youtube.dropdown-toggle {
color: #fff;
background-color: #cc0000;
border-color: #bf0000;
@@ -12090,7 +12136,7 @@ a.icon:hover {
.btn-youtube:not(:disabled):not(.disabled):active:focus,
.btn-youtube:not(:disabled):not(.disabled).active:focus,
-.show>.btn-youtube.dropdown-toggle:focus {
+.show > .btn-youtube.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.5);
}
@@ -12120,7 +12166,7 @@ a.icon:hover {
.btn-vimeo:not(:disabled):not(.disabled):active,
.btn-vimeo:not(:disabled):not(.disabled).active,
-.show>.btn-vimeo.dropdown-toggle {
+.show > .btn-vimeo.dropdown-toggle {
color: #fff;
background-color: #1295bf;
border-color: #108cb4;
@@ -12128,7 +12174,7 @@ a.icon:hover {
.btn-vimeo:not(:disabled):not(.disabled):active:focus,
.btn-vimeo:not(:disabled):not(.disabled).active:focus,
-.show>.btn-vimeo.dropdown-toggle:focus {
+.show > .btn-vimeo.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(26, 183, 234, 0.5);
}
@@ -12158,7 +12204,7 @@ a.icon:hover {
.btn-dribbble:not(:disabled):not(.disabled):active,
.btn-dribbble:not(:disabled):not(.disabled).active,
-.show>.btn-dribbble.dropdown-toggle {
+.show > .btn-dribbble.dropdown-toggle {
color: #fff;
background-color: #e51e6b;
border-color: #dc1a65;
@@ -12166,7 +12212,7 @@ a.icon:hover {
.btn-dribbble:not(:disabled):not(.disabled):active:focus,
.btn-dribbble:not(:disabled):not(.disabled).active:focus,
-.show>.btn-dribbble.dropdown-toggle:focus {
+.show > .btn-dribbble.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(234, 76, 137, 0.5);
}
@@ -12196,7 +12242,7 @@ a.icon:hover {
.btn-github:not(:disabled):not(.disabled):active,
.btn-github:not(:disabled):not(.disabled).active,
-.show>.btn-github.dropdown-toggle {
+.show > .btn-github.dropdown-toggle {
color: #fff;
background-color: black;
border-color: black;
@@ -12204,7 +12250,7 @@ a.icon:hover {
.btn-github:not(:disabled):not(.disabled):active:focus,
.btn-github:not(:disabled):not(.disabled).active:focus,
-.show>.btn-github.dropdown-toggle:focus {
+.show > .btn-github.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(24, 23, 23, 0.5);
}
@@ -12234,7 +12280,7 @@ a.icon:hover {
.btn-instagram:not(:disabled):not(.disabled):active,
.btn-instagram:not(:disabled):not(.disabled).active,
-.show>.btn-instagram.dropdown-toggle {
+.show > .btn-instagram.dropdown-toggle {
color: #fff;
background-color: #d31e40;
border-color: #c81c3d;
@@ -12242,7 +12288,7 @@ a.icon:hover {
.btn-instagram:not(:disabled):not(.disabled):active:focus,
.btn-instagram:not(:disabled):not(.disabled).active:focus,
-.show>.btn-instagram.dropdown-toggle:focus {
+.show > .btn-instagram.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(228, 64, 95, 0.5);
}
@@ -12272,7 +12318,7 @@ a.icon:hover {
.btn-pinterest:not(:disabled):not(.disabled):active,
.btn-pinterest:not(:disabled):not(.disabled).active,
-.show>.btn-pinterest.dropdown-toggle {
+.show > .btn-pinterest.dropdown-toggle {
color: #fff;
background-color: #8c0615;
border-color: #800513;
@@ -12280,7 +12326,7 @@ a.icon:hover {
.btn-pinterest:not(:disabled):not(.disabled):active:focus,
.btn-pinterest:not(:disabled):not(.disabled).active:focus,
-.show>.btn-pinterest.dropdown-toggle:focus {
+.show > .btn-pinterest.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(189, 8, 28, 0.5);
}
@@ -12310,7 +12356,7 @@ a.icon:hover {
.btn-vk:not(:disabled):not(.disabled):active,
.btn-vk:not(:disabled):not(.disabled).active,
-.show>.btn-vk.dropdown-toggle {
+.show > .btn-vk.dropdown-toggle {
color: #fff;
background-color: #4d6a8b;
border-color: #496482;
@@ -12318,7 +12364,7 @@ a.icon:hover {
.btn-vk:not(:disabled):not(.disabled):active:focus,
.btn-vk:not(:disabled):not(.disabled).active:focus,
-.show>.btn-vk.dropdown-toggle:focus {
+.show > .btn-vk.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(99, 131, 168, 0.5);
}
@@ -12348,7 +12394,7 @@ a.icon:hover {
.btn-rss:not(:disabled):not(.disabled):active,
.btn-rss:not(:disabled):not(.disabled).active,
-.show>.btn-rss.dropdown-toggle {
+.show > .btn-rss.dropdown-toggle {
color: #fff;
background-color: #cc8400;
border-color: #bf7c00;
@@ -12356,7 +12402,7 @@ a.icon:hover {
.btn-rss:not(:disabled):not(.disabled):active:focus,
.btn-rss:not(:disabled):not(.disabled).active:focus,
-.show>.btn-rss.dropdown-toggle:focus {
+.show > .btn-rss.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(255, 165, 0, 0.5);
}
@@ -12386,7 +12432,7 @@ a.icon:hover {
.btn-flickr:not(:disabled):not(.disabled):active,
.btn-flickr:not(:disabled):not(.disabled).active,
-.show>.btn-flickr.dropdown-toggle {
+.show > .btn-flickr.dropdown-toggle {
color: #fff;
background-color: #004ca9;
border-color: #00469c;
@@ -12394,7 +12440,7 @@ a.icon:hover {
.btn-flickr:not(:disabled):not(.disabled):active:focus,
.btn-flickr:not(:disabled):not(.disabled).active:focus,
-.show>.btn-flickr.dropdown-toggle:focus {
+.show > .btn-flickr.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(0, 99, 220, 0.5);
}
@@ -12424,7 +12470,7 @@ a.icon:hover {
.btn-bitbucket:not(:disabled):not(.disabled):active,
.btn-bitbucket:not(:disabled):not(.disabled).active,
-.show>.btn-bitbucket.dropdown-toggle {
+.show > .btn-bitbucket.dropdown-toggle {
color: #fff;
background-color: #003e99;
border-color: #00388c;
@@ -12432,7 +12478,7 @@ a.icon:hover {
.btn-bitbucket:not(:disabled):not(.disabled):active:focus,
.btn-bitbucket:not(:disabled):not(.disabled).active:focus,
-.show>.btn-bitbucket.dropdown-toggle:focus {
+.show > .btn-bitbucket.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(0, 82, 204, 0.5);
}
@@ -12462,7 +12508,7 @@ a.icon:hover {
.btn-blue:not(:disabled):not(.disabled):active,
.btn-blue:not(:disabled):not(.disabled).active,
-.show>.btn-blue.dropdown-toggle {
+.show > .btn-blue.dropdown-toggle {
color: #fff;
background-color: #2f66b3;
border-color: #2c60a9;
@@ -12470,7 +12516,7 @@ a.icon:hover {
.btn-blue:not(:disabled):not(.disabled):active:focus,
.btn-blue:not(:disabled):not(.disabled).active:focus,
-.show>.btn-blue.dropdown-toggle:focus {
+.show > .btn-blue.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.5);
}
@@ -12500,7 +12546,7 @@ a.icon:hover {
.btn-indigo:not(:disabled):not(.disabled):active,
.btn-indigo:not(:disabled):not(.disabled).active,
-.show>.btn-indigo.dropdown-toggle {
+.show > .btn-indigo.dropdown-toggle {
color: #fff;
background-color: #3f51c1;
border-color: #3b4db7;
@@ -12508,7 +12554,7 @@ a.icon:hover {
.btn-indigo:not(:disabled):not(.disabled):active:focus,
.btn-indigo:not(:disabled):not(.disabled).active:focus,
-.show>.btn-indigo.dropdown-toggle:focus {
+.show > .btn-indigo.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(101, 116, 205, 0.5);
}
@@ -12538,7 +12584,7 @@ a.icon:hover {
.btn-purple:not(:disabled):not(.disabled):active,
.btn-purple:not(:disabled):not(.disabled).active,
-.show>.btn-purple.dropdown-toggle {
+.show > .btn-purple.dropdown-toggle {
color: #fff;
background-color: #8c31e4;
border-color: #8526e3;
@@ -12546,7 +12592,7 @@ a.icon:hover {
.btn-purple:not(:disabled):not(.disabled):active:focus,
.btn-purple:not(:disabled):not(.disabled).active:focus,
-.show>.btn-purple.dropdown-toggle:focus {
+.show > .btn-purple.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(165, 94, 234, 0.5);
}
@@ -12576,7 +12622,7 @@ a.icon:hover {
.btn-pink:not(:disabled):not(.disabled):active,
.btn-pink:not(:disabled):not(.disabled).active,
-.show>.btn-pink.dropdown-toggle {
+.show > .btn-pink.dropdown-toggle {
color: #fff;
background-color: #f33d7a;
border-color: #f23172;
@@ -12584,7 +12630,7 @@ a.icon:hover {
.btn-pink:not(:disabled):not(.disabled):active:focus,
.btn-pink:not(:disabled):not(.disabled).active:focus,
-.show>.btn-pink.dropdown-toggle:focus {
+.show > .btn-pink.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(246, 109, 155, 0.5);
}
@@ -12614,7 +12660,7 @@ a.icon:hover {
.btn-red:not(:disabled):not(.disabled):active,
.btn-red:not(:disabled):not(.disabled).active,
-.show>.btn-red.dropdown-toggle {
+.show > .btn-red.dropdown-toggle {
color: #fff;
background-color: #a11918;
border-color: #961717;
@@ -12622,7 +12668,7 @@ a.icon:hover {
.btn-red:not(:disabled):not(.disabled):active:focus,
.btn-red:not(:disabled):not(.disabled).active:focus,
-.show>.btn-red.dropdown-toggle:focus {
+.show > .btn-red.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(205, 32, 31, 0.5);
}
@@ -12652,7 +12698,7 @@ a.icon:hover {
.btn-orange:not(:disabled):not(.disabled):active,
.btn-orange:not(:disabled):not(.disabled).active,
-.show>.btn-orange.dropdown-toggle {
+.show > .btn-orange.dropdown-toggle {
color: #fff;
background-color: #fc7a12;
border-color: #fc7305;
@@ -12660,7 +12706,7 @@ a.icon:hover {
.btn-orange:not(:disabled):not(.disabled):active:focus,
.btn-orange:not(:disabled):not(.disabled).active:focus,
-.show>.btn-orange.dropdown-toggle:focus {
+.show > .btn-orange.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(253, 150, 68, 0.5);
}
@@ -12690,7 +12736,7 @@ a.icon:hover {
.btn-yellow:not(:disabled):not(.disabled):active,
.btn-yellow:not(:disabled):not(.disabled).active,
-.show>.btn-yellow.dropdown-toggle {
+.show > .btn-yellow.dropdown-toggle {
color: #fff;
background-color: #c29d0b;
border-color: #b6940b;
@@ -12698,7 +12744,7 @@ a.icon:hover {
.btn-yellow:not(:disabled):not(.disabled):active:focus,
.btn-yellow:not(:disabled):not(.disabled).active:focus,
-.show>.btn-yellow.dropdown-toggle:focus {
+.show > .btn-yellow.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(241, 196, 15, 0.5);
}
@@ -12728,7 +12774,7 @@ a.icon:hover {
.btn-green:not(:disabled):not(.disabled):active,
.btn-green:not(:disabled):not(.disabled).active,
-.show>.btn-green.dropdown-toggle {
+.show > .btn-green.dropdown-toggle {
color: #fff;
background-color: #448700;
border-color: #3e7a00;
@@ -12736,7 +12782,7 @@ a.icon:hover {
.btn-green:not(:disabled):not(.disabled):active:focus,
.btn-green:not(:disabled):not(.disabled).active:focus,
-.show>.btn-green.dropdown-toggle:focus {
+.show > .btn-green.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(94, 186, 0, 0.5);
}
@@ -12766,7 +12812,7 @@ a.icon:hover {
.btn-teal:not(:disabled):not(.disabled):active,
.btn-teal:not(:disabled):not(.disabled).active,
-.show>.btn-teal.dropdown-toggle {
+.show > .btn-teal.dropdown-toggle {
color: #fff;
background-color: #22a193;
border-color: #20968a;
@@ -12774,7 +12820,7 @@ a.icon:hover {
.btn-teal:not(:disabled):not(.disabled):active:focus,
.btn-teal:not(:disabled):not(.disabled).active:focus,
-.show>.btn-teal.dropdown-toggle:focus {
+.show > .btn-teal.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(43, 203, 186, 0.5);
}
@@ -12804,7 +12850,7 @@ a.icon:hover {
.btn-cyan:not(:disabled):not(.disabled):active,
.btn-cyan:not(:disabled):not(.disabled).active,
-.show>.btn-cyan.dropdown-toggle {
+.show > .btn-cyan.dropdown-toggle {
color: #fff;
background-color: #117a8b;
border-color: #10707f;
@@ -12812,7 +12858,7 @@ a.icon:hover {
.btn-cyan:not(:disabled):not(.disabled):active:focus,
.btn-cyan:not(:disabled):not(.disabled).active:focus,
-.show>.btn-cyan.dropdown-toggle:focus {
+.show > .btn-cyan.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(23, 162, 184, 0.5);
}
@@ -12842,7 +12888,7 @@ a.icon:hover {
.btn-white:not(:disabled):not(.disabled):active,
.btn-white:not(:disabled):not(.disabled).active,
-.show>.btn-white.dropdown-toggle {
+.show > .btn-white.dropdown-toggle {
color: #495057;
background-color: #e6e5e5;
border-color: #dfdfdf;
@@ -12850,7 +12896,7 @@ a.icon:hover {
.btn-white:not(:disabled):not(.disabled):active:focus,
.btn-white:not(:disabled):not(.disabled).active:focus,
-.show>.btn-white.dropdown-toggle:focus {
+.show > .btn-white.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5);
}
@@ -12880,7 +12926,7 @@ a.icon:hover {
.btn-gray:not(:disabled):not(.disabled):active,
.btn-gray:not(:disabled):not(.disabled).active,
-.show>.btn-gray.dropdown-toggle {
+.show > .btn-gray.dropdown-toggle {
color: #fff;
background-color: #6c757d;
border-color: #666e76;
@@ -12888,7 +12934,7 @@ a.icon:hover {
.btn-gray:not(:disabled):not(.disabled):active:focus,
.btn-gray:not(:disabled):not(.disabled).active:focus,
-.show>.btn-gray.dropdown-toggle:focus {
+.show > .btn-gray.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
}
@@ -12918,7 +12964,7 @@ a.icon:hover {
.btn-gray-dark:not(:disabled):not(.disabled):active,
.btn-gray-dark:not(:disabled):not(.disabled).active,
-.show>.btn-gray-dark.dropdown-toggle {
+.show > .btn-gray-dark.dropdown-toggle {
color: #fff;
background-color: #1d2124;
border-color: #171a1d;
@@ -12926,7 +12972,7 @@ a.icon:hover {
.btn-gray-dark:not(:disabled):not(.disabled):active:focus,
.btn-gray-dark:not(:disabled):not(.disabled).active:focus,
-.show>.btn-gray-dark.dropdown-toggle:focus {
+.show > .btn-gray-dark.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(52, 58, 64, 0.5);
}
@@ -12956,7 +13002,7 @@ a.icon:hover {
.btn-azure:not(:disabled):not(.disabled):active,
.btn-azure:not(:disabled):not(.disabled).active,
-.show>.btn-azure.dropdown-toggle {
+.show > .btn-azure.dropdown-toggle {
color: #fff;
background-color: #1594ef;
border-color: #108ee7;
@@ -12964,7 +13010,7 @@ a.icon:hover {
.btn-azure:not(:disabled):not(.disabled):active:focus,
.btn-azure:not(:disabled):not(.disabled).active:focus,
-.show>.btn-azure.dropdown-toggle:focus {
+.show > .btn-azure.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(69, 170, 242, 0.5);
}
@@ -12994,7 +13040,7 @@ a.icon:hover {
.btn-lime:not(:disabled):not(.disabled):active,
.btn-lime:not(:disabled):not(.disabled).active,
-.show>.btn-lime.dropdown-toggle {
+.show > .btn-lime.dropdown-toggle {
color: #fff;
background-color: #63ad27;
border-color: #5da324;
@@ -13002,7 +13048,7 @@ a.icon:hover {
.btn-lime:not(:disabled):not(.disabled):active:focus,
.btn-lime:not(:disabled):not(.disabled).active:focus,
-.show>.btn-lime.dropdown-toggle:focus {
+.show > .btn-lime.dropdown-toggle:focus {
box-shadow: 0 0 0 2px rgba(123, 210, 53, 0.5);
}
@@ -13021,13 +13067,13 @@ a.icon:hover {
}
.btn-sm,
-.btn-group-sm>.btn {
+.btn-group-sm > .btn {
font-size: 0.75rem;
min-width: 1.625rem;
}
.btn-lg,
-.btn-group-lg>.btn {
+.btn-group-lg > .btn {
font-size: 1rem;
min-width: 2.75rem;
font-weight: 400;
@@ -13038,13 +13084,13 @@ a.icon:hover {
font-size: 0;
}
-.btn-list>.btn,
-.btn-list>.dropdown {
+.btn-list > .btn,
+.btn-list > .dropdown {
margin-bottom: 0.5rem;
}
-.btn-list>.btn:not(:last-child),
-.btn-list>.dropdown:not(:last-child) {
+.btn-list > .btn:not(:last-child),
+.btn-list > .dropdown:not(:last-child) {
margin-right: 0.5rem;
}
@@ -13055,7 +13101,7 @@ a.icon:hover {
}
.btn-loading:after {
- content: "";
+ content: '';
-webkit-animation: loader 500ms infinite linear;
animation: loader 500ms infinite linear;
border: 2px solid #fff;
@@ -13074,7 +13120,7 @@ a.icon:hover {
}
.btn-loading.btn-sm:after,
-.btn-group-sm>.btn-loading.btn:after {
+.btn-group-sm > .btn-loading.btn:after {
height: 1em;
width: 1em;
left: calc(50% - (1em / 2));
@@ -13093,7 +13139,7 @@ a.icon:hover {
padding-left: 3rem;
}
-.alert-icon>i {
+.alert-icon > i {
color: inherit !important;
font-size: 1rem;
position: absolute;
@@ -13118,7 +13164,7 @@ a.icon:hover {
}
.close:before {
- content: "";
+ content: '';
position: relative;
top: 4px;
display: inline-block;
@@ -13126,7 +13172,7 @@ a.icon:hover {
height: 20px;
background-size: 100%;
background-repeat: no-repeat;
- background-image: url('./svg/x.svg');
+ background-image: url("data:image/svg+xml;base64,PHN2ZyBzdHJva2U9IiM4NDg2OGMiIGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIgogICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0ibTE4IDYtMTIgMTIiLz4KICAgIDxwYXRoIGQ9Im02IDYgMTIgMTIiLz4KPC9zdmc+Cg==");
}
.badge {
@@ -13202,12 +13248,14 @@ a.icon:hover {
background: #f8f9fa;
color: #495057;
font-weight: 600;
- transition: 0.3s background, 0.3s color;
+ transition:
+ 0.3s background,
+ 0.3s color;
position: relative;
}
.table-calendar-link:before {
- content: "";
+ content: '';
width: 4px;
height: 4px;
position: absolute;
@@ -13238,7 +13286,7 @@ a.icon:hover {
}
.table-header:after {
- content: "\f0dc";
+ content: '\f0dc';
font-family: FontAwesome;
display: inline-block;
margin-left: 0.5rem;
@@ -13250,7 +13298,7 @@ a.icon:hover {
}
.table-header-asc:after {
- content: "\f0de";
+ content: '\f0de';
}
.table-header-desc {
@@ -13258,7 +13306,7 @@ a.icon:hover {
}
.table-header-desc:after {
- content: "\f0dd";
+ content: '\f0dd';
}
.page-breadcrumb {
@@ -13333,11 +13381,11 @@ a.icon:hover {
position: relative;
}
-.card-body+.card-body {
+.card-body + .card-body {
border-top: 1px solid rgba(0, 40, 100, 0.12);
}
-.card-body> :last-child {
+.card-body > :last-child {
margin-bottom: 0;
}
@@ -13376,7 +13424,7 @@ a.icon:hover {
margin-bottom: 0;
}
-.card-header.border-0+.card-body {
+.card-header.border-0 + .card-body {
padding-top: 0;
}
@@ -13443,7 +13491,7 @@ a.icon:hover {
padding-right: 1.5rem;
}
-.card-body+.card-table {
+.card-body + .card-table {
border-top: 1px solid rgba(0, 40, 100, 0.12);
}
@@ -13461,11 +13509,11 @@ a.icon:hover {
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
-.card-link+.card-link {
+.card-link + .card-link {
margin-left: 1rem;
}
-.card-body+.card-list-group {
+.card-body + .card-list-group {
border-top: 1px solid rgba(0, 40, 100, 0.12);
}
@@ -13570,16 +13618,16 @@ a.icon:hover {
Card options
*/
-.card-collapsed> :not(.card-header):not(.card-status) {
+.card-collapsed > :not(.card-header):not(.card-status) {
display: none;
}
.card-collapsed .card-options-collapse i:before {
- content: "\e92d";
+ content: '\e92d';
}
.card-fullscreen .card-options-fullscreen i:before {
- content: "\e992";
+ content: '\e992';
}
.card-fullscreen .card-options-remove {
@@ -13645,7 +13693,7 @@ a.card-tabs-item.active {
border-bottom-color: #fff;
}
-.card-tabs-item+.card-tabs-item {
+.card-tabs-item + .card-tabs-item {
border-left: 1px solid rgba(0, 40, 100, 0.12);
}
@@ -13720,7 +13768,7 @@ Card alert
}
.popover.bs-popover-top,
-.popover.bs-popover-auto[x-placement^="top"] {
+.popover.bs-popover-auto[x-placement^='top'] {
margin-bottom: 0.625rem;
}
@@ -13741,7 +13789,7 @@ Card alert
color: #6e7687;
}
-[data-theme=dark] .dropdown-item {
+[data-theme='dark'] .dropdown-item {
color: #ffffff;
}
@@ -13754,10 +13802,10 @@ Card alert
border-bottom: 5px solid rgba(0, 40, 100, 0.12);
border-left: 5px solid transparent;
border-bottom-color: rgba(0, 0, 0, 0.2);
- content: "";
+ content: '';
}
-[data-theme=dark] .dropdown-menu-arrow:before {
+[data-theme='dark'] .dropdown-menu-arrow:before {
border-bottom-color: var(--ctrl-bgcolor);
}
@@ -13769,10 +13817,10 @@ Card alert
border-right: 5px solid transparent;
border-bottom: 5px solid var(--ctrl-bgcolor);
border-left: 5px solid transparent;
- content: "";
+ content: '';
}
-[data-theme=dark] .dropdown-menu-arrow:after {
+[data-theme='dark'] .dropdown-menu-arrow:after {
border-bottom: 5px solid var(--card-border-color);
}
@@ -13808,8 +13856,8 @@ Card alert
vertical-align: -1px;
}
-.list-inline-dots .list-inline-item+.list-inline-item:before {
- content: "· ";
+.list-inline-dots .list-inline-item + .list-inline-item:before {
+ content: '· ';
margin-left: -2px;
margin-right: 3px;
}
@@ -13826,7 +13874,7 @@ Card alert
padding-bottom: 0;
}
-.list-separated-item+.list-separated-item {
+.list-separated-item + .list-separated-item {
border-top: 1px solid rgba(0, 40, 100, 0.12);
}
@@ -13917,7 +13965,9 @@ Card alert
}
.avatar-placeholder {
- background: #ced4da url('data:image/svg+xml;charset=utf8,
') no-repeat center/80%;
+ background: #ced4da
+ url('data:image/svg+xml;charset=utf8,
')
+ no-repeat center/80%;
}
.avatar-list {
@@ -14089,7 +14139,7 @@ Card alert
.progress-bar-indeterminate:after,
.progress-bar-indeterminate:before {
- content: "";
+ content: '';
position: absolute;
background-color: inherit;
left: 0;
@@ -14178,7 +14228,7 @@ Loader
height: 2.5rem;
margin: -1.25rem 0 0 -1.25rem;
position: absolute;
- content: "";
+ content: '';
top: 50%;
left: 50%;
}
@@ -14211,7 +14261,7 @@ Loader
flex-wrap: wrap;
}
-.icons-list>li {
+.icons-list > li {
-ms-flex: 1 0 4rem;
flex: 1 0 4rem;
}
@@ -14243,8 +14293,8 @@ Loader
margin-bottom: -0.5rem;
}
-.img-gallery>.col,
-.img-gallery>[class*="col-"] {
+.img-gallery > .col,
+.img-gallery > [class*='col-'] {
padding-left: 0.25rem;
padding-right: 0.25rem;
padding-bottom: 0.5rem;
@@ -14347,18 +14397,18 @@ textarea[cols] {
font-size: 0.9375rem;
}
-.input-group-prepend>.btn,
-.input-group-append>.btn,
-.input-group-btn>.btn {
+.input-group-prepend > .btn,
+.input-group-append > .btn,
+.input-group-btn > .btn {
height: 100%;
border-color: rgba(0, 40, 100, 0.12);
}
-.input-group-prepend>.input-group-text {
+.input-group-prepend > .input-group-text {
border-right: 0;
}
-.input-group-append>.input-group-text {
+.input-group-append > .input-group-text {
border-left: 0;
}
@@ -14412,17 +14462,19 @@ Icon input
}
.form-required:before {
- content: " ";
+ content: ' ';
}
.state-valid {
padding-right: 2rem;
- background: url("data:image/svg+xml;charset=utf8,
") no-repeat center right 0.5rem/1rem;
+ background: url("data:image/svg+xml;charset=utf8,
")
+ no-repeat center right 0.5rem/1rem;
}
.state-invalid {
padding-right: 2rem;
- background: url("data:image/svg+xml;charset=utf8,
") no-repeat center right 0.5rem/1rem;
+ background: url("data:image/svg+xml;charset=utf8,
")
+ no-repeat center right 0.5rem/1rem;
}
.form-help {
@@ -14435,7 +14487,9 @@ Icon input
background: #f8f9fa;
border-radius: 50%;
font-size: 0.75rem;
- transition: 0.3s background-color, 0.3s color;
+ transition:
+ 0.3s background-color,
+ 0.3s color;
text-decoration: none;
cursor: pointer;
-webkit-user-select: none;
@@ -14511,13 +14565,13 @@ Icon input
}
.map-header:before {
- content: "";
+ content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 10rem;
- background: linear-gradient( to bottom, rgba(245, 247, 251, 0) 5%, #f5f7fb 95%);
+ background: linear-gradient(to bottom, rgba(245, 247, 251, 0) 5%, #f5f7fb 95%);
pointer-events: none;
}
@@ -14554,7 +14608,7 @@ Icon input
}
.status-icon {
- content: "";
+ content: '';
width: 0.5rem;
height: 0.5rem;
display: inline-block;
@@ -14706,7 +14760,7 @@ a.chip:hover {
flex-direction: row-reverse;
}
-.chat-line+.chat-line {
+.chat-line + .chat-line {
padding-top: 1rem;
}
@@ -14724,12 +14778,12 @@ a.chip:hover {
line-height: 1.4;
}
-.chat-message> :last-child {
+.chat-message > :last-child {
margin-bottom: 0 !important;
}
.chat-message:after {
- content: "";
+ content: '';
position: absolute;
right: -5px;
top: 7px;
@@ -14751,15 +14805,15 @@ a.chip:hover {
flex-direction: row;
}
-.chat-line-friend+.chat-line-friend {
+.chat-line-friend + .chat-line-friend {
margin-top: -0.5rem;
}
-.chat-line-friend+.chat-line-friend .chat-author {
+.chat-line-friend + .chat-line-friend .chat-author {
visibility: hidden;
}
-.chat-line-friend+.chat-line-friend .chat-message:after {
+.chat-line-friend + .chat-line-friend .chat-message:after {
display: none;
}
@@ -14788,7 +14842,7 @@ a.chip:hover {
background: #f5f7fb;
}
-.example+.highlight {
+.example + .highlight {
border-top: none;
margin-top: 0;
border-radius: 0 0 3px 3px;
@@ -14813,7 +14867,7 @@ a.chip:hover {
margin: 0 auto;
}
-.example-column>.card:last-of-type {
+.example-column > .card:last-of-type {
margin-bottom: 0;
}
@@ -14845,7 +14899,9 @@ a.chip:hover {
a.tag {
text-decoration: none;
cursor: pointer;
- transition: 0.3s color, 0.3s background;
+ transition:
+ 0.3s color,
+ 0.3s background;
}
a.tag:hover {
@@ -14877,7 +14933,9 @@ a.tag:hover {
a.tag-addon {
text-decoration: none;
cursor: pointer;
- transition: 0.3s color, 0.3s background;
+ transition:
+ 0.3s color,
+ 0.3s background;
}
a.tag-addon:hover {
@@ -15020,11 +15078,11 @@ a.tag-addon:hover {
font-size: 0;
}
-.tags>.tag {
+.tags > .tag {
margin-bottom: 0.5rem;
}
-.tags>.tag:not(:last-child) {
+.tags > .tag:not(:last-child) {
margin-right: 0.5rem;
}
@@ -15268,15 +15326,15 @@ a.tag-addon:hover {
}
.highlight .css .o,
-.highlight .css .o+.nt,
-.highlight .css .nt+.nt {
+.highlight .css .o + .nt,
+.highlight .css .nt + .nt {
color: #999;
}
.highlight .language-bash::before,
.highlight .language-sh::before {
color: #009;
- content: "$ ";
+ content: '$ ';
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
@@ -15285,7 +15343,7 @@ a.tag-addon:hover {
.highlight .language-powershell::before {
color: #009;
- content: "PM> ";
+ content: 'PM> ';
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
@@ -15335,7 +15393,7 @@ a.tag-addon:hover {
.custom-range::-webkit-slider-runnable-track {
background: #467fcf;
- content: "";
+ content: '';
height: 2px;
pointer-events: none;
}
@@ -15347,10 +15405,248 @@ a.tag-addon:hover {
appearance: none;
background: #fff;
border-radius: 50px;
- box-shadow: 1px 0 0 -6px rgba(0, 50, 126, 0.12), 6px 0 0 -6px rgba(0, 50, 126, 0.12), 7px 0 0 -6px rgba(0, 50, 126, 0.12), 8px 0 0 -6px rgba(0, 50, 126, 0.12), 9px 0 0 -6px rgba(0, 50, 126, 0.12), 10px 0 0 -6px rgba(0, 50, 126, 0.12), 11px 0 0 -6px rgba(0, 50, 126, 0.12), 12px 0 0 -6px rgba(0, 50, 126, 0.12), 13px 0 0 -6px rgba(0, 50, 126, 0.12), 14px 0 0 -6px rgba(0, 50, 126, 0.12), 15px 0 0 -6px rgba(0, 50, 126, 0.12), 16px 0 0 -6px rgba(0, 50, 126, 0.12), 17px 0 0 -6px rgba(0, 50, 126, 0.12), 18px 0 0 -6px rgba(0, 50, 126, 0.12), 19px 0 0 -6px rgba(0, 50, 126, 0.12), 20px 0 0 -6px rgba(0, 50, 126, 0.12), 21px 0 0 -6px rgba(0, 50, 126, 0.12), 22px 0 0 -6px rgba(0, 50, 126, 0.12), 23px 0 0 -6px rgba(0, 50, 126, 0.12), 24px 0 0 -6px rgba(0, 50, 126, 0.12), 25px 0 0 -6px rgba(0, 50, 126, 0.12), 26px 0 0 -6px rgba(0, 50, 126, 0.12), 27px 0 0 -6px rgba(0, 50, 126, 0.12), 28px 0 0 -6px rgba(0, 50, 126, 0.12), 29px 0 0 -6px rgba(0, 50, 126, 0.12), 30px 0 0 -6px rgba(0, 50, 126, 0.12), 31px 0 0 -6px rgba(0, 50, 126, 0.12), 32px 0 0 -6px rgba(0, 50, 126, 0.12), 33px 0 0 -6px rgba(0, 50, 126, 0.12), 34px 0 0 -6px rgba(0, 50, 126, 0.12), 35px 0 0 -6px rgba(0, 50, 126, 0.12), 36px 0 0 -6px rgba(0, 50, 126, 0.12), 37px 0 0 -6px rgba(0, 50, 126, 0.12), 38px 0 0 -6px rgba(0, 50, 126, 0.12), 39px 0 0 -6px rgba(0, 50, 126, 0.12), 40px 0 0 -6px rgba(0, 50, 126, 0.12), 41px 0 0 -6px rgba(0, 50, 126, 0.12), 42px 0 0 -6px rgba(0, 50, 126, 0.12), 43px 0 0 -6px rgba(0, 50, 126, 0.12), 44px 0 0 -6px rgba(0, 50, 126, 0.12), 45px 0 0 -6px rgba(0, 50, 126, 0.12), 46px 0 0 -6px rgba(0, 50, 126, 0.12), 47px 0 0 -6px rgba(0, 50, 126, 0.12), 48px 0 0 -6px rgba(0, 50, 126, 0.12), 49px 0 0 -6px rgba(0, 50, 126, 0.12), 50px 0 0 -6px rgba(0, 50, 126, 0.12), 51px 0 0 -6px rgba(0, 50, 126, 0.12), 52px 0 0 -6px rgba(0, 50, 126, 0.12), 53px 0 0 -6px rgba(0, 50, 126, 0.12), 54px 0 0 -6px rgba(0, 50, 126, 0.12), 55px 0 0 -6px rgba(0, 50, 126, 0.12), 56px 0 0 -6px rgba(0, 50, 126, 0.12), 57px 0 0 -6px rgba(0, 50, 126, 0.12), 58px 0 0 -6px rgba(0, 50, 126, 0.12), 59px 0 0 -6px rgba(0, 50, 126, 0.12), 60px 0 0 -6px rgba(0, 50, 126, 0.12), 61px 0 0 -6px rgba(0, 50, 126, 0.12), 62px 0 0 -6px rgba(0, 50, 126, 0.12), 63px 0 0 -6px rgba(0, 50, 126, 0.12), 64px 0 0 -6px rgba(0, 50, 126, 0.12), 65px 0 0 -6px rgba(0, 50, 126, 0.12), 66px 0 0 -6px rgba(0, 50, 126, 0.12), 67px 0 0 -6px rgba(0, 50, 126, 0.12), 68px 0 0 -6px rgba(0, 50, 126, 0.12), 69px 0 0 -6px rgba(0, 50, 126, 0.12), 70px 0 0 -6px rgba(0, 50, 126, 0.12), 71px 0 0 -6px rgba(0, 50, 126, 0.12), 72px 0 0 -6px rgba(0, 50, 126, 0.12), 73px 0 0 -6px rgba(0, 50, 126, 0.12), 74px 0 0 -6px rgba(0, 50, 126, 0.12), 75px 0 0 -6px rgba(0, 50, 126, 0.12), 76px 0 0 -6px rgba(0, 50, 126, 0.12), 77px 0 0 -6px rgba(0, 50, 126, 0.12), 78px 0 0 -6px rgba(0, 50, 126, 0.12), 79px 0 0 -6px rgba(0, 50, 126, 0.12), 80px 0 0 -6px rgba(0, 50, 126, 0.12), 81px 0 0 -6px rgba(0, 50, 126, 0.12), 82px 0 0 -6px rgba(0, 50, 126, 0.12), 83px 0 0 -6px rgba(0, 50, 126, 0.12), 84px 0 0 -6px rgba(0, 50, 126, 0.12), 85px 0 0 -6px rgba(0, 50, 126, 0.12), 86px 0 0 -6px rgba(0, 50, 126, 0.12), 87px 0 0 -6px rgba(0, 50, 126, 0.12), 88px 0 0 -6px rgba(0, 50, 126, 0.12), 89px 0 0 -6px rgba(0, 50, 126, 0.12), 90px 0 0 -6px rgba(0, 50, 126, 0.12), 91px 0 0 -6px rgba(0, 50, 126, 0.12), 92px 0 0 -6px rgba(0, 50, 126, 0.12), 93px 0 0 -6px rgba(0, 50, 126, 0.12), 94px 0 0 -6px rgba(0, 50, 126, 0.12), 95px 0 0 -6px rgba(0, 50, 126, 0.12), 96px 0 0 -6px rgba(0, 50, 126, 0.12), 97px 0 0 -6px rgba(0, 50, 126, 0.12), 98px 0 0 -6px rgba(0, 50, 126, 0.12), 99px 0 0 -6px rgba(0, 50, 126, 0.12), 100px 0 0 -6px rgba(0, 50, 126, 0.12), 101px 0 0 -6px rgba(0, 50, 126, 0.12), 102px 0 0 -6px rgba(0, 50, 126, 0.12), 103px 0 0 -6px rgba(0, 50, 126, 0.12), 104px 0 0 -6px rgba(0, 50, 126, 0.12), 105px 0 0 -6px rgba(0, 50, 126, 0.12), 106px 0 0 -6px rgba(0, 50, 126, 0.12), 107px 0 0 -6px rgba(0, 50, 126, 0.12), 108px 0 0 -6px rgba(0, 50, 126, 0.12), 109px 0 0 -6px rgba(0, 50, 126, 0.12), 110px 0 0 -6px rgba(0, 50, 126, 0.12), 111px 0 0 -6px rgba(0, 50, 126, 0.12), 112px 0 0 -6px rgba(0, 50, 126, 0.12), 113px 0 0 -6px rgba(0, 50, 126, 0.12), 114px 0 0 -6px rgba(0, 50, 126, 0.12), 115px 0 0 -6px rgba(0, 50, 126, 0.12), 116px 0 0 -6px rgba(0, 50, 126, 0.12), 117px 0 0 -6px rgba(0, 50, 126, 0.12), 118px 0 0 -6px rgba(0, 50, 126, 0.12), 119px 0 0 -6px rgba(0, 50, 126, 0.12), 120px 0 0 -6px rgba(0, 50, 126, 0.12), 121px 0 0 -6px rgba(0, 50, 126, 0.12), 122px 0 0 -6px rgba(0, 50, 126, 0.12), 123px 0 0 -6px rgba(0, 50, 126, 0.12), 124px 0 0 -6px rgba(0, 50, 126, 0.12), 125px 0 0 -6px rgba(0, 50, 126, 0.12), 126px 0 0 -6px rgba(0, 50, 126, 0.12), 127px 0 0 -6px rgba(0, 50, 126, 0.12), 128px 0 0 -6px rgba(0, 50, 126, 0.12), 129px 0 0 -6px rgba(0, 50, 126, 0.12), 130px 0 0 -6px rgba(0, 50, 126, 0.12), 131px 0 0 -6px rgba(0, 50, 126, 0.12), 132px 0 0 -6px rgba(0, 50, 126, 0.12), 133px 0 0 -6px rgba(0, 50, 126, 0.12), 134px 0 0 -6px rgba(0, 50, 126, 0.12), 135px 0 0 -6px rgba(0, 50, 126, 0.12), 136px 0 0 -6px rgba(0, 50, 126, 0.12), 137px 0 0 -6px rgba(0, 50, 126, 0.12), 138px 0 0 -6px rgba(0, 50, 126, 0.12), 139px 0 0 -6px rgba(0, 50, 126, 0.12), 140px 0 0 -6px rgba(0, 50, 126, 0.12), 141px 0 0 -6px rgba(0, 50, 126, 0.12), 142px 0 0 -6px rgba(0, 50, 126, 0.12), 143px 0 0 -6px rgba(0, 50, 126, 0.12), 144px 0 0 -6px rgba(0, 50, 126, 0.12), 145px 0 0 -6px rgba(0, 50, 126, 0.12), 146px 0 0 -6px rgba(0, 50, 126, 0.12), 147px 0 0 -6px rgba(0, 50, 126, 0.12), 148px 0 0 -6px rgba(0, 50, 126, 0.12), 149px 0 0 -6px rgba(0, 50, 126, 0.12), 150px 0 0 -6px rgba(0, 50, 126, 0.12), 151px 0 0 -6px rgba(0, 50, 126, 0.12), 152px 0 0 -6px rgba(0, 50, 126, 0.12), 153px 0 0 -6px rgba(0, 50, 126, 0.12), 154px 0 0 -6px rgba(0, 50, 126, 0.12), 155px 0 0 -6px rgba(0, 50, 126, 0.12), 156px 0 0 -6px rgba(0, 50, 126, 0.12), 157px 0 0 -6px rgba(0, 50, 126, 0.12), 158px 0 0 -6px rgba(0, 50, 126, 0.12), 159px 0 0 -6px rgba(0, 50, 126, 0.12), 160px 0 0 -6px rgba(0, 50, 126, 0.12), 161px 0 0 -6px rgba(0, 50, 126, 0.12), 162px 0 0 -6px rgba(0, 50, 126, 0.12), 163px 0 0 -6px rgba(0, 50, 126, 0.12), 164px 0 0 -6px rgba(0, 50, 126, 0.12), 165px 0 0 -6px rgba(0, 50, 126, 0.12), 166px 0 0 -6px rgba(0, 50, 126, 0.12), 167px 0 0 -6px rgba(0, 50, 126, 0.12), 168px 0 0 -6px rgba(0, 50, 126, 0.12), 169px 0 0 -6px rgba(0, 50, 126, 0.12), 170px 0 0 -6px rgba(0, 50, 126, 0.12), 171px 0 0 -6px rgba(0, 50, 126, 0.12), 172px 0 0 -6px rgba(0, 50, 126, 0.12), 173px 0 0 -6px rgba(0, 50, 126, 0.12), 174px 0 0 -6px rgba(0, 50, 126, 0.12), 175px 0 0 -6px rgba(0, 50, 126, 0.12), 176px 0 0 -6px rgba(0, 50, 126, 0.12), 177px 0 0 -6px rgba(0, 50, 126, 0.12), 178px 0 0 -6px rgba(0, 50, 126, 0.12), 179px 0 0 -6px rgba(0, 50, 126, 0.12), 180px 0 0 -6px rgba(0, 50, 126, 0.12), 181px 0 0 -6px rgba(0, 50, 126, 0.12), 182px 0 0 -6px rgba(0, 50, 126, 0.12), 183px 0 0 -6px rgba(0, 50, 126, 0.12), 184px 0 0 -6px rgba(0, 50, 126, 0.12), 185px 0 0 -6px rgba(0, 50, 126, 0.12), 186px 0 0 -6px rgba(0, 50, 126, 0.12), 187px 0 0 -6px rgba(0, 50, 126, 0.12), 188px 0 0 -6px rgba(0, 50, 126, 0.12), 189px 0 0 -6px rgba(0, 50, 126, 0.12), 190px 0 0 -6px rgba(0, 50, 126, 0.12), 191px 0 0 -6px rgba(0, 50, 126, 0.12), 192px 0 0 -6px rgba(0, 50, 126, 0.12), 193px 0 0 -6px rgba(0, 50, 126, 0.12), 194px 0 0 -6px rgba(0, 50, 126, 0.12), 195px 0 0 -6px rgba(0, 50, 126, 0.12), 196px 0 0 -6px rgba(0, 50, 126, 0.12), 197px 0 0 -6px rgba(0, 50, 126, 0.12), 198px 0 0 -6px rgba(0, 50, 126, 0.12), 199px 0 0 -6px rgba(0, 50, 126, 0.12), 200px 0 0 -6px rgba(0, 50, 126, 0.12), 201px 0 0 -6px rgba(0, 50, 126, 0.12), 202px 0 0 -6px rgba(0, 50, 126, 0.12), 203px 0 0 -6px rgba(0, 50, 126, 0.12), 204px 0 0 -6px rgba(0, 50, 126, 0.12), 205px 0 0 -6px rgba(0, 50, 126, 0.12), 206px 0 0 -6px rgba(0, 50, 126, 0.12), 207px 0 0 -6px rgba(0, 50, 126, 0.12), 208px 0 0 -6px rgba(0, 50, 126, 0.12), 209px 0 0 -6px rgba(0, 50, 126, 0.12), 210px 0 0 -6px rgba(0, 50, 126, 0.12), 211px 0 0 -6px rgba(0, 50, 126, 0.12), 212px 0 0 -6px rgba(0, 50, 126, 0.12), 213px 0 0 -6px rgba(0, 50, 126, 0.12), 214px 0 0 -6px rgba(0, 50, 126, 0.12), 215px 0 0 -6px rgba(0, 50, 126, 0.12), 216px 0 0 -6px rgba(0, 50, 126, 0.12), 217px 0 0 -6px rgba(0, 50, 126, 0.12), 218px 0 0 -6px rgba(0, 50, 126, 0.12), 219px 0 0 -6px rgba(0, 50, 126, 0.12), 220px 0 0 -6px rgba(0, 50, 126, 0.12), 221px 0 0 -6px rgba(0, 50, 126, 0.12), 222px 0 0 -6px rgba(0, 50, 126, 0.12), 223px 0 0 -6px rgba(0, 50, 126, 0.12), 224px 0 0 -6px rgba(0, 50, 126, 0.12), 225px 0 0 -6px rgba(0, 50, 126, 0.12), 226px 0 0 -6px rgba(0, 50, 126, 0.12), 227px 0 0 -6px rgba(0, 50, 126, 0.12), 228px 0 0 -6px rgba(0, 50, 126, 0.12), 229px 0 0 -6px rgba(0, 50, 126, 0.12), 230px 0 0 -6px rgba(0, 50, 126, 0.12), 231px 0 0 -6px rgba(0, 50, 126, 0.12), 232px 0 0 -6px rgba(0, 50, 126, 0.12), 233px 0 0 -6px rgba(0, 50, 126, 0.12), 234px 0 0 -6px rgba(0, 50, 126, 0.12), 235px 0 0 -6px rgba(0, 50, 126, 0.12), 236px 0 0 -6px rgba(0, 50, 126, 0.12), 237px 0 0 -6px rgba(0, 50, 126, 0.12), 238px 0 0 -6px rgba(0, 50, 126, 0.12), 239px 0 0 -6px rgba(0, 50, 126, 0.12), 240px 0 0 -6px rgba(0, 50, 126, 0.12);
+ box-shadow:
+ 1px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 6px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 7px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 8px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 9px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 10px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 11px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 12px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 13px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 14px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 15px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 16px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 17px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 18px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 19px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 20px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 21px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 22px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 23px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 24px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 25px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 26px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 27px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 28px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 29px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 30px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 31px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 32px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 33px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 34px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 35px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 36px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 37px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 38px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 39px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 40px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 41px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 42px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 43px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 44px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 45px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 46px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 47px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 48px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 49px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 50px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 51px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 52px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 53px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 54px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 55px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 56px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 57px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 58px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 59px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 60px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 61px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 62px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 63px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 64px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 65px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 66px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 67px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 68px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 69px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 70px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 71px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 72px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 73px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 74px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 75px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 76px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 77px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 78px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 79px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 80px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 81px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 82px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 83px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 84px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 85px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 86px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 87px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 88px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 89px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 90px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 91px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 92px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 93px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 94px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 95px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 96px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 97px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 98px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 99px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 100px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 101px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 102px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 103px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 104px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 105px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 106px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 107px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 108px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 109px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 110px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 111px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 112px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 113px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 114px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 115px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 116px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 117px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 118px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 119px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 120px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 121px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 122px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 123px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 124px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 125px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 126px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 127px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 128px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 129px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 130px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 131px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 132px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 133px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 134px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 135px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 136px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 137px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 138px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 139px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 140px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 141px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 142px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 143px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 144px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 145px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 146px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 147px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 148px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 149px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 150px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 151px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 152px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 153px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 154px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 155px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 156px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 157px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 158px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 159px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 160px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 161px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 162px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 163px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 164px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 165px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 166px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 167px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 168px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 169px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 170px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 171px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 172px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 173px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 174px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 175px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 176px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 177px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 178px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 179px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 180px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 181px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 182px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 183px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 184px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 185px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 186px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 187px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 188px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 189px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 190px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 191px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 192px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 193px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 194px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 195px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 196px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 197px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 198px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 199px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 200px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 201px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 202px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 203px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 204px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 205px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 206px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 207px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 208px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 209px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 210px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 211px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 212px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 213px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 214px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 215px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 216px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 217px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 218px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 219px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 220px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 221px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 222px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 223px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 224px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 225px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 226px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 227px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 228px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 229px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 230px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 231px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 232px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 233px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 234px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 235px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 236px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 237px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 238px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 239px 0 0 -6px rgba(0, 50, 126, 0.12),
+ 240px 0 0 -6px rgba(0, 50, 126, 0.12);
margin-top: -6px;
border: 1px solid rgba(0, 30, 75, 0.12);
- transition: 0.3s border-color, 0.3s background-color;
+ transition:
+ 0.3s border-color,
+ 0.3s background-color;
}
.custom-range::-moz-range-track {
@@ -15366,7 +15662,9 @@ a.tag-addon:hover {
border-radius: 50px;
border: 1px solid rgba(0, 30, 75, 0.12);
position: relative;
- transition: 0.3s border-color, 0.3s background-color;
+ transition:
+ 0.3s border-color,
+ 0.3s background-color;
}
.custom-range::-moz-range-progress {
@@ -15394,7 +15692,9 @@ a.tag-addon:hover {
background: #fff;
border-radius: 50px;
border: 1px solid rgba(0, 30, 75, 0.12);
- transition: 0.3s border-color, 0.3s background-color;
+ transition:
+ 0.3s border-color,
+ 0.3s background-color;
}
.custom-range::-ms-fill-lower {
@@ -15422,7 +15722,7 @@ a.tag-addon:hover {
position: relative;
}
-.selectgroup-item+.selectgroup-item {
+.selectgroup-item + .selectgroup-item {
margin-left: -1px;
}
@@ -15469,14 +15769,14 @@ a.tag-addon:hover {
line-height: 1.125rem;
}
-.selectgroup-input:checked+.selectgroup-button {
+.selectgroup-input:checked + .selectgroup-button {
border-color: #467fcf;
z-index: 1;
color: #467fcf;
background: #edf2fa;
}
-.selectgroup-input:focus+.selectgroup-button {
+.selectgroup-input:focus + .selectgroup-button {
border-color: #467fcf;
z-index: 2;
color: #467fcf;
@@ -15540,15 +15840,17 @@ a.tag-addon:hover {
position: relative;
vertical-align: bottom;
border: 1px solid rgba(0, 40, 100, 0.12);
- transition: 0.3s border-color, 0.3s background-color;
+ transition:
+ 0.3s border-color,
+ 0.3s background-color;
}
-[data-theme=dark] .custom-switch-indicator {
+[data-theme='dark'] .custom-switch-indicator {
opacity: 0.75;
}
.custom-switch-indicator:before {
- content: "";
+ content: '';
position: absolute;
height: calc(1.25rem - 4px);
width: calc(1.25rem - 4px);
@@ -15560,15 +15862,15 @@ a.tag-addon:hover {
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
}
-.custom-switch-input:checked~.custom-switch-indicator {
+.custom-switch-input:checked ~ .custom-switch-indicator {
background: #467fcf;
}
-.custom-switch-input:checked~.custom-switch-indicator:before {
+.custom-switch-input:checked ~ .custom-switch-indicator:before {
left: calc(1rem + 1px);
}
-.custom-switch-input:focus~.custom-switch-indicator {
+.custom-switch-input:focus ~ .custom-switch-indicator {
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
border-color: #467fcf;
}
@@ -15579,7 +15881,7 @@ a.tag-addon:hover {
transition: 0.3s color;
}
-.custom-switch-input:checked~.custom-switch-description {
+.custom-switch-input:checked ~ .custom-switch-description {
color: #495057;
}
@@ -15602,17 +15904,17 @@ a.tag-addon:hover {
position: relative;
}
-.imagecheck-input:focus~.imagecheck-figure {
+.imagecheck-input:focus ~ .imagecheck-figure {
border-color: #467fcf;
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
}
-.imagecheck-input:checked~.imagecheck-figure {
+.imagecheck-input:checked ~ .imagecheck-figure {
border-color: rgba(0, 40, 100, 0.24);
}
.imagecheck-figure:before {
- content: "";
+ content: '';
position: absolute;
top: 0.25rem;
left: 0.25rem;
@@ -15624,7 +15926,9 @@ a.tag-addon:hover {
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
- background: #467fcf url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") no-repeat center center/50% 50%;
+ background: #467fcf
+ url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")
+ no-repeat center center/50% 50%;
color: #fff;
z-index: 1;
border-radius: 3px;
@@ -15632,7 +15936,7 @@ a.tag-addon:hover {
transition: 0.3s opacity;
}
-.imagecheck-input:checked~.imagecheck-figure:before {
+.imagecheck-input:checked ~ .imagecheck-figure:before {
opacity: 1;
}
@@ -15653,8 +15957,8 @@ a.tag-addon:hover {
}
.imagecheck:hover .imagecheck-image,
-.imagecheck-input:focus~.imagecheck-figure .imagecheck-image,
-.imagecheck-input:checked~.imagecheck-figure .imagecheck-image {
+.imagecheck-input:focus ~ .imagecheck-figure .imagecheck-image,
+.imagecheck-input:checked ~ .imagecheck-figure .imagecheck-image {
opacity: 1;
}
@@ -15667,8 +15971,8 @@ a.tag-addon:hover {
}
.imagecheck:hover .imagecheck-caption,
-.imagecheck-input:focus~.imagecheck-figure .imagecheck-caption,
-.imagecheck-input:checked~.imagecheck-figure .imagecheck-caption {
+.imagecheck-input:focus ~ .imagecheck-figure .imagecheck-caption,
+.imagecheck-input:checked ~ .imagecheck-figure .imagecheck-caption {
color: #495057;
}
@@ -15695,7 +15999,7 @@ a.tag-addon:hover {
}
.colorinput-color:before {
- content: "";
+ content: '';
opacity: 0;
position: absolute;
top: 0.25rem;
@@ -15703,14 +16007,15 @@ a.tag-addon:hover {
height: 1.25rem;
width: 1.25rem;
transition: 0.3s opacity;
- background: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") no-repeat center center/50% 50%;
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")
+ no-repeat center center/50% 50%;
}
-.colorinput-input:checked~.colorinput-color:before {
+.colorinput-input:checked ~ .colorinput-color:before {
opacity: 1;
}
-.colorinput-input:focus~.colorinput-color {
+.colorinput-input:focus ~ .colorinput-color {
border-color: #467fcf;
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
}
@@ -15726,7 +16031,7 @@ a.tag-addon:hover {
background-color: #e9ecef;
position: absolute;
display: block;
- content: "";
+ content: '';
width: 1px;
height: 100%;
top: 0;
@@ -15744,7 +16049,7 @@ a.tag-addon:hover {
.timeline-item:first-child:before,
.timeline-item:last-child:before {
- content: "";
+ content: '';
position: absolute;
background: #fff;
width: 1px;
@@ -15961,7 +16266,7 @@ svg {
* @author Brian Reavis
*/
-.selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder {
+.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
visibility: visible !important;
background: #f2f2f2 !important;
background: rgba(0, 0, 0, 0.06) !important;
@@ -15970,7 +16275,7 @@ svg {
}
.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
- content: "!";
+ content: '!';
visibility: hidden;
}
@@ -16103,7 +16408,9 @@ svg {
z-index: 1;
box-sizing: border-box;
border-radius: 3px;
- transition: 0.3s border-color, 0.3s box-shadow;
+ transition:
+ 0.3s border-color,
+ 0.3s box-shadow;
}
.selectize-control.multi .selectize-input.has-items {
@@ -16128,7 +16435,7 @@ svg {
border-radius: 3px 3px 0 0;
}
-.selectize-input>* {
+.selectize-input > * {
vertical-align: baseline;
display: -moz-inline-stack;
display: inline-block;
@@ -16136,7 +16443,7 @@ svg {
*display: inline;
}
-.selectize-control.multi .selectize-input>div {
+.selectize-control.multi .selectize-input > div {
cursor: pointer;
margin: 0 3px 3px 0;
padding: 2px 6px;
@@ -16148,20 +16455,20 @@ svg {
font-weight: 400;
}
-.selectize-control.multi .selectize-input>div.active {
+.selectize-control.multi .selectize-input > div.active {
background: #e8e8e8;
color: #303030;
border: 0 solid #cacaca;
}
-.selectize-control.multi .selectize-input.disabled>div,
-.selectize-control.multi .selectize-input.disabled>div.active {
+.selectize-control.multi .selectize-input.disabled > div,
+.selectize-control.multi .selectize-input.disabled > div.active {
color: #7d7d7d;
background: #fff;
border: 0 solid #fff;
}
-.selectize-input>input {
+.selectize-input > input {
display: inline-block !important;
padding: 0 !important;
min-height: 0 !important;
@@ -16175,22 +16482,22 @@ svg {
box-shadow: none !important;
}
-.selectize-input>input::-ms-clear {
+.selectize-input > input::-ms-clear {
display: none;
}
-.selectize-input>input:focus {
+.selectize-input > input:focus {
outline: none !important;
}
.selectize-input::after {
- content: " ";
+ content: ' ';
display: block;
clear: left;
}
.selectize-input.dropdown-active::before {
- content: " ";
+ content: ' ';
display: block;
position: absolute;
background: #f0f0f0;
@@ -16269,14 +16576,16 @@ svg {
}
.selectize-control.single .selectize-input:after {
- content: "";
+ content: '';
display: block;
position: absolute;
top: 13px;
right: 12px;
width: 8px;
height: 10px;
- background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 5'%3E%3Cpath fill='#999' d='M0 0L10 0L5 5L0 0'/%3E%3C/svg%3E") no-repeat center;
+ background: #fff
+ url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 5'%3E%3Cpath fill='#999' d='M0 0L10 0L5 5L0 0'/%3E%3C/svg%3E")
+ no-repeat center;
background-size: 8px 10px;
transition: 0.3s transform;
}
@@ -16327,15 +16636,11 @@ svg {
}
.fe:before {
- content: "";
+ content: '';
display: inline-block;
width: 15px;
height: 15px;
background-size: 100%;
background-repeat: no-repeat;
}
-
-.fe-trash-2:before {
- background-image: url('./svg/trash-2.svg');
-}
/* stylelint-enable */
diff --git a/client/src/components/ui/Tabs.css b/client/src/components/ui/Tabs.css
index 9b164134..f2e38149 100644
--- a/client/src/components/ui/Tabs.css
+++ b/client/src/components/ui/Tabs.css
@@ -40,7 +40,7 @@
opacity: 0.6;
}
-[data-theme=dark] .tab__control {
+[data-theme='dark'] .tab__control {
filter: invert(1);
}
diff --git a/client/src/components/ui/Tabs.js b/client/src/components/ui/Tabs.js
deleted file mode 100644
index f8081a72..00000000
--- a/client/src/components/ui/Tabs.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import classnames from 'classnames';
-import Tab from './Tab';
-import './Tabs.css';
-
-const Tabs = (props) => {
- const {
- tabs, controlClass, activeTabLabel, setActiveTabLabel, children: activeTab,
- } = props;
-
- const onClickTabControl = (tabLabel) => setActiveTabLabel(tabLabel);
-
- const getControlClass = classnames({
- tabs__controls: true,
- [`tabs__controls--${controlClass}`]: controlClass,
- });
-
- return (
-
-
- {Object.values(tabs)
- .map((props) => {
- // eslint-disable-next-line react/prop-types
- const { title, label = title } = props;
- return (
-
- );
- })}
-
-
- {activeTab}
-
-
- );
-};
-
-Tabs.propTypes = {
- controlClass: PropTypes.string,
- tabs: PropTypes.object.isRequired,
- activeTabLabel: PropTypes.string.isRequired,
- setActiveTabLabel: PropTypes.func.isRequired,
- children: PropTypes.element.isRequired,
-};
-
-export default Tabs;
diff --git a/client/src/components/ui/Tabs.tsx b/client/src/components/ui/Tabs.tsx
new file mode 100644
index 00000000..3b29469b
--- /dev/null
+++ b/client/src/components/ui/Tabs.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import classnames from 'classnames';
+
+import Tab from './Tab';
+import './Tabs.css';
+
+interface TabsProps {
+ controlClass?: string;
+ tabs: object;
+ activeTabLabel: string;
+ setActiveTabLabel: (...args: unknown[]) => unknown;
+ children: React.ReactElement;
+}
+
+const Tabs = (props: TabsProps) => {
+ const { tabs, controlClass, activeTabLabel, setActiveTabLabel, children: activeTab } = props;
+
+ const onClickTabControl = (tabLabel: any) => setActiveTabLabel(tabLabel);
+
+ const getControlClass = classnames({
+ tabs__controls: true,
+ [`tabs__controls--${controlClass}`]: controlClass,
+ });
+
+ return (
+
+
+ {Object.values(tabs).map((props: any) => {
+ // eslint-disable-next-line react/prop-types
+ const { title, label = title } = props;
+ return (
+
+ );
+ })}
+
+
+
{activeTab}
+
+ );
+};
+
+export default Tabs;
diff --git a/client/src/components/ui/Tooltip.css b/client/src/components/ui/Tooltip.css
index fe41623b..1e3f2424 100644
--- a/client/src/components/ui/Tooltip.css
+++ b/client/src/components/ui/Tooltip.css
@@ -4,7 +4,7 @@
box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.2);
}
-[data-theme=dark] .tooltip-container {
+[data-theme='dark'] .tooltip-container {
background-color: var(--ctrl-select-bgcolor);
color: var(--mcolor);
}
diff --git a/client/src/components/ui/Tooltip.js b/client/src/components/ui/Tooltip.js
deleted file mode 100644
index b72a3667..00000000
--- a/client/src/components/ui/Tooltip.js
+++ /dev/null
@@ -1,105 +0,0 @@
-import React from 'react';
-import TooltipTrigger from 'react-popper-tooltip';
-import propTypes from 'prop-types';
-import { useTranslation } from 'react-i18next';
-
-import {
- HIDE_TOOLTIP_DELAY,
- MEDIUM_SCREEN_SIZE,
- SHOW_TOOLTIP_DELAY,
-} from '../../helpers/constants';
-import 'react-popper-tooltip/dist/styles.css';
-import './Tooltip.css';
-
-const Tooltip = ({
- children,
- content,
- triggerClass = 'tooltip-custom__trigger',
- className = 'tooltip-container',
- placement = 'bottom',
- trigger = 'hover',
- delayShow = SHOW_TOOLTIP_DELAY,
- delayHide = HIDE_TOOLTIP_DELAY,
- onVisibilityChange,
- defaultTooltipShown,
-}) => {
- const { t } = useTranslation();
- const touchEventsAvailable = 'ontouchstart' in window;
-
- let triggerValue = trigger;
- let delayHideValue = delayHide;
- let delayShowValue = delayShow;
-
- if (window.matchMedia(`(max-width: ${MEDIUM_SCREEN_SIZE}px)`).matches || touchEventsAvailable) {
- triggerValue = 'click';
- delayHideValue = 0;
- delayShowValue = 0;
- }
-
- const renderTooltip = ({ tooltipRef, getTooltipProps }) => (
-
- {typeof content === 'string' ? t(content) : content}
-
- );
-
- const renderTrigger = ({ getTriggerProps, triggerRef }) => (
-
- {children}
-
- );
-
- renderTooltip.propTypes = {
- tooltipRef: propTypes.object,
- getTooltipProps: propTypes.func,
- };
-
- renderTrigger.propTypes = {
- triggerRef: propTypes.object,
- getTriggerProps: propTypes.func,
- };
-
- return (
-
- {renderTrigger}
-
- );
-};
-
-Tooltip.propTypes = {
- children: propTypes.element.isRequired,
- content: propTypes.oneOfType(
- [
- propTypes.string,
- propTypes.element,
- propTypes.arrayOf(propTypes.element),
- ],
- ).isRequired,
- placement: propTypes.string,
- trigger: propTypes.string,
- delayHide: propTypes.number,
- delayShow: propTypes.number,
- className: propTypes.string,
- triggerClass: propTypes.string,
- onVisibilityChange: propTypes.func,
- defaultTooltipShown: propTypes.bool,
-};
-
-export default Tooltip;
diff --git a/client/src/components/ui/Tooltip.tsx b/client/src/components/ui/Tooltip.tsx
new file mode 100644
index 00000000..0a8ab0ba
--- /dev/null
+++ b/client/src/components/ui/Tooltip.tsx
@@ -0,0 +1,92 @@
+import React from 'react';
+import PopperJS from 'popper.js';
+import TooltipTrigger, { TriggerTypes } from 'react-popper-tooltip';
+import { useTranslation } from 'react-i18next';
+
+import { HIDE_TOOLTIP_DELAY, MEDIUM_SCREEN_SIZE, SHOW_TOOLTIP_DELAY } from '../../helpers/constants';
+import 'react-popper-tooltip/dist/styles.css';
+import './Tooltip.css';
+
+interface TooltipProps {
+ children: React.ReactElement;
+ content: string | React.ReactElement | React.ReactElement[];
+ placement?: PopperJS.Placement;
+ trigger?: TriggerTypes;
+ delayHide?: number;
+ delayShow?: number;
+ className?: string;
+ triggerClass?: string;
+ onVisibilityChange?: (...args: unknown[]) => unknown;
+ defaultTooltipShown?: boolean;
+}
+
+interface renderTooltipProps {
+ tooltipRef?: object;
+ getTooltipProps?: (...args: unknown[]) => Record;
+}
+
+interface renderTriggerProps {
+ triggerRef?: object;
+ getTriggerProps?: (...args: unknown[]) => Record;
+}
+
+const Tooltip = ({
+ children,
+ content,
+ triggerClass = 'tooltip-custom__trigger',
+ className = 'tooltip-container',
+ placement = 'bottom',
+ trigger = 'hover',
+ delayShow = SHOW_TOOLTIP_DELAY,
+ delayHide = HIDE_TOOLTIP_DELAY,
+ onVisibilityChange,
+ defaultTooltipShown,
+}: TooltipProps) => {
+ const { t } = useTranslation();
+ const touchEventsAvailable = 'ontouchstart' in window;
+
+ let triggerValue = trigger;
+ let delayHideValue = delayHide;
+ let delayShowValue = delayShow;
+
+ if (window.matchMedia(`(max-width: ${MEDIUM_SCREEN_SIZE}px)`).matches || touchEventsAvailable) {
+ triggerValue = 'click';
+ delayHideValue = 0;
+ delayShowValue = 0;
+ }
+
+ const renderTooltip = ({ tooltipRef, getTooltipProps }: renderTooltipProps) => (
+
+ {typeof content === 'string' ? t(content) : content}
+
+ );
+
+ const renderTrigger = ({ getTriggerProps, triggerRef }: renderTriggerProps) => (
+
+ {children}
+
+ );
+
+ return (
+
+ {renderTrigger}
+
+ );
+};
+
+export default Tooltip;
diff --git a/client/src/components/ui/Topline.js b/client/src/components/ui/Topline.js
deleted file mode 100644
index 76969f44..00000000
--- a/client/src/components/ui/Topline.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-
-import './Topline.css';
-
-const Topline = (props) => (
-
-);
-
-Topline.propTypes = {
- children: PropTypes.node.isRequired,
- type: PropTypes.string.isRequired,
-};
-
-export default Topline;
diff --git a/client/src/components/ui/Topline.tsx b/client/src/components/ui/Topline.tsx
new file mode 100644
index 00000000..e63ae960
--- /dev/null
+++ b/client/src/components/ui/Topline.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import './Topline.css';
+
+interface ToplineProps {
+ children: React.ReactNode;
+ type: string;
+}
+
+const Topline = (props: ToplineProps) => (
+
+);
+
+export default Topline;
diff --git a/client/src/components/ui/UpdateOverlay.js b/client/src/components/ui/UpdateOverlay.tsx
similarity index 77%
rename from client/src/components/ui/UpdateOverlay.js
rename to client/src/components/ui/UpdateOverlay.tsx
index ba0a603e..c00886b4 100644
--- a/client/src/components/ui/UpdateOverlay.js
+++ b/client/src/components/ui/UpdateOverlay.tsx
@@ -3,9 +3,10 @@ import { Trans } from 'react-i18next';
import classnames from 'classnames';
import { useSelector } from 'react-redux';
import './Overlay.css';
+import { RootState } from '../../initialState';
const UpdateOverlay = () => {
- const processingUpdate = useSelector((state) => state.dashboard.processingUpdate);
+ const processingUpdate = useSelector((state: RootState) => state.dashboard.processingUpdate);
const overlayClass = classnames('overlay', {
'overlay--visible': processingUpdate,
});
@@ -13,6 +14,7 @@ const UpdateOverlay = () => {
return (
);
diff --git a/client/src/components/ui/UpdateTopline.js b/client/src/components/ui/UpdateTopline.js
deleted file mode 100644
index 85e75f4a..00000000
--- a/client/src/components/ui/UpdateTopline.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import React from 'react';
-import { Trans } from 'react-i18next';
-import { shallowEqual, useDispatch, useSelector } from 'react-redux';
-
-import Topline from './Topline';
-import { getUpdate } from '../../actions';
-import { MANUAL_UPDATE_LINK } from '../../helpers/constants';
-
-const UpdateTopline = () => {
- const {
- announcementUrl,
- newVersion,
- canAutoUpdate,
- processingUpdate,
- } = useSelector((state) => state.dashboard, shallowEqual);
- const dispatch = useDispatch();
-
- const handleUpdate = () => {
- dispatch(getUpdate());
- };
-
- return
- <>
-
- Click here
- ,
- ]}
- >
- update_announcement
-
-
- {canAutoUpdate ? (
-
- ) : (
-
- Link
-
- ),
- }}>
- manual_update
-
- )}
- >
- ;
-};
-
-export default UpdateTopline;
diff --git a/client/src/components/ui/UpdateTopline.tsx b/client/src/components/ui/UpdateTopline.tsx
new file mode 100644
index 00000000..886000b5
--- /dev/null
+++ b/client/src/components/ui/UpdateTopline.tsx
@@ -0,0 +1,60 @@
+import React from 'react';
+import { Trans } from 'react-i18next';
+import { shallowEqual, useDispatch, useSelector } from 'react-redux';
+
+import Topline from './Topline';
+
+import { getUpdate } from '../../actions';
+import { MANUAL_UPDATE_LINK } from '../../helpers/constants';
+import { RootState } from '../../initialState';
+
+const UpdateTopline = () => {
+ const { announcementUrl, newVersion, canAutoUpdate, processingUpdate } = useSelector(
+ (state: RootState) => state.dashboard,
+ shallowEqual,
+ );
+ const dispatch = useDispatch();
+
+ const handleUpdate = () => {
+ dispatch(getUpdate());
+ };
+
+ return (
+
+ <>
+
+ Click here
+ ,
+ ]}>
+ update_announcement
+
+
+ {canAutoUpdate ? (
+
+ ) : (
+
+ Link
+
+ ),
+ }}>
+ manual_update
+
+ )}
+ >
+
+ );
+};
+
+export default UpdateTopline;
diff --git a/client/src/components/ui/Version.css b/client/src/components/ui/Version.css
index 5477d5f0..d3605276 100644
--- a/client/src/components/ui/Version.css
+++ b/client/src/components/ui/Version.css
@@ -1,6 +1,5 @@
-
.version {
- font-size: 0.80rem;
+ font-size: 0.8rem;
}
@media screen and (min-width: 1280px) {
diff --git a/client/src/components/ui/Version.js b/client/src/components/ui/Version.js
deleted file mode 100644
index a669ac15..00000000
--- a/client/src/components/ui/Version.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import React from 'react';
-import { Trans, useTranslation } from 'react-i18next';
-import { shallowEqual, useDispatch, useSelector } from 'react-redux';
-import { getVersion } from '../../actions';
-import './Version.css';
-
-const Version = () => {
- const dispatch = useDispatch();
- const { t } = useTranslation();
- const {
- dnsVersion,
- processingVersion,
- checkUpdateFlag,
- } = useSelector((state) => state?.dashboard ?? {}, shallowEqual);
-
- const {
- dnsVersion: installDnsVersion,
- } = useSelector((state) => state?.install ?? {}, shallowEqual);
-
- const version = dnsVersion || installDnsVersion;
-
- const onClick = () => {
- dispatch(getVersion(true));
- };
-
- return (
-
-
- {version && (
- <>
- version:
- {version}
- >
- )}
- {checkUpdateFlag && }
-
-
- );
-};
-
-export default Version;
diff --git a/client/src/components/ui/Version.tsx b/client/src/components/ui/Version.tsx
new file mode 100644
index 00000000..b37e156e
--- /dev/null
+++ b/client/src/components/ui/Version.tsx
@@ -0,0 +1,55 @@
+import React from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { shallowEqual, useDispatch, useSelector } from 'react-redux';
+
+import { getVersion } from '../../actions';
+import './Version.css';
+import { RootState } from '../../initialState';
+
+const Version = () => {
+ const dispatch = useDispatch();
+ const { t } = useTranslation();
+ const dashboard = useSelector((state: RootState) => state.dashboard, shallowEqual);
+ const install = useSelector((state: RootState) => state.install, shallowEqual);
+
+ if (!dashboard || !install) {
+ return null;
+ }
+
+ const { dnsVersion, processingVersion, checkUpdateFlag } = dashboard;
+ const version = dnsVersion || install?.dnsVersion;
+
+ const onClick = () => {
+ dispatch(getVersion(true));
+ };
+
+ return (
+
+
+ {version && (
+ <>
+ version:
+
+ {version}
+
+ >
+ )}
+
+ {checkUpdateFlag && (
+
+ )}
+
+
+ );
+};
+
+export default Version;
diff --git a/client/src/components/ui/svg/logo.svg b/client/src/components/ui/svg/logo.svg
deleted file mode 100644
index 76853b13..00000000
--- a/client/src/components/ui/svg/logo.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/client/src/components/ui/svg/logo.tsx b/client/src/components/ui/svg/logo.tsx
new file mode 100644
index 00000000..760e3beb
--- /dev/null
+++ b/client/src/components/ui/svg/logo.tsx
@@ -0,0 +1,22 @@
+import React, { memo } from 'react';
+
+type Props = {
+ className?: string;
+};
+
+export const Logo = memo(({ className }: Props) => {
+ return (
+
+ );
+});
+
+Logo.displayName = 'Logo';
diff --git a/client/src/configureStore.js b/client/src/configureStore.js
deleted file mode 100644
index c026dcfe..00000000
--- a/client/src/configureStore.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { createStore, applyMiddleware, compose } from 'redux';
-import thunk from 'redux-thunk';
-
-const middlewares = [
- thunk,
-];
-
-export default function configureStore(reducer, initialState) {
- /* eslint-disable no-underscore-dangle */
- const store = createStore(reducer, initialState, compose(
- applyMiddleware(...middlewares),
- window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__() : (f) => f,
- ));
- /* eslint-enable */
- return store;
-}
diff --git a/client/src/configureStore.ts b/client/src/configureStore.ts
new file mode 100644
index 00000000..c2e9eb90
--- /dev/null
+++ b/client/src/configureStore.ts
@@ -0,0 +1,16 @@
+import { createStore, applyMiddleware, compose, Reducer } from 'redux';
+import thunk from 'redux-thunk';
+
+const middlewares = [thunk];
+
+export default function configureStore(
+ reducer: Reducer,
+ initialState: any
+) {
+ const store = createStore(
+ reducer,
+ initialState,
+ compose(applyMiddleware(...middlewares))
+ );
+ return store;
+}
diff --git a/client/src/containers/Clients.js b/client/src/containers/Clients.js
deleted file mode 100644
index a0a867a3..00000000
--- a/client/src/containers/Clients.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { connect } from 'react-redux';
-import { getClients } from '../actions';
-import { getStats } from '../actions/stats';
-import {
- addClient, updateClient, deleteClient, toggleClientModal,
-} from '../actions/clients';
-import Clients from '../components/Settings/Clients';
-
-const mapStateToProps = (state) => {
- const { dashboard, clients, stats } = state;
- const props = {
- dashboard,
- clients,
- stats,
- };
- return props;
-};
-
-const mapDispatchToProps = {
- getClients,
- getStats,
- addClient,
- updateClient,
- deleteClient,
- toggleClientModal,
-};
-
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Clients);
diff --git a/client/src/containers/Clients.ts b/client/src/containers/Clients.ts
new file mode 100644
index 00000000..3e109090
--- /dev/null
+++ b/client/src/containers/Clients.ts
@@ -0,0 +1,37 @@
+import { connect } from 'react-redux';
+
+import { getClients } from '../actions';
+import { getStats } from '../actions/stats';
+import { addClient, updateClient, deleteClient, toggleClientModal } from '../actions/clients';
+
+import Clients from '../components/Settings/Clients';
+
+const mapStateToProps = (state: any) => {
+ const { dashboard, clients, stats } = state;
+ const props = {
+ dashboard,
+ clients,
+ stats,
+ };
+ return props;
+};
+
+type DispatchProps = {
+ getClients: (dispatch: any) => void;
+ getStats: (...args: unknown[]) => unknown;
+ addClient: (dispatch: any) => void;
+ updateClient: (config: any, name: any) => (dispatch: any) => void;
+ deleteClient: (config: any, name: any) => (dispatch: any) => void;
+ toggleClientModal: (...args: unknown[]) => unknown;
+}
+
+const mapDispatchToProps: DispatchProps = {
+ getClients,
+ getStats,
+ addClient,
+ updateClient,
+ deleteClient,
+ toggleClientModal,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Clients);
diff --git a/client/src/containers/CustomRules.js b/client/src/containers/CustomRules.js
deleted file mode 100644
index 0ca4709d..00000000
--- a/client/src/containers/CustomRules.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { connect } from 'react-redux';
-import {
- setRules,
- getFilteringStatus,
- handleRulesChange,
- checkHost,
-} from '../actions/filtering';
-import CustomRules from '../components/Filters/CustomRules';
-
-const mapStateToProps = (state) => {
- const { filtering } = state;
- const props = { filtering };
- return props;
-};
-
-const mapDispatchToProps = {
- setRules,
- getFilteringStatus,
- handleRulesChange,
- checkHost,
-};
-
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(CustomRules);
diff --git a/client/src/containers/CustomRules.ts b/client/src/containers/CustomRules.ts
new file mode 100644
index 00000000..0566c341
--- /dev/null
+++ b/client/src/containers/CustomRules.ts
@@ -0,0 +1,27 @@
+import { connect } from 'react-redux';
+import { setRules, getFilteringStatus, handleRulesChange, checkHost } from '../actions/filtering';
+
+import CustomRules from '../components/Filters/CustomRules';
+import { RootState } from '../initialState';
+
+const mapStateToProps = (state: RootState) => {
+ const { filtering } = state;
+ const props = { filtering };
+ return props;
+};
+
+type DispatchProps = {
+ setRules: (...args: unknown[]) => unknown;
+ getFilteringStatus: (...args: unknown[]) => unknown;
+ handleRulesChange: (...args: unknown[]) => unknown;
+ checkHost: (dispatch: any) => void;
+}
+
+const mapDispatchToProps: DispatchProps = {
+ setRules,
+ getFilteringStatus,
+ handleRulesChange,
+ checkHost,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(CustomRules);
diff --git a/client/src/containers/Dashboard.js b/client/src/containers/Dashboard.js
deleted file mode 100644
index 3d665483..00000000
--- a/client/src/containers/Dashboard.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { connect } from 'react-redux';
-import { toggleProtection, getClients } from '../actions';
-import { getStats, getStatsConfig, setStatsConfig } from '../actions/stats';
-import { getAccessList } from '../actions/access';
-import Dashboard from '../components/Dashboard';
-
-const mapStateToProps = (state) => {
- const { dashboard, stats, access } = state;
- const props = { dashboard, stats, access };
- return props;
-};
-
-const mapDispatchToProps = {
- toggleProtection,
- getClients,
- getStats,
- getStatsConfig,
- setStatsConfig,
- getAccessList,
-};
-
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Dashboard);
diff --git a/client/src/containers/Dashboard.ts b/client/src/containers/Dashboard.ts
new file mode 100644
index 00000000..cc2c602c
--- /dev/null
+++ b/client/src/containers/Dashboard.ts
@@ -0,0 +1,32 @@
+import { connect } from 'react-redux';
+
+import { toggleProtection, getClients } from '../actions';
+import { getStats, getStatsConfig, setStatsConfig } from '../actions/stats';
+import { getAccessList } from '../actions/access';
+
+import Dashboard from '../components/Dashboard';
+import { RootState } from '../initialState';
+
+const mapStateToProps = (state: RootState) => {
+ const { dashboard, stats, access } = state;
+ const props = { dashboard, stats, access };
+ return props;
+};
+
+type DispatchProps = {
+ toggleProtection: (...args: unknown[]) => unknown;
+ getClients: (...args: unknown[]) => unknown;
+ getStats: (...args: unknown[]) => unknown;
+ getStatsConfig: (...args: unknown[]) => unknown;
+ getAccessList: () => (dispatch: any) => void;
+}
+
+const mapDispatchToProps: DispatchProps = {
+ toggleProtection,
+ getClients,
+ getStats,
+ getStatsConfig,
+ getAccessList,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Dashboard);
diff --git a/client/src/containers/Dhcp.js b/client/src/containers/Dhcp.ts
similarity index 83%
rename from client/src/containers/Dhcp.js
rename to client/src/containers/Dhcp.ts
index 1f9d6b62..efa9bef4 100644
--- a/client/src/containers/Dhcp.js
+++ b/client/src/containers/Dhcp.ts
@@ -10,9 +10,10 @@ import {
removeStaticLease,
resetDhcp,
} from '../actions';
+
import Dhcp from '../components/Settings/Dhcp';
-const mapStateToProps = (state) => {
+const mapStateToProps = (state: any) => {
const { dhcp } = state;
const props = {
dhcp,
@@ -32,7 +33,4 @@ const mapDispatchToProps = {
resetDhcp,
};
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Dhcp);
+export default connect(mapStateToProps, mapDispatchToProps)(Dhcp);
diff --git a/client/src/containers/Dns.js b/client/src/containers/Dns.ts
similarity index 63%
rename from client/src/containers/Dns.js
rename to client/src/containers/Dns.ts
index 54cdb30c..e688682a 100644
--- a/client/src/containers/Dns.js
+++ b/client/src/containers/Dns.ts
@@ -1,18 +1,12 @@
import { connect } from 'react-redux';
import { getAccessList, setAccessList } from '../actions/access';
-import {
- getRewritesList,
- addRewrite,
- deleteRewrite,
- toggleRewritesModal,
-} from '../actions/rewrites';
+import { getRewritesList, addRewrite, deleteRewrite, toggleRewritesModal } from '../actions/rewrites';
import { getDnsConfig, setDnsConfig } from '../actions/dnsConfig';
+
import Dns from '../components/Settings/Dns';
-const mapStateToProps = (state) => {
- const {
- dashboard, settings, access, rewrites, dnsConfig,
- } = state;
+const mapStateToProps = (state: any) => {
+ const { dashboard, settings, access, rewrites, dnsConfig } = state;
const props = {
dashboard,
settings,
@@ -34,7 +28,4 @@ const mapDispatchToProps = {
setDnsConfig,
};
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Dns);
+export default connect(mapStateToProps, mapDispatchToProps)(Dns);
diff --git a/client/src/containers/DnsAllowlist.js b/client/src/containers/DnsAllowlist.ts
similarity index 83%
rename from client/src/containers/DnsAllowlist.js
rename to client/src/containers/DnsAllowlist.ts
index 5750eac2..60be695d 100644
--- a/client/src/containers/DnsAllowlist.js
+++ b/client/src/containers/DnsAllowlist.ts
@@ -10,9 +10,10 @@ import {
handleRulesChange,
editFilter,
} from '../actions/filtering';
+
import DnsAllowlist from '../components/Filters/DnsAllowlist';
-const mapStateToProps = (state) => {
+const mapStateToProps = (state: any) => {
const { filtering } = state;
const props = { filtering };
return props;
@@ -30,7 +31,4 @@ const mapDispatchToProps = {
editFilter,
};
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(DnsAllowlist);
+export default connect(mapStateToProps, mapDispatchToProps)(DnsAllowlist);
diff --git a/client/src/containers/DnsBlocklist.js b/client/src/containers/DnsBlocklist.ts
similarity index 83%
rename from client/src/containers/DnsBlocklist.js
rename to client/src/containers/DnsBlocklist.ts
index 55f35833..2ebd93c2 100644
--- a/client/src/containers/DnsBlocklist.js
+++ b/client/src/containers/DnsBlocklist.ts
@@ -10,9 +10,10 @@ import {
handleRulesChange,
editFilter,
} from '../actions/filtering';
+
import DnsBlocklist from '../components/Filters/DnsBlocklist';
-const mapStateToProps = (state) => {
+const mapStateToProps = (state: any) => {
const { filtering } = state;
const props = { filtering };
return props;
@@ -30,7 +31,4 @@ const mapDispatchToProps = {
editFilter,
};
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(DnsBlocklist);
+export default connect(mapStateToProps, mapDispatchToProps)(DnsBlocklist);
diff --git a/client/src/containers/DnsRewrites.js b/client/src/containers/DnsRewrites.js
deleted file mode 100644
index 8fcda2a6..00000000
--- a/client/src/containers/DnsRewrites.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { connect } from 'react-redux';
-import {
- getRewritesList,
- addRewrite,
- deleteRewrite,
- updateRewrite,
- toggleRewritesModal,
-} from '../actions/rewrites';
-import Rewrites from '../components/Filters/Rewrites';
-
-const mapStateToProps = (state) => {
- const { rewrites } = state;
- const props = { rewrites };
- return props;
-};
-
-const mapDispatchToProps = {
- getRewritesList,
- addRewrite,
- deleteRewrite,
- updateRewrite,
- toggleRewritesModal,
-};
-
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Rewrites);
diff --git a/client/src/containers/DnsRewrites.ts b/client/src/containers/DnsRewrites.ts
new file mode 100644
index 00000000..dac3d791
--- /dev/null
+++ b/client/src/containers/DnsRewrites.ts
@@ -0,0 +1,29 @@
+import { connect } from 'react-redux';
+import { getRewritesList, addRewrite, deleteRewrite, updateRewrite, toggleRewritesModal } from '../actions/rewrites';
+
+import Rewrites from '../components/Filters/Rewrites';
+import { RootState } from '../initialState';
+
+const mapStateToProps = (state: RootState) => {
+ const { rewrites } = state;
+ const props = { rewrites };
+ return props;
+};
+
+type DispatchProps = {
+ getRewritesList: () => (dispatch: any) => void;
+ toggleRewritesModal: (...args: unknown[]) => unknown;
+ addRewrite: (...args: unknown[]) => unknown;
+ deleteRewrite: (...args: unknown[]) => unknown;
+ updateRewrite: (...args: unknown[]) => unknown;
+}
+
+const mapDispatchToProps: DispatchProps = {
+ getRewritesList,
+ addRewrite,
+ deleteRewrite,
+ updateRewrite,
+ toggleRewritesModal,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Rewrites);
diff --git a/client/src/containers/Encryption.js b/client/src/containers/Encryption.ts
similarity index 75%
rename from client/src/containers/Encryption.js
rename to client/src/containers/Encryption.ts
index e27dc44c..48c79859 100644
--- a/client/src/containers/Encryption.js
+++ b/client/src/containers/Encryption.ts
@@ -1,8 +1,9 @@
import { connect } from 'react-redux';
import { getTlsStatus, setTlsConfig, validateTlsConfig } from '../actions/encryption';
+
import Encryption from '../components/Settings/Encryption';
-const mapStateToProps = (state) => {
+const mapStateToProps = (state: any) => {
const { encryption } = state;
const props = {
encryption,
@@ -16,7 +17,4 @@ const mapDispatchToProps = {
validateTlsConfig,
};
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Encryption);
+export default connect(mapStateToProps, mapDispatchToProps)(Encryption);
diff --git a/client/src/containers/Settings.js b/client/src/containers/Settings.ts
similarity index 81%
rename from client/src/containers/Settings.js
rename to client/src/containers/Settings.ts
index 6222f8eb..5577bfed 100644
--- a/client/src/containers/Settings.js
+++ b/client/src/containers/Settings.ts
@@ -1,15 +1,15 @@
import { connect } from 'react-redux';
+
import { initSettings, toggleSetting } from '../actions';
import { getBlockedServices, updateBlockedServices } from '../actions/services';
import { getStatsConfig, setStatsConfig, resetStats } from '../actions/stats';
import { clearLogs, getLogsConfig, setLogsConfig } from '../actions/queryLogs';
import { getFilteringStatus, setFiltersConfig } from '../actions/filtering';
+
import Settings from '../components/Settings';
-const mapStateToProps = (state) => {
- const {
- settings, services, stats, queryLogs, filtering,
- } = state;
+const mapStateToProps = (state: any) => {
+ const { settings, services, stats, queryLogs, filtering } = state;
const props = {
settings,
services,
@@ -35,7 +35,4 @@ const mapDispatchToProps = {
setFiltersConfig,
};
-export default connect(
- mapStateToProps,
- mapDispatchToProps,
-)(Settings);
+export default connect(mapStateToProps, mapDispatchToProps)(Settings);
diff --git a/client/src/containers/SetupGuide.js b/client/src/containers/SetupGuide.ts
similarity index 65%
rename from client/src/containers/SetupGuide.js
rename to client/src/containers/SetupGuide.ts
index 1e7ecd12..b8114ca3 100644
--- a/client/src/containers/SetupGuide.js
+++ b/client/src/containers/SetupGuide.ts
@@ -1,14 +1,13 @@
import { connect } from 'react-redux';
+
import * as actionCreators from '../actions';
+
import SetupGuide from '../components/SetupGuide';
-const mapStateToProps = (state) => {
+const mapStateToProps = (state: any) => {
const { dashboard } = state;
const props = { dashboard };
return props;
};
-export default connect(
- mapStateToProps,
- actionCreators,
-)(SetupGuide);
+export default connect(mapStateToProps, actionCreators)(SetupGuide);
diff --git a/client/src/helpers/constants.js b/client/src/helpers/constants.ts
similarity index 80%
rename from client/src/helpers/constants.js
rename to client/src/helpers/constants.ts
index 425edc61..c94a6c00 100644
--- a/client/src/helpers/constants.js
+++ b/client/src/helpers/constants.ts
@@ -5,14 +5,18 @@ export const R_HOST = /^(\*\.)?[\w.-]+$/;
export const R_IPV4 = /^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$/;
-export const R_IPV6 = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
+export const R_IPV6 =
+ /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
-export const R_CIDR = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/;
+export const R_CIDR =
+ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/;
-export const R_MAC = /^((([a-fA-F0-9][a-fA-F0-9]+[-:]){5})([a-fA-F0-9]{2})$)|^((([a-fA-F0-9][a-fA-F0-9]+[-:]){7})([a-fA-F0-9]{2})$)|^([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]+[.]){2}([a-fA-F0-9]{4})$|^([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]+[.]){3}([a-fA-F0-9]{4})$/;
+export const R_MAC =
+ /^((([a-fA-F0-9][a-fA-F0-9]+[-:]){5})([a-fA-F0-9]{2})$)|^((([a-fA-F0-9][a-fA-F0-9]+[-:]){7})([a-fA-F0-9]{2})$)|^([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]+[.]){2}([a-fA-F0-9]{4})$|^([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]+[.]){3}([a-fA-F0-9]{4})$/;
export const R_MAC_WITHOUT_COLON = /^([a-fA-F0-9]{2}){5}([a-fA-F0-9]{2})$|^([a-fA-F0-9]{2}){7}([a-fA-F0-9]{2})$/;
-export const R_CIDR_IPV6 = /^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))$/;
+export const R_CIDR_IPV6 =
+ /^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))$/;
export const R_DOMAIN = /^([a-zA-Z0-9][a-zA-Z0-9-_]*\.)*[a-zA-Z0-9]*[a-zA-Z0-9-_]*[[a-zA-Z0-9]+$/;
@@ -57,8 +61,7 @@ export const STATUS_COLORS = {
export const REPOSITORY = {
URL: 'https://github.com/AdguardTeam/AdGuardHome',
- TRACKERS_DB:
- 'https://github.com/AdguardTeam/AdGuardHome/tree/master/client/src/helpers/trackers/trackers.json',
+ TRACKERS_DB: 'https://github.com/AdguardTeam/AdGuardHome/tree/master/client/src/helpers/trackers/trackers.json',
ISSUES: 'https://github.com/AdguardTeam/AdGuardHome/issues/new/choose',
};
@@ -66,7 +69,8 @@ export const CLIENT_ID_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/C
export const MANUAL_UPDATE_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/FAQ#manual-update';
export const PORT_53_FAQ_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/FAQ#bindinuse';
export const PRIVACY_POLICY_LINK = 'https://link.adtidy.org/forward.html?action=privacy&from=ui&app=home';
-export const UPSTREAM_CONFIGURATION_WIKI_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#upstreams';
+export const UPSTREAM_CONFIGURATION_WIKI_LINK =
+ 'https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#upstreams';
export const FILTERS_RELATIVE_LINK = '#filters';
@@ -99,70 +103,9 @@ export const SHOW_TOOLTIP_DELAY = 200;
export const MODAL_OPEN_TIMEOUT = 150;
export const UNSAFE_PORTS = [
- 1,
- 7,
- 9,
- 11,
- 13,
- 15,
- 17,
- 19,
- 20,
- 21,
- 22,
- 23,
- 25,
- 37,
- 42,
- 43,
- 53,
- 77,
- 79,
- 87,
- 95,
- 101,
- 102,
- 103,
- 104,
- 109,
- 110,
- 111,
- 113,
- 115,
- 117,
- 119,
- 123,
- 135,
- 139,
- 143,
- 179,
- 389,
- 465,
- 512,
- 513,
- 514,
- 515,
- 526,
- 530,
- 531,
- 532,
- 540,
- 556,
- 563,
- 587,
- 601,
- 636,
- 993,
- 995,
- 2049,
- 3659,
- 4045,
- 6000,
- 6665,
- 6666,
- 6667,
- 6668,
- 6669,
+ 1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 77, 79, 87, 95, 101, 102, 103, 104, 109, 110, 111,
+ 113, 115, 117, 119, 123, 135, 139, 143, 179, 389, 465, 512, 513, 514, 515, 526, 530, 531, 532, 540, 556, 563, 587,
+ 601, 636, 993, 995, 2049, 3659, 4045, 6000, 6665, 6666, 6667, 6668, 6669,
];
export const ALL_INTERFACES_IP = '0.0.0.0';
@@ -171,7 +114,7 @@ export const STATUS_RESPONSE = {
YES: 'yes',
NO: 'no',
ERROR: 'error',
-};
+} as const;
export const MODAL_TYPE = {
SELECT_MODAL_TYPE: 'SELECT_MODAL_TYPE',
@@ -331,11 +274,20 @@ export const RESPONSE_FILTER = {
},
};
-export const RESPONSE_FILTER_QUERIES = Object.values(RESPONSE_FILTER)
- .reduce((acc, { QUERY }) => {
+export const RESPONSE_FILTER_QUERIES = Object.values(RESPONSE_FILTER).reduce(
+ (
+ acc: Record,
+ {
+ QUERY,
+ }: {
+ QUERY: string;
+ },
+ ) => {
acc[QUERY] = QUERY;
return acc;
- }, {});
+ },
+ {},
+);
export const QUERY_STATUS_COLORS = {
BLUE: 'blue',
@@ -397,7 +349,7 @@ export const DEFAULT_SHORT_DATE_FORMAT_OPTIONS = {
month: 'numeric',
day: 'numeric',
hour12: false,
-};
+} as const;
export const DEFAULT_DATE_FORMAT_OPTIONS = {
year: 'numeric',
@@ -406,12 +358,12 @@ export const DEFAULT_DATE_FORMAT_OPTIONS = {
hour: 'numeric',
hourCycle: 'h23',
minute: 'numeric',
-};
+} as const;
export const DETAILED_DATE_FORMAT_OPTIONS = {
...DEFAULT_DATE_FORMAT_OPTIONS,
month: 'long',
-};
+} as const;
export const SPECIAL_FILTER_ID = {
CUSTOM_FILTERING_RULES: 0,
diff --git a/client/src/helpers/filters/filters.js b/client/src/helpers/filters/filters.ts
similarity index 100%
rename from client/src/helpers/filters/filters.js
rename to client/src/helpers/filters/filters.ts
diff --git a/client/src/helpers/form.js b/client/src/helpers/form.js
deleted file mode 100644
index 1b7b4997..00000000
--- a/client/src/helpers/form.js
+++ /dev/null
@@ -1,314 +0,0 @@
-import React, { Fragment } from 'react';
-import PropTypes from 'prop-types';
-import { Trans } from 'react-i18next';
-import cn from 'classnames';
-
-import { createOnBlurHandler } from './helpers';
-import { R_MAC_WITHOUT_COLON, R_UNIX_ABSOLUTE_PATH, R_WIN_ABSOLUTE_PATH } from './constants';
-
-export const renderField = (props, elementType) => {
- const {
- input, id, className, placeholder, type, disabled, normalizeOnBlur, onScroll,
- autoComplete, meta: { touched, error }, min, max, step,
- } = props;
-
- const onBlur = (event) => createOnBlurHandler(event, input, normalizeOnBlur);
-
- const element = React.createElement(elementType, {
- ...input,
- id,
- className,
- placeholder,
- autoComplete,
- disabled,
- type,
- min,
- max,
- step,
- onBlur,
- onScroll,
- });
-
- return (
- <>
- {element}
- {!disabled && touched && error
- && {error}}
- >
- );
-};
-
-renderField.propTypes = {
- id: PropTypes.string.isRequired,
- input: PropTypes.object.isRequired,
- className: PropTypes.string,
- placeholder: PropTypes.string,
- type: PropTypes.string,
- disabled: PropTypes.bool,
- autoComplete: PropTypes.bool,
- normalizeOnBlur: PropTypes.func,
- min: PropTypes.number,
- max: PropTypes.number,
- step: PropTypes.number,
- onScroll: PropTypes.func,
- meta: PropTypes.shape({
- touched: PropTypes.bool,
- error: PropTypes.string,
- }).isRequired,
-};
-
-export const renderTextareaField = (props) => renderField(props, 'textarea');
-
-export const renderInputField = (props) => renderField(props, 'input');
-
-export const renderGroupField = ({
- input,
- id,
- className,
- placeholder,
- type,
- disabled,
- autoComplete,
- isActionAvailable,
- removeField,
- meta: { touched, error },
- normalizeOnBlur,
-}) => {
- const onBlur = (event) => createOnBlurHandler(event, input, normalizeOnBlur);
-
- return (
- <>
-
-
- {isActionAvailable
- &&
-
-
- }
-
- {!disabled && touched && error
- && {error}}
- >
- );
-};
-
-renderGroupField.propTypes = {
- input: PropTypes.object.isRequired,
- id: PropTypes.string,
- className: PropTypes.string,
- placeholder: PropTypes.string,
- type: PropTypes.string,
- disabled: PropTypes.bool,
- autoComplete: PropTypes.bool,
- isActionAvailable: PropTypes.bool,
- removeField: PropTypes.func,
- meta: PropTypes.shape({
- touched: PropTypes.bool,
- error: PropTypes.string,
- }).isRequired,
- normalizeOnBlur: PropTypes.func,
-};
-
-export const renderRadioField = ({
- input,
- placeholder,
- subtitle,
- disabled,
- meta: { touched, error },
-}) =>
-
- {!disabled
- && touched
- && error
- && {error}}
-;
-
-renderRadioField.propTypes = {
- input: PropTypes.object.isRequired,
- placeholder: PropTypes.string,
- subtitle: PropTypes.string,
- disabled: PropTypes.bool,
- meta: PropTypes.shape({
- touched: PropTypes.bool,
- error: PropTypes.string,
- }).isRequired,
-};
-
-export const CheckboxField = ({
- input,
- placeholder,
- subtitle,
- disabled,
- onClick,
- modifier = 'checkbox--form',
- meta: { touched, error },
-}) => <>
-
- {!disabled
- && touched
- && error
- && {error}
}
->;
-
-CheckboxField.propTypes = {
- input: PropTypes.object.isRequired,
- placeholder: PropTypes.string,
- subtitle: PropTypes.node,
- disabled: PropTypes.bool,
- onClick: PropTypes.func,
- modifier: PropTypes.string,
- checked: PropTypes.bool,
- meta: PropTypes.shape({
- touched: PropTypes.bool,
- error: PropTypes.string,
- }).isRequired,
-};
-
-export const renderSelectField = ({
- input,
- meta: { touched, error },
- children,
- label,
-}) => {
- const showWarning = touched && error;
-
- return <>
- {label && }
-
- {showWarning
- && {error}}
- >;
-};
-
-renderSelectField.propTypes = {
- input: PropTypes.object.isRequired,
- disabled: PropTypes.bool,
- label: PropTypes.string,
- children: PropTypes.oneOfType([PropTypes.array, PropTypes.element]).isRequired,
- meta: PropTypes.shape({
- touched: PropTypes.bool,
- error: PropTypes.string,
- }).isRequired,
-};
-
-export const renderServiceField = ({
- input,
- placeholder,
- disabled,
- modifier,
- icon,
- meta: { touched, error },
-}) => (
- <>
-
- {!disabled && touched && error && (
-
- {error}
-
- )}
- >
-);
-
-renderServiceField.propTypes = {
- input: PropTypes.object.isRequired,
- placeholder: PropTypes.string,
- disabled: PropTypes.bool,
- modifier: PropTypes.string,
- icon: PropTypes.string,
- meta: PropTypes.shape({
- touched: PropTypes.bool,
- error: PropTypes.string,
- }).isRequired,
-};
-
-/**
- *
- * @param {string} ip
- * @returns {*}
- */
-export const ip4ToInt = (ip) => {
- const intIp = ip.split('.').reduce((int, oct) => (int * 256) + parseInt(oct, 10), 0);
- return Number.isNaN(intIp) ? 0 : intIp;
-};
-
-/**
- * @param value {string}
- * @returns {*|number}
- */
-export const toNumber = (value) => value && parseInt(value, 10);
-
-/**
- * @param value {string}
- * @returns {*|number}
- */
-export const toFloatNumber = (value) => value && parseFloat(value, 10);
-
-/**
- * @param value {string}
- * @returns {boolean}
- */
-export const isValidAbsolutePath = (value) => R_WIN_ABSOLUTE_PATH.test(value)
- || R_UNIX_ABSOLUTE_PATH.test(value);
-
-/**
- * @param value {string}
- * @returns {*|string}
- */
-export const normalizeMac = (value) => {
- if (value && R_MAC_WITHOUT_COLON.test(value)) {
- return value.match(/.{2}/g).join(':');
- }
-
- return value;
-};
diff --git a/client/src/helpers/form.tsx b/client/src/helpers/form.tsx
new file mode 100644
index 00000000..62b9534b
--- /dev/null
+++ b/client/src/helpers/form.tsx
@@ -0,0 +1,341 @@
+import React, { Fragment } from 'react';
+import { Trans } from 'react-i18next';
+import cn from 'classnames';
+
+import { createOnBlurHandler } from './helpers';
+import { R_MAC_WITHOUT_COLON, R_UNIX_ABSOLUTE_PATH, R_WIN_ABSOLUTE_PATH } from './constants';
+
+interface renderFieldProps {
+ id: string;
+ input: object;
+ className?: string;
+ placeholder?: string;
+ type?: string;
+ disabled?: boolean;
+ autoComplete?: string;
+ normalizeOnBlur?: (...args: unknown[]) => unknown;
+ min?: number;
+ max?: number;
+ step?: number;
+ onScroll?: (...args: unknown[]) => unknown;
+ meta: {
+ touched?: boolean;
+ error?: string;
+ };
+}
+
+export const renderField = (props: renderFieldProps, elementType: any) => {
+ const {
+ input,
+ id,
+ className,
+ placeholder,
+ type,
+ disabled,
+ normalizeOnBlur,
+ onScroll,
+ autoComplete,
+ meta: { touched, error },
+ min,
+ max,
+ step,
+ } = props;
+
+ const onBlur = (event: any) => createOnBlurHandler(event, input, normalizeOnBlur);
+
+ const element = React.createElement(elementType, {
+ ...input,
+ id,
+ className,
+ placeholder,
+ autoComplete,
+ disabled,
+ type,
+ min,
+ max,
+ step,
+ onBlur,
+ onScroll,
+ });
+
+ return (
+ <>
+ {element}
+ {!disabled && touched && error && (
+
+ {error}
+
+ )}
+ >
+ );
+};
+
+export const renderTextareaField = (props: any) => renderField(props, 'textarea');
+
+export const renderInputField = (props: any) => renderField(props, 'input');
+
+interface renderGroupFieldProps {
+ input: object;
+ id?: string;
+ className?: string;
+ placeholder?: string;
+ type?: string;
+ disabled?: boolean;
+ autoComplete?: string;
+ isActionAvailable?: boolean;
+ removeField?: (...args: unknown[]) => unknown;
+ meta: {
+ touched?: boolean;
+ error?: string;
+ };
+ normalizeOnBlur?: (...args: unknown[]) => unknown;
+}
+
+export const renderGroupField = ({
+ input,
+ id,
+ className,
+ placeholder,
+ type,
+ disabled,
+ autoComplete,
+ isActionAvailable,
+ removeField,
+ meta: { touched, error },
+ normalizeOnBlur,
+}: renderGroupFieldProps) => {
+ const onBlur = (event: any) => createOnBlurHandler(event, input, normalizeOnBlur);
+
+ return (
+ <>
+
+
+ {isActionAvailable && (
+
+
+
+ )}
+
+ {!disabled && touched && error && (
+
+ {error}
+
+ )}
+ >
+ );
+};
+
+interface renderRadioFieldProps {
+ input: object;
+ placeholder?: string;
+ subtitle?: string;
+ disabled?: boolean;
+ meta: {
+ touched?: boolean;
+ error?: string;
+ };
+}
+
+export const renderRadioField = ({
+ input,
+ placeholder,
+ subtitle,
+ disabled,
+ meta: { touched, error },
+}: renderRadioFieldProps) => (
+
+
+ {!disabled && touched && error && (
+
+ {error}
+
+ )}
+
+);
+
+interface CheckboxFieldProps {
+ input: object;
+ placeholder?: string;
+ subtitle?: React.ReactNode;
+ disabled?: boolean;
+ onClick?: (...args: unknown[]) => unknown;
+ modifier?: string;
+ checked?: boolean;
+ meta: {
+ touched?: boolean;
+ error?: string;
+ };
+}
+
+export const CheckboxField = ({
+ input,
+ placeholder,
+ subtitle,
+ disabled,
+ onClick,
+ modifier = 'checkbox--form',
+ meta: { touched, error },
+}: CheckboxFieldProps) => (
+ <>
+
+ {!disabled && touched && error && (
+
+ {error}
+
+ )}
+ >
+);
+
+interface renderSelectFieldProps {
+ input: object;
+ disabled?: boolean;
+ label?: string;
+ children: unknown[] | React.ReactElement;
+ meta: {
+ touched?: boolean;
+ error?: string;
+ };
+}
+
+export const renderSelectField = ({ input, meta: { touched, error }, children, label }: renderSelectFieldProps) => {
+ const showWarning = touched && error;
+
+ return (
+ <>
+ {label && (
+
+ )}
+
+
+ {showWarning && (
+
+ {error}
+
+ )}
+ >
+ );
+};
+
+interface renderServiceFieldProps {
+ input: object;
+ placeholder?: string;
+ disabled?: boolean;
+ modifier?: string;
+ icon?: string;
+ meta: {
+ touched?: boolean;
+ error?: string;
+ };
+}
+
+export const renderServiceField = ({
+ input,
+ placeholder,
+ disabled,
+ modifier,
+ icon,
+ meta: { touched, error },
+}: renderServiceFieldProps) => (
+ <>
+
+ {!disabled && touched && error && (
+
+ {error}
+
+ )}
+ >
+);
+
+/**
+ *
+ * @param {string} ip
+ * @returns {*}
+ */
+export const ip4ToInt = (ip: any) => {
+ const intIp = ip.split('.').reduce((int: any, oct: any) => int * 256 + parseInt(oct, 10), 0);
+ return Number.isNaN(intIp) ? 0 : intIp;
+};
+
+/**
+ * @param value {string}
+ * @returns {*|number}
+ */
+export const toNumber = (value: any) => value && parseInt(value, 10);
+
+/**
+ * @param value {string}
+ * @returns {*|number}
+ */
+
+export const toFloatNumber = (value: any) => value && parseFloat(value);
+
+/**
+ * @param value {string}
+ * @returns {boolean}
+ */
+export const isValidAbsolutePath = (value: any) => R_WIN_ABSOLUTE_PATH.test(value) || R_UNIX_ABSOLUTE_PATH.test(value);
+
+/**
+ * @param value {string}
+ * @returns {*|string}
+ */
+export const normalizeMac = (value: any) => {
+ if (value && R_MAC_WITHOUT_COLON.test(value)) {
+ return value.match(/.{2}/g).join(':');
+ }
+
+ return value;
+};
diff --git a/client/src/helpers/helpers.js b/client/src/helpers/helpers.js
deleted file mode 100644
index 3e4b99c5..00000000
--- a/client/src/helpers/helpers.js
+++ /dev/null
@@ -1,1053 +0,0 @@
-import 'url-polyfill';
-import dateParse from 'date-fns/parse';
-import dateFormat from 'date-fns/format';
-import round from 'lodash/round';
-import axios from 'axios';
-import i18n from 'i18next';
-import ipaddr from 'ipaddr.js';
-import queryString from 'query-string';
-import React from 'react';
-import { getTrackerData } from './trackers/trackers';
-
-import {
- ADDRESS_TYPES,
- CHECK_TIMEOUT,
- COMMENT_LINE_DEFAULT_TOKEN,
- DEFAULT_DATE_FORMAT_OPTIONS,
- DEFAULT_LANGUAGE,
- DEFAULT_TIME_FORMAT,
- DETAILED_DATE_FORMAT_OPTIONS,
- DHCP_VALUES_PLACEHOLDERS,
- FILTERED,
- FILTERED_STATUS,
- R_CLIENT_ID,
- STANDARD_DNS_PORT,
- STANDARD_HTTPS_PORT,
- STANDARD_WEB_PORT,
- SPECIAL_FILTER_ID,
- THEMES,
-} from './constants';
-import { LOCAL_STORAGE_KEYS, LocalStorageHelper } from './localStorageHelper';
-
-/**
- * @param time {string} The time to format
- * @param options {string}
- * @returns {string} Returns the time in the format HH:mm:ss
- */
-export const formatTime = (time, options = DEFAULT_TIME_FORMAT) => {
- const parsedTime = dateParse(time);
- return dateFormat(parsedTime, options);
-};
-
-/**
- * @param dateTime {string} The date to format
- * @param [options] {object} Date.prototype.toLocaleString([locales[, options]]) options argument
- * @returns {string} Returns the date and time in the specified format
- */
-export const formatDateTime = (dateTime, options = DEFAULT_DATE_FORMAT_OPTIONS) => {
- const parsedTime = new Date(dateTime);
- return parsedTime.toLocaleString(navigator.language, options);
-};
-
-/**
- * @param dateTime {string} The date to format
- * @returns {string} Returns the date and time in the format with the full month name
- */
-export const formatDetailedDateTime = (dateTime) => formatDateTime(
- dateTime, DETAILED_DATE_FORMAT_OPTIONS,
-);
-
-export const normalizeLogs = (logs) => logs.map((log) => {
- const {
- answer,
- answer_dnssec,
- client,
- client_proto,
- client_id,
- client_info,
- elapsedMs,
- question,
- reason,
- status,
- time,
- filterId,
- rule,
- rules,
- service_name,
- original_answer,
- upstream,
- cached,
- ecs,
- } = log;
-
- const { name: domain, unicode_name: unicodeName, type } = question;
-
- const processResponse = (data) => (data ? data.map((response) => {
- const { value, type, ttl } = response;
- return `${type}: ${value} (ttl=${ttl})`;
- }) : []);
-
- let newRules = rules;
- /* TODO 'filterId' and 'rule' are deprecated, will be removed in 0.106 */
- if (rule !== undefined && filterId !== undefined && rules !== undefined && rules.length === 0) {
- newRules = {
- filter_list_id: filterId,
- text: rule,
- };
- }
-
- return {
- time,
- domain,
- unicodeName,
- type,
- response: processResponse(answer),
- reason,
- client,
- client_proto,
- client_id,
- client_info,
- /* TODO 'filterId' and 'rule' are deprecated, will be removed in 0.106 */
- filterId,
- rule,
- rules: newRules,
- status,
- service_name,
- originalAnswer: original_answer,
- originalResponse: processResponse(original_answer),
- tracker: getTrackerData(domain),
- answer_dnssec,
- elapsedMs,
- upstream,
- cached,
- ecs,
- };
-});
-
-export const normalizeHistory = (history) => history.map((item, idx) => ({
- x: idx,
- y: item,
-}));
-
-export const normalizeTopStats = (stats) => (
- stats.map((item) => ({
- name: Object.keys(item)[0],
- count: Object.values(item)[0],
- }))
-);
-
-export const addClientInfo = (data, clients, ...params) => data.map((row) => {
- let info = '';
- params.find((param) => {
- const id = row[param];
- if (id) {
- const client = clients.find((item) => item[id]) || '';
- info = client?.[id] ?? '';
- }
-
- return info;
- });
-
- return {
- ...row,
- info,
- };
-});
-
-export const normalizeFilters = (filters) => (
- filters ? filters.map((filter) => {
- const {
- id,
- url,
- enabled,
- last_updated,
- name = 'Default name',
- rules_count = 0,
- } = filter;
-
- return {
- id,
- url,
- enabled,
- lastUpdated: last_updated,
- name,
- rulesCount: rules_count,
- };
- }) : []
-);
-
-export const normalizeFilteringStatus = (filteringStatus) => {
- const {
- enabled, filters, user_rules: userRules, interval, whitelist_filters,
- } = filteringStatus;
- const newUserRules = Array.isArray(userRules) ? userRules.join('\n') : '';
-
- return {
- enabled,
- userRules: newUserRules,
- filters: normalizeFilters(filters),
- whitelistFilters: normalizeFilters(whitelist_filters),
- interval,
- };
-};
-
-export const getPercent = (amount, number) => {
- if (amount > 0 && number > 0) {
- return round(100 / (amount / number), 2);
- }
- return 0;
-};
-
-export const captitalizeWords = (text) => text.split(/[ -_]/g)
- .map((str) => str.charAt(0)
- .toUpperCase() + str.substr(1))
- .join(' ');
-
-export const getInterfaceIp = (option) => {
- const onlyIPv6 = option.ip_addresses.every((ip) => ip.includes(':'));
- let [interfaceIP] = option.ip_addresses;
-
- if (!onlyIPv6) {
- option.ip_addresses.forEach((ip) => {
- if (!ip.includes(':')) {
- interfaceIP = ip;
- }
- });
- }
-
- return interfaceIP;
-};
-
-export const getIpList = (interfaces) => Object.values(interfaces)
- .reduce((acc, curr) => acc.concat(curr.ip_addresses), [])
- .sort();
-
-/**
- * @param {string} ip
- * @param {number} [port]
- * @returns {string}
- */
-export const getDnsAddress = (ip, port = 0) => {
- const isStandardDnsPort = port === STANDARD_DNS_PORT;
- let address = ip;
-
- if (port) {
- if (ip.includes(':') && !isStandardDnsPort) {
- address = `[${ip}]:${port}`;
- } else if (!isStandardDnsPort) {
- address = `${ip}:${port}`;
- }
- }
-
- return address;
-};
-
-/**
- * @param {string} ip
- * @param {number} [port]
- * @returns {string}
- */
-export const getWebAddress = (ip, port = 0) => {
- const isStandardWebPort = port === STANDARD_WEB_PORT;
- let address = `http://${ip}`;
-
- if (port && !isStandardWebPort) {
- if (ip.includes(':') && !ip.includes('[')) {
- address = `http://[${ip}]:${port}`;
- } else {
- address = `http://${ip}:${port}`;
- }
- }
-
- return address;
-};
-
-export const checkRedirect = (url, attempts) => {
- let count = attempts || 1;
-
- if (count > 10) {
- window.location.replace(url);
- return false;
- }
-
- const rmTimeout = (t) => t && clearTimeout(t);
- const setRecursiveTimeout = (time, ...args) => setTimeout(
- checkRedirect,
- time,
- ...args,
- );
-
- let timeout;
-
- axios.get(url)
- .then((response) => {
- rmTimeout(timeout);
- if (response) {
- window.location.replace(url);
- return;
- }
- timeout = setRecursiveTimeout(CHECK_TIMEOUT, url, count += 1);
- })
- .catch((error) => {
- rmTimeout(timeout);
- if (error.response) {
- window.location.replace(url);
- return;
- }
- timeout = setRecursiveTimeout(CHECK_TIMEOUT, url, count += 1);
- });
-
- return false;
-};
-
-export const redirectToCurrentProtocol = (values, httpPort = 80) => {
- const {
- protocol, hostname, hash, port,
- } = window.location;
- const { enabled, force_https, port_https } = values;
- const httpsPort = port_https !== STANDARD_HTTPS_PORT ? `:${port_https}` : '';
-
- if (protocol !== 'https:' && enabled && force_https && port_https) {
- checkRedirect(`https://${hostname}${httpsPort}/${hash}`);
- } else if (protocol === 'https:' && enabled && port_https && port_https !== parseInt(port, 10)) {
- checkRedirect(`https://${hostname}${httpsPort}/${hash}`);
- } else if (protocol === 'https:' && (!enabled || !port_https)) {
- window.location.replace(`http://${hostname}:${httpPort}/${hash}`);
- }
-};
-
-/**
- * @param {string} text
- * @returns []string
- */
-export const splitByNewLine = (text) => text.split('\n')
- .filter((n) => n.trim());
-
-/**
- * @param {string} text
- * @returns {string}
- */
-export const trimMultilineString = (text) => splitByNewLine(text)
- .map((line) => line.trim())
- .join('\n');
-
-/**
- * @param {string} text
- * @returns {string}
- */
-export const removeEmptyLines = (text) => splitByNewLine(text)
- .join('\n');
-
-/**
- * @param {string} input
- * @returns {string}
- */
-export const trimLinesAndRemoveEmpty = (input) => input.split('\n').map((line) => line.trim()).filter(Boolean).join('\n');
-
-/**
- * Normalizes the topClients array
- *
- * @param {Object[]} topClients
- * @param {string} topClients.name
- * @param {number} topClients.count
- * @param {Object} topClients.info
- * @param {string} topClients.info.name
- * @returns {Object} normalizedTopClients
- * @returns {Object.} normalizedTopClients.auto - auto clients
- * @returns {Object.} normalizedTopClients.configured - configured clients
- */
-export const normalizeTopClients = (topClients) => topClients.reduce(
- (acc, clientObj) => {
- const { name, count, info: { name: infoName } } = clientObj;
- acc.auto[name] = count;
- acc.configured[infoName] = count;
- return acc;
- }, {
- auto: {},
- configured: {},
- },
-);
-
-export const sortClients = (clients) => {
- const compare = (a, b) => {
- const nameA = a.name.toUpperCase();
- const nameB = b.name.toUpperCase();
-
- if (nameA > nameB) {
- return 1;
- }
- if (nameA < nameB) {
- return -1;
- }
-
- return 0;
- };
-
- return clients.sort(compare);
-};
-
-export const toggleAllServices = (services, change, isSelected) => {
- services.forEach((service) => change(`blocked_services.${service.id}`, isSelected));
-};
-
-export const msToSeconds = (milliseconds) => Math.floor(milliseconds / 1000);
-
-export const msToMinutes = (milliseconds) => Math.floor(milliseconds / 1000 / 60);
-
-export const msToHours = (milliseconds) => Math.floor(milliseconds / 1000 / 60 / 60);
-
-export const secondsToMilliseconds = (seconds) => {
- if (seconds) {
- return seconds * 1000;
- }
-
- return seconds;
-};
-
-export const msToDays = (milliseconds) => Math.floor(milliseconds / 1000 / 60 / 60 / 24);
-
-export const normalizeRulesTextarea = (text) => text?.replace(/^\n/g, '')
- .replace(/\n\s*\n/g, '\n');
-
-export const normalizeWhois = (whois) => {
- if (Object.keys(whois).length > 0) {
- const {
- city, country, ...values
- } = whois;
- let location = country || '';
-
- if (city && location) {
- location = `${location}, ${city}`;
- } else if (city) {
- location = city;
- }
-
- if (location) {
- return {
- location,
- ...values,
- };
- }
-
- return { ...values };
- }
-
- return whois;
-};
-
-export const getPathWithQueryString = (path, params) => {
- const searchParams = new URLSearchParams(params);
-
- return `${path}?${searchParams.toString()}`;
-};
-
-export const getParamsForClientsSearch = (data, param, additionalParam) => {
- const clients = new Set();
- data.forEach((e) => {
- clients.add(e[param]);
- if (e[additionalParam]) {
- clients.add(e[additionalParam]);
- }
- });
- const params = {};
- const ids = Array.from(clients.values());
- ids.forEach((id, i) => {
- params[`ip${i}`] = id;
- });
-
- return params;
-};
-
-/**
- * Creates onBlur handler that can normalize input if normalization function is specified
- *
- * @param {Object} event
- * @param {Object} event.target
- * @param {string} event.target.value
- * @param {Object} input
- * @param {function} input.onBlur
- * @param {function} [normalizeOnBlur]
- * @returns {function}
- */
-export const createOnBlurHandler = (event, input, normalizeOnBlur) => (
- normalizeOnBlur
- ? input.onBlur(normalizeOnBlur(event.target.value))
- : input.onBlur());
-
-export const checkFiltered = (reason) => reason.indexOf(FILTERED) === 0;
-export const checkRewrite = (reason) => reason === FILTERED_STATUS.REWRITE;
-export const checkRewriteHosts = (reason) => reason === FILTERED_STATUS.REWRITE_HOSTS;
-export const checkBlackList = (reason) => reason === FILTERED_STATUS.FILTERED_BLACK_LIST;
-export const checkWhiteList = (reason) => reason === FILTERED_STATUS.NOT_FILTERED_WHITE_LIST;
-// eslint-disable-next-line max-len
-export const checkNotFilteredNotFound = (reason) => reason === FILTERED_STATUS.NOT_FILTERED_NOT_FOUND;
-export const checkSafeSearch = (reason) => reason === FILTERED_STATUS.FILTERED_SAFE_SEARCH;
-export const checkSafeBrowsing = (reason) => reason === FILTERED_STATUS.FILTERED_SAFE_BROWSING;
-export const checkParental = (reason) => reason === FILTERED_STATUS.FILTERED_PARENTAL;
-export const checkBlockedService = (reason) => reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE;
-
-export const getCurrentFilter = (url, filters) => {
- const filter = filters?.find((item) => url === item.url);
-
- if (filter) {
- const { enabled, name, url } = filter;
- return {
- enabled,
- name,
- url,
- };
- }
-
- return {
- name: '',
- url: '',
- };
-};
-
-/**
- * @param {object} initialValues
- * @param {object} values
- * @returns {object} Returns different values of objects
- */
-export const getObjDiff = (initialValues, values) => Object.entries(values)
- .reduce((acc, [key, value]) => {
- if (value !== initialValues[key]) {
- acc[key] = value;
- }
- return acc;
- }, {});
-
-/**
- * @param num {number} to format
- * @returns {string} Returns a string with a language-sensitive representation of this number
- */
-export const formatNumber = (num) => {
- const currentLanguage = i18n.languages[0] || DEFAULT_LANGUAGE;
- return num.toLocaleString(currentLanguage);
-};
-
-/**
- * @param arr {array}
- * @param key {string}
- * @param value {string}
- * @returns {object}
- */
-export const getMap = (arr, key, value) => arr.reduce((acc, curr) => {
- acc[curr[key]] = curr[value];
- return acc;
-}, {});
-
-/**
- * @param parsedIp {object} ipaddr.js IPv4 or IPv6 object
- * @param parsedCidr {array} ipaddr.js CIDR array
- * @returns {boolean}
- */
-const isIpMatchCidr = (parsedIp, parsedCidr) => {
- try {
- const cidrIpVersion = parsedCidr[0].kind();
- const ipVersion = parsedIp.kind();
-
- return ipVersion === cidrIpVersion && parsedIp.match(parsedCidr);
- } catch (e) {
- return false;
- }
-};
-
-export const isIpInCidr = (ip, cidr) => {
- try {
- const parsedIp = ipaddr.parse(ip);
- const parsedCidr = ipaddr.parseCIDR(cidr);
-
- return isIpMatchCidr(parsedIp, parsedCidr);
- } catch (e) {
- console.error(e);
- return false;
- }
-};
-
-/**
- *
- * @param {string} subnetMask
- * @returns {IPv4 | null}
- */
-export const parseSubnetMask = (subnetMask) => {
- try {
- return ipaddr.parse(subnetMask).prefixLengthFromSubnetMask();
- } catch (e) {
- console.error(e);
- return null;
- }
-};
-
-/**
- *
- * @param {string} subnetMask
- * @returns {*}
- */
-export const subnetMaskToBitMask = (subnetMask) => subnetMask
- .split('.')
- .reduce((acc, cur) => acc - Math.log2(256 - Number(cur)), 32);
-
-/**
- *
- * @param ipOrCidr
- * @returns {'IP' | 'CIDR' | 'CLIENT_ID' | 'UNKNOWN'}
- *
- */
-export const findAddressType = (address) => {
- try {
- const cidrMaybe = address.includes('/');
-
- if (!cidrMaybe && ipaddr.isValid(address)) {
- return ADDRESS_TYPES.IP;
- }
- if (cidrMaybe && ipaddr.parseCIDR(address)) {
- return ADDRESS_TYPES.CIDR;
- }
- if (R_CLIENT_ID.test(address)) {
- return ADDRESS_TYPES.CLIENT_ID;
- }
-
- return ADDRESS_TYPES.UNKNOWN;
- } catch (e) {
- return ADDRESS_TYPES.UNKNOWN;
- }
-};
-
-/**
- * @param ids {string[]}
- * @returns {Object}
- */
-export const separateIpsAndCidrs = (ids) => ids.reduce((acc, curr) => {
- const addressType = findAddressType(curr);
-
- if (addressType === ADDRESS_TYPES.IP) {
- acc.ips.push(curr);
- }
- if (addressType === ADDRESS_TYPES.CIDR) {
- acc.cidrs.push(curr);
- }
- if (addressType === ADDRESS_TYPES.CLIENT_ID) {
- acc.clientIds.push(curr);
- }
- return acc;
-}, { ips: [], cidrs: [], clientIds: [] });
-
-export const countClientsStatistics = (ids, autoClients) => {
- const { ips, cidrs, clientIds } = separateIpsAndCidrs(ids);
-
- const ipsCount = ips.reduce((acc, curr) => {
- const count = autoClients[curr] || 0;
- return acc + count;
- }, 0);
-
- const clientIdsCount = clientIds.reduce((acc, curr) => {
- const count = autoClients[curr] || 0;
- return acc + count;
- }, 0);
-
- const cidrsCount = Object.entries(autoClients)
- .reduce((acc, curr) => {
- const [id, count] = curr;
- if (!ipaddr.isValid(id)) {
- return false;
- }
- if (cidrs.some((cidr) => isIpInCidr(id, cidr))) {
- // eslint-disable-next-line no-param-reassign
- acc += count;
- }
- return acc;
- }, 0);
-
- return ipsCount + cidrsCount + clientIdsCount;
-};
-
-/**
- * @param {string} elapsedMs
- * @param {function} t translate
- * @returns {string}
- */
-export const formatElapsedMs = (elapsedMs, t) => {
- const formattedElapsedMs = parseInt(elapsedMs, 10) || parseFloat(elapsedMs)
- .toFixed(2);
- return `${formattedElapsedMs} ${t('milliseconds_abbreviation')}`;
-};
-
-/**
- * @param language {string}
- */
-export const setHtmlLangAttr = (language) => {
- window.document.documentElement.lang = language;
-};
-
-/**
- * Set local storage theme field
- *
- * @param {string} theme
- */
-export const setTheme = (theme) => {
- LocalStorageHelper.setItem(LOCAL_STORAGE_KEYS.THEME, theme);
-};
-
-/**
- * Get local storage theme field
- *
- * @returns {string}
- */
-
-export const getTheme = () => LocalStorageHelper.getItem(LOCAL_STORAGE_KEYS.THEME) || THEMES.light;
-
-/**
- * Sets UI theme.
- *
- * @param theme
- */
-export const setUITheme = (theme) => {
- let currentTheme = theme || getTheme();
-
- if (currentTheme === THEMES.auto) {
- const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
- currentTheme = prefersDark ? THEMES.dark : THEMES.light;
- }
- setTheme(currentTheme);
- document.body.dataset.theme = currentTheme;
-};
-
-/**
- * @param values {object}
- * @returns {object}
- */
-export const replaceEmptyStringsWithZeroes = (values) => Object.entries(values)
- .reduce((acc, [key, value]) => {
- acc[key] = value === '' ? 0 : value;
- return acc;
- }, {});
-
-/**
- * @param value {number || string}
- * @returns {string}
- */
-export const replaceZeroWithEmptyString = (value) => (parseInt(value, 10) === 0 ? '' : value);
-
-/**
- * @param {string} search
- * @param {string} [response_status]
- * @returns {string}
- */
-export const getLogsUrlParams = (search, response_status) => `?${queryString.stringify({
- search: search || undefined,
- response_status: response_status || undefined,
-})}`;
-
-export const processContent = (
- content,
-) => (Array.isArray(content)
- ? content.filter(([, value]) => value)
- .reduce((acc, val) => acc.concat(val), [])
- : content);
-/**
- * @param object {object}
- * @param sortKey {string}
- * @returns {string[]}
- */
-export const getObjectKeysSorted = (object, sortKey) => Object.entries(object)
- .sort(([, { [sortKey]: order1 }], [, { [sortKey]: order2 }]) => order1 - order2)
- .map(([key]) => key);
-
-/**
- * @param ip
- * @returns {[IPv4|IPv6, 33|129]}
- */
-const getParsedIpWithPrefixLength = (ip) => {
- const MAX_PREFIX_LENGTH_V4 = 32;
- const MAX_PREFIX_LENGTH_V6 = 128;
-
- const parsedIp = ipaddr.parse(ip);
- const prefixLength = parsedIp.kind() === 'ipv4' ? MAX_PREFIX_LENGTH_V4 : MAX_PREFIX_LENGTH_V6;
-
- // Increment prefix length to always put IP after CIDR, e.g. 127.0.0.1/32, 127.0.0.1
- return [parsedIp, prefixLength + 1];
-};
-
-/**
- * Helper function for IP and CIDR comparison (supports both v4 and v6)
- * @param item - ip or cidr
- * @returns {number[]}
- */
-const getAddressesComparisonBytes = (item) => {
- // Sort ipv4 before ipv6
- const IP_V4_COMPARISON_CODE = 0;
- const IP_V6_COMPARISON_CODE = 1;
-
- const [parsedIp, cidr] = ipaddr.isValid(item)
- ? getParsedIpWithPrefixLength(item)
- : ipaddr.parseCIDR(item);
-
- const [normalizedBytes, ipVersionComparisonCode] = parsedIp.kind() === 'ipv4'
- ? [parsedIp.toIPv4MappedAddress().parts, IP_V4_COMPARISON_CODE]
- : [parsedIp.parts, IP_V6_COMPARISON_CODE];
-
- return [ipVersionComparisonCode, ...normalizedBytes, cidr];
-};
-
-/**
- * Compare function for IP and CIDR sort in ascending order (supports both v4 and v6)
- * @param a
- * @param b
- * @returns {number} -1 | 0 | 1
- */
-export const sortIp = (a, b) => {
- try {
- const comparisonBytesA = Array.isArray(a)
- ? getAddressesComparisonBytes(a[0]) : getAddressesComparisonBytes(a);
- const comparisonBytesB = Array.isArray(b)
- ? getAddressesComparisonBytes(b[0]) : getAddressesComparisonBytes(b);
-
- for (let i = 0; i < comparisonBytesA.length; i += 1) {
- const byteA = comparisonBytesA[i];
- const byteB = comparisonBytesB[i];
-
- if (byteA === byteB) {
- // eslint-disable-next-line no-continue
- continue;
- }
- return byteA > byteB ? 1 : -1;
- }
-
- return 0;
- } catch (e) {
- console.warn(e);
- return 0;
- }
-};
-
-/**
- * @param {number} filterId
- * @returns {string}
- */
-export const getSpecialFilterName = (filterId) => {
- switch (filterId) {
- case SPECIAL_FILTER_ID.CUSTOM_FILTERING_RULES:
- return i18n.t('custom_filter_rules');
- case SPECIAL_FILTER_ID.SYSTEM_HOSTS:
- return i18n.t('system_host_files');
- case SPECIAL_FILTER_ID.BLOCKED_SERVICES:
- return i18n.t('blocked_services');
- case SPECIAL_FILTER_ID.PARENTAL:
- return i18n.t('parental_control');
- case SPECIAL_FILTER_ID.SAFE_BROWSING:
- return i18n.t('safe_browsing');
- case SPECIAL_FILTER_ID.SAFE_SEARCH:
- return i18n.t('safe_search');
- default:
- return i18n.t('unknown_filter', { filterId });
- }
-};
-
-/**
- * @param {array} filters
- * @param {array} whitelistFilters
- * @param {number} filterId
- * @param {function} t - translate
- * @returns {string}
- */
-export const getFilterName = (
- filters,
- whitelistFilters,
- filterId,
- resolveFilterName = (filter) => (filter ? filter.name : i18n.t('unknown_filter', { filterId })),
-) => {
- const specialFilterIds = Object.values(SPECIAL_FILTER_ID);
- if (specialFilterIds.includes(filterId)) {
- return getSpecialFilterName(filterId);
- }
-
- const matchIdPredicate = (filter) => filter.id === filterId;
- const filter = filters.find(matchIdPredicate) || whitelistFilters.find(matchIdPredicate);
- return resolveFilterName(filter);
-};
-
-/**
- * @param {array} rules
- * @param {array} filters
- * @param {array} whitelistFilters
- * @returns {string[]}
- */
-export const getFilterNames = (rules, filters, whitelistFilters) => rules.map(
- ({ filter_list_id }) => getFilterName(filters, whitelistFilters, filter_list_id),
-);
-
-/**
- * @param {array} rules
- * @returns {string[]}
- */
-export const getRuleNames = (rules) => rules.map(({ text }) => text);
-
-/**
- * @param {array} rules
- * @param {array} filters
- * @param {array} whitelistFilters
- * @returns {object}
- */
-export const getFilterNameToRulesMap = (rules, filters, whitelistFilters) => rules.reduce(
- (acc, { text, filter_list_id }) => {
- const filterName = getFilterName(filters, whitelistFilters, filter_list_id);
-
- acc[filterName] = (acc[filterName] || []).concat(text);
- return acc;
- }, {},
-);
-
-/**
- * @param {array} rules
- * @param {array} filters
- * @param {array} whitelistFilters
- * @param {object} classes
- * @returns {JSXElement}
- */
-export const getRulesToFilterList = (rules, filters, whitelistFilters, classes = {
- list: 'filteringRules',
- rule: 'filteringRules__rule font-monospace',
- filter: 'filteringRules__filter',
-}) => {
- const filterNameToRulesMap = getFilterNameToRulesMap(rules, filters, whitelistFilters);
-
- return
- {Object.entries(filterNameToRulesMap).reduce(
- (acc, [filterName, rulesArr]) => acc
- .concat(rulesArr.map((rule, i) => - {rule}
))
- .concat(- {filterName}
),
- [],
- )}
-
;
-};
-
-/**
-* @param {array} rules
-* @param {array} filters
-* @param {array} whitelistFilters
-* @returns {string}
-*/
-export const getRulesAndFilterNames = (rules, filters, whitelistFilters) => {
- const filterNameToRulesMap = getFilterNameToRulesMap(rules, filters, whitelistFilters);
-
- return Object.entries(filterNameToRulesMap).map(
- ([filterName, filterRules]) => filterRules.concat(filterName).join('\n'),
- ).join('\n\n');
-};
-
-/**
- * @param ip {string}
- * @param gateway_ip {string}
- * @returns {{range_end: string, subnet_mask: string, range_start: string,
- * lease_duration: string, gateway_ip: string}}
- */
-export const calculateDhcpPlaceholdersIpv4 = (ip, gateway_ip) => {
- const LAST_OCTET_IDX = 3;
- const LAST_OCTET_RANGE_START = 100;
- const LAST_OCTET_RANGE_END = 200;
-
- const addr = ipaddr.parse(ip);
- addr.octets[LAST_OCTET_IDX] = LAST_OCTET_RANGE_START;
- const range_start = addr.toString();
-
- addr.octets[LAST_OCTET_IDX] = LAST_OCTET_RANGE_END;
- const range_end = addr.toString();
-
- const {
- subnet_mask,
- lease_duration,
- } = DHCP_VALUES_PLACEHOLDERS.ipv4;
-
- return {
- gateway_ip: gateway_ip || ip,
- subnet_mask,
- range_start,
- range_end,
- lease_duration,
- };
-};
-
-export const calculateDhcpPlaceholdersIpv6 = () => {
- const {
- range_start,
- range_end,
- lease_duration,
- } = DHCP_VALUES_PLACEHOLDERS.ipv6;
-
- return {
- range_start,
- range_end,
- lease_duration,
- };
-};
-
-/**
- * Add ip_addresses property - concatenated ipv4_addresses and ipv6_addresses for every interface
- * @param interfaces
- * @param interfaces.ipv4_addresses {string[]}
- * @param interfaces.ipv6_addresses {string[]}
- * @returns interfaces Interfaces enriched with ip_addresses property
- */
-export const enrichWithConcatenatedIpAddresses = (interfaces) => Object.entries(interfaces)
- .reduce((acc, [k, v]) => {
- const ipv4_addresses = v.ipv4_addresses ?? [];
- const ipv6_addresses = v.ipv6_addresses ?? [];
-
- acc[k].ip_addresses = ipv4_addresses.concat(ipv6_addresses);
- return acc;
- }, interfaces);
-
-export const isScrolledIntoView = (el) => {
- const rect = el.getBoundingClientRect();
- const elemTop = rect.top;
- const elemBottom = rect.bottom;
-
- return elemTop < window.innerHeight && elemBottom >= 0;
-};
-
-/**
- * If this is a manually created client, return its name.
- * If this is a "runtime" client, return it's IP address.
- * @param clients {Array.
);
};
-Auth.propTypes = {
- handleSubmit: PropTypes.func.isRequired,
- pristine: PropTypes.bool.isRequired,
- invalid: PropTypes.bool.isRequired,
- t: PropTypes.func.isRequired,
-};
-
export default flow([
withTranslation(),
reduxForm({
diff --git a/client/src/install/Setup/Controls.js b/client/src/install/Setup/Controls.tsx
similarity index 55%
rename from client/src/install/Setup/Controls.js
rename to client/src/install/Setup/Controls.tsx
index 80c9cc58..29c258c2 100644
--- a/client/src/install/Setup/Controls.js
+++ b/client/src/install/Setup/Controls.tsx
@@ -1,47 +1,67 @@
import React, { Component } from 'react';
import { connect } from 'react-redux';
-import PropTypes from 'prop-types';
import { Trans } from 'react-i18next';
import * as actionCreators from '../../actions/install';
-class Controls extends Component {
- renderPrevButton(step) {
+interface ControlsProps {
+ install: {
+ step: number;
+ processingSubmit: boolean;
+ dns: {
+ status: string;
+ };
+ web: {
+ status: string;
+ };
+ };
+ nextStep?: (...args: unknown[]) => unknown;
+ prevStep?: (...args: unknown[]) => unknown;
+ openDashboard?: (...args: unknown[]) => unknown;
+ submitting?: boolean;
+ invalid?: boolean;
+ pristine?: boolean;
+ ip?: string;
+ port?: number;
+}
+
+class Controls extends Component