From 8a8622f629f5edb9fdd0acd0bc0f1367c21a7138 Mon Sep 17 00:00:00 2001 From: aaronhans Date: Sat, 16 May 2026 22:20:18 -0700 Subject: [PATCH] update css from components --- public/css/scangov.css | 1641 ++++++++++++++++++++++++++++++++------- public/css/style.css | 25 - scripts/bundle.css | 1647 +++++++++++++++++++++++++++++++++------- 3 files changed, 2761 insertions(+), 552 deletions(-) diff --git a/public/css/scangov.css b/public/css/scangov.css index 58e49ac4..08cdba0f 100644 --- a/public/css/scangov.css +++ b/public/css/scangov.css @@ -1,98 +1,1127 @@ /* This file is maintaned in https://github.com/ScanGov/components and copied to multiple projects during startup */ -/* Root */ +/* Fonts */ -:root, [data-bs-theme=dark], [data-bs-theme=light] { +@font-face { + font-family: "Public Sans ExtraBold"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-ExtraBold.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Bold"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Bold.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Regular"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Light"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Light.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Thin"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Thin.ttf") format("truetype"); +} + +@font-face { + font-family: "JetBrains Mono Medium"; + src: url("/assets/fonts/jetbrains-mono/JetBrainsMono-Medium.ttf") format("truetype"); +} + +@font-face { + font-family: "JetBrains Mono ExtraBold"; + src: url("/assets/fonts/jetbrains-mono/JetBrainsMono-ExtraBold.ttf") format("truetype"); +} + +/* Dark mode (default) */ + +:root, [data-bs-theme=dark] { + color-scheme: dark; + --bs-primary: #70e17b; + --bs-primary-rgb: 112, 225, 123; + --bs-primary-text: #13171f; --bs-body-color: #fff; --bs-body-color-rgb: 255, 255, 255; --bs-body-bg: #13171f; --bs-body-bg-rgb: 19, 23, 31; - --scangov-green: #70e17b; - --scangov-green-rgb: 112, 225, 123; - --bs-link-color: var(--scangov-green); - --bs-link-color-rgb: var(--scangov-green-rgb); - --bs-success-rgb: var(--scangov-green-rgb); + --bs-body-secondary-bg: #0f1218; + --bs-link-color: #70e17b; + --bs-link-color-rgb: 112, 225, 123; --bs-link-hover-color: var(--bs-link-color); --bs-link-hover-color-rgb: 112, 225, 123; - --bs-selection-bg: var(--bs-link-color); - --bs-selection-color: var(--bs-body-bg); + --bs-link-hover-decoration: none; + --bs-highlight-bg: var(--bs-primary); + --bs-highlight-color: var(--bs-primary-text); + --bs-selection-bg: var(--bs-primary); + --bs-selection-color: var(--bs-primary-text); + --bs-btn-primary: var(--bs-primary); + --bs-btn-primary-color: var(--bs-primary-text); + --bs-btn-primary-border-color: var(--bs-primary); + --bs-btn-primary-focus-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-color: var(--bs-primary-text); + --bs-btn-primary-active-bg: var(--bs-primary); + --bs-btn-primary-bg: var(--bs-primary); + --bs-btn-bg: var(--bs-primary); + --bs-btn-border-color: var(--bs-primary); + --bs-btn-color: var(--bs-primary-text); + --bs-btn-hover-bg: var(--bs-primary); + --bs-btn-hover-border-color: var(--bs-primary); + --bs-btn-hover-color: var(--bs-primary-text); + --bs-nav-link-color: var(--bs-body-color); + --bs-nav-link-hover-color: var(--bs-link-color); + --bs-border-color: #252f3e; + --bs-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.1); + --bs-card-shadow: var(--bs-shadow); + --bs-box-shadow: var(--bs-shadow); + --bs-box-shadow-md: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.5); + --bs-secondary: var(--bs-body-color); + --bs-text-secondary: var(--bs-secondary); + --bs-badge-bg: var(--bs-primary); + --bs-badge-font-weight: 300; + --bs-border-radius-sm: .25rem; + /* WCAG 2.2 AA: #face00 on #13171f = 11.87:1 ✓ */ + --bs-text-bg-primary: #face00; + --bs-info-text-emphasis: var(--bs-body-color); + --bs-info-bg-subtle: var(--bs-body-secondary-bg); + --bs-info-border-subtle: var(--bs-border-color); + --bs-text-muted: var(--bs-body-color); --bs-font-monospace: "JetBrains Mono Medium", monospace; --bs-font-light: "Public Sans Light", sans-serif; --bs-font-bold: "Public Sans Bold", sans-serif; --bs-font-regular: "Public Sans Regular", sans-serif; - --bs-font-serif: "Merriweather Light", sans-serif; - --bs-font-thin: "Public Sans Thin", sans-serif; - --bs-font-extra-bold: "Public Sans ExtraBold", sans-serif; --bs-font-sans-serif: "Public Sans Regular", sans-serif; + --bs-text-opacity: .5; + --bs-emphasis-color: var(--bs-body-color); + --bs-form-control-color: var(--bs-body-color); + --bs-form-control-bg: var(--bs-body-bg); + --bs-form-control-border-color: var(--bs-border-color); + --bs-form-control-focus-border-color: var(--bs-primary); + --bs-form-control-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + --bs-form-control-focus-color: var(--bs-body-color); + --bs-card-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + /* Status colors */ + --bs-bg-success: #70e17b; + --bs-bg-success-rgb: 112, 225, 123; + --bs-border-success: #70e17b; + --bs-text-warning: #000000; + --bs-bg-warning: #face00; + --bs-bg-warning-rgb: 250, 206, 0; + --bs-border-warning: #face00; + --bs-text-danger: #ffffff; + --bs-bg-danger: #e41d3d; + --bs-bg-danger-rgb: 228, 29, 61; + --bs-border-danger: #e41d3d; +} + +/* Light mode */ + +[data-bs-theme=light] { + color-scheme: light; + --bs-primary: #70e17b; + --bs-primary-rgb: 112, 225, 123; + --bs-primary-text: #13171f; + --bs-body-color: #13171f; + --bs-body-color-rgb: 19, 23, 31; + --bs-body-bg: #ffffff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-body-secondary-bg: #f4f6f9; + /* WCAG 2.2 AA: #2563eb on #fff = 4.66:1 ✓ */ + --bs-link-color: #2563eb; + --bs-link-color-rgb: 37, 99, 235; + --bs-link-hover-color: var(--bs-link-color); + --bs-link-hover-color-rgb: 37, 99, 235; + --bs-link-hover-decoration: none; + --bs-highlight-bg: var(--bs-primary); + --bs-highlight-color: var(--bs-primary-text); + --bs-selection-bg: var(--bs-primary); + --bs-selection-color: var(--bs-primary-text); + --bs-btn-primary: var(--bs-primary); + --bs-btn-primary-color: var(--bs-primary-text); + --bs-btn-primary-border-color: var(--bs-primary); + --bs-btn-primary-focus-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-color: var(--bs-primary-text); + --bs-btn-primary-active-bg: var(--bs-primary); + --bs-btn-primary-bg: var(--bs-primary); + --bs-btn-bg: var(--bs-primary); + --bs-btn-border-color: var(--bs-primary); + --bs-btn-color: var(--bs-primary-text); + --bs-btn-hover-bg: var(--bs-primary); + --bs-btn-hover-border-color: var(--bs-primary); + --bs-btn-hover-color: var(--bs-primary-text); + --bs-nav-link-color: var(--bs-body-color); + --bs-nav-link-hover-color: var(--bs-link-color); + --bs-border-color: #d5dce8; + --bs-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.06); + --bs-card-shadow: var(--bs-shadow); + --bs-box-shadow: var(--bs-shadow); + --bs-box-shadow-md: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.15); + --bs-secondary: var(--bs-body-color); + --bs-text-secondary: var(--bs-secondary); + --bs-badge-bg: var(--bs-primary); + --bs-badge-font-weight: 300; + --bs-border-radius-sm: .25rem; + /* WCAG 2.2 AA: #8a6500 on #fff = 5.33:1 ✓ */ + --bs-text-bg-primary: #8a6500; + --bs-info-text-emphasis: var(--bs-body-color); + --bs-info-bg-subtle: var(--bs-body-secondary-bg); + --bs-info-border-subtle: var(--bs-border-color); + /* WCAG 2.2 AA: #4a5568 on #fff = 7.53:1 ✓ */ + --bs-text-muted: #4a5568; + --bs-text-opacity: .5; + --bs-emphasis-color: var(--bs-body-color); + --bs-form-control-color: var(--bs-body-color); + --bs-form-control-bg: var(--bs-body-bg); + --bs-form-control-border-color: var(--bs-border-color); + --bs-form-control-focus-border-color: var(--bs-primary); + --bs-form-control-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + --bs-form-control-focus-color: var(--bs-body-color); + --bs-card-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + /* font vars, status colors inherited from :root */ +} + +/* Status badge overrides */ + +/* WCAG 2.2 AA: #13171f on #70e17b = 8.19:1 ✓ */ +.text-bg-success { + color: #13171f !important; + background-color: #70e17b !important; +} + +/* WCAG 2.2 AA: #000 on #face00 = 15.18:1 ✓ */ +.text-bg-warning { + color: #000000 !important; + background-color: #face00 !important; +} + +/* WCAG 2.2 AA: #fff on #e41d3d = 4.73:1 ✓ */ +.text-bg-danger { + color: #ffffff !important; + background-color: #e41d3d !important; +} + +.text-bg-primary { + background-color: var(--bs-text-bg-primary) !important; + color: var(--bs-body-bg) !important; +} + +/* Theme-dependent: logo/image invert */ + +:root body footer img, +:root body ul.navbar-nav img, +[data-bs-theme=dark] body footer img, +[data-bs-theme=dark] body ul.navbar-nav img { + filter: invert(1); +} + +[data-bs-theme=light] body footer img, +[data-bs-theme=light] body ul.navbar-nav img { + filter: none; +} + +/* Theme-dependent: navbar toggler icon */ + +[data-bs-theme="light"] .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%2819, 23, 31, 1%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 { + --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, 1%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +/* Theme-dependent: text-secondary */ + +.text-secondary { + color: rgba(19, 23, 31, var(--bs-text-opacity)) !important; +} + +[data-bs-theme=dark] .text-secondary { + color: rgba(255, 255, 255, var(--bs-text-opacity)) !important; +} + +/* General */ + +blockquote { + padding: 1rem 1rem .5rem 1rem; + margin: 1rem 0 1rem 1.5rem; + border-left: 0.25rem solid var(--bs-border-color); +} + +.text-muted { + color: var(--bs-body-color) !important; +} + +body { + color: var(--bs-body-color); + background-color: var(--bs-body-bg) !important; + font-family: var(--bs-font-sans-serif); + line-height: 1.5; +} + +strong { + font-family: var(--bs-font-bold); +} + +.navbar-brand, +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6, +.display-1, .display-2, .display-3, .display-4 { + font-family: var(--bs-font-bold); + letter-spacing: -.01rem; +} + +body.docs h2, +body.page h2, +body.docs h3, +body.page h3 { + margin-bottom: 1rem; + margin-top: 3rem; +} + +/* Lead */ + +.lead { + font-family: var(--bs-font-regular) !important; + font-size: 1.25rem; + font-weight: 300; + color: var(--bs-body-color); +} + +/* Selection */ + +::selection { + background-color: var(--bs-selection-bg); + color: var(--bs-selection-color); +} + +/* Accessibility */ + +/* Focus indicators (WCAG 2.4.7, 2.4.11) */ +:focus-visible { + outline: 3px solid var(--bs-link-color); + outline-offset: 2px; + border-radius: 2px; +} + +/* Remove outline on mouse/touch click, keep for keyboard (WCAG 2.4.7) */ +:focus:not(:focus-visible) { + outline: none; +} + +/* Minimum touch target size (WCAG 2.5.8) — exclude card children to avoid layout shift */ +a:not(.card):not(.card *):not(.stretched-link), +button:not(.card *) { + min-height: 24px; + min-width: 24px; +} + +/* Reduced motion (WCAG 2.3.3) */ +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +/* High contrast mode (WCAG 1.4.11) */ +@media (forced-colors: active) { + * { + forced-color-adjust: auto; + } +} + +/* Skip link — visible on focus for keyboard users (WCAG 2.4.1) */ +.skip-link { + position: absolute; + top: -100%; + left: 0; +} + +.skip-link:focus { + top: 0; +} + +/* Navbar */ + +#logo { + max-width: 35px; + width: 100%; + height: 100%; +} + +.navbar { + box-shadow: var(--bs-shadow); + transition: box-shadow 0.25s ease; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-font-size: 1.1em; +} + +.navbar-brand { + font-family: var(--bs-font-bold); + color: var(--bs-body-color) !important; +} + +.navbar-brand>svg { + fill: var(--bs-body-color) !important; +} + +.navbar-brand:hover { + color: var(--bs-link-color) !important; +} + +.navbar-brand:hover>svg { + fill: var(--bs-link-color) !important; +} + +.navbar-toggler-icon { + color: var(--bs-body-color) !important; +} + +.navbar-nav, +.navbar-nav .nav-link:not(.active), +a.list-group-item { + color: var(--bs-body-color) !important; + font-family: "Public Sans Regular", sans-serif !important; +} + +.nav-link { + font-family: "Public Sans Regular", sans-serif !important; +} + +.navbar-nav .nav-link:not(.active):hover, +a.list-group-item:hover { + color: var(--bs-link-color) !important; +} + +a.list-group-item:hover { + background-color: var(--bs-body-secondary-bg); +} + +.border-end { + box-shadow: var(--bs-shadow); +} + +/* Social links */ + +.social a, .social a:visited { + color: var(--bs-body-color); + display: inline-block; + margin-right: .75rem; +} + +.social a:hover { + color: var(--bs-link-color); +} + +/* External link icon (post content only) */ + +.post-content a[href^="http"]:not([href^="https://scangov.org"]):not([href^="https://standards.scangov.org"]):not([href^="https://scangov.com"]):not([href^="https://data.scangov.org"]):not([href^="http://localhost:4000/"]):not([href^="https://docs.scangov.org"])::after { + content: "\f35d"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-left: 5px; + font-size: 0.8em; + display: inline-block; +} + +.social a[href^="http"]:not([href^="https://scangov.org"]):not([href^="https://scangov.com"]):not([href^="http://localhost:4000/"]):not([href^="https://docs.scangov.org"])::after { + display: none !important; +} + +/* Breadcrumb */ + +.breadcrumb-item a, .breadcrumb-item a:visited { + color: var(--bs-link-color); + font-family: var(--bs-font-bold); + text-decoration: none; +} + +/* Links / Buttons */ + +a:hover { + text-decoration: var(--bs-link-hover-decoration); + color: var(--bs-link-hover-color); +} + +a.btn-primary, a.btn-primary:visited, .btn-primary { + background-color: var(--bs-primary) !important; + color: var(--bs-primary-text) !important; + border-radius: var(--bs-border-radius); + border: 1px solid var(--bs-primary) !important; + box-shadow: var(--bs-shadow); + cursor: pointer; + font-family: var(--bs-font-bold); + padding: .55rem; + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +a.btn-primary-outline { + background-color: var(--bs-body-bg); + color: var(--bs-body-color); + border-radius: var(--bs-border-radius-sm); + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + cursor: pointer; + font-family: var(--bs-font-sans-serif); + padding: .55rem; + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +a.btn-primary:hover, a.btn-primary:focus, +input[type="submit"].btn-primary:hover, input[type="submit"].btn-primary:focus { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + background-color: var(--bs-primary) !important; + color: var(--bs-primary-text) !important; + border: 1px solid var(--bs-primary) !important; +} + +a.btn-primary-outline:not(.active):hover, .btn-primary-outline:not(.active):hover, +a.btn-primary-outline:not(.active):focus { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + border: 1px solid var(--bs-border-color); +} + +.feedback { + opacity: 0; + pointer-events: none; + visibility: hidden; + background-color: var(--bs-primary); + color: var(--bs-primary-text) !important; + border-radius: var(--bs-border-radius); + border: 1px solid var(--bs-primary); + box-shadow: var(--bs-shadow); + cursor: pointer; + font-family: var(--bs-font-bold); + padding: .55rem; + position: fixed; + bottom: 2rem; + right: 2rem; + z-index: 1000; + text-decoration: none; + transition: opacity 0.25s ease, visibility 0.25s ease, filter 0.25s ease, box-shadow 0.25s ease; +} + +.feedback.is-visible { + opacity: 1; + pointer-events: auto; + visibility: visible; +} + +.feedback svg, a.btn svg { + transition: filter 0.25s ease; +} + +.feedback:hover, .feedback:focus, +a.btn:hover, a.btn:focus, +.btn-primary:hover, .btn-primary:focus { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + background-color: var(--bs-primary) !important; + color: var(--bs-primary-text) !important; + border-color: var(--bs-primary) !important; +} + +/* js-triggered Bootstrap classes */ +.btn-check:checked+.btn, +.btn.active:not(.nav-link), +.btn.show, +.btn:first-child:active, +:not(.btn-check)+.btn:active { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} + +/* Nav pills */ + +.nav-pills { + --bs-nav-pills-link-active-bg: var(--bs-primary); + --bs-nav-link-hover-border-color: #1a2130; +} + +[data-bs-theme=light] .nav-pills { + --bs-nav-link-hover-border-color: #b0bac8; +} + +.nav-pills .nav-link svg { + flex-shrink: 0; + width: 1em; + height: 1em; +} + +.nav-pills .nav-link { + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + font-family: "Public Sans Regular", sans-serif !important; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + transition: filter 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + margin-top: 0.35rem; + margin-bottom: 0.35rem; + display: inline-flex !important; + align-items: center; + width: auto; + flex-shrink: 0; +} + +.nav-pills .nav-link:not(.active):hover, +.nav-pills a.btn-primary-outline:not(.active):hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + border: 1px solid var(--bs-nav-link-hover-border-color); +} + +/* Nav pills active — #13171f on #70e17b = 8.19:1 ✓ (both themes) */ +.nav-pills .nav-link.active, +.nav-pills .nav-link.active:focus, +.nav-pills a.btn-primary-outline.active, +.nav-pills a.btn-primary-outline.active:focus, +[data-bs-theme=light] .nav-pills .nav-link.active, +[data-bs-theme=light] .nav-pills .nav-link.active:focus, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active:focus { + background-color: #70e17b !important; + color: #13171f !important; + border-color: #70e17b !important; + box-shadow: var(--bs-shadow); +} + +.nav-pills .nav-link.active:hover, +.nav-pills a.btn-primary-outline.active:hover, +[data-bs-theme=light] .nav-pills .nav-link.active:hover, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active:hover { + background-color: #70e17b !important; + color: #13171f !important; + border-color: #70e17b !important; + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +.nav-pills .nav-link.active i, +.nav-pills .nav-link.active svg, +.nav-pills a.btn-primary-outline.active i, +.nav-pills a.btn-primary-outline.active svg, +[data-bs-theme=light] .nav-pills .nav-link.active i, +[data-bs-theme=light] .nav-pills .nav-link.active svg, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active i, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active svg { + color: #13171f !important; +} + +.nav-pills .active { + --bs-link-color: var(--bs-body-bg); +} + +/* Pagination */ + +.active>.page-link, .page-link.active { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} + +/* Dropdown */ + +.dropdown-toggle::after { + display: none; +} + +.dropdown-toggle svg { + color: var(--bs-btn-color) !important; + transition: 0.15s color; +} + +.dropdown-toggle:hover svg, +.dropdown-toggle:focus svg { + color: var(--bs-btn-hover-color) !important; +} + +.dropdown-menu.show { + display: block; +} + +/* Badge */ + +.badge { + font-family: "Public Sans Regular", sans-serif !important; + padding: .55rem !important; + font-size: .8rem !important; + font-weight: 300; + border-radius: var(--bs-border-radius-sm) !important; +} + +.badge-primary:hover { + background-color: #fee685 !important; + /* WCAG 2.2 AA: #13171f on #fee685 = 14.42:1 ✓ */ + color: #13171f !important; +} + +/* Cards */ + +.card { + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + width: 100%; + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +.card:focus, +.card:focus-within { + box-shadow: var(--bs-card-focus-box-shadow); +} + +a.card { + text-decoration: none; +} + +.card:not(.text-bg-success):not(.text-bg-warning):not(.text-bg-danger):hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +.card-header>a, +.card-header>a>svg { + color: inherit !important; +} + +.card-hover { + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +.card-hover:hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +/* Status cards — consistent across themes */ + +.text-bg-success.card { + border-color: #70e17b !important; +} + +.text-bg-warning.card { + border-color: #face00 !important; +} + +.text-bg-danger.card { + border-color: #e41d3d !important; +} + +.text-bg-success.card:hover, +.text-bg-warning.card:hover, +.text-bg-danger.card:hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +/* Icons and links inside status cards match card text color */ +.card.text-bg-success i, .card.text-bg-success svg, +.card.text-bg-success a, .card.text-bg-success a:visited, .card.text-bg-success a:hover, +.card.text-bg-warning i, .card.text-bg-warning svg, +.card.text-bg-warning a, .card.text-bg-warning a:visited, .card.text-bg-warning a:hover { + color: #13171f !important; + fill: #13171f !important; +} + +.card.text-bg-danger i, .card.text-bg-danger svg, +.card.text-bg-danger a, .card.text-bg-danger a:visited, .card.text-bg-danger a:hover { + color: #ffffff !important; + fill: #ffffff !important; +} + +.text-bg-success .card-header, +.text-bg-warning .card-header, +.text-bg-danger .card-header { + background-color: rgba(255, 255, 255, 0.15) !important; + border-bottom: 1px solid rgba(255, 255, 255, 0.2) !important; + padding: 0.75rem 1rem; + font-family: var(--bs-font-regular); + --bs-card-cap-bg: rgba(255, 255, 255, 0.15); +} + +.text-bg-success .card-body, +.text-bg-warning .card-body, +.text-bg-danger .card-body { + padding: 1rem; +} + +/* Forms */ + +.form-control { + color: var(--bs-body-color) !important; + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +.form-control:hover { + filter: brightness(1.05); + box-shadow: var(--bs-box-shadow-md); +} + +.form-control:focus { + border-color: var(--bs-primary); + box-shadow: var(--bs-form-control-focus-box-shadow); + filter: none; +} + +::placeholder, ::-ms-input-placeholder { + color: var(--bs-body-color); + opacity: var(--bs-text-opacity); +} + +input[type="submit"] { + min-width: 80px; +} + +/* SVG */ + +svg { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -.125em; + margin: 0 .3rem; + flex-shrink: 0; + width: 1em; +} + +svg.sizeicon-xl { + height: 1.5em; + max-width: 1.5em; + line-height: .04167em; +} + +table td svg { + margin: 0; +} + +/* FA size classes override the default 1em height */ +.fa-2xs svg { + height: 0.625em; +} + +.fa-xs svg { + height: 0.75em; +} + +.fa-sm svg { + height: 0.875em; +} + +.fa-lg svg { + height: 1.25em; +} + +.fa-xl svg { + height: 1.5em; +} + +.fa-2xl svg { + height: 2em; +} + +.fa-2x svg { + height: 2em; +} + +.fa-3x svg { + height: 3em; +} + +.fa-4x svg { + height: 4em; +} + +.fa-5x svg { + height: 5em; +} + +.fa-6x svg { + height: 6em; +} + +.fa-7x svg { + height: 7em; +} + +.fa-8x svg { + height: 8em; +} + +.fa-9x svg { + height: 9em; +} + +.fa-10x svg { + height: 10em; +} + +svg.fa-circle-check { + fill: var(--bs-success); +} + +svg.fa-circle-xmark { + fill: var(--bs-danger); +} + +svg.fa-circle-exclamation { + fill: var(--bs-warning); +} + +svg.fa-circle-right { + fill: var(--bs-info); +} + +/* Images */ + +main#home img { + display: block; + margin: auto; + margin-bottom: 0.5rem; +} + +/* Accessibility utilities */ + +.fa-sr-only, .fa-sr-only-focusable:not(:focus), .sr-only, .sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.d-none { + display: none; +} + +.biggest { + width: 50%; +} + +/* Timeline */ + +.timeline { + border-left: 1px solid hsl(0, 0%, 90%); + position: relative; + list-style: none; +} + +.timeline .timeline-item { + position: relative; +} + +.timeline .timeline-item:after { + position: absolute; + display: block; + top: 0; + background-color: hsl(0, 0%, 90%); + left: -38px; + border-radius: 50%; + height: 11px; + width: 11px; + content: ''; +} + +.timeline-domain { + margin-bottom: 0.25rem; +} + +.timeline-date { + font-family: var(--bs-font-bold); +} + +/* Anchor links */ + +h2 a#heading-hashtag, +h3 a#heading-hashtag { + display: none; +} + +h2:hover a#heading-hashtag, +h3:hover a#heading-hashtag { + display: revert; +} + +/* iframe */ + +iframe { + border: 1px solid var(--bs-border-color) !important; +} + +/* News posts */ + +.post-content h2 { + margin-top: 2.75rem; +} + +.post-content ul, .post-content p { + margin-bottom: 1.75rem; +} + +/* Autocomplete search */ + +.awesomplete [hidden] { + display: none; +} + +.awesomplete .visually-hidden { + position: absolute; + clip: rect(0, 0, 0, 0); } -/* General */ +.awesomplete { + display: block; + position: relative; +} -body { +.awesomplete>input { + display: block; +} + +.awesomplete>ul { + position: absolute; + left: 0; + z-index: 1; + min-width: 100%; + box-sizing: border-box; + list-style: none; + padding: 0; + margin: 0.2em 0 0; color: var(--bs-body-color); - background: var(--bs-body-bg); background-color: var(--bs-body-bg); - font-family: var(--bs-font-sans-serif); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + box-shadow: 0.05em 0.2em 0.6em rgba(0, 0, 0, 0.2); + text-shadow: none; } -strong { - font-family: var(--bs-font-bold); +.awesomplete>ul:empty { + display: none; } -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6, -.display-1, -.display-2, -.display-3, -.display-4 { - font-family: var(--bs-font-bold); +@supports (transform: scale(0)) { + .awesomplete>ul { + transition: 0.3s cubic-bezier(0.4, 0.2, 0.5, 1.4); + } + + .awesomplete>ul[hidden], + .awesomplete>ul:empty { + opacity: 0; + transform: scale(0); + display: block; + visibility: hidden; + transition-timing-function: ease; + } } -.text-bg-success { - color: #000 !important; +.awesomplete>ul>li { + position: relative; + padding: 0.7em 1em; + cursor: pointer; } -/* Selection */ +.awesomplete>ul>li:hover { + background: hsl(200, 40%, 80%); + color: black; +} -::selection { - background-color: var(--bs-selection-bg); - color: var(--bs-selection-color); +.awesomplete>ul>li[aria-selected='true'] { + background: hsl(205, 40%, 40%); + color: white; } -/* Navbar */ +.awesomplete mark { + background: hsl(65, 100%, 50%); +} -#logo { - max-width: 35px; - width: 100%; - height: 100%; +.awesomplete li:hover mark { + background: hsl(68, 100%, 41%); } -/* Breadcrumb */ +.awesomplete li[aria-selected='true'] mark { + background: hsl(86, 100%, 21%); + color: inherit; +} -.breadcrumb-item a, .breadcrumb-item a:visited { - color: var(--bs-link-color); - font-family: var(--bs-font-bold); - text-decoration: none; +/* File types */ + +a[href$=".doc"]::after, +a[href$=".docx"]::after, +a[href$=".ppt"]::after, +a[href$=".pptx"]::after, +a[href$=".xls"]::after, +a[href$=".xlsx"]::after, +a[href$=".pdf"]::after, +a[href$=".mp3"]::after, +a[href$=".mp4"]::after, +a[href$=".avi"]::after, +a[href$=".mpg"]::after, +a[href$=".mpeg"]::after, +a[href$=".mov"]::after, +a[href$=".wmv"]::after, +a[href$=".mkv"]::after, +a[href$=".jpg"]::after, +a[href$=".jpeg"]::after, +a[href$=".png"]::after, +a[href$=".gif"]::after { + content: ""; + display: inline-block; + width: 1em; + height: 1em; + margin-left: 0.5rem; + background-size: contain; + background-repeat: no-repeat; +} + +a[href$=".doc"]::after, +a[href$=".docx"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-word.svg); } -/* Icons */ +a[href$=".ppt"]::after, +a[href$=".pptx"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-powerpoint.svg); +} + +a[href$=".xls"]::after, +a[href$=".xlsx"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-excel.svg); +} -/* Brands */ +a[href$=".pdf"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-pdf.svg); +} -.fa-bluesky { - color: #96abee !important; +a[href$=".mp3"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-audio.svg); +} + +a[href$=".mp4"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-video.svg); } +/* Icons — dark mode (vibrant pastels on dark bg) */ + .fa-github { color: #96abee !important; } @@ -105,20 +1134,22 @@ h6, color: #c3ebfa !important; } -.fa-mastodon { - color: #f8b9c5 !important; -} - .fa-youtube { color: #fd8ba0 !important; } -/* General */ - -.fa-rotate, .fa-arrows-rotate { +.fa-arrows-rotate { color: #c5ee93 !important; } +.fa-arrow-right-to-bracket { + color: #70e17b !important; +} + +.fa-bars-progress { + color: #ffbc78; +} + .fa-bell { color: #29e1cb !important; } @@ -131,10 +1162,6 @@ h6, color: #face00 !important; } -.fa-book-open-reader { - color: #c3ebfa !important; -} - .fa-brain { color: #fdb8ae !important; } @@ -155,55 +1182,29 @@ h6, color: #ffbe2e !important; } -.fa-check { - color: #e7f434 !important; -} - .fa-check-to-slot { color: #ffb4cf !important; } -.fa-circle { - color: #97d4ea !important; -} - .fa-circle-check { color: #70e17b !important; } -.fa-circle-exclamation { - color: #f8b9c5 !important; -} - -.fa-circle-plus { - color: #70e17b !important; -} - -.fa-circle-dot { - color: #f3bf90 !important; -} - -.fa-circle-down { - color: #e41d3d !important; -} - .fa-circle-nodes { color: #c3ebfa; } -.fa-circle-up { - color: #21c834 !important; +.fa-circle-notch { + color: #e6e6e6 !important; } -/* -.fa-circle-info { - color: #b8d293 !important; +.fa-circle-question { + color: #97d4ea; } -.fa-circle-question { - color: #97d4ea !important; +.fa-circle-info { + color: #b8d293 !important; } -*/ .fa-code { color: #bbc8f5 !important; @@ -213,10 +1214,6 @@ h6, color: #c5c5f3 !important; } -.fa-comments { - color: #c5c5f3 !important; -} - .fa-crown { color: #ffe396 !important; } @@ -229,10 +1226,6 @@ h6, color: #7efbe1 !important; } -.fa-dolly { - color: #f5fbc1 !important; -} - .fa-envelope-open-text { color: #7efbe1 !important; } @@ -253,26 +1246,10 @@ h6, color: #a8f2ff; } -.fa-file-contract { - color: #fee685; -} - -.fa-file-pdf { - color: #F8B9C5; -} - .fa-filter { color: #cbc4f2; } -.fa-filter-circle-xmark { - color: #f8b9c5; -} - -.fa-fire { - color: #ffbc78 !important; -} - .fa-flag { color: #f45d79; } @@ -293,7 +1270,11 @@ h6, color: #c7efe2; } -.fa-hand, .fa-hands, .fa-hands-clapping, .fa-handshake-simple, .fa-handshake-angle, .fa-hand-peace, .fa-hand-pointer, .fa-hand-point-up, .fa-hand-point-down, .fa-hand-point-right, .fa-hand-point-left { +.fa-hand, .fa-hands, .fa-hands-clapping, +.fa-handshake-simple, .fa-handshake-angle, +.fa-hand-peace, .fa-hand-pointer, +.fa-hand-point-up, .fa-hand-point-down, +.fa-hand-point-right, .fa-hand-point-left { color: #face00; } @@ -305,14 +1286,14 @@ h6, color: #ff8d7b; } -.fa-highlighter { - color: #e7f434; -} - .fa-house { color: #f4b2ff; } +.fa-key { + color: #f8b9c5; +} + .fa-laptop { color: #9bd4cf; } @@ -325,10 +1306,6 @@ h6, color: #ffe396; } -.fa-key { - color: #f8b9c5; -} - .fa-link { color: #7efbe1; } @@ -357,14 +1334,6 @@ h6, color: #a8f2ff; } -.fa-plug-circle-bolt { - color: #fff5c2; -} - -.fa-puzzle-piece { - color: #98D035; -} - .fa-ranking-star { color: #83fcd4; } @@ -378,7 +1347,7 @@ h6, } .fa-robot { - color: #e7f434; + color: #e6e6e6; } .fa-rocket { @@ -393,14 +1362,14 @@ h6, color: #c3ebfa !important; } -.fa-scroll { - color: #fee685 !important; -} - .fa-scale-balanced { color: #e6c74c; } +.fa-scroll { + color: #fee685 !important; +} + .fa-seedling { color: #c5ee93; } @@ -409,22 +1378,12 @@ h6, color: #fbbaa7; } -.fa-share-from-square { - color: #f8b9c5; -} - .fa-share-nodes { color: #ffb4cf; } -/* -.fa-sort { - color: #fff; -} -*/ - .fa-spray-can-sparkles { - color: #f8b9c5; + color: #d0b4f5; } .fa-square-check { @@ -436,7 +1395,7 @@ h6, } .fa-table { - color: #f8b9c5; + color: #7efbe1; } .fa-timeline { @@ -452,7 +1411,7 @@ h6, } .fa-user-group { - color: #f8b9c5; + color: #96abee; } .fa-user-shield { @@ -460,160 +1419,318 @@ h6, } .fa-wand-magic-sparkles { - color: #f8b9c5; + color: #ffe396; } .fa-window-maximize { color: #ffcdd5; } -/* Buttons */ +/* Icons — light mode overrides (WCAG 2.2 AA compliant, min 4.5:1 on #fff) */ + +[data-bs-theme=light] .fa-arrow-right-to-bracket, +[data-bs-theme=light] .fa-arrows-rotate, +[data-bs-theme=light] .fa-building, +[data-bs-theme=light] .fa-circle-check, +[data-bs-theme=light] .fa-circle-info, +[data-bs-theme=light] .fa-seedling { + /* → #2d7a3a = 5.31:1 ✓ */ + color: #2d7a3a !important; +} + +[data-bs-theme=light] .fa-bell, +[data-bs-theme=light] .fa-diagram-project, +[data-bs-theme=light] .fa-envelope-open-text, +[data-bs-theme=light] .fa-graduation-cap, +[data-bs-theme=light] .fa-link, +[data-bs-theme=light] .fa-ranking-star, +[data-bs-theme=light] .fa-table { + /* → #0d7a6e = 5.22:1 ✓ */ + color: #0d7a6e !important; +} + +[data-bs-theme=light] .fa-bell-concierge, +[data-bs-theme=light] .fa-brain, +[data-bs-theme=light] .fa-map, +[data-bs-theme=light] .fa-server { + /* → #8a5e2d = 5.65:1 ✓ */ + color: #8a5e2d !important; +} + +[data-bs-theme=light] .fa-bolt, +[data-bs-theme=light] .fa-certificate, +[data-bs-theme=light] .fa-crown, +[data-bs-theme=light] .fa-face-smile, +[data-bs-theme=light] .fa-hand, [data-bs-theme=light] .fa-hands, +[data-bs-theme=light] .fa-hands-clapping, +[data-bs-theme=light] .fa-handshake-simple, +[data-bs-theme=light] .fa-handshake-angle, +[data-bs-theme=light] .fa-hand-peace, +[data-bs-theme=light] .fa-hand-pointer, +[data-bs-theme=light] .fa-hand-point-up, +[data-bs-theme=light] .fa-hand-point-down, +[data-bs-theme=light] .fa-hand-point-right, +[data-bs-theme=light] .fa-hand-point-left, +[data-bs-theme=light] .fa-lightbulb, +[data-bs-theme=light] .fa-magnifying-glass, +[data-bs-theme=light] .fa-scale-balanced, +[data-bs-theme=light] .fa-scroll, +[data-bs-theme=light] .fa-star, +[data-bs-theme=light] .fa-wand-magic-sparkles { + /* → #8a6500 = 5.33:1 ✓ */ + color: #8a6500 !important; +} -.btn-primary, -a.btn-primary, -a.btn-primary:visited { - background-color: var(--bs-link-color); - color: var(--bs-body-bg); - border-radius: var(--bs-border-radius); - border: 1px solid var(--bs-border-color); - box-shadow: var(--bs-card-shadow); - cursor: pointer; - font-family: var(--bs-font-bold); - padding: 0.55rem; +[data-bs-theme=light] .fa-bars-progress, +[data-bs-theme=light] .fa-dashboard, +[data-bs-theme=light] .fa-gauge-simple, +[data-bs-theme=light] .fa-gauge-high, +[data-bs-theme=light] .fa-rss { + /* → #8a4f00 = 6.56:1 ✓ */ + color: #8a4f00 !important; } -a.btn-primary-outline { - background-color: var(--bs-body-bg); - color: var(--bs-body-color); - border-radius: var(--bs-border-radius-sm); - border: 1px solid var(--bs-border-color); - box-shadow: var(--bs-card-shadow); - cursor: pointer; - font-family: var(--bs-font-sans-serif); - padding: 0.55rem; +[data-bs-theme=light] .fa-circle-nodes, +[data-bs-theme=light] .fa-file, +[data-bs-theme=light] .fa-file-lines, +[data-bs-theme=light] .fa-linkedin, +[data-bs-theme=light] .fa-paper-plane, +[data-bs-theme=light] .fa-percent, +[data-bs-theme=light] .fa-satellite-dish, +[data-bs-theme=light] .fa-square-check, +[data-bs-theme=light] .fa-universal-access { + /* → #1a6fa0 = 5.49:1 ✓ */ + color: #1a6fa0 !important; } -.btn-primary-outline:not(.active):hover, -a.btn-primary-outline:not(.active):hover { - background-color: var(--bs-btn-bg) !important; - color: var(--bs-body-bg); - border: 1px solid var(--bs-border-color); - box-shadow: var(--bs-box-shadow-md) !important +[data-bs-theme=light] .fa-code, +[data-bs-theme=light] .fa-bullhorn, +[data-bs-theme=light] .fa-github, +[data-bs-theme=light] .fa-user-group { + /* → #4a6bb5 = 5.17:1 ✓ */ + color: #4a6bb5 !important; } -a.btn:not(.active):hover svg, .nav-link:not(.active):hover svg { - color: var(--bs-link-color) !important; +[data-bs-theme=light] .fa-comment, +[data-bs-theme=light] .fa-filter, +[data-bs-theme=light] .fa-rocket { + /* → #5b4ea0 = 6.90:1 ✓ */ + color: #5b4ea0 !important; +} + +[data-bs-theme=light] .fa-circle-notch, +[data-bs-theme=light] .fa-robot { + /* → #5a5a5a = 6.90:1 ✓ */ + color: #5a5a5a !important; +} + +[data-bs-theme=light] .fa-circle-question { + /* → #1a6fa0 = 5.49:1 ✓ */ + color: #1a6fa0; +} + +[data-bs-theme=light] .fa-discord, +[data-bs-theme=light] .fa-calendar, +[data-bs-theme=light] .fa-eye, +[data-bs-theme=light] .fa-key, +[data-bs-theme=light] .fa-newspaper, +[data-bs-theme=light] .fa-rectangle-list, +[data-bs-theme=light] .fa-user-astronaut { + /* → #b5476a = 5.15:1 ✓ */ + color: #b5476a !important; +} + +[data-bs-theme=light] .fa-flag { + /* → #b52040 = 6.47:1 ✓ */ + color: #b52040 !important; +} + +[data-bs-theme=light] .fa-gear { + /* → #1a5e9e = 6.69:1 ✓ */ + color: #1a5e9e !important; +} + +[data-bs-theme=light] .fa-heart, +[data-bs-theme=light] .fa-heart-crack, +[data-bs-theme=light] .fa-lock, +[data-bs-theme=light] .fa-right-from-bracket { + /* → #c0392b = 5.44:1 ✓ */ + color: #c0392b !important; +} + +[data-bs-theme=light] .fa-house { + /* → #7a2ea0 = 7.70:1 ✓ */ + color: #7a2ea0 !important; +} + +[data-bs-theme=light] .fa-laptop { + /* → #1a6e6a = 6.03:1 ✓ */ + color: #1a6e6a !important; +} + +[data-bs-theme=light] .fa-landmark { + /* → #3a3a3a = 11.37:1 ✓ */ + color: #3a3a3a !important; +} + +[data-bs-theme=light] .fa-share-nodes, +[data-bs-theme=light] .fa-check-to-slot, +[data-bs-theme=light] .fa-timeline { + /* → #9e2060 = 7.42:1 ✓ */ + color: #9e2060 !important; } -/* Cards */ +[data-bs-theme=light] .fa-spray-can-sparkles { + /* → #6b3fa0 = 7.38:1 ✓ */ + color: #6b3fa0 !important; +} -.card-hover { - transition: 0.5s filter; +[data-bs-theme=light] .fa-user-shield { + /* → #8a4e00 = 6.62:1 ✓ */ + color: #8a4e00 !important; } -.card-hover:hover { - filter: brightness(1.3); +[data-bs-theme=light] .fa-window-maximize { + /* → #a03050 = 6.92:1 ✓ */ + color: #a03050 !important; } -/* iframe */ +[data-bs-theme=light] .fa-youtube { + /* → #c0392b = 5.44:1 ✓ */ + color: #c0392b !important; +} -iframe { - border: 1px solid var(--bs-border-color) !important; +/* Status card icons — must come last to beat FA light mode overrides */ +[data-bs-theme=light] .card.text-bg-success, +[data-bs-theme=light] .card.text-bg-success a, +[data-bs-theme=light] .card.text-bg-success a:link, +[data-bs-theme=light] .card.text-bg-success a:visited, +[data-bs-theme=light] .card.text-bg-success a:hover, +[data-bs-theme=light] .card.text-bg-success a:focus, +[data-bs-theme=light] .card.text-bg-success i, +[data-bs-theme=light] .card.text-bg-success svg, +[data-bs-theme=light] .card.text-bg-success a i, +[data-bs-theme=light] .card.text-bg-success a svg, +[data-bs-theme=light] .card.text-bg-warning, +[data-bs-theme=light] .card.text-bg-warning a, +[data-bs-theme=light] .card.text-bg-warning a:link, +[data-bs-theme=light] .card.text-bg-warning a:visited, +[data-bs-theme=light] .card.text-bg-warning a:hover, +[data-bs-theme=light] .card.text-bg-warning a:focus, +[data-bs-theme=light] .card.text-bg-warning i, +[data-bs-theme=light] .card.text-bg-warning svg, +[data-bs-theme=light] .card.text-bg-warning a i, +[data-bs-theme=light] .card.text-bg-warning a svg { + color: #13171f !important; + fill: #13171f !important; } -/* Forms */ +[data-bs-theme=light] .card.text-bg-danger, +[data-bs-theme=light] .card.text-bg-danger a, +[data-bs-theme=light] .card.text-bg-danger a:link, +[data-bs-theme=light] .card.text-bg-danger a:visited, +[data-bs-theme=light] .card.text-bg-danger a:hover, +[data-bs-theme=light] .card.text-bg-danger a:focus, +[data-bs-theme=light] .card.text-bg-danger i, +[data-bs-theme=light] .card.text-bg-danger svg, +[data-bs-theme=light] .card.text-bg-danger a i, +[data-bs-theme=light] .card.text-bg-danger a svg { + color: #ffffff !important; + fill: #ffffff !important; +} + +/* text-bg-dark card icons match white text */ +.card.text-bg-dark a, +.card.text-bg-dark a:link, +.card.text-bg-dark a:visited, +.card.text-bg-dark a:hover, +.card.text-bg-dark a:focus, +.card.text-bg-dark i, +.card.text-bg-dark svg, +.card.text-bg-dark a i, +.card.text-bg-dark a svg { + color: #ffffff !important; + fill: #ffffff !important; +} -.form-control:focus { - border-color: var(--bs-link-color); +/* Question mark help icons inherit text color via href targeting */ +a[href*="docs.scangov.org"] svg, +a[href*="docs.scangov.org"] i { + color: inherit !important; + fill: currentColor !important; } -/* Anchor links */ +/* Font Awesome size utilities */ +.fa-2xs { + font-size: 0.625em; +} -h2 a#heading-hashtag, -h3 a#heading-hashtag { - display: none; +.fa-xs { + font-size: 0.75em; } -h2:hover a#heading-hashtag, -h3:hover a#heading-hashtag { - display: revert; +.fa-sm { + font-size: 0.875em; } -/* Bootstrap */ +.fa-lg { + font-size: 1.25em; +} -.badge { - border-radius: .25rem; - font-family: 'Public Sans Light', sans-serif !important; +.fa-xl { + font-size: 1.5em; } -/* News posts */ +.fa-2xl { + font-size: 2em; +} -.post-content h2 { - margin-top: 2.75rem; +.fa-1x { + font-size: 1em; } -.post-content ul, .post-content p { - margin-bottom: 1.75rem; +.fa-2x { + font-size: 2em; } -/* File types */ -a[href$=".doc"]::after, -a[href$=".docx"]::after, -a[href$=".ppt"]::after, -a[href$=".pptx"]::after, -a[href$=".xls"]::after, -a[href$=".xlsx"]::after, -a[href$=".pdf"]::after, -a[href$=".mp3"]::after, -a[href$=".mp4"]::after, -a[href$=".avi"]::after, -a[href$=".mpg"]::after, -a[href$=".mpeg"]::after, -a[href$=".mov"]::after, -a[href$=".wmv"]::after, -a[href$=".mkv"]::after, -a[href$=".jpg"]::after, -a[href$=".jpeg"]::after, -a[href$=".png"]::after, -a[href$=".gif"]::after { - content: ""; - display: inline-block; - width: 1em; - height: 1em; - margin-left: 0.5rem; - background-size: contain; - background-repeat: no-repeat; +.fa-3x { + font-size: 3em; } -/* Doc */ -a[href$=".doc"]::after, -a[href$=".docx"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-word.svg); +.fa-4x { + font-size: 4em; } -/* PowerPoint */ -a[href$=".ppt"]::after, -a[href$=".pptx"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-powerpoint.svg); +.fa-5x { + font-size: 5em; } -/* Excel */ -a[href$=".xls"]::after, -a[href$=".xlsx"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-excel.svg); +.fa-6x { + font-size: 6em; } -/* PDF */ -a[href$=".pdf"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-pdf.svg); +.fa-7x { + font-size: 7em; } -/* MP3 */ -a[href$=".mp3"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-audio.svg); +.fa-8x { + font-size: 8em; } -/* MP4 */ -a[href$=".mp4"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-video.svg); +.fa-9x { + font-size: 9em; +} + +.fa-10x { + font-size: 10em; +} + +/* Table header icons match text color */ +th a i, th a svg, +th a:link i, th a:link svg, +th a:visited i, th a:visited svg, +th a:hover i, th a:hover svg, +th a:focus i, th a:focus svg { + color: var(--bs-body-color) !important; + fill: var(--bs-body-color) !important; } \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css index 00f8d258..e69de29b 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,25 +0,0 @@ -/* Font Awesome SVG icon sizing */ -.fa-solid { - display: var(--fa-display, inline-block); - height: 1em; - width: 1em; - overflow: visible; - vertical-align: -.125em; -} - -/* Button hover: green background with dark text */ -.btn-primary-outline:not(.active):hover, -a.btn-primary-outline:not(.active):hover { - background-color: var(--bs-link-color) !important; - color: var(--bs-body-bg); -} - -/* Button hover: icon matches dark text */ -a.btn:not(.active):hover svg { - color: var(--bs-body-bg) !important; -} - -/* Nav link hover: icon turns green (no green bg on these) */ -.nav-link:not(.active):hover svg { - color: var(--bs-link-color) !important; -} diff --git a/scripts/bundle.css b/scripts/bundle.css index 1b329f68..d5896c86 100644 --- a/scripts/bundle.css +++ b/scripts/bundle.css @@ -196,98 +196,1127 @@ pre.highlight { color: #ffcd22 }/* This file is maintaned in https://github.com/ScanGov/components and copied to multiple projects during startup */ -/* Root */ +/* Fonts */ -:root, [data-bs-theme=dark], [data-bs-theme=light] { +@font-face { + font-family: "Public Sans ExtraBold"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-ExtraBold.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Bold"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Bold.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Regular"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Light"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Light.ttf") format("truetype"); +} + +@font-face { + font-family: "Public Sans Thin"; + src: url("/assets/fonts/public-sans/ttf/PublicSans-Thin.ttf") format("truetype"); +} + +@font-face { + font-family: "JetBrains Mono Medium"; + src: url("/assets/fonts/jetbrains-mono/JetBrainsMono-Medium.ttf") format("truetype"); +} + +@font-face { + font-family: "JetBrains Mono ExtraBold"; + src: url("/assets/fonts/jetbrains-mono/JetBrainsMono-ExtraBold.ttf") format("truetype"); +} + +/* Dark mode (default) */ + +:root, [data-bs-theme=dark] { + color-scheme: dark; + --bs-primary: #70e17b; + --bs-primary-rgb: 112, 225, 123; + --bs-primary-text: #13171f; --bs-body-color: #fff; --bs-body-color-rgb: 255, 255, 255; --bs-body-bg: #13171f; --bs-body-bg-rgb: 19, 23, 31; - --scangov-green: #70e17b; - --scangov-green-rgb: 112, 225, 123; - --bs-link-color: var(--scangov-green); - --bs-link-color-rgb: var(--scangov-green-rgb); - --bs-success-rgb: var(--scangov-green-rgb); + --bs-body-secondary-bg: #0f1218; + --bs-link-color: #70e17b; + --bs-link-color-rgb: 112, 225, 123; --bs-link-hover-color: var(--bs-link-color); --bs-link-hover-color-rgb: 112, 225, 123; - --bs-selection-bg: var(--bs-link-color); - --bs-selection-color: var(--bs-body-bg); + --bs-link-hover-decoration: none; + --bs-highlight-bg: var(--bs-primary); + --bs-highlight-color: var(--bs-primary-text); + --bs-selection-bg: var(--bs-primary); + --bs-selection-color: var(--bs-primary-text); + --bs-btn-primary: var(--bs-primary); + --bs-btn-primary-color: var(--bs-primary-text); + --bs-btn-primary-border-color: var(--bs-primary); + --bs-btn-primary-focus-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-color: var(--bs-primary-text); + --bs-btn-primary-active-bg: var(--bs-primary); + --bs-btn-primary-bg: var(--bs-primary); + --bs-btn-bg: var(--bs-primary); + --bs-btn-border-color: var(--bs-primary); + --bs-btn-color: var(--bs-primary-text); + --bs-btn-hover-bg: var(--bs-primary); + --bs-btn-hover-border-color: var(--bs-primary); + --bs-btn-hover-color: var(--bs-primary-text); + --bs-nav-link-color: var(--bs-body-color); + --bs-nav-link-hover-color: var(--bs-link-color); + --bs-border-color: #252f3e; + --bs-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.1); + --bs-card-shadow: var(--bs-shadow); + --bs-box-shadow: var(--bs-shadow); + --bs-box-shadow-md: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.5); + --bs-secondary: var(--bs-body-color); + --bs-text-secondary: var(--bs-secondary); + --bs-badge-bg: var(--bs-primary); + --bs-badge-font-weight: 300; + --bs-border-radius-sm: .25rem; + /* WCAG 2.2 AA: #face00 on #13171f = 11.87:1 ✓ */ + --bs-text-bg-primary: #face00; + --bs-info-text-emphasis: var(--bs-body-color); + --bs-info-bg-subtle: var(--bs-body-secondary-bg); + --bs-info-border-subtle: var(--bs-border-color); + --bs-text-muted: var(--bs-body-color); --bs-font-monospace: "JetBrains Mono Medium", monospace; --bs-font-light: "Public Sans Light", sans-serif; --bs-font-bold: "Public Sans Bold", sans-serif; --bs-font-regular: "Public Sans Regular", sans-serif; - --bs-font-serif: "Merriweather Light", sans-serif; - --bs-font-thin: "Public Sans Thin", sans-serif; - --bs-font-extra-bold: "Public Sans ExtraBold", sans-serif; --bs-font-sans-serif: "Public Sans Regular", sans-serif; + --bs-text-opacity: .5; + --bs-emphasis-color: var(--bs-body-color); + --bs-form-control-color: var(--bs-body-color); + --bs-form-control-bg: var(--bs-body-bg); + --bs-form-control-border-color: var(--bs-border-color); + --bs-form-control-focus-border-color: var(--bs-primary); + --bs-form-control-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + --bs-form-control-focus-color: var(--bs-body-color); + --bs-card-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + /* Status colors */ + --bs-bg-success: #70e17b; + --bs-bg-success-rgb: 112, 225, 123; + --bs-border-success: #70e17b; + --bs-text-warning: #000000; + --bs-bg-warning: #face00; + --bs-bg-warning-rgb: 250, 206, 0; + --bs-border-warning: #face00; + --bs-text-danger: #ffffff; + --bs-bg-danger: #e41d3d; + --bs-bg-danger-rgb: 228, 29, 61; + --bs-border-danger: #e41d3d; +} + +/* Light mode */ + +[data-bs-theme=light] { + color-scheme: light; + --bs-primary: #70e17b; + --bs-primary-rgb: 112, 225, 123; + --bs-primary-text: #13171f; + --bs-body-color: #13171f; + --bs-body-color-rgb: 19, 23, 31; + --bs-body-bg: #ffffff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-body-secondary-bg: #f4f6f9; + /* WCAG 2.2 AA: #2563eb on #fff = 4.66:1 ✓ */ + --bs-link-color: #2563eb; + --bs-link-color-rgb: 37, 99, 235; + --bs-link-hover-color: var(--bs-link-color); + --bs-link-hover-color-rgb: 37, 99, 235; + --bs-link-hover-decoration: none; + --bs-highlight-bg: var(--bs-primary); + --bs-highlight-color: var(--bs-primary-text); + --bs-selection-bg: var(--bs-primary); + --bs-selection-color: var(--bs-primary-text); + --bs-btn-primary: var(--bs-primary); + --bs-btn-primary-color: var(--bs-primary-text); + --bs-btn-primary-border-color: var(--bs-primary); + --bs-btn-primary-focus-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-shadow-rgb: 112, 225, 123; + --bs-btn-primary-active-color: var(--bs-primary-text); + --bs-btn-primary-active-bg: var(--bs-primary); + --bs-btn-primary-bg: var(--bs-primary); + --bs-btn-bg: var(--bs-primary); + --bs-btn-border-color: var(--bs-primary); + --bs-btn-color: var(--bs-primary-text); + --bs-btn-hover-bg: var(--bs-primary); + --bs-btn-hover-border-color: var(--bs-primary); + --bs-btn-hover-color: var(--bs-primary-text); + --bs-nav-link-color: var(--bs-body-color); + --bs-nav-link-hover-color: var(--bs-link-color); + --bs-border-color: #d5dce8; + --bs-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.06); + --bs-card-shadow: var(--bs-shadow); + --bs-box-shadow: var(--bs-shadow); + --bs-box-shadow-md: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.15); + --bs-secondary: var(--bs-body-color); + --bs-text-secondary: var(--bs-secondary); + --bs-badge-bg: var(--bs-primary); + --bs-badge-font-weight: 300; + --bs-border-radius-sm: .25rem; + /* WCAG 2.2 AA: #8a6500 on #fff = 5.33:1 ✓ */ + --bs-text-bg-primary: #8a6500; + --bs-info-text-emphasis: var(--bs-body-color); + --bs-info-bg-subtle: var(--bs-body-secondary-bg); + --bs-info-border-subtle: var(--bs-border-color); + /* WCAG 2.2 AA: #4a5568 on #fff = 7.53:1 ✓ */ + --bs-text-muted: #4a5568; + --bs-text-opacity: .5; + --bs-emphasis-color: var(--bs-body-color); + --bs-form-control-color: var(--bs-body-color); + --bs-form-control-bg: var(--bs-body-bg); + --bs-form-control-border-color: var(--bs-border-color); + --bs-form-control-focus-border-color: var(--bs-primary); + --bs-form-control-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + --bs-form-control-focus-color: var(--bs-body-color); + --bs-card-focus-box-shadow: 0 0 0 0.25rem rgba(112, 225, 123, 0.25); + /* font vars, status colors inherited from :root */ +} + +/* Status badge overrides */ + +/* WCAG 2.2 AA: #13171f on #70e17b = 8.19:1 ✓ */ +.text-bg-success { + color: #13171f !important; + background-color: #70e17b !important; +} + +/* WCAG 2.2 AA: #000 on #face00 = 15.18:1 ✓ */ +.text-bg-warning { + color: #000000 !important; + background-color: #face00 !important; +} + +/* WCAG 2.2 AA: #fff on #e41d3d = 4.73:1 ✓ */ +.text-bg-danger { + color: #ffffff !important; + background-color: #e41d3d !important; +} + +.text-bg-primary { + background-color: var(--bs-text-bg-primary) !important; + color: var(--bs-body-bg) !important; +} + +/* Theme-dependent: logo/image invert */ + +:root body footer img, +:root body ul.navbar-nav img, +[data-bs-theme=dark] body footer img, +[data-bs-theme=dark] body ul.navbar-nav img { + filter: invert(1); +} + +[data-bs-theme=light] body footer img, +[data-bs-theme=light] body ul.navbar-nav img { + filter: none; +} + +/* Theme-dependent: navbar toggler icon */ + +[data-bs-theme="light"] .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%2819, 23, 31, 1%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 { + --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, 1%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +/* Theme-dependent: text-secondary */ + +.text-secondary { + color: rgba(19, 23, 31, var(--bs-text-opacity)) !important; +} + +[data-bs-theme=dark] .text-secondary { + color: rgba(255, 255, 255, var(--bs-text-opacity)) !important; } /* General */ +blockquote { + padding: 1rem 1rem .5rem 1rem; + margin: 1rem 0 1rem 1.5rem; + border-left: 0.25rem solid var(--bs-border-color); +} + +.text-muted { + color: var(--bs-body-color) !important; +} + body { color: var(--bs-body-color); - background: var(--bs-body-bg); + background-color: var(--bs-body-bg) !important; + font-family: var(--bs-font-sans-serif); + line-height: 1.5; +} + +strong { + font-family: var(--bs-font-bold); +} + +.navbar-brand, +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6, +.display-1, .display-2, .display-3, .display-4 { + font-family: var(--bs-font-bold); + letter-spacing: -.01rem; +} + +body.docs h2, +body.page h2, +body.docs h3, +body.page h3 { + margin-bottom: 1rem; + margin-top: 3rem; +} + +/* Lead */ + +.lead { + font-family: var(--bs-font-regular) !important; + font-size: 1.25rem; + font-weight: 300; + color: var(--bs-body-color); +} + +/* Selection */ + +::selection { + background-color: var(--bs-selection-bg); + color: var(--bs-selection-color); +} + +/* Accessibility */ + +/* Focus indicators (WCAG 2.4.7, 2.4.11) */ +:focus-visible { + outline: 3px solid var(--bs-link-color); + outline-offset: 2px; + border-radius: 2px; +} + +/* Remove outline on mouse/touch click, keep for keyboard (WCAG 2.4.7) */ +:focus:not(:focus-visible) { + outline: none; +} + +/* Minimum touch target size (WCAG 2.5.8) — exclude card children to avoid layout shift */ +a:not(.card):not(.card *):not(.stretched-link), +button:not(.card *) { + min-height: 24px; + min-width: 24px; +} + +/* Reduced motion (WCAG 2.3.3) */ +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +/* High contrast mode (WCAG 1.4.11) */ +@media (forced-colors: active) { + * { + forced-color-adjust: auto; + } +} + +/* Skip link — visible on focus for keyboard users (WCAG 2.4.1) */ +.skip-link { + position: absolute; + top: -100%; + left: 0; +} + +.skip-link:focus { + top: 0; +} + +/* Navbar */ + +#logo { + max-width: 35px; + width: 100%; + height: 100%; +} + +.navbar { + box-shadow: var(--bs-shadow); + transition: box-shadow 0.25s ease; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-font-size: 1.1em; +} + +.navbar-brand { + font-family: var(--bs-font-bold); + color: var(--bs-body-color) !important; +} + +.navbar-brand>svg { + fill: var(--bs-body-color) !important; +} + +.navbar-brand:hover { + color: var(--bs-link-color) !important; +} + +.navbar-brand:hover>svg { + fill: var(--bs-link-color) !important; +} + +.navbar-toggler-icon { + color: var(--bs-body-color) !important; +} + +.navbar-nav, +.navbar-nav .nav-link:not(.active), +a.list-group-item { + color: var(--bs-body-color) !important; + font-family: "Public Sans Regular", sans-serif !important; +} + +.nav-link { + font-family: "Public Sans Regular", sans-serif !important; +} + +.navbar-nav .nav-link:not(.active):hover, +a.list-group-item:hover { + color: var(--bs-link-color) !important; +} + +a.list-group-item:hover { + background-color: var(--bs-body-secondary-bg); +} + +.border-end { + box-shadow: var(--bs-shadow); +} + +/* Social links */ + +.social a, .social a:visited { + color: var(--bs-body-color); + display: inline-block; + margin-right: .75rem; +} + +.social a:hover { + color: var(--bs-link-color); +} + +/* External link icon (post content only) */ + +.post-content a[href^="http"]:not([href^="https://scangov.org"]):not([href^="https://standards.scangov.org"]):not([href^="https://scangov.com"]):not([href^="https://data.scangov.org"]):not([href^="http://localhost:4000/"]):not([href^="https://docs.scangov.org"])::after { + content: "\f35d"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-left: 5px; + font-size: 0.8em; + display: inline-block; +} + +.social a[href^="http"]:not([href^="https://scangov.org"]):not([href^="https://scangov.com"]):not([href^="http://localhost:4000/"]):not([href^="https://docs.scangov.org"])::after { + display: none !important; +} + +/* Breadcrumb */ + +.breadcrumb-item a, .breadcrumb-item a:visited { + color: var(--bs-link-color); + font-family: var(--bs-font-bold); + text-decoration: none; +} + +/* Links / Buttons */ + +a:hover { + text-decoration: var(--bs-link-hover-decoration); + color: var(--bs-link-hover-color); +} + +a.btn-primary, a.btn-primary:visited, .btn-primary { + background-color: var(--bs-primary) !important; + color: var(--bs-primary-text) !important; + border-radius: var(--bs-border-radius); + border: 1px solid var(--bs-primary) !important; + box-shadow: var(--bs-shadow); + cursor: pointer; + font-family: var(--bs-font-bold); + padding: .55rem; + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +a.btn-primary-outline { background-color: var(--bs-body-bg); + color: var(--bs-body-color); + border-radius: var(--bs-border-radius-sm); + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + cursor: pointer; font-family: var(--bs-font-sans-serif); + padding: .55rem; + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +a.btn-primary:hover, a.btn-primary:focus, +input[type="submit"].btn-primary:hover, input[type="submit"].btn-primary:focus { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + background-color: var(--bs-primary) !important; + color: var(--bs-primary-text) !important; + border: 1px solid var(--bs-primary) !important; +} + +a.btn-primary-outline:not(.active):hover, .btn-primary-outline:not(.active):hover, +a.btn-primary-outline:not(.active):focus { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + border: 1px solid var(--bs-border-color); +} + +.feedback { + opacity: 0; + pointer-events: none; + visibility: hidden; + background-color: var(--bs-primary); + color: var(--bs-primary-text) !important; + border-radius: var(--bs-border-radius); + border: 1px solid var(--bs-primary); + box-shadow: var(--bs-shadow); + cursor: pointer; + font-family: var(--bs-font-bold); + padding: .55rem; + position: fixed; + bottom: 2rem; + right: 2rem; + z-index: 1000; + text-decoration: none; + transition: opacity 0.25s ease, visibility 0.25s ease, filter 0.25s ease, box-shadow 0.25s ease; +} + +.feedback.is-visible { + opacity: 1; + pointer-events: auto; + visibility: visible; +} + +.feedback svg, a.btn svg { + transition: filter 0.25s ease; +} + +.feedback:hover, .feedback:focus, +a.btn:hover, a.btn:focus, +.btn-primary:hover, .btn-primary:focus { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + background-color: var(--bs-primary) !important; + color: var(--bs-primary-text) !important; + border-color: var(--bs-primary) !important; +} + +/* js-triggered Bootstrap classes */ +.btn-check:checked+.btn, +.btn.active:not(.nav-link), +.btn.show, +.btn:first-child:active, +:not(.btn-check)+.btn:active { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} + +/* Nav pills */ + +.nav-pills { + --bs-nav-pills-link-active-bg: var(--bs-primary); + --bs-nav-link-hover-border-color: #1a2130; +} + +[data-bs-theme=light] .nav-pills { + --bs-nav-link-hover-border-color: #b0bac8; +} + +.nav-pills .nav-link svg { + flex-shrink: 0; + width: 1em; + height: 1em; +} + +.nav-pills .nav-link { + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + font-family: "Public Sans Regular", sans-serif !important; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + transition: filter 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + margin-top: 0.35rem; + margin-bottom: 0.35rem; + display: inline-flex !important; + align-items: center; + width: auto; + flex-shrink: 0; +} + +.nav-pills .nav-link:not(.active):hover, +.nav-pills a.btn-primary-outline:not(.active):hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); + border: 1px solid var(--bs-nav-link-hover-border-color); +} + +/* Nav pills active — #13171f on #70e17b = 8.19:1 ✓ (both themes) */ +.nav-pills .nav-link.active, +.nav-pills .nav-link.active:focus, +.nav-pills a.btn-primary-outline.active, +.nav-pills a.btn-primary-outline.active:focus, +[data-bs-theme=light] .nav-pills .nav-link.active, +[data-bs-theme=light] .nav-pills .nav-link.active:focus, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active:focus { + background-color: #70e17b !important; + color: #13171f !important; + border-color: #70e17b !important; + box-shadow: var(--bs-shadow); +} + +.nav-pills .nav-link.active:hover, +.nav-pills a.btn-primary-outline.active:hover, +[data-bs-theme=light] .nav-pills .nav-link.active:hover, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active:hover { + background-color: #70e17b !important; + color: #13171f !important; + border-color: #70e17b !important; + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +.nav-pills .nav-link.active i, +.nav-pills .nav-link.active svg, +.nav-pills a.btn-primary-outline.active i, +.nav-pills a.btn-primary-outline.active svg, +[data-bs-theme=light] .nav-pills .nav-link.active i, +[data-bs-theme=light] .nav-pills .nav-link.active svg, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active i, +[data-bs-theme=light] .nav-pills a.btn-primary-outline.active svg { + color: #13171f !important; +} + +.nav-pills .active { + --bs-link-color: var(--bs-body-bg); +} + +/* Pagination */ + +.active>.page-link, .page-link.active { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} + +/* Dropdown */ + +.dropdown-toggle::after { + display: none; +} + +.dropdown-toggle svg { + color: var(--bs-btn-color) !important; + transition: 0.15s color; +} + +.dropdown-toggle:hover svg, +.dropdown-toggle:focus svg { + color: var(--bs-btn-hover-color) !important; +} + +.dropdown-menu.show { + display: block; +} + +/* Badge */ + +.badge { + font-family: "Public Sans Regular", sans-serif !important; + padding: .55rem !important; + font-size: .8rem !important; + font-weight: 300; + border-radius: var(--bs-border-radius-sm) !important; +} + +.badge-primary:hover { + background-color: #fee685 !important; + /* WCAG 2.2 AA: #13171f on #fee685 = 14.42:1 ✓ */ + color: #13171f !important; +} + +/* Cards */ + +.card { + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + width: 100%; + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +.card:focus, +.card:focus-within { + box-shadow: var(--bs-card-focus-box-shadow); +} + +a.card { + text-decoration: none; +} + +.card:not(.text-bg-success):not(.text-bg-warning):not(.text-bg-danger):hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +.card-header>a, +.card-header>a>svg { + color: inherit !important; +} + +.card-hover { + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +.card-hover:hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +/* Status cards — consistent across themes */ + +.text-bg-success.card { + border-color: #70e17b !important; +} + +.text-bg-warning.card { + border-color: #face00 !important; +} + +.text-bg-danger.card { + border-color: #e41d3d !important; +} + +.text-bg-success.card:hover, +.text-bg-warning.card:hover, +.text-bg-danger.card:hover { + filter: brightness(1.3); + box-shadow: var(--bs-box-shadow-md); +} + +/* Icons and links inside status cards match card text color */ +.card.text-bg-success i, .card.text-bg-success svg, +.card.text-bg-success a, .card.text-bg-success a:visited, .card.text-bg-success a:hover, +.card.text-bg-warning i, .card.text-bg-warning svg, +.card.text-bg-warning a, .card.text-bg-warning a:visited, .card.text-bg-warning a:hover { + color: #13171f !important; + fill: #13171f !important; +} + +.card.text-bg-danger i, .card.text-bg-danger svg, +.card.text-bg-danger a, .card.text-bg-danger a:visited, .card.text-bg-danger a:hover { + color: #ffffff !important; + fill: #ffffff !important; +} + +.text-bg-success .card-header, +.text-bg-warning .card-header, +.text-bg-danger .card-header { + background-color: rgba(255, 255, 255, 0.15) !important; + border-bottom: 1px solid rgba(255, 255, 255, 0.2) !important; + padding: 0.75rem 1rem; + font-family: var(--bs-font-regular); + --bs-card-cap-bg: rgba(255, 255, 255, 0.15); +} + +.text-bg-success .card-body, +.text-bg-warning .card-body, +.text-bg-danger .card-body { + padding: 1rem; +} + +/* Forms */ + +.form-control { + color: var(--bs-body-color) !important; + border: 1px solid var(--bs-border-color); + box-shadow: var(--bs-shadow); + transition: filter 0.25s ease, box-shadow 0.25s ease; +} + +.form-control:hover { + filter: brightness(1.05); + box-shadow: var(--bs-box-shadow-md); +} + +.form-control:focus { + border-color: var(--bs-primary); + box-shadow: var(--bs-form-control-focus-box-shadow); + filter: none; +} + +::placeholder, ::-ms-input-placeholder { + color: var(--bs-body-color); + opacity: var(--bs-text-opacity); +} + +input[type="submit"] { + min-width: 80px; +} + +/* SVG */ + +svg { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -.125em; + margin: 0 .3rem; + flex-shrink: 0; + width: 1em; +} + +svg.sizeicon-xl { + height: 1.5em; + max-width: 1.5em; + line-height: .04167em; +} + +table td svg { + margin: 0; +} + +/* FA size classes override the default 1em height */ +.fa-2xs svg { + height: 0.625em; +} + +.fa-xs svg { + height: 0.75em; +} + +.fa-sm svg { + height: 0.875em; +} + +.fa-lg svg { + height: 1.25em; +} + +.fa-xl svg { + height: 1.5em; +} + +.fa-2xl svg { + height: 2em; +} + +.fa-2x svg { + height: 2em; +} + +.fa-3x svg { + height: 3em; +} + +.fa-4x svg { + height: 4em; +} + +.fa-5x svg { + height: 5em; +} + +.fa-6x svg { + height: 6em; +} + +.fa-7x svg { + height: 7em; +} + +.fa-8x svg { + height: 8em; +} + +.fa-9x svg { + height: 9em; +} + +.fa-10x svg { + height: 10em; +} + +svg.fa-circle-check { + fill: var(--bs-success); +} + +svg.fa-circle-xmark { + fill: var(--bs-danger); +} + +svg.fa-circle-exclamation { + fill: var(--bs-warning); +} + +svg.fa-circle-right { + fill: var(--bs-info); +} + +/* Images */ + +main#home img { + display: block; + margin: auto; + margin-bottom: 0.5rem; +} + +/* Accessibility utilities */ + +.fa-sr-only, .fa-sr-only-focusable:not(:focus), .sr-only, .sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.d-none { + display: none; +} + +.biggest { + width: 50%; +} + +/* Timeline */ + +.timeline { + border-left: 1px solid hsl(0, 0%, 90%); + position: relative; + list-style: none; +} + +.timeline .timeline-item { + position: relative; +} + +.timeline .timeline-item:after { + position: absolute; + display: block; + top: 0; + background-color: hsl(0, 0%, 90%); + left: -38px; + border-radius: 50%; + height: 11px; + width: 11px; + content: ''; +} + +.timeline-domain { + margin-bottom: 0.25rem; +} + +.timeline-date { + font-family: var(--bs-font-bold); +} + +/* Anchor links */ + +h2 a#heading-hashtag, +h3 a#heading-hashtag { + display: none; +} + +h2:hover a#heading-hashtag, +h3:hover a#heading-hashtag { + display: revert; +} + +/* iframe */ + +iframe { + border: 1px solid var(--bs-border-color) !important; +} + +/* News posts */ + +.post-content h2 { + margin-top: 2.75rem; +} + +.post-content ul, .post-content p { + margin-bottom: 1.75rem; +} + +/* Autocomplete search */ + +.awesomplete [hidden] { + display: none; +} + +.awesomplete .visually-hidden { + position: absolute; + clip: rect(0, 0, 0, 0); +} + +.awesomplete { + display: block; + position: relative; +} + +.awesomplete>input { + display: block; +} + +.awesomplete>ul { + position: absolute; + left: 0; + z-index: 1; + min-width: 100%; + box-sizing: border-box; + list-style: none; + padding: 0; + margin: 0.2em 0 0; + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + box-shadow: 0.05em 0.2em 0.6em rgba(0, 0, 0, 0.2); + text-shadow: none; +} + +.awesomplete>ul:empty { + display: none; +} + +@supports (transform: scale(0)) { + .awesomplete>ul { + transition: 0.3s cubic-bezier(0.4, 0.2, 0.5, 1.4); + } + + .awesomplete>ul[hidden], + .awesomplete>ul:empty { + opacity: 0; + transform: scale(0); + display: block; + visibility: hidden; + transition-timing-function: ease; + } +} + +.awesomplete>ul>li { + position: relative; + padding: 0.7em 1em; + cursor: pointer; +} + +.awesomplete>ul>li:hover { + background: hsl(200, 40%, 80%); + color: black; +} + +.awesomplete>ul>li[aria-selected='true'] { + background: hsl(205, 40%, 40%); + color: white; +} + +.awesomplete mark { + background: hsl(65, 100%, 50%); +} + +.awesomplete li:hover mark { + background: hsl(68, 100%, 41%); +} + +.awesomplete li[aria-selected='true'] mark { + background: hsl(86, 100%, 21%); + color: inherit; +} + +/* File types */ + +a[href$=".doc"]::after, +a[href$=".docx"]::after, +a[href$=".ppt"]::after, +a[href$=".pptx"]::after, +a[href$=".xls"]::after, +a[href$=".xlsx"]::after, +a[href$=".pdf"]::after, +a[href$=".mp3"]::after, +a[href$=".mp4"]::after, +a[href$=".avi"]::after, +a[href$=".mpg"]::after, +a[href$=".mpeg"]::after, +a[href$=".mov"]::after, +a[href$=".wmv"]::after, +a[href$=".mkv"]::after, +a[href$=".jpg"]::after, +a[href$=".jpeg"]::after, +a[href$=".png"]::after, +a[href$=".gif"]::after { + content: ""; + display: inline-block; + width: 1em; + height: 1em; + margin-left: 0.5rem; + background-size: contain; + background-repeat: no-repeat; } -strong { - font-family: var(--bs-font-bold); +a[href$=".doc"]::after, +a[href$=".docx"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-word.svg); } -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6, -.display-1, -.display-2, -.display-3, -.display-4 { - font-family: var(--bs-font-bold); +a[href$=".ppt"]::after, +a[href$=".pptx"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-powerpoint.svg); } -.text-bg-success { - color: #000 !important; +a[href$=".xls"]::after, +a[href$=".xlsx"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-excel.svg); } -/* Selection */ - -::selection { - background-color: var(--bs-selection-bg); - color: var(--bs-selection-color); +a[href$=".pdf"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-pdf.svg); } -/* Navbar */ - -#logo { - max-width: 35px; - width: 100%; - height: 100%; +a[href$=".mp3"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-audio.svg); } -/* Breadcrumb */ - -.breadcrumb-item a, .breadcrumb-item a:visited { - color: var(--bs-link-color); - font-family: var(--bs-font-bold); - text-decoration: none; +a[href$=".mp4"]::after { + background-image: url(/assets/font-awesome/svgs/solid/file-video.svg); } -/* Icons */ - -/* Brands */ - -.fa-bluesky { - color: #96abee !important; -} +/* Icons — dark mode (vibrant pastels on dark bg) */ .fa-github { color: #96abee !important; @@ -301,20 +1330,22 @@ h6, color: #c3ebfa !important; } -.fa-mastodon { - color: #f8b9c5 !important; -} - .fa-youtube { color: #fd8ba0 !important; } -/* General */ - -.fa-rotate, .fa-arrows-rotate { +.fa-arrows-rotate { color: #c5ee93 !important; } +.fa-arrow-right-to-bracket { + color: #70e17b !important; +} + +.fa-bars-progress { + color: #ffbc78; +} + .fa-bell { color: #29e1cb !important; } @@ -327,10 +1358,6 @@ h6, color: #face00 !important; } -.fa-book-open-reader { - color: #c3ebfa !important; -} - .fa-brain { color: #fdb8ae !important; } @@ -351,55 +1378,29 @@ h6, color: #ffbe2e !important; } -.fa-check { - color: #e7f434 !important; -} - .fa-check-to-slot { color: #ffb4cf !important; } -.fa-circle { - color: #97d4ea !important; -} - .fa-circle-check { color: #70e17b !important; } -.fa-circle-exclamation { - color: #f8b9c5 !important; -} - -.fa-circle-plus { - color: #70e17b !important; -} - -.fa-circle-dot { - color: #f3bf90 !important; -} - -.fa-circle-down { - color: #e41d3d !important; -} - .fa-circle-nodes { color: #c3ebfa; } -.fa-circle-up { - color: #21c834 !important; +.fa-circle-notch { + color: #e6e6e6 !important; } -/* -.fa-circle-info { - color: #b8d293 !important; +.fa-circle-question { + color: #97d4ea; } -.fa-circle-question { - color: #97d4ea !important; +.fa-circle-info { + color: #b8d293 !important; } -*/ .fa-code { color: #bbc8f5 !important; @@ -409,10 +1410,6 @@ h6, color: #c5c5f3 !important; } -.fa-comments { - color: #c5c5f3 !important; -} - .fa-crown { color: #ffe396 !important; } @@ -425,10 +1422,6 @@ h6, color: #7efbe1 !important; } -.fa-dolly { - color: #f5fbc1 !important; -} - .fa-envelope-open-text { color: #7efbe1 !important; } @@ -449,26 +1442,10 @@ h6, color: #a8f2ff; } -.fa-file-contract { - color: #fee685; -} - -.fa-file-pdf { - color: #F8B9C5; -} - .fa-filter { color: #cbc4f2; } -.fa-filter-circle-xmark { - color: #f8b9c5; -} - -.fa-fire { - color: #ffbc78 !important; -} - .fa-flag { color: #f45d79; } @@ -489,7 +1466,11 @@ h6, color: #c7efe2; } -.fa-hand, .fa-hands, .fa-hands-clapping, .fa-handshake-simple, .fa-handshake-angle, .fa-hand-peace, .fa-hand-pointer, .fa-hand-point-up, .fa-hand-point-down, .fa-hand-point-right, .fa-hand-point-left { +.fa-hand, .fa-hands, .fa-hands-clapping, +.fa-handshake-simple, .fa-handshake-angle, +.fa-hand-peace, .fa-hand-pointer, +.fa-hand-point-up, .fa-hand-point-down, +.fa-hand-point-right, .fa-hand-point-left { color: #face00; } @@ -501,14 +1482,14 @@ h6, color: #ff8d7b; } -.fa-highlighter { - color: #e7f434; -} - .fa-house { color: #f4b2ff; } +.fa-key { + color: #f8b9c5; +} + .fa-laptop { color: #9bd4cf; } @@ -521,10 +1502,6 @@ h6, color: #ffe396; } -.fa-key { - color: #f8b9c5; -} - .fa-link { color: #7efbe1; } @@ -553,14 +1530,6 @@ h6, color: #a8f2ff; } -.fa-plug-circle-bolt { - color: #fff5c2; -} - -.fa-puzzle-piece { - color: #98D035; -} - .fa-ranking-star { color: #83fcd4; } @@ -574,7 +1543,7 @@ h6, } .fa-robot { - color: #e7f434; + color: #e6e6e6; } .fa-rocket { @@ -589,14 +1558,14 @@ h6, color: #c3ebfa !important; } -.fa-scroll { - color: #fee685 !important; -} - .fa-scale-balanced { color: #e6c74c; } +.fa-scroll { + color: #fee685 !important; +} + .fa-seedling { color: #c5ee93; } @@ -605,22 +1574,12 @@ h6, color: #fbbaa7; } -.fa-share-from-square { - color: #f8b9c5; -} - .fa-share-nodes { color: #ffb4cf; } -/* -.fa-sort { - color: #fff; -} -*/ - .fa-spray-can-sparkles { - color: #f8b9c5; + color: #d0b4f5; } .fa-square-check { @@ -632,7 +1591,7 @@ h6, } .fa-table { - color: #f8b9c5; + color: #7efbe1; } .fa-timeline { @@ -648,7 +1607,7 @@ h6, } .fa-user-group { - color: #f8b9c5; + color: #96abee; } .fa-user-shield { @@ -656,162 +1615,320 @@ h6, } .fa-wand-magic-sparkles { - color: #f8b9c5; + color: #ffe396; } .fa-window-maximize { color: #ffcdd5; } -/* Buttons */ +/* Icons — light mode overrides (WCAG 2.2 AA compliant, min 4.5:1 on #fff) */ -.btn-primary, -a.btn-primary, -a.btn-primary:visited { - background-color: var(--bs-link-color); - color: var(--bs-body-bg); - border-radius: var(--bs-border-radius); - border: 1px solid var(--bs-border-color); - box-shadow: var(--bs-card-shadow); - cursor: pointer; - font-family: var(--bs-font-bold); - padding: 0.55rem; +[data-bs-theme=light] .fa-arrow-right-to-bracket, +[data-bs-theme=light] .fa-arrows-rotate, +[data-bs-theme=light] .fa-building, +[data-bs-theme=light] .fa-circle-check, +[data-bs-theme=light] .fa-circle-info, +[data-bs-theme=light] .fa-seedling { + /* → #2d7a3a = 5.31:1 ✓ */ + color: #2d7a3a !important; } -a.btn-primary-outline { - background-color: var(--bs-body-bg); - color: var(--bs-body-color); - border-radius: var(--bs-border-radius-sm); - border: 1px solid var(--bs-border-color); - box-shadow: var(--bs-card-shadow); - cursor: pointer; - font-family: var(--bs-font-sans-serif); - padding: 0.55rem; +[data-bs-theme=light] .fa-bell, +[data-bs-theme=light] .fa-diagram-project, +[data-bs-theme=light] .fa-envelope-open-text, +[data-bs-theme=light] .fa-graduation-cap, +[data-bs-theme=light] .fa-link, +[data-bs-theme=light] .fa-ranking-star, +[data-bs-theme=light] .fa-table { + /* → #0d7a6e = 5.22:1 ✓ */ + color: #0d7a6e !important; } -.btn-primary-outline:not(.active):hover, -a.btn-primary-outline:not(.active):hover { - background-color: var(--bs-btn-bg) !important; - color: var(--bs-body-bg); - border: 1px solid var(--bs-border-color); - box-shadow: var(--bs-box-shadow-md) !important +[data-bs-theme=light] .fa-bell-concierge, +[data-bs-theme=light] .fa-brain, +[data-bs-theme=light] .fa-map, +[data-bs-theme=light] .fa-server { + /* → #8a5e2d = 5.65:1 ✓ */ + color: #8a5e2d !important; } -a.btn:not(.active):hover svg, .nav-link:not(.active):hover svg { - color: var(--bs-link-color) !important; +[data-bs-theme=light] .fa-bolt, +[data-bs-theme=light] .fa-certificate, +[data-bs-theme=light] .fa-crown, +[data-bs-theme=light] .fa-face-smile, +[data-bs-theme=light] .fa-hand, [data-bs-theme=light] .fa-hands, +[data-bs-theme=light] .fa-hands-clapping, +[data-bs-theme=light] .fa-handshake-simple, +[data-bs-theme=light] .fa-handshake-angle, +[data-bs-theme=light] .fa-hand-peace, +[data-bs-theme=light] .fa-hand-pointer, +[data-bs-theme=light] .fa-hand-point-up, +[data-bs-theme=light] .fa-hand-point-down, +[data-bs-theme=light] .fa-hand-point-right, +[data-bs-theme=light] .fa-hand-point-left, +[data-bs-theme=light] .fa-lightbulb, +[data-bs-theme=light] .fa-magnifying-glass, +[data-bs-theme=light] .fa-scale-balanced, +[data-bs-theme=light] .fa-scroll, +[data-bs-theme=light] .fa-star, +[data-bs-theme=light] .fa-wand-magic-sparkles { + /* → #8a6500 = 5.33:1 ✓ */ + color: #8a6500 !important; } -/* Cards */ +[data-bs-theme=light] .fa-bars-progress, +[data-bs-theme=light] .fa-dashboard, +[data-bs-theme=light] .fa-gauge-simple, +[data-bs-theme=light] .fa-gauge-high, +[data-bs-theme=light] .fa-rss { + /* → #8a4f00 = 6.56:1 ✓ */ + color: #8a4f00 !important; +} -.card-hover { - transition: 0.5s filter; +[data-bs-theme=light] .fa-circle-nodes, +[data-bs-theme=light] .fa-file, +[data-bs-theme=light] .fa-file-lines, +[data-bs-theme=light] .fa-linkedin, +[data-bs-theme=light] .fa-paper-plane, +[data-bs-theme=light] .fa-percent, +[data-bs-theme=light] .fa-satellite-dish, +[data-bs-theme=light] .fa-square-check, +[data-bs-theme=light] .fa-universal-access { + /* → #1a6fa0 = 5.49:1 ✓ */ + color: #1a6fa0 !important; } -.card-hover:hover { - filter: brightness(1.3); +[data-bs-theme=light] .fa-code, +[data-bs-theme=light] .fa-bullhorn, +[data-bs-theme=light] .fa-github, +[data-bs-theme=light] .fa-user-group { + /* → #4a6bb5 = 5.17:1 ✓ */ + color: #4a6bb5 !important; } -/* iframe */ +[data-bs-theme=light] .fa-comment, +[data-bs-theme=light] .fa-filter, +[data-bs-theme=light] .fa-rocket { + /* → #5b4ea0 = 6.90:1 ✓ */ + color: #5b4ea0 !important; +} -iframe { - border: 1px solid var(--bs-border-color) !important; +[data-bs-theme=light] .fa-circle-notch, +[data-bs-theme=light] .fa-robot { + /* → #5a5a5a = 6.90:1 ✓ */ + color: #5a5a5a !important; } -/* Forms */ +[data-bs-theme=light] .fa-circle-question { + /* → #1a6fa0 = 5.49:1 ✓ */ + color: #1a6fa0; +} -.form-control:focus { - border-color: var(--bs-link-color); +[data-bs-theme=light] .fa-discord, +[data-bs-theme=light] .fa-calendar, +[data-bs-theme=light] .fa-eye, +[data-bs-theme=light] .fa-key, +[data-bs-theme=light] .fa-newspaper, +[data-bs-theme=light] .fa-rectangle-list, +[data-bs-theme=light] .fa-user-astronaut { + /* → #b5476a = 5.15:1 ✓ */ + color: #b5476a !important; } -/* Anchor links */ +[data-bs-theme=light] .fa-flag { + /* → #b52040 = 6.47:1 ✓ */ + color: #b52040 !important; +} -h2 a#heading-hashtag, -h3 a#heading-hashtag { - display: none; +[data-bs-theme=light] .fa-gear { + /* → #1a5e9e = 6.69:1 ✓ */ + color: #1a5e9e !important; } -h2:hover a#heading-hashtag, -h3:hover a#heading-hashtag { - display: revert; +[data-bs-theme=light] .fa-heart, +[data-bs-theme=light] .fa-heart-crack, +[data-bs-theme=light] .fa-lock, +[data-bs-theme=light] .fa-right-from-bracket { + /* → #c0392b = 5.44:1 ✓ */ + color: #c0392b !important; } -/* Bootstrap */ +[data-bs-theme=light] .fa-house { + /* → #7a2ea0 = 7.70:1 ✓ */ + color: #7a2ea0 !important; +} -.badge { - border-radius: .25rem; - font-family: 'Public Sans Light', sans-serif !important; +[data-bs-theme=light] .fa-laptop { + /* → #1a6e6a = 6.03:1 ✓ */ + color: #1a6e6a !important; } -/* News posts */ +[data-bs-theme=light] .fa-landmark { + /* → #3a3a3a = 11.37:1 ✓ */ + color: #3a3a3a !important; +} -.post-content h2 { - margin-top: 2.75rem; +[data-bs-theme=light] .fa-share-nodes, +[data-bs-theme=light] .fa-check-to-slot, +[data-bs-theme=light] .fa-timeline { + /* → #9e2060 = 7.42:1 ✓ */ + color: #9e2060 !important; } -.post-content ul, .post-content p { - margin-bottom: 1.75rem; +[data-bs-theme=light] .fa-spray-can-sparkles { + /* → #6b3fa0 = 7.38:1 ✓ */ + color: #6b3fa0 !important; } -/* File types */ -a[href$=".doc"]::after, -a[href$=".docx"]::after, -a[href$=".ppt"]::after, -a[href$=".pptx"]::after, -a[href$=".xls"]::after, -a[href$=".xlsx"]::after, -a[href$=".pdf"]::after, -a[href$=".mp3"]::after, -a[href$=".mp4"]::after, -a[href$=".avi"]::after, -a[href$=".mpg"]::after, -a[href$=".mpeg"]::after, -a[href$=".mov"]::after, -a[href$=".wmv"]::after, -a[href$=".mkv"]::after, -a[href$=".jpg"]::after, -a[href$=".jpeg"]::after, -a[href$=".png"]::after, -a[href$=".gif"]::after { - content: ""; - display: inline-block; - width: 1em; - height: 1em; - margin-left: 0.5rem; - background-size: contain; - background-repeat: no-repeat; +[data-bs-theme=light] .fa-user-shield { + /* → #8a4e00 = 6.62:1 ✓ */ + color: #8a4e00 !important; } -/* Doc */ -a[href$=".doc"]::after, -a[href$=".docx"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-word.svg); +[data-bs-theme=light] .fa-window-maximize { + /* → #a03050 = 6.92:1 ✓ */ + color: #a03050 !important; } -/* PowerPoint */ -a[href$=".ppt"]::after, -a[href$=".pptx"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-powerpoint.svg); +[data-bs-theme=light] .fa-youtube { + /* → #c0392b = 5.44:1 ✓ */ + color: #c0392b !important; } -/* Excel */ -a[href$=".xls"]::after, -a[href$=".xlsx"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-excel.svg); +/* Status card icons — must come last to beat FA light mode overrides */ +[data-bs-theme=light] .card.text-bg-success, +[data-bs-theme=light] .card.text-bg-success a, +[data-bs-theme=light] .card.text-bg-success a:link, +[data-bs-theme=light] .card.text-bg-success a:visited, +[data-bs-theme=light] .card.text-bg-success a:hover, +[data-bs-theme=light] .card.text-bg-success a:focus, +[data-bs-theme=light] .card.text-bg-success i, +[data-bs-theme=light] .card.text-bg-success svg, +[data-bs-theme=light] .card.text-bg-success a i, +[data-bs-theme=light] .card.text-bg-success a svg, +[data-bs-theme=light] .card.text-bg-warning, +[data-bs-theme=light] .card.text-bg-warning a, +[data-bs-theme=light] .card.text-bg-warning a:link, +[data-bs-theme=light] .card.text-bg-warning a:visited, +[data-bs-theme=light] .card.text-bg-warning a:hover, +[data-bs-theme=light] .card.text-bg-warning a:focus, +[data-bs-theme=light] .card.text-bg-warning i, +[data-bs-theme=light] .card.text-bg-warning svg, +[data-bs-theme=light] .card.text-bg-warning a i, +[data-bs-theme=light] .card.text-bg-warning a svg { + color: #13171f !important; + fill: #13171f !important; } -/* PDF */ -a[href$=".pdf"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-pdf.svg); +[data-bs-theme=light] .card.text-bg-danger, +[data-bs-theme=light] .card.text-bg-danger a, +[data-bs-theme=light] .card.text-bg-danger a:link, +[data-bs-theme=light] .card.text-bg-danger a:visited, +[data-bs-theme=light] .card.text-bg-danger a:hover, +[data-bs-theme=light] .card.text-bg-danger a:focus, +[data-bs-theme=light] .card.text-bg-danger i, +[data-bs-theme=light] .card.text-bg-danger svg, +[data-bs-theme=light] .card.text-bg-danger a i, +[data-bs-theme=light] .card.text-bg-danger a svg { + color: #ffffff !important; + fill: #ffffff !important; } -/* MP3 */ -a[href$=".mp3"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-audio.svg); +/* text-bg-dark card icons match white text */ +.card.text-bg-dark a, +.card.text-bg-dark a:link, +.card.text-bg-dark a:visited, +.card.text-bg-dark a:hover, +.card.text-bg-dark a:focus, +.card.text-bg-dark i, +.card.text-bg-dark svg, +.card.text-bg-dark a i, +.card.text-bg-dark a svg { + color: #ffffff !important; + fill: #ffffff !important; } -/* MP4 */ -a[href$=".mp4"]::after { - background-image: url(/assets/font-awesome/svgs/solid/file-video.svg); +/* Question mark help icons inherit text color via href targeting */ +a[href*="docs.scangov.org"] svg, +a[href*="docs.scangov.org"] i { + color: inherit !important; + fill: currentColor !important; +} + +/* Font Awesome size utilities */ +.fa-2xs { + font-size: 0.625em; +} + +.fa-xs { + font-size: 0.75em; +} + +.fa-sm { + font-size: 0.875em; +} + +.fa-lg { + font-size: 1.25em; +} + +.fa-xl { + font-size: 1.5em; +} + +.fa-2xl { + font-size: 2em; +} + +.fa-1x { + font-size: 1em; +} + +.fa-2x { + font-size: 2em; +} + +.fa-3x { + font-size: 3em; +} + +.fa-4x { + font-size: 4em; +} + +.fa-5x { + font-size: 5em; +} + +.fa-6x { + font-size: 6em; +} + +.fa-7x { + font-size: 7em; +} + +.fa-8x { + font-size: 8em; +} + +.fa-9x { + font-size: 9em; +} + +.fa-10x { + font-size: 10em; +} + +/* Table header icons match text color */ +th a i, th a svg, +th a:link i, th a:link svg, +th a:visited i, th a:visited svg, +th a:hover i, th a:hover svg, +th a:focus i, th a:focus svg { + color: var(--bs-body-color) !important; + fill: var(--bs-body-color) !important; }@charset "UTF-8"; /*! * Bootstrap v5.3.2 (https://getbootstrap.com/)