@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
/* ══════════════════════════════════════════════════════════════
MITRA ERP Portal — Professional Light Theme
Clean white/light-gray surfaces, blue accent, soft shadows —
same palette family as work-order.html's --wo-* tokens, applied
portal-wide via the shared class vocabulary below.
Include via in each page
OR loaded dynamically by sidebar.js
══════════════════════════════════════════════════════════════ */
:root {
/* ── Core palette ── */
--primary-bg: #f4f6f9;
--secondary-bg: #ffffff;
--accent-color: #2563eb;
--accent-color2: #1d4ed8;
--accent-glow: rgba(37, 99, 235, 0.16);
--text-main: #0f172a;
--text-dim: #64748b;
--text-faint: #94a3b8;
--glass: #ffffff;
--glass-solid: #ffffff;
--glass-border: #e2e8f0;
--glass-border-strong: #cbd5e1;
--error: #dc2626;
--success: #16a34a;
--warning: #d97706;
--font-main: 'Inter', system-ui, -apple-system, sans-serif;
--transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
/* ── Legacy / per-page token names ── */
--bg: #f4f6f9;
--dark: #f4f6f9;
/* Several older pages (admin.html, production.html) use --ink/--ink2/--ink3
as BACKGROUND surfaces (page bg / card+modal bg / a third tier), not as
text-ink colors — keep these as light surfaces so those pages' own
.modal/.comp-card/readonly-input rules (which reference var(--ink2)
directly, not through a class this file already overrides) render
correctly instead of picking up a stray dark/black value. */
--ink: #f4f6f9;
--ink2: #ffffff;
--ink3: #f8fafc;
--blue: #2563eb;
--blue2: #1d4ed8;
--blue-light: #eff6ff;
--blue-glow: rgba(37, 99, 235, 0.12);
--accent: #2563eb;
--accent2: #1d4ed8;
--accent3: #3b82f6;
--text4: #94a3b8;
--text-muted: #64748b;
--text-label: #64748b;
--danger: #dc2626;
--amber: #d97706;
--amber2: #b45309;
--green: #16a34a;
--green2: #15803d;
--teal2: #0d9488;
--teal3: #14b8a6;
--red: #dc2626;
--purple: #7c3aed;
--teal: #0d9488;
--gold: #d97706;
--orange: #ea580c;
--border: #e2e8f0;
--border2: #cbd5e1;
--text: #0f172a;
--text2: #334155;
--text3: #64748b;
--surface: #ffffff;
--surface2: #f8fafc;
--surface3: #eef1f5;
--radius: 10px;
--radius-lg: 14px;
--shadow: 0 1px 3px rgba(15, 23, 42, 0.08), 0 1px 2px rgba(15, 23, 42, 0.04);
}
/* ── Global sizing ──
Pages hardcode pixel font-sizes, so a body zoom is the most
reliable way to scale all text/UI uniformly. Reset to 100% (normal,
un-zoomed) — was 1.18 (18% larger). */
body {
zoom: 1;
}
body {
background-color: var(--primary-bg) !important;
background-image: none !important;
color: var(--text-main) !important;
font-family: var(--font-main) !important;
}
body::before {
display: none !important;
}
.bg-glow {
display: none !important;
}
/* ── Glass utilities from source (kept as solid light surfaces now) ── */
.glass-card {
background: var(--glass) !important;
backdrop-filter: none !important;
border: 1px solid var(--glass-border) !important;
border-radius: 12px !important;
box-shadow: var(--shadow) !important;
}
.accent-glow {
box-shadow: 0 0 0 3px var(--accent-glow) !important;
}
.gradient-text {
background: linear-gradient(135deg, var(--accent-color) 0%, var(--accent-color2) 100%) !important;
-webkit-background-clip: text !important;
background-clip: text !important;
-webkit-text-fill-color: transparent !important;
}
/* ── SIDEBAR — clean light ───────────── */
.sb {
background: #ffffff !important;
border-right: 1px solid var(--glass-border) !important;
box-shadow: 1px 0 0 rgba(15, 23, 42, 0.03) !important;
}
.sb-logo {
padding: 18px 16px 16px !important;
border-bottom: 1px solid var(--glass-border) !important;
}
.sb-logo-mark {
background: linear-gradient(135deg, #2563eb 0%, #4f46e5 100%) !important;
box-shadow: 0 4px 14px rgba(37, 99, 235, 0.3) !important;
border-radius: 9px !important;
letter-spacing: .3px !important;
}
.sb-logo-text {
color: #0f172a !important;
letter-spacing: .3px !important;
}
.sb-logo-text small {
color: #94a3b8 !important;
}
.sb-links { padding: 10px 10px !important; }
.sb-link {
color: #64748b !important;
border-radius: 9px !important;
font-weight: 500 !important;
position: relative !important;
margin: 2px 0 !important;
}
.sb-link:hover {
color: #0f172a !important;
background: #f1f5f9 !important;
}
.sb-link.active {
color: #1d4ed8 !important;
background: #eff6ff !important;
font-weight: 600 !important;
box-shadow: none !important;
}
/* Active left indicator bar */
.sb-link.active::before {
display: block !important;
content: '' !important;
position: absolute !important;
left: 0; top: 50%; transform: translateY(-50%);
width: 3px; height: 58%;
border-radius: 0 4px 4px 0;
background: linear-gradient(180deg, #60a5fa, #2563eb) !important;
box-shadow: none !important;
}
.sb-link svg { color: #94a3b8 !important; }
.sb-link:hover svg { color: #334155 !important; }
.sb-link.active svg { color: #2563eb !important; }
.sb-divider { background: var(--glass-border) !important; }
.sb-group {
color: #94a3b8 !important;
font-size: 10px !important;
letter-spacing: 1px !important;
font-weight: 700 !important;
margin-top: 12px !important;
}
.sb-group:hover {
color: #334155 !important;
background: #f8fafc !important;
}
.sb-group.open { color: #1e293b !important; }
.sb-group svg { color: #94a3b8 !important; opacity: 1 !important; }
.sb-chev { color: #cbd5e1 !important; }
.sb-group.open .sb-chev { color: #2563eb !important; }
.sb-sub svg { color: #cbd5e1 !important; }
.sb-sub.active svg { color: #2563eb !important; }
.sb-bottom { border-top: 1px solid var(--glass-border) !important; }
.sb-user {
background: #f8fafc !important;
border: 1px solid var(--glass-border) !important;
border-radius: 12px !important;
}
.sb-user:hover {
background: #eff6ff !important;
border-color: rgba(37, 99, 235, 0.3) !important;
}
.sb-avatar {
background: linear-gradient(135deg, #2563eb 0%, #4f46e5 100%) !important;
box-shadow: 0 2px 8px rgba(37, 99, 235, 0.25) !important;
border-radius: 9px !important;
}
.sb-role { color: #94a3b8 !important; }
.sb-name { color: #1e293b !important; }
.sb-logout {
color: #dc2626 !important;
border: none !important;
background: transparent !important;
border-radius: 9px !important;
}
.sb-logout:hover {
color: #b91c1c !important;
background: rgba(220, 38, 38, 0.08) !important;
border-color: transparent !important;
}
.sb-toggle-btn { color: #94a3b8 !important; }
.sb-toggle-btn:hover { color: #1e293b !important; background: #f1f5f9 !important; }
/* ── MOBILE BOTTOM BAR ─────────────────────── */
.mob-bar {
background: rgba(255, 255, 255, 0.96) !important;
backdrop-filter: blur(8px) !important;
border-top: 1px solid var(--glass-border) !important;
box-shadow: 0 -2px 12px rgba(15, 23, 42, 0.06) !important;
}
.mob-bar a {
color: var(--text-dim) !important;
}
.mob-bar a.active {
color: var(--accent-color) !important;
background: var(--blue-light) !important;
}
.mob-bar .mb-more {
color: var(--text-dim) !important;
}
/* ── CARDS ──────────────────────────────────── */
.card, .win {
background: var(--glass) !important;
backdrop-filter: none !important;
border-color: var(--glass-border) !important;
box-shadow: var(--shadow) !important;
}
.card:hover, .win:hover {
box-shadow: 0 6px 20px rgba(15, 23, 42, 0.10) !important;
}
.card-hd, .win-bar {
background: var(--surface2) !important;
border-bottom-color: var(--glass-border) !important;
color: var(--text-main) !important;
}
/* ── FORM FIELDS ───────────────────────────── */
.fi, .f-inp, .form-input, .t-inp, .comp-inp, .line-inp, .batch-inp {
background: #ffffff !important;
border-color: var(--glass-border) !important;
color: var(--text-main) !important;
}
.fi:focus, .f-inp:focus, .form-input:focus, .comp-inp:focus, .line-inp:focus {
border-color: var(--accent-color) !important;
box-shadow: 0 0 0 3px var(--accent-glow) !important;
}
.fi::placeholder, .f-inp::placeholder, .form-input::placeholder {
color: var(--text-faint) !important;
}
select.fi, .f-sel, .form-select, .t-sel {
background-color: #ffffff !important;
border-color: var(--glass-border) !important;
color: var(--text-main) !important;
}
select.fi option, .f-sel option, .form-select option, .t-sel option {
background: #ffffff !important;
color: var(--text-main) !important;
}
/* ── LABELS ────────────────────────────────── */
.fl, .f-lbl, .form-label, .comp-fl, .line-fl {
color: var(--text-dim) !important;
}
/* ── BUTTONS ───────────────────────────────── */
.b-primary, .b-planned, .b-save {
background: var(--accent-color) !important;
color: #fff !important;
box-shadow: var(--shadow) !important;
}
.b-primary:hover:not(:disabled), .b-planned:hover:not(:disabled), .b-save:hover:not(:disabled) {
background: var(--accent-color2) !important;
}
.b-cancel {
background: #ffffff !important;
border-color: var(--glass-border) !important;
color: var(--text2) !important;
}
.b-cancel:hover {
background: var(--surface2) !important;
color: var(--text-main) !important;
}
.b-add, .b-new {
background: var(--blue-light) !important;
color: var(--accent-color2) !important;
border-color: #bfdbfe !important;
}
.b-add:hover, .b-new:hover {
background: #dbeafe !important;
}
.b-del {
background: rgba(220, 38, 38, 0.06) !important;
color: var(--error) !important;
border-color: rgba(220, 38, 38, 0.25) !important;
}
.b-issue, .b-release {
background: var(--accent-color) !important;
box-shadow: var(--shadow) !important;
}
.b-issue:hover:not(:disabled), .b-release:hover:not(:disabled) {
background: var(--accent-color2) !important;
}
.b-close {
background: var(--warning) !important;
}
/* ── TABS ──────────────────────────────────── */
.tabs, .module-tabs {
background: var(--surface3) !important;
}
.tab, .module-tab {
color: var(--text-dim) !important;
}
.tab.on, .module-tab.on {
background: #ffffff !important;
color: var(--accent-color) !important;
border-color: var(--glass-border) !important;
box-shadow: var(--shadow) !important;
}
.tab-btn.on {
color: var(--accent-color) !important;
border-bottom-color: var(--accent-color) !important;
}
/* ── COMPONENT CARDS ───────────────────────── */
.comp-card, .line-card, .po-card, .blist-card, .req-card {
background: #ffffff !important;
border-color: var(--glass-border) !important;
}
.comp-card:hover, .po-card:hover, .blist-card:hover, .req-card:hover {
border-color: var(--accent-color) !important;
box-shadow: 0 4px 14px var(--accent-glow) !important;
}
.comp-item, .po-code, .blist-id {
color: var(--accent-color2) !important;
}
.comp-fv {
color: var(--text2) !important;
}
/* ── ALERTS ────────────────────────────────── */
.alert, .al-info, .al-teal, .al-purple {
background: var(--blue-light) !important;
border-color: #bfdbfe !important;
color: var(--accent-color2) !important;
}
.al-green {
background: #f0fdf4 !important;
border-color: #bbf7d0 !important;
color: #15803d !important;
}
.al-amber, .al-gold {
background: #fffbeb !important;
border-color: #fde68a !important;
color: #b45309 !important;
}
.al-red {
background: #fef2f2 !important;
border-color: #fecaca !important;
color: #b91c1c !important;
}
/* ── BADGES / PILLS ────────────────────────── */
.status-badge, .po-badge, .comp-type, .rc-type-badge {
font-weight: 700 !important;
}
.po-badge.released {
background: var(--blue-light) !important;
color: var(--accent-color2) !important;
border-color: #bfdbfe !important;
}
.po-badge.planned {
background: #fffbeb !important;
color: #b45309 !important;
border-color: #fde68a !important;
}
.po-badge.closed {
background: #f0fdf4 !important;
color: #15803d !important;
border-color: #bbf7d0 !important;
}
/* ── STATS / PILLS ─────────────────────────── */
.stat-pill {
background: var(--surface2) !important;
border-color: var(--glass-border) !important;
color: var(--text-main) !important;
}
/* ── TABLE ──────────────────────────────────── */
.bom-tbl th, .p-tbl th, .sr-tbl th, .comp-table th {
background: var(--surface3) !important;
color: var(--text-dim) !important;
border-color: var(--glass-border) !important;
}
.bom-tbl td, .p-tbl td {
background: transparent !important;
color: var(--text2) !important;
border-color: var(--glass-border) !important;
}
.bom-tbl tbody tr:nth-child(even) td, .p-tbl tbody tr:nth-child(even) td {
background: var(--surface2) !important;
}
.bom-tbl tbody tr:hover td, .p-tbl tbody tr:hover td {
background: var(--blue-light) !important;
}
/* ── SEARCH DROPDOWN ───────────────────────── */
.search-dd, .item-dd {
background: var(--glass-solid) !important;
border-color: var(--accent-color) !important;
box-shadow: 0 8px 28px rgba(15, 23, 42, 0.16) !important;
z-index: 500 !important;
}
.card, .card-bd, .win {
overflow: visible !important;
}
.sd-row, .dd-row {
border-bottom-color: var(--glass-border) !important;
color: var(--text2) !important;
}
.sd-row:hover, .dd-row:hover {
background: var(--blue-light) !important;
}
.sd-code, .dd-code {
color: var(--accent-color2) !important;
}
/* ── TOAST ──────────────────────────────────── */
.t-ok {
background: var(--success) !important;
}
.t-err {
background: var(--error) !important;
}
/* ── MODAL ─────────────────────────────────── */
.modal, .modal-overlay .modal {
background: var(--glass-solid) !important;
border-color: var(--glass-border) !important;
box-shadow: 0 24px 60px rgba(15, 23, 42, 0.25) !important;
}
.modal-hd, .modal-header {
background: var(--surface2) !important;
border-bottom-color: var(--glass-border) !important;
color: var(--text-main) !important;
}
.modal-bd, .modal-body {
background: transparent !important;
}
.modal-footer {
background: var(--surface2) !important;
border-top-color: var(--glass-border) !important;
}
/* ── TOTALS ────────────────────────────────── */
.total-row, .tot-strip {
background: var(--surface3) !important;
}
.total-row .tv {
color: var(--teal) !important;
}
/* ── PIPELINE ──────────────────────────────── */
.pipeline-header {
background: var(--surface2) !important;
border-color: var(--glass-border) !important;
}
/* ── BATCH SECTION ─────────────────────────── */
.batch-sec {
background: var(--surface2) !important;
border-color: var(--glass-border) !important;
}
/* ── ORDER INFO ────────────────────────────── */
.order-info, .oi-item {
color: var(--text2) !important;
}
.oi-l {
color: var(--text-dim) !important;
}
/* ── SUCCESS BOX ───────────────────────────── */
.suc-box, .success-page {
background: var(--glass) !important;
}
.suc-title {
color: #15803d !important;
}
.suc-pill {
background: var(--blue-light) !important;
color: var(--accent-color2) !important;
border-color: #bfdbfe !important;
}
/* ── SKELETON ──────────────────────────────── */
.skeleton {
background: linear-gradient(90deg, #eef1f5 25%, #f8fafc 50%, #eef1f5 75%) !important;
}
/* ── EMPTY MESSAGE ─────────────────────────── */
.empty-msg, .bom-msg, .po-empty {
color: var(--text-dim) !important;
}
/* ── FILTER TABS ───────────────────────────── */
.filter-tab {
border-color: var(--glass-border) !important;
color: var(--text-dim) !important;
background: #ffffff !important;
}
.filter-tab.on, .filter-tab:hover {
border-color: var(--accent-color) !important;
color: var(--accent-color2) !important;
background: var(--blue-light) !important;
}
/* ── DT ROWS (detail) ──────────────────────── */
.dt-row {
border-bottom-color: var(--glass-border) !important;
}
.dt-row .dt-l {
color: var(--text-dim) !important;
}
.dt-row .dt-v {
color: var(--text2) !important;
}
/* ═══════════════════════════════════════════
LOGIN PAGE + HOME DASHBOARD
═══════════════════════════════════════════ */
.login-card {
background: var(--glass) !important;
backdrop-filter: none !important;
border-color: var(--glass-border) !important;
box-shadow: var(--shadow) !important;
}
.login-h {
color: var(--text-main) !important;
}
.login-sub {
color: var(--text-dim) !important;
}
.login-logo-box, .login-logo-mark {
background: var(--accent-color) !important;
box-shadow: 0 4px 14px var(--accent-glow) !important;
}
.login-logo-text {
color: var(--text-main) !important;
}
.field-label {
color: var(--text-dim) !important;
}
.field-input {
background: #ffffff !important;
border-color: var(--glass-border) !important;
color: var(--text-main) !important;
}
.field-input:focus {
border-color: var(--accent-color) !important;
box-shadow: 0 0 0 3px var(--accent-glow) !important;
}
.field-input::placeholder {
color: var(--text-faint) !important;
}
.btn-primary {
background: var(--accent-color) !important;
border: none !important;
box-shadow: var(--shadow) !important;
}
.btn-primary:hover {
background: var(--accent-color2) !important;
}
.err-box {
background: #fef2f2 !important;
border-color: #fecaca !important;
color: #b91c1c !important;
}
/* Dashboard cards */
.dash-card, .quick-card {
background: var(--glass) !important;
backdrop-filter: none !important;
border-color: var(--glass-border) !important;
}
.dash-card:hover, .quick-card:hover {
border-color: var(--accent-color) !important;
box-shadow: 0 4px 16px var(--accent-glow) !important;
}
.stat-box {
background: var(--glass) !important;
border-color: var(--glass-border) !important;
}
.page-title {
color: var(--text-main) !important;
}
.page-sub {
color: var(--text-dim) !important;
}
/* Stat cards on dashboard */
.stat-card {
background: var(--glass) !important;
backdrop-filter: none !important;
border-color: var(--glass-border) !important;
}
.stat-val {
color: var(--text-main) !important;
}
.stat-label {
color: var(--text-dim) !important;
}
.stats-grid {
gap: 12px !important;
}
/* Info pill on dashboard */
.info-pill, .pipeline-info {
background: var(--surface2) !important;
border-color: var(--glass-border) !important;
color: var(--text-dim) !important;
}
/* Action cards / Quick links on dashboard */
.actions-grid > div, [class*="action"] {
background: var(--glass) !important;
border-color: var(--glass-border) !important;
}
/* Old top nav — fully replaced by the sidebar (sidebar.js removes the element
on load). Hidden here so it never flashes during page load: every page that
loads theme.css also loads sidebar.js, so no page still needs it. The
sidebar itself is a div.sb, not