487 lines
17 KiB
CSS
487 lines
17 KiB
CSS
/* ════════════════════════════════════════════════════════════════════════
|
|
Janitorial QC — MODERN design skin (design A/B test — "modern")
|
|
────────────────────────────────────────────────────────────────────────
|
|
Loaded ONLY by templates/layouts/modern.html, and always AFTER
|
|
theme.css, so every token below overrides the classic one.
|
|
|
|
The classic design is completely untouched by this file.
|
|
|
|
Palette sampled from the JQC_design deck:
|
|
brand #155F82 deep teal-blue top bar / table headers
|
|
brand-700 #0F4A66 hover / pressed
|
|
brand-050 #DCEBF5 soft icon tiles, active rail rows
|
|
page #EAEEF1 page background
|
|
surface #FFFFFF cards
|
|
ink #1D2A32 headings
|
|
muted #6B7A85 secondary text
|
|
════════════════════════════════════════════════════════════════════════ */
|
|
|
|
/* ── 1. Tokens ───────────────────────────────────────────────────────────── */
|
|
body.jqc-modern {
|
|
--jqc-brand: #155F82;
|
|
--jqc-brand-700: #0F4A66;
|
|
--jqc-brand-600: #1B6E93;
|
|
--jqc-brand-050: #DCEBF5;
|
|
--jqc-brand-025: #E9F0F8;
|
|
--jqc-page: #EAEEF1;
|
|
--jqc-ink: #1D2A32;
|
|
--jqc-heading: #1D2A32;
|
|
--jqc-muted: #6B7A85;
|
|
--jqc-faint: #93A1AB;
|
|
--jqc-border: #E3E8EC;
|
|
--jqc-border-2: #CFD9E0;
|
|
--jqc-surface: #F5F8FA; /* subtle fill — hovers, muted rows (theme.css) */
|
|
--jqc-surface-2: #EEF3F6;
|
|
--jqc-card-bg: #FFFFFF; /* raised surfaces — cards, KPI tiles, sidebar */
|
|
--jqc-accent: #155F82;
|
|
--jqc-accent-700: #0F4A66;
|
|
--jqc-accent-50: #DCEBF5;
|
|
--jqc-shadow: 0 1px 2px rgba(21, 46, 62, .05), 0 6px 18px rgba(21, 46, 62, .06);
|
|
--jqc-shadow-md: 0 10px 30px rgba(21, 46, 62, .12);
|
|
|
|
--bs-primary: #155F82;
|
|
--bs-primary-rgb: 21, 95, 130;
|
|
--bs-link-color: #155F82;
|
|
--bs-link-color-rgb: 21, 95, 130;
|
|
--bs-link-hover-color: #0F4A66;
|
|
--bs-link-hover-color-rgb: 15, 74, 102;
|
|
--bs-body-bg: #EAEEF1;
|
|
--bs-body-color: #1D2A32;
|
|
--bs-border-color: #E3E8EC;
|
|
--bs-border-radius: .6rem;
|
|
--bs-border-radius-sm: .45rem;
|
|
--bs-border-radius-lg: 1rem;
|
|
--bs-border-radius-xl: 1.15rem;
|
|
|
|
--jqc-topbar-h: 72px;
|
|
--jqc-sidebar-w: 232px;
|
|
|
|
background-color: var(--jqc-page);
|
|
color: var(--jqc-ink);
|
|
font-family: 'DM Sans', system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
}
|
|
|
|
/* ── 2. Top bar ──────────────────────────────────────────────────────────── */
|
|
.jqc-modern .jqc-topbar {
|
|
position: fixed;
|
|
top: 0; left: 0; right: 0;
|
|
height: var(--jqc-topbar-h);
|
|
z-index: 1035;
|
|
background: var(--jqc-brand);
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 14px;
|
|
padding: 0 20px;
|
|
padding-top: env(safe-area-inset-top);
|
|
box-shadow: 0 1px 0 rgba(0, 0, 0, .10);
|
|
}
|
|
.jqc-modern .jqc-brand {
|
|
text-decoration: none;
|
|
color: #fff;
|
|
line-height: 1;
|
|
flex: 0 0 auto;
|
|
}
|
|
.jqc-modern .jqc-brand-mark {
|
|
display: block;
|
|
font-size: 1.75rem;
|
|
font-weight: 800;
|
|
letter-spacing: -.02em;
|
|
}
|
|
.jqc-modern .jqc-brand-sub {
|
|
display: block;
|
|
font-size: .68rem;
|
|
opacity: .82;
|
|
margin-top: 3px;
|
|
}
|
|
.jqc-modern .jqc-search {
|
|
position: relative;
|
|
margin-left: auto;
|
|
width: min(420px, 42vw);
|
|
}
|
|
.jqc-modern .jqc-search i {
|
|
position: absolute;
|
|
left: 16px; top: 50%;
|
|
transform: translateY(-50%);
|
|
color: var(--jqc-muted);
|
|
pointer-events: none;
|
|
}
|
|
.jqc-modern .jqc-search .form-control {
|
|
border: none;
|
|
border-radius: 999px;
|
|
height: 42px;
|
|
padding-left: 44px;
|
|
background: #fff;
|
|
font-size: .92rem;
|
|
}
|
|
.jqc-modern .jqc-search .form-control:focus {
|
|
box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .35);
|
|
}
|
|
.jqc-modern .jqc-topbar-actions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
flex: 0 0 auto;
|
|
}
|
|
.jqc-modern .jqc-icon-btn {
|
|
color: #fff;
|
|
font-size: 1.2rem;
|
|
text-decoration: none;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 40px; height: 40px;
|
|
border-radius: 50%;
|
|
transition: background-color .15s;
|
|
}
|
|
.jqc-modern .jqc-icon-btn:hover { background: rgba(255, 255, 255, .14); color: #fff; }
|
|
.jqc-modern .jqc-avatar {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 44px; height: 44px;
|
|
border-radius: 50%;
|
|
background: var(--jqc-brand-700);
|
|
border: 2px solid rgba(255, 255, 255, .85);
|
|
color: #fff;
|
|
font-weight: 700;
|
|
font-size: .9rem;
|
|
letter-spacing: .02em;
|
|
text-decoration: none;
|
|
}
|
|
.jqc-modern .jqc-avatar:hover { background: #0b3b53; color: #fff; }
|
|
.jqc-modern .jqc-hamburger {
|
|
background: transparent;
|
|
border: none;
|
|
color: #fff;
|
|
font-size: 1.5rem;
|
|
line-height: 1;
|
|
padding: 4px 6px;
|
|
}
|
|
|
|
/* ── 3. Sidebar ──────────────────────────────────────────────────────────── */
|
|
.jqc-modern .jqc-sidebar {
|
|
position: fixed;
|
|
top: var(--jqc-topbar-h);
|
|
bottom: 0;
|
|
left: 0;
|
|
width: var(--jqc-sidebar-w);
|
|
background: var(--jqc-card-bg);
|
|
border-right: 1px solid var(--jqc-border);
|
|
overflow-y: auto;
|
|
z-index: 1030;
|
|
display: flex;
|
|
flex-direction: column;
|
|
padding-top: 10px;
|
|
}
|
|
.jqc-modern .jqc-nav { flex: 1 1 auto; }
|
|
.jqc-modern .jqc-nav-link {
|
|
position: relative;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 14px;
|
|
padding: 13px 18px 13px 22px;
|
|
color: #43525C;
|
|
text-decoration: none;
|
|
font-size: .95rem;
|
|
font-weight: 500;
|
|
transition: background-color .15s, color .15s;
|
|
}
|
|
.jqc-modern .jqc-nav-link i { font-size: 1.15rem; width: 22px; text-align: center; }
|
|
.jqc-modern .jqc-nav-link span { flex: 1 1 auto; }
|
|
.jqc-modern .jqc-nav-link:hover { background: var(--jqc-brand-025); color: var(--jqc-brand); }
|
|
.jqc-modern .jqc-nav-link.active {
|
|
background: var(--jqc-brand-025);
|
|
color: var(--jqc-brand);
|
|
font-weight: 700;
|
|
}
|
|
.jqc-modern .jqc-nav-link.active::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: 0; top: 0; bottom: 0;
|
|
width: 5px;
|
|
background: var(--jqc-brand);
|
|
}
|
|
.jqc-modern .jqc-nav-caret { font-size: .7rem !important; width: auto !important; opacity: .6; }
|
|
.jqc-modern .jqc-nav-badge {
|
|
background: #D9534F;
|
|
color: #fff;
|
|
border-radius: 999px;
|
|
font-size: .68rem;
|
|
font-weight: 700;
|
|
padding: 1px 7px;
|
|
line-height: 1.5;
|
|
}
|
|
.jqc-modern .jqc-nav-sublink {
|
|
display: block;
|
|
padding: 9px 18px 9px 58px;
|
|
font-size: .88rem;
|
|
color: #5A6A75;
|
|
text-decoration: none;
|
|
}
|
|
.jqc-modern .jqc-nav-sublink:hover { background: var(--jqc-brand-025); color: var(--jqc-brand); }
|
|
.jqc-modern .jqc-nav-sublink.active { color: var(--jqc-brand); font-weight: 700; }
|
|
.jqc-modern .jqc-sidebar-foot {
|
|
flex: 0 0 auto;
|
|
padding: 14px 16px 20px;
|
|
border-top: 1px solid var(--jqc-border);
|
|
}
|
|
.jqc-modern .jqc-switch-btn {
|
|
width: 100%;
|
|
background: #fff;
|
|
border: 1.5px solid var(--jqc-brand);
|
|
color: var(--jqc-brand);
|
|
border-radius: 999px;
|
|
font-size: .82rem;
|
|
font-weight: 600;
|
|
padding: 8px 10px;
|
|
transition: background-color .15s, color .15s;
|
|
}
|
|
.jqc-modern .jqc-switch-btn:hover { background: var(--jqc-brand); color: #fff; }
|
|
.jqc-modern .jqc-sidebar-backdrop {
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(15, 34, 46, .45);
|
|
z-index: 1029;
|
|
display: none;
|
|
}
|
|
.jqc-modern .jqc-sidebar-backdrop.show { display: block; }
|
|
|
|
/* ── 4. Main region ──────────────────────────────────────────────────────── */
|
|
.jqc-modern .jqc-main {
|
|
margin-left: var(--jqc-sidebar-w);
|
|
padding: calc(var(--jqc-topbar-h) + 22px) 10px 40px;
|
|
min-height: 100vh;
|
|
}
|
|
.jqc-modern .jqc-main > .container-fluid { padding-inline: 14px; }
|
|
|
|
@media (max-width: 991.98px) {
|
|
.jqc-modern .jqc-sidebar {
|
|
transform: translateX(-100%);
|
|
transition: transform .2s ease;
|
|
box-shadow: 0 0 24px rgba(15, 34, 46, .18);
|
|
}
|
|
.jqc-modern .jqc-sidebar.open { transform: translateX(0); }
|
|
.jqc-modern .jqc-main { margin-left: 0; }
|
|
.jqc-modern .jqc-search { width: auto; flex: 1 1 auto; }
|
|
.jqc-modern .jqc-brand-sub { display: none; }
|
|
}
|
|
|
|
/* ── 5. Page heading block (used by the rebuilt modern pages) ────────────── */
|
|
.jqc-modern .jqc-page-head { margin-bottom: 20px; }
|
|
.jqc-modern .jqc-page-head h1,
|
|
.jqc-modern .jqc-page-title {
|
|
font-size: 2rem;
|
|
font-weight: 800;
|
|
letter-spacing: -.02em;
|
|
color: var(--jqc-ink);
|
|
margin: 0;
|
|
}
|
|
/* Opt-in centring — the default is left-aligned. `.center` on the head block
|
|
centres the title and its sub-line together. */
|
|
.jqc-modern .jqc-page-head.center,
|
|
.jqc-modern .jqc-page-title.center { text-align: center; }
|
|
.jqc-modern .jqc-page-sub {
|
|
color: var(--jqc-muted);
|
|
font-size: .95rem;
|
|
margin-top: 4px;
|
|
}
|
|
|
|
/* ── 6. Cards / surfaces (applies to every page, rebuilt or not) ─────────── */
|
|
.jqc-modern .card {
|
|
border: 1px solid var(--jqc-border);
|
|
border-radius: 16px;
|
|
box-shadow: var(--jqc-shadow);
|
|
}
|
|
.jqc-modern .card-header {
|
|
background: var(--jqc-card-bg);
|
|
border-bottom: 1px solid var(--jqc-border);
|
|
color: var(--jqc-ink);
|
|
font-weight: 700;
|
|
padding: .9rem 1.15rem;
|
|
}
|
|
.jqc-modern .card-header.bg-light,
|
|
.jqc-modern .card-header.bg-white { background: var(--jqc-card-bg) !important; }
|
|
.jqc-modern .card-body { padding: 1.15rem; }
|
|
|
|
.jqc-modern .jqc-card {
|
|
background: var(--jqc-card-bg);
|
|
border: 1px solid var(--jqc-border);
|
|
border-radius: 16px;
|
|
box-shadow: var(--jqc-shadow);
|
|
padding: 20px 22px;
|
|
margin-bottom: 22px;
|
|
}
|
|
.jqc-modern .jqc-card-title {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
font-size: 1.15rem;
|
|
font-weight: 800;
|
|
color: var(--jqc-ink);
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
/* Soft square icon tile — the deck's signature element */
|
|
.jqc-modern .jqc-tile-icon {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 42px; height: 42px;
|
|
border-radius: 11px;
|
|
background: var(--jqc-brand-050);
|
|
color: var(--jqc-brand);
|
|
font-size: 1.15rem;
|
|
flex: 0 0 auto;
|
|
}
|
|
.jqc-modern .jqc-tile-icon.lg { width: 74px; height: 74px; border-radius: 18px; font-size: 2rem; }
|
|
|
|
/* KPI tiles */
|
|
.jqc-modern .jqc-kpi {
|
|
background: var(--jqc-card-bg);
|
|
border: 1px solid var(--jqc-border);
|
|
border-radius: 16px;
|
|
box-shadow: var(--jqc-shadow);
|
|
padding: 18px 20px;
|
|
height: 100%;
|
|
display: block;
|
|
text-decoration: none;
|
|
color: inherit;
|
|
transition: box-shadow .15s, transform .15s;
|
|
}
|
|
a.jqc-kpi:hover { box-shadow: var(--jqc-shadow-md); transform: translateY(-1px); color: inherit; }
|
|
.jqc-modern .jqc-kpi-value {
|
|
font-size: 2.1rem;
|
|
font-weight: 800;
|
|
line-height: 1.05;
|
|
color: var(--jqc-ink);
|
|
margin-top: 10px;
|
|
}
|
|
.jqc-modern .jqc-kpi-label { font-size: .85rem; color: var(--jqc-muted); margin-top: 2px; }
|
|
|
|
/* Label / value rows inside summary cards */
|
|
.jqc-modern .jqc-stat-row {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
padding: 11px 2px;
|
|
border-bottom: 1px solid var(--jqc-border);
|
|
text-decoration: none;
|
|
color: var(--jqc-ink);
|
|
}
|
|
.jqc-modern .jqc-stat-row:last-child { border-bottom: none; }
|
|
.jqc-modern .jqc-stat-row:hover { color: var(--jqc-brand); }
|
|
.jqc-modern .jqc-stat-label { font-size: .95rem; display: flex; align-items: center; gap: 9px; }
|
|
.jqc-modern .jqc-stat-value { font-size: 1.05rem; font-weight: 800; white-space: nowrap; }
|
|
.jqc-modern .jqc-dot {
|
|
width: 9px; height: 9px; border-radius: 50%;
|
|
display: inline-block; flex: 0 0 auto;
|
|
}
|
|
|
|
/* Hub cards (Facility / Support pages) */
|
|
.jqc-modern .jqc-hub-card {
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 100%;
|
|
background: var(--jqc-card-bg);
|
|
border: 1px solid var(--jqc-border);
|
|
border-radius: 16px;
|
|
box-shadow: var(--jqc-shadow);
|
|
padding: 24px 26px;
|
|
text-decoration: none;
|
|
color: inherit;
|
|
transition: box-shadow .15s, transform .15s;
|
|
}
|
|
.jqc-modern .jqc-hub-card:hover { box-shadow: var(--jqc-shadow-md); transform: translateY(-2px); color: inherit; }
|
|
.jqc-modern .jqc-hub-title { font-size: 1.3rem; font-weight: 800; color: var(--jqc-ink); }
|
|
.jqc-modern .jqc-hub-text { color: var(--jqc-muted); font-size: .93rem; margin-top: 6px; }
|
|
.jqc-modern .jqc-hub-open { color: var(--jqc-brand); font-weight: 700; font-size: .9rem; margin-top: auto; padding-top: 18px; }
|
|
.jqc-modern .jqc-hub-card.dark { background: var(--jqc-brand); border-color: var(--jqc-brand); }
|
|
.jqc-modern .jqc-hub-card.dark .jqc-hub-title,
|
|
.jqc-modern .jqc-hub-card.dark .jqc-hub-text { color: #fff; }
|
|
.jqc-modern .jqc-hub-card.dark .jqc-tile-icon { background: #fff; }
|
|
|
|
/* ── 7. Tables — dark teal header, as in the deck ────────────────────────── */
|
|
.jqc-modern .table { --bs-table-border-color: var(--jqc-border); margin-bottom: 0; }
|
|
|
|
/* Recoloured via Bootstrap's own table CSS variables rather than !important, so
|
|
a page that deliberately wants a different header (table-dark, a tinted
|
|
report header) can still override it with a normal rule. */
|
|
.jqc-modern .table > thead > tr > th,
|
|
.jqc-modern .table thead.table-light > tr > th,
|
|
.jqc-modern .table > thead th {
|
|
--bs-table-bg: var(--jqc-brand);
|
|
--bs-table-color: #fff;
|
|
background-color: var(--jqc-brand);
|
|
color: #fff;
|
|
border-color: var(--jqc-brand-700);
|
|
font-weight: 600;
|
|
font-size: .88rem;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
/* nowrap only where the column set is known-narrow (dashboard panels); wide
|
|
tables such as the issues list and audit trail must be free to wrap rather
|
|
than force a horizontal scroll on iPad portrait. */
|
|
.jqc-modern .jqc-card .table > thead th { white-space: nowrap; }
|
|
.jqc-modern .table > tbody > tr > td { vertical-align: middle; font-size: .92rem; }
|
|
.jqc-modern .table-hover > tbody > tr:hover > * { background-color: var(--jqc-brand-025); }
|
|
.jqc-modern .jqc-table-wrap {
|
|
border: 1px solid var(--jqc-border);
|
|
border-radius: 12px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* ── 8. Buttons, badges, forms ───────────────────────────────────────────── */
|
|
.jqc-modern .btn { border-radius: .6rem; font-weight: 600; }
|
|
.jqc-modern .btn-primary {
|
|
--bs-btn-bg: var(--jqc-brand); --bs-btn-border-color: var(--jqc-brand);
|
|
--bs-btn-hover-bg: var(--jqc-brand-700); --bs-btn-hover-border-color: var(--jqc-brand-700);
|
|
--bs-btn-active-bg: var(--jqc-brand-700); --bs-btn-active-border-color: var(--jqc-brand-700);
|
|
--bs-btn-disabled-bg: var(--jqc-brand); --bs-btn-disabled-border-color: var(--jqc-brand);
|
|
}
|
|
.jqc-modern .btn-outline-primary {
|
|
--bs-btn-color: var(--jqc-brand); --bs-btn-border-color: var(--jqc-brand);
|
|
--bs-btn-hover-bg: var(--jqc-brand); --bs-btn-hover-border-color: var(--jqc-brand);
|
|
--bs-btn-active-bg: var(--jqc-brand); --bs-btn-active-border-color: var(--jqc-brand);
|
|
}
|
|
.jqc-modern .bg-primary { background-color: var(--jqc-brand) !important; }
|
|
.jqc-modern .text-primary { color: var(--jqc-brand) !important; }
|
|
.jqc-modern .badge { border-radius: 999px; font-weight: 700; padding: .35em .7em; }
|
|
.jqc-modern .form-control,
|
|
.jqc-modern .form-select {
|
|
border-radius: .6rem;
|
|
border-color: var(--jqc-border-2);
|
|
}
|
|
.jqc-modern .form-control:focus,
|
|
.jqc-modern .form-select:focus {
|
|
border-color: var(--jqc-brand);
|
|
box-shadow: 0 0 0 .18rem rgba(21, 95, 130, .18);
|
|
}
|
|
|
|
/* Filter bar — the rounded pill row from the deck */
|
|
.jqc-modern .jqc-filter-bar {
|
|
background: var(--jqc-card-bg);
|
|
border: 1px solid var(--jqc-border);
|
|
border-radius: 16px;
|
|
box-shadow: var(--jqc-shadow);
|
|
padding: 14px 16px;
|
|
margin-bottom: 20px;
|
|
}
|
|
.jqc-modern .jqc-filter-bar .form-control,
|
|
.jqc-modern .jqc-filter-bar .form-select { border-radius: 999px; padding-inline: 16px; }
|
|
|
|
/* ── 9. Alerts / misc ────────────────────────────────────────────────────── */
|
|
.jqc-modern .alert { border-radius: 12px; border: 1px solid var(--jqc-border); }
|
|
.jqc-modern .dropdown-menu { border-radius: 12px; border-color: var(--jqc-border); box-shadow: var(--jqc-shadow-md); }
|
|
.jqc-modern .nav-tabs .nav-link.active { color: var(--jqc-brand); }
|
|
.jqc-modern .progress-bar.bg-success { background-color: #2E7D4F !important; }
|
|
|
|
/* Print: drop the chrome entirely */
|
|
@media print {
|
|
.jqc-modern .jqc-topbar,
|
|
.jqc-modern .jqc-sidebar,
|
|
.jqc-modern .jqc-sidebar-backdrop { display: none !important; }
|
|
.jqc-modern .jqc-main { margin-left: 0; padding-top: 0; }
|
|
}
|