Files
Rotatory/public/style.css
T
ferdi2goandClaude Fable 5.1 95756778d8 Rotatory anlegen: Morning-Meeting-Moderation auslosen und nach Nextcloud schreiben
Express-App mit JSON-Speicher unter VCH_DATA_DIR, Monatskalender mit Fotos,
Personen mit Rollen und Teilzeit-Freitagen, Abwesenheiten, Feiertage je
Bundesland, faire Zufallsauslosung mit Fixieren und Neu-Auslosen.

Nextcloud: CalDAV-Discovery, Zielkalender wählbar, Termine je Werktag
schreiben und aktualisieren, Abwesenheiten aus Kalender importieren,
Personen samt Fotos aus dem Systemadressbuch übernehmen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 06:39:37 +00:00

205 lines
11 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.
:root {
--bg: #f6f7fb;
--card: #ffffff;
--text: #1c2130;
--muted: #5d6578;
--line: #dde1ea;
--accent: #2f6fed;
--accent-text: #ffffff;
--main: #2f6fed;
--co: #e08a1e;
--danger: #c93b3b;
--holiday: #eef0f5;
--today: #fff6d6;
--warn: #b25e00;
--ok: #1d7a3e;
--radius: 10px;
--cell-min: 64px;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #14171f;
--card: #1e222c;
--text: #e8eaf0;
--muted: #a0a7b8;
--line: #313746;
--holiday: #1a1d25;
--today: #3a3420;
--accent: #5b8dff;
--main: #5b8dff;
--co: #f0a23a;
--danger: #ff7b7b;
--warn: #f2b45a;
--ok: #5fcf7f;
}
}
* { box-sizing: border-box; }
html { color-scheme: light dark; }
body {
margin: 0;
font: 15px/1.45 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
color: var(--text);
background: var(--bg);
}
h1, h2, h3 { margin: 0 0 .5rem; line-height: 1.2; }
h1 { font-size: 1.25rem; }
h2 { font-size: 1.2rem; }
h3 { font-size: 1rem; margin-top: 1.5rem; }
a { color: var(--accent); }
[hidden] { display: none !important; }
.topbar {
display: flex; flex-wrap: wrap; gap: .5rem 1rem; align-items: center;
padding: .6rem 1rem; background: var(--card); border-bottom: 1px solid var(--line);
position: sticky; top: 0; z-index: 5;
}
.topbar nav { display: flex; gap: .25rem; flex-wrap: wrap; }
.topbar nav a {
text-decoration: none; color: var(--muted); padding: .35rem .7rem; border-radius: 999px; font-weight: 500;
}
.topbar nav a[aria-current="page"] { background: var(--accent); color: var(--accent-text); }
.topbar nav a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible, .day:focus-visible {
outline: 3px solid var(--accent); outline-offset: 2px;
}
main { padding: 1rem; max-width: 1100px; margin: 0 auto; }
.view > h2 { margin-bottom: 1rem; }
.card { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); padding: 1rem; margin-bottom: 1rem; }
.form-grid { display: grid; gap: .75rem; grid-template-columns: 1fr; }
@media (min-width: 640px) { .form-grid { grid-template-columns: 1fr 1fr; } .form-grid .wide, .form-grid fieldset, .form-grid .form-actions, .form-grid .hint { grid-column: 1 / -1; } }
label { display: flex; flex-direction: column; gap: .25rem; font-size: .9rem; color: var(--muted); }
label.inline { flex-direction: row; align-items: center; gap: .5rem; color: var(--text); }
input, select, button, .button {
font: inherit; border-radius: 8px; border: 1px solid var(--line); padding: .5rem .65rem; background: var(--card); color: var(--text);
min-height: 40px;
}
input[type="checkbox"] { min-height: 0; width: 1.1rem; height: 1.1rem; accent-color: var(--accent); }
/* Felder dürfen nie breiter werden als ihr Container – lange Kalendernamen in <select> sonst schon */
label > input:not([type="checkbox"]), label > select { width: 100%; min-width: 0; max-width: 100%; }
.form-grid > *, .dialog-form > *, .row > label { min-width: 0; }
.row > label { flex: 1 1 180px; }
.row > button { flex: 0 0 auto; }
fieldset.checks { border: 1px solid var(--line); border-radius: 8px; display: flex; flex-wrap: wrap; gap: .75rem 1.5rem; padding: .5rem .75rem .75rem; margin: 0; }
fieldset.checks legend { font-size: .85rem; color: var(--muted); padding: 0 .25rem; }
fieldset.checks label { flex-direction: row; align-items: center; gap: .4rem; color: var(--text); }
button, .button { cursor: pointer; font-weight: 500; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .35rem; }
button:hover, .button:hover { border-color: var(--accent); }
button.primary { background: var(--accent); color: var(--accent-text); border-color: var(--accent); }
button.ghost, .button.ghost { background: transparent; }
button.danger { color: var(--danger); }
button:disabled { opacity: .5; cursor: wait; }
.form-actions { display: flex; gap: .5rem; flex-wrap: wrap; align-items: center; }
.form-actions .spacer { flex: 1; }
.row { display: flex; flex-wrap: wrap; gap: .5rem 1rem; align-items: end; margin-bottom: .75rem; }
.hint { color: var(--muted); font-size: .88rem; margin: .25rem 0 .75rem; }
.result { padding: .6rem .8rem; border-radius: 8px; background: var(--holiday); font-size: .9rem; white-space: pre-line; }
.result.error { color: var(--danger); }
/* Kalender */
.toolbar { display: flex; flex-wrap: wrap; gap: .75rem; justify-content: space-between; align-items: center; margin-bottom: .75rem; }
.month-nav { display: flex; align-items: center; gap: .4rem; }
.month-nav h2 { min-width: 11ch; text-align: center; margin: 0; }
.month-nav button { min-width: 40px; }
.actions { display: flex; gap: .4rem; flex-wrap: wrap; }
.calendar { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.weekdays, .days { display: grid; grid-template-columns: repeat(5, 1fr); }
.weekdays div { text-align: center; font-size: .8rem; color: var(--muted); padding: .4rem 0; border-bottom: 1px solid var(--line); text-transform: uppercase; letter-spacing: .04em; }
.day {
min-height: var(--cell-min); padding: .3rem; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line);
display: flex; flex-direction: column; gap: .25rem; text-align: left; background: transparent; border-radius: 0; color: inherit;
cursor: pointer; align-items: stretch; justify-content: flex-start;
}
.day:nth-child(5n) { border-right: 0; }
.day.outside { background: var(--holiday); cursor: default; opacity: .55; }
.day.holiday { background: var(--holiday); }
.day.today { background: var(--today); }
.day.past { opacity: .7; }
.day:hover:not(.outside) { border-color: var(--line); box-shadow: inset 0 0 0 2px var(--accent); }
.day .num { font-size: .8rem; color: var(--muted); display: flex; justify-content: space-between; align-items: center; }
.day .num .lock { font-size: .7rem; }
.day .label { font-size: .72rem; color: var(--muted); line-height: 1.2; overflow-wrap: anywhere; }
.day .label.off { color: var(--warn); font-weight: 500; }
.day .pair { display: flex; gap: .3rem; align-items: flex-end; justify-content: center; flex-wrap: wrap; }
.slot { display: flex; flex-direction: column; align-items: center; gap: .1rem; min-width: 0; }
.slot .name { font-size: .68rem; line-height: 1.1; text-align: center; max-width: 5.5rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.slot .name.absent { color: var(--danger); text-decoration: line-through; }
.avatar.absent { border-color: var(--danger); box-shadow: 0 0 0 2px var(--danger); }
.avatar {
width: 52px; height: 52px; border-radius: 50%; object-fit: cover; background: var(--holiday);
display: inline-flex; align-items: center; justify-content: center; font-weight: 600; color: #fff; font-size: 1rem;
border: 3px solid var(--main); position: relative; flex-shrink: 0;
}
.avatar.co { width: 42px; height: 42px; border-color: var(--co); font-size: .85rem; }
.avatar.empty { border-style: dashed; color: var(--muted); background: transparent; }
.avatar.small { width: 24px; height: 24px; border-width: 2px; font-size: .7rem; }
.avatar.plain { border-color: var(--line); }
.slot .avatar-wrap { position: relative; display: inline-block; }
.badge {
display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%;
font-size: .65rem; font-weight: 700; color: #fff; background: var(--main);
}
.badge.co { background: var(--co); }
.slot .badge { position: absolute; bottom: -2px; right: -4px; border: 2px solid var(--card); width: 20px; height: 20px; }
.legend { display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; margin: .75rem 0; font-size: .85rem; color: var(--muted); align-items: center; }
.legend > span { display: inline-flex; align-items: center; gap: .35rem; }
.stats { margin-top: .5rem; }
.stats h3 { margin-top: .5rem; }
#stats { display: flex; flex-wrap: wrap; gap: .5rem; }
.chip { display: inline-flex; align-items: center; gap: .4rem; padding: .25rem .6rem .25rem .3rem; border: 1px solid var(--line); border-radius: 999px; background: var(--card); font-size: .85rem; }
.chip .avatar { width: 26px; height: 26px; border-width: 2px; font-size: .7rem; }
.chip .count { color: var(--muted); }
@media (max-width: 520px) {
:root { --cell-min: 78px; }
main { padding: .5rem; }
.avatar { width: 34px; height: 34px; border-width: 2px; font-size: .75rem; }
.avatar.co { width: 28px; height: 28px; font-size: .65rem; }
.slot .badge { width: 15px; height: 15px; font-size: .55rem; }
.slot .name { display: none; }
.day { padding: .2rem; }
.day .pair { flex-direction: column; align-items: center; gap: .15rem; }
}
/* Listen */
.list, .person-list { list-style: none; padding: 0; margin: 0; display: grid; gap: .5rem; }
.list li, .person-list li {
display: flex; align-items: center; gap: .75rem; padding: .6rem .8rem; background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); flex-wrap: wrap;
}
.list.compact li { padding: .35rem .6rem; }
.person-list .avatar { width: 56px; height: 56px; cursor: pointer; }
.person-list .avatar.plain:hover { border-color: var(--accent); }
.person-list .who { flex: 1; min-width: 160px; }
.person-list .who strong { display: block; }
.person-list .who small, .list small { color: var(--muted); }
.tags { display: flex; gap: .3rem; flex-wrap: wrap; margin-top: .2rem; }
.tag { font-size: .72rem; padding: .1rem .5rem; border-radius: 999px; background: var(--holiday); color: var(--muted); }
.tag.main { background: var(--main); color: #fff; }
.tag.co { background: var(--co); color: #fff; }
.tag.off { background: var(--danger); color: #fff; }
.list li .grow { flex: 1; min-width: 160px; }
.list li button, .person-list li button { min-height: 34px; padding: .3rem .6rem; font-size: .85rem; }
.person-list li.inactive { opacity: .6; }
.type-urlaub { color: var(--ok); } .type-krankheit { color: var(--danger); } .type-frei { color: var(--accent); } .type-sonstiges { color: var(--muted); }
.contacts-list { list-style: none; margin: 0; padding: 0; max-height: 50vh; overflow: auto; border: 1px solid var(--line); border-radius: 8px; }
.contacts-list li { display: flex; align-items: center; gap: .6rem; padding: .4rem .6rem; border-bottom: 1px solid var(--line); }
.contacts-list li:last-child { border-bottom: 0; }
.contacts-list li.exists { opacity: .55; }
.contacts-list label { flex-direction: row; align-items: center; gap: .6rem; color: var(--text); flex: 1; cursor: pointer; }
.contacts-list small { color: var(--muted); }
.contacts-tools { display: flex; gap: .5rem; }
.form-grid h3 { margin: 0; }
/* Dialoge */
dialog { border: 1px solid var(--line); border-radius: var(--radius); padding: 0; background: var(--card); color: var(--text); width: min(92vw, 520px); max-width: calc(100vw - 2rem); box-sizing: border-box; }
dialog::backdrop { background: rgba(0,0,0,.45); }
.dialog-form { display: grid; gap: .75rem; padding: 1.25rem; }
.dialog-form h2 { margin: 0; }
.dialog-form .form-actions { margin-top: .5rem; }
.toast { position: fixed; bottom: calc(1rem + env(safe-area-inset-bottom, 0px)); left: 50%; transform: translateX(-50%); background: var(--text); color: var(--bg); padding: .6rem 1rem; border-radius: 999px; font-size: .9rem; z-index: 20; max-width: 90vw; }
.toast.error { background: var(--danger); color: #fff; }
.status-ok { color: var(--ok); } .status-warn { color: var(--warn); }
code { background: var(--holiday); padding: .1rem .3rem; border-radius: 4px; font-size: .85em; }