Files
Moped-Tracking/src/app/globals.css
T
2026-07-26 12:03:57 +02:00

618 lines
15 KiB
CSS

@import url("https://fonts.googleapis.com/css2?family=Oswald:wght@500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@500;700&display=swap");
@import "tailwindcss";
:root {
--ink: #1d1a16;
--ink-2: #2b2721;
--ink-3: #3a352d;
--paper: #f3ede2;
--paper-2: #fbf7ef;
--paper-line: #e2d9c9;
--steel: #7d786f;
--steel-2: #b6afa2;
--signal: #f4c111;
--signal-dark: #d9a900;
--rust: #b7410e;
--rust-soft: #f3d9cd;
--green: #4f7a4d;
--green-soft: #d8e5d3;
--amber: #c98a12;
--amber-soft: #f6e4bd;
--font-head: "Oswald", "Arial Narrow", sans-serif;
--font-body: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", monospace;
--radius: 10px;
--shadow: 0 12px 30px -18px rgba(29, 26, 22, 0.6);
}
* {
box-sizing: border-box;
}
html {
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
background:
radial-gradient(1200px 500px at 100% -10%, rgba(244, 193, 17, 0.08), transparent 60%),
var(--paper);
color: var(--ink);
font-family: var(--font-body);
font-size: 15px;
line-height: 1.55;
min-height: 100vh;
}
h1, h2, h3, h4 {
font-family: var(--font-head);
font-weight: 600;
letter-spacing: 0.01em;
line-height: 1.1;
margin: 0;
text-transform: uppercase;
}
h1 { font-size: clamp(1.8rem, 4vw, 2.6rem); }
h2 { font-size: 1.5rem; }
h3 { font-size: 1.15rem; }
a { color: inherit; }
.mono {
font-family: var(--font-mono);
font-variant-numeric: tabular-nums;
}
.eyebrow {
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: 0.18em;
font-size: 0.72rem;
color: var(--steel);
margin: 0 0 0.25rem;
}
.muted { color: var(--steel); margin: 0.15rem 0; }
/* ---------- App frame ---------- */
.app-frame {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.topbar {
display: flex;
align-items: center;
gap: 1.5rem;
flex-wrap: wrap;
padding: 0.85rem clamp(1rem, 4vw, 2.5rem);
background: var(--ink);
color: var(--paper-2);
border-bottom: 3px solid var(--signal);
position: sticky;
top: 0;
z-index: 20;
}
.brand {
display: flex;
align-items: center;
gap: 0.7rem;
text-decoration: none;
color: inherit;
}
.brand-mark {
display: grid;
place-items: center;
width: 42px;
height: 42px;
background: var(--signal);
color: var(--ink);
font-family: var(--font-head);
font-weight: 700;
font-size: 1.1rem;
border-radius: 8px;
box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.12);
}
.brand strong {
display: block;
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 1.05rem;
}
.brand small { color: var(--steel-2); font-size: 0.72rem; letter-spacing: 0.08em; text-transform: uppercase; }
.topbar nav {
display: flex;
gap: 0.4rem;
flex-wrap: wrap;
margin-right: auto;
}
.topbar nav a {
text-decoration: none;
padding: 0.4rem 0.75rem;
border-radius: 6px;
font-weight: 500;
color: var(--paper-2);
font-size: 0.92rem;
transition: background 0.15s;
}
.topbar nav a:hover { background: rgba(255, 255, 255, 0.09); }
.user-menu {
display: flex;
align-items: center;
gap: 0.9rem;
}
.user-menu > span {
text-align: right;
font-weight: 600;
font-size: 0.9rem;
line-height: 1.2;
}
.user-menu small { display: block; color: var(--steel-2); font-weight: 400; font-size: 0.72rem; }
.page-shell {
width: 100%;
max-width: 1120px;
margin: 0 auto;
padding: clamp(1.2rem, 3vw, 2.5rem) clamp(1rem, 4vw, 2.5rem) 3rem;
flex: 1;
}
footer {
text-align: center;
padding: 1.4rem;
color: var(--steel);
font-size: 0.8rem;
letter-spacing: 0.08em;
text-transform: uppercase;
border-top: 1px solid var(--paper-line);
}
/* ---------- Buttons ---------- */
.button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.4rem;
padding: 0.55rem 1.1rem;
border-radius: 8px;
border: 1px solid var(--ink);
background: transparent;
color: var(--ink);
font-family: var(--font-head);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
font-size: 0.85rem;
cursor: pointer;
text-decoration: none;
transition: transform 0.08s, background 0.15s, box-shadow 0.15s;
}
.button:hover { background: var(--ink); color: var(--paper-2); }
.button:active { transform: translateY(1px); }
.button-primary {
background: var(--signal);
border-color: var(--signal-dark);
color: var(--ink);
box-shadow: 0 6px 16px -8px rgba(217, 169, 0, 0.9);
}
.button-primary:hover { background: var(--signal-dark); color: var(--ink); }
.button-danger { border-color: var(--rust); color: var(--rust); }
.button-danger:hover { background: var(--rust); color: var(--paper-2); }
.link-button {
background: none;
border: none;
color: var(--steel);
font: inherit;
cursor: pointer;
padding: 0;
text-decoration: underline;
text-underline-offset: 3px;
}
.link-button:hover { color: var(--ink); }
.link-button.danger { color: var(--rust); }
.link-button:disabled { color: var(--steel-2); cursor: not-allowed; text-decoration: none; }
/* ---------- Panels & layout blocks ---------- */
.panel {
background: var(--paper-2);
border: 1px solid var(--paper-line);
border-radius: var(--radius);
padding: 1.3rem;
box-shadow: var(--shadow);
}
.panel-title { margin-bottom: 0.9rem; }
.page-heading {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
margin-bottom: 1.4rem;
}
.heading-actions { display: flex; gap: 0.6rem; align-items: center; flex-wrap: wrap; }
.breadcrumbs {
display: flex;
gap: 0.5rem;
align-items: center;
font-size: 0.8rem;
color: var(--steel);
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 1rem;
}
.breadcrumbs a { color: var(--steel); text-decoration: none; }
.breadcrumbs a:hover { color: var(--ink); }
.breadcrumbs span { color: var(--steel-2); }
.section-block { margin-top: 2.2rem; }
.section-heading { margin-bottom: 0.9rem; }
/* ---------- Flash ---------- */
.flash {
border-radius: 8px;
padding: 0.75rem 1rem;
margin-bottom: 1.2rem;
font-weight: 500;
border: 1px solid transparent;
}
.flash-error { background: var(--rust-soft); border-color: var(--rust); color: #6f2708; }
.flash-success { background: var(--green-soft); border-color: var(--green); color: #2c4a2b; }
/* ---------- Login ---------- */
.login-page {
min-height: 100vh;
display: grid;
place-items: center;
padding: 1.5rem;
background:
radial-gradient(900px 400px at 50% -10%, rgba(244, 193, 17, 0.12), transparent 60%),
var(--ink);
}
.login-card {
width: 100%;
max-width: 420px;
background: var(--paper-2);
border-radius: 14px;
padding: 2rem;
display: flex;
flex-direction: column;
gap: 1.3rem;
border-top: 4px solid var(--signal);
box-shadow: 0 30px 60px -30px rgba(0, 0, 0, 0.7);
}
.login-brand strong { color: var(--ink); }
.login-brand small { color: var(--steel); }
.stack-form { display: flex; flex-direction: column; gap: 1rem; }
/* ---------- Forms ---------- */
label {
display: flex;
flex-direction: column;
gap: 0.35rem;
font-weight: 600;
font-size: 0.85rem;
color: var(--ink-2);
}
input, select, textarea {
font: inherit;
padding: 0.55rem 0.7rem;
border: 1px solid var(--steel-2);
border-radius: 7px;
background: #fff;
color: var(--ink);
width: 100%;
}
input:focus, select:focus, textarea:focus {
outline: none;
border-color: var(--signal-dark);
box-shadow: 0 0 0 3px rgba(244, 193, 17, 0.25);
}
textarea { resize: vertical; }
input[type="file"] { padding: 0.4rem; background: var(--paper); }
.form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1rem;
}
.form-grid .span-2 { grid-column: 1 / -1; }
.form-actions { display: flex; justify-content: flex-end; }
/* ---------- Bike grid & cards ---------- */
.bike-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.1rem;
}
.bike-card {
display: flex;
flex-direction: column;
gap: 0.7rem;
padding: 1.2rem;
background: var(--paper-2);
border: 1px solid var(--paper-line);
border-left: 5px solid var(--ink);
border-radius: var(--radius);
text-decoration: none;
color: inherit;
box-shadow: var(--shadow);
transition: transform 0.1s, border-color 0.15s;
}
.bike-card:hover { transform: translateY(-3px); border-left-color: var(--signal); }
.bike-card-top { display: flex; justify-content: space-between; gap: 0.8rem; }
.bike-card-top h2 { font-size: 1.3rem; }
.odometer {
font-family: var(--font-mono);
font-weight: 700;
font-size: 1.6rem;
letter-spacing: 0.02em;
background: var(--ink);
color: var(--signal);
padding: 0.4rem 0.8rem;
border-radius: 6px;
display: inline-block;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}
.odometer-lg { font-size: 2rem; margin-top: 0.5rem; }
.status-row {
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
font-weight: 600;
font-size: 0.9rem;
}
.status-row small { color: var(--steel); font-weight: 400; margin-left: auto; }
.status-row + .status-row { margin-top: 0.6rem; }
/* ---------- Status pill ---------- */
.status-pill {
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.72rem;
font-weight: 600;
padding: 0.2rem 0.6rem;
border-radius: 999px;
border: 1px solid transparent;
}
.status-ok { background: var(--green-soft); color: #2c4a2b; border-color: var(--green); }
.status-soon { background: var(--amber-soft); color: #7a5406; border-color: var(--amber); }
.status-overdue { background: var(--rust-soft); color: #6f2708; border-color: var(--rust); }
.status-none { background: var(--paper); color: var(--steel); border-color: var(--steel-2); }
/* ---------- Inspection sticker ---------- */
.sticker {
width: 74px;
height: 74px;
border-radius: 50%;
display: grid;
place-content: center;
text-align: center;
background: var(--green);
color: #fff;
font-family: var(--font-head);
border: 3px solid rgba(255, 255, 255, 0.75);
box-shadow: 0 0 0 2px var(--green), var(--shadow);
line-height: 1;
flex-shrink: 0;
}
.sticker span { font-size: 0.85rem; font-weight: 600; }
.sticker strong { font-size: 1.5rem; font-weight: 700; }
.sticker small { font-size: 0.6rem; letter-spacing: 0.15em; }
.sticker-empty { background: var(--steel); box-shadow: 0 0 0 2px var(--steel), var(--shadow); }
.sticker-ok { background: var(--green); box-shadow: 0 0 0 2px var(--green), var(--shadow); }
.sticker-soon { background: var(--amber); color: var(--ink); box-shadow: 0 0 0 2px var(--amber), var(--shadow); }
.sticker-overdue { background: var(--rust); box-shadow: 0 0 0 2px var(--rust), var(--shadow); }
.sticker-none { background: var(--steel); box-shadow: 0 0 0 2px var(--steel), var(--shadow); }
/* ---------- Due list ---------- */
.due-list { display: flex; flex-direction: column; gap: 0.2rem; padding: 0.5rem; }
.due-item {
display: flex;
align-items: center;
gap: 1rem;
padding: 0.7rem 0.8rem;
border-radius: 8px;
text-decoration: none;
color: inherit;
}
.due-item:hover { background: var(--paper); }
.due-item > div:first-child { display: flex; flex-direction: column; }
.due-item strong { font-size: 0.98rem; }
.due-item span { color: var(--steel); font-size: 0.85rem; }
.due-figures { margin-left: auto; text-align: right; font-family: var(--font-mono); font-size: 0.82rem; }
.due-figures span { display: block; color: var(--ink-2); }
/* ---------- Empty state ---------- */
.empty-state {
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.7rem;
padding: 3rem 1.5rem;
}
.empty-icon { font-size: 2.4rem; color: var(--signal-dark); }
/* ---------- Detail page ---------- */
.detail-top {
display: grid;
grid-template-columns: 1.2fr 1.6fr auto;
gap: 1rem;
margin-bottom: 1.4rem;
}
.stat-panel { display: flex; flex-direction: column; }
.status-panel { display: flex; flex-direction: column; justify-content: center; }
.sticker-panel { display: grid; place-items: center; }
.detail-grid {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
.data-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 0.8rem; margin: 0; }
.data-list dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--steel); }
.data-list dd { margin: 0.1rem 0 0; font-weight: 600; }
.notes {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px dashed var(--paper-line);
white-space: pre-wrap;
color: var(--ink-2);
}
/* ---------- Timeline ---------- */
.timeline { display: flex; flex-direction: column; gap: 0; padding: 0; }
.timeline-item {
display: flex;
gap: 1rem;
justify-content: space-between;
padding: 1rem 1.2rem;
border-bottom: 1px solid var(--paper-line);
}
.timeline-item:last-child { border-bottom: none; }
.timeline-main { display: flex; flex-direction: column; gap: 0.35rem; }
.timeline-head { display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; }
.timeline-head strong { font-size: 1.02rem; }
.timeline-meta {
display: flex;
gap: 1rem;
flex-wrap: wrap;
font-size: 0.82rem;
color: var(--steel);
}
.timeline-meta a { color: var(--rust); font-weight: 600; text-decoration: none; }
.timeline-meta a:hover { text-decoration: underline; }
.type-tag {
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.68rem;
font-weight: 600;
padding: 0.15rem 0.55rem;
border-radius: 5px;
background: var(--ink);
color: var(--paper-2);
}
.type-tuev_hu { background: var(--rust); }
.type-inspektion { background: var(--amber); color: var(--ink); }
.type-oelwechsel { background: var(--ink-3); }
.type-reifenwechsel { background: var(--steel); }
.type-reparatur { background: var(--ink); }
.type-sonstiges { background: var(--steel-2); color: var(--ink); }
/* ---------- Tables ---------- */
.table-wrap { overflow-x: auto; padding: 0.4rem; }
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
.data-table th {
text-align: left;
font-family: var(--font-head);
text-transform: uppercase;
letter-spacing: 0.06em;
font-size: 0.72rem;
color: var(--steel);
padding: 0.6rem 0.7rem;
border-bottom: 2px solid var(--paper-line);
}
.data-table td { padding: 0.6rem 0.7rem; border-bottom: 1px solid var(--paper-line); }
.data-table tr:last-child td { border-bottom: none; }
.inline-form { display: inline-flex; align-items: center; gap: 0.4rem; margin: 0; }
.inline-form select { width: auto; }
.badge {
margin-left: 0.5rem;
font-family: var(--font-head);
font-size: 0.62rem;
letter-spacing: 0.08em;
text-transform: uppercase;
background: var(--signal);
color: var(--ink);
padding: 0.1rem 0.4rem;
border-radius: 4px;
}
/* ---------- Add block (details/summary) ---------- */
.add-block { margin-top: 1rem; }
.add-block > summary { display: inline-flex; list-style: none; margin-bottom: 0; }
.add-block > summary::-webkit-details-marker { display: none; }
.add-block[open] > summary { margin-bottom: 1rem; }
.add-block[open] > summary::after { content: " ✕"; }
/* ---------- Responsive ---------- */
@media (max-width: 780px) {
.detail-top { grid-template-columns: 1fr; }
.form-grid { grid-template-columns: 1fr; }
.form-grid .span-2 { grid-column: auto; }
.topbar { gap: 0.8rem; }
.topbar nav { order: 3; width: 100%; }
.user-menu { margin-left: auto; }
}