/* ==================================================================
   Digitale Visitenkarte — Glass-Design mit Themes
   Theme umschalten:  <html data-theme="rose|green|dark">
   bzw. über die Umgebungsvariable CARD_THEME.
   Jedes Theme setzt nur Variablen — das Layout bleibt identisch.
   ================================================================== */

:root,
[data-theme="dark"] {
  color-scheme: dark;

  --bg: #07080d;
  --card-bg: linear-gradient(165deg,
      rgba(255, 255, 255, 0.09) 0%,
      rgba(255, 255, 255, 0.035) 40%,
      rgba(255, 255, 255, 0.02) 100%);
  --surface: rgba(255, 255, 255, 0.045);
  --surface-hover: rgba(255, 255, 255, 0.085);
  --ico-bg: rgba(255, 255, 255, 0.07);
  --border: rgba(255, 255, 255, 0.10);
  --border-strong: rgba(255, 255, 255, 0.18);
  --inner-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.14);
  --glow: rgba(255, 255, 255, 0.16);

  --text: #f4f6fb;
  --text-dim: #a7aec1;
  --text-faint: #6f7788;

  --accent: #7c9cff;
  --accent-2: #62e6d3;
  --accent-3: #b57cff;

  --btn-fg: #0a0b11;
  --btn-shadow: 0 10px 30px -10px rgba(124, 156, 255, 0.7);
  --shadow: 0 40px 80px -20px rgba(0, 0, 0, 0.75);

  --dot: var(--accent-2);
  --dot-ring: #0b0d14;
  --toast-bg: rgba(20, 22, 30, 0.9);

  --blob-opacity: 0.5;
  --blob-opacity-3: 0.32;
  --grain-opacity: 0.035;
}

/* ---------- Rosé: hell, weiß, warm ---------- */
[data-theme="rose"] {
  color-scheme: light;

  --bg: #fdf6f7;
  --card-bg: linear-gradient(165deg,
      rgba(255, 255, 255, 0.82) 0%,
      rgba(255, 255, 255, 0.62) 45%,
      rgba(255, 255, 255, 0.52) 100%);
  --surface: rgba(255, 255, 255, 0.62);
  --surface-hover: rgba(255, 255, 255, 0.92);
  --ico-bg: rgba(224, 122, 150, 0.10);
  --border: rgba(74, 42, 54, 0.09);
  --border-strong: rgba(74, 42, 54, 0.18);
  --inner-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.85);
  --glow: rgba(255, 255, 255, 0.75);

  --text: #2c2026;
  --text-dim: #6d5b64;
  --text-faint: #a08d97;

  --accent: #e07a96;
  --accent-2: #f0a186;
  --accent-3: #c98bd4;

  --btn-fg: #fff;
  --btn-shadow: 0 12px 28px -12px rgba(224, 122, 150, 0.75);
  --shadow: 0 40px 70px -28px rgba(150, 80, 100, 0.35);

  --dot: #3fbf87;
  --dot-ring: #fdf6f7;
  --toast-bg: rgba(255, 255, 255, 0.94);

  --blob-opacity: 0.6;
  --blob-opacity-3: 0.4;
  --grain-opacity: 0.02;
}

/* ---------- Green: hell, weiß, frisch ---------- */
[data-theme="green"] {
  color-scheme: light;

  --bg: #f4faf6;
  --card-bg: linear-gradient(165deg,
      rgba(255, 255, 255, 0.82) 0%,
      rgba(255, 255, 255, 0.62) 45%,
      rgba(255, 255, 255, 0.52) 100%);
  --surface: rgba(255, 255, 255, 0.62);
  --surface-hover: rgba(255, 255, 255, 0.92);
  --ico-bg: rgba(31, 148, 106, 0.10);
  --border: rgba(22, 56, 42, 0.09);
  --border-strong: rgba(22, 56, 42, 0.18);
  --inner-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.85);
  --glow: rgba(255, 255, 255, 0.75);

  --text: #1d2a24;
  --text-dim: #57685f;
  --text-faint: #8ea096;

  --accent: #2b9d74;
  --accent-2: #7cc95f;
  --accent-3: #35b4b8;

  --btn-fg: #fff;
  --btn-shadow: 0 12px 28px -12px rgba(43, 157, 116, 0.7);
  --shadow: 0 40px 70px -28px rgba(40, 110, 85, 0.3);

  --dot: #2b9d74;
  --dot-ring: #f4faf6;
  --toast-bg: rgba(255, 255, 255, 0.94);

  --blob-opacity: 0.55;
  --blob-opacity-3: 0.38;
  --grain-opacity: 0.02;
}

/* ---------- Grundwerte ---------- */

:root {
  --radius-card: 28px;
  --radius-row: 16px;
  --font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
    "Helvetica Neue", Arial, sans-serif;
}

* { box-sizing: border-box; }

/* WICHTIG: Das hidden-Attribut ist die einzige Art, wie card.js Elemente
   ein- und ausblendet (Foto, Teilen-Button, QR-Button, QR-Overlay).
   Ohne diese Regel gewinnt jede eigene display-Angabe (display:grid,
   display:block, .btn{display:inline-flex} …) gegen das Browser-Default
   und das Element bleibt sichtbar bzw. fängt – unsichtbar, weil opacity:0 –
   sämtliche Klicks ab. Genau eine Zeile, dafür überall gültig. */
[hidden] { display: none !important; }

html, body { height: 100%; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

/* ---------- animierter Hintergrund ---------- */

.bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}

.blob {
  position: absolute;
  display: block;
  border-radius: 50%;
  filter: blur(90px);
  opacity: var(--blob-opacity);
  will-change: transform;
}

.blob-a {
  width: 46vmax; height: 46vmax;
  background: radial-gradient(circle at 30% 30%, var(--accent), transparent 65%);
  top: -14vmax; left: -10vmax;
  animation: drift-a 26s ease-in-out infinite alternate;
}

.blob-b {
  width: 40vmax; height: 40vmax;
  background: radial-gradient(circle at 60% 40%, var(--accent-3), transparent 65%);
  bottom: -16vmax; right: -12vmax;
  animation: drift-b 32s ease-in-out infinite alternate;
}

.blob-c {
  width: 34vmax; height: 34vmax;
  background: radial-gradient(circle at 50% 50%, var(--accent-2), transparent 65%);
  top: 45%; left: 55%;
  opacity: var(--blob-opacity-3);
  animation: drift-c 38s ease-in-out infinite alternate;
}

@keyframes drift-a {
  from { transform: translate3d(0, 0, 0) scale(1); }
  to   { transform: translate3d(8vmax, 6vmax, 0) scale(1.15); }
}
@keyframes drift-b {
  from { transform: translate3d(0, 0, 0) scale(1.1); }
  to   { transform: translate3d(-9vmax, -5vmax, 0) scale(0.95); }
}
@keyframes drift-c {
  from { transform: translate3d(-4vmax, 2vmax, 0) scale(0.9); }
  to   { transform: translate3d(5vmax, -7vmax, 0) scale(1.2); }
}

/* feines Rauschen gegen Farbbanding */
.grain {
  position: absolute;
  inset: -50%;
  opacity: var(--grain-opacity);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* ---------- Layout ---------- */

.stage {
  position: relative;
  z-index: 1;
  min-height: 100%;
  min-height: 100dvh;
  display: grid;
  place-items: center;
  padding: clamp(16px, 4vw, 48px);
  padding-bottom: max(clamp(16px, 4vw, 48px), env(safe-area-inset-bottom));
}

.card {
  position: relative;
  width: min(420px, 100%);
  padding: clamp(28px, 5vw, 40px) clamp(20px, 4.5vw, 32px) 24px;
  border-radius: var(--radius-card);
  border: 1px solid var(--border);
  background: var(--card-bg);
  backdrop-filter: blur(28px) saturate(160%);
  -webkit-backdrop-filter: blur(28px) saturate(160%);
  box-shadow: var(--shadow), var(--inner-highlight);
  text-align: center;
  animation: rise 0.7s cubic-bezier(0.22, 1, 0.36, 1) both;
}

@keyframes rise {
  from { opacity: 0; transform: translateY(22px) scale(0.98); }
  to   { opacity: 1; transform: none; }
}

.card-glow {
  position: absolute;
  inset: -1px -1px auto;
  height: 140px;
  border-radius: var(--radius-card) var(--radius-card) 0 0;
  background: radial-gradient(80% 100% at 50% 0%, var(--glow), transparent 70%);
  pointer-events: none;
}

/* ---------- Kopfbereich ---------- */

.identity { position: relative; }

.avatar {
  position: relative;
  width: 128px;
  height: 128px;
  margin: 0 auto 20px;
}

.avatar img {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  object-fit: cover;
  display: block;
  background: var(--surface);
}

/* Ersatz für ein fehlendes Foto: Initialen im Akzentverlauf */
.avatar-fallback {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: linear-gradient(135deg, var(--accent), var(--accent-3));
  color: var(--btn-fg);
  font-size: 42px;
  font-weight: 600;
  letter-spacing: 0.02em;
  user-select: none;
}

.avatar-ring {
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  padding: 2px;
  background: conic-gradient(
    from 180deg,
    var(--accent),
    var(--accent-2),
    var(--accent-3),
    var(--accent)
  );
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  animation: spin 14s linear infinite;
  opacity: 0.9;
}

@keyframes spin { to { transform: rotate(360deg); } }

.status-dot {
  position: absolute;
  right: 6px;
  bottom: 6px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--dot);
  border: 3px solid var(--dot-ring);
  display: none;
}
.status-dot.on { display: block; }

h1 {
  margin: 0;
  font-size: clamp(24px, 6vw, 30px);
  font-weight: 650;
  letter-spacing: -0.02em;
  line-height: 1.15;
  overflow-wrap: anywhere;
}

.role, .tagline, .location { overflow-wrap: anywhere; }

.role {
  margin: 8px 0 0;
  font-size: 15px;
  font-weight: 500;
  color: var(--text-dim);
}

.role .at { color: var(--text-faint); font-weight: 400; }

.tagline {
  margin: 14px auto 0;
  max-width: 30ch;
  font-size: 14px;
  line-height: 1.55;
  color: var(--text-dim);
}
.tagline:empty { display: none; }

.location {
  margin: 12px 0 0;
  font-size: 13px;
  color: var(--text-faint);
}
.location:empty { display: none; }

/* ---------- Kontaktzeilen ---------- */

.links {
  margin: 28px 0 0;
  display: grid;
  gap: 8px;
}

.row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  border-radius: var(--radius-row);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text);
  text-decoration: none;
  text-align: left;
  font: inherit;
  font-size: 14px;
  cursor: pointer;
  transition: background 0.2s ease, border-color 0.2s ease, transform 0.2s ease;
}

.row:hover,
.row:focus-visible {
  background: var(--surface-hover);
  border-color: var(--border-strong);
  transform: translateY(-1px);
}

.row .ico {
  width: 34px;
  height: 34px;
  flex: 0 0 34px;
  display: grid;
  place-items: center;
  border-radius: 10px;
  background: var(--ico-bg);
  border: 1px solid var(--border);
}

.row .ico svg {
  width: 17px;
  height: 17px;
  fill: none;
  stroke: var(--text);
  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
  opacity: 0.9;
}

.row .ico svg.solid { fill: var(--text); stroke: none; opacity: 0.85; }

/* min-width:0 + overflow:hidden sind nötig, damit ein einzelnes langes Wort
   (z. B. eine LinkedIn-Vanity-URL) das Flex-Element nicht aufbläht */
.row .meta { min-width: 0; flex: 1 1 auto; overflow: hidden; }

.row .label {
  display: block;
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin-bottom: 2px;
}

.row .value {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text);
}

.row .chev {
  width: 16px;
  height: 16px;
  flex: 0 0 16px;
  fill: none;
  stroke: var(--text-faint);
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform 0.2s ease, stroke 0.2s ease;
}
.row:hover .chev { transform: translateX(3px); stroke: var(--text); }

/* ---------- Buttons ---------- */

.actions {
  margin-top: 22px;
  display: grid;
  gap: 10px;
  grid-template-columns: 1fr;
}
.actions:has(#shareBtn:not([hidden])) { grid-template-columns: 1fr auto; }

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  padding: 14px 20px;
  border-radius: 14px;
  font: inherit;
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
  border: 1px solid transparent;
  transition: transform 0.15s ease, filter 0.2s ease, background 0.2s ease;
}

.btn svg {
  width: 18px; height: 18px;
  fill: none; stroke: currentColor;
  stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round;
}

.btn:active { transform: scale(0.98); }

.btn-primary {
  background: linear-gradient(135deg, var(--accent), var(--accent-3));
  color: var(--btn-fg);
  box-shadow: var(--btn-shadow);
}
.btn-primary:hover { filter: brightness(1.08); }

.btn-ghost {
  background: var(--surface);
  border-color: var(--border);
  color: var(--text);
}
.btn-ghost:hover { background: var(--surface-hover); border-color: var(--border-strong); }

/* ---------- Fußzeile + Toast ---------- */

.foot {
  margin-top: 20px;
  font-size: 12px;
  color: var(--text-faint);
}
.foot:has(span:empty) { display: none; }

.toast {
  position: fixed;
  left: 50%;
  bottom: 28px;
  z-index: 10;
  transform: translate(-50%, 24px);
  padding: 11px 18px;
  border-radius: 999px;
  background: var(--toast-bg);
  border: 1px solid var(--border-strong);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  font-size: 14px;
  color: var(--text);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.25s ease, transform 0.25s ease;
}
.toast.show { opacity: 1; transform: translate(-50%, 0); }

/* ---------- QR-Overlay ---------- */

.qr-overlay {
  position: fixed;
  inset: 0;
  z-index: 20;
  display: grid;
  place-items: center;
  padding: 24px;
}
/* Zweite Sicherung: solange nicht offen, nimmt das Overlay keine Klicks an –
   auch dann nicht, wenn das hidden-Attribut mal nicht gesetzt sein sollte. */
.qr-overlay:not(.show) { pointer-events: none; }
.qr-overlay.show { pointer-events: auto; }
.qr-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(4, 5, 10, 0.62);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  opacity: 0;
  transition: opacity 0.2s ease;
}
.qr-overlay.show .qr-backdrop { opacity: 1; }

.qr-dialog {
  position: relative;
  z-index: 1;
  width: min(340px, 100%);
  padding: 26px 26px 22px;
  border-radius: 22px;
  background: var(--card-bg);
  border: 1px solid var(--border-strong);
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45);
  backdrop-filter: blur(28px) saturate(160%);
  -webkit-backdrop-filter: blur(28px) saturate(160%);
  text-align: center;
  transform: scale(0.94) translateY(8px);
  opacity: 0;
  transition: transform 0.22s cubic-bezier(0.2, 0.8, 0.3, 1), opacity 0.22s ease;
}
.qr-overlay.show .qr-dialog { transform: scale(1) translateY(0); opacity: 1; }

.qr-close {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: var(--text-faint);
  cursor: pointer;
  transition: background 0.18s ease, color 0.18s ease;
}
.qr-close:hover { background: var(--border-strong); color: var(--text); }
.qr-close svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; }

.qr-title {
  margin: 0 0 16px;
  font-size: 17px;
  font-weight: 600;
  color: var(--text);
}
.qr-code {
  width: 232px;
  height: 232px;
  margin: 0 auto;
  padding: 14px;
  box-sizing: border-box;
  border-radius: 16px;
  background: #fff;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
}
.qr-code svg { width: 100%; height: 100%; display: block; }
.qr-hint {
  margin: 16px 0 0;
  font-size: 13px;
  color: var(--text-dim);
}

/* ---------- Fokus + Motion ---------- */

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}

@media print {
  .bg, .actions, .toast { display: none !important; }
  body { background: #fff; color: #000; }
  .card { border: 1px solid #ddd; box-shadow: none; backdrop-filter: none; background: #fff; }
  .row, .role, .tagline, .location, .foot { color: #333; }
}
