/* Animated Hotspots — Public-Viewer DOM-Layer.
   Spiegelt die styles aus
     frontend/src/components/viewer/hotspots-animated/MarkerTextOverlay.tsx (styled-jsx)
   Tokens kommen aus viewer-tokens.css (--vp-hs-*). */

.vp-hs-overlay {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 1;
}
.vp-hs-overlay > * { pointer-events: auto; }

/* ── ICON Anchor + Heroicons-i + Hover-Card ──────────────────────── */
.vp-hs-info-anchor {
    --s: var(--vp-hs-scale, 1);
    position: absolute;
    left: 0;
    top: 0;
    width: calc(44px * var(--s));
    height: calc(44px * var(--s));
    pointer-events: auto;
    cursor: pointer;
    will-change: transform, opacity;
}
/* Zentrierung ueber inset+margin statt transform: das transform des
   Piktogramms gehoert den Bewegungsmustern (markerMotion.ts). Bei fester
   Groesse ist margin:auto pixelgleich zum frueheren translate(-50%,-50%). */
.vp-hs-info-glyph {
    position: absolute;
    inset: 0;
    margin: auto;
    width: calc(33px * var(--s));
    height: calc(33px * var(--s));
    color: var(--vp-hs-ink);
    pointer-events: none;
    z-index: 1;
}
/* Frei gewaehltes Piktogramm: exakt dieselbe Box wie das Standard-Glyph, damit
   Hit-Area und Card-Abstand unveraendert bleiben. `contain` verhindert
   Verzerrung; die Farbe kommt aus der Datei, nicht aus --vp-hs-ink. */
img.vp-hs-info-glyph {
    object-fit: contain;
}
/* PLAIN — die schlichte Form: der Shader zeichnet keine Scheibe, das
   Piktogramm steht frei im Panorama. Ohne dunkle Flaeche darunter faellt die
   Lesbarkeit auf den Bildinhalt zurueck; ein helles Symbol vor heller Wand
   verschwindet. Deshalb ein weicher Schlagschatten statt einer Scheibe — er
   kostet keine sichtbare Flaeche und traegt jedes Icon, auch farbige. Der
   Glyph wird etwas groesser, weil ihn kein Scheibenrand mehr begrenzt und die
   Trefferflaeche (44px) gleich bleibt. */
.vp-hs-plain .vp-hs-info-glyph {
    width: calc(38px * var(--s));
    height: calc(38px * var(--s));
    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55))
            drop-shadow(0 0 6px rgba(0, 0, 0, 0.35));
}
.vp-hs-info-card {
    position: absolute;
    left: 50%;
    bottom: calc(100% + 14px);
    transform: translateX(-50%) translateY(8px);
    transform-origin: bottom center;
    width: 236px;
    background: var(--vp-hs-glass-strong);
    -webkit-backdrop-filter: var(--vp-hs-blur);
    backdrop-filter: var(--vp-hs-blur);
    border: 1px solid var(--vp-hs-glass-line);
    border-radius: 14px;
    box-shadow: var(--vp-hs-sh);
    padding: 14px 16px;
    opacity: 0;
    pointer-events: none;
    transition: 0.26s cubic-bezier(0.2, 0.8, 0.2, 1);
    z-index: 2;
}
.vp-hs-info-anchor:hover .vp-hs-info-card {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}
.vp-hs-info-card::after {
    content: "";
    position: absolute;
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    width: 18px;
    height: 9px;
    margin-top: -1px;
    background: #171c28;
    clip-path: polygon(0 0, 100% 0, 50% 100%);
}
:root.vp-light .vp-hs-info-card::after,
.vp-light .vp-hs-info-card::after,
body.light .vp-hs-info-card::after {
    background: #f7f9fb;
}
.vp-hs-info-card .eye {
    font-family: "JetBrains Mono", ui-monospace, monospace;
    font-size: 9px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--vp-hs-ink-dim);
    margin: 0;
}
.vp-hs-info-card h4 {
    margin: 4px 0 5px;
    font-family: "Onest", system-ui, sans-serif;
    font-weight: 600;
    font-size: 15px;
    color: var(--vp-hs-ink);
    letter-spacing: -0.01em;
    line-height: 1.2;
}
.vp-hs-info-card p {
    margin: 0;
    font-size: 12px;
    line-height: 1.5;
    color: var(--vp-hs-ink-dim);
}

/* ── Expanded ICON-Card (click-mode, smart-placement) ────────────── */
.vp-hs-info-expanded {
    position: absolute;
    width: 400px;
    background: var(--vp-hs-glass-strong);
    -webkit-backdrop-filter: var(--vp-hs-blur);
    backdrop-filter: var(--vp-hs-blur);
    border: 1px solid var(--vp-hs-glass-line);
    border-radius: 16px;
    box-shadow: var(--vp-hs-sh);
    padding: 18px 20px 20px;
    pointer-events: auto;
    cursor: default;
    z-index: 10;
    color: var(--vp-hs-ink);
    animation: vp-hs-expand-in 0.22s cubic-bezier(0.2, 0.8, 0.2, 1);
}
@keyframes vp-hs-expand-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
.vp-hs-info-expanded[data-arrow-side="left"]::before {
    content: "";
    position: absolute;
    top: var(--arrow-y, 50%);
    left: 0;
    transform: translate(-100%, -50%);
    width: 11px;
    height: 22px;
    margin-left: 1px;
    background: var(--vp-hs-glass-strong);
    clip-path: polygon(100% 0, 100% 100%, 0 50%);
}
.vp-hs-info-expanded[data-arrow-side="right"]::before {
    content: "";
    position: absolute;
    top: var(--arrow-y, 50%);
    right: 0;
    transform: translate(100%, -50%);
    width: 11px;
    height: 22px;
    margin-right: 1px;
    background: var(--vp-hs-glass-strong);
    clip-path: polygon(0 0, 0 100%, 100% 50%);
}
.vp-hs-info-expanded .close {
    position: absolute;
    top: 12px;
    right: 12px;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: rgba(255,255,255,0.06);
    border: 1px solid var(--vp-hs-glass-line);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--vp-hs-ink);
    transition: background 0.15s;
    padding: 0;
}
:root.vp-light .vp-hs-info-expanded .close,
.vp-light .vp-hs-info-expanded .close,
body.light .vp-hs-info-expanded .close {
    background: rgba(0,0,0,0.04);
}
.vp-hs-info-expanded .close:hover { background: rgba(255,255,255,0.13); }
:root.vp-light .vp-hs-info-expanded .close:hover,
.vp-light .vp-hs-info-expanded .close:hover,
body.light .vp-hs-info-expanded .close:hover { background: rgba(0,0,0,0.08); }
.vp-hs-info-expanded .media {
    display: block;
    width: 100%;
    height: 200px;
    object-fit: cover;
    border-radius: 10px;
    margin-bottom: 14px;
    background: rgba(0,0,0,0.20);
}
.vp-hs-info-expanded video.media { background: #000; }
.vp-hs-info-expanded .eye {
    font-family: "JetBrains Mono", ui-monospace, monospace;
    font-size: 10px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--vp-hs-ink-dim);
    margin: 0;
}
.vp-hs-info-expanded h3 {
    margin: 6px 0 8px;
    font-family: "Onest", system-ui, sans-serif;
    font-weight: 600;
    font-size: 18px;
    color: var(--vp-hs-ink);
    letter-spacing: -0.01em;
    line-height: 1.25;
    padding-right: 36px;
}
.vp-hs-info-expanded p {
    margin: 0;
    font-size: 13px;
    line-height: 1.6;
    color: var(--vp-hs-ink-dim);
    white-space: pre-wrap;
}
/* Audio und Link gehoerten bisher nur zum alten #infoPanel. Ohne sie waere die
   Vereinheitlichung auf diese Karte ein Datenverlust. */
.vp-hs-info-expanded audio.media-audio {
    display: block;
    width: 100%;
    margin-top: 14px;
}
.vp-hs-info-expanded .link {
    display: inline-flex;
    align-items: center;
    margin-top: 14px;
    padding: 7px 12px;
    border-radius: 8px;
    background: rgba(255,255,255,0.06);
    border: 1px solid var(--vp-hs-glass-line);
    color: var(--vp-hs-ink);
    font-size: 13px;
    text-decoration: none;
    transition: background 0.15s;
}
.vp-hs-info-expanded .link:hover { background: rgba(255,255,255,0.13); }
:root.vp-light .vp-hs-info-expanded .link,
.vp-light .vp-hs-info-expanded .link { background: rgba(0,0,0,0.04); }
:root.vp-light .vp-hs-info-expanded .link:hover,
.vp-light .vp-hs-info-expanded .link:hover { background: rgba(0,0,0,0.08); }

/* ── TAG-Pille (always-on, komplett DOM) ─────────────────────────── */
.vp-hs-tag-pill {
    --s: var(--vp-hs-scale, 1);
    position: absolute;
    left: 0;
    top: 0;
    display: flex;
    align-items: center;
    gap: calc(6px * var(--s));
    padding: calc(6px * var(--s)) calc(12px * var(--s)) calc(6px * var(--s)) calc(8px * var(--s));
    background: var(--vp-hs-glass-strong);
    -webkit-backdrop-filter: var(--vp-hs-blur);
    backdrop-filter: var(--vp-hs-blur);
    border: 1px solid var(--vp-hs-glass-line);
    border-radius: calc(13px * var(--s));
    box-shadow: var(--vp-hs-sh);
    color: var(--vp-hs-ink);
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
    pointer-events: auto;
    will-change: transform, opacity;
    transform-origin: bottom center;
}
.vp-hs-tag-pill .pin {
    position: relative; /* Traeger fuer .vp-hs-motion-ring */
    width: calc(22px * var(--s));
    height: calc(22px * var(--s));
    border-radius: calc(6px * var(--s));
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--vp-hs-glass);
    border: 1px solid var(--vp-hs-glass-line);
}
.vp-hs-tag-pill .pin svg,
.vp-hs-tag-pill .pin img {
    width: calc(13px * var(--s));
    height: calc(13px * var(--s));
}
/* Frei gewaehltes Icon in der Pille: gleiche Box wie der Standard-Pin,
   contain gegen Verzerrung. */
.vp-hs-tag-pill .pin img {
    object-fit: contain;
}
.vp-hs-tag-pill .txt {
    display: flex;
    flex-direction: column;
    line-height: 1.15;
}
.vp-hs-tag-pill .eye {
    font-family: "JetBrains Mono", ui-monospace, monospace;
    font-size: calc(8px * var(--s));
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--vp-hs-ink-dim);
}
.vp-hs-tag-pill .ttl {
    font-family: "Onest", system-ui, sans-serif;
    font-weight: 600;
    font-size: calc(13px * var(--s));
    margin-top: calc(1px * var(--s));
    letter-spacing: -0.01em;
}

/* ══ Hover-Titel an Hotspots ═════════════════════════════════════════════
   Gilt fuer ALLE Marker-Arten, nicht nur die animierten: klassische Marken,
   Flaechen und die animierten Stile teilen sich dieses eine Fenster.
   Das Gegenstueck im Editor steht in
   `frontend/src/components/viewer/three/HotspotTooltip.tsx` — Aenderungen
   hier gehoeren dort ebenfalls hinein, sonst zeigt die Vorschau etwas
   anderes als die fertige Tour.

   Vier Ebenen mit je einer Aufgabe:
     .vp-hs-tip         — die Position am Marker (kein Uebergang, sonst
                          schleppt sich das Fenster beim Drehen hinterher)
     .vp-hs-tip__anchor — das feste Ausrichten (ueber/unter dem Marker)
     .vp-hs-tip__box    — der Kasten: waechst aus der Marke heraus
     .vp-hs-tip__label  — der Text: kommt einen Wimpernschlag spaeter
   Getrennt, damit die Einblendung nie mit der Positionsverfolgung kollidiert.
   Bewegt werden ausschliesslich Transform und Deckkraft — kein Blur (der
   Compositor rechnete ihn sonst pro Bild neu) und keine Groessen. */
.vp-hs-tip {
    position: absolute;
    left: 0;
    top: 0;
    z-index: 9998;
    pointer-events: none;
    opacity: 0;
    --vp-tip-in: 180ms;
    --vp-tip-out: 120ms;
    --vp-tip-stagger: 40ms;
    /* Aufgehen: schnell los, weich aus — ohne Ueberschwingen.
       Zugehen: flach und kurz, es soll wegfallen, nicht zurueckkriechen. */
    --vp-tip-ease-in: cubic-bezier(0.16, 1, 0.3, 1);
    --vp-tip-ease-out: cubic-bezier(0.4, 0, 1, 1);
    --vp-tip-rest-y: 4px;
    --vp-tip-label-y: 3px;
    /* Wachstumspunkt ist die markerseitige Kante — das Fenster kommt damit aus
       der Marke heraus statt daneben zu erscheinen. */
    --vp-tip-origin: bottom center;
}
.vp-hs-tip[data-side="bottom"] {
    --vp-tip-rest-y: -4px;
    --vp-tip-label-y: -3px;
    --vp-tip-origin: top center;
}
/* Eigene Zeichenebene nur solange etwas zu sehen ist. Ein Dauer-Layer fuer ein
   meist unsichtbares Element waere Ballast. */
.vp-hs-tip.is-visible,
.vp-hs-tip.is-closing {
    will-change: transform;
}
.vp-hs-tip__anchor {
    position: absolute;
    left: 0;
    top: 0;
    transform: translate(-50%, -100%);
    pointer-events: none;
}
.vp-hs-tip[data-side="bottom"] .vp-hs-tip__anchor {
    transform: translate(-50%, 0);
}
/* Ruhestellung = Ausgangspunkt des Aufgehens. Ohne Uebergang: hierher kehrt
   das Fenster nur zurueck, wenn es ohnehin schon unsichtbar ist. */
.vp-hs-tip__box {
    display: block;
    max-width: 260px;
    overflow: hidden;
    padding: 7px 11px;
    border-radius: 11px;
    background: var(--vp-hs-glass-strong);
    border: 1px solid var(--vp-hs-glass-line);
    box-shadow: var(--vp-hs-sh);
    -webkit-backdrop-filter: var(--vp-hs-blur);
    backdrop-filter: var(--vp-hs-blur);
    color: var(--vp-hs-ink);
    transform-origin: var(--vp-tip-origin);
    transform: translateY(var(--vp-tip-rest-y)) scale(0.9);
    opacity: 0;
    transition: none;
}
.vp-hs-tip__label {
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-family: "Onest", system-ui, -apple-system, sans-serif;
    font-size: 13px;
    font-weight: 600;
    line-height: 1.25;
    letter-spacing: -0.01em;
    transform: translateY(var(--vp-tip-label-y));
    opacity: 0;
    transition: none;
}
/* ── Aufgehen ── */
.vp-hs-tip.is-visible .vp-hs-tip__box {
    transform: translateY(0) scale(1);
    opacity: 1;
    transition: transform var(--vp-tip-in) var(--vp-tip-ease-in),
                opacity var(--vp-tip-in) var(--vp-tip-ease-in);
    will-change: transform, opacity;
}
/* Der Text kommt einen Wimpernschlag nach dem Kasten. */
.vp-hs-tip.is-visible .vp-hs-tip__label {
    transform: translateY(0);
    opacity: 1;
    transition: transform var(--vp-tip-in) var(--vp-tip-ease-in) var(--vp-tip-stagger),
                opacity var(--vp-tip-in) var(--vp-tip-ease-in) var(--vp-tip-stagger);
    will-change: transform, opacity;
}
/* ── Zugehen ── kein Rueckweg, keine Staffelung: alles faellt gemeinsam weg,
   der Kasten schrumpft nur einen Hauch. */
.vp-hs-tip.is-closing .vp-hs-tip__box {
    transform: translateY(0) scale(0.96);
    opacity: 0;
    transition: transform var(--vp-tip-out) var(--vp-tip-ease-out),
                opacity var(--vp-tip-out) var(--vp-tip-ease-out);
    will-change: transform, opacity;
}
.vp-hs-tip.is-closing .vp-hs-tip__label {
    transform: translateY(0);
    opacity: 0;
    transition: opacity var(--vp-tip-out) var(--vp-tip-ease-out);
}
/* Auf schmalen Bildschirmen darf der Titel nicht die halbe Szene zudecken. */
@media (max-width: 640px) {
    .vp-hs-tip__box {
        max-width: 62vw;
        padding: 6px 10px;
    }
    .vp-hs-tip__label {
        font-size: 12px;
    }
}
/* Ohne Zeigergeraet gibt es kein Ueberfahren — dort bleibt das Fenster aus.
   Zweite Absicherung; die Logik in viewer.js prueft dasselbe. */
@media (hover: none) {
    .vp-hs-tip { display: none; }
}
/* Wer wenig Bewegung will, bekommt nur eine Ueberblendung: keine Skalierung,
   kein Versatz, keine Staffelung. */
@media (prefers-reduced-motion: reduce) {
    .vp-hs-tip__box,
    .vp-hs-tip__label,
    .vp-hs-tip.is-visible .vp-hs-tip__box,
    .vp-hs-tip.is-visible .vp-hs-tip__label,
    .vp-hs-tip.is-closing .vp-hs-tip__box,
    .vp-hs-tip.is-closing .vp-hs-tip__label {
        transform: none;
        transition: opacity 0.1s linear;
    }
}

/* >>> Spiegel von markerMotion.ts / MARKER_MOTION_CSS — nicht von Hand aendern >>> */
/* ══ Bewegungsmuster (hotspot.markerMotion) ═══════════════════════════════
   Quelle: frontend/src/components/viewer/hotspots-animated/markerMotion.ts
   Gespiegelt nach hotspots-animated.css (beide Export-Viewer-Kopien).

   Aufbau: der Marker selbst (.vp-hs-motion) bewegt sich NIE — sein transform
   gehoert der Positionierung. Bewegt werden nur .vp-hs-motion-target (das
   Piktogramm) und die Pseudo-Elemente von .vp-hs-motion-ring. Beide sind
   pointer-events:none, damit die Trefferflaeche unveraendert bleibt.

   Die Animationen laufen nur bei gesetztem [data-motion-run] und haben eine
   endliche Wiederholungszahl (Beruhigung). fill-mode bleibt none: Ruhezustand
   ist immer der Grundstil. */

.vp-hs-motion-ring {
    position: absolute;
    inset: 0;
    border-radius: 50%;
    pointer-events: none;
}
.vp-hs-motion-ring::before,
.vp-hs-motion-ring::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: 50%;
    pointer-events: none;
    opacity: 0;
}
.vp-hs-motion-target {
    transform-origin: 50% 50%;
    pointer-events: none;
}

/* 1 Пульс — auslaufende Ringe */
.vp-hs-motion[data-motion="PULSE"][data-motion-run] .vp-hs-motion-ring::before,
.vp-hs-motion[data-motion="PULSE"][data-motion-run] .vp-hs-motion-ring::after {
    border: 2px solid var(--vp-hs-accent, currentColor);
    animation: vp-hs-mo-pulse 2.4s ease-out 3;
}
.vp-hs-motion[data-motion="PULSE"][data-motion-run] .vp-hs-motion-ring::after {
    animation-delay: 1.2s;
}
@keyframes vp-hs-mo-pulse {
    0%   { transform: scale(0.72); opacity: 0.85; }
    100% { transform: scale(2.30); opacity: 0; }
}

/* 2 Дыхание — ruhiges Atmen */
.vp-hs-motion[data-motion="BREATH"][data-motion-run] .vp-hs-motion-target {
    animation: vp-hs-mo-breath 2.8s cubic-bezier(0.4, 0, 0.6, 1) 2;
}
@keyframes vp-hs-mo-breath {
    0%, 100% { transform: scale(1); }
    50%      { transform: scale(1.12); }
}

/* 3 Шаги — wanderndes Aufhellen.
   Einzelne Symbolteile kann CSS nicht ansprechen (das Piktogramm ist ein
   <img> oder ein fremdes <svg>). Statt dessen wandert die Aufhellung in drei
   Stufen nach unten — dieselbe Aussage, mit jedem der 75 Symbole. */
.vp-hs-motion[data-motion="STEPS"][data-motion-run] .vp-hs-motion-target {
    animation: vp-hs-mo-steps 1.8s ease-in-out 4;
}
@keyframes vp-hs-mo-steps {
    0%   { opacity: 0.45; transform: translateY(-10%); }
    12%  { opacity: 1;    transform: translateY(-10%); }
    33%  { opacity: 0.45; transform: translateY(0); }
    45%  { opacity: 1;    transform: translateY(0); }
    66%  { opacity: 0.45; transform: translateY(10%); }
    78%  { opacity: 1;    transform: translateY(10%); }
    100% { opacity: 0.45; transform: translateY(-10%); }
}

/* 4 Орбита — kreisender Teilring */
.vp-hs-motion[data-motion="ORBIT"][data-motion-run] .vp-hs-motion-ring::before {
    inset: -3px;
    border: 2px solid transparent;
    border-top-color: var(--vp-hs-accent, currentColor);
    animation: vp-hs-mo-orbit 6s linear 1;
}
@keyframes vp-hs-mo-orbit {
    0%   { transform: rotate(0deg);   opacity: 0; }
    8%   { opacity: 0.9; }
    88%  { opacity: 0.9; }
    100% { transform: rotate(360deg); opacity: 0; }
}

/* 5 Тихая точка — sehr dezentes Atmen */
.vp-hs-motion[data-motion="QUIET"][data-motion-run] .vp-hs-motion-target {
    animation: vp-hs-mo-quiet 3.6s ease-in-out 2;
}
@keyframes vp-hs-mo-quiet {
    0%, 100% { opacity: 0.95; transform: scale(1); }
    50%      { opacity: 0.60; transform: scale(1.05); }
}

/* 6 Кольцо — ein Ring, der sich einmal schliesst.
   Ohne @property-Unterstuetzung springt der Fortschritt statt zu laufen; der
   Marker zeigt dann kurz den vollen Ring und blendet ihn aus. Kein Fehlbild,
   nur weniger fein. */
@property --vp-hs-mo-p {
    syntax: "<percentage>";
    inherits: false;
    initial-value: 0%;
}
.vp-hs-motion[data-motion="RING"][data-motion-run] .vp-hs-motion-ring::before {
    inset: -3px;
    background: conic-gradient(var(--vp-hs-accent, currentColor) var(--vp-hs-mo-p), transparent 0);
    -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 2px), #000 calc(100% - 2px));
    mask: radial-gradient(farthest-side, transparent calc(100% - 2px), #000 calc(100% - 2px));
    animation: vp-hs-mo-ring 3.2s ease-in-out 2;
}
@keyframes vp-hs-mo-ring {
    0%   { --vp-hs-mo-p: 0%;   opacity: 0; }
    8%   { opacity: 0.95; }
    72%  { --vp-hs-mo-p: 100%; opacity: 0.95; }
    100% { --vp-hs-mo-p: 100%; opacity: 0; }
}

/* 7 Внимание — kurzes Wippen, dann Ruhe */
.vp-hs-motion[data-motion="NUDGE"][data-motion-run] .vp-hs-motion-target {
    animation: vp-hs-mo-nudge 3.4s ease-in-out 2;
}
@keyframes vp-hs-mo-nudge {
    0%, 4% { transform: rotate(0deg); }
    9%     { transform: rotate(-4deg); }
    14%    { transform: rotate(4deg); }
    19%    { transform: rotate(-3deg); }
    24%    { transform: rotate(0deg); }
    100%   { transform: rotate(0deg); }
}

/* 8 Скольжение — gleitet nach unten durch und beginnt oben neu.
   Der Zyklus endet ABSICHTLICH in der Mitte und nicht unten: sonst spraenge
   das Symbol nach der letzten Wiederholung sichtbar zurueck. */
.vp-hs-motion[data-motion="SLIDE"][data-motion-run] .vp-hs-motion-target {
    animation: vp-hs-mo-slide 2.6s cubic-bezier(0.4, 0, 0.6, 1) 3;
}
@keyframes vp-hs-mo-slide {
    0%   { transform: translateY(0);    opacity: 1; }
    30%  { transform: translateY(45%);  opacity: 0; }
    31%  { transform: translateY(-45%); opacity: 0; }
    60%  { transform: translateY(0);    opacity: 1; }
    100% { transform: translateY(0);    opacity: 1; }
}

/* 9 Появление — faellt einmal ein und federt nach */
.vp-hs-motion[data-motion="DROP"][data-motion-run] .vp-hs-motion-target {
    animation: vp-hs-mo-drop 3s cubic-bezier(0.2, 0.8, 0.2, 1) 2;
}
@keyframes vp-hs-mo-drop {
    0%   { transform: translateY(-55%); opacity: 0; }
    18%  { transform: translateY(0);    opacity: 1; }
    26%  { transform: translateY(-12%); }
    34%  { transform: translateY(0); }
    100% { transform: translateY(0);    opacity: 1; }
}

/* Dauerlauf NUR fuer die Vorschau im Picker — dort waere ein Abklingen nach
   sieben Sekunden keine Vorschau mehr, sondern ein Raetsel. */
.vp-hs-motion--loop .vp-hs-motion-target,
.vp-hs-motion--loop .vp-hs-motion-ring::before,
.vp-hs-motion--loop .vp-hs-motion-ring::after {
    animation-iteration-count: infinite !important;
}

@media (prefers-reduced-motion: reduce) {
    .vp-hs-motion .vp-hs-motion-target,
    .vp-hs-motion .vp-hs-motion-ring::before,
    .vp-hs-motion .vp-hs-motion-ring::after {
        animation: none !important;
    }
}
/* <<< Spiegel von markerMotion.ts <<< */
