profles_and_ux #7

Merged
gru merged 10 commits from profles_and_ux into master 2026-05-27 14:38:06 +02:00
16 changed files with 1411 additions and 12 deletions
Showing only changes of commit 869af8756f - Show all commits

View File

@@ -55,6 +55,10 @@ PYTORRENT_APP_THEMES = {
"nord": "pyTorrent Nord", "nord": "pyTorrent Nord",
"crimson": "pyTorrent Crimson", "crimson": "pyTorrent Crimson",
"sky": "pyTorrent Sky", "sky": "pyTorrent Sky",
"bootstrap22": "Bootstrap 2 Classic",
"bootstrap22-inverse": "Bootstrap 2 Inverse",
"bootstrap3": "Bootstrap 3 Glyph",
"bootstrap3-inverse": "Bootstrap 3 Inverse",
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,247 @@
/* Note: Bootstrap 2 Inverse keeps the old beveled control language with darker navigation chrome. */
:root {
--bs-border-radius: 4px;
--bs-border-radius-sm: 3px;
--bs-border-radius-lg: 5px;
--bs-font-sans-serif: "Helvetica Neue", Arial, sans-serif;
}
[data-bs-theme="light"] {
--bs-body-bg: #eceff1;
--bs-body-color: #2f2f2f;
--bs-primary: #2f96b4;
--bs-primary-rgb: 47, 150, 180;
--bs-secondary-bg: #d9dee2;
--bs-secondary-bg-rgb: 217, 222, 226;
--bs-secondary-color: #4d5963;
--bs-tertiary-bg: #ffffff;
--bs-border-color: #b8c0c7;
--bs-link-color: #2f96b4;
}
[data-bs-theme="dark"] {
--bs-body-bg: #161a1d;
--bs-body-color: #e7ecef;
--bs-primary: #49afcd;
--bs-primary-rgb: 73, 175, 205;
--bs-secondary-bg: #252b30;
--bs-secondary-bg-rgb: 37, 43, 48;
--bs-secondary-color: #c9d3da;
--bs-tertiary-bg: #20262a;
--bs-border-color: #48535c;
--bs-link-color: #5bc0de;
}
/* Note: Bootstrap 2 surfaces were simple grey panels with subtle inset highlights. */
.card,
.dropdown-menu,
.modal-content,
.surface-section,
.smart-setting-row,
.table,
.toast {
background-image: linear-gradient(#ffffff, #f7f7f7);
border: 1px solid var(--bs-border-color);
border-radius: 4px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55), 0 1px 2px rgba(0, 0, 0, 0.08);
}
[data-bs-theme="dark"] .card,
[data-bs-theme="dark"] .dropdown-menu,
[data-bs-theme="dark"] .modal-content,
[data-bs-theme="dark"] .surface-section,
[data-bs-theme="dark"] .smart-setting-row,
[data-bs-theme="dark"] .table,
[data-bs-theme="dark"] .toast {
background-image: linear-gradient(#303840, #252c33);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 1px 2px rgba(0, 0, 0, 0.25);
}
.btn {
border-color: rgba(0, 0, 0, 0.22);
border-radius: 4px;
border-width: 1px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.38), 0 1px 2px rgba(0, 0, 0, 0.08);
font-weight: 600;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease;
}
.btn:hover {
filter: none;
text-decoration: none;
}
.btn:focus-visible {
box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .32);
filter: none;
text-decoration: none;
}
.btn-primary {
background-image: linear-gradient(#08c, #04c);
border-color: #0044cc #0044cc #002a80;
color: #ffffff;
}
.btn-primary:hover,
.btn-primary:focus-visible {
background-image: linear-gradient(#0077d9, #003bb3);
border-color: #003bb3 #003bb3 #001f66;
}
.btn-success,
.btn-success:hover,
.btn-success:focus-visible {
background-image: linear-gradient(#62c462, #51a351);
border-color: #51a351 #51a351 #387038;
color: #ffffff;
}
.btn-danger,
.btn-danger:hover,
.btn-danger:focus-visible {
background-image: linear-gradient(#ee5f5b, #bd362f);
border-color: #bd362f #bd362f #802420;
color: #ffffff;
}
.btn-secondary,
.btn-outline-secondary,
.btn-light {
background-image: linear-gradient(#ffffff, #e6e6e6);
border-color: #cccccc #cccccc #b3b3b3;
color: #333333;
}
.btn-outline-primary,
.btn-outline-success,
.btn-outline-danger,
.btn-outline-warning,
.btn-outline-info {
background-color: var(--bs-body-bg);
}
.btn-outline-primary:hover,
.btn-outline-primary:focus-visible,
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
background-image: linear-gradient(#08c, #04c);
color: #ffffff;
}
.btn-outline-success:hover,
.btn-outline-success:focus-visible {
background-image: linear-gradient(#62c462, #51a351);
color: #ffffff;
}
.btn-outline-danger:hover,
.btn-outline-danger:focus-visible {
background-image: linear-gradient(#ee5f5b, #bd362f);
color: #ffffff;
}
.btn-outline-warning:hover,
.btn-outline-warning:focus-visible {
background-image: linear-gradient(#fbb450, #f89406);
color: #111111;
}
.btn-outline-info:hover,
.btn-outline-info:focus-visible {
background-image: linear-gradient(#5bc0de, #2f96b4);
color: #ffffff;
}
.btn-secondary:hover,
.btn-secondary:focus-visible,
.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible {
background-image: linear-gradient(#e6e6e6, #cfcfcf);
border-color: #adadad;
color: #222222;
}
[data-bs-theme="dark"] .btn-secondary,
[data-bs-theme="dark"] .btn-outline-secondary,
[data-bs-theme="dark"] .btn-light {
background-image: linear-gradient(#4b545d, #303840);
border-color: #5c6670;
color: #f0f0f0;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.45);
}
[data-bs-theme="dark"] .btn-secondary:hover,
[data-bs-theme="dark"] .btn-secondary:focus-visible,
[data-bs-theme="dark"] .btn-outline-secondary:hover,
[data-bs-theme="dark"] .btn-outline-secondary:focus-visible {
background-image: linear-gradient(#68737e, #48515a);
color: #ffffff;
}
.form-control,
.form-select,
.input-group-text {
border: 1px solid #cccccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.form-control:focus,
.form-select:focus {
border-color: rgba(82, 168, 236, 0.8);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
}
.modal-header,
.card-header,
.dropdown-header,
.table thead th {
background-image: linear-gradient(#f9f9f9, #eeeeee);
border-bottom: 1px solid var(--bs-border-color);
color: var(--bs-body-color);
font-weight: 700;
}
[data-bs-theme="dark"] .modal-header,
[data-bs-theme="dark"] .card-header,
[data-bs-theme="dark"] .dropdown-header,
[data-bs-theme="dark"] .table thead th {
background-image: linear-gradient(#39434c, #2c343b);
}
.badge,
.label {
border-radius: 3px;
}
.alert {
border-radius: 3px;
border-width: 1px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.35);
}
.progress {
background-image: linear-gradient(#f5f5f5, #e6e6e6);
border-radius: 3px;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.18);
}
.progress-bar {
background-image: linear-gradient(#149bdf, #0480be);
}
.table > :not(caption) > * > * {
border-bottom-color: var(--bs-border-color);
}
/* Note: Inverse variant reproduces the dark Bootstrap 2 navbar strip. */
.navbar,
.sidebar,
.topbar {
background-image: linear-gradient(#444444, #222222);
border-color: #252525;
color: #eeeeee;
}

View File

@@ -0,0 +1,237 @@
/* Note: Bootstrap 2 Classic maps the app UI to the old beveled Bootstrap 2 control language. */
:root {
--bs-border-radius: 4px;
--bs-border-radius-sm: 3px;
--bs-border-radius-lg: 5px;
--bs-font-sans-serif: "Helvetica Neue", Arial, sans-serif;
}
[data-bs-theme="light"] {
--bs-body-bg: #f5f5f5;
--bs-body-color: #333333;
--bs-primary: #006dcc;
--bs-primary-rgb: 0, 109, 204;
--bs-secondary-bg: #eeeeee;
--bs-secondary-bg-rgb: 238, 238, 238;
--bs-secondary-color: #555555;
--bs-tertiary-bg: #ffffff;
--bs-border-color: #c8c8c8;
--bs-link-color: #0088cc;
}
[data-bs-theme="dark"] {
--bs-body-bg: #1f252b;
--bs-body-color: #e6e6e6;
--bs-primary: #4aa3df;
--bs-primary-rgb: 74, 163, 223;
--bs-secondary-bg: #2f363d;
--bs-secondary-bg-rgb: 47, 54, 61;
--bs-secondary-color: #c7d0d8;
--bs-tertiary-bg: #252b31;
--bs-border-color: #4a535c;
--bs-link-color: #6bbdf0;
}
/* Note: Bootstrap 2 surfaces were simple grey panels with subtle inset highlights. */
.card,
.dropdown-menu,
.modal-content,
.surface-section,
.smart-setting-row,
.table,
.toast {
background-image: linear-gradient(#ffffff, #f7f7f7);
border: 1px solid var(--bs-border-color);
border-radius: 4px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55), 0 1px 2px rgba(0, 0, 0, 0.08);
}
[data-bs-theme="dark"] .card,
[data-bs-theme="dark"] .dropdown-menu,
[data-bs-theme="dark"] .modal-content,
[data-bs-theme="dark"] .surface-section,
[data-bs-theme="dark"] .smart-setting-row,
[data-bs-theme="dark"] .table,
[data-bs-theme="dark"] .toast {
background-image: linear-gradient(#303840, #252c33);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 1px 2px rgba(0, 0, 0, 0.25);
}
.btn {
border-color: rgba(0, 0, 0, 0.22);
border-radius: 4px;
border-width: 1px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.38), 0 1px 2px rgba(0, 0, 0, 0.08);
font-weight: 600;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease;
}
.btn:hover {
filter: none;
text-decoration: none;
}
.btn:focus-visible {
box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .32);
filter: none;
text-decoration: none;
}
.btn-primary {
background-image: linear-gradient(#08c, #04c);
border-color: #0044cc #0044cc #002a80;
color: #ffffff;
}
.btn-primary:hover,
.btn-primary:focus-visible {
background-image: linear-gradient(#0077d9, #003bb3);
border-color: #003bb3 #003bb3 #001f66;
}
.btn-success,
.btn-success:hover,
.btn-success:focus-visible {
background-image: linear-gradient(#62c462, #51a351);
border-color: #51a351 #51a351 #387038;
color: #ffffff;
}
.btn-danger,
.btn-danger:hover,
.btn-danger:focus-visible {
background-image: linear-gradient(#ee5f5b, #bd362f);
border-color: #bd362f #bd362f #802420;
color: #ffffff;
}
.btn-secondary,
.btn-outline-secondary,
.btn-light {
background-image: linear-gradient(#ffffff, #e6e6e6);
border-color: #cccccc #cccccc #b3b3b3;
color: #333333;
}
.btn-outline-primary,
.btn-outline-success,
.btn-outline-danger,
.btn-outline-warning,
.btn-outline-info {
background-color: var(--bs-body-bg);
}
.btn-outline-primary:hover,
.btn-outline-primary:focus-visible,
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
background-image: linear-gradient(#08c, #04c);
color: #ffffff;
}
.btn-outline-success:hover,
.btn-outline-success:focus-visible {
background-image: linear-gradient(#62c462, #51a351);
color: #ffffff;
}
.btn-outline-danger:hover,
.btn-outline-danger:focus-visible {
background-image: linear-gradient(#ee5f5b, #bd362f);
color: #ffffff;
}
.btn-outline-warning:hover,
.btn-outline-warning:focus-visible {
background-image: linear-gradient(#fbb450, #f89406);
color: #111111;
}
.btn-outline-info:hover,
.btn-outline-info:focus-visible {
background-image: linear-gradient(#5bc0de, #2f96b4);
color: #ffffff;
}
.btn-secondary:hover,
.btn-secondary:focus-visible,
.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible {
background-image: linear-gradient(#e6e6e6, #cfcfcf);
border-color: #adadad;
color: #222222;
}
[data-bs-theme="dark"] .btn-secondary,
[data-bs-theme="dark"] .btn-outline-secondary,
[data-bs-theme="dark"] .btn-light {
background-image: linear-gradient(#4b545d, #303840);
border-color: #5c6670;
color: #f0f0f0;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.45);
}
[data-bs-theme="dark"] .btn-secondary:hover,
[data-bs-theme="dark"] .btn-secondary:focus-visible,
[data-bs-theme="dark"] .btn-outline-secondary:hover,
[data-bs-theme="dark"] .btn-outline-secondary:focus-visible {
background-image: linear-gradient(#68737e, #48515a);
color: #ffffff;
}
.form-control,
.form-select,
.input-group-text {
border: 1px solid #cccccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.form-control:focus,
.form-select:focus {
border-color: rgba(82, 168, 236, 0.8);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
}
.modal-header,
.card-header,
.dropdown-header,
.table thead th {
background-image: linear-gradient(#f9f9f9, #eeeeee);
border-bottom: 1px solid var(--bs-border-color);
color: var(--bs-body-color);
font-weight: 700;
}
[data-bs-theme="dark"] .modal-header,
[data-bs-theme="dark"] .card-header,
[data-bs-theme="dark"] .dropdown-header,
[data-bs-theme="dark"] .table thead th {
background-image: linear-gradient(#39434c, #2c343b);
}
.badge,
.label {
border-radius: 3px;
}
.alert {
border-radius: 3px;
border-width: 1px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.35);
}
.progress {
background-image: linear-gradient(#f5f5f5, #e6e6e6);
border-radius: 3px;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.18);
}
.progress-bar {
background-image: linear-gradient(#149bdf, #0480be);
}
.table > :not(caption) > * > * {
border-bottom-color: var(--bs-border-color);
}

View File

@@ -0,0 +1,268 @@
/* Note: Bootstrap 3 Inverse keeps the dark navbar era with Bootstrap 3 panel and button shapes. */
:root {
--bs-border-radius: 4px;
--bs-border-radius-sm: 3px;
--bs-border-radius-lg: 4px;
--bs-font-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
[data-bs-theme="light"] {
--bs-body-bg: #eceff2;
--bs-body-color: #2d3338;
--bs-primary: #428bca;
--bs-primary-rgb: 66, 139, 202;
--bs-success: #5cb85c;
--bs-danger: #d9534f;
--bs-warning: #f0ad4e;
--bs-info: #5bc0de;
--bs-secondary-bg: #dfe4e8;
--bs-secondary-bg-rgb: 223, 228, 232;
--bs-secondary-color: #4c5963;
--bs-tertiary-bg: #ffffff;
--bs-border-color: #c5cdd4;
--bs-link-color: #2a6496;
}
[data-bs-theme="dark"] {
--bs-body-bg: #151a1f;
--bs-body-color: #edf2f6;
--bs-primary: #6fb4eb;
--bs-primary-rgb: 111, 180, 235;
--bs-success: #7dd37d;
--bs-danger: #ec7773;
--bs-warning: #f6c572;
--bs-info: #83d8ee;
--bs-secondary-bg: #232b33;
--bs-secondary-bg-rgb: 35, 43, 51;
--bs-secondary-color: #c3ccd4;
--bs-tertiary-bg: #1d242b;
--bs-border-color: #3f4b56;
--bs-link-color: #94cdf5;
}
/* Note: Bootstrap 3 panels and wells are represented through shared app containers. */
.card,
.dropdown-menu,
.modal-content,
.surface-section,
.smart-setting-row,
.toast {
background-color: var(--bs-tertiary-bg);
border: 1px solid var(--bs-border-color);
border-radius: 4px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
.navbar,
.topbar {
background-image: linear-gradient(#ffffff, #f2f2f2);
border-bottom: 1px solid var(--bs-border-color);
}
[data-bs-theme="dark"] .navbar,
[data-bs-theme="dark"] .topbar {
background-image: linear-gradient(#303941, #20272e);
}
.btn {
border-width: 1px;
border-radius: 4px;
font-weight: 600;
transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease;
}
.btn:hover {
filter: none;
text-decoration: none;
}
.btn:focus-visible {
box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .32);
filter: none;
text-decoration: none;
}
.btn-primary {
background-image: linear-gradient(#428bca, #2d6ca2);
border-color: #2b669a;
color: #ffffff;
}
.btn-primary:hover,
.btn-primary:focus-visible,
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
background-color: #2d6ca2;
color: #ffffff;
}
.btn-success,
.btn-success:hover,
.btn-success:focus-visible {
background-color: #5cb85c;
border-color: #4cae4c;
color: #ffffff;
}
.btn-danger,
.btn-danger:hover,
.btn-danger:focus-visible {
background-color: #d9534f;
border-color: #d43f3a;
color: #ffffff;
}
.btn-warning,
.btn-warning:hover,
.btn-warning:focus-visible {
background-color: #f0ad4e;
border-color: #eea236;
color: #111111;
}
.btn-info,
.btn-info:hover,
.btn-info:focus-visible {
background-color: #5bc0de;
border-color: #46b8da;
color: #ffffff;
}
.btn-secondary,
.btn-outline-secondary,
.btn-light {
background-color: #ffffff;
border-color: #cccccc;
color: #333333;
}
.btn-outline-primary,
.btn-outline-success,
.btn-outline-danger,
.btn-outline-warning,
.btn-outline-info {
background-color: var(--bs-body-bg);
}
.btn-outline-primary:hover,
.btn-outline-primary:focus-visible {
background-color: var(--bs-primary);
border-color: var(--bs-primary);
color: #ffffff;
}
.btn-outline-success:hover,
.btn-outline-success:focus-visible {
background-color: var(--bs-success);
border-color: var(--bs-success);
color: #ffffff;
}
.btn-outline-danger:hover,
.btn-outline-danger:focus-visible {
background-color: var(--bs-danger);
border-color: var(--bs-danger);
color: #ffffff;
}
.btn-outline-warning:hover,
.btn-outline-warning:focus-visible {
background-color: var(--bs-warning);
border-color: var(--bs-warning);
color: #111111;
}
.btn-outline-info:hover,
.btn-outline-info:focus-visible {
background-color: var(--bs-info);
border-color: var(--bs-info);
color: #111111;
}
.btn-secondary:hover,
.btn-secondary:focus-visible,
.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible {
background-color: #e6e6e6;
border-color: #adadad;
color: #222222;
}
[data-bs-theme="dark"] .btn-secondary,
[data-bs-theme="dark"] .btn-outline-secondary,
[data-bs-theme="dark"] .btn-light {
background-color: #323b44;
border-color: #53606b;
color: #edf2f6;
}
[data-bs-theme="dark"] .btn-secondary:hover,
[data-bs-theme="dark"] .btn-secondary:focus-visible,
[data-bs-theme="dark"] .btn-outline-secondary:hover,
[data-bs-theme="dark"] .btn-outline-secondary:focus-visible {
background-color: #46515b;
color: #ffffff;
}
.form-control,
.form-select,
.input-group-text {
border: 1px solid #cccccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.form-control:focus,
.form-select:focus {
border-color: #66afe9;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.card-header,
.modal-header,
.table thead th {
background-color: #f5f5f5;
border-bottom: 1px solid var(--bs-border-color);
color: var(--bs-body-color);
font-weight: 700;
}
[data-bs-theme="dark"] .card-header,
[data-bs-theme="dark"] .modal-header,
[data-bs-theme="dark"] .table thead th {
background-color: #303941;
}
.badge,
.label {
border-radius: 4px;
}
.alert {
border-radius: 4px;
border-width: 1px;
}
.progress {
background-color: #f5f5f5;
border-radius: 4px;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.progress-bar {
background-image: linear-gradient(#5bc0de, #339bb9);
}
.table > :not(caption) > * > * {
border-bottom-color: var(--bs-border-color);
}
/* Note: Inverse variant reproduces Bootstrap 3's dark default navbar treatment. */
.navbar,
.sidebar,
.topbar {
background-image: linear-gradient(#3c3c3c, #222222);
border-color: #080808;
color: #eeeeee;
}

View File

@@ -0,0 +1,258 @@
/* Note: Bootstrap 3 Glyph uses flat panels, square controls and the Bootstrap 3 palette. */
:root {
--bs-border-radius: 4px;
--bs-border-radius-sm: 3px;
--bs-border-radius-lg: 4px;
--bs-font-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
[data-bs-theme="light"] {
--bs-body-bg: #f8f8f8;
--bs-body-color: #333333;
--bs-primary: #337ab7;
--bs-primary-rgb: 51, 122, 183;
--bs-success: #5cb85c;
--bs-danger: #d9534f;
--bs-warning: #f0ad4e;
--bs-info: #5bc0de;
--bs-secondary-bg: #eeeeee;
--bs-secondary-bg-rgb: 238, 238, 238;
--bs-secondary-color: #555555;
--bs-tertiary-bg: #ffffff;
--bs-border-color: #dddddd;
--bs-link-color: #337ab7;
}
[data-bs-theme="dark"] {
--bs-body-bg: #1f252b;
--bs-body-color: #e7edf2;
--bs-primary: #5dade2;
--bs-primary-rgb: 93, 173, 226;
--bs-success: #70c770;
--bs-danger: #e26b67;
--bs-warning: #f4bd65;
--bs-info: #73cde6;
--bs-secondary-bg: #2b333b;
--bs-secondary-bg-rgb: 43, 51, 59;
--bs-secondary-color: #bac4cd;
--bs-tertiary-bg: #252c33;
--bs-border-color: #46515b;
--bs-link-color: #8cc8f0;
}
/* Note: Bootstrap 3 panels and wells are represented through shared app containers. */
.card,
.dropdown-menu,
.modal-content,
.surface-section,
.smart-setting-row,
.toast {
background-color: var(--bs-tertiary-bg);
border: 1px solid var(--bs-border-color);
border-radius: 4px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
.navbar,
.topbar {
background-image: linear-gradient(#ffffff, #f2f2f2);
border-bottom: 1px solid var(--bs-border-color);
}
[data-bs-theme="dark"] .navbar,
[data-bs-theme="dark"] .topbar {
background-image: linear-gradient(#303941, #20272e);
}
.btn {
border-width: 1px;
border-radius: 4px;
font-weight: 600;
transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease;
}
.btn:hover {
filter: none;
text-decoration: none;
}
.btn:focus-visible {
box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .32);
filter: none;
text-decoration: none;
}
.btn-primary {
background-image: linear-gradient(#428bca, #2d6ca2);
border-color: #2b669a;
color: #ffffff;
}
.btn-primary:hover,
.btn-primary:focus-visible,
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
background-color: #2d6ca2;
color: #ffffff;
}
.btn-success,
.btn-success:hover,
.btn-success:focus-visible {
background-color: #5cb85c;
border-color: #4cae4c;
color: #ffffff;
}
.btn-danger,
.btn-danger:hover,
.btn-danger:focus-visible {
background-color: #d9534f;
border-color: #d43f3a;
color: #ffffff;
}
.btn-warning,
.btn-warning:hover,
.btn-warning:focus-visible {
background-color: #f0ad4e;
border-color: #eea236;
color: #111111;
}
.btn-info,
.btn-info:hover,
.btn-info:focus-visible {
background-color: #5bc0de;
border-color: #46b8da;
color: #ffffff;
}
.btn-secondary,
.btn-outline-secondary,
.btn-light {
background-color: #ffffff;
border-color: #cccccc;
color: #333333;
}
.btn-outline-primary,
.btn-outline-success,
.btn-outline-danger,
.btn-outline-warning,
.btn-outline-info {
background-color: var(--bs-body-bg);
}
.btn-outline-primary:hover,
.btn-outline-primary:focus-visible {
background-color: var(--bs-primary);
border-color: var(--bs-primary);
color: #ffffff;
}
.btn-outline-success:hover,
.btn-outline-success:focus-visible {
background-color: var(--bs-success);
border-color: var(--bs-success);
color: #ffffff;
}
.btn-outline-danger:hover,
.btn-outline-danger:focus-visible {
background-color: var(--bs-danger);
border-color: var(--bs-danger);
color: #ffffff;
}
.btn-outline-warning:hover,
.btn-outline-warning:focus-visible {
background-color: var(--bs-warning);
border-color: var(--bs-warning);
color: #111111;
}
.btn-outline-info:hover,
.btn-outline-info:focus-visible {
background-color: var(--bs-info);
border-color: var(--bs-info);
color: #111111;
}
.btn-secondary:hover,
.btn-secondary:focus-visible,
.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible {
background-color: #e6e6e6;
border-color: #adadad;
color: #222222;
}
[data-bs-theme="dark"] .btn-secondary,
[data-bs-theme="dark"] .btn-outline-secondary,
[data-bs-theme="dark"] .btn-light {
background-color: #323b44;
border-color: #53606b;
color: #edf2f6;
}
[data-bs-theme="dark"] .btn-secondary:hover,
[data-bs-theme="dark"] .btn-secondary:focus-visible,
[data-bs-theme="dark"] .btn-outline-secondary:hover,
[data-bs-theme="dark"] .btn-outline-secondary:focus-visible {
background-color: #46515b;
color: #ffffff;
}
.form-control,
.form-select,
.input-group-text {
border: 1px solid #cccccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.form-control:focus,
.form-select:focus {
border-color: #66afe9;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.card-header,
.modal-header,
.table thead th {
background-color: #f5f5f5;
border-bottom: 1px solid var(--bs-border-color);
color: var(--bs-body-color);
font-weight: 700;
}
[data-bs-theme="dark"] .card-header,
[data-bs-theme="dark"] .modal-header,
[data-bs-theme="dark"] .table thead th {
background-color: #303941;
}
.badge,
.label {
border-radius: 4px;
}
.alert {
border-radius: 4px;
border-width: 1px;
}
.progress {
background-color: #f5f5f5;
border-radius: 4px;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.progress-bar {
background-image: linear-gradient(#5bc0de, #339bb9);
}
.table > :not(caption) > * > * {
border-bottom-color: var(--bs-border-color);
}

View File

@@ -0,0 +1,142 @@
/* Note: Bootstrap 4 Cards uses the v4 blue, subtler radii and card-first surfaces. */
:root {
--bs-border-radius: .25rem;
--bs-border-radius-sm: .2rem;
--bs-border-radius-lg: .3rem;
--bs-font-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
[data-bs-theme="light"] {
--bs-body-bg: #f8f9fa;
--bs-body-color: #212529;
--bs-primary: #007bff;
--bs-primary-rgb: 0, 123, 255;
--bs-success: #28a745;
--bs-danger: #dc3545;
--bs-warning: #ffc107;
--bs-info: #17a2b8;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-secondary-color: #6c757d;
--bs-tertiary-bg: #ffffff;
--bs-border-color: #dee2e6;
--bs-link-color: #007bff;
}
[data-bs-theme="dark"] {
--bs-body-bg: #181c20;
--bs-body-color: #e9ecef;
--bs-primary: #4dabf7;
--bs-primary-rgb: 77, 171, 247;
--bs-success: #51cf66;
--bs-danger: #ff6b6b;
--bs-warning: #ffd43b;
--bs-info: #3bc9db;
--bs-secondary-bg: #2a3036;
--bs-secondary-bg-rgb: 42, 48, 54;
--bs-secondary-color: #c1c7cd;
--bs-tertiary-bg: #22272c;
--bs-border-color: #444c55;
--bs-link-color: #74c0fc;
}
.card,
.surface-section,
.modal-content,
.dropdown-menu {
border-radius: .25rem;
box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075);
}
.btn-primary:hover,
.btn-primary:focus-visible {
background-color: #0069d9;
border-color: #0062cc;
}
[data-bs-theme="dark"] .btn-primary:hover,
[data-bs-theme="dark"] .btn-primary:focus-visible {
background-color: #228be6;
border-color: #1c7ed6;
}
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
background-color: var(--bs-primary);
color: #ffffff;
}
.btn {
border-width: 1px;
font-weight: 600;
transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease, filter .15s ease;
}
.btn:hover,
.btn:focus-visible {
filter: none;
text-decoration: none;
}
.btn-primary,
.btn-success,
.btn-danger,
.btn-warning,
.btn-info {
color: #ffffff;
}
.btn-outline-primary,
.btn-outline-success,
.btn-outline-danger,
.btn-outline-warning,
.btn-outline-info,
.btn-outline-secondary {
background-color: var(--bs-body-bg);
}
.btn-outline-primary:hover,
.btn-outline-primary:focus-visible {
background-color: var(--bs-primary);
border-color: var(--bs-primary);
color: #ffffff;
}
.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible {
background-color: var(--bs-secondary-color);
border-color: var(--bs-secondary-color);
color: var(--bs-body-bg);
}
.btn-outline-success:hover,
.btn-outline-success:focus-visible {
background-color: var(--bs-success);
border-color: var(--bs-success);
color: #ffffff;
}
.btn-outline-danger:hover,
.btn-outline-danger:focus-visible {
background-color: var(--bs-danger);
border-color: var(--bs-danger);
color: #ffffff;
}
.btn-outline-warning:hover,
.btn-outline-warning:focus-visible {
background-color: var(--bs-warning);
border-color: var(--bs-warning);
color: #111111;
}
.btn-outline-info:hover,
.btn-outline-info:focus-visible {
background-color: var(--bs-info);
border-color: var(--bs-info);
color: #111111;
}
.btn:focus-visible {
box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .32);
}

View File

@@ -0,0 +1,146 @@
/* Note: Bootstrap 5 Soft keeps the modern variable palette with stronger action hover contrast. */
:root {
--bs-border-radius: .5rem;
--bs-border-radius-sm: .375rem;
--bs-border-radius-lg: .75rem;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
[data-bs-theme="light"] {
--bs-body-bg: #f6f8fb;
--bs-body-color: #1f2937;
--bs-primary: #0d6efd;
--bs-primary-rgb: 13, 110, 253;
--bs-success: #198754;
--bs-danger: #dc3545;
--bs-warning: #ffc107;
--bs-info: #0dcaf0;
--bs-secondary-bg: #edf2f7;
--bs-secondary-bg-rgb: 237, 242, 247;
--bs-secondary-color: #64748b;
--bs-tertiary-bg: #ffffff;
--bs-border-color: #d9e2ec;
--bs-link-color: #0d6efd;
}
[data-bs-theme="dark"] {
--bs-body-bg: #101827;
--bs-body-color: #e5e7eb;
--bs-primary: #60a5fa;
--bs-primary-rgb: 96, 165, 250;
--bs-success: #34d399;
--bs-danger: #f87171;
--bs-warning: #fbbf24;
--bs-info: #22d3ee;
--bs-secondary-bg: #1e293b;
--bs-secondary-bg-rgb: 30, 41, 59;
--bs-secondary-color: #cbd5e1;
--bs-tertiary-bg: #172033;
--bs-border-color: #334155;
--bs-link-color: #93c5fd;
}
.card,
.surface-section,
.modal-content,
.dropdown-menu {
border-radius: .75rem;
box-shadow: 0 .35rem 1rem rgba(15, 23, 42, .08);
}
.btn {
border-radius: .5rem;
}
.btn-primary:hover,
.btn-primary:focus-visible {
background-color: #0b5ed7;
border-color: #0a58ca;
}
[data-bs-theme="dark"] .btn-primary:hover,
[data-bs-theme="dark"] .btn-primary:focus-visible {
background-color: #3b82f6;
border-color: #2563eb;
}
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
background-color: var(--bs-primary);
color: #ffffff;
}
.btn {
border-width: 1px;
font-weight: 600;
transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease, filter .15s ease;
}
.btn:hover,
.btn:focus-visible {
filter: none;
text-decoration: none;
}
.btn-primary,
.btn-success,
.btn-danger,
.btn-warning,
.btn-info {
color: #ffffff;
}
.btn-outline-primary,
.btn-outline-success,
.btn-outline-danger,
.btn-outline-warning,
.btn-outline-info,
.btn-outline-secondary {
background-color: var(--bs-body-bg);
}
.btn-outline-primary:hover,
.btn-outline-primary:focus-visible {
background-color: var(--bs-primary);
border-color: var(--bs-primary);
color: #ffffff;
}
.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible {
background-color: var(--bs-secondary-color);
border-color: var(--bs-secondary-color);
color: var(--bs-body-bg);
}
.btn-outline-success:hover,
.btn-outline-success:focus-visible {
background-color: var(--bs-success);
border-color: var(--bs-success);
color: #ffffff;
}
.btn-outline-danger:hover,
.btn-outline-danger:focus-visible {
background-color: var(--bs-danger);
border-color: var(--bs-danger);
color: #ffffff;
}
.btn-outline-warning:hover,
.btn-outline-warning:focus-visible {
background-color: var(--bs-warning);
border-color: var(--bs-warning);
color: #111111;
}
.btn-outline-info:hover,
.btn-outline-info:focus-visible {
background-color: var(--bs-info);
border-color: var(--bs-info);
color: #111111;
}
.btn:focus-visible {
box-shadow: 0 0 0 .2rem rgba(var(--bs-primary-rgb), .32);
}

View File

@@ -840,12 +840,15 @@ body.resizing-details {
} }
.toast-count { .toast-count {
flex: 0 0 auto; align-items: center;
padding: 0.05rem 0.35rem;
border-radius: 999px;
background: rgba(255, 255, 255, 0.22); background: rgba(255, 255, 255, 0.22);
border-radius: 999px;
display: inline-flex;
flex: 0 0 auto;
font-size: 0.78rem; font-size: 0.78rem;
font-weight: 700; font-weight: 700;
gap: 0.1rem;
padding: 0.05rem 0.35rem;
} }
@media (max-width: 1100px) { @media (max-width: 1100px) {
:root { :root {
@@ -4494,13 +4497,47 @@ body,
.peer-host { .peer-host {
display: inline-block; display: inline-block;
max-width: 220px; max-width: min(54vw, 100%);
min-width: 0;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
vertical-align: middle; vertical-align: middle;
white-space: nowrap; white-space: nowrap;
} }
.peers-table th:nth-child(3),
.peers-table td:nth-child(3) {
min-width: clamp(14rem, 26vw, 34rem);
}
@media (max-width: 900px) {
.peer-host {
max-width: 100%;
}
}
/* App modal widths stay consistent while Bootstrap still handles full-screen mobile breakpoints. */
.app-modal-dialog,
.modal-dialog.modal-xl {
--bs-modal-width: min(1140px, calc(100vw - 2rem));
}
@media (max-width: 575.98px) {
.app-modal-dialog {
--bs-modal-width: 100vw;
}
}
/* Current rTorrent settings uses the same card rhythm as Diagnostics for faster scanning. */
.rt-config-current-summary {
margin-bottom: 1rem;
}
.rt-config-value-note {
word-break: break-word;
}
.file-row-actions { .file-row-actions {
align-items: center; align-items: center;
display: inline-flex; display: inline-flex;
@@ -5081,3 +5118,63 @@ body.compact-torrent-list .mobile-progress .torrent-progress {
opacity: 0.85; opacity: 0.85;
pointer-events: none; pointer-events: none;
} }
/* Note: Mobile sort uses Font Awesome icons instead of text arrows to avoid broken glyph spacing. */
.mobile-sort-cycle-label {
align-items: center;
display: inline-flex;
gap: 0.45rem;
justify-content: center;
min-width: 0;
}
.mobile-sort-cycle-label i {
flex: 0 0 auto;
line-height: 1;
width: 1rem;
}
/* Note: Planner Current Settings inherits Poller Diagnostics card chrome from .smart-setting-row. */
.planner-current-summary {
align-items: flex-start;
}
.planner-diagnostic-line {
align-items: center;
color: var(--bs-secondary-color);
display: flex;
flex-wrap: wrap;
gap: 0.3rem 0.55rem;
line-height: 1.45;
margin-top: 0.2rem;
}
/* Note: Keep each Current Settings entry on a single visual line so labels do not break above values. */
.planner-diagnostic-item {
align-items: baseline;
display: inline-flex;
gap: 0.25rem;
white-space: nowrap;
}
.planner-diagnostic-item b {
color: var(--bs-body-color);
display: inline;
font-weight: 700;
}
/* Note: Add breathing room around Current Settings separators to match Poller Diagnostics readability. */
.planner-diagnostic-line .diagnostic-separator {
margin: 0 0.18rem;
}
.diagnostic-separator,
.modal-meta-separator {
color: var(--bs-secondary-color);
font-size: 0.38rem;
opacity: 0.8;
vertical-align: middle;
}