diff --git a/.gitignore b/.gitignore index 6f1df1b..993b8aa 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ pod2htm*.tmp /MYMETA.* /t/tmp /xt/tmp +CLAUDE.md +./claude diff --git a/Changes b/Changes index e7510fa..a446b6a 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,20 @@ Revision history for RT-Extension-TerminalTheme +0.02 2025-04-24 + - Port to RT 6 (requires_rt 6.0.0, rt_too_new 7.0.0) + - Replace terminal-light/terminal-dark dual stylesheet with a single + "terminal" stylesheet; light/dark mode now controlled via the standard + RT6 WebDefaultThemeMode config option (Bootstrap 5 data-bs-theme) + - Rewrite all CSS as Bootstrap 5 overrides using CSS custom properties; + the theme inherits the full elevator stylesheet and applies only delta + overrides for colours, fonts, and layout + - Apply monospace font (Courier New/system fallbacks) throughout + - Update Mason templates (InHeader, BeforeNav, AfterMenus) for RT6: + new navigation IDs (#main-navigation, #page-navigation), Bootstrap 5 + class manipulations, and HTMX registerLoadListener support + - Add SmallLogoURL injection for responsive logo display + - Drop bundled Inter font files and RT5 CSS copies (inherited from elevator) + - Drop Superfish menu JS (not used in RT6) + 0.01 2021-03-11 - Initial version diff --git a/MANIFEST b/MANIFEST index 05a4d30..bb6947d 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,10 +1,8 @@ Changes -html/NoAuth/css/terminal-dark/AfterMenus -html/NoAuth/css/terminal-dark/BeforeNav -html/NoAuth/css/terminal-dark/InHeader -html/NoAuth/css/terminal-light/AfterMenus -html/NoAuth/css/terminal-light/BeforeNav -html/NoAuth/css/terminal-light/InHeader +html/Callbacks/RT-Extension-TerminalTheme/Elements/Header/Head +html/NoAuth/css/terminal/AfterMenus +html/NoAuth/css/terminal/BeforeNav +html/NoAuth/css/terminal/InHeader inc/Module/Install.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm @@ -23,95 +21,6 @@ Makefile.PL MANIFEST This list of files META.yml README -static/css/fonts/inter/Inter-Black.woff -static/css/fonts/inter/Inter-Black.woff2 -static/css/fonts/inter/Inter-BlackItalic.woff -static/css/fonts/inter/Inter-BlackItalic.woff2 -static/css/fonts/inter/Inter-Bold.woff -static/css/fonts/inter/Inter-Bold.woff2 -static/css/fonts/inter/Inter-BoldItalic.woff -static/css/fonts/inter/Inter-BoldItalic.woff2 -static/css/fonts/inter/Inter-ExtraBold.woff -static/css/fonts/inter/Inter-ExtraBold.woff2 -static/css/fonts/inter/Inter-ExtraBoldItalic.woff -static/css/fonts/inter/Inter-ExtraBoldItalic.woff2 -static/css/fonts/inter/Inter-ExtraLight-BETA.woff -static/css/fonts/inter/Inter-ExtraLight-BETA.woff2 -static/css/fonts/inter/Inter-ExtraLightItalic-BETA.woff -static/css/fonts/inter/Inter-ExtraLightItalic-BETA.woff2 -static/css/fonts/inter/Inter-Italic.woff -static/css/fonts/inter/Inter-Italic.woff2 -static/css/fonts/inter/Inter-Light-BETA.woff -static/css/fonts/inter/Inter-Light-BETA.woff2 -static/css/fonts/inter/Inter-LightItalic-BETA.woff -static/css/fonts/inter/Inter-LightItalic-BETA.woff2 -static/css/fonts/inter/Inter-Medium.woff -static/css/fonts/inter/Inter-Medium.woff2 -static/css/fonts/inter/Inter-MediumItalic.woff -static/css/fonts/inter/Inter-MediumItalic.woff2 -static/css/fonts/inter/Inter-Regular.woff -static/css/fonts/inter/Inter-Regular.woff2 -static/css/fonts/inter/Inter-SemiBold.woff -static/css/fonts/inter/Inter-SemiBold.woff2 -static/css/fonts/inter/Inter-SemiBoldItalic.woff -static/css/fonts/inter/Inter-SemiBoldItalic.woff2 -static/css/fonts/inter/Inter-Thin-BETA.woff -static/css/fonts/inter/Inter-Thin-BETA.woff2 -static/css/fonts/inter/Inter-ThinItalic-BETA.woff -static/css/fonts/inter/Inter-ThinItalic-BETA.woff2 -static/css/fonts/inter/LICENSE.txt -static/css/mobile.css -static/css/terminal-dark/main.css -static/css/terminal-light/accordion.css -static/css/terminal-light/admin.css -static/css/terminal-light/articles.css -static/css/terminal-light/assets.css -static/css/terminal-light/base.css -static/css/terminal-light/bootstrap-combobox.css -static/css/terminal-light/bootstrap-select.css -static/css/terminal-light/bootstrap.css -static/css/terminal-light/boxes.css -static/css/terminal-light/Chart.css -static/css/terminal-light/charts.css -static/css/terminal-light/chosen.css -static/css/terminal-light/collection.css -static/css/terminal-light/dashboards.css -static/css/terminal-light/dropzone.css -static/css/terminal-light/dropzone.customized.css -static/css/terminal-light/farbtastic.css -static/css/terminal-light/forms.css -static/css/terminal-light/history-folding.css -static/css/terminal-light/history.css -static/css/terminal-light/inline-edit.css -static/css/terminal-light/inter.css -static/css/terminal-light/jquery-ui-timepicker-addon.css -static/css/terminal-light/jquery-ui.css -static/css/terminal-light/jquery-ui.custom.modified.css -static/css/terminal-light/jquery.jgrowl.min.css -static/css/terminal-light/keyboard-shortcuts.css -static/css/terminal-light/layout.css -static/css/terminal-light/lifecycleui.css -static/css/terminal-light/login.css -static/css/terminal-light/main-orig.css -static/css/terminal-light/main.css -static/css/terminal-light/misc.css -static/css/terminal-light/nav.css -static/css/terminal-light/portlets.css -static/css/terminal-light/print.css -static/css/terminal-light/record.css -static/css/terminal-light/rights-editor.css -static/css/terminal-light/selectize.customized.css -static/css/terminal-light/selectize.default.css -static/css/terminal-light/shredder.css -static/css/terminal-light/superfish-navbar.css -static/css/terminal-light/superfish-vertical.css -static/css/terminal-light/superfish.css -static/css/terminal-light/tablesorter.css -static/css/terminal-light/theme-editor.css -static/css/terminal-light/ticket-form.css -static/css/terminal-light/ticket-forms.css -static/css/terminal-light/ticket-lists.css -static/css/terminal-light/ticket-search.css -static/css/terminal-light/ticket-timer.css -static/css/terminal-light/ticket.css -static/images/request-tracker-logo.svg +static/css/terminal/main.css +static/css/terminal/terminal.css +static/images/terminal-request-tracker-logo.svg diff --git a/Makefile.PL b/Makefile.PL index c12018d..7adefe0 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -5,8 +5,8 @@ RTx 'RT-Extension-TerminalTheme'; license 'gpl_2'; repository 'https://github.com/bestpractical/rt-extension-terminaltheme'; -requires_rt '5.0.0'; -rt_too_new '6.0.0'; +requires_rt '6.0.0'; +rt_too_new '7.0.0'; sign; WriteAll; diff --git a/README b/README index 8ae9bfa..a147d0e 100644 --- a/README +++ b/README @@ -10,7 +10,7 @@ DESCRIPTION this theme on the Best Practical blog . RT VERSION - Works with RT 5. + Works with RT 6. INSTALLATION perl Makefile.PL @@ -18,13 +18,13 @@ INSTALLATION make install May need root permissions. - Edit your /opt/rt5/etc/RT_SiteConfig.pm + Edit your /opt/rt6/etc/RT_SiteConfig.pm Add this line: Plugin('RT::Extension::TerminalTheme'); Clear your mason cache - rm -rf /opt/rt5/var/mason_data/obj + rm -rf /opt/rt6/var/mason_data/obj Restart your webserver diff --git a/html/Callbacks/RT-Extension-TerminalTheme/Elements/Header/Head b/html/Callbacks/RT-Extension-TerminalTheme/Elements/Header/Head index 81ac4a4..5d4c64c 100644 --- a/html/Callbacks/RT-Extension-TerminalTheme/Elements/Header/Head +++ b/html/Callbacks/RT-Extension-TerminalTheme/Elements/Header/Head @@ -1,6 +1,7 @@ <%INIT> -return unless RT->Config->Get( 'WebDefaultStylesheet', $session{CurrentUser} ) =~ /^terminal-(?:light|dark)$/; -$ARGSRef->{LogoURL} = RT->Config->Get('WebImagesURL') . "terminal-request-tracker-logo.svg"; +return unless RT->Config->Get( 'WebDefaultStylesheet', $session{CurrentUser} ) eq 'terminal'; +$ARGSRef->{LogoURL} = RT->Config->Get('WebImagesURL') . "terminal-request-tracker-logo.svg"; +$ARGSRef->{SmallLogoURL} = RT->Config->Get('WebImagesURL') . "terminal-request-tracker-logo.svg"; <%ARGS> diff --git a/html/NoAuth/css/terminal/AfterMenus b/html/NoAuth/css/terminal/AfterMenus new file mode 100644 index 0000000..e763c9d --- /dev/null +++ b/html/NoAuth/css/terminal/AfterMenus @@ -0,0 +1,23 @@ + diff --git a/html/NoAuth/css/terminal/BeforeNav b/html/NoAuth/css/terminal/BeforeNav new file mode 100644 index 0000000..2accf6a --- /dev/null +++ b/html/NoAuth/css/terminal/BeforeNav @@ -0,0 +1,118 @@ +<%INIT> +return unless Menu; # In case we are in Installer mode + +my $page_overflow = PageMenu->child( overflow => title => loc('More'), sort_order => 99999); +# add a child element to make sure we get a dropdown indicator +$page_overflow->child(will_be_deleted => raw_html => ''); + + diff --git a/html/NoAuth/css/terminal/InHeader b/html/NoAuth/css/terminal/InHeader new file mode 100644 index 0000000..1803d71 --- /dev/null +++ b/html/NoAuth/css/terminal/InHeader @@ -0,0 +1,4 @@ + +% if ( $m->request_path eq '/Dashboards/Render.html' && !$m->request_args->{Preview} ) { + +% } diff --git a/lib/RT/Extension/TerminalTheme.pm b/lib/RT/Extension/TerminalTheme.pm index 4539f77..08cc5aa 100644 --- a/lib/RT/Extension/TerminalTheme.pm +++ b/lib/RT/Extension/TerminalTheme.pm @@ -2,7 +2,7 @@ use strict; use warnings; package RT::Extension::TerminalTheme; -our $VERSION = '0.01'; +our $VERSION = '0.02'; =head1 NAME @@ -10,14 +10,13 @@ RT-Extension-TerminalTheme - Classic "green screen" terminal theme for RT =head1 DESCRIPTION -Provides a theme with light and dark modes that resemble a classic CRT "green -screen" terminal and serve as a good example of how to theme Request Tracker. -You can L about -this theme on the L. +Provides a theme that resembles a classic CRT "green screen" terminal. +Supports both light (pale-green tinted) and dark (phosphor-green on black) +modes via Bootstrap 5's C mechanism. =head1 RT VERSION -Works with RT 5. +Works with RT 6. =head1 INSTALLATION @@ -31,15 +30,22 @@ Works with RT 5. May need root permissions. -=item Edit your F +=item Edit your F -Add this line: +Add these lines: Plugin('RT::Extension::TerminalTheme'); + Set($WebDefaultStylesheet, 'terminal'); + +To default to dark (phosphor-green) mode, also add: + + Set($WebDefaultThemeMode, 'dark'); + +Users can still override the theme mode in their personal preferences. =item Clear your mason cache - rm -rf /opt/rt5/var/mason_data/obj + rm -rf /opt/rt6/var/mason_data/obj =item Restart your webserver @@ -62,7 +68,7 @@ href="http://rt.cpan.org/Public/Dist/Display.html?Name=RT-Extension-TerminalThem =head1 LICENSE AND COPYRIGHT -This software is Copyright (c) 2021 by Best Practical Solutions, LLC +This software is Copyright (c) 2021-2025 by Best Practical Solutions, LLC This is free software, licensed under: diff --git a/static/css/terminal/main.css b/static/css/terminal/main.css new file mode 100644 index 0000000..62ffd3d --- /dev/null +++ b/static/css/terminal/main.css @@ -0,0 +1,2 @@ +@import "../elevator/main.css"; +@import "terminal.css"; diff --git a/static/css/terminal/terminal.css b/static/css/terminal/terminal.css new file mode 100644 index 0000000..304ffbc --- /dev/null +++ b/static/css/terminal/terminal.css @@ -0,0 +1,444 @@ +/* =================================================================== + * RT Terminal Theme — Bootstrap 5 color & style overrides for RT6 + * + * Light mode: pale-green CRT screen aesthetic + * Dark mode: classic phosphor green on near-black + * =================================================================== */ + +/* --- CSS custom properties used throughout the theme -------------- */ +:root { + --terminal-green-bright: #33ff33; + --terminal-green-mid: #22cc22; + --terminal-green-dim: #1a8a1a; + --terminal-green-dark: #0d4a0d; + --terminal-near-black: #050f05; + --terminal-font: 'Courier New', 'DejaVu Sans Mono', 'Lucida Console', Courier, monospace; +} + +/* Monospace font for content areas — not navbar (would break layout/overflow calc) */ +body, +.titlebox .titlebox-title .left, +.form-control, +.form-select, +textarea, +table, +.badge, +pre, code, tt { + font-family: var(--terminal-font); +} + +/* Fix terminal logo aspect ratio (SVG has wrong width/height vs viewBox 858×144) */ +div#logo a img { + aspect-ratio: 858 / 144 !important; + height: 100% !important; + width: auto !important; +} + + +/* =================================================================== + * LIGHT MODE — pale-green tinted screen + * =================================================================== */ +[data-bs-theme=light] { + /* Bootstrap 5 core */ + --bs-body-color: #0d2b0d; + --bs-body-color-rgb: 13, 43, 13; + --bs-body-bg: #f2f7ed; + --bs-body-bg-rgb: 242, 247, 237; + + --bs-primary: #2d7a2d; + --bs-primary-rgb: 45, 122, 45; + + --bs-link-color: #145214; + --bs-link-color-rgb: 20, 82, 20; + --bs-link-hover-color: #0a2a0a; + --bs-link-hover-color-rgb: 10, 42, 10; + --bs-link-decoration: none; + + --bs-border-color: #8ab58a; + --bs-border-color-translucent: rgba(138, 181, 138, 0.18); + + --bs-card-bg: #eaf2e4; + --bs-card-border-color: #8ab58a; + + --bs-secondary-bg: #e2eedb; + --bs-tertiary-bg: #d5e8cc; + + /* Gray scale shifted to greens */ + --bs-gray-100: #eef5e8; + --bs-gray-200: #deecd6; + --bs-gray-300: #bdd9b5; + --bs-gray-400: #8ab58a; + --bs-gray-500: #5a9a5a; + --bs-gray-600: #3d7a3d; + --bs-gray-700: #2a602a; + --bs-gray-800: #1a4a1a; + --bs-gray-900: #0a2200; +} + +[data-bs-theme=light] { + h1, h2, h3, h4 { color: #0a2200; } + + a:not(.btn):visited { color: #4a8a4a; } + + /* ----- Header bar & logo area --------------------------------- */ + div#quickbar { + background-color: #0a1a0a; + border-bottom-color: #22aa22; + } + + div#footer { + background-color: #0a1a0a; + } + div#footer p, + div#footer a { color: #22cc22; } + + div#header { border-bottom-color: #2d7a2d; } + + /* ----- Main navigation (dark bar with green text) ------------- */ + .navbar { background-color: #0a1a0a; } + + .navbar a.nav-link, + .navbar li a { color: #22cc22 !important; } + + .navbar a.nav-link:hover, + #app-nav > li > a:hover { + background-color: #1a3a1a; + color: #44ff44 !important; + } + + body.keyboard-nav-active #app-nav > li > a.menu-item:focus, + body.keyboard-nav-active .page-menu > li > a.menu-item:focus { + background: #1a3a1a; + } + + /* ----- Dropdown menus ----------------------------------------- */ + .dropdown-menu { + background-color: #0f2a0f; + border-color: #2d7a2d; + } + + .dropdown-item, + a.dropdown-item { color: #22cc22; background-color: #0f2a0f; } + + a.dropdown-item.hovered, + .dropdown-item:hover, + .dropdown-item:focus { background-color: #1a3a1a; color: #44ff44; } + + .dropdown-divider { border-color: #1a4a1a; } + + /* ----- Page menu pinned to top --------------------------------- */ + .page-menu.pinned { + background-color: #f2f7ed; + border-left-color: #8ab58a; + border-bottom-color: #8ab58a; + box-shadow: 0 0 10px rgba(0, 80, 0, 0.2); + } + + .page-menu.pinned li:hover ul { + border-left-color: #8ab58a; + border-right-color: #8ab58a; + } + + /* ----- TitleBox (card component) ------------------------------ */ + .titlebox { border-color: #8ab58a; } + + /* elevator sets card-header to font-size:larger and .left to 1.1em on top; + reset to 1rem so the monospace font doesn't compound into oversized headers */ + .titlebox .card-header { font-size: 1rem; } + + .titlebox .titlebox-title { background-color: #2d7a2d; color: #f2f7ed; } + + .titlebox .titlebox-title .left, + .titlebox .titlebox-title .left a, + .titlebox .titlebox-title .left a:visited { color: #f2f7ed; } + + /* Headings inside title bar get dark green from the h1-h4 rule above; + override to keep them readable on the dark green background */ + .titlebox .titlebox-title h1, + .titlebox .titlebox-title h2, + .titlebox .titlebox-title h3, + .titlebox .titlebox-title h4 { color: #f2f7ed; } + + .titlebox .titlebox-title .right a, + .titlebox .titlebox-title .right a:visited { color: #d0f0d0; } + + /* ----- Tables -------------------------------------------------- */ + .table { --bs-table-hover-bg: #deecd6; } + + .table-active { --bs-table-bg-state: #deecd6; } + + /* ----- Buttons ------------------------------------------------- */ + .btn-primary, + input[type=submit].btn-primary, + input[type=button].btn-primary { + background-color: #2d7a2d; + border-color: #1a4a1a; + color: #f2f7ed; + } + .btn-primary:hover { + background-color: #1a6a1a; + border-color: #0a2a0a; + } + + .btn-secondary, + .btn-default { + border-color: #8ab58a; + color: #0d2b0d; + } + + /* Topactions: "Create new ticket" and search */ + #topactions form input.btn, + #topactions .btn { + border-color: #2d7a2d; + background-color: #1a4a1a; + color: #d0f0d0; + } + #topactions form input.btn:hover, + #topactions .btn:hover { + background-color: #2d7a2d; + color: #f2f7ed; + } + + /* Form inputs */ + .form-control, + .form-select, + input[type=text], + input[type=search], + input[type=email] { + background-color: #f8fdf5; + color: #0d2b0d; + border-color: #8ab58a; + } + .form-control:focus, + .form-select:focus { + border-color: #2d7a2d; + box-shadow: 0 0 0 0.25rem rgba(45, 122, 45, 0.2); + } + + /* ----- Login page --------------------------------------------- */ + #login-box { border-color: #2d7a2d; } + + /* ----- Alerts -------------------------------------------------- */ + .alert-info { + background-color: #deecd6; + border-color: #8ab58a; + color: #0d2b0d; + } + + /* ----- Status badges — make them terminal-green -------------- */ + .badge.bg-success, + .badge.bg-primary { background-color: #2d7a2d !important; } + + .badge.bg-secondary { background-color: #5a9a5a !important; } + + /* RT status color overrides for ticket status badges */ + span.rt-status-new, + .label-status-new { background-color: #1a4a1a !important; color: #d0f0d0 !important; } +} + + +/* =================================================================== + * DARK MODE — classic phosphor green on near-black + * =================================================================== */ +[data-bs-theme=dark] { + /* Bootstrap 5 core */ + --bs-body-color: #33ff33; + --bs-body-color-rgb: 51, 255, 51; + --bs-body-bg: #050f05; + --bs-body-bg-rgb: 5, 15, 5; + + --bs-primary: #00cc44; + --bs-primary-rgb: 0, 204, 68; + + --bs-link-color: #00ff66; + --bs-link-color-rgb: 0, 255, 102; + --bs-link-hover-color: #66ff99; + --bs-link-hover-color-rgb: 102, 255, 153; + --bs-link-decoration: none; + + --bs-border-color: #1a5a1a; + --bs-border-color-translucent: rgba(26, 90, 26, 0.18); + + --bs-card-bg: #0a1a0a; + --bs-card-border-color: #1a5a1a; + + --bs-secondary-color: rgba(26, 170, 26, 0.75); + --bs-secondary-bg: #0a1a0a; + --bs-tertiary-bg: #081208; + + /* Gray scale shifted to dark greens */ + --bs-gray-100: #0d1a0d; + --bs-gray-200: #112211; + --bs-gray-300: #1a3a1a; + --bs-gray-400: #225522; + --bs-gray-500: #2a6e2a; + --bs-gray-600: #338833; + --bs-gray-700: #44aa44; + --bs-gray-800: #55cc55; + --bs-gray-900: #66ee66; +} + +[data-bs-theme=dark] { + p, li span { color: #33ff33; } + + h1, h2, h3, h4 { color: #44ff44; } + + /* Subtle glow on large headings for phosphor effect */ + h1 { text-shadow: 0 0 10px rgba(0, 255, 51, 0.35); } + h2 { text-shadow: 0 0 8px rgba(0, 255, 51, 0.25); } + + svg { fill: #33ff33; } + + a:not(.btn):visited { color: #22aa22; } + + /* ----- Header bar & logo area --------------------------------- */ + div#quickbar { + background-color: #030803; + border-bottom-color: #1a5a1a; + } + + div#footer { + background-color: #030803; + border-top: 1px solid #1a5a1a; + } + div#footer p, + div#footer a { color: #1aaa1a; } + + div#header { border-bottom-color: #00cc44; } + + /* ----- Main navigation ---------------------------------------- */ + .navbar { background-color: #030803; } + + .navbar li a { color: #22cc22 !important; } + + #app-nav > li > a.menu-item:hover, + .navbar a.nav-link:hover { + background: #0a2a0a; + color: #44ff44 !important; + } + + body.keyboard-nav-active #app-nav > li > a.menu-item:focus, + body.keyboard-nav-active .page-menu > li > a.menu-item:focus { + background: #0a2a0a; + } + + /* ----- Dropdown menus ----------------------------------------- */ + .dropdown-menu { background: #0a1a0a; border-color: #1a5a1a; } + + .dropdown-item, + .dropdown-item *, + a.dropdown-item { background: #0a1a0a; color: #22cc22; } + + .dropdown-divider { border-color: #1a2a1a; } + + .dropdown-item.hovered, + .dropdown-item:hover, + .dropdown-item:focus { background: #112211; color: #44ff44; } + + /* ----- Page menu pinned --------------------------------------- */ + .page-menu.pinned { + background-color: #0a1a0a; + box-shadow: 0 0 10px rgba(0, 204, 68, 0.12); + } + .page-menu.pinned ul { + border-color: #1a5a1a; + } + .page-menu.pinned li:hover ul { + border-left-color: #1a5a1a; + border-right-color: #1a5a1a; + } + + /* ----- Tables -------------------------------------------------- */ + .table td { color: #33ff33; } + table.table th { border: none; color: #44ff44; } + .table th, .table td { border-top: 1px solid #1a5a1a; } + table a:visited { color: #22aa22; } + .table { --bs-table-hover-bg: #0f2a0f; } + .table-active { --bs-table-bg-state: #0f2a0f; } + + /* ----- Nav tabs / pills --------------------------------------- */ + .nav-tabs { border-bottom: 1px solid #1a5a1a; } + + .nav-tabs .nav-link:hover, + .nav-tabs .nav-link.active { + border-color: #1a5a1a; + background-color: #0a1a0a; + color: #44ff44; + } + + .nav-pills .nav-link.active { background-color: #1a3a1a !important; } + + /* ----- Forms --------------------------------------------------- */ + .form-control, + .form-select { + background-color: #0a1a0a; + color: #33ff33; + border-color: #1a5a1a; + } + + .form-control:focus, + .form-select:focus { + background-color: #0a1a0a; + color: #44ff44; + border-color: #2d7a2d; + box-shadow: 0 0 0 0.25rem rgba(0, 204, 68, 0.2); + } + + .form-control::placeholder { color: #1a5a1a; } + + .input-group-text { + background-color: #0d2a0d; + color: #22cc22; + border-color: #1a5a1a; + } + + /* ----- Buttons ------------------------------------------------ */ + .btn-primary { + background-color: #0d3d0d; + color: #33ff33; + border-color: #1a5a1a; + } + .btn-primary:hover { + background-color: #1a5a1a; + border-color: #2d7a2d; + color: #44ff44; + } + + .btn-secondary, + .btn-default { + background-color: #0a1a0a; + color: #22cc22; + border-color: #1a5a1a; + } + .btn-secondary:hover, + .btn-default:hover { + background-color: #112211; + color: #44ff44; + } + + /* ----- Cards / TitleBox --------------------------------------- */ + .card { + background-color: #0a1a0a; + border-color: #1a5a1a; + } + .titlebox { border-color: #1a5a1a; } + + /* ----- Badges ------------------------------------------------- */ + .badge { font-family: var(--terminal-font); } + + /* ----- Login page --------------------------------------------- */ + #login-box { border-color: #1a5a1a; } + + /* ----- jGrowl notifications ----------------------------------- */ + .jGrowl-notification { + background-color: #0a1a0a; + color: #33ff33; + border: 1px solid #1a5a1a; + } + + /* ----- Custom scrollbar (WebKit) ------------------------------ */ + ::-webkit-scrollbar { width: 8px; background-color: #050f05; } + ::-webkit-scrollbar-thumb { background-color: #1a5a1a; border-radius: 4px; } + ::-webkit-scrollbar-thumb:hover { background-color: #2d7a2d; } + ::-webkit-scrollbar-track { background-color: #050f05; } +}