Files
Pivot/static/global.css
T
marinostrusandClaude Opus 5.5 8b7fa3f716 Donker thema toevoegen via gebruikersmenu rechtsboven
Klik op je naam rechtsboven om een menu te openen met een schakelaar
voor het donkere thema. De keuze wordt per browser onthouden.

- global.css: donkere kleurvariabelen, alleen op scherm (afdrukken blijft licht)
- base.html: gebruikersmenu met themaschakelaar
- vaste witte achtergronden en pastelkleuren op enkele pagina's
  volgen nu het thema

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:08:30 +02:00

689 lines
28 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ==========================================================================
PIVOT – GLOBALE HUISSTIJL
Eén stylesheet voor alle pagina's. Pagina's erven van templates/base.html
en gebruiken de klassen hieronder; paginaspecifieke CSS blijft beperkt
tot {% block extra_css %}.
========================================================================== */
/* ---------- 1. Design tokens ---------- */
:root {
/* Merkkleuren */
--primary-color: #1e6fa5;
--primary-dark: #17577f;
--primary-light: #e8f1f8;
--background-color: #F4F7FA;
/* Neutralen */
--surface: #ffffff;
--surface-muted: #f8fafc;
--border: #e2e8f0;
--border-strong: #cbd5e1;
--text: #1e293b;
--text-muted: #64748b;
/* Statuskleuren */
--success: #16a34a; --success-bg: #dcfce7; --success-text: #166534;
--warning: #eab308; --warning-bg: #fef9c3; --warning-text: #854d0e;
--danger: #dc2626; --danger-bg: #fee2e2; --danger-text: #991b1b;
--info: #2563eb; --info-bg: #dbeafe; --info-text: #1e40af;
--accent: #f1c709; /* geel accent (toevoegen / bewerken) */
--bug: #16a34a; /* groen accent voor bug-pagina's */
/* Vorm */
--radius-sm: 6px;
--radius: 10px;
--radius-lg: 14px;
--shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);
--shadow: 0 1px 3px rgba(15, 23, 42, .08), 0 4px 12px rgba(15, 23, 42, .05);
--shadow-lg: 0 10px 30px rgba(15, 23, 42, .18);
/* Overige vlakken */
--header-bg: var(--primary-color);
--row-hover: #f8fbfe;
--badge-bg: #e2e8f0; --badge-text: #334155;
--overlay: rgba(255, 255, 255, .85);
--header-height: 64px;
--page-width: 1200px;
--font: "Segoe UI", system-ui, -apple-system, Roboto, Arial, sans-serif;
}
/* ---------- 1b. Donker thema (aan/uit via het gebruikersmenu rechtsboven) ---------- */
/* Alleen op scherm: afdrukken gebeurt altijd in het lichte thema */
@media screen {
html[data-theme="dark"] {
color-scheme: dark;
--primary-color: #3a8cc9;
--primary-dark: #2d73a8;
--primary-light: #17324a;
--background-color: #0f172a;
--surface: #1e293b;
--surface-muted: #172033;
--border: #334155;
--border-strong: #475569;
--text: #e2e8f0;
--text-muted: #94a3b8;
--success-bg: #14361f; --success-text: #86efac;
--warning-bg: #3a300b; --warning-text: #fde047;
--danger-bg: #3f1515; --danger-text: #fca5a5;
--info-bg: #172a4d; --info-text: #93c5fd;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, .4);
--shadow: 0 1px 3px rgba(0, 0, 0, .4), 0 4px 12px rgba(0, 0, 0, .25);
--shadow-lg: 0 10px 30px rgba(0, 0, 0, .6);
--header-bg: #13304a;
--row-hover: #243349;
--badge-bg: #334155; --badge-text: #e2e8f0;
--overlay: rgba(15, 23, 42, .85);
}
html[data-theme="dark"] .flash-message,
html[data-theme="dark"] .flash-message.success,
html[data-theme="dark"] .flash-message.error,
html[data-theme="dark"] .flash-message.danger,
html[data-theme="dark"] .flash-message.warning { border-color: var(--border); }
html[data-theme="dark"] .dash-section-title.admin::after { background: var(--danger-bg); }
html[data-theme="dark"] .tile.tile-tools .tile-icon,
html[data-theme="dark"] .tile.tile-tools .tile-links a:hover { background: #123b38; }
html[data-theme="dark"] .tile.tile-tools h3,
html[data-theme="dark"] .tile.tile-tools .tile-links a:hover { color: #5eead4; }
html[data-theme="dark"] .tile.tile-scholengroep .tile-icon,
html[data-theme="dark"] .tile.tile-scholengroep .tile-links a:hover { background: #2e1f52; }
html[data-theme="dark"] .tile.tile-scholengroep h3,
html[data-theme="dark"] .tile.tile-scholengroep .tile-links a:hover { color: #c4b5fd; }
html[data-theme="dark"] .google-btn { background: var(--surface); color: var(--text); border-color: var(--border-strong); }
html[data-theme="dark"] .google-btn:hover { background: var(--surface-muted); }
html[data-theme="dark"] body.auth-page { background: var(--background-color); }
html[data-theme="dark"] mark { background: #854d0e; color: #fef9c3; }
/* Pagina's met eigen pastelkleuren (gemarkeerde rijen, legendes, filters) */
html[data-theme="dark"] .tellers .let,
html[data-theme="dark"] .filters button.let { background: var(--warning-bg); border-color: #854d0e; }
html[data-theme="dark"] .filters button.let[aria-pressed="true"] { background: #854d0e; color: #fef9c3; }
html[data-theme="dark"] td.leeg,
html[data-theme="dark"] tr.flagged td,
html[data-theme="dark"] table.aw .vandaag,
html[data-theme="dark"] td.inv input.gewijzigd,
html[data-theme="dark"] .panel.directie,
html[data-theme="dark"] .panel.vraag { background: #2e2710 !important; border-color: #854d0e; }
html[data-theme="dark"] tr.rij-fout td { background: #3a1a1a; }
html[data-theme="dark"] button.st:not(.aanwezig):not(.afwezig) { background: var(--surface-muted); border-color: var(--border-strong); color: var(--text-muted); }
html[data-theme="dark"] #personeelBody tr.g-account td, html[data-theme="dark"] .legende i.account { background: #14361f; border-color: #166534; }
html[data-theme="dark"] #personeelBody tr.g-alias td, html[data-theme="dark"] .legende i.alias { background: #3a2a10; border-color: #9a5b13; }
html[data-theme="dark"] #personeelBody tr.g-geen td, html[data-theme="dark"] .legende i.geen { background: #3a1a1a; border-color: #991b1b; }
}
/* ---------- 2. Basis ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { overflow-y: scroll; }
body {
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
font-family: var(--font);
font-size: 15px;
line-height: 1.5;
color: var(--text);
background-color: var(--background-color);
}
h1, h2, h3, h4 { margin: 0 0 .6em; line-height: 1.25; color: var(--text); }
h2 { font-size: 1.35rem; }
h3 { font-size: 1.1rem; }
p { margin: 0 0 1em; }
a { color: var(--primary-color); }
.muted { color: var(--text-muted); }
.small { font-size: .85rem; }
.text-center { text-align: center; }
.text-right { text-align: right; }
.nowrap { white-space: nowrap; }
.mono { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: .85em; }
.hidden { display: none !important; }
/* ---------- 3. Header ---------- */
.app-header {
position: sticky;
top: 0;
z-index: 1000;
height: var(--header-height);
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: center;
gap: 16px;
padding: 0 24px;
background: var(--header-bg);
color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, .15);
}
.app-header.header--bug { background: var(--bug); }
.header-left, .header-right { display: flex; align-items: center; gap: 12px; min-width: 0; }
.header-right { justify-content: flex-end; }
.brand {
display: flex; align-items: center; gap: 10px;
color: #fff; text-decoration: none; font-weight: 700; letter-spacing: 1px;
white-space: nowrap;
}
.brand-mark {
width: 38px; height: 38px; border-radius: 50%;
background: #fff; padding: 4px;
display: grid; place-items: center;
}
.brand-mark img { width: 100%; height: 100%; object-fit: contain; }
.brand-name { font-size: 18px; }
.brand-school { font-weight: 400; opacity: .8; letter-spacing: 0; font-size: 14px; }
.page-title {
margin: 0;
font-size: 22px;
font-weight: 700;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: center;
}
.header-user { font-size: 14px; opacity: .9; white-space: nowrap; }
.home-btn, .logout-btn, .header-btn {
display: inline-flex; align-items: center; gap: 6px;
height: 36px; padding: 0 14px;
border: 0; border-radius: var(--radius-sm);
font: inherit; font-size: 14px; font-weight: 600;
text-decoration: none; cursor: pointer; white-space: nowrap;
transition: background-color .15s;
}
.home-btn, .header-btn { background: rgba(255, 255, 255, .16); color: #fff; }
.home-btn:hover, .header-btn:hover { background: rgba(255, 255, 255, .28); }
.logout-btn { background: var(--surface); color: var(--danger); }
.logout-btn:hover { background: var(--danger-bg); }
.app-header form { margin: 0; }
/* Gebruikersmenu (klik op je naam rechtsboven) */
.user-menu { position: relative; }
.user-menu-btn { opacity: 1; font-weight: 500; }
.user-menu-btn .caret { font-size: 10px; opacity: .8; }
.user-menu-panel {
display: none;
position: absolute; right: 0; top: calc(100% + 8px);
z-index: 1100;
min-width: 260px;
padding: 6px 14px;
background: var(--surface); color: var(--text);
border: 1px solid var(--border); border-radius: var(--radius);
box-shadow: var(--shadow-lg);
}
.user-menu.open .user-menu-panel { display: block; }
.user-menu-head { padding: 8px 0 10px; border-bottom: 1px solid var(--border); font-size: 13px; color: var(--text-muted); overflow-wrap: anywhere; }
.user-menu-head strong { display: block; color: var(--text); font-size: 14px; }
.user-menu-panel .switch-row { font-size: 14px; font-weight: 500; cursor: pointer; }
/* ---------- 4. Pagina-layout ---------- */
.app-main {
flex: 1;
width: 100%;
max-width: var(--page-width);
margin: 0 auto;
padding: 28px 24px 40px;
}
.app-main.narrow { max-width: 760px; }
.app-main.medium { max-width: 980px; }
.app-main.wide { max-width: 1400px; }
.page-head {
display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
gap: 12px; margin-bottom: 18px;
}
.page-head h2 { margin: 0; }
.page-head .actions { display: flex; flex-wrap: wrap; gap: 8px; }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow);
padding: 24px;
}
.card + .card { margin-top: 20px; }
.card-title { font-size: 1.1rem; margin: 0 0 14px; }
.card.subtle { background: var(--surface-muted); box-shadow: none; }
/* Twee-koloms layout (formulier + scanner/info) */
.split {
display: grid;
grid-template-columns: 3fr 2fr;
gap: 20px;
align-items: start;
}
.split > .card + .card { margin-top: 0; }
@media (max-width: 860px) {
.split { grid-template-columns: 1fr; }
.split .order-first-mobile { order: -1; }
}
/* ---------- 5. Formulieren ---------- */
label { font-weight: 600; font-size: 14px; }
input:not([type=checkbox]):not([type=radio]):not([type=hidden]):not([type=file]),
select, textarea {
width: 100%;
padding: 10px 12px;
font: inherit;
font-size: 15px;
color: var(--text);
background: var(--surface);
border: 1px solid var(--border-strong);
border-radius: var(--radius-sm);
transition: border-color .15s, box-shadow .15s;
}
input:focus, select:focus, textarea:focus {
outline: none;
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(30, 111, 165, .18);
}
input[readonly], input:disabled, textarea:disabled, select:disabled {
background: var(--surface-muted); color: var(--text-muted); cursor: not-allowed;
}
textarea { min-height: 100px; resize: vertical; }
input[type=checkbox], input[type=radio] { width: 18px; height: 18px; accent-color: var(--primary-color); cursor: pointer; }
input[type=file] {
width: 100%; padding: 12px; font: inherit;
background: var(--surface-muted);
border: 1px dashed var(--primary-color); border-radius: var(--radius-sm);
}
.field { margin-bottom: 16px; }
.field > label { display: block; margin-bottom: 6px; }
.field-hint { font-size: 13px; color: var(--text-muted); margin-top: 4px; }
.check {
display: flex; align-items: center; gap: 10px;
font-weight: 500; cursor: pointer;
}
.check-box {
display: flex; align-items: center; gap: 10px;
padding: 12px 14px; margin: 4px 0 16px;
background: var(--surface-muted); border: 1px solid var(--border);
border-radius: var(--radius-sm); font-weight: 500; cursor: pointer;
}
/* Zoekbalk: invoerveld + knop op één lijn */
.search-bar {
display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 16px;
}
.search-bar input:not([type=hidden]) { flex: 1 1 260px; width: auto; }
.input-group { display: flex; gap: 6px; }
.input-group input { flex: 1; }
.password-wrap { position: relative; }
.password-wrap input { padding-right: 44px !important; }
.password-toggle {
position: absolute; right: 6px; top: 50%; transform: translateY(-50%);
background: none !important; border: 0; padding: 4px 8px; font-size: 16px;
color: var(--text-muted); cursor: pointer; box-shadow: none;
}
/* ---------- 6. Knoppen ---------- */
button, .btn {
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
padding: 9px 16px;
font: inherit; font-size: 14px; font-weight: 600; line-height: 1.3;
color: #fff;
background-color: var(--primary-color);
border: 1px solid transparent;
border-radius: var(--radius-sm);
text-decoration: none;
cursor: pointer;
white-space: nowrap;
transition: background-color .15s, border-color .15s, transform .05s;
}
button:hover, .btn:hover { background-color: var(--primary-dark); }
button:active, .btn:active { transform: translateY(1px); }
button:disabled, .btn:disabled { opacity: .5; cursor: not-allowed; }
.btn-secondary { background: #475569; }
.btn-secondary:hover { background: #334155; }
.btn-light { background: var(--surface); color: var(--text); border-color: var(--border-strong); }
.btn-light:hover { background: var(--surface-muted); }
.btn-success { background: var(--success); }
.btn-success:hover { background: #15803d; }
.btn-warning { background: var(--accent); color: #3f3200; }
.btn-warning:hover { background: #d9b308; }
.btn-danger { background: var(--danger); }
.btn-danger:hover { background: #b91c1c; }
.btn-ghost { background: transparent; color: var(--text-muted); }
.btn-ghost:hover { background: var(--surface-muted); color: var(--text); }
.btn-link { background: none; color: var(--danger); padding: 6px; text-decoration: underline; }
.btn-link:hover { background: none; color: #991b1b; }
.btn-sm { padding: 6px 10px; font-size: 13px; }
.btn-lg { padding: 13px 22px; font-size: 16px; }
.btn-block { display: flex; width: 100%; }
.btn-block + .btn-block { margin-top: 10px; }
/* Oude klassen die nog gebruikt worden */
.add-btn { background: var(--accent); color: #3f3200; }
.add-btn:hover { background: #d9b308; }
.btn-bewerk { background: var(--accent); color: #3f3200; }
.btn-bewerk:hover { background: #d9b308; }
/* ---------- 7. Tabellen ---------- */
.table-wrap {
width: 100%;
overflow-x: auto;
border: 1px solid var(--border);
border-radius: var(--radius);
margin-top: 12px;
}
table { width: 100%; border-collapse: collapse; background: var(--surface); text-align: left; }
th, td { padding: 11px 14px; border-bottom: 1px solid var(--border); vertical-align: middle; }
th {
background: var(--surface-muted);
font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
color: var(--text-muted); white-space: nowrap;
}
tbody tr:last-child td { border-bottom: 0; }
tbody tr:hover { background: var(--row-hover); }
td.actions, th.actions { text-align: right; white-space: nowrap; }
td.actions form { display: inline; margin: 0; }
td.actions > * + * { margin-left: 6px; }
td.center, th.center { text-align: center; }
.empty-row td { text-align: center; color: var(--text-muted); padding: 32px; }
/* Kolommen tonen/verbergen */
.column-toggles {
display: flex; flex-wrap: wrap; gap: 8px;
margin: 4px 0 8px;
}
.column-toggles label {
display: inline-flex; align-items: center; gap: 6px;
padding: 5px 12px; font-size: 13px; font-weight: 500;
background: var(--surface-muted); border: 1px solid var(--border);
border-radius: 999px; cursor: pointer; user-select: none;
}
.column-toggles input { width: 15px; height: 15px; }
/* ---------- 8. Badges ---------- */
.badge {
display: inline-flex; align-items: center; gap: 4px;
padding: 3px 10px; border-radius: 999px;
font-size: 12.5px; font-weight: 600; white-space: nowrap;
background: var(--badge-bg); color: var(--badge-text);
}
.badge-success { background: var(--success-bg); color: var(--success-text); }
.badge-warning { background: var(--warning-bg); color: var(--warning-text); }
.badge-danger { background: var(--danger-bg); color: var(--danger-text); }
.badge-info { background: var(--info-bg); color: var(--info-text); }
/* ---------- 9. Flash-berichten ---------- */
.flash-container { display: flex; flex-direction: column; gap: 8px; margin-bottom: 18px; }
.flash-message {
display: flex; align-items: flex-start; gap: 10px;
padding: 12px 16px;
border-radius: var(--radius);
border: 1px solid transparent;
font-weight: 500;
background: var(--info-bg); color: var(--info-text); border-color: #bfdbfe;
animation: flashIn .3s ease;
}
.flash-message.success { background: var(--success-bg); color: var(--success-text); border-color: #bbf7d0; }
.flash-message.error, .flash-message.danger { background: var(--danger-bg); color: var(--danger-text); border-color: #fecaca; }
.flash-message.warning { background: var(--warning-bg); color: var(--warning-text); border-color: #fde68a; }
.flash-message .flash-close {
margin-left: auto; padding: 0 4px; background: none; color: inherit;
font-size: 18px; line-height: 1; opacity: .6;
}
.flash-message .flash-close:hover { opacity: 1; background: none; }
@keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
/* Inline meldingen (bv. in een modal of loginformulier) */
.alert { padding: 10px 14px; border-radius: var(--radius-sm); margin-bottom: 14px; font-size: 14px; text-align: left;
background: var(--info-bg); color: var(--info-text); }
.alert-success { background: var(--success-bg); color: var(--success-text); }
.alert-danger, .alert-error { background: var(--danger-bg); color: var(--danger-text); }
.alert-warning { background: var(--warning-bg); color: var(--warning-text); }
/* ---------- 10. Tabs ---------- */
.tabs {
display: flex; gap: 4px; flex-wrap: wrap;
border-bottom: 1px solid var(--border);
margin-bottom: 0;
}
.tab-link {
background: transparent; color: var(--text-muted);
border: 0; border-bottom: 3px solid transparent; border-radius: 0;
padding: 12px 18px; font-weight: 600;
}
.tab-link:hover { background: transparent; color: var(--text); }
.tab-link.active { color: var(--primary-color); border-bottom-color: var(--primary-color); }
.tab-content {
display: none;
background: var(--surface);
border: 1px solid var(--border); border-top: 0;
border-radius: 0 0 var(--radius-lg) var(--radius-lg);
box-shadow: var(--shadow);
padding: 24px;
}
.tab-content.active { display: block; }
/* Losstaande tabs (tabs staan in de page-head i.p.v. vast aan de kaart) */
.tab-content.card { border-top: 1px solid var(--border); border-radius: var(--radius-lg); }
.tab-content + .tab-content { margin-top: 0; }
.page-head .tabs { border-bottom: 0; }
/* ---------- 11. Modals ---------- */
/* .modal wordt via JS op display:block gezet, .modal-overlay op display:flex */
.modal, .modal-overlay {
display: none;
position: fixed; inset: 0;
z-index: 2000;
overflow-y: auto;
padding: 6vh 16px;
background: rgba(15, 23, 42, .5);
}
.modal-overlay { align-items: flex-start; justify-content: center; }
.modal-content {
position: relative;
width: 100%;
max-width: 480px;
margin: 0 auto;
background: var(--surface);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-lg);
padding: 26px;
text-align: left;
animation: modalIn .18s ease;
}
.modal-content.wide { max-width: 680px; }
.modal-content h2, .modal-content h3 { margin: 0 0 18px; padding-right: 30px; color: var(--primary-color); }
.modal-footer { display: flex; justify-content: flex-end; gap: 8px; margin-top: 20px; }
.close, .close-btn {
position: absolute; top: 14px; right: 16px;
width: 32px; height: 32px; display: grid; place-items: center;
font-size: 24px; line-height: 1; color: var(--text-muted);
border-radius: 50%; cursor: pointer;
}
.close:hover, .close-btn:hover { background: var(--surface-muted); color: var(--text); }
@keyframes modalIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
/* Grote statusknoppen in modals */
.status-button { display: flex; width: 100%; padding: 14px; margin: 10px 0 0; font-size: 16px; border-radius: var(--radius); }
.status-success { background: var(--success); }
.status-success:hover { background: #15803d; }
.status-info { background: var(--info); }
.status-info:hover { background: #1d4ed8; }
.status-warning { background: #f59e0b; color: #fff; }
.status-warning:hover { background: #d97706; }
.status-danger { background: var(--danger); }
.status-danger:hover { background: #b91c1c; }
/* ---------- 12. Schakelaar (toggle) ---------- */
.switch { position: relative; display: inline-block; width: 46px; height: 26px; flex-shrink: 0; }
.switch input { opacity: 0; width: 0; height: 0; }
.slider { position: absolute; inset: 0; cursor: pointer; background: var(--border-strong); border-radius: 26px; transition: .25s; }
.slider::before { content: ""; position: absolute; width: 20px; height: 20px; left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: .25s; box-shadow: 0 1px 2px rgba(0,0,0,.2); }
.switch input:checked + .slider { background: var(--success); }
.switch input:checked + .slider::before { transform: translateX(20px); }
.switch-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.switch-row:last-of-type { border-bottom: 0; }
/* ---------- 13. Laadscherm ---------- */
#loader-overlay {
display: none;
position: fixed; inset: 0;
z-index: 9999;
flex-direction: column; justify-content: center; align-items: center; gap: 16px;
background: var(--overlay);
backdrop-filter: blur(2px);
}
.spinner {
width: 52px; height: 52px;
border: 5px solid var(--primary-light);
border-top-color: var(--primary-color);
border-radius: 50%;
animation: spin .9s linear infinite;
}
.loader-text { font-weight: 600; color: var(--primary-color); font-size: 17px; text-align: center; }
.loader-sub { color: var(--text-muted); font-size: 14px; margin-top: -8px; }
@keyframes spin { to { transform: rotate(360deg); } }
/* ---------- 14. Footer ---------- */
.app-footer {
padding: 16px 24px;
font-size: 12.5px;
color: var(--text-muted);
text-align: right;
}
/* ---------- 15. Dashboard ---------- */
.dash-greeting { margin-bottom: 24px; }
.dash-greeting h2 { margin: 0 0 2px; font-size: 1.5rem; }
.dash-section-title {
display: flex; align-items: center; gap: 10px;
margin: 32px 0 14px; font-size: 13px; font-weight: 700;
letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted);
}
.dash-section-title::after { content: ""; flex: 1; height: 1px; background: var(--border); }
.dash-section-title.admin { color: var(--danger); }
.dash-section-title.admin::after { background: #fecaca; }
.tile-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 18px;
}
.tile {
display: flex; flex-direction: column;
background: var(--surface);
border: 1px solid var(--border);
border-top: 4px solid var(--primary-color);
border-radius: var(--radius-lg);
box-shadow: var(--shadow);
overflow: hidden;
}
.tile-head { display: flex; align-items: center; gap: 12px; padding: 18px 18px 10px; }
.tile-icon {
width: 42px; height: 42px; flex-shrink: 0;
display: grid; place-items: center; font-size: 22px;
background: var(--primary-light); border-radius: 10px;
}
.tile-head h3 { margin: 0; font-size: 1.05rem; color: var(--primary-color); }
.tile-links { list-style: none; margin: 0; padding: 4px 8px 10px; }
.tile-links a {
display: flex; align-items: center; gap: 10px;
padding: 9px 10px; border-radius: var(--radius-sm);
color: var(--text); text-decoration: none; font-weight: 500;
transition: background-color .12s, color .12s;
}
.tile-links a::after { content: "›"; margin-left: auto; color: var(--border-strong); font-size: 18px; transition: transform .12s; }
.tile-links a:hover { background: var(--primary-light); color: var(--primary-color); }
.tile-links a:hover::after { color: var(--primary-color); transform: translateX(2px); }
/* Links-blok: icoontjes even breed (favicon of emoji), lange adressen afgekort met … */
.links-lijst .link-ico { flex: 0 0 18px; width: 18px; text-align: center; line-height: 1; font-size: 15px; }
.links-lijst .link-ico img { display: block; width: 16px; height: 16px; margin: 0 auto; border-radius: 3px; }
.links-lijst .link-tekst { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tile.tile-bug { border-top-color: var(--bug); }
.tile.tile-bug .tile-icon { background: var(--success-bg); }
.tile.tile-bug h3 { color: var(--success-text); }
.tile.tile-bug .tile-links a:hover { background: var(--success-bg); color: var(--success-text); }
.tile.tile-tools { border-top-color: #0d9488; }
.tile.tile-tools .tile-icon { background: #ccfbf1; }
.tile.tile-tools h3 { color: #0f766e; }
.tile.tile-tools .tile-links a:hover { background: #ccfbf1; color: #0f766e; }
.tile.tile-scholengroep { border-top-color: #7c3aed; }
.tile.tile-scholengroep .tile-icon { background: #ede9fe; }
.tile.tile-scholengroep h3 { color: #5b21b6; }
.tile.tile-scholengroep .tile-links a:hover { background: #ede9fe; color: #5b21b6; }
.tile.tile-handleiding { border-top-color: var(--info); }
.tile.tile-handleiding .tile-icon { background: var(--info-bg); }
.tile.tile-handleiding h3 { color: var(--info-text); }
.tile.tile-handleiding .tile-links a:hover { background: var(--info-bg); color: var(--info-text); }
.tile.tile-admin { border-top-color: var(--danger); }
.tile.tile-admin .tile-icon { background: var(--danger-bg); }
.tile.tile-admin h3 { color: var(--danger-text); }
.tile.tile-admin .tile-links a:hover { background: var(--danger-bg); color: var(--danger-text); }
/* ---------- 16. Loginpagina ---------- */
body.auth-page { background: linear-gradient(160deg, #eaf2f9 0%, var(--background-color) 55%); }
.auth-wrap {
flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 32px 16px;
}
.auth-logo { width: 100%; max-width: 380px; margin-bottom: 28px; }
.auth-card { width: 100%; max-width: 380px; }
.auth-card h2 { text-align: center; margin-bottom: 20px; }
.separator { display: flex; align-items: center; gap: 10px; margin: 18px 0; color: var(--text-muted); font-size: 13px; }
.separator::before, .separator::after { content: ""; flex: 1; border-bottom: 1px solid var(--border); }
.google-btn {
display: flex; align-items: center; justify-content: center; gap: 10px;
padding: 10px; border: 1px solid #dadce0; border-radius: var(--radius-sm);
background: #fff; color: #3c4043; font-weight: 600; text-decoration: none;
transition: background-color .15s, box-shadow .15s;
}
.google-btn:hover { background: #f8f9fa; box-shadow: 0 1px 3px rgba(60,64,67,.3); }
.google-btn img { width: 18px; height: 18px; }
/* ---------- 17. Responsief ---------- */
@media (max-width: 900px) {
.brand-school, .header-user { display: none; }
.user-menu-btn { display: inline-flex; }
.user-menu-btn .user-naam { display: none; }
}
@media (max-width: 720px) {
.app-header {
height: auto;
grid-template-columns: 1fr auto;
grid-template-areas: "left right" "title title";
padding: 10px 16px;
row-gap: 8px;
}
.header-left { grid-area: left; }
.header-right { grid-area: right; }
.page-title { grid-area: title; font-size: 18px; text-align: left; }
.brand-name { display: none; }
.app-main { padding: 20px 16px 32px; }
.card, .tab-content { padding: 18px; }
.modal-content { padding: 20px; }
}
/* ---------- 18. Print ---------- */
@media print {
.app-header, .app-footer, .page-head .actions, .search-bar, .column-toggles { display: none !important; }
body { background: #fff; }
.card { box-shadow: none; border: 0; padding: 0; }
}
/* Keuze aantal rijen per pagina (perPaginaKiezer) */
.per-pagina { display: inline-flex; align-items: center; gap: 6px; font-size: .85rem; color: var(--text-muted); margin: 0; font-weight: 400; white-space: nowrap; }
.per-pagina select { width: auto; padding: 4px 8px; font-size: .85rem; }