Kufrik/www/css/layout.css

915 lines
21 KiB
CSS

/* --- 1. GLOBÁLNÍ PROMĚNNÉ BARVY & BASE --- */
:root {
--app-bg: #eef3fa;
--header-bg: #1f4f8f;
--header-active: #163e73;
--primary-accent: #2f6fce;
--primary-accent-hover: #245db3;
--primary-soft: #e3eefc;
--primary-soft-border: #b7d0f3;
--text-main: #1c2b42;
--text-muted: #5c6e86;
--border-color: #dbe4f0;
--card-bg: #ffffff;
--radius-sm: 0.5rem;
--radius-md: 0.75rem;
--page-max: 1080px;
--success: #14915f;
--success-hover: #0f7a4f;
--success-soft: #d9f5e8;
--warning-soft: #ffe8bf;
--warning-text: #b86e00;
--danger: #e04b4b;
--danger-hover: #c93737;
--danger-soft: #fde2e2;
}
html, body {
height: 100%;
font-size: 0.9rem;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
color: var(--text-main);
}
body {
display: flex;
flex-direction: column;
background-color: var(--app-bg);
}
/* --- 2. HORNÍ LIŠTA (HEADER) --- */
.app-header {
background-color: var(--header-bg);
padding: 0.35rem 0;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
}
.app-header .navbar-brand {
font-weight: 700;
font-size: 1.05rem;
letter-spacing: -0.01em;
color: #fff !important;
margin-right: 1.5rem;
}
.app-header .nav-tabs {
border-bottom: none;
gap: 0.25rem;
}
.app-header .nav-link {
color: #c5d0de;
border: none !important;
padding: 0.45rem 0.85rem;
font-weight: 500;
border-radius: var(--radius-sm) !important;
transition: all 0.15s ease-in-out;
}
.app-header .nav-link:hover {
color: #f1f5f9;
background-color: rgba(255, 255, 255, 0.05);
}
.app-header .nav-link.active {
color: #ffffff !important;
background-color: var(--header-active) !important;
font-weight: 600;
box-shadow: 0 1px 2px rgba(0,0,0,0.2);
}
.user-panel {
display: flex;
align-items: center;
gap: 0.75rem;
margin-left: auto;
}
.user-panel-link {
display: inline-flex;
align-items: center;
text-decoration: none;
opacity: 0.92;
border-radius: var(--radius-sm);
padding: 0.2rem 0.35rem;
transition: opacity 0.15s ease, background-color 0.15s ease;
}
.user-panel-link:hover,
.user-panel-link:focus-visible {
opacity: 1;
color: #fff;
background-color: rgba(255, 255, 255, 0.08);
text-decoration: none;
}
.user-panel .btn-outline-light {
border-color: #5d7390;
color: #e4ebf4;
border-radius: 999px;
padding-inline: 0.85rem;
}
.user-panel .btn-outline-light:hover {
background-color: rgba(255, 255, 255, 0.1);
border-color: #c5d4e6;
color: #fff;
}
/* --- 3. AKČNÍ LIŠTA (TOOLBAR) --- */
.action-toolbar {
background-color: var(--card-bg);
border-bottom: 1px solid var(--border-color);
padding: 0.6rem 1rem;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03);
}
.toolbar-group {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.action-buttons {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
/* Zpříjemněné tlačítka v toolbar */
.btn-action {
display: inline-flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-width: 82px;
padding: 0.35rem 0.65rem;
font-size: 0.78rem;
font-weight: 500;
border-radius: var(--radius-sm);
border: 1px solid #e2e8f0;
background-color: #fff;
color: #475569;
transition: all 0.15s ease-in-out;
}
.btn-action:hover {
background-color: #f8fafc;
border-color: #cbd5e1;
color: #0f172a;
transform: translateY(-1px);
}
.btn-action i {
font-size: 1.35rem;
margin-bottom: 0.15rem;
}
.btn-action.btn-success {
background-color: var(--success);
border-color: var(--success);
color: #fff;
}
.btn-action.btn-success:hover {
background-color: var(--success-hover);
border-color: var(--success-hover);
color: #fff;
}
.btn-action.btn-outline-primary,
.btn-action.btn-primary,
.btn-action.btn-primary.active {
color: #1f5eae;
border-color: var(--primary-soft-border);
background-color: var(--primary-soft);
}
.btn-action.btn-outline-primary:hover,
.btn-action.btn-primary:hover,
.btn-action.btn-primary.active {
background-color: #d3e4fa;
border-color: #8eb4e8;
color: #184e94;
}
/* Oddělovač */
.v-divider {
width: 1px;
height: 36px;
background-color: var(--border-color);
margin: 0 0.25rem;
}
/* --- 4. FILTRY --- */
.filter-panel {
display: flex;
align-items: center;
gap: 0.4rem;
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
padding: 0.25rem 0.5rem;
background-color: #f8fafc;
}
.filter-panel select {
border-color: #cbd5e1;
color: #334155;
font-size: 0.8rem;
}
/* --- 5. OBSAH A PATKA --- */
.main-content {
flex: 1 1 auto;
width: min(var(--page-max), 100%);
margin-inline: auto;
padding: 1.25rem 1rem 2rem;
}
/* Vnější obal jen drží obsah, sám se neroztahuje na výšku okna */
.main-content > .content-card {
background: transparent;
border: 0;
box-shadow: none;
height: auto;
padding: 0;
}
.content-card {
background: var(--card-bg);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
height: auto;
padding: 1.25rem;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);
}
.main-content .container-fluid {
padding-left: 0;
padding-right: 0;
}
.app-footer {
background-color: var(--card-bg);
border-top: 1px solid var(--border-color);
padding: 0.35rem 1.25rem;
font-size: 0.8rem;
color: var(--text-muted);
display: flex;
align-items: center;
justify-content: space-between;
}
/* --- 6. SIGN-IN PAGE --- */
.login-page {
flex: 1 1 auto;
display: flex;
align-items: center;
justify-content: center;
padding: 1.5rem;
background-color: var(--app-bg);
}
.login-card {
width: 100%;
max-width: 380px;
background-color: var(--card-bg);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
padding: 2rem;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
}
.login-header {
text-align: center;
margin-bottom: 1.75rem;
}
.login-title {
font-size: 1.5rem;
font-weight: 700;
color: var(--header-bg); /* Tmavě břidlicová ze stejné palety */
margin: 0 0 0.25rem 0;
letter-spacing: -0.02em;
}
.login-subtitle {
font-size: 0.85rem;
color: var(--text-muted);
margin: 0;
}
.login-form .form-group {
margin-bottom: 1.15rem;
}
.login-form label {
display: block;
font-weight: 500;
font-size: 0.825rem;
color: var(--text-main);
margin-bottom: 0.35rem;
}
.login-form .input-group > .form-control {
width: 1%;
}
.login-form .form-control {
width: 100%;
padding: 0.5rem 0.75rem;
font-size: 0.875rem;
color: var(--text-main);
background-color: #fff;
border: 1px solid #cbd5e1;
border-radius: var(--radius-sm);
box-sizing: border-box;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.login-form .form-control:focus {
outline: none;
border-color: var(--primary-accent);
box-shadow: 0 0 0 3px rgba(109, 144, 196, 0.22);
}
.login-form .btn-primary {
width: 100%;
padding: 0.6rem;
font-size: 0.875rem;
font-weight: 600;
color: #fff;
background-color: var(--primary-accent);
border: 1px solid var(--primary-accent);
border-radius: var(--radius-sm);
cursor: pointer;
transition: all 0.15s ease-in-out;
margin-top: 0.5rem;
}
.login-form .btn-primary:hover {
background-color: var(--primary-accent-hover);
border-color: var(--primary-accent-hover);
transform: translateY(-1px);
}
/* Chybové zprávy */
.error-list {
list-style: none;
padding: 0.5rem 0.75rem;
margin: 0 0 1rem 0;
background-color: #fef2f2;
border: 1px solid #fecaca;
border-radius: var(--radius-sm);
color: #dc2626;
font-size: 0.8rem;
}
.alert {
padding: 0.65rem 0.85rem;
border-radius: var(--radius-sm);
font-size: 0.825rem;
margin-bottom: 1rem;
}
.alert-danger, .alert-error {
background-color: #fef2f2;
border: 1px solid #fecaca;
color: #991b1b;
}
.alert-success {
background-color: var(--success-soft);
border: 1px solid #c9e6da;
color: #2f6b58;
}
/* --- 7. JEMNĚJŠÍ PALETA NAD BOOTSTRAPEM --- */
a {
color: #1f62c0;
}
a:hover {
color: #184e9c;
}
.text-primary { color: #1f62c0 !important; }
.text-success { color: #0e8a56 !important; }
.text-warning { color: var(--warning-text) !important; }
.text-danger { color: #d63c3c !important; }
.text-info { color: #0e7ea8 !important; }
.bg-primary { background-color: #7fa0cb !important; }
.border-primary { border-color: #8aabd4 !important; }
.border-success { border-color: #b7dccb !important; }
.border-warning { border-color: #ead7b0 !important; }
.border-danger { border-color: #e4c4c4 !important; }
/* Souhrnné karty — sytý podklad, ať nepůsobí vybledle */
.card.border-start {
border-width: 1px 1px 1px 6px !important;
border-style: solid !important;
box-shadow: 0 1px 3px rgba(20, 50, 100, 0.08);
}
.card.border-start.border-primary {
border-color: #c5daf6 !important;
border-left-color: #1f62c9 !important;
background-color: #d7e7fb !important;
}
.card.border-start.border-warning {
border-color: #f6ddaa !important;
border-left-color: #e39b00 !important;
background-color: #ffe7b8 !important;
}
.card.border-start.border-danger {
border-color: #f6c9c9 !important;
border-left-color: #e04545 !important;
background-color: #fcd6d6 !important;
}
.card.border-start.border-success {
border-color: #b7e8d0 !important;
border-left-color: #12945f !important;
background-color: #d4f3e4 !important;
}
.card.border-start .text-primary { color: #154eaa !important; }
.card.border-start .text-warning { color: #9a5c00 !important; }
.card.border-start .text-danger { color: #c42828 !important; }
.card.border-start .text-success { color: #0c7a4c !important; }
.border-info { border-color: #c5dceb !important; }
.border-secondary { border-color: #d5dee8 !important; }
.bg-success-subtle { background-color: var(--success-soft) !important; }
.bg-secondary-subtle { background-color: #f1f4f8 !important; }
.form-control:focus,
.form-select:focus {
border-color: #a9c0df;
box-shadow: 0 0 0 0.2rem rgba(109, 144, 196, 0.18);
}
/* Tlačítka */
.btn {
--bs-btn-border-radius: 0.5rem;
font-weight: 500;
letter-spacing: 0.01em;
box-shadow: none;
transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
}
.btn:focus-visible {
box-shadow: 0 0 0 0.2rem rgba(109, 144, 196, 0.28);
}
.btn-primary {
--bs-btn-color: #fff;
--bs-btn-bg: var(--primary-accent);
--bs-btn-border-color: var(--primary-accent);
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: var(--primary-accent-hover);
--bs-btn-hover-border-color: var(--primary-accent-hover);
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #1d4f96;
--bs-btn-active-border-color: #1d4f96;
--bs-btn-disabled-bg: #b7c8e0;
--bs-btn-disabled-border-color: #b7c8e0;
}
.btn-outline-primary {
--bs-btn-color: #1f5eae;
--bs-btn-border-color: #b7d0f3;
--bs-btn-bg: var(--primary-soft);
--bs-btn-hover-color: #184e94;
--bs-btn-hover-bg: #d3e4fa;
--bs-btn-hover-border-color: #8eb4e8;
--bs-btn-active-color: #184e94;
--bs-btn-active-bg: #c5daf6;
--bs-btn-active-border-color: #8eb4e8;
}
.btn-success {
--bs-btn-color: #fff;
--bs-btn-bg: var(--success);
--bs-btn-border-color: var(--success);
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: var(--success-hover);
--bs-btn-hover-border-color: var(--success-hover);
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #437c68;
--bs-btn-active-border-color: #437c68;
}
.btn-outline-success {
--bs-btn-color: #0c7a4c;
--bs-btn-border-color: #9ed9bc;
--bs-btn-bg: var(--success-soft);
--bs-btn-hover-color: #08663e;
--bs-btn-hover-bg: #c3edd8;
--bs-btn-hover-border-color: #6ec99e;
--bs-btn-active-color: #08663e;
--bs-btn-active-bg: #b4e6ce;
--bs-btn-active-border-color: #6ec99e;
}
.btn-outline-secondary {
--bs-btn-color: #5c6d82;
--bs-btn-border-color: #d7e0ea;
--bs-btn-bg: #fff;
--bs-btn-hover-color: #3e5168;
--bs-btn-hover-bg: #f4f7fb;
--bs-btn-hover-border-color: #c5d1de;
--bs-btn-active-color: #3e5168;
--bs-btn-active-bg: #eaf0f6;
--bs-btn-active-border-color: #c5d1de;
}
.btn-outline-danger {
--bs-btn-color: #c43737;
--bs-btn-border-color: #f0b8b8;
--bs-btn-bg: #fff;
--bs-btn-hover-color: #a82828;
--bs-btn-hover-bg: var(--danger-soft);
--bs-btn-hover-border-color: #e89090;
--bs-btn-active-color: #a82828;
--bs-btn-active-bg: #f8d0d0;
--bs-btn-active-border-color: #e89090;
}
.btn-outline-dark {
--bs-btn-color: #4a5b70;
--bs-btn-border-color: #d5dee8;
--bs-btn-hover-bg: #f3f6fa;
--bs-btn-hover-color: #2c3d55;
--bs-btn-hover-border-color: #c3d0de;
--bs-btn-active-bg: #e8eef5;
--bs-btn-active-color: #2c3d55;
}
.btn-outline-info {
--bs-btn-color: #4d7a9a;
--bs-btn-border-color: #cfe0ec;
--bs-btn-bg: #f4f9fc;
--bs-btn-hover-color: #3d6784;
--bs-btn-hover-bg: #e7f2f8;
--bs-btn-hover-border-color: #bdd4e4;
--bs-btn-active-color: #3d6784;
--bs-btn-active-bg: #dceaf3;
}
.btn-danger {
--bs-btn-color: #fff;
--bs-btn-bg: var(--danger);
--bs-btn-border-color: var(--danger);
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: var(--danger-hover);
--bs-btn-hover-border-color: var(--danger-hover);
}
/* Ikonová tlačítka v tabulkách */
.btn-group-sm > .btn,
.btn-sm {
--bs-btn-border-radius: 0.45rem;
}
/* Odznaky — jemný podklad místo syté výplně */
.badge {
font-weight: 600;
letter-spacing: 0.015em;
border-radius: 999px;
padding: 0.4em 0.72em;
border: 1px solid transparent;
}
.badge.bg-success {
background-color: #c8f0dc !important;
color: #087248 !important;
border-color: #7dcea8;
}
.badge.bg-warning {
background-color: #ffd98a !important;
color: #8a5200 !important;
border-color: #f0b84a;
}
.badge.bg-info {
background-color: #c9ecf8 !important;
color: #0b6e96 !important;
border-color: #7ecae4;
}
.badge.bg-primary {
background-color: #d4e6fb !important;
color: #1a56ad !important;
border-color: #9ec2f0;
}
.badge.bg-danger {
background-color: var(--danger-soft) !important;
color: #8f4f4f !important;
border-color: #ead4d4;
}
.badge.bg-secondary {
background-color: #eef2f6 !important;
color: #5c6d82 !important;
border-color: #d7e0ea;
}
.badge.bg-dark {
background-color: #e7edf4 !important;
color: #3d5270 !important;
border-color: #cdd8e6;
}
.badge.bg-light {
background-color: #f7f9fc !important;
color: #5c6d82 !important;
border-color: #e1e8f0;
}
.table {
--bs-table-hover-bg: #f6f9fc;
}
.table thead th {
color: #5c6d82;
font-weight: 600;
font-size: 0.78rem;
letter-spacing: 0.02em;
text-transform: uppercase;
border-bottom-color: var(--border-color);
}
.app-header > .container-fluid,
.action-toolbar > .container-fluid {
width: min(var(--page-max), 100%);
margin-inline: auto;
}
.app-footer {
padding-left: max(1.25rem, calc((100% - var(--page-max)) / 2));
padding-right: max(1.25rem, calc((100% - var(--page-max)) / 2));
}
/* --- 8. MOBIL --- */
@media (max-width: 991.98px) {
.app-header .navbar-nav {
width: 100%;
margin-top: 0.35rem;
}
.app-header .nav-link {
width: 100%;
text-align: left;
padding: 0.7rem 0.75rem;
}
.user-panel {
width: 100%;
margin: 0.35rem 0 0.25rem;
justify-content: space-between;
}
.btn-action {
flex-direction: row;
min-width: 0;
gap: 0.4rem;
padding: 0.45rem 0.7rem;
}
.btn-action i {
font-size: 1.05rem;
margin-bottom: 0;
}
.toolbar-group,
.filter-panel {
align-items: stretch;
}
.filter-panel {
width: 100%;
flex-wrap: wrap;
}
.filter-panel select {
width: auto !important;
flex: 1 1 8rem;
}
.main-content {
padding: 0.85rem 0.75rem 1.5rem;
}
.content-card {
padding: 0.9rem;
}
.main-content .d-flex.justify-content-between {
flex-wrap: wrap;
gap: 0.65rem;
}
}
@media (max-width: 767.98px) {
.dataTables_wrapper .row > [class*="col-"] {
width: 100%;
}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate {
text-align: left !important;
float: none !important;
margin-bottom: 0.5rem;
}
.dataTables_wrapper .dataTables_filter input,
.dataTables_wrapper .dataTables_length select {
width: 100%;
margin-left: 0 !important;
}
.dataTables_wrapper .dataTables_filter label,
.dataTables_wrapper .dataTables_length label {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 0.25rem;
width: 100%;
}
.table {
font-size: 0.82rem;
}
.table-responsive {
overflow: visible;
}
table.table-cards {
width: 100% !important;
min-width: 0 !important;
border: 0;
}
table.table-cards thead {
display: none;
}
table.table-cards tbody,
table.table-cards tfoot {
display: block;
width: 100%;
}
table.table-cards tbody tr,
table.table-cards tfoot tr {
display: block;
width: 100%;
border: 1px solid var(--border-color);
border-radius: 0.75rem;
margin-bottom: 0.75rem;
padding: 0.35rem 0.75rem 0.5rem;
background: #fff;
}
table.table-cards tbody td,
table.table-cards tfoot td {
display: flex !important;
justify-content: space-between;
align-items: center;
gap: 0.75rem;
width: auto !important;
max-width: none !important;
text-align: right !important;
white-space: normal !important;
border: 0 !important;
padding: 0.4rem 0;
}
table.table-cards tbody td::before {
content: attr(data-label);
flex: 0 0 auto;
max-width: 42%;
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.02em;
text-transform: uppercase;
color: var(--text-muted);
text-align: left;
}
table.table-cards tbody td:not(:last-child) {
border-bottom: 1px solid #eef2f6 !important;
}
table.table-cards td.cell-actions {
justify-content: flex-end;
flex-wrap: wrap;
gap: 0.35rem;
padding-top: 0.55rem;
}
table.table-cards td.cell-actions::before,
table.table-cards td.cell-span::before {
content: none;
}
table.table-cards td.cell-span {
display: block !important;
text-align: center !important;
}
table.table-cards td.cell-actions .btn {
flex: 0 0 auto;
}
table.table-cards td:has(.form-control) {
flex-direction: column;
align-items: stretch;
text-align: left !important;
}
table.table-cards td:has(.form-control) .form-control {
width: 100%;
}
table.table-cards tfoot tr {
display: flex;
justify-content: space-between;
align-items: center;
gap: 0.75rem;
}
table.table-cards tfoot td.cell-span {
display: flex !important;
text-align: left !important;
}
table.table-cards tfoot td.cell-actions:empty {
display: none !important;
}
.app-footer {
flex-wrap: wrap;
gap: 0.35rem;
}
}
/* Našeptávač zákazníka a položek faktury */
.suggest {
position: relative;
}
select.suggest-native {
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
pointer-events: none !important;
}
.suggest-menu {
position: fixed;
z-index: 1080;
max-height: 280px;
margin: 0;
padding: 0.25rem 0;
overflow-y: auto;
list-style: none;
background: #fff;
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
box-shadow: 0 8px 24px rgba(20, 50, 100, 0.14);
}
.suggest-menu[hidden] {
display: none !important;
}
.suggest-option {
padding: 0.4rem 0.75rem;
cursor: pointer;
line-height: 1.3;
}
.suggest-option.is-active,
.suggest-option:hover {
background: var(--primary-soft);
}
.suggest-option small {
display: block;
color: var(--text-muted);
font-size: 0.78rem;
}
.suggest-empty {
padding: 0.45rem 0.75rem;
color: var(--text-muted);
}