Files
fitme3070.pt/assets/css/bs-brand.css
T

254 lines
15 KiB
CSS

/* ── Bootstrap re-themed to the FitMe brand ──────────────────────────────────
Loaded after bootstrap.min.css (and before backoffice.css). Bootstrap's source
is never edited: everything here is --bs-* variables plus the component-scoped
variables Bootstrap 5.3 exposes (.btn-*, .form-check-input, .page-link …).
The brand colour is a single token, --fitme-accent (a gym's own colour on the
public site, see gym_brand_css()); every shade below is derived from it with
color-mix(), so changing the brand colour re-themes all of Bootstrap at once.
The other semantic colours (success/danger/warning/info) are tuned to sit next
to the brand without being confused with it. */
:root,
[data-bs-theme="light"],
[data-bs-theme="dark"] {
--brand: var(--fitme-accent, #C2D500);
--brand-ink: color-mix(in srgb, var(--brand) 55%, #000); /* text on light surfaces */
--brand-on: var(--fitme-on-accent, #0B0B0D); /* text on the brand colour */
--bs-primary: var(--brand);
--bs-primary-rgb: var(--fitme-accent-rgb, 194, 213, 0);
--bs-secondary: #3D403E;
--bs-secondary-rgb: 61, 64, 62;
--bs-success: #2E9E5B;
--bs-success-rgb: 46, 158, 91;
--bs-danger: #D6322E;
--bs-danger-rgb: 214, 50, 46;
--bs-warning: #F2A900;
--bs-warning-rgb: 242, 169, 0;
--bs-info: #2C9FD0;
--bs-info-rgb: 44, 159, 208;
--bs-light: #F7F8FA;
--bs-light-rgb: 247, 248, 250;
--bs-dark: #0B0B0D;
--bs-dark-rgb: 11, 11, 13;
--bs-focus-ring-color: color-mix(in srgb, var(--brand) 40%, transparent);
}
/* Subtle / emphasis / border tints: light theme (tint 80 / 60, shade 60) … */
:root,
[data-bs-theme="light"] {
--bs-primary-text-emphasis: color-mix(in srgb, var(--brand) 40%, #000);
--bs-primary-bg-subtle: color-mix(in srgb, var(--brand) 20%, #fff);
--bs-primary-border-subtle: color-mix(in srgb, var(--brand) 40%, #fff);
--bs-secondary-text-emphasis: #191a19;
--bs-secondary-bg-subtle: #e5e6e5;
--bs-secondary-border-subtle: #c5c6c5;
--bs-success-text-emphasis: #124f2c;
--bs-success-bg-subtle: #d5ecde;
--bs-success-border-subtle: #acdabd;
--bs-danger-text-emphasis: #561411;
--bs-danger-bg-subtle: #f7d6d5;
--bs-danger-border-subtle: #efadac;
--bs-warning-text-emphasis: #613f00;
--bs-warning-bg-subtle: #fceecc;
--bs-warning-border-subtle: #fadf99;
--bs-info-text-emphasis: #11404e;
--bs-info-bg-subtle: #d5ecf6;
--bs-info-border-subtle: #abd9ec;
--bs-link-color: var(--brand-ink);
--bs-link-color-rgb: 0, 0, 0;
--bs-link-hover-color: color-mix(in srgb, var(--brand) 40%, #000);
}
/* … dark theme (tint 40, shade 80 / 60) */
[data-bs-theme="dark"] {
--bs-primary-text-emphasis: color-mix(in srgb, var(--brand) 60%, #fff);
--bs-primary-bg-subtle: color-mix(in srgb, var(--brand) 20%, #000);
--bs-primary-border-subtle: color-mix(in srgb, var(--brand) 40%, #000);
--bs-secondary-text-emphasis: #b1b2b1;
--bs-secondary-bg-subtle: #131413;
--bs-secondary-border-subtle: #252726;
--bs-success-text-emphasis: #82c59d;
--bs-success-bg-subtle: #09200f;
--bs-success-border-subtle: #1c5f36;
--bs-danger-text-emphasis: #e88380;
--bs-danger-bg-subtle: #2b0a09;
--bs-danger-border-subtle: #801e1c;
--bs-warning-text-emphasis: #f7ca66;
--bs-warning-bg-subtle: #302200;
--bs-warning-border-subtle: #916800;
--bs-info-text-emphasis: #80c5e3;
--bs-info-bg-subtle: #0e2833;
--bs-info-border-subtle: #1a5f7d;
--bs-link-color: var(--brand);
--bs-link-color-rgb: var(--fitme-accent-rgb, 194, 213, 0);
--bs-link-hover-color: color-mix(in srgb, var(--brand) 75%, #fff);
}
/* ── Components: Bootstrap hard-codes white text on solid primary/semantic
fills; the brand colour is light, so the text must be dark. ─────────────── */
.btn-primary {
--bs-btn-color: var(--brand-on);
--bs-btn-bg: var(--brand);
--bs-btn-border-color: var(--brand);
--bs-btn-hover-color: var(--brand-on);
--bs-btn-hover-bg: color-mix(in srgb, var(--brand) 86%, #000);
--bs-btn-hover-border-color: color-mix(in srgb, var(--brand) 80%, #000);
--bs-btn-focus-shadow-rgb: var(--fitme-accent-rgb, 194, 213, 0);
--bs-btn-active-color: var(--brand-on);
--bs-btn-active-bg: color-mix(in srgb, var(--brand) 78%, #000);
--bs-btn-active-border-color: color-mix(in srgb, var(--brand) 70%, #000);
--bs-btn-disabled-color: var(--brand-on);
--bs-btn-disabled-bg: var(--brand);
--bs-btn-disabled-border-color: var(--brand);
}
.btn-outline-primary {
--bs-btn-color: var(--brand-ink);
--bs-btn-border-color: var(--brand);
--bs-btn-hover-color: var(--brand-on);
--bs-btn-hover-bg: var(--brand);
--bs-btn-hover-border-color: var(--brand);
--bs-btn-focus-shadow-rgb: var(--fitme-accent-rgb, 194, 213, 0);
--bs-btn-active-color: var(--brand-on);
--bs-btn-active-bg: var(--brand);
--bs-btn-active-border-color: var(--brand);
--bs-btn-disabled-color: var(--brand-ink);
--bs-btn-disabled-border-color: var(--brand);
}
[data-bs-theme="dark"] .btn-outline-primary { --bs-btn-color: var(--brand); --bs-btn-disabled-color: var(--brand); }
.btn-secondary {
--bs-btn-bg: var(--bs-secondary);
--bs-btn-border-color: var(--bs-secondary);
--bs-btn-hover-bg: #2f3230;
--bs-btn-hover-border-color: #2b2d2c;
--bs-btn-active-bg: #2b2d2c;
--bs-btn-active-border-color: #262826;
--bs-btn-disabled-bg: var(--bs-secondary);
--bs-btn-disabled-border-color: var(--bs-secondary);
}
.btn-outline-secondary {
--bs-btn-color: var(--bs-secondary);
--bs-btn-border-color: var(--bs-secondary);
--bs-btn-hover-bg: var(--bs-secondary);
--bs-btn-hover-border-color: var(--bs-secondary);
--bs-btn-active-bg: var(--bs-secondary);
--bs-btn-active-border-color: var(--bs-secondary);
--bs-btn-disabled-color: var(--bs-secondary);
--bs-btn-disabled-border-color: var(--bs-secondary);
}
[data-bs-theme="dark"] .btn-outline-secondary { --bs-btn-color: #9a9d9b; --bs-btn-border-color: #5b5f5d; }
.btn-success { --bs-btn-bg: var(--bs-success); --bs-btn-border-color: var(--bs-success); --bs-btn-hover-bg: #27864d; --bs-btn-hover-border-color: #257d49; --bs-btn-active-bg: #257d49; --bs-btn-active-border-color: #227545; --bs-btn-disabled-bg: var(--bs-success); --bs-btn-disabled-border-color: var(--bs-success); }
.btn-danger { --bs-btn-bg: var(--bs-danger); --bs-btn-border-color: var(--bs-danger); --bs-btn-hover-bg: #b62a27; --bs-btn-hover-border-color: #ab2825; --bs-btn-active-bg: #ab2825; --bs-btn-active-border-color: #a02622; --bs-btn-disabled-bg: var(--bs-danger); --bs-btn-disabled-border-color: var(--bs-danger); }
.btn-warning { --bs-btn-bg: var(--bs-warning); --bs-btn-border-color: var(--bs-warning); --bs-btn-hover-bg: #f5b61f; --bs-btn-hover-border-color: #f4b212; --bs-btn-active-bg: #f6bb2b; --bs-btn-active-border-color: #f4b212; --bs-btn-disabled-bg: var(--bs-warning); --bs-btn-disabled-border-color: var(--bs-warning); }
.btn-info { --bs-btn-bg: var(--bs-info); --bs-btn-border-color: var(--bs-info); --bs-btn-hover-bg: #52b0d9; --bs-btn-hover-border-color: #42a9d6; --bs-btn-active-bg: #5bb5dc; --bs-btn-active-border-color: #42a9d6; --bs-btn-disabled-bg: var(--bs-info); --bs-btn-disabled-border-color: var(--bs-info); }
.btn-outline-success { --bs-btn-color: var(--bs-success); --bs-btn-border-color: var(--bs-success); --bs-btn-hover-bg: var(--bs-success); --bs-btn-hover-border-color: var(--bs-success); --bs-btn-active-bg: var(--bs-success); --bs-btn-active-border-color: var(--bs-success); --bs-btn-disabled-color: var(--bs-success); --bs-btn-disabled-border-color: var(--bs-success); }
.btn-outline-danger { --bs-btn-color: var(--bs-danger); --bs-btn-border-color: var(--bs-danger); --bs-btn-hover-bg: var(--bs-danger); --bs-btn-hover-border-color: var(--bs-danger); --bs-btn-active-bg: var(--bs-danger); --bs-btn-active-border-color: var(--bs-danger); --bs-btn-disabled-color: var(--bs-danger); --bs-btn-disabled-border-color: var(--bs-danger); }
.btn-outline-warning { --bs-btn-color: #b07a00; --bs-btn-border-color: var(--bs-warning); --bs-btn-hover-bg: var(--bs-warning); --bs-btn-hover-border-color: var(--bs-warning); --bs-btn-active-bg: var(--bs-warning); --bs-btn-active-border-color: var(--bs-warning); --bs-btn-disabled-color: #b07a00; --bs-btn-disabled-border-color: var(--bs-warning); }
.btn-outline-info { --bs-btn-color: #1f7ea6; --bs-btn-border-color: var(--bs-info); --bs-btn-hover-bg: var(--bs-info); --bs-btn-hover-border-color: var(--bs-info); --bs-btn-active-bg: var(--bs-info); --bs-btn-active-border-color: var(--bs-info); --bs-btn-disabled-color: #1f7ea6; --bs-btn-disabled-border-color: var(--bs-info); }
[data-bs-theme="dark"] .btn-outline-warning { --bs-btn-color: var(--bs-warning); --bs-btn-disabled-color: var(--bs-warning); }
[data-bs-theme="dark"] .btn-outline-info { --bs-btn-color: var(--bs-info); --bs-btn-disabled-color: var(--bs-info); }
.btn-success, .btn-danger, .btn-info, .btn-outline-success, .btn-outline-danger, .btn-outline-info { --bs-btn-hover-color: #fff; --bs-btn-active-color: #fff; }
.btn-success, .btn-danger, .btn-info { --bs-btn-color: #fff; --bs-btn-disabled-color: #fff; }
.btn-warning, .btn-outline-warning { --bs-btn-hover-color: #0B0B0D; --bs-btn-active-color: #0B0B0D; }
.btn-warning { --bs-btn-color: #0B0B0D; --bs-btn-disabled-color: #0B0B0D; }
/* ── Solid fills that use the colour as background ───────────────────────── */
.text-bg-primary { color: var(--brand-on) !important; background-color: var(--brand) !important; }
.text-bg-secondary { background-color: var(--bs-secondary) !important; }
.text-bg-success { background-color: var(--bs-success) !important; }
.text-bg-danger { background-color: var(--bs-danger) !important; }
.text-bg-warning { color: #0B0B0D !important; background-color: var(--bs-warning) !important; }
.text-bg-info { color: #fff !important; background-color: var(--bs-info) !important; }
.link-primary { color: var(--brand-ink) !important; }
[data-bs-theme="dark"] .link-primary { color: var(--brand) !important; }
/* ── Forms ───────────────────────────────────────────────────────────────── */
.form-control:focus, .form-select:focus {
border-color: color-mix(in srgb, var(--brand) 70%, #000);
box-shadow: 0 0 0 .25rem var(--bs-focus-ring-color);
}
.form-check-input:checked,
.form-check-input[type="checkbox"]:indeterminate {
background-color: var(--brand);
border-color: var(--brand);
}
/* the tick / dot / knob are inline SVGs with a hard-coded white fill */
.form-check-input:checked[type="checkbox"] {
--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230B0B0D' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
}
.form-check-input:checked[type="radio"] {
--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%230B0B0D'/%3e%3c/svg%3e");
}
.form-check-input:focus { border-color: var(--brand); box-shadow: 0 0 0 .25rem var(--bs-focus-ring-color); }
.form-switch .form-check-input:focus {
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23B9C65A'/%3e%3c/svg%3e");
}
.form-switch .form-check-input:checked {
--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%230B0B0D'/%3e%3c/svg%3e");
}
.form-range::-webkit-slider-thumb { background-color: var(--brand); }
.form-range::-webkit-slider-thumb:active { background-color: color-mix(in srgb, var(--brand) 60%, #fff); }
.form-range::-moz-range-thumb { background-color: var(--brand); }
.form-range::-moz-range-thumb:active { background-color: color-mix(in srgb, var(--brand) 60%, #fff); }
.form-range:focus::-webkit-slider-thumb { box-shadow: 0 0 0 1px #fff, 0 0 0 .25rem var(--bs-focus-ring-color); }
.form-range:focus::-moz-range-thumb { box-shadow: 0 0 0 1px #fff, 0 0 0 .25rem var(--bs-focus-ring-color); }
.was-validated .form-control:valid, .form-control.is-valid,
.was-validated .form-select:valid, .form-select.is-valid { border-color: var(--bs-success); }
.was-validated .form-control:invalid, .form-control.is-invalid,
.was-validated .form-select:invalid, .form-select.is-invalid { border-color: var(--bs-danger); }
/* ── Navigation & lists ──────────────────────────────────────────────────── */
.nav {
--bs-nav-link-color: var(--bs-link-color);
--bs-nav-link-hover-color: var(--bs-link-hover-color);
}
.nav-pills {
--bs-nav-pills-link-active-color: var(--brand-on);
--bs-nav-pills-link-active-bg: var(--brand);
}
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { border-top: 2px solid var(--brand); }
.pagination {
--bs-pagination-color: var(--bs-link-color);
--bs-pagination-hover-color: var(--bs-link-hover-color);
--bs-pagination-focus-color: var(--bs-link-hover-color);
--bs-pagination-focus-box-shadow: 0 0 0 .25rem var(--bs-focus-ring-color);
--bs-pagination-active-color: var(--brand-on);
--bs-pagination-active-bg: var(--brand);
--bs-pagination-active-border-color: var(--brand);
}
.list-group { --bs-list-group-active-color: var(--brand-on); --bs-list-group-active-bg: var(--brand); --bs-list-group-active-border-color: var(--brand); }
.dropdown-menu { --bs-dropdown-link-active-color: var(--brand-on); --bs-dropdown-link-active-bg: var(--brand); }
.accordion {
--bs-accordion-active-color: var(--bs-primary-text-emphasis);
--bs-accordion-active-bg: var(--bs-primary-bg-subtle);
--bs-accordion-btn-focus-border-color: var(--brand);
--bs-accordion-btn-focus-box-shadow: 0 0 0 .25rem var(--bs-focus-ring-color);
}
/* ── Feedback ────────────────────────────────────────────────────────────── */
.progress { --bs-progress-bar-bg: var(--brand); --bs-progress-bar-color: var(--brand-on); }
.alert-primary {
--bs-alert-color: var(--bs-primary-text-emphasis);
--bs-alert-bg: var(--bs-primary-bg-subtle);
--bs-alert-border-color: var(--bs-primary-border-subtle);
--bs-alert-link-color: var(--bs-primary-text-emphasis);
}
.table-primary {
--bs-table-color: var(--bs-primary-text-emphasis);
--bs-table-bg: var(--bs-primary-bg-subtle);
--bs-table-border-color: var(--bs-primary-border-subtle);
--bs-table-striped-bg: color-mix(in srgb, var(--bs-primary-bg-subtle) 94%, #000);
--bs-table-hover-bg: color-mix(in srgb, var(--bs-primary-bg-subtle) 92%, #000);
--bs-table-active-bg: color-mix(in srgb, var(--bs-primary-bg-subtle) 90%, #000);
}
.border-primary { border-color: var(--brand) !important; }
.bg-primary { background-color: var(--brand) !important; color: var(--brand-on); }
.text-primary { color: var(--brand-ink) !important; }
[data-bs-theme="dark"] .text-primary { color: var(--brand) !important; }
.bg-primary-subtle { background-color: var(--bs-primary-bg-subtle) !important; }
.text-primary-emphasis { color: var(--bs-primary-text-emphasis) !important; }
.border-primary-subtle { border-color: var(--bs-primary-border-subtle) !important; }