Corporate Identity · Brand Guidelines

Joram

Mit Ruhe und Plan zum digitalen Erfolg.

PersonaIT-Projektmanager · Web
WerteErfahrung · Ruhe · Verlässlichkeit
SpracheDeutsch · Du-Form

Die Corporate Identity soll Erfahrung durch die dunklen Töne und des serif-Headings vermitteln, da dies als Arbeitnehmer meine wichtigstes Gut ist. Ich will auch Luxus durch große Abstände und die Serif-Schrift vermitteln.

02 BRAND

Wortmarke

Die Kombination paart das Zeichen mit „Joram” in Cormorant Garamond 600 und einer großgeschriebenen, weit gesperrten Rollenzeile. Bis ein individuelles Monogramm entwickelt wird, ist diese typografische Wortmarke der Standard.

Joram
IT-Projektmanagement
Joram
IT-Projektmanagement
wordmark.css
.wordmark {
  font: 600 46px/1 "Cormorant Garamond", Garamond, Georgia, serif;
  letter-spacing: 0.01em;
  color: var(--fg-strong);
}
.wordmark .role {            /* IT-PROJEKTMANAGEMENT lockup line */
  font: 600 9px/1 "Nunito", sans-serif;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--fg-muted);
}
03 BRAND

Slogan

Eine Zeile, in der Serifenschrift gesetzt. Normaler Satzanfang, die Schlussphrase kursiv. Sie trägt das Markenversprechen von Ruhe und Methode.

Hell

Mit Ruhe und Plan zum digitalen Erfolg.

Dunkel

Mit Ruhe und Plan zum digitalen Erfolg.

slogan.css
.slogan {
  font: 500 30px/1.2 "Cormorant Garamond", serif;
  letter-spacing: -0.005em;
}
.slogan em { font-style: italic; font-weight: 500; }

Casing. Sentence case, German nouns capitalised as normal. No ALL-CAPS, no exclamation marks. The italic carries the emphasis instead.

04 BRAND

Sprache & Ton

Ruhig, kompetent, ohne Buzzwords. Joram ist die Person, die man anruft, wenn etwas live gehen muss und die andere Agentur schweigt — ehrlich über Scope, allergisch gegen „Synergie”.

Joram klingt so

„Webprojekte, die ankommen auch wenn's brennt.”
„Ich übernehme dein Projekt da, wo's stockt.”
„Klare Kommunikation. Realistische Zeitpläne. Keine Überraschungen auf der Rechnung.”

Du-Form als Default · Doppelpunkt beim Gendern (Kolleg:in) · sentence case · keine Ausrufezeichen.

Joram klingt nicht so

„Wir disrupten dein Projekt-Ökosystem!”
„DEIN PARTNER FÜR DIGITALE TRANSFORMATION”
„Synergien heben, agil pivotieren 🚀”

Keine Buzzwords · keine Caps · keine Emoji · kein Wir-Plural, wenn Joram allein arbeitet.

Primär Deutsch Sekundär Englisch Optional Leichte Sprache
05 BRAND

Gendern

Erst prüfen, ob geschicktgendern.de eine elegante Alternative kennt. Gibt es keine, kommt der Doppelpunkt.

So gendern

Erst auf geschicktgendern.de nach einer neutralen Alternative suchen z. B. „Studierende" statt „Student:innen".
Keine passende Alternative? → Doppelpunkt: Kolleg:in, Auftraggeber:in, Entwickler:in.

Kein Genderstern · kein Binnen-I · kein Schrägstrich.

Nicht so

„KollegInnen" Binnen-I wirkt veraltet.
„Kollegen*innen" Stern nicht vorgesehen.
„Kollegen/-innen" Schrägstrich bricht den Lesefluss.
06 BRAND

Portraitbearbeitung

Ein einzelnes, zurückhaltendes Portrait — warm und ruhig, niemals eine Stockfoto-Collage. Ein leichter Graustufenlift hält es geerdet auf jedem Hintergrund.

Joram Ulmke
Joram Ulmke
IT-Projektleiter

Leichter Grayscale-Lift (15 %) und +2 % Kontrast. Warm, ruhig, niemals stockfoto-glatt. Keine Hintergrund-Verläufe, keine harten Schnitte.

portrait.css
.portrait img {
  width: 150px; height: 150px;
  object-fit: cover;
  border-radius: var(--radius-sm);
  filter: grayscale(0.15) contrast(1.02);   /* warm, never stock-glossy */
}
07 COLOR

Primärfarben

Fünf Primärfarben plus ein erhöhtes Weiß. Off-White (kein reines Weiß) im Hellen; Ink Black (kein reines Schwarz) im Dunklen. Madder ist verdient — siehe CTA-System.

Oxford Blue
#0A1137
Text · Schaltfläche (Hell)
Baby Powder
#F5F7F3
Hintergrund (Hell)
Madder
#A6112F
CTA (Hell)
Madder Rose
#F0A4B0
CTA (Dunkel)
Rose Quartz
#ACA6BB
Schaltfläche (Dunkel)
Ink Black
#0D0D1A
Hintergrund (Dunkel)
style.css
:root {
  --color-oxford-blue: #0a1137;   /* Text · button (light) */
  --color-baby-powder: #f5f7f3;   /* Background (light)     */
  --color-madder:      #a6112f;   /* CTA (light)            */
  --color-madder-dark: #f0a4b0;   /* CTA (dark) warm rose */
  --color-rose-quartz: #aca6bb;   /* Button + muted (dark)  */
  --color-ink-black:   #0d0d1a;   /* Background (dark)      */
}
08 COLOR

Semantische Token

Rollen, keine Rohfarben, im Markup. Dieselben Token-Namen schalten automatisch um, wenn [data-theme="dark"] gesetzt ist — Komponenten kodieren niemals direkt einen Hex-Wert.

Hellmodus

--bg#F5F7F3
--fg#0A1137
--fg-strong#0D0D1A
--button-bg#0A1137
--accent#A6112F

Dunkelmodus

--bg#0D0D1A
--fg#F5F7F3
--fg-muted#ACA6BB
--button-bg#ACA6BB
--accent#F0A4B0
semantic-tokens.css
:root {                          /* Light mode (default) */
  --bg:        var(--color-baby-powder);
  --fg:        var(--color-oxford-blue);
  --fg-strong: var(--color-ink-black);
  --button-bg: var(--color-oxford-blue);
  --button-fg: var(--color-baby-powder);
  --accent:    var(--color-madder);
}
:root[data-theme="dark"] {       /* Dark mode */
  --bg:        var(--color-ink-black);
  --fg:        var(--color-baby-powder);
  --fg-muted:  var(--color-rose-quartz);
  --button-bg: var(--color-rose-quartz);
  --button-fg: var(--color-oxford-blue);
  --accent:    var(--color-madder-dark);
}
09 COLOR

AAA-Farbkombinationen

Jede Kombination unten ist AAA nach WCAG. Innerhalb dieses Sets ist Kontrast nie eine Frage.

Auf #0A1137:

#F5F7F3 als Textfarbe.16.97:1

#ACA6BB als Textfarbe.7.77:1

#F0A4B0 als Textfarbe.9.28:1

Auf #F5F7F3:

#0A1137 als Textfarbe.16.97:1

#0D0D1A als Textfarbe.17.89:1

#A6112F als Textfarbe.7.10:1

Auf #ACA6BB:

#0A1137 als Textfarbe.7.77:1

#0D0D1A als Textfarbe.8.19:1

Auf #0D0D1A:

#F5F7F3 als Textfarbe.17.89:1

#ACA6BB als Textfarbe.8.19:1

Auf #A6112F:

#F5F7F3 als Textfarbe.7.10:1

Auf #F0A4B0:

#0D0D1A als Textfarbe.9.78:1

#0A1137 als Textfarbe.9.28:1

pairings.css
/* Every pairing is AAA per WCAG (contrast 7:1+) */
/* on Oxford Blue  #0A1137 → Baby Powder · Rose Quartz            */
/* on Baby Powder  #F5F7F3 → Oxford Blue · Ink Black · Madder     */
/* on Rose Quartz  #ACA6BB → Oxford Blue · Ink Black              */
/* on Ink Black    #0D0D1A → Baby Powder · Rose Quartz            */
/* on Madder       #A61127 → Baby Powder only  (light-mode CTA)   */
/* on Madder Rose  #F0A4B0 → Ink Black · Oxford Blue (dark CTA)   */
10 TYPOGRAPHY

Überschriften-Schrift Cormorant Garamond

Eine selbst-gehostete variable Serifenschrift, die erfahrenes Handwerk signalisiert. Leicht negatives Tracking, enger Zeilenabstand. Kursiv nur zur Betonung in Textgrößen — selten im Display.

Display · 700Erfahrung60 / 700
H1 · 800Mit Ruhe und Plan42 / 800
H1 · 800 it.zum digitalen Erfolg.42 / 800 it
H2 · 600Klar. Realistisch. Ehrlich.30 / 600
H3 · 600Übernahme stockender Projekte22 / 600
type-heading.css
/* Cormorant Garamond Regular */
@font-face {
  font-family: 'CormorantGaramond';
  src: url('https://joram.eu/fonts/CormorantGaramond-VariableFont_wght.woff2') format('woff2-variations');
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
}
/* Cormorant Garamond Italic */
@font-face {
  font-family: 'CormorantGaramond';
  src: url('https://joram.eu/fonts/CormorantGaramond-Italic-VariableFont_wght.woff2') format('woff2-variations');
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
}
:root {
  --font-heading: "Cormorant Garamond", "EB Garamond", Georgia, serif;
  --font-features-heading: "case" 1, "zero" 1, "calt" 1;
  --display-1: 700 clamp(3.5rem, 6vw + 1rem, 6rem)/1.02 var(--font-heading);
  --h1: 800 clamp(2.25rem, 2.5vw + 1rem, 3.25rem)/1.1 var(--font-heading);
  --h2: 600 clamp(1.75rem, 1.5vw + 1rem, 2.5rem)/1.15 var(--font-heading);
  --h3: 600 clamp(1.375rem, .75vw + 1rem, 1.75rem)/1.25 var(--font-heading);
  --tracking-heading: -0.01em;
}
h1, h2, h3, h4 { font-feature-settings: var(--font-features-heading); }
11 TYPOGRAPHY

Text-Schrift Nunito

Eine ruhige Groteskschrift für Fließtext. Standardgewicht 300 (leicht); 400 für Betonung, 600 für Buttons und Overlines. Die 300/400-Asymmetrie lässt der Serifenschrift Raum zum Atmen.

Body LG · 30018 / 300 / 1.6

Ich übernehme dein Projekt da, wo's stockt ohne lange Einarbeitung, ohne Drama.

Body · 300 (default)16 / 300 / 1.6

Klare Kommunikation, realistische Zeitpläne, keine Überraschungen auf der Rechnung. Über zwölf Jahre Erfahrung.

Body · 400 (emphasis)16 / 400 / 1.6

Du suchst jemanden, der digitale Projekte verlässlich steuert und mitdenkt? Ich bin bereit.

Caption12 / 400 / 1.4

Stand: Juni 2026 · Verfügbar ab Mai 2026

Overline12 / 600 / +0.12em

Was ich für dich tue

type-body.css
/* Nunito Regular */
@font-face {
  font-family: 'Nunito';
  src: url('https://joram.eu/fonts/Nunito-VariableFont_wght.woff2') format('woff2-variations');
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
}
/* Nunito Italic */
@font-face {
  font-family: 'Nunito';
  src: url('https://joram.eu/fonts/Nunito-Italic-VariableFont_wght.woff2') format('woff2-variations');
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
}
:root {
  --font-body: "Nunito", system-ui, sans-serif;
  --body-lg:   300 1.125rem/1.65 var(--font-body);
  --body:      300 1rem/1.6      var(--font-body);   /* default = 300 */
  --body-emph: 400 1rem/1.6      var(--font-body);   /* emphasis    */
  --caption:   400 0.75rem/1.4   var(--font-body);
  --overline:  600 0.75rem/1.2   var(--font-body);   /* uppercased  */
  --tracking-overline: 0.12em;
}
12 TYPOGRAPHY

Typografie im Einsatz

Serifen-Display über einer ruhigen Groteskschrift, getrennt durch eine kurze Haarlinie. Overline → Headline → Linie → Absatz mit Maß-Cap.

Über mich

Erfahrung ist mein wichtigstes Gut.

Seit zwölf Jahren begleite ich Web-Projekte vom kleinen Relaunch bis zur mehrjährigen Plattform. Ich übernehme da, wo's stockt, halte Zeitpläne realistisch und sage Dinge auch dann, wenn sie nicht ins Briefing passen.

pairing.css
.overline {
  font: var(--overline);
  text-transform: uppercase;
  letter-spacing: var(--tracking-overline);
  color: var(--fg-muted);
}
h1 { font: var(--h1); letter-spacing: var(--tracking-heading); }
p  { font: var(--body); max-width: 65ch; }   /* serif display + sans body */

Optional

Für spezielle Zwecke — z. B. Datentabellen, technische Labels oder UI-Elemente, die sich bewusst vom gerundeten Standard abheben sollen — steht Nunito Sans als Alternative bereit. Nunito Sans hat keine gerundeten Buchstaben-Enden (Terminale) und wirkt dadurch schärfer. Standard bleibt Nunito.

nunito-sans-optional.css
/* Optional: Nunito Sans — no rounded terminals, for special purposes only */
.font-sans { font-family: var(--font-body-sans); }

/* Token: --font-body-sans */
/* Example usage */
.data-table  { font-family: var(--font-body-sans); }
.tech-label  { font-family: var(--font-body-sans); }
13 TYPOGRAPHY

Ikonografie Remix Icon

Linien-Icons standardmäßig; Fill nur für aktive Zustände. Ein Gewicht pro Oberfläche. Icons erben currentColor und werden nie unabhängig von ihrem Label eingefärbt.

Line (default)

route
calendar
team
shield
mail
arrow
file
chat

Fill (active state only)

route
calendar
team
shield

Sizing

16 · inline
20 · button
24 · nav
32 · feature
iconography.html
<!-- Remix Icon -->
<link rel="stylesheet" href="https://joram.eu/fonts/remixicon.css">

<i class="ri-route-line"></i>   <!-- line = default          -->
<i class="ri-route-fill"></i>   <!-- fill = active state only -->

/* Icons inherit currentColor never tinted independently. */
/* Sizing: 16 inline · 20 buttons · 24 nav · 32+ feature blocks. */
14 COMPONENTS

Buttons Hell

Oxford Blue primär, konturiert sekundär, Ghost für den Rückzug. Akzent (Madder) ist für die eine kritische Aktion reserviert — siehe CTA-System.

Primary
Secondary
AccentMadder nur für kritische CTAs oder Warnungen.
Ghost
buttons-light.css
.btn {
  font: 600 14px/1 var(--font-body);
  padding: 12px 20px;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  background: var(--color-oxford-blue);   /* primary */
  color: var(--color-baby-powder);
  cursor: pointer;
}
.btn-secondary { background: transparent; color: var(--color-oxford-blue); border-color: var(--color-oxford-blue); }
.btn-accent    { background: var(--color-madder); color: var(--color-baby-powder); }   /* critical CTA only */
.btn-ghost     { background: transparent; color: var(--color-oxford-blue); }
.btn:hover        { filter: brightness(0.92); }
.btn:active       { filter: brightness(0.82); transform: translateY(1px); }
.btn:focus-visible{ outline: 2px solid var(--focus-ring); outline-offset: 3px; }
15 COMPONENTS

Buttons Dunkel

Im Dunkelmodus wird primär zu Rose Quartz auf Oxford Blue, und der CTA wechselt zu warmem Madder Rose — AAA auf Ink Black.

Primary
Secondary
GhostMadder Rose (#F0A4B0) ist im Dark-Mode der wichtigste CTA.
buttons-dark.css
[data-theme="dark"] .btn {
  background: var(--color-rose-quartz);   /* primary in dark */
  color: var(--color-oxford-blue);
}
[data-theme="dark"] .btn-secondary {
  background: transparent;
  color: var(--color-baby-powder);
  border-color: var(--color-rose-quartz);
}
[data-theme="dark"] .btn-cta {
  background: var(--color-madder-dark);   /* warm rose, AAA on ink */
  color: var(--color-ink-black);
}
[data-theme="dark"] .btn:hover        { filter: brightness(1.10); }
[data-theme="dark"] .btn:active       { filter: brightness(1.20); transform: translateY(1px); }
[data-theme="dark"] .btn:focus-visible{ outline: 2px solid var(--focus-ring); outline-offset: 3px; }
16 COMPONENTS

CTA System

Die CTA-Farbe ist der lauteste Moment der Marke und muss verdient werden: die eine wichtigste Aktion auf einem Screen — typischerweise „Kontakt aufnehmen”. Niemals „zurück”, „mehr” oder etwas Sekundäres.

Light mode

CTA = die eine wichtigste Aktion. Madder. Sonst Oxford Blue oder Ghost.

Dark mode

CTA wechselt zu Madder Rose (#F0A4B0) wärmer, AAA auf Ink Black.

cta.css
/* CTA = the ONE most important action on a screen */
.btn-cta { background: var(--cta-bg); color: var(--cta-fg); }

:root              { --cta-bg: #a6112f; --cta-fg: #f5f7f3; }   /* Madder      */
[data-theme="dark"]{ --cta-bg: #f0a4b0; --cta-fg: #0d0d1a; }   /* Madder Rose */
17 COMPONENTS

Badges & Tags

Pillenförmige Chips für Metadaten und Status. Standard-, Outline- und Solid-Varianten; die Warn-Variante verwendet Madder und ist selten.

DefaultFestpreisQ3 20262 WochenWorkshop
OutlineRemoteBerlinFestpreis möglich
SolidVerfügbarNeu
StatusVerfügbar ab MaiWenig KapazitätWarnung
badges.css
.pill {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 11px;
  border-radius: var(--radius-pill);
  font: 600 11px/1.3 var(--font-body);
  background: color-mix(in oklch, var(--color-oxford-blue) 7%, transparent);
  color: var(--color-oxford-blue);
}
.pill.outline { background: transparent; border: 1px solid var(--border-strong); }
.pill.solid   { background: var(--color-oxford-blue); color: var(--color-baby-powder); }
.pill.warn    { background: var(--color-madder); color: var(--color-baby-powder); }
.pill.dot::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
18 COMPONENTS

Formularfelder

Ruhige Felder auf erhöhter Oberfläche. Fokus zeichnet einen 1px Oxford-Rahmen plus einen weichen Madder-getönten Ring; Fehler färben den Rahmen Madder.

Bitte einen Bereich angeben (z. B. 5–15k €).
forms.css
input, textarea, select {
  font: 400 14px/1.4 var(--font-body);
  background: var(--bg-elevated);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  padding: 10px 12px;
}
input:focus, textarea:focus, select:focus {
  border-color: var(--color-oxford-blue);
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-madder) 18%, transparent);
}
.field.err input { border-color: var(--color-madder); }
19 COMPONENTS

Service Cards

Eine erhöhte weiße Oberfläche, ein 1px Haarlinie-Rahmen, ein Remix-Linien-Icon und ein Serif-Titel. Lift beim Hover über Schatten — niemals ein farbiger Linksrand-Akzent, niemals eine Skalierung.

Projekt-Übernahme

Wenn das Team raus ist oder das Projekt stockt ich steige sauber ein und führe es zu Ende.

Ab 2 Wochen· Festpreis möglich

Roadmap & Timing

Realistische Zeitpläne mit echten Puffern. Keine Phantasie-Sprints.

Workshop· 2 Tage

Schnittstelle Kund:in ↔ Dev

Ich übersetze in beide Richtungen für Entwickler:innen und Auftraggeber:innen.

Laufend· Tagessatz

Audit & Risiko

Ehrliche Zweitmeinung zu Stand, Architektur und Vertragslage. Schriftlich, in 5 Tagen.

Festpreis· ab 2.400 €
cards.css
.card {
  background: var(--bg-elevated);
  border: 1px solid var(--border);     /* 1px hairline no colored accent */
  border-radius: var(--radius-md);
  padding: 22px;
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--duration-base) var(--ease-standard);
}
.card:hover { box-shadow: var(--shadow-md); }   /* lift on hover, never scale */
.card h3 { font: var(--h3); }                    /* Cormorant Garamond */
.card p  { font: var(--body); color: var(--fg-muted); }
20 COMPONENTS

Ladeanimation

Reiner CSS-Spinner in zwei Größen. Als Ladeanzeige innerhalb von Buttons oder als Ganzseitenüberlagerung. Verwendet Legacy-Custom-Properties — beim Refactoring auf semantische Token migrieren.

.loader-small
.loader-big
loader.css
/* Loader Styles, if Loader is needed */
.loader-small, .loader-big {
  border-radius: 50%;
  animation: spin 1s linear infinite;
  position: relative;
  margin: auto;
}
.loader-small {
  border: 3px solid var(--white);
  border-top: 3px solid var(--darkblue);
  width: 20px;
  height: 20px;
  margin-right: 5px;
}
.loader-big {
  border: 8px solid var(--white);
  border-top: 8px solid var(--darkblue);
  width: 60px;
  height: 60px;
  margin-top: 40px;
}
@keyframes spin {
  0%   { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
22 SPACE & SURFACE

Abstands-Skala

Eine 4-px-Basis, modulare Skala. Marketing-Oberflächen atmen mit 96–128 px zwischen Blöcken; Lesemaß cap bei 65ch.

--space-14 px
--space-28 px
--space-312 px
--space-416 px
--space-524 px
--space-632 px
--space-748 px
--space-864 px
--space-996 px
--space-10128 px
spacing.css
:root {                 /* 4px base, modular */
  --space-1:  0.25rem;  /*   4 */
  --space-2:  0.5rem;   /*   8 */
  --space-3:  0.75rem;  /*  12 */
  --space-4:  1rem;     /*  16 */
  --space-5:  1.5rem;   /*  24 */
  --space-6:  2rem;     /*  32 */
  --space-7:  3rem;     /*  48 */
  --space-8:  4rem;     /*  64 */
  --space-9:  6rem;     /*  96 */
  --space-10: 8rem;     /* 128 */
}
23 SPACE & SURFACE

Radien & Schatten

Zurückhaltende Radien halten die Dinge geerdet; Pills sind Chips und Avataren vorbehalten. Schatten sind mit Oxford Blue getönt — niemals das Browser-Standard-Grau.

Radii

--radius-xs
2 px
--radius-sm
4 px
--radius-md
8 px
--radius-lg
14 px

Shadows Oxford-tinted

shadow-xs
hairline
shadow-sm
card resting
shadow-md
card hover
shadow-lg
overlay
radii-shadows.css
:root {
  --radius-xs: 2px;
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 14px;
  --radius-pill: 999px;            /* chips + avatars only */
  /* Oxford-tinted, low-saturation never the default grey drop */
  --shadow-xs: 0 1px 2px 0 rgba(10,17,55,.06);
  --shadow-sm: 0 2px 6px -1px rgba(10,17,55,.08), 0 1px 2px 0 rgba(10,17,55,.04);
  --shadow-md: 0 8px 20px -6px rgba(10,17,55,.14), 0 2px 4px 0 rgba(10,17,55,.06);
  --shadow-lg: 0 20px 40px -12px rgba(10,17,55,.22), 0 4px 8px 0 rgba(10,17,55,.06);
}
24 SONSTIGES

Inhalt jeder Website

Jede Joram-Website folgt dieser Grundstruktur. Die Elemente sind verbindlich, sofern der jeweilige Kontext nichts anderes erfordert.

  • Horizontale Navbar
    • Home-Button: verlinkt auf joram.eu
    • Dark/Light-Toggle: nur und (kein Label)
    • Sprachumschalter: mit Dropdown (Deutsch / English)
    • Alle Buttons: border-radius 4 px (--radius-sm), keine Kreise
    • Inhalt in einem Container (Luft links & rechts)
  • Dark Mode & Light Mode via data-theme auf <html>
  • Deutsch & Englisch (DE / EN)
  • Hero Header (meistens vorhanden)
  • Großzügiges Spacing : luxuriöses Gefühl durch Weißraum
  • Footer mit Impressum & Datenschutzerklärung → joram.eu/imp
  • Nur HTML, CSS & Vanilla JS : kein Framework, kein Build-Schritt
  • Hell- & Dunkel-Modus : Systemeinstellung + manueller Umschalter
  • Barrierefrei : Tastatur, Screenreader, motorische & visuelle Einschränkungen
  • Offline-fähig (Service Worker / PWA)
  • Semantisches HTML mit korrekten ARIA-Labels
  • Standard Deutsch : umschaltbar auf Englisch
  • Mobile-First responsives Design
  • Keine externen Abhängigkeiten : vollständig CDN-frei
  • Sanfte Animationen : beachtet prefers-reduced-motion
navbar.html
<header class="topbar">
  <a class="brandblock" href="#top">…</a>
  <nav class="nav">…</nav>
  <div class="topbar-actions">
    <!-- Home link -->
    <a class="home-btn" href="https://joram.eu/" aria-label="Home">
      <i class="ri-home-3-fill"></i>
    </a>
    <!-- Language switcher -->
    <div class="lang-switcher">
      <button class="lang-toggle" aria-haspopup="true"
              aria-expanded="false">
        <i class="ri-translate-2"></i>
      </button>
      <div class="lang-dropdown">
        <button data-lang="de">Deutsch</button>
        <button data-lang="en">English</button>
      </div>
    </div>
    <!-- Theme toggle: icon only, no label -->
    <button class="theme-toggle" id="themeToggle">
      <i class="ri-moon-line"></i>
    </button>
  </div>
</header>
footer.html
<footer class="site-footer">
  <a href="https://joram.eu/imp" target="_blank"
     rel="noreferrer noopener">Impressum</a>
  <a href="https://joram.eu/imp" target="_blank"
     rel="noreferrer noopener">Datenschutzerklärung</a>
</footer>
25 SONSTIGES

Veraltete Codesnippets

Ältere Snippets zum Nachschlagen. %% müssen nach dem Kopieren entfernt werden sie dienen nur dazu, dass das Kopieren einwandfrei klappt.

dark-mode js
dark-mode.js
document.addEventListener("DOMContentLoaded", function() { const darkModeButton = document.getElementById('dark-mode-button'); darkModeButton.addEventListener('click', function() { // console.log('Dark-Mode-Button is clicked.'); document.body.classList.toggle('dark-mode'); // Toggle button text depending on the mode darkModeButton.innerHTML = document.body.classList.contains('dark-mode') ? `<%%svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="14"><%%path d="M12 18C8.68629 18 6 15.3137 6 12C6 8.68629 8.68629 6 12 6C15.3137 6 18 8.68629 18 12C18 15.3137 15.3137 18 12 18ZM11 1H13V4H11V1ZM11 20H13V23H11V20ZM3.51472 4.92893L4.92893 3.51472L7.05025 5.63604L5.63604 7.05025L3.51472 4.92893ZM16.9497 18.364L18.364 16.9497L20.4853 19.0711L19.0711 20.4853L16.9497 18.364ZM19.0711 3.51472L20.4853 4.92893L18.364 7.05025L16.9497 5.63604L19.0711 3.51472ZM5.63604 16.9497L7.05025 18.364L4.92893 20.4853L3.51472 19.0711L5.63604 16.9497ZM23 11V13H20V11H23ZM4 11V13H1V11H4Z"><%%/path><%%/svg>` : `<%%svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="14"><%%path d="M9.8216 2.23796C9.29417 3.38265 9 4.65697 9 6C9 10.9706 13.0294 15 18 15C19.343 15 20.6174 14.7058 21.762 14.1784C20.7678 18.6537 16.7747 22 12 22C6.47715 22 2 17.5228 2 12C2 7.22532 5.3463 3.23221 9.8216 2.23796ZM18.1642 2.29104L19 2.5V3.5L18.1642 3.70896C17.4476 3.8881 16.8881 4.4476 16.709 5.16417L16.5 6H15.5L15.291 5.16417C15.1119 4.4476 14.5524 3.8881 13.8358 3.70896L13 3.5V2.5L13.8358 2.29104C14.5524 2.1119 15.1119 1.5524 15.291 0.835829L15.5 0H16.5L16.709 0.835829C16.8881 1.5524 17.4476 2.1119 18.1642 2.29104ZM23.1642 7.29104L24 7.5V8.5L23.1642 8.70896C22.4476 8.8881 21.8881 9.4476 21.709 10.1642L21.5 11H20.5L20.291 10.1642C20.1119 9.4476 19.5524 8.8881 18.8358 8.70896L18 8.5V7.5L18.8358 7.29104C19.5524 7.1119 20.1119 6.5524 20.291 5.83583L20.5 5H21.5L21.709 5.83583C21.8881 6.5524 22.4476 7.1119 23.1642 7.29104Z"><%%/path><%%/svg>`; }); // Check and toggle dark mode based on user preference const prefersDarkScheme = window.matchMedia("(prefers-color-scheme: dark)").matches; if (prefersDarkScheme) { document.body.classList.toggle('dark-mode', true); // console.log('Dark-mode preference is checked.'); darkModeButton.innerHTML = `<%%svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="14"><%%path d="M12 18C8.68629 18 6 15.3137 6 12C6 8.68629 8.68629 6 12 6C15.3137 6 18 8.68629 18 12C18 15.3137 15.3137 18 12 18ZM11 1H13V4H11V1ZM11 20H13V23H11V20ZM3.51472 4.92893L4.92893 3.51472L7.05025 5.63604L5.63604 7.05025L3.51472 4.92893ZM16.9497 18.364L18.364 16.9497L20.4853 19.0711L19.0711 20.4853L16.9497 18.364ZM19.0711 3.51472L20.4853 4.92893L18.364 7.05025L16.9497 5.63604L19.0711 3.51472ZM5.63604 16.9497L7.05025 18.364L4.92893 20.4853L3.51472 19.0711L5.63604 16.9497ZM23 11V13H20V11H23ZM4 11V13H1V11H4Z"><%%/path><%%/svg>`; // Set initial button text for dark mode } }); // add a html button with id dark-mode-button // css: body .dark-mode {background-color: var(--dark); color: var(--white);}
root incl. dark-mode
root.css
:root, * {
  color-scheme: light dark;
  --darkblue: #0a1137;
  --blue: var(--darkblue);
  --white: #f5f7f3;
  --darkred: #A6112F;
  --red: var(--darkred);
  --lightblue: #aca6bb;
  --lightgrey: var(--lightblue);
  --lightgray: var(--lightgrey);
  --bordercolor: var(--lightgrey);
  --gray: var(--lightgrey);
  --grey: var(--lightgrey);
  --dark: #1b1820;
  --lightdark: var(--dark);
  --font-family--nunito: 'Nunito','NunitoSans',sans-serif;
  --font-family--cormorant-garamond: 'CormorantGaramond', serif;
  font-size: 1.2rem;
  line-height: 1.4;
  font-weight: 300
}
body {
  background-color: var(--white);
  color: var(--darkblue);
  font-family: var(--font-family--nunito);
}
body.dark-mode {
  background-color: var(--dark);
  color: var(--white);
}
.dark-mode svg { fill: var(--white); }
svg { fill: var(--darkblue); }
strong, b { font-weight: 600; }
h1,h2,h3,h4,h5,h6 {
  font-family: var(--font-family--cormorant-garamond);
  font-weight: 800;
}
Favicon
favicon.html
<%%link rel="icon" type="image/png" href="../img/favicon-96x96.png" sizes="96x96" />
<%%link rel="icon" type="image/svg+xml" href="../img/favicon.svg" />
<%%link rel="shortcut icon" href="../img/favicon.ico" />
<%%link rel="apple-touch-icon" sizes="180x180" href="../img/apple-touch-icon.png" />
<%%meta name="apple-mobile-web-app-title" content="Joram" />
<%%link rel="manifest" href="../img/site.webmanifest" />
button
button.css
.button {
  margin-left: 10px;
  padding: 5px 10px;
  border-radius: 5px;
  cursor: pointer;
  background-color: var(--white);
  color: var(--darkblue);
  border: 1px solid var(--bordercolor);
  transition: background-color 0.3s, color 0.3s;
  align-self: stretch;
  font-size: 0.7rem;
}
.button:hover { background-color: var(--darkblue); color: var(--white); }
.button:hover svg { fill: var(--white); }
.button svg { fill: var(--darkblue); padding-top: 4px; }
.dark-mode .button:hover svg { fill: var(--darkblue); }
.dark-mode .button svg { fill: var(--white); }
.dark-mode .button { background-color: var(--lightdark); color: var(--white); }
.dark-mode .button:hover { background-color: var(--white); color: var(--darkblue); }
menuButton
menuButton.html
<%%div id="menuButtonContainer"><%%/div>
<%%script src="../floatingMenuButton/app.js"><%%/script>
<%%script>
fetch('../floatingMenuButton/menu.html')
  .then(response => response.text())
  .then(html => {
    document.getElementById('menuButtonContainer').innerHTML = html;
    if (typeof initMenuButton == 'function') {
      initMenuButton();
    }
  });
<%%/script>