/**
 * agenic Komponenten-CSS – Button (Atom) — vollständige Übertragung.
 *
 * Figma-Quelle: Set `button` (346:1429, Seite 0.5, 80 Varianten):
 *   Typ = gradient · outline · text                    → Modifier
 *   Farbe = Standard | Inverse                          → --inverse (Kontext)
 *   Größe = L 56 · M 48 · S 40 · XS 34                  → Modifier
 *   Status = Default/Hover/Focus/Disabled               → CSS-States
 *   Icon = Boolean                                      → Partial-Parameter
 * Ergänzung ohne Figma-Entsprechung (Entscheidung Vincent 11.08.2026):
 *   Kontrast = an|aus (High-Contrast)                   → Modifier --kontrast
 *   Abweichung vom Design System, Rückspielpunkt auf 0.8 Sektion 02.
 * Markup-Partial: includes/render-button.php. Konsumenten: ag_button, ag_cta_band.
 * Abstände nutzen die Figma-Spacing-Leiter --spacing-* (Deckungsgleichheit).
 *
 * Kontrakt v1.1 (11.08.2026): Der Typ `gradient simple` ist abgelöst
 * (Entscheidung Vincent „komplex gewinnt" — nur ein Primary live). Seine
 * 16 Figma-Varianten liegen unter `archiv/button--gradient-simple` (2467:1891);
 * gespeicherte Elementor-Werte mappt das Partial auf `gradient`.
 *
 * tmp-Punkte (ehrlich markiert): Größen-Paddings L/S/XS nicht einzeln aus
 * Figma vermessen (M exakt); Disabled-Optik genähert; die Mesh-Fläche ist
 * eine kalibrierte Näherung (RMSE 4,9 % gegen den Figma-Export) — ein
 * Gauß-Blur über Vektorformen ist mit drei Radialverläufen nicht exakt.
 */

.ag-button,
.ag-button * {
    box-sizing: border-box;
}

/* Typisierte Custom Properties — nur registrierte Properties interpolieren.
   Ohne @property springt der Verlauf, statt zu gleiten. */
@property --ag-button-dx   { syntax: '<length>'; inherits: true; initial-value: 0px; }
@property --ag-button-dy   { syntax: '<length>'; inherits: true; initial-value: 0px; }
@property --ag-button-tint { syntax: '<number>'; inherits: true; initial-value: 0; }

/* ── Fremdgerenderte Knöpfe mit Atom-Look ────────────────────
   ClickDimensions rendert den Absende-Knopf seines Formulars selbst
   (`.sd-navigation__complete-btn`); ohne JS lässt sich ihm keine Klasse
   anhängen. Damit der Verlauf aus EINER Quelle kommt (Regel „Atom-Doppelrolle,
   SSOT im Code") steht seine Auswahl hier neben der des Atoms — statt als
   zweiter Verlaufsnachbau im Widget-Blatt. Spezifität (0,3,0) schlägt
   `.elementor-kit-7 button` (0,1,1). Aufgenommen 04.09.2026, K3-5 erledigt
   (Auftrag Vincent: „Button ist nicht primary gradient"). */
.ag-button,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn {
    --ag-button-color: var(--color-text-standard);

    /* Abdunklung der Verlaufsfläche als L3-Alias. Global überschreibbar unter
       „agenic Design → Button"; Standard ist der Semantik-Token. */
    --ag-button-scrim: var(--color-interaction-contrast-scrim);

    /* Kontrastkontur (High-Contrast, Modifier --kontrast). Farbe bindet an den
       Semantik-Token, die Deckung ist die einzige Stellschraube. */
    --ag-button-kontur-farbe: var(--color-text-inverse-soft);
    --ag-button-kontur-deckung: 55%;

    /* Tiefe der Cursor-Verdrängung je Blob (Kontrakt ag_button §8).
       Der Faktor ist der einzige Hebel der globalen Einstellung — die
       Verhältnisse der drei Blobs zueinander bleiben dadurch erhalten.
       Faktor 0 = Verdrängung aus. */
    --ag-button-push-faktor: 1;
    --ag-button-push-crm: calc(.34 * var(--ag-button-push-faktor));
    --ag-button-push-erp: calc(-.22 * var(--ag-button-push-faktor));
    --ag-button-push-dark: calc(.12 * var(--ag-button-push-faktor));

    /* Rueckzug: Beim Verlassen zieht sich die Flaeche langsam zurueck, beim
       Ueberfahren folgt sie sofort. Voreinstellung ist die laengste Stufe der
       Figma-Motion-Leiter (Values/motion/duration/2xl). */
    --ag-button-rueckzug: var(--motion-duration-2xl, 1600ms);

    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--spacing-m);
    border-radius: var(--radius-max);
    font-family: var(--font-sans);
    font-weight: var(--fw-medium);
    letter-spacing: -0.02em;
    cursor: pointer;
    transition: transform var(--motion-fast) var(--motion-ease-standard);
}

.ag-button.ag-button,
.ag-button.ag-button:hover,
.ag-button.ag-button:focus,
.ag-button.ag-button:visited {
    text-decoration: none;
}

.ag-button.ag-button:hover,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:hover {
    transform: translateY(-2px);     /* Button-Lift nach 0.7: rein Transform, kein Schatten */
}

.ag-button.ag-button:focus-visible,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:focus-visible {
    outline: 2px solid currentColor; /* Fokus per outline (0.7-Muster), nie box-shadow */
    outline-offset: 2px;
}

/* Status=Disabled → Zustand, kein Control. tmp: Optik genähert. */
.ag-button.ag-button:is([disabled], [aria-disabled="true"], .is-disabled) {
    opacity: 0.45; /* tmp */
    pointer-events: none;
    transform: none;
}

/* ── Größen (Figma: L 56 · M 48 · S 40 · XS 34) ─────────────── */
/* Doppelklasse: als <button type="submit"> gerendert (form-block, search)
   schlägt sonst `.elementor-kit-7 button` (0,1,1) mit font-size und
   padding die Einzelklasse (0,1,0) — gemessen 03.09.2026 im statischen
   Render-Abgleich von ag_hero_search (Button 63 hoch, 30 px Schrift). */

.ag-button.ag-button--l  { min-height: 56px; padding: var(--spacing-m) var(--spacing-l);   font-size: var(--fs-300); line-height: calc(21 / 16); } /* tmp: Padding nicht einzeln vermessen */
.ag-button.ag-button--m  { min-height: 48px; padding: var(--spacing-ms) var(--spacing-ml); font-size: var(--fs-300); line-height: calc(21 / 16); } /* exakt (Pilot-Messung) */
.ag-button.ag-button--s  { min-height: 40px; padding: var(--spacing-s) var(--spacing-ml);  font-size: var(--fs-200); line-height: 1.45; }          /* tmp */
.ag-button.ag-button--xs { min-height: 34px; padding: var(--spacing-xs) var(--spacing-m);  font-size: var(--fs-150); line-height: 1.45; }          /* tmp */

/* ── Typ 1st/gradient — Fusion-Verlauf ──────────────────────── */

.ag-button.ag-button--gradient,
.ag-button.ag-button--gradient:hover,
.ag-button.ag-button--gradient:focus,
.ag-button.ag-button--gradient:visited,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:hover,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:focus,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:visited {
    border: 0;
    color: var(--color-text-inverse-soft); /* Figma: text--inverse in allen Varianten */

    /* Fusion-Mesh: drei Radialverläufe über der Grundfarbe, darüber Hover-Tint
       und Abdunklung. Bewegt werden die VERLAUFSZENTREN, nicht die Ebenen —
       dadurch entsteht kein Beschnitt an einer Ebenenkante.
       Die Abdunklung sichert WCAG 1.4.3: 5,60:1 statt 2,33:1 (am Figma-Export
       gemessen, alle vier Größen). Kalibrierung: RMSE 4,9 %. */
    background-color: var(--c-fusion-ground);
    background-image:
        linear-gradient(var(--ag-button-scrim), var(--ag-button-scrim)),
        linear-gradient(rgba(255, 255, 255, var(--ag-button-tint)), rgba(255, 255, 255, var(--ag-button-tint))),
        radial-gradient(38.8% 438.0%
            at calc(140.0% + var(--ag-button-dx) * -1 * var(--ag-button-push-dark))
               calc(126.0% + var(--ag-button-dy) * -1 * var(--ag-button-push-dark)),
            var(--c-fusion-dark) 0%, rgba(24, 24, 30, 0) 100%),
        radial-gradient(152.5% 103.8%
            at calc(91.1% + var(--ag-button-dx) * -1 * var(--ag-button-push-erp))
               calc(-4.9% + var(--ag-button-dy) * -1 * var(--ag-button-push-erp)),
            var(--c-fusion-erp) 0%, rgba(59, 189, 202, 0) 100%),
        radial-gradient(92.0% 375.2%
            at calc(12.2% + var(--ag-button-dx) * -1 * var(--ag-button-push-crm))
               calc(135.4% + var(--ag-button-dy) * -1 * var(--ag-button-push-crm)),
            var(--c-fusion-crm) 0%, rgba(95, 178, 45, 0) 100%);
    /* Asymmetrisch, mit Absicht: Diese Regel gilt im Ruhezustand — also genau
       in dem Moment, in dem der Zeiger den Button verlaesst. Der Rueckzug
       laeuft deshalb ueber --ag-button-rueckzug. Der Lift bleibt schnell,
       damit die Rueckmeldung auf den Klick nicht traege wirkt. */
    transition:
        transform var(--motion-fast) var(--motion-ease-standard),
        --ag-button-dx var(--ag-button-rueckzug) var(--motion-ease-standard),
        --ag-button-dy var(--ag-button-rueckzug) var(--motion-ease-standard),
        --ag-button-tint var(--ag-button-rueckzug) var(--motion-ease-standard);
}

/* ── Kontrastkontur (High-Contrast) ─────────────────────────── */

/* Warum es sie gibt (Messung 11.08.2026, Frontend-Nachbau bei 1440 und 2056):
   Die Fläche des Gradient-Typs steht gegen den Hero-Grund bei 1,00:1 — WCAG
   1.4.11 verlangt 3:1 für Bedienelemente. Über die Fläche ist das nicht zu
   lösen: 75 Kombinationen aus Grundabdunklung (30–70 %), Zone (0–50 %) und
   Button-Scrim (24–39 %) erreichen höchstens 2,55:1, und das nur bei einem
   Scrim, bei dem die Beschriftung auf dem Button selbst auf 4,60:1 abrutscht.
   Grund: Der Button ist selbst sehr dunkel — je dunkler der Grund, desto
   ähnlicher werden sich beide.
   Die Kontur löst es ohne Eingriff in den Scrim: 50 % → 3,17:1, 55 % → 3,50:1.
   Gemessen wird der ungünstigere der beiden Ränder (gegen Grund und gegen die
   eigene Fläche). Umgesetzt als inset-Schatten, nicht als border — eine border
   verschiebt sonst die Innenmaße aller vier Größen. */
.ag-button--kontrast.ag-button--gradient {
    box-shadow: inset 0 0 0 var(--border-width-xs, 1px)
        color-mix(in srgb, var(--ag-button-kontur-farbe) var(--ag-button-kontur-deckung), transparent);
}

/* Hover-/Fokusfläche: Figma `state-overlay` = Interaction/hover-tint--inverse.
   Focus erhält denselben Tint — die Fläche unterscheidet Focus in Figma nicht
   von Default (Entscheidung Vincent 11.08.2026); sichtbar bleibt der outline. */
.ag-button.ag-button--gradient:hover,
.ag-button.ag-button--gradient:focus-visible,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:hover,
.ag-hero-form-split__formular .sd-root-modern .sd-navigation__complete-btn:focus-visible {
    --ag-button-tint: .10;

    /* Waehrend des Ueberfahrens klebt die Flaeche am Zeiger — kurze Dauer.
       Beim Verlassen faellt diese Regel weg und die lange Dauer aus der
       Grundregel uebernimmt. */
    transition:
        transform var(--motion-fast) var(--motion-ease-standard),
        --ag-button-dx var(--motion-fast) var(--motion-ease-standard),
        --ag-button-dy var(--motion-fast) var(--motion-ease-standard),
        --ag-button-tint var(--motion-fast) var(--motion-ease-standard);
}

/* Ohne JS, bei grobem Zeiger und bei prefers-reduced-motion bleiben die
   Verlaufszentren auf 0 — die Fläche ist dann exakt der Figma-Default. */
@media (prefers-reduced-motion: reduce), (hover: none), (pointer: coarse) {
    .ag-button.ag-button--gradient {
        --ag-button-dx: 0px;
        --ag-button-dy: 0px;
    }
}

/* ── Typ 2nd/Outline ────────────────────────────────────────── */

.ag-button.ag-button--outline,
.ag-button.ag-button--outline:hover,
.ag-button.ag-button--outline:focus,
.ag-button.ag-button--outline:visited {
    background: transparent;
    border: 1px solid currentColor;  /* Buttons/default/border-width = 1 */
    color: var(--ag-button-color);
}

/* ── Typ 3rd/Text — ohne Fläche und Pill ────────────────────── */

.ag-button.ag-button--text,
.ag-button.ag-button--text:hover,
.ag-button.ag-button--text:focus,
.ag-button.ag-button--text:visited {
    /* `background-color`, nicht die Kurzform `background` — die wuerde das
       background-image der Hover-Linie weiter unten mit loeschen. */
    background-color: transparent;
    border: 0;
    border-radius: 0;
    min-height: 0;
    color: var(--ag-button-color);

    /* Abstand zwischen Schriftgrundlinie und Hover-Linie (Ansage Vincent
       07.09.2026: „mehr Abstand zur Subline bei Hover, x2").
       Gemessen 07.09.2026 im Frontend (doku-atome, Groesse L): ohne Polster
       liegen 5,00 px zwischen Grundlinie und Linienoberkante (font-size 16,
       line-height 21). Verdopplung verlangt +5 px — die Figma-Leiter
       `Values/spacing/*` kennt 4 und 8, keine 5. Gewaehlt: xs (4) → 9,00 px,
       Faktor 1,8. Abweichung von exakt x2, angemerkt.
       Das Polster steht KONSTANT, nicht nur im Hover — sonst spraenge das
       Layout beim Ueberfahren.
       Folge, angemerkt: Die Elementhoehe waechst dadurch von 21 auf 25 px.
       Ein Ausgleich per negativem `margin-bottom` waere die Alternative, ist
       aber unbrauchbar — die Abstands-Controls der Widgets setzen `margin-block-end`
       instanzweise mit hoeherer Spezifitaet (gemessen 07.09.2026 auf
       /brandhub/atome/, post-821.css) und wuerden ihn ueberschreiben. */
    --ag-button-text-linie-abstand: var(--spacing-xs);
    padding: 0 0 var(--ag-button-text-linie-abstand);
}

/* Hover-Zustand: durchlaufende Linie statt `text-decoration: underline`.
   Gleiche Mechanik wie die Komponente .ag-link im Child-Theme (Variante V3,
   Entscheidung Vincent 24.08.2026): Die Linie fährt von links ein und läuft
   beim Verlassen nach rechts weiter hinaus, statt zurückzuschrumpfen. Den
   Richtungswechsel trägt allein der Sprung des Ankerpunkts
   (background-position 100% → 0%) — auf diese Eigenschaft darf kein Übergang
   liegen, sonst wandert die Linie sichtbar quer statt umzuschalten.

   Warum die Regel hier wiederholt wird und nicht .ag-link mitbenutzt:
   .ag-link bringt eigene Farben mit (--color-brand-primary) und würde den
   Farbkontrakt des Buttons überschreiben — Farbe=Invers wäre damit kaputt.
   `currentColor` erbt stattdessen --ag-button-color und trägt beide Farben.

   Der Zustand bleibt damit weiterhin nicht nur über Farbe erkennbar; die
   Anhebung um 2px liefert `.ag-button.ag-button:hover` oben bereits mit.

   Die Linie sitzt am Button, nicht am `__label` (Korrektur 25.08.2026,
   Befund Vincent). Am Label endete sie vor dem Icon, weil `.ag-button` ein
   inline-flex-Container ist und Label und Icon zwei getrennte Flex-Items
   sind — die Linie lief also nur unter dem Text und ließ Abstand und Pfeil
   frei. Am Button umfasst sie Label, `gap` und Icon in einem Stück.

   ACHTUNG: Bei `.ag-button--voll` ist die Elementbreite die volle
   Containerbreite — dort läuft die Linie entsprechend über die ganze
   Breite und nicht nur unter dem Inhalt. Für den Typ Text ist die
   Kombination unüblich, aber möglich. */
.ag-button.ag-button--text {
    background-image: linear-gradient(currentColor, currentColor);
    background-repeat: no-repeat;
    background-size: 0% var(--border-width-s);
    background-position: 100% 100%;   /* Ruhe: Anker rechts */
    transition:
        transform var(--motion-fast) var(--motion-ease-standard),
        background-size var(--motion-duration-xs) var(--motion-ease-standard);
}

.ag-button.ag-button--text:hover,
.ag-button.ag-button--text:focus-visible {
    background-size: 100% var(--border-width-s);
    background-position: 0% 100%;     /* Hover: Anker links */
}

/* Bewegung reduziert: Die Linie bleibt, sie erscheint nur ohne Lauf.
   Ein Textbutton ohne sichtbare Rückmeldung wäre schlechter als einer
   ohne Animation. */
@media (prefers-reduced-motion: reduce) {
    .ag-button.ag-button--text { transition-duration: 1ms; }
}

/* ── Farbe=Inverse (Outline/Text auf dunklen Flächen) ───────── */

.ag-button--inverse {
    --ag-button-color: var(--color-text-inverse-soft);
}

.ag-button__icon {
    flex: 0 0 auto;
}

/* Breite: hug (Default) | voll — Control „Breite", Ergänzung Vincent 10.08.2026 */
.ag-button--voll {
    width: 100%;
}
