38471-vm/assets/css/custom.css
2026-05-08 14:13:02 +00:00

926 lines
19 KiB
CSS

:root {
--primary: #0f172a;
--primary-light: #1e293b;
--accent: #3b82f6;
--bg: #f8fafc;
--surface: #ffffff;
--text: #334155;
--text-muted: #64748b;
--border: #e2e8f0;
--radius: 4px;
--sidebar-width: 210px;
}
body.theme-dark {
--primary: #1e293b;
--primary-light: #334155;
--accent: #60a5fa;
--bg: #0f172a;
--surface: #1e293b;
--text: #f1f5f9;
--text-muted: #94a3b8;
--border: #334155;
}
body.theme-nord {
--primary: #2e3440;
--primary-light: #3b4252;
--accent: #88c0d0;
--bg: #eceff4;
--surface: #ffffff;
--text: #2e3440;
--text-muted: #4c566a;
--border: #d8dee9;
}
body.theme-dracula {
--primary: #282a36;
--primary-light: #44475a;
--accent: #bd93f9;
--bg: #1e1f29;
--surface: #282a36;
--text: #f8f8f2;
--text-muted: #6272a4;
--border: #44475a;
}
body.theme-citrus {
--primary: #365314;
--primary-light: #4d7c0f;
--accent: #84cc16;
--bg: #f7fee7;
--surface: #ffffff;
--text: #1a2e05;
--text-muted: #65a30d;
--border: #ecfccb;
}
body.theme-ocean {
--primary: #083344;
--primary-light: #164e63;
--accent: #06b6d4;
--bg: #ecfeff;
--surface: #ffffff;
--text: #164e63;
--text-muted: #67e8f9;
--border: #cffafe;
}
body.theme-forest {
--primary: #064e3b;
--primary-light: #065f46;
--accent: #10b981;
--bg: #f0fdf4;
--surface: #ffffff;
--text: #064e3b;
--text-muted: #34d399;
--border: #dcfce7;
}
body.theme-sunset {
--primary: #451a03;
--primary-light: #78350f;
--accent: #f59e0b;
--bg: #fffbeb;
--surface: #ffffff;
--text: #451a03;
--text-muted: #fbbf24;
--border: #fef3c7;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background-color: var(--bg);
color: var(--text);
margin: 0;
overflow-x: hidden;
}
[dir="rtl"] {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
/* Sidebar */
.sidebar {
width: var(--sidebar-width);
height: 100vh;
background-color: #0f172a; /* Updated to match system primary dark blue */
color: white;
position: fixed;
top: 0;
transition: all 0.3s;
z-index: 1000;
overflow-y: auto;
overflow-x: hidden;
}
/* Custom scrollbar for sidebar */
.sidebar::-webkit-scrollbar {
width: 6px;
}
.sidebar::-webkit-scrollbar-track {
background: transparent;
}
.sidebar::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
}
.sidebar::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
/* Base positioning for desktop */
@media (min-width: 1200px) {
[dir="ltr"] .sidebar { left: 0 !important; right: auto !important; }
[dir="rtl"] .sidebar { right: 0 !important; left: auto !important; }
[dir="ltr"] .main-content { margin-left: var(--sidebar-width) !important; margin-right: 0 !important; }
[dir="rtl"] .main-content { margin-left: 0 !important; margin-right: var(--sidebar-width) !important; }
}
.sidebar-header {
padding: 1rem;
font-size: 1.15rem;
font-weight: 700;
border-bottom: 1px solid rgba(255, 255, 255, 0.1); /* Lighter border for blue bg */
}
.nav-link {
font-weight: 400; /* Normal font for sub items */
color: rgba(255, 255, 255, 0.9); /* Lighter text for blue bg */
padding: 0.6rem 1rem;
display: flex;
align-items: center;
text-decoration: none;
transition: background 0.2s;
}
.nav-link:hover, .nav-link.active {
background-color: rgba(255, 255, 255, 0.1); /* Subtle hover for blue bg */
color: white;
}
.nav-link i {
width: 20px;
margin-right: 8px;
}
.nav-section-title {
font-size: 0.85rem;
font-weight: 700 !important; /* Bold for main category */
color: #38bdf8 !important; /* Sky Blue for distinction */
letter-spacing: 0.05em;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-section-title:hover {
color: white !important;
}
.nav-section-title i.chevron {
transition: transform 0.2s;
font-size: 0.6rem;
}
.nav-section-title.collapsed i.chevron {
transform: rotate(-90deg);
}
.nav-section-title .group-icon {
width: 18px;
margin-right: 10px;
}
[dir="rtl"] .nav-section-title .group-icon {
margin-right: 0;
margin-left: 10px;
}
/* POS Styles */
.pos-container {
display: flex;
align-items: stretch;
height: calc(100vh - 120px);
gap: 20px;
min-height: 0;
}
.pos-products {
flex: 1 1 auto;
min-width: 0;
overflow-y: auto;
padding-right: 10px;
}
[dir="rtl"] .pos-products {
padding-right: 0;
padding-left: 10px;
}
.pos-cart {
flex: 0 0 400px;
width: 400px;
min-width: 320px;
max-width: 400px;
min-height: 0;
background: var(--surface);
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0,0,0,0.05);
display: flex;
flex-direction: column;
height: 100%;
}
.pos-toolbar,
.pos-cart-header,
.pos-cart-actions {
gap: 0.75rem;
}
.pos-toolbar {
align-items: center;
}
.pos-toolbar .input-group {
min-width: 0;
}
.pos-cart-header {
flex-wrap: wrap;
}
.pos-cart-actions {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
}
.pos-cart-actions .btn {
display: inline-flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 15px;
}
.product-card {
background: var(--surface);
border-radius: 10px;
border: 1px solid var(--border);
padding: 15px;
text-align: center;
cursor: pointer;
transition: all 0.2s;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.product-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0,0,0,0.05);
border-color: var(--accent);
}
.product-card img {
width: 100%;
height: 120px;
object-fit: contain;
margin-bottom: 10px;
border-radius: 8px;
}
.product-card .price {
font-weight: 700;
color: var(--text);
}
.cart-items {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 20px;
}
.cart-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid var(--border);
}
.cart-total {
padding: 20px;
background: var(--bg);
border-bottom-left-radius: 12px;
border-bottom-right-radius: 12px;
}
.qty-controls {
display: flex;
align-items: center;
gap: 10px;
}
.qty-btn {
width: 24px;
height: 24px;
border-radius: 50%;
border: 1px solid var(--border);
background: var(--surface);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-size: 14px;
color: var(--text);
}
.qty-btn:hover {
background: var(--bg);
}
@media (max-width: 1199.98px) {
.pos-container {
gap: 16px;
}
.pos-cart {
flex-basis: 340px;
width: 340px;
min-width: 300px;
max-width: 340px;
}
.product-grid {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 12px;
}
.product-card {
padding: 12px;
}
}
@media (max-width: 991.98px) {
.pos-toolbar {
flex-wrap: wrap;
}
.pos-toolbar .input-group {
flex: 1 1 220px;
}
.pos-toolbar .btn {
margin-inline-start: auto;
}
.pos-cart-actions {
width: 100%;
justify-content: flex-start;
}
}
@media (max-width: 899.98px) {
.pos-cart {
flex-basis: 300px;
width: 300px;
min-width: 280px;
max-width: 300px;
}
.product-grid {
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 10px;
}
.pos-cart-action-text {
display: none;
}
.pos-cart-actions .btn i {
margin: 0 !important;
}
}
[dir="rtl"] .nav-link i {
margin-right: 0;
margin-left: 8px;
}
/* Main Content */
.main-content {
padding: 2rem;
transition: all 0.3s;
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* Desktop margins handled in the top @media block */
@media (max-width: 1199.98px) {
[dir="ltr"] .sidebar {
left: calc(-1 * var(--sidebar-width)) !important;
}
[dir="ltr"] .sidebar.show {
left: 0 !important;
box-shadow: 0 0 50px rgba(0,0,0,0.3) !important;
}
[dir="rtl"] .sidebar {
right: calc(-1 * var(--sidebar-width)) !important;
left: auto !important;
}
[dir="rtl"] .sidebar.show {
right: 0 !important;
left: auto !important;
box-shadow: 0 0 50px rgba(0,0,0,0.3) !important;
}
.main-content {
margin-left: 0 !important;
margin-right: 0 !important;
width: 100% !important;
}
}
.sidebar-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 999;
}
.sidebar-overlay.show {
display: block;
}
.topbar {
background: var(--surface);
border-bottom: 1px solid var(--border);
padding: 1rem 2rem;
margin: -2rem -2rem 2rem -2rem;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
}
/* UI Components */
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.btn-primary {
background-color: var(--accent);
border: none;
border-radius: var(--radius);
}
.table {
color: var(--text);
}
.table th {
font-weight: 600;
color: var(--text-muted);
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.05em;
border-bottom: 2px solid var(--border);
}
.op-50 {
opacity: 0.5;
}
.main-footer {
background: transparent;
color: var(--text-muted);
margin-top: auto;
flex-shrink: 0;
}
.main-footer .border-top {
border-color: var(--border) !important;
}
/* RTL Adjustments */
/* Theme Compatibility Overrides */
body.theme-dark, body.theme-dracula {
color-scheme: dark;
}
body:not(.theme-default) .text-dark {
color: var(--text) !important;
}
body:not(.theme-default) .bg-light,
body:not(.theme-default) .bg-white {
background-color: var(--surface) !important;
}
body:not(.theme-default) .border-dark {
border-color: var(--border) !important;
}
body:not(.theme-default) .list-group-item {
background-color: var(--surface);
color: var(--text);
border-color: var(--border);
}
body:not(.theme-default) .list-group-item-action:hover {
background-color: var(--bg);
color: var(--accent);
}
body:not(.theme-default) .dropdown-menu {
background-color: var(--surface);
border-color: var(--border);
}
body:not(.theme-default) .dropdown-item {
color: var(--text);
}
body:not(.theme-default) .dropdown-item:hover {
background-color: var(--primary-light);
color: #fff;
}
body:not(.theme-default) .alert-warning {
background-color: var(--primary-light);
border-color: var(--accent);
color: var(--text);
}
body:not(.theme-default) .modal-content {
background-color: var(--surface);
color: var(--text);
border-color: var(--border);
}
body:not(.theme-default) .form-control,
body:not(.theme-default) .form-select {
background-color: var(--bg);
border-color: var(--border);
color: var(--text);
}
body:not(.theme-default) .form-control:focus,
body:not(.theme-default) .form-select:focus {
background-color: var(--bg);
border-color: var(--accent);
color: var(--text);
}
[dir="rtl"] .ms-auto {
margin-right: auto !important;
margin-left: 0 !important;
}
[dir="rtl"] .text-end {
text-align: left !important;
}
[dir="rtl"] .text-start {
text-align: right !important;
}
[dir="rtl"] .me-3 {
margin-right: 0 !important;
margin-left: 1rem !important;
}
[dir="rtl"] .me-2 {
margin-right: 0 !important;
margin-left: 0.5rem !important;
}
[dir="rtl"] .ms-2 {
margin-left: 0 !important;
margin-right: 0.5rem !important;
}
/* Thermal Receipt Styles */
.thermal-receipt {
width: 80mm;
max-width: 100%;
margin: 0 auto;
padding: 10px;
box-sizing: border-box;
font-family: 'Courier New', Courier, monospace;
font-size: 12px;
line-height: 1.4;
background: #fff;
color: #000;
break-inside: avoid;
page-break-inside: avoid;
}
.thermal-receipt.rtl {
direction: rtl;
text-align: right;
}
.thermal-receipt .center {
text-align: center;
}
.thermal-receipt .separator {
border-top: 1px dashed #000;
margin: 10px 0;
}
.thermal-receipt table {
width: 100%;
table-layout: fixed;
border-collapse: collapse;
}
.thermal-receipt table th {
text-align: left;
border-bottom: 1px dashed #000;
font-size: 10px;
word-break: break-word;
}
.thermal-receipt.rtl table th {
text-align: right;
}
.thermal-receipt table td {
padding: 5px 0;
font-size: 11px;
word-break: break-word;
}
.thermal-receipt .total-row {
font-weight: bold;
font-size: 14px;
}
@media print {
.thermal-receipt-print {
width: 76mm !important;
max-width: 76mm !important;
margin: 0 auto !important;
padding: 2mm !important;
box-sizing: border-box !important;
}
body.printing-receipt * {
visibility: hidden;
}
body.printing-receipt .thermal-receipt-print,
body.printing-receipt .thermal-receipt-print * {
visibility: visible !important;
}
body.printing-receipt #posPrintArea {
visibility: visible !important;
display: flex !important;
justify-content: center !important;
align-items: flex-start !important;
position: fixed !important;
inset: 0 !important;
width: 100% !important;
margin: 0 !important;
padding: 0 !important;
z-index: 9999 !important;
background: #fff !important;
}
body.printing-receipt .thermal-receipt-print {
position: static !important;
left: auto !important;
top: auto !important;
display: block !important;
}
}
/* Payment Modal Styles */
.payment-methods-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
margin-bottom: 20px;
}
.payment-method-btn {
border: 2px solid #e2e8f0;
background: #fff;
padding: 15px 10px;
border-radius: 10px;
text-align: center;
cursor: pointer;
transition: all 0.2s;
}
.payment-method-btn.active {
border-color: #3b82f6;
background: #eff6ff;
color: #3b82f6;
}
.payment-method-btn i {
font-size: 1.5rem;
display: block;
margin-bottom: 5px;
}
.quick-pay-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 5px;
margin-top: 10px;
}
.quick-pay-btn {
padding: 10px;
border: 1px solid #e2e8f0;
background: #f8fafc;
border-radius: 6px;
text-align: center;
cursor: pointer;
font-weight: 600;
}
.quick-pay-btn:hover {
background: #edf2f7;
}
.amount-due-box {
background: #f1f5f9;
padding: 15px;
border-radius: 10px;
text-align: center;
margin-bottom: 20px;
}
.amount-due-box .label {
font-size: 0.75rem;
color: #64748b;
text-transform: uppercase;
font-weight: 600;
}
.amount-due-box .value {
font-size: 1.25rem;
font-weight: 800;
color: #0f172a;
}
.payment-line {
background: #f8f9fa;
border-radius: 8px;
padding: 10px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #e9ecef;
}
.payment-line .method {
font-weight: 600;
text-transform: capitalize;
}
.payment-line .amount {
font-weight: 700;
}
.payment-summary {
border-top: 2px dashed #dee2e6;
margin-top: 15px;
padding-top: 15px;
}
/* Styled Modal Headers */
.modal-header, .card-header {
background-color: var(--accent);
color: white;
border-bottom: 1px solid var(--border);
}
.modal-title, .card-title {
color: white !important;
}
.modal-header .btn-close {
filter: invert(1) grayscale(100%) brightness(200%);
}
/* 3-Column Form Grid */
.form-grid-3 {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
@media (max-width: 992px) {
.form-grid-3 {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.form-grid-3 {
grid-template-columns: 1fr;
}
}
.form-grid-3 > div {
width: 100% !important; /* Override bootstrap cols if present */
max-width: 100% !important;
flex: none !important;
}
/* Helpers to span columns in grid */
.form-grid-3 > .span-2 { grid-column: span 2; }
.form-grid-3 > .span-3 { grid-column: span 3; }
.form-grid-3 > .full-width { grid-column: 1 / -1; }
/* Handle existing bootstrap classes in grid */
.form-grid-3 > .col-12,
.form-grid-3 > .col-md-12 {
grid-column: 1 / -1;
}
.form-grid-3 > .col-md-8 {
grid-column: span 2;
}
/* Ensure form controls take full width of their grid cell */
.form-grid-3 .form-control,
.form-grid-3 .form-select,
.form-grid-3 .input-group {
width: 100%;
}
/* Document list filters + table */
.documents-filter {
display: flex;
align-items: flex-end;
gap: 0.75rem;
flex-wrap: nowrap;
}
.documents-filter__field {
flex: 1 1 0;
min-width: 0;
}
.documents-filter__field--search {
flex: 1.45 1 230px;
}
.documents-filter__field--party {
flex: 1.2 1 210px;
}
.documents-filter__field--date {
flex: 0 1 150px;
}
.documents-filter__field .form-label {
margin-bottom: 0.35rem;
}
.documents-filter__field .form-control,
.documents-filter__field .form-select {
width: 100%;
}
.documents-filter__actions {
display: flex;
flex: 0 0 auto;
align-items: flex-end;
justify-content: flex-end;
gap: 0.5rem;
flex-wrap: wrap;
margin-left: auto;
}
.documents-filter__actions .btn,
.documents-filter__actions .dropdown-toggle {
white-space: nowrap;
}
.documents-table__party {
min-width: 190px;
}
.documents-table__dates {
min-width: 148px;
}
@media (max-width: 1399.98px) {
.documents-filter {
flex-wrap: wrap;
}
.documents-filter__field--date {
flex: 1 1 165px;
}
.documents-filter__actions {
width: 100%;
justify-content: flex-start;
margin-left: 0;
}
}
@media (max-width: 767.98px) {
.documents-filter {
gap: 0.6rem;
}
.documents-filter__field,
.documents-filter__actions {
flex: 1 1 100%;
width: 100%;
}
.documents-filter__actions .btn,
.documents-filter__actions .dropdown {
flex: 1 1 calc(50% - 0.3rem);
}
}