Files
entscheidomat/app/globals.css
2026-08-02 00:06:11 +02:00

371 lines
7.9 KiB
CSS
Raw Permalink 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.
@import "tailwindcss";
@theme {
/* Typografie */
--font-sans: var(--font-inter), ui-sans-serif, system-ui, -apple-system, sans-serif;
--font-display: var(--font-cormorant), Georgia, serif;
/* Farben Warmes Porzellan-Papier mit sattem Gelb-Grün / Smaragd */
--color-paper: #faf8f3;
--color-surface: #ffffff;
--color-ink: #111412;
--color-ink-soft: #45504a;
--color-line: #e0eae4;
--color-primary: #111412;
--color-primary-strong: #000000;
--color-primary-soft: #e6f7f0;
/* Glücksspiel & Zufall Gelb-Grün / Smaragdgrün */
--color-emerald-accent: #0d7a57;
--color-emerald-strong: #095c41;
--color-emerald-soft: #e6f7f0;
--color-emerald-line: #b2e5d1;
--color-clay: #b4633f;
--color-clay-soft: #f6eae2;
/* Schatten */
--shadow-soft: 0 2px 4px rgb(17 20 18 / 0.03), 0 12px 36px rgb(17 20 18 / 0.06);
--shadow-lift: 0 4px 12px rgb(17 20 18 / 0.06), 0 24px 52px rgb(17 20 18 / 0.10);
--shadow-cta: 0 12px 28px rgb(17 20 18 / 0.22);
/* Animationen */
--animate-float: float 7s ease-in-out infinite;
--animate-coin-spin: coin-spin 10s linear infinite;
--animate-bob: bob 2.4s ease-in-out infinite;
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-16px);
}
}
@keyframes coin-spin {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(360deg);
}
}
@keyframes bob {
0%,
100% {
transform: translateY(0);
opacity: 0.7;
}
50% {
transform: translateY(6px);
opacity: 1;
}
}
@keyframes stream {
from {
stroke-dashoffset: 1000;
}
to {
stroke-dashoffset: 0;
}
}
@keyframes shootTL {
0% {
transform: translate(0, 0);
opacity: 0;
}
20% {
opacity: 0.7;
}
80% {
opacity: 0.7;
}
100% {
transform: translate(520px, 180px);
opacity: 0;
}
}
@keyframes shootTR {
0% {
transform: translate(0, 0);
opacity: 0;
}
20% {
opacity: 0.7;
}
80% {
opacity: 0.7;
}
100% {
transform: translate(-520px, 190px);
opacity: 0;
}
}
@keyframes shootBL {
0% {
transform: translate(0, 0);
opacity: 0;
}
20% {
opacity: 0.65;
}
80% {
opacity: 0.65;
}
100% {
transform: translate(480px, -170px);
opacity: 0;
}
}
}
/* ---------- Basis ---------- */
html {
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
body {
background: var(--color-paper);
color: var(--color-ink);
font-family: var(--font-sans);
-webkit-font-smoothing: antialiased;
overflow-x: hidden;
}
/* Der Inline-Check im Root-Layout läuft vor der Hydration. Dadurch blitzt der
Preloader bei einem Reload innerhalb derselben Browser-Session nicht auf. */
/* Der Preloader würde auf einem gedrosselten Mobilgerät das LCP-Element
verdecken. Die Seite bleibt dort sofort lesbar; Desktop behält den Effekt. */
@media (max-width: 767px) {
[data-preloader-overlay] {
display: none;
}
}
/* Die Hero-Inhalte sind bereits vor dem Öffnen des Vorhangs im Startzustand.
So kann GSAP sie nicht erst sichtbar machen und anschließend zurücksetzen. */
@media (prefers-reduced-motion: no-preference) {
html[data-preloader="active"] .hero-el {
opacity: 0;
transform: translateY(34px);
}
.reveal {
opacity: 0;
transform: translateY(var(--reveal-y, 30px));
transition:
opacity 0.7s ease var(--reveal-delay, 0s),
transform 0.7s cubic-bezier(0.22, 1, 0.36, 1) var(--reveal-delay, 0s);
}
.reveal--visible {
opacity: 1;
transform: translateY(0);
}
}
::selection {
background: rgb(22 21 19 / 0.12);
}
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
border-radius: 6px;
}
/* Dezente Scrollbar */
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: var(--color-paper);
}
::-webkit-scrollbar-thumb {
background: #d5d0c2;
border-radius: 8px;
border: 2px solid var(--color-paper);
}
::-webkit-scrollbar-thumb:hover {
background: #c1bbab;
}
/* ---------- Hintergrund-Deko ---------- */
.bg-grid {
background-image:
linear-gradient(to right, rgb(32 30 25 / 0.045) 1px, transparent 1px),
linear-gradient(to bottom, rgb(32 30 25 / 0.045) 1px, transparent 1px);
background-size: 46px 46px;
mask-image: radial-gradient(ellipse 90% 65% at 50% 0%, black 25%, transparent 78%);
-webkit-mask-image: radial-gradient(ellipse 90% 65% at 50% 0%, black 25%, transparent 78%);
}
.bg-noise {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
opacity: 0.03;
}
/* ---------- 3D-Münze (gebürstetes Messing, flach) ---------- */
.coin-scene {
perspective: 1100px;
}
.coin {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
will-change: transform;
}
.coin-face {
position: absolute;
inset: 0;
border-radius: 9999px;
display: flex;
align-items: center;
justify-content: center;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.coin-face--front {
transform: translateZ(4px);
background: #dec998;
box-shadow:
inset 0 1px 2px rgb(255 250 235 / 0.5),
inset 0 -2px 4px rgb(120 90 40 / 0.12);
}
.coin-face--back {
background: #d6be87;
box-shadow:
inset 0 1px 2px rgb(255 248 228 / 0.5),
inset 0 -2px 4px rgb(110 82 36 / 0.12);
}
.coin-edge {
position: absolute;
inset: 0;
border-radius: 9999px;
background: #8a6f44;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.coin-engraving {
position: absolute;
inset: 8%;
border-radius: 9999px;
border: 2px solid rgb(122 94 51 / 0.38);
pointer-events: none;
}
.coin-engraving--inner {
inset: 16%;
border-width: 1px;
border-color: rgb(122 94 51 / 0.26);
}
.coin-label {
font-family: var(--font-display);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
color: #6e5533;
text-shadow: 0 1px 0 rgb(255 246 224 / 0.8);
max-width: 78%;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ---------- 3D-Würfel ---------- */
.dice-scene {
perspective: 900px;
}
.dice {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
will-change: transform;
}
.dice-face {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: #fdfcf9;
border: 1px solid var(--color-line);
border-radius: 18%;
box-shadow: inset 0 0 14px rgb(32 30 25 / 0.06);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
overflow: hidden;
padding: 8%;
}
.dice-face-label {
font-family: var(--font-display);
font-weight: 600;
font-size: clamp(9px, 1.6vw, 13px);
line-height: 1.2;
text-align: center;
color: var(--color-ink);
overflow-wrap: anywhere;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* ---------- Magic 8-Ball (warmes Anthrazit, flach) ---------- */
.ball-body {
background: #1d1b17;
box-shadow:
inset 0 -18px 42px rgb(0 0 0 / 0.6),
inset 0 10px 26px rgb(255 255 255 / 0.07),
0 30px 60px rgb(32 30 25 / 0.28);
}
.ball-window {
background: #12130f;
box-shadow:
inset 0 4px 18px rgb(0 0 0 / 0.75),
0 0 0 6px rgb(255 255 255 / 0.05);
}
/* ---------- Diverse ---------- */
.tabular {
font-variant-numeric: tabular-nums;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
appearance: textfield;
}