Files
alpenwerk-hr/app/globals.css
Andrei Laas f7a5c48615
Some checks failed
CI / Lint, Typen, Tests, Build (push) Successful in 11m45s
CI / Migrationen auf leerer Datenbank (push) Has been cancelled
Die Oberflaeche auf das Manner-CD umstellen
Farben, Schrift, Logo und Symbole folgen jetzt dem CD Manual 2022. An der
Logik aendert sich nichts: keine Migration, keine Abfrage, keine Berechtigung.

Die zwei Markenfarben stehen in §1.1 als #F69686 (Rosa) und #164194 (Blau).
Welche davon was traegt, ist nicht gewaehlt, sondern nachgerechnet: Weiss auf
Rosa kommt auf 2.18:1 und faellt damit auch fuer Grossschrift durch, Blau auf
Rosa auf 4.34:1 und reicht fuer das Logo, nicht fuer Text. Schwarz auf Rosa
sind 7.47:1, Weiss auf Blau 9.47:1. Rosa ist deshalb Flaeche, Blau ist
Interaktion — zwei Skalen, brand-* und accent-*, statt einer geteilten.

Von den 26 Stellen mit brand-50/100/200 sind nur sieben auf accent gewandert.
Der Rest meint einen Zustand und keinen Markenton: die Zeile unter dem Zeiger,
der gewaehlte Listeneintrag, der aktive Menuepunkt. Gegen die warme
Seitenflaeche ist ein kuehler Ton dort deutlicher, und Blau heisst in dieser
Oberflaeche ab jetzt "reagiert auf dich". Nach accent gingen die Faelle ohne
eigene Bedeutung — "Geplant", "Offen", der neutrale Protokoll-Chip — und die
offene Planstelle im Organigramm, die vorher ein blasses Blau war und damit
wie eine schwaechere Person aussah.

Die Funktionsfarben bleiben, was sie sind. Das Manual regelt die Identitaet,
nicht die Rueckmeldung: Rot heisst Fehler, weil die Benutzerin das mitbringt.
`info` bleibt bewusst tuerkis — Blau saehe ab jetzt bedienbar aus, und gemessen
kaeme ein blaues info dem violetten Chip auf dE 6.8 nahe, also nicht
unterscheidbar. Violett ist dabei nachgezogen: gegen den Fehler-Chip stand es
bei dE 8.0, "Austritt" und "Befoerderung" waren im Vorbeigehen dieselbe blasse
Flaeche. Jetzt dE 15.0.

Die Schrift ist Barlow. Nachgezaehlt ist das Manual zu 95 % in DIN gesetzt
(Regular 79 %, Bold 16 %); Helvetica Neue steht nur in den Visitenkarten und im
Claim. DIN laesst sich nicht ausliefern — eine Drucklizenz deckt keinen Webfont
—, und die freien Nachbauten der DIN 1451 sind Schilderschriften, bei 14 px in
einer langen Tabelle schlechter lesbar als das, was sie ersetzen. Die Variable
heisst --font-din und nicht --font-barlow: liegt eines Tages eine Web-Lizenz
vor, ist der Wechsel diese eine Deklaration.

Nebenbei zwei Dinge repariert, die vorher schon falsch waren. Die Umrandung von
Eingabefeldern, Knoepfen und Suchfeldern lag bei 1.30:1 und damit unter den 3:1,
die WCAG 1.4.11 fuer Bedienelemente verlangt; border-strong bringt 3.56:1. Und
das mitgelieferte favicon.ico liess sich gar nicht bauen: eingebettet waren
24-Bit-RGB-PNG, waehrend der Kopf 32 bpp behauptete. Alle Rastersymbole liegen
jetzt als RGBA vor, und ihr Blau ist auf den CD-Wert gezogen — samt der
kantengeglaetteten Raender, indem je Pixel der Blauanteil bestimmt und neu
gemischt wurde.

Das Logo ist das Markenlogo (§4.1), nicht das Unternehmenslogo, das §3.2 fuer
eine Anwendung mit der AG als Absender vorsaehe — es liegt nicht vor. Der
Freiraum X/3 steckt im Bauteil selbst und nicht in den Aufrufstellen, sonst
haengt seine Einhaltung daran, dass jede einzelne daran denkt.

docs/farbschema.html zeigt Token, Kontraste und Bauteile nebeneinander und
laesst sich ohne Server oeffnen.

Nicht im Browser gesehen: Anmeldung laeuft ueber das Firmenkonto und die
Datenbank ist von hier nicht erreichbar. Lint, Typen, Schemaabgleich, 524 Tests
und der Build sind sauber.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:26:21 +02:00

212 lines
7.6 KiB
CSS

@import "tailwindcss";
/* ═══ Farben nach dem Manner CD Manual 2022 ═══════════════════════════
§1.1 kennt genau zwei Markenfarben:
Manner Rosa #F69686 CMYK 0/50/40/0 sRGB 246 150 134
Manner Blau #164194 CMYK 100/80/0/0 sRGB 22 65 148 (Reflex Blue)
Beide behalten ihren Wert unveraendert; die Abstufungen daneben sind
Aufhellungen und Abdunklungen davon, weil eine Oberflaeche Zwischentoene
fuer Hover, Chips und Flaechen braucht und das Manual nur fuer den Druck
geschrieben ist.
── Warum Blau die Interaktion traegt und Rosa die Flaeche ──
Nachgerechnet nach WCAG 2.1:
Weiss auf Rosa 2.18:1 faellt durch, auch fuer Grossschrift
Schwarz auf Rosa 7.47:1 AAA
Weiss auf Blau 9.47:1 AAA
Blau auf Weiss 9.47:1 AAA
Rosa kann also keine Schrift tragen — weder weisse noch, bei 4.34:1,
blaue Fliesschrift. Es ist eine Flaeche, auf der Dunkles steht. Blau
traegt in beide Richtungen und wird damit zur Farbe von Knopf, Link und
Fokusring. Das ist keine Auslegung des Manuals, sondern das, was die
beiden Farben physikalisch hergeben. */
@theme {
/* ── Blau: alles, was man anfassen kann ── */
--color-brand-50: #eef3fb;
--color-brand-100: #dae4f5;
--color-brand-200: #afc3e6;
--color-brand-500: #164194; /* Manner Blau, CD §1.1 */
--color-brand-600: #11326f;
--color-brand-700: #0d2857;
/* ── Rosa: alles, was die Marke traegt ──
accent-500 ist der Markenwert und bleibt Flaeche. Die Schrift darauf
ist ink (7.47:1), nie Weiss. */
--color-accent-50: #fef5f2;
--color-accent-100: #fde7e1;
--color-accent-200: #facec2;
--color-accent-500: #f69686; /* Manner Rosa, CD §1.1 */
--color-accent-600: #d9604b;
--color-accent-700: #a8402e;
--color-surface: #fdf6f4;
--color-border: #f0dbd4;
--color-border-subtle: #f8ece8;
/* Fuer die Umrandung von Eingabefeldern. Der dekorative Kartenrahmen
darueber darf blass sein; die Grenze eines Bedienelements muss nach
WCAG 1.4.11 3:1 erreichen, und das tut dieser Ton mit 3.56:1 gegen
Weiss und 3.34:1 gegen die Seitenflaeche. */
--color-border-strong: #a67f70;
/* Das Schwarz aus dem Manual selbst (#231F20), nicht reines Schwarz. */
--color-ink: #231f20;
--color-ink-body: #4b4446;
--color-ink-muted: #756c6e;
/* ── Funktionsfarben ──
Sie bleiben, was sie sind. Das Manual regelt die Identitaet, nicht die
Rueckmeldung: Rot heisst Fehler, weil die Benutzerin das mitbringt,
nicht weil es jemand entworfen hat. In einem System, in dem ein Knopf
einen Austritt erfasst, waere eine markenkonforme Fehlerfarbe kein
Stil, sondern ein Mangel.
`info` bleibt bewusst tuerkis statt blau zu werden: Blau heisst ab
jetzt „hier kann man klicken", und ein Hinweischip in derselben Farbe
saehe bedienbar aus. Gemessen kommt dazu, dass ein blaues info dem
violetten Chip zu nahe kaeme (dE 6.8 — nicht unterscheidbar). */
--color-success-bg: #dff6dd;
--color-success-text: #0e700e;
--color-danger-bg: #fde7e9;
--color-danger-text: #b10e1c;
--color-danger-solid: #c50f1f;
--color-warning-bg: #fff4ce;
--color-warning-text: #835b00;
--color-info-bg: #d7f0f0;
--color-info-text: #00666d;
/* Nachgezogen: gegen den alten Wert #f0ecf7 stand der Fehler-Chip bei
dE 8.0 — „Austritt" und „Befoerderung" waren im Vorbeigehen dieselbe
blasse Flaeche. Jetzt dE 15.0 bei 7.9:1 Kontrast. */
--color-purple-bg: #e4d9f5;
--color-purple-text: #54277f;
/* A bare `--radius` in Tailwind v4 collapses the whole scale onto one
value — `rounded` and `rounded-lg` both came out at 8px, so a chip, an
input and a card could not be told apart. Named steps restore the
gradation; 8px stays the default so nothing shifts unintentionally. */
--radius-sm: 4px;
--radius: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
/* Warm, brand-tinted rather than neutral grey: a pure black shadow over
the pink surface reads as dirt. Kept shallow — this is a data-dense
admin UI, the depth only has to separate a card from the page.
Der Grundton folgt dem Rosa der Flaeche, nicht mehr dem alten Magenta. */
--shadow-card: 0 1px 2px rgb(122 60 45 / 0.05), 0 1px 3px rgb(122 60 45 / 0.07);
--shadow-card-hover: 0 2px 4px rgb(122 60 45 / 0.07), 0 4px 12px rgb(122 60 45 / 0.09);
--shadow-overlay: 0 8px 32px rgb(35 31 32 / 0.18);
/* Siehe app/layout.tsx: DIN waere die Schrift des Manuals, ist aber nicht
als Webfont lizenziert; geladen wird Barlow als naechstliegender freier
Ersatz. Die Ersatzkette bleibt neutral — faellt der Webfont aus, soll
keine gerundete Systemschrift einspringen. */
--font-sans: var(--font-din), "Segoe UI", system-ui, sans-serif;
}
body {
background-color: var(--color-surface);
color: var(--color-ink);
/* iOS bounce-scrolls the whole document behind fixed overlays (drawer,
modal) and shows the white page edge; contain keeps the rubber band
inside the scroller that actually overflowed. */
overscroll-behavior-y: none;
}
/* Mobile browsers zoom the page when a focused input is under ~16px. Every
form control in this app is text-sm (14px), so without this, tapping any
field on iOS Safari jumps the layout. */
@media (max-width: 767px) {
input,
select,
textarea {
font-size: 16px;
}
}
/* Touch devices have no hover, so the grey flash Chrome/Safari paint on tap
is the only press feedback — but their default is a hard blue box. */
@media (hover: none) {
* {
-webkit-tap-highlight-color: color-mix(in srgb, var(--color-brand-500) 12%, transparent);
}
}
/* ── React Flow chrome ─────────────────────────────────────────────
The library ships a generic grey control panel; these bring it onto the
app's own palette and give the buttons a real touch target. */
.orgchart-canvas .react-flow__controls {
gap: 2px;
border-radius: var(--radius);
border: 1px solid var(--color-border);
background: #fff;
box-shadow: 0 2px 10px rgb(45 28 38 / 0.08);
overflow: hidden;
}
.orgchart-canvas .react-flow__controls-button {
width: 32px;
height: 32px;
border: none;
border-bottom: 1px solid var(--color-border-subtle);
background: #fff;
color: var(--color-ink-body);
}
.orgchart-canvas .react-flow__controls-button:last-child {
border-bottom: none;
}
.orgchart-canvas .react-flow__controls-button:hover {
background: var(--color-brand-100);
color: var(--color-brand-700);
}
.orgchart-canvas .react-flow__controls-button svg {
fill: currentColor;
max-width: 14px;
max-height: 14px;
}
.orgchart-canvas .react-flow__minimap {
border-radius: var(--radius);
border: 1px solid var(--color-border);
background: #fff;
box-shadow: 0 2px 10px rgb(45 28 38 / 0.08);
}
/* Node selection has to stay enabled (it is what gives the card pointer
events at all — see GraphOrgChart), but the card carries its own hover and
match styling, so React Flow's default selected/focus outline is noise. */
.orgchart-canvas .react-flow__node.selected,
.orgchart-canvas .react-flow__node:focus,
.orgchart-canvas .react-flow__node:focus-visible {
outline: none;
box-shadow: none;
}
.orgchart-canvas .react-flow__attribution {
background: transparent;
font-size: 10px;
}
.orgchart-canvas .react-flow__attribution a {
color: var(--color-ink-muted);
}
/* The minimap costs more screen than it earns on a phone. */
@media (max-width: 1023px) {
.orgchart-canvas .react-flow__minimap {
display: none;
}
}