diff --git a/client/custom.css b/client/custom.css index 206345b..82f5b93 100644 --- a/client/custom.css +++ b/client/custom.css @@ -1,6 +1,6 @@ @charset "UTF-8"; :root, -[data-bs-theme=light] { +[data-bs-theme="light"] { --bs-blue: #0d6efd; --bs-indigo: #6610f2; --bs-purple: #6f42c1; @@ -66,9 +66,16 @@ --bs-dark-border-subtle: #adb5bd; --bs-white-rgb: 255, 255, 255; --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.15), + rgba(255, 255, 255, 0) + ); --bs-body-font-family: var(--bs-font-sans-serif); --bs-body-font-size: 1rem; --bs-body-font-weight: 400; @@ -120,7 +127,7 @@ --bs-form-invalid-border-color: #dc3545; } -[data-bs-theme=dark] { +[data-bs-theme="dark"] { color-scheme: dark; --bs-body-color: #dee2e6; --bs-body-color-rgb: 222, 226, 230; @@ -182,7 +189,7 @@ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ :root, -[data-bs-theme=light] { +[data-bs-theme="light"] { --bs-blue: #0d6efd; --bs-indigo: #6610f2; --bs-purple: #6f42c1; @@ -248,9 +255,16 @@ --bs-dark-border-subtle: #adb5bd; --bs-white-rgb: 255, 255, 255; --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.15), + rgba(255, 255, 255, 0) + ); --bs-body-font-family: var(--bs-font-sans-serif); --bs-body-font-size: 1rem; --bs-body-font-weight: 400; @@ -302,7 +316,7 @@ --bs-form-invalid-border-color: #dc3545; } -[data-bs-theme=dark] { +[data-bs-theme="dark"] { color-scheme: dark; --bs-body-color: #dee2e6; --bs-body-color-rgb: 222, 226, 230; @@ -391,7 +405,18 @@ hr { opacity: 0.25; } -h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { +h6, +.h6, +h5, +.h5, +h4, +.h4, +h3, +.h3, +h2, +.h2, +h1, +.h1 { margin-top: 0; margin-bottom: 0.5rem; font-weight: 500; @@ -399,47 +424,57 @@ h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { color: var(--bs-heading-color); } -h1, .h1 { +h1, +.h1 { font-size: calc(1.375rem + 1.5vw); } @media (min-width: 1200px) { - h1, .h1 { + h1, + .h1 { font-size: 2.5rem; } } -h2, .h2 { +h2, +.h2 { font-size: calc(1.325rem + 0.9vw); } @media (min-width: 1200px) { - h2, .h2 { + h2, + .h2 { font-size: 2rem; } } -h3, .h3 { +h3, +.h3 { font-size: calc(1.3rem + 0.6vw); } @media (min-width: 1200px) { - h3, .h3 { + h3, + .h3 { font-size: 1.75rem; } } -h4, .h4 { +h4, +.h4 { font-size: calc(1.275rem + 0.3vw); } @media (min-width: 1200px) { - h4, .h4 { + h4, + .h4 { font-size: 1.5rem; } } -h5, .h5 { +h5, +.h5 { font-size: 1.25rem; } -h6, .h6 { +h6, +.h6 { font-size: 1rem; } @@ -497,11 +532,13 @@ strong { font-weight: bolder; } -small, .small { +small, +.small { font-size: 0.875em; } -mark, .mark { +mark, +.mark { padding: 0.1875em; color: var(--bs-highlight-color); background-color: var(--bs-highlight-bg); @@ -531,7 +568,8 @@ a:hover { --bs-link-color-rgb: var(--bs-link-hover-color-rgb); } -a:not([href]):not([class]), a:not([href]):not([class]):hover { +a:not([href]):not([class]), +a:not([href]):not([class]):hover { color: inherit; text-decoration: none; } @@ -643,7 +681,7 @@ select { text-transform: none; } -[role=button] { +[role="button"] { cursor: pointer; } @@ -654,20 +692,22 @@ select:disabled { opacity: 1; } -[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { +[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not( + [type="week"] + ):not([type="time"])::-webkit-calendar-picker-indicator { display: none !important; } button, -[type=button], -[type=reset], -[type=submit] { +[type="button"], +[type="reset"], +[type="submit"] { -webkit-appearance: button; } button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { cursor: pointer; } @@ -718,7 +758,7 @@ legend + * { height: auto; } -[type=search] { +[type="search"] { -webkit-appearance: textfield; outline-offset: -2px; } @@ -921,27 +961,42 @@ progress { } @media (min-width: 576px) { - .container-sm, .container { + .container-sm, + .container { max-width: 540px; } } @media (min-width: 768px) { - .container-md, .container-sm, .container { + .container-md, + .container-sm, + .container { max-width: 720px; } } @media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { + .container-lg, + .container-md, + .container-sm, + .container { max-width: 960px; } } @media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { + .container-xl, + .container-lg, + .container-md, + .container-sm, + .container { max-width: 1140px; } } @media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + .container-xxl, + .container-xl, + .container-lg, + .container-md, + .container-sm, + .container { max-width: 1320px; } } @@ -2047,10 +2102,14 @@ progress { } .table > :not(caption) > * > * { padding: 0.5rem 0.5rem; - color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); + color: var( + --bs-table-color-state, + var(--bs-table-color-type, var(--bs-table-color)) + ); background-color: var(--bs-table-bg); border-bottom-width: var(--bs-border-width); - box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); + box-shadow: inset 0 0 0 9999px + var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); } .table > tbody { vertical-align: inherit; @@ -2295,17 +2354,19 @@ progress { background-clip: padding-box; border: var(--bs-border-width) solid var(--bs-border-color); border-radius: var(--bs-border-radius); - 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; } @media (prefers-reduced-motion: reduce) { .form-control { transition: none; } } -.form-control[type=file] { +.form-control[type="file"] { overflow: hidden; } -.form-control[type=file]:not(:disabled):not([readonly]) { +.form-control[type="file"]:not(:disabled):not([readonly]) { cursor: pointer; } .form-control:focus { @@ -2344,7 +2405,11 @@ progress { border-width: 0; border-inline-end-width: var(--bs-border-width); border-radius: 0; - 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; } @media (prefers-reduced-motion: reduce) { .form-control::file-selector-button { @@ -2369,7 +2434,8 @@ progress { .form-control-plaintext:focus { outline: 0; } -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { +.form-control-plaintext.form-control-sm, +.form-control-plaintext.form-control-lg { padding-right: 0; padding-left: 0; } @@ -2442,13 +2508,16 @@ textarea.form-control-lg { color: var(--bs-body-color); appearance: none; background-color: var(--bs-body-bg); - background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-image: var(--bs-form-select-bg-img), + var(--bs-form-select-bg-icon, none); background-repeat: no-repeat; background-position: right 0.75rem center; background-size: 16px 12px; border: var(--bs-border-width) solid var(--bs-border-color); border-radius: var(--bs-border-radius); - 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; } @media (prefers-reduced-motion: reduce) { .form-select { @@ -2460,7 +2529,8 @@ textarea.form-control-lg { outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } -.form-select[multiple], .form-select[size]:not([size="1"]) { +.form-select[multiple], +.form-select[size]:not([size="1"]) { padding-right: 0.75rem; background-image: none; } @@ -2488,7 +2558,7 @@ textarea.form-control-lg { border-radius: var(--bs-border-radius-lg); } -[data-bs-theme=dark] .form-select { +[data-bs-theme="dark"] .form-select { --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); } @@ -2530,10 +2600,10 @@ textarea.form-control-lg { border: var(--bs-border-width) solid var(--bs-border-color); print-color-adjust: exact; } -.form-check-input[type=checkbox] { +.form-check-input[type="checkbox"] { border-radius: 0.25em; } -.form-check-input[type=radio] { +.form-check-input[type="radio"] { border-radius: 50%; } .form-check-input:active { @@ -2548,13 +2618,13 @@ textarea.form-control-lg { background-color: #0d6efd; border-color: #0d6efd; } -.form-check-input:checked[type=checkbox] { +.form-check-input:checked[type="checkbox"] { --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); } -.form-check-input:checked[type=radio] { +.form-check-input:checked[type="radio"] { --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); } -.form-check-input[type=checkbox]:indeterminate { +.form-check-input[type="checkbox"]:indeterminate { background-color: #0d6efd; border-color: #0d6efd; --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); @@ -2564,7 +2634,8 @@ textarea.form-control-lg { filter: none; opacity: 0.5; } -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { cursor: default; opacity: 0.5; } @@ -2612,13 +2683,16 @@ textarea.form-control-lg { clip: rect(0, 0, 0, 0); pointer-events: none; } -.btn-check[disabled] + .btn, .btn-check:disabled + .btn { +.btn-check[disabled] + .btn, +.btn-check:disabled + .btn { pointer-events: none; filter: none; opacity: 0.65; } -[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { +[data-bs-theme="dark"] + .form-switch + .form-check-input:not(:checked):not(:focus) { --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); } @@ -2633,10 +2707,14 @@ textarea.form-control-lg { outline: 0; } .form-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #f9f9f9, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: + 0 0 0 1px #f9f9f9, + 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } .form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #f9f9f9, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + box-shadow: + 0 0 0 1px #f9f9f9, + 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } .form-range::-moz-focus-outer { border: 0; @@ -2649,7 +2727,10 @@ textarea.form-control-lg { background-color: #0d6efd; border: 0; border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { .form-range::-webkit-slider-thumb { @@ -2675,7 +2756,10 @@ textarea.form-control-lg { background-color: #0d6efd; border: 0; border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { .form-range::-moz-range-thumb { @@ -2728,7 +2812,9 @@ textarea.form-control-lg { pointer-events: none; border: var(--bs-border-width) solid transparent; transform-origin: 0 0; - transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; + transition: + opacity 0.1s ease-in-out, + transform 0.1s ease-in-out; } @media (prefers-reduced-motion: reduce) { .form-floating > label { @@ -2743,7 +2829,8 @@ textarea.form-control-lg { .form-floating > .form-control-plaintext::placeholder { color: transparent; } -.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown), .form-floating > .form-control-plaintext:focus, .form-floating > .form-control-plaintext:not(:placeholder-shown) { padding-top: 1.625rem; @@ -2859,21 +2946,38 @@ textarea.form-control-lg { padding-right: 3rem; } -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { +.input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-control, +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-select { border-top-right-radius: 0; border-bottom-right-radius: 0; } -.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), -.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, -.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { +.input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4), +.input-group.has-validation + > .form-floating:nth-last-child(n + 3) + > .form-control, +.input-group.has-validation + > .form-floating:nth-last-child(n + 3) + > .form-select { border-top-right-radius: 0; border-bottom-right-radius: 0; } -.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { +.input-group + > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not( + .valid-feedback + ):not(.invalid-tooltip):not(.invalid-feedback) { margin-left: calc(var(--bs-border-width) * -1); border-top-left-radius: 0; border-bottom-left-radius: 0; @@ -2913,7 +3017,8 @@ textarea.form-control-lg { display: block; } -.was-validated .form-control:valid, .form-control.is-valid { +.was-validated .form-control:valid, +.form-control.is-valid { border-color: var(--bs-form-valid-border-color); padding-right: calc(1.5em + 0.75rem); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); @@ -2921,44 +3026,61 @@ textarea.form-control-lg { background-position: right calc(0.375em + 0.1875rem) center; background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { +.was-validated .form-control:valid:focus, +.form-control.is-valid:focus { border-color: var(--bs-form-valid-border-color); box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); } -.was-validated .form-select:valid, .form-select.is-valid { +.was-validated .form-select:valid, +.form-select.is-valid { border-color: var(--bs-form-valid-border-color); } -.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { +.was-validated .form-select:valid:not([multiple]):not([size]), +.was-validated .form-select:valid:not([multiple])[size="1"], +.form-select.is-valid:not([multiple]):not([size]), +.form-select.is-valid:not([multiple])[size="1"] { --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + background-position: + right 0.75rem center, + center right 2.25rem; + background-size: + 16px 12px, + calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, +.form-select.is-valid:focus { border-color: var(--bs-form-valid-border-color); box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } -.was-validated .form-control-color:valid, .form-control-color.is-valid { +.was-validated .form-control-color:valid, +.form-control-color.is-valid { width: calc(3rem + calc(1.5em + 0.75rem)); } -.was-validated .form-check-input:valid, .form-check-input.is-valid { +.was-validated .form-check-input:valid, +.form-check-input.is-valid { border-color: var(--bs-form-valid-border-color); } -.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { +.was-validated .form-check-input:valid:checked, +.form-check-input.is-valid:checked { background-color: var(--bs-form-valid-color); } -.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { +.was-validated .form-check-input:valid:focus, +.form-check-input.is-valid:focus { box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } -.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: var(--bs-form-valid-color); } @@ -2966,7 +3088,8 @@ textarea.form-control-lg { margin-left: 0.5em; } -.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-control:not(:focus):valid, +.input-group > .form-control:not(:focus).is-valid, .was-validated .input-group > .form-select:not(:focus):valid, .input-group > .form-select:not(:focus).is-valid, .was-validated .input-group > .form-floating:not(:focus-within):valid, @@ -3003,7 +3126,8 @@ textarea.form-control-lg { display: block; } -.was-validated .form-control:invalid, .form-control.is-invalid { +.was-validated .form-control:invalid, +.form-control.is-invalid { border-color: var(--bs-form-invalid-border-color); padding-right: calc(1.5em + 0.75rem); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); @@ -3011,44 +3135,61 @@ textarea.form-control-lg { background-position: right calc(0.375em + 0.1875rem) center; background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { +.was-validated .form-control:invalid:focus, +.form-control.is-invalid:focus { border-color: var(--bs-form-invalid-border-color); box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); } -.was-validated .form-select:invalid, .form-select.is-invalid { +.was-validated .form-select:invalid, +.form-select.is-invalid { border-color: var(--bs-form-invalid-border-color); } -.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { +.was-validated .form-select:invalid:not([multiple]):not([size]), +.was-validated .form-select:invalid:not([multiple])[size="1"], +.form-select.is-invalid:not([multiple]):not([size]), +.form-select.is-invalid:not([multiple])[size="1"] { --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + background-position: + right 0.75rem center, + center right 2.25rem; + background-size: + 16px 12px, + calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, +.form-select.is-invalid:focus { border-color: var(--bs-form-invalid-border-color); box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } -.was-validated .form-control-color:invalid, .form-control-color.is-invalid { +.was-validated .form-control-color:invalid, +.form-control-color.is-invalid { width: calc(3rem + calc(1.5em + 0.75rem)); } -.was-validated .form-check-input:invalid, .form-check-input.is-invalid { +.was-validated .form-check-input:invalid, +.form-check-input.is-invalid { border-color: var(--bs-form-invalid-border-color); } -.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { +.was-validated .form-check-input:invalid:checked, +.form-check-input.is-invalid:checked { background-color: var(--bs-form-invalid-color); } -.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { +.was-validated .form-check-input:invalid:focus, +.form-check-input.is-invalid:focus { box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } -.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: var(--bs-form-invalid-color); } @@ -3056,7 +3197,8 @@ textarea.form-control-lg { margin-left: 0.5em; } -.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-control:not(:focus):invalid, +.input-group > .form-control:not(:focus).is-invalid, .was-validated .input-group > .form-select:not(:focus):invalid, .input-group > .form-select:not(:focus).is-invalid, .was-validated .input-group > .form-floating:not(:focus-within):invalid, @@ -3077,9 +3219,11 @@ textarea.form-control-lg { --bs-btn-border-color: transparent; --bs-btn-border-radius: var(--bs-border-radius); --bs-btn-hover-border-color: transparent; - --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), + 0 1px 1px rgba(0, 0, 0, 0.075); --bs-btn-disabled-opacity: 0.65; - --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + --bs-btn-focus-box-shadow: 0 0 0 0.25rem + rgba(var(--bs-btn-focus-shadow-rgb), 0.5); display: inline-block; padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); font-family: var(--bs-btn-font-family); @@ -3095,7 +3239,11 @@ textarea.form-control-lg { border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); border-radius: var(--bs-btn-border-radius); background-color: var(--bs-btn-bg); - 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; } @media (prefers-reduced-motion: reduce) { .btn { @@ -3124,15 +3272,25 @@ textarea.form-control-lg { outline: 0; box-shadow: var(--bs-btn-focus-box-shadow); } -.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { +.btn-check:checked + .btn, +:not(.btn-check) + .btn:active, +.btn:first-child:active, +.btn.active, +.btn.show { color: var(--bs-btn-active-color); background-color: var(--bs-btn-active-bg); border-color: var(--bs-btn-active-border-color); } -.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { +.btn-check:checked + .btn:focus-visible, +:not(.btn-check) + .btn:active:focus-visible, +.btn:first-child:active:focus-visible, +.btn.active:focus-visible, +.btn.show:focus-visible { box-shadow: var(--bs-btn-focus-box-shadow); } -.btn:disabled, .btn.disabled, fieldset:disabled .btn { +.btn:disabled, +.btn.disabled, +fieldset:disabled .btn { color: var(--bs-btn-disabled-color); pointer-events: none; background-color: var(--bs-btn-disabled-bg); @@ -3434,14 +3592,16 @@ textarea.form-control-lg { color: var(--bs-btn-hover-color); } -.btn-lg, .btn-group-lg > .btn { +.btn-lg, +.btn-group-lg > .btn { --bs-btn-padding-y: 0.5rem; --bs-btn-padding-x: 1rem; --bs-btn-font-size: 1.25rem; --bs-btn-border-radius: var(--bs-border-radius-lg); } -.btn-sm, .btn-group-sm > .btn { +.btn-sm, +.btn-group-sm > .btn { --bs-btn-padding-y: 0.25rem; --bs-btn-padding-x: 0.5rem; --bs-btn-font-size: 0.875rem; @@ -3523,7 +3683,9 @@ textarea.form-control-lg { --bs-dropdown-border-color: var(--bs-border-color-translucent); --bs-dropdown-border-radius: var(--bs-border-radius); --bs-dropdown-border-width: var(--bs-border-width); - --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); + --bs-dropdown-inner-border-radius: calc( + var(--bs-border-radius) - var(--bs-border-width) + ); --bs-dropdown-divider-bg: var(--bs-border-color-translucent); --bs-dropdown-divider-margin-y: 0.5rem; --bs-dropdown-box-shadow: var(--bs-box-shadow); @@ -3753,16 +3915,19 @@ textarea.form-control-lg { border: 0; border-radius: var(--bs-dropdown-item-border-radius, 0); } -.dropdown-item:hover, .dropdown-item:focus { +.dropdown-item:hover, +.dropdown-item:focus { color: var(--bs-dropdown-link-hover-color); background-color: var(--bs-dropdown-link-hover-bg); } -.dropdown-item.active, .dropdown-item:active { +.dropdown-item.active, +.dropdown-item:active { color: var(--bs-dropdown-link-active-color); text-decoration: none; background-color: var(--bs-dropdown-link-active-bg); } -.dropdown-item.disabled, .dropdown-item:disabled { +.dropdown-item.disabled, +.dropdown-item:disabled { color: var(--bs-dropdown-link-disabled-color); pointer-events: none; background-color: transparent; @@ -3774,7 +3939,8 @@ textarea.form-control-lg { .dropdown-header { display: block; - padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + padding: var(--bs-dropdown-header-padding-y) + var(--bs-dropdown-header-padding-x); margin-bottom: 0; font-size: 0.875rem; color: var(--bs-dropdown-header-color); @@ -3850,7 +4016,7 @@ textarea.form-control-lg { border-top-right-radius: 0; border-bottom-right-radius: 0; } -.btn-group > .btn:nth-child(n+3), +.btn-group > .btn:nth-child(n + 3), .btn-group > :not(.btn-check) + .btn, .btn-group > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; @@ -3861,19 +4027,23 @@ textarea.form-control-lg { padding-right: 0.5625rem; padding-left: 0.5625rem; } -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropend .dropdown-toggle-split::after { margin-left: 0; } .dropstart .dropdown-toggle-split::before { margin-right: 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; } @@ -3925,21 +4095,26 @@ textarea.form-control-lg { text-decoration: none; background: none; border: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 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; } @media (prefers-reduced-motion: reduce) { .nav-link { transition: none; } } -.nav-link:hover, .nav-link:focus { +.nav-link:hover, +.nav-link:focus { color: var(--bs-nav-link-hover-color); } .nav-link:focus-visible { outline: 0; box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } -.nav-link.disabled, .nav-link:disabled { +.nav-link.disabled, +.nav-link:disabled { color: var(--bs-nav-link-disabled-color); pointer-events: none; cursor: default; @@ -3949,11 +4124,14 @@ textarea.form-control-lg { --bs-nav-tabs-border-width: var(--bs-border-width); --bs-nav-tabs-border-color: var(--bs-border-color); --bs-nav-tabs-border-radius: var(--bs-border-radius); - --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) + var(--bs-secondary-bg) var(--bs-border-color); --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); --bs-nav-tabs-link-active-bg: var(--bs-body-bg); - --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); - border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) + var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid + var(--bs-nav-tabs-border-color); } .nav-tabs .nav-link { margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); @@ -3961,7 +4139,8 @@ textarea.form-control-lg { border-top-left-radius: var(--bs-nav-tabs-border-radius); border-top-right-radius: var(--bs-nav-tabs-border-radius); } -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { +.nav-tabs .nav-link:hover, +.nav-tabs .nav-link:focus { isolation: isolate; border-color: var(--bs-nav-tabs-link-hover-border-color); } @@ -4002,7 +4181,8 @@ textarea.form-control-lg { padding-left: 0; border-bottom: var(--bs-nav-underline-border-width) solid transparent; } -.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { +.nav-underline .nav-link:hover, +.nav-underline .nav-link:focus { border-bottom-color: currentcolor; } .nav-underline .nav-link.active, @@ -4086,7 +4266,8 @@ textarea.form-control-lg { text-decoration: none; white-space: nowrap; } -.navbar-brand:hover, .navbar-brand:focus { +.navbar-brand:hover, +.navbar-brand:focus { color: var(--bs-navbar-brand-hover-color); } @@ -4103,7 +4284,8 @@ textarea.form-control-lg { margin-bottom: 0; list-style: none; } -.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { +.navbar-nav .nav-link.active, +.navbar-nav .nav-link.show { color: var(--bs-navbar-active-color); } .navbar-nav .dropdown-menu { @@ -4449,7 +4631,7 @@ textarea.form-control-lg { } .navbar-dark, -.navbar[data-bs-theme=dark] { +.navbar[data-bs-theme="dark"] { --bs-navbar-color: rgba(255, 255, 255, 0.55); --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); @@ -4460,7 +4642,7 @@ textarea.form-control-lg { --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } -[data-bs-theme=dark] .navbar-toggler-icon { +[data-bs-theme="dark"] .navbar-toggler-icon { --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } @@ -4474,7 +4656,9 @@ textarea.form-control-lg { --bs-card-border-color: var(--bs-border-color-translucent); --bs-card-border-radius: var(--bs-border-radius); --bs-card-box-shadow: ; - --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-card-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); --bs-card-cap-padding-y: 0.5rem; --bs-card-cap-padding-x: 1rem; --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); @@ -4552,7 +4736,8 @@ textarea.form-control-lg { border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); } .card-header:first-child { - border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; + border-radius: var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius) 0 0; } .card-footer { @@ -4562,7 +4747,8 @@ textarea.form-control-lg { border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); } .card-footer:last-child { - border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); + border-radius: 0 0 var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius); } .card-header-tabs { @@ -4654,11 +4840,15 @@ textarea.form-control-lg { .accordion { --bs-accordion-color: var(--bs-body-color); --bs-accordion-bg: var(--bs-body-bg); - --bs-accordion-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, border-radius 0.15s ease; + --bs-accordion-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, border-radius 0.15s ease; --bs-accordion-border-color: var(--bs-border-color); --bs-accordion-border-width: var(--bs-border-width); --bs-accordion-border-radius: var(--bs-border-radius); - --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-accordion-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); --bs-accordion-btn-padding-x: 1.25rem; --bs-accordion-btn-padding-y: 1rem; --bs-accordion-btn-color: var(--bs-body-color); @@ -4699,7 +4889,8 @@ textarea.form-control-lg { .accordion-button:not(.collapsed) { color: var(--bs-accordion-active-color); background-color: var(--bs-accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 + var(--bs-accordion-border-color); } .accordion-button:not(.collapsed)::after { background-image: var(--bs-accordion-btn-active-icon); @@ -4738,7 +4929,8 @@ textarea.form-control-lg { .accordion-item { color: var(--bs-accordion-color); background-color: var(--bs-accordion-bg); - border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); + border: var(--bs-accordion-border-width) solid + var(--bs-accordion-border-color); } .accordion-item:first-of-type { border-top-left-radius: var(--bs-accordion-border-radius); @@ -4782,11 +4974,12 @@ textarea.form-control-lg { .accordion-flush .accordion-item:last-child { border-bottom: 0; } -.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed { +.accordion-flush .accordion-item .accordion-button, +.accordion-flush .accordion-item .accordion-button.collapsed { border-radius: 0; } -[data-bs-theme=dark] .accordion-button::after { +[data-bs-theme="dark"] .accordion-button::after { --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); } @@ -4817,7 +5010,8 @@ textarea.form-control-lg { float: left; padding-right: var(--bs-breadcrumb-item-padding-x); color: var(--bs-breadcrumb-divider-color); - content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; + content: var(--bs-breadcrumb-divider, "/") + /* rtl: var(--bs-breadcrumb-divider, "/") */; } .breadcrumb-item.active { color: var(--bs-breadcrumb-item-active-color); @@ -4857,8 +5051,13 @@ textarea.form-control-lg { color: var(--bs-pagination-color); text-decoration: none; background-color: var(--bs-pagination-bg); - border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); - 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; + border: var(--bs-pagination-border-width) solid + var(--bs-pagination-border-color); + 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; } @media (prefers-reduced-motion: reduce) { .page-link { @@ -4878,13 +5077,15 @@ textarea.form-control-lg { outline: 0; box-shadow: var(--bs-pagination-focus-box-shadow); } -.page-link.active, .active > .page-link { +.page-link.active, +.active > .page-link { z-index: 3; color: var(--bs-pagination-active-color); background-color: var(--bs-pagination-active-bg); border-color: var(--bs-pagination-active-border-color); } -.page-link.disabled, .disabled > .page-link { +.page-link.disabled, +.disabled > .page-link { color: var(--bs-pagination-disabled-color); pointer-events: none; background-color: var(--bs-pagination-disabled-bg); @@ -5080,7 +5281,16 @@ textarea.form-control-lg { } .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: var(--bs-progress-height) var(--bs-progress-height); } @@ -5140,7 +5350,8 @@ textarea.form-control-lg { color: var(--bs-list-group-action-color); text-align: inherit; } -.list-group-item-action:hover, .list-group-item-action:focus { +.list-group-item-action:hover, +.list-group-item-action:focus { z-index: 1; color: var(--bs-list-group-action-hover-color); text-decoration: none; @@ -5154,11 +5365,13 @@ textarea.form-control-lg { .list-group-item { position: relative; display: block; - padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + padding: var(--bs-list-group-item-padding-y) + var(--bs-list-group-item-padding-x); color: var(--bs-list-group-color); text-decoration: none; background-color: var(--bs-list-group-bg); - border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); + border: var(--bs-list-group-border-width) solid + var(--bs-list-group-border-color); } .list-group-item:first-child { border-top-left-radius: inherit; @@ -5168,7 +5381,8 @@ textarea.form-control-lg { border-bottom-right-radius: inherit; border-bottom-left-radius: inherit; } -.list-group-item.disabled, .list-group-item:disabled { +.list-group-item.disabled, +.list-group-item:disabled { color: var(--bs-list-group-disabled-color); pointer-events: none; background-color: var(--bs-list-group-disabled-bg); @@ -5473,7 +5687,8 @@ textarea.form-control-lg { box-shadow: var(--bs-btn-close-focus-shadow); opacity: var(--bs-btn-close-focus-opacity); } -.btn-close:disabled, .btn-close.disabled { +.btn-close:disabled, +.btn-close.disabled { pointer-events: none; user-select: none; opacity: var(--bs-btn-close-disabled-opacity); @@ -5483,7 +5698,7 @@ textarea.form-control-lg { filter: var(--bs-btn-close-white-filter); } -[data-bs-theme=dark] .btn-close { +[data-bs-theme="dark"] .btn-close { filter: var(--bs-btn-close-white-filter); } @@ -5540,9 +5755,14 @@ textarea.form-control-lg { color: var(--bs-toast-header-color); background-color: var(--bs-toast-header-bg); background-clip: padding-box; - border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); - border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); - border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-bottom: var(--bs-toast-border-width) solid + var(--bs-toast-header-border-color); + border-top-left-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); + border-top-right-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); } .toast-header .btn-close { margin-right: calc(-0.5 * var(--bs-toast-padding-x)); @@ -5565,7 +5785,9 @@ textarea.form-control-lg { --bs-modal-border-width: var(--bs-border-width); --bs-modal-border-radius: var(--bs-border-radius-lg); --bs-modal-box-shadow: var(--bs-box-shadow-sm); - --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); + --bs-modal-inner-border-radius: calc( + var(--bs-border-radius-lg) - (var(--bs-border-width)) + ); --bs-modal-header-padding-x: 1rem; --bs-modal-header-padding-y: 1rem; --bs-modal-header-padding: 1rem 1rem; @@ -5666,13 +5888,17 @@ textarea.form-control-lg { align-items: center; justify-content: space-between; padding: var(--bs-modal-header-padding); - border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-bottom: var(--bs-modal-header-border-width) solid + var(--bs-modal-header-border-color); border-top-left-radius: var(--bs-modal-inner-border-radius); border-top-right-radius: var(--bs-modal-inner-border-radius); } .modal-header .btn-close { - padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); - margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto; + padding: calc(var(--bs-modal-header-padding-y) * 0.5) + calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) + calc(-0.5 * var(--bs-modal-header-padding-x)) + calc(-0.5 * var(--bs-modal-header-padding-y)) auto; } .modal-title { @@ -5694,7 +5920,8 @@ textarea.form-control-lg { justify-content: flex-end; padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); background-color: var(--bs-modal-footer-bg); - border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-top: var(--bs-modal-footer-border-width) solid + var(--bs-modal-footer-border-color); border-bottom-right-radius: var(--bs-modal-inner-border-radius); border-bottom-left-radius: var(--bs-modal-inner-border-radius); } @@ -5895,46 +6122,58 @@ textarea.form-control-lg { border-style: solid; } -.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { +.bs-tooltip-top .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow { bottom: calc(-1 * var(--bs-tooltip-arrow-height)); } -.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { +.bs-tooltip-top .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before { top: -1px; - border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-width: var(--bs-tooltip-arrow-height) + calc(var(--bs-tooltip-arrow-width) * 0.5) 0; border-top-color: var(--bs-tooltip-bg); } /* rtl:begin:ignore */ -.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { +.bs-tooltip-end .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow { left: calc(-1 * var(--bs-tooltip-arrow-height)); width: var(--bs-tooltip-arrow-height); height: var(--bs-tooltip-arrow-width); } -.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { +.bs-tooltip-end .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before { right: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; border-right-color: var(--bs-tooltip-bg); } /* rtl:end:ignore */ -.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { +.bs-tooltip-bottom .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow { top: calc(-1 * var(--bs-tooltip-arrow-height)); } -.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { +.bs-tooltip-bottom .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before { bottom: -1px; - border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height); border-bottom-color: var(--bs-tooltip-bg); } /* rtl:begin:ignore */ -.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { +.bs-tooltip-start .tooltip-arrow, +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow { right: calc(-1 * var(--bs-tooltip-arrow-height)); width: var(--bs-tooltip-arrow-height); height: var(--bs-tooltip-arrow-width); } -.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { +.bs-tooltip-start .tooltip-arrow::before, +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before { left: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 + calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); border-left-color: var(--bs-tooltip-bg); } @@ -5956,7 +6195,9 @@ textarea.form-control-lg { --bs-popover-border-width: var(--bs-border-width); --bs-popover-border-color: var(--bs-border-color-translucent); --bs-popover-border-radius: var(--bs-border-radius-lg); - --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); + --bs-popover-inner-border-radius: calc( + var(--bs-border-radius-lg) - var(--bs-border-width) + ); --bs-popover-box-shadow: var(--bs-box-shadow); --bs-popover-header-padding-x: 1rem; --bs-popover-header-padding-y: 0.5rem; @@ -5998,7 +6239,8 @@ textarea.form-control-lg { width: var(--bs-popover-arrow-width); height: var(--bs-popover-arrow-height); } -.popover .popover-arrow::before, .popover .popover-arrow::after { +.popover .popover-arrow::before, +.popover .popover-arrow::after { position: absolute; display: block; content: ""; @@ -6007,55 +6249,83 @@ textarea.form-control-lg { border-width: 0; } -.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { - bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +.bs-popover-top > .popover-arrow, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow { + bottom: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); } -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +.bs-popover-top > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) + calc(var(--bs-popover-arrow-width) * 0.5) 0; } -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { +.bs-popover-top > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before { bottom: 0; border-top-color: var(--bs-popover-arrow-border); } -.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { +.bs-popover-top > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { bottom: var(--bs-popover-border-width); border-top-color: var(--bs-popover-bg); } /* rtl:begin:ignore */ -.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { - left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +.bs-popover-end > .popover-arrow, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow { + left: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); width: var(--bs-popover-arrow-height); height: var(--bs-popover-arrow-width); } -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +.bs-popover-end > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; } -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { +.bs-popover-end > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before { left: 0; border-right-color: var(--bs-popover-arrow-border); } -.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { +.bs-popover-end > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { left: var(--bs-popover-border-width); border-right-color: var(--bs-popover-bg); } /* rtl:end:ignore */ -.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { - top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { +.bs-popover-bottom > .popover-arrow, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow { + top: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-bottom > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height); +} +.bs-popover-bottom > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before { top: 0; border-bottom-color: var(--bs-popover-arrow-border); } -.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { +.bs-popover-bottom > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { top: var(--bs-popover-border-width); border-bottom-color: var(--bs-popover-bg); } -.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { +.bs-popover-bottom .popover-header::before, +.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before { position: absolute; top: 0; left: 50%; @@ -6063,23 +6333,33 @@ textarea.form-control-lg { width: var(--bs-popover-arrow-width); margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); content: ""; - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-header-bg); } /* rtl:begin:ignore */ -.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { - right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +.bs-popover-start > .popover-arrow, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow { + right: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); width: var(--bs-popover-arrow-height); height: var(--bs-popover-arrow-width); } -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +.bs-popover-start > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 + calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); } -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { +.bs-popover-start > .popover-arrow::before, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before { right: 0; border-left-color: var(--bs-popover-arrow-border); } -.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { +.bs-popover-start > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { right: var(--bs-popover-border-width); border-left-color: var(--bs-popover-bg); } @@ -6091,7 +6371,8 @@ textarea.form-control-lg { font-size: var(--bs-popover-header-font-size); color: var(--bs-popover-header-color); background-color: var(--bs-popover-header-bg); - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-border-color); border-top-left-radius: var(--bs-popover-inner-border-radius); border-top-right-radius: var(--bs-popover-inner-border-radius); } @@ -6202,7 +6483,8 @@ textarea.form-control-lg { transition: none; } } -.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-prev:hover, +.carousel-control-prev:focus, .carousel-control-next:hover, .carousel-control-next:focus { color: #fff; @@ -6307,15 +6589,18 @@ textarea.form-control-lg { color: #000; } -[data-bs-theme=dark] .carousel .carousel-control-prev-icon, -[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon, -[data-bs-theme=dark].carousel .carousel-control-next-icon { +[data-bs-theme="dark"] .carousel .carousel-control-prev-icon, +[data-bs-theme="dark"] .carousel .carousel-control-next-icon, +[data-bs-theme="dark"].carousel .carousel-control-prev-icon, +[data-bs-theme="dark"].carousel .carousel-control-next-icon { filter: invert(1) grayscale(100); } -[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] { +[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target], +[data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target] { background-color: #000; } -[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption { +[data-bs-theme="dark"] .carousel .carousel-caption, +[data-bs-theme="dark"].carousel .carousel-caption { color: #000; } @@ -6326,7 +6611,8 @@ textarea.form-control-lg { height: var(--bs-spinner-height); vertical-align: var(--bs-spinner-vertical-align); border-radius: 50%; - animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); + animation: var(--bs-spinner-animation-speed) linear infinite + var(--bs-spinner-animation-name); } @keyframes spinner-border { @@ -6381,7 +6667,12 @@ textarea.form-control-lg { --bs-spinner-animation-speed: 1.5s; } } -.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { +.offcanvas, +.offcanvas-xxl, +.offcanvas-xl, +.offcanvas-lg, +.offcanvas-md, +.offcanvas-sm { --bs-offcanvas-zindex: 1045; --bs-offcanvas-width: 400px; --bs-offcanvas-height: 30vh; @@ -6422,14 +6713,16 @@ textarea.form-control-lg { top: 0; left: 0; width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(-100%); } .offcanvas-sm.offcanvas-end { top: 0; right: 0; width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(100%); } .offcanvas-sm.offcanvas-top { @@ -6438,7 +6731,8 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(-100%); } .offcanvas-sm.offcanvas-bottom { @@ -6446,13 +6740,17 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(100%); } - .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + .offcanvas-sm.showing, + .offcanvas-sm.show:not(.hiding) { transform: none; } - .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + .offcanvas-sm.showing, + .offcanvas-sm.hiding, + .offcanvas-sm.show { visibility: visible; } } @@ -6500,14 +6798,16 @@ textarea.form-control-lg { top: 0; left: 0; width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(-100%); } .offcanvas-md.offcanvas-end { top: 0; right: 0; width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(100%); } .offcanvas-md.offcanvas-top { @@ -6516,7 +6816,8 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(-100%); } .offcanvas-md.offcanvas-bottom { @@ -6524,13 +6825,17 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(100%); } - .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + .offcanvas-md.showing, + .offcanvas-md.show:not(.hiding) { transform: none; } - .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + .offcanvas-md.showing, + .offcanvas-md.hiding, + .offcanvas-md.show { visibility: visible; } } @@ -6578,14 +6883,16 @@ textarea.form-control-lg { top: 0; left: 0; width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(-100%); } .offcanvas-lg.offcanvas-end { top: 0; right: 0; width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(100%); } .offcanvas-lg.offcanvas-top { @@ -6594,7 +6901,8 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(-100%); } .offcanvas-lg.offcanvas-bottom { @@ -6602,13 +6910,17 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(100%); } - .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + .offcanvas-lg.showing, + .offcanvas-lg.show:not(.hiding) { transform: none; } - .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + .offcanvas-lg.showing, + .offcanvas-lg.hiding, + .offcanvas-lg.show { visibility: visible; } } @@ -6656,14 +6968,16 @@ textarea.form-control-lg { top: 0; left: 0; width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(-100%); } .offcanvas-xl.offcanvas-end { top: 0; right: 0; width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(100%); } .offcanvas-xl.offcanvas-top { @@ -6672,7 +6986,8 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(-100%); } .offcanvas-xl.offcanvas-bottom { @@ -6680,13 +6995,17 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(100%); } - .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + .offcanvas-xl.showing, + .offcanvas-xl.show:not(.hiding) { transform: none; } - .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + .offcanvas-xl.showing, + .offcanvas-xl.hiding, + .offcanvas-xl.show { visibility: visible; } } @@ -6734,14 +7053,16 @@ textarea.form-control-lg { top: 0; left: 0; width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(-100%); } .offcanvas-xxl.offcanvas-end { top: 0; right: 0; width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(100%); } .offcanvas-xxl.offcanvas-top { @@ -6750,7 +7071,8 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(-100%); } .offcanvas-xxl.offcanvas-bottom { @@ -6758,13 +7080,17 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(100%); } - .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + .offcanvas-xxl.showing, + .offcanvas-xxl.show:not(.hiding) { transform: none; } - .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + .offcanvas-xxl.showing, + .offcanvas-xxl.hiding, + .offcanvas-xxl.show { visibility: visible; } } @@ -6809,14 +7135,16 @@ textarea.form-control-lg { top: 0; left: 0; width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(-100%); } .offcanvas.offcanvas-end { top: 0; right: 0; width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateX(100%); } .offcanvas.offcanvas-top { @@ -6825,7 +7153,8 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(-100%); } .offcanvas.offcanvas-bottom { @@ -6833,13 +7162,17 @@ textarea.form-control-lg { left: 0; height: var(--bs-offcanvas-height); max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); transform: translateY(100%); } -.offcanvas.showing, .offcanvas.show:not(.hiding) { +.offcanvas.showing, +.offcanvas.show:not(.hiding) { transform: none; } -.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { +.offcanvas.showing, +.offcanvas.hiding, +.offcanvas.show { visibility: visible; } @@ -6866,7 +7199,8 @@ textarea.form-control-lg { padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); } .offcanvas-header .btn-close { - padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) + calc(var(--bs-offcanvas-padding-x) * 0.5); margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); @@ -6918,7 +7252,12 @@ textarea.form-control-lg { } } .placeholder-wave { - mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient( + 130deg, + #000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000 95% + ); mask-size: 200% 100%; animation: placeholder-wave 2s linear infinite; } @@ -6936,135 +7275,249 @@ textarea.form-control-lg { .text-bg-primary { color: #fff !important; - background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-primary-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-secondary { color: #fff !important; - background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-success { color: #fff !important; - background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-success-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-info { color: #000 !important; - background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-info-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-warning { color: #000 !important; - background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-warning-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-danger { color: #fff !important; - background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-danger-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-light { color: #000 !important; - background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-light-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .text-bg-dark { color: #fff !important; - background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; + background-color: RGBA( + var(--bs-dark-rgb), + var(--bs-bg-opacity, 1) + ) !important; } .link-primary { color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-primary:hover, .link-primary:focus { +.link-primary:hover, +.link-primary:focus { color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-secondary { color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-secondary:hover, .link-secondary:focus { +.link-secondary:hover, +.link-secondary:focus { color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-success { color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-success:hover, .link-success:focus { +.link-success:hover, +.link-success:focus { color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-info { color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-info:hover, .link-info:focus { +.link-info:hover, +.link-info:focus { color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-warning { color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-warning:hover, .link-warning:focus { +.link-warning:hover, +.link-warning:focus { color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-danger { color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-danger:hover, .link-danger:focus { +.link-danger:hover, +.link-danger:focus { color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-light { color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-light:hover, .link-light:focus { +.link-light:hover, +.link-light:focus { color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-dark { color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } -.link-dark:hover, .link-dark:focus { +.link-dark:hover, +.link-dark:focus { color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; } .link-body-emphasis { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-body-emphasis:hover, .link-body-emphasis:focus { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis:hover, +.link-body-emphasis:focus { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 0.75) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; } .focus-ring:focus { outline: 0; - box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) + var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) + var(--bs-focus-ring-color); } .icon-link { display: inline-flex; gap: 0.375rem; align-items: center; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); text-underline-offset: 0.25em; backface-visibility: hidden; } @@ -7081,7 +7534,8 @@ textarea.form-control-lg { } } -.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { +.icon-link-hover:hover > .bi, +.icon-link-hover:focus-visible > .bi { transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); } @@ -7446,15 +7900,24 @@ textarea.form-control-lg { } .focus-ring-primary { - --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); + --bs-focus-ring-color: rgba( + var(--bs-primary-rgb), + var(--bs-focus-ring-opacity) + ); } .focus-ring-secondary { - --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); + --bs-focus-ring-color: rgba( + var(--bs-secondary-rgb), + var(--bs-focus-ring-opacity) + ); } .focus-ring-success { - --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); + --bs-focus-ring-color: rgba( + var(--bs-success-rgb), + var(--bs-focus-ring-opacity) + ); } .focus-ring-info { @@ -7462,15 +7925,24 @@ textarea.form-control-lg { } .focus-ring-warning { - --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); + --bs-focus-ring-color: rgba( + var(--bs-warning-rgb), + var(--bs-focus-ring-opacity) + ); } .focus-ring-danger { - --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); + --bs-focus-ring-color: rgba( + var(--bs-danger-rgb), + var(--bs-focus-ring-opacity) + ); } .focus-ring-light { - --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); + --bs-focus-ring-color: rgba( + var(--bs-light-rgb), + var(--bs-focus-ring-opacity) + ); } .focus-ring-dark { @@ -7566,7 +8038,8 @@ textarea.form-control-lg { } .border-top { - border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + border-top: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; } .border-top-0 { @@ -7574,7 +8047,8 @@ textarea.form-control-lg { } .border-end { - border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + border-right: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; } .border-end-0 { @@ -7582,7 +8056,8 @@ textarea.form-control-lg { } .border-bottom { - border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + border-bottom: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; } .border-bottom-0 { @@ -7590,7 +8065,8 @@ textarea.form-control-lg { } .border-start { - border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; + border-left: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; } .border-start-0 { @@ -7599,17 +8075,26 @@ textarea.form-control-lg { .border-primary { --bs-border-opacity: 1; - border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; + border-color: rgba( + var(--bs-primary-rgb), + var(--bs-border-opacity) + ) !important; } .border-secondary { --bs-border-opacity: 1; - border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; + border-color: rgba( + var(--bs-secondary-rgb), + var(--bs-border-opacity) + ) !important; } .border-success { --bs-border-opacity: 1; - border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; + border-color: rgba( + var(--bs-success-rgb), + var(--bs-border-opacity) + ) !important; } .border-info { @@ -7619,7 +8104,10 @@ textarea.form-control-lg { .border-warning { --bs-border-opacity: 1; - border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; + border-color: rgba( + var(--bs-warning-rgb), + var(--bs-border-opacity) + ) !important; } .border-danger { @@ -8902,47 +9390,74 @@ textarea.form-control-lg { .link-underline-primary { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-secondary { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-success { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-info { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-warning { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-danger { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-light { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline-dark { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; + text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; } .link-underline { --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; } .link-underline-opacity-0 { @@ -8995,17 +9510,26 @@ textarea.form-control-lg { .bg-primary { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-primary-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-secondary { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-secondary-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-success { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-success-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-info { @@ -9015,7 +9539,10 @@ textarea.form-control-lg { .bg-warning { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-warning-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-danger { @@ -9045,7 +9572,10 @@ textarea.form-control-lg { .bg-body { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-body-bg-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-transparent { @@ -9055,12 +9585,18 @@ textarea.form-control-lg { .bg-body-secondary { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-secondary-bg-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-body-tertiary { --bs-bg-opacity: 1; - background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; + background-color: rgba( + var(--bs-tertiary-bg-rgb), + var(--bs-bg-opacity) + ) !important; } .bg-opacity-10 { @@ -13000,17 +13536,23 @@ textarea.form-control-lg { } } -.action-button, .reset-button, .post-button, .instructions-button { +.action-button, +.reset-button, +.post-button, +.instructions-button { padding: 10px 15px; border: none; border-radius: 5px; cursor: pointer; - background: #4CAF50; /* Default button color */ + background: #4caf50; /* Default button color */ color: white; transition: background 0.3s; } -.action-button:hover, .reset-button:hover, .post-button:hover, .instructions-button:hover { +.action-button:hover, +.reset-button:hover, +.post-button:hover, +.instructions-button:hover { background: #45a049; /* Darker shade on hover */ } @@ -13022,12 +13564,14 @@ textarea.form-control-lg { background: #d32f2f; /* Darker shade on hover */ } -.post-button, .instructions-button { - background: #2196F3; /* Other button color */ +.post-button, +.instructions-button { + background: #2196f3; /* Other button color */ } -.post-button:hover, .instructions-button:hover { - background: #1976D2; /* Darker shade on hover */ +.post-button:hover, +.instructions-button:hover { + background: #1976d2; /* Darker shade on hover */ } select { @@ -13039,8 +13583,89 @@ select { } select:focus { - border-color: #4CAF50; /* Change border color on focus */ + border-color: #4caf50; /* Change border color on focus */ } - /*# sourceMappingURL=custom.css.map */ +.recent-solutions-container { + background-color: #f0f2f5; /* Slightly darker light grey */ + padding: 30px; /* Increased padding */ + border-radius: 8px; + margin-bottom: 40px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); /* Soft shadow for separation */ +} + +.suggested-challenges-container { + background-color: #ffffff; /* White for contrast */ + padding: 30px; /* Match padding */ + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); /* Soft shadow */ +} + +/* Optional Section Gap for Natural Break */ +.section-gap { + height: 30px; /* Larger gap */ + background-color: #f5f5f5; /* Very light grey for subtle contrast */ + margin: 20px 0; + border-radius: 4px; +} + +/* Section Titles */ +.section-title { + font-size: 1.75rem; /* Larger for emphasis */ + font-weight: 700; /* Bold */ + color: #333; + margin-bottom: 20px; +} + +/* Button Styling for "See More" */ +.see-more-btn { + border-radius: 6px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* Soft shadow */ + transition: box-shadow 0.2s ease-in-out; + padding: 10px 16px; +} + +.see-more-btn:hover { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); +} + +/* Typography for Descriptions */ +.description-text { + font-size: 1rem; + line-height: 1.5; + color: #333; +} + +/* Difficulty Icon Colors */ +.difficulty-easy { + color: #28a745; +} + +.difficulty-medium { + color: #ffc107; +} + +.difficulty-hard { + color: #dc3545; +} + +/* Color-coded difficulty stars */ +.difficulty-easy .star { + color: #28a745; /* Green for Easy */ +} + +.difficulty-medium .star { + color: #ffc107; /* Yellow for Medium */ +} + +.difficulty-hard .star { + color: #dc3545; /* Red for Hard */ +} + +/* Consistent star styling */ +.star { + font-size: 1.2rem; + margin-right: 4px; + vertical-align: middle; +} diff --git a/client/package-lock.json b/client/package-lock.json index 048f798..806292c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -679,392 +679,18 @@ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -1426,6 +1052,10 @@ "android" ] }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz", @@ -2170,6 +1800,26 @@ "react": ">=16.8.0" } }, + "node_modules/@restart/ui": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", + "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, "node_modules/@restart/ui/node_modules/uncontrollable": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", @@ -2178,32 +1828,6 @@ "react": ">=16.14.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", - "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz", - "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.24.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz", @@ -2217,201 +1841,6 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz", - "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz", - "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz", - "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz", - "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz", - "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz", - "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz", - "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz", - "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz", - "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz", - "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz", - "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz", - "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz", - "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz", - "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz", - "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -5843,13 +5272,6 @@ "node": ">= 0.4" } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", - "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", - "cpu": [ - "x64" - ], "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", @@ -6008,13 +5430,6 @@ "node": ">=12" } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", - "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", - "cpu": [ - "arm64" - ], "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6056,13 +5471,6 @@ "node": ">= 6" } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", - "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", - "cpu": [ - "ia32" - ], "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -6076,13 +5484,6 @@ "node": ">= 6" } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", - "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", - "cpu": [ - "x64" - ], "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -6284,10 +5685,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -11550,20 +10947,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", - "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", diff --git a/client/src/components/ChallengeCard.tsx b/client/src/components/ChallengeCard.tsx index de30b53..62b787e 100644 --- a/client/src/components/ChallengeCard.tsx +++ b/client/src/components/ChallengeCard.tsx @@ -20,16 +20,32 @@ function ChallengeCard({ const difficultyStars = useMemo( () => - Array.from({ length: difficulty + 1 }, (_, i) => ), - [difficulty], + Array.from({ length: difficulty + 1 }, (_, i) => ( + + )), + [difficulty] ); - const backgroundColor = completed ? "bg-success-subtle" : ""; + const backgroundColor = completed + ? "bg-success-subtle" + : "bg-secondary-subtle"; function handleDelete() { if ( !window.confirm( - "Are you sure you want to delete the challenge '" + title + "'?", + "Are you sure you want to delete the challenge '" + title + "'?" ) ) { return; @@ -100,7 +116,12 @@ function ChallengeCard({ }); return ( - + {difficultyStars} {title} diff --git a/client/src/components/FloatingStats.tsx b/client/src/components/FloatingStats.tsx new file mode 100644 index 0000000..cf7da3d --- /dev/null +++ b/client/src/components/FloatingStats.tsx @@ -0,0 +1,106 @@ +import React from "react"; +import { Badge } from "react-bootstrap"; +import { FaTimes } from "react-icons/fa"; + +function FloatingStats({ + totalEasy, + totalMedium, + totalHard, + completedEasy, + completedMedium, + completedHard, +}) { + const totalChallenges = totalEasy + totalMedium + totalHard; + const completedChallenges = completedEasy + completedMedium + completedHard; + + return ( +
+
+
Stats
+ +
+ +
+
+ {completedChallenges} / {totalChallenges} +
+ Overall Completed +
+
+ +
+
+ Easy + + {completedEasy} / {totalEasy} + +
+
+ Medium + + {completedMedium} / {totalMedium} + +
+
+ Hard + + {completedHard} / {totalHard} + +
+
+
+
+ ); +} + +export default FloatingStats; diff --git a/client/src/pages/Challenge.tsx b/client/src/pages/Challenge.tsx index 6e7e556..0396c64 100644 --- a/client/src/pages/Challenge.tsx +++ b/client/src/pages/Challenge.tsx @@ -5,8 +5,7 @@ import { useEffect, useMemo, useState } from "react"; import { useParams } from "react-router-dom"; import { ChallengeDetails } from "../types/challengeDetails"; import { StarFill } from "react-bootstrap-icons"; -import InstructionsPopup from '../components/InstructionsPopup'; - +import InstructionsPopup from "../components/InstructionsPopup"; const Challenge = () => { const [details, setDetails] = useState(); @@ -15,8 +14,6 @@ const Challenge = () => { const [showInstructions, setShowInstructions] = useState(false); const [userRole, setUserRole] = useState(null); - - // Fetch user role useEffect(() => { fetch("/api/users/whoami") @@ -30,16 +27,18 @@ const Challenge = () => { setUserRole(data.role); }) .catch((err: Error) => { - console.error("Failed fetching the user role. Error message: " + err.message); + console.error( + "Failed fetching the user role. Error message: " + err.message + ); }); }, []); // Show instructions popup only once useEffect(() => { - const instructionsShown = localStorage.getItem('instructionsShown'); + const instructionsShown = localStorage.getItem("instructionsShown"); if (!instructionsShown) { setShowInstructions(true); - localStorage.setItem('instructionsShown', 'true'); + localStorage.setItem("instructionsShown", "true"); } }, []); @@ -57,24 +56,30 @@ const Challenge = () => { setIsLoading(false); }) .catch((err: Error) => { - console.error("Failed fetching the challenge number: " + id + "\nError message: " + err.message); + console.error( + "Failed fetching the challenge number: " + + id + + "\nError message: " + + err.message + ); }); }, [id]); // Generate stars based on difficulty const difficultyStars = useMemo( () => - details && details.difficulty >= 0 ? ( - Array.from({ length: details.difficulty + 1 }, (_, i) => ( - - )) - ) : null, - [details], + details && details.difficulty >= 0 + ? Array.from({ length: details.difficulty + 1 }, (_, i) => ( + + )) + : null, + [details] ); if (isLoading) return

Loading...

; if (details === undefined) return

Failed to load challenge details

; - if (details.hidden && userRole !== "admin") return

The challenge is hidden

; + if (details.hidden && userRole !== "admin") + return

The challenge is hidden

; return ( @@ -86,7 +91,9 @@ const Challenge = () => {

{details.outcome}

{difficultyStars}
{details.completed && ( - Completed + + Completed + )} @@ -99,11 +106,13 @@ const Challenge = () => {

Expected Functionality:

    - {Object.entries(details.expectedFunctionality).map(([key, value]) => ( -
  • - {key}: {value} -
  • - ))} + {Object.entries(details.expectedFunctionality).map( + ([key, value]) => ( +
  • + {key}: {value} +
  • + ) + )}
@@ -124,13 +133,18 @@ const Challenge = () => {

Key Design Patterns:

    {details.keyPatterns.map((pattern, index) => ( -
  • {pattern + (pattern.slice(-1) !== "." ? "." : "")}
  • +
  • + {pattern + (pattern.slice(-1) !== "." ? "." : "")} +
  • ))}
)} - setShowInstructions(false)} /> + setShowInstructions(false)} + />
); }; diff --git a/client/src/pages/Challenges.tsx b/client/src/pages/Challenges.tsx index f411950..5875036 100644 --- a/client/src/pages/Challenges.tsx +++ b/client/src/pages/Challenges.tsx @@ -1,5 +1,6 @@ import { useCallback, useEffect, useState } from "react"; import ChallengeCard from "../components/ChallengeCard"; +import FloatingStats from "../components/FloatingStats"; import { Container, Row, @@ -13,6 +14,8 @@ import { ChallengeDetailsShort } from "../types/ChallengeDetailsShort"; import { ChallengeDifficulties } from "../types/challengeDifficulties"; import { useQuery } from "../hooks/useQuery"; import useCheckRole from "../hooks/useCheckRole"; +import { FiBarChart2 } from "react-icons/fi"; +import { IoFilterSharp } from "react-icons/io5"; function Challenges() { const [challengesData, setChallengesData] = @@ -24,18 +27,41 @@ function Challenges() { const [selectedChallengeTypes, setSelectedChallengeTypes] = useState< string[] >([]); + const [showStats, setShowStats] = useState(false); // State to control the visibility of FloatingStats const { isAdmin } = useCheckRole(); const query = useQuery(); - + // truncate description to three line + function truncateDescription(description, maxLength = 140) { + // maxLength is an approximation of 3 lines based on font size and layout + if (description.length > maxLength) { + return description.substring(0, maxLength) + "..."; + } + return description; + } + const [activeFilters, setActiveFilters] = useState< + { type: string; label: string }[] + >([]); // Unified state for all active filters // Pattern categories const patternCategories = { Creational: ["Builder", "Simple Factory"], Structural: ["Adapter", "Decorator", "Facade"], Behavioral: ["Strategy", "Observer", "Iterator"], }; - const [extraPatterns, setExtraPatterns] = useState([]); // Extra patterns not in the known categories + const [extraPatterns, setExtraPatterns] = useState([]); + // Counters for each difficulty level + const [difficultyCounts, setDifficultyCounts] = useState({ + easy: 0, + medium: 0, + hard: 0, + }); + + const [completedCounts, setCompletedCounts] = useState({ + completedEasy: 0, + completedMedium: 0, + completedHard: 0, + }); // Fetch challenges from the server useEffect(() => { setIsLoading(true); @@ -74,6 +100,38 @@ function Challenges() { console.error("Failed fetching the challenges.", err.message); }); + // Calculate counts for each difficulty level + const easyCount = data.filter( + (challenge) => challenge.difficulty === 0 + ).length; + const mediumCount = data.filter( + (challenge) => challenge.difficulty === 1 + ).length; + const hardCount = data.filter( + (challenge) => challenge.difficulty === 2 + ).length; + setDifficultyCounts({ + easy: easyCount, + medium: mediumCount, + hard: hardCount, + }); + // Calculate completed challenges + const completedEasy = data.filter( + (challenge) => challenge.completed && challenge.difficulty === 0 + ).length; + const completedMedium = data.filter( + (challenge) => challenge.completed && challenge.difficulty === 1 + ).length; + const completedHard = data.filter( + (challenge) => challenge.completed && challenge.difficulty === 2 + ).length; + + setCompletedCounts({ + completedEasy, + completedMedium, + completedHard, + }); + // Extract challenge types from keyPatterns and categorize them const patternTypesSet = new Set(); const detectedExtraPatterns = new Set(); @@ -107,7 +165,6 @@ function Challenges() { }); }, [query]); - // Sort challengesData by difficulty useEffect(() => { if (challengesData != undefined) { const sortedChallengesData = handleSortByDifficulty(challengesData); @@ -137,7 +194,9 @@ function Challenges() { let row: JSX.Element[] = []; let i = 0; for (const challenge of challengesData) { - // Filter out challenges by type if none selected or if not in the selected list + if (!filter.includes(challenge.difficulty) && filter.length > 0) { + continue; + } if ( selectedChallengeTypes.length > 0 && challenge.keyPatterns && @@ -156,12 +215,10 @@ function Challenges() { continue; } - // Make sure the challenge is not filtered out by difficulty if (!filter.includes(challenge.difficulty) && filter.length > 0) { continue; } - // Filter out completed challenges if hideComplete is enabled if (hideComplete && challenge.completed) { continue; } @@ -172,7 +229,9 @@ function Challenges() { t !== type) ); + setActiveFilters((prev) => + prev.filter( + (filter) => + !(filter.type === "ChallengeType" && filter.label === type) + ) + ); } else { setSelectedChallengeTypes([...selectedChallengeTypes, type]); + setActiveFilters((prev) => [ + ...prev, + { type: "ChallengeType", label: type }, + ]); + } + } + + function clearAllFilters() { + setSortByDifficulty(false); + setFilter([]); + setSelectedChallengeTypes([]); + setActiveFilters([]); + } + + function removeFilter(type: string, label: string) { + if (type === "ChallengeType") { + setSelectedChallengeTypes((prev) => prev.filter((t) => t !== label)); + } + if (type === "Difficulty") { + const difficultyValue = Object.entries({ + Easy: 0, + Medium: 1, + Hard: 2, + }).find(([key]) => key === label)?.[1]; + setFilter((prev) => + prev.filter((d) => d !== (difficultyValue as ChallengeDifficulties)) + ); + } + if (type === "SortByDifficulty") { + setSortByDifficulty(false); } + setActiveFilters((prev) => + prev.filter((filter) => !(filter.type === type && filter.label === label)) + ); + } + + function toggleSortByDifficulty() { + const label = sortByDifficulty ? "Easier First" : "Harder First"; + + setSortByDifficulty(!sortByDifficulty); + setActiveFilters((prev) => { + if (prev.some((filter) => filter.type === "SortByDifficulty")) { + return prev.filter((filter) => filter.type !== "SortByDifficulty"); + } + return [...prev, { type: "SortByDifficulty", label }]; + }); } if (query.get("hidden") === "true" && !isAdmin) @@ -246,7 +356,8 @@ function Challenges() {
- + {/* Sorting and filtering controls (unchanged) */} +

{query.get("hidden") === "true" @@ -258,210 +369,353 @@ function Challenges() { ? "Challenges not accessible by regular users" : "Choose a challenge to start solving!"}

+
+ {activeFilters.map((filter, index) => ( + + {String(filter.label).trim()} + + ))} + {activeFilters.length > 0 && ( + + )} +
- {/* Flex container to keep all buttons in one row */}
- {/* Dropdown for sorting by difficulty */} - - - Sort by Difficulty - - - { - setSortByDifficulty(!sortByDifficulty); - }} - > - {sortByDifficulty ? "Easier First" : "Harder First"} - - - - - {" "} - {/* Adds 1rem space below the button */} - Filter by Challenge Type + Sort and Filter - {" "} - {/* Adds slight curve to edges */} - {/* Creational Patterns */} - - - Creational Patterns - - - {patternCategories.Creational.map((pattern) => ( - handleChallengeTypeSelect(pattern)} - style={{ marginLeft: "0.5rem" }} // Left margin for patterns - /> - ))} - - - {/* Structural Patterns */} - - - Structural Patterns - - - {patternCategories.Structural.map((pattern) => ( - handleChallengeTypeSelect(pattern)} - style={{ marginLeft: "0.5rem" }} // Left margin for patterns - /> - ))} - - - {/* Behavioral Patterns */} - - - Behavioral Patterns - - - {patternCategories.Behavioral.map((pattern) => ( - handleChallengeTypeSelect(pattern)} - style={{ marginLeft: "0.5rem" }} // Left margin for patterns - /> - ))} - - - {/* Extra Patterns */} - - - Extra Patterns - - + Sort by Difficulty + { + setSortByDifficulty(!sortByDifficulty); + }} + style={{ textAlign: "left" }} > - {extraPatterns.map((pattern) => ( - +
+ +
+ + {/* Filter by Challenge Type */} +
+ Filter by Challenge Type + {/* Creational Patterns */} + + + Creational Patterns + + + {patternCategories.Creational.map((pattern) => ( + + handleChallengeTypeSelect(pattern) + } + style={{ + marginLeft: "10px", + marginRight: "10px", + borderRadius: "4px", + }} + > + + handleChallengeTypeSelect(pattern) + } + /> + {pattern} + + ))} + + + + {/* Structural Patterns */} + + + Structural Patterns + + + {patternCategories.Structural.map((pattern) => ( + + handleChallengeTypeSelect(pattern) + } + style={{ + marginLeft: "10px", + marginRight: "10px", + textAlign: "left", + }} + > + + handleChallengeTypeSelect(pattern) + } + /> + {pattern} + + ))} + + + + {/* Behavioral Patterns */} + + + Behavioral Patterns + + + {patternCategories.Behavioral.map((pattern) => ( + + handleChallengeTypeSelect(pattern) + } + style={{ + marginLeft: "10px", + marginRight: "10px", + }} + > + + handleChallengeTypeSelect(pattern) + } + /> + {pattern} + + ))} + + + + {/* Extra Patterns */} + + + Extra Patterns + + + {extraPatterns.map((pattern) => ( + + handleChallengeTypeSelect(pattern) + } + style={{ + marginLeft: "10px", + marginRight: "10px", + }} + > + + handleChallengeTypeSelect(pattern) + } + /> + {pattern} + + ))} + + +
+ +
+ + {/* Filter by Difficulty */} +
+ Filter by Difficulty + {Object.entries({ + 0: "Easy", + 1: "Medium", + 2: "Hard", + }).map(([key, label]) => ( + + handleChallengeTypeSelect(pattern)} - style={{ marginLeft: "0.5rem" }} // Left margin for patterns + checked={filter.includes(parseInt(key))} + onChange={() => + handleFilter( + parseInt(key) as ChallengeDifficulties + ) + } + style={{ + border: "2px solid #000", + width: "16px", + height: "16px", + marginRight: "10px", + }} /> - ))} - - - - + {label} + + ))} +
- {/* Dropdown for filtering by difficulty */} - - - Filter by Difficulty - - -
- Difficulty - { - handleFilter(ChallengeDifficulties.EASY); - }} - /> - { - handleFilter(ChallengeDifficulties.MEDIUM); - }} - /> - { - handleFilter(ChallengeDifficulties.HARD); +
+
+ Show Completed + setHideComplete(!hideComplete)} + style={{ + display: "flex", + alignItems: "center", + gap: "8px", }} /> - +
- - {/* Button for hiding/showing completed challenges */} -
{makeGrid()}
+ + {/* Floating Stats Toggle Button */} + + + {/* Floating Stats Widget */} + {showStats && ( + + )}
); } diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx index 5bd4a65..58c3674 100644 --- a/client/src/pages/Home.tsx +++ b/client/src/pages/Home.tsx @@ -55,8 +55,8 @@ function Home() { return (
{/* Recent Solutions */} - -

Recent Solutions

+ +

Recent Solutions

{solutions.map((solution) => ( @@ -73,18 +73,22 @@ function Home() { See More
- +
{/* Divider between sections */} {/* Suggested Challenges */} - + -

Suggested Challenges

- +

Suggested Challenges

+ See More
diff --git a/package-lock.json b/package-lock.json index 260ca6d..63b63cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-flow-renderer": "^10.3.17", + "react-icons": "^5.3.0", "react-markdown": "^9.0.1", "react-router-dom": "^6.22.3", "react-split": "^2.0.14", @@ -3586,8 +3587,7 @@ "node_modules/dom-to-image": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", - "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==", - "license": "MIT" + "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==" }, "node_modules/dotenv": { "version": "16.4.5", @@ -6902,6 +6902,15 @@ "react-dom": "16 || 17 || 18" } }, + "node_modules/react-icons": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/package.json b/package.json index 4faeb0c..01614b3 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ "author": "", "license": "ISC", "dependencies": { - "axios": "^1.7.7", "@langchain/community": "^0.3.12", "@langchain/openai": "^0.0.23", "@reactflow/node-resizer": "^2.2.14", + "axios": "^1.7.7", "body-parser": "^1.20.2", "browser-image-compression": "^2.0.2", "dayjs": "^1.11.11", @@ -29,6 +29,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-flow-renderer": "^10.3.17", + "react-icons": "^5.3.0", "react-markdown": "^9.0.1", "react-router-dom": "^6.22.3", "react-split": "^2.0.14",