:root {
    --crispy-external-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 17 17 7M8 7h9v9'/%3E%3C/svg%3E");

    /* Default download icon, used for any file type without a specific one. */
    --crispy-download-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12m0 0 4-4m-4 4-4-4M4 19h16'/%3E%3C/svg%3E");

    /* Per-type icons, selected via the data-crispy-filetype attribute the
       download filter emits. All are single-colour outlines so they inherit the
       link colour through mask-image + currentColor, exactly like the others. */
    --crispy-file-icon-pdf: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3v4a1 1 0 0 0 1 1h4'/%3E%3Cpath d='M19 10V9a2 2 0 0 0-.6-1.4l-4-4A2 2 0 0 0 13 3H7a2 2 0 0 0-2 2v10'/%3E%3Cpath d='M5 18h1.5a1.5 1.5 0 0 0 0-3H5v6'/%3E%3Cpath d='M11 21v-6h1a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-1'/%3E%3Cpath d='M20 15h-2.5v6'/%3E%3Cpath d='M17.5 18H19'/%3E%3C/svg%3E");
    --crispy-file-icon-doc: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3v4a1 1 0 0 0 1 1h4'/%3E%3Cpath d='M19 12V9a2 2 0 0 0-.6-1.4l-4-4A2 2 0 0 0 13 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5'/%3E%3Cpath d='M9 9h1M9 13h6M9 17h4'/%3E%3C/svg%3E");
    --crispy-file-icon-sheet: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3v4a1 1 0 0 0 1 1h4'/%3E%3Cpath d='M19 12V9a2 2 0 0 0-.6-1.4l-4-4A2 2 0 0 0 13 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5'/%3E%3Cpath d='M8 11h8M8 15h8M12 11v8'/%3E%3C/svg%3E");
    --crispy-file-icon-archive: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='4' rx='1'/%3E%3Cpath d='M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8'/%3E%3Cpath d='M10 12h4'/%3E%3C/svg%3E");

    --crispy-link-icon-size: 0.8em;
    --crispy-link-icon-gap: 0.25em;
}

/* ------------------------------------------------
   External links
   ------------------------------------------------ */

.crispy-external-link::after {
    content: "";
    display: inline-block;
    width: var(--crispy-link-icon-size);
    height: var(--crispy-link-icon-size);
    margin-inline-start: var(--crispy-link-icon-gap);
    vertical-align: baseline;

    /* currentColor + mask rather than a background image: the icon then follows
       the link colour, including in dark mode, and stays visible when the user
       forces their own colours. */
    background-color: currentColor;
    -webkit-mask-image: var(--crispy-external-icon);
    mask-image: var(--crispy-external-icon);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-position: center;
    mask-position: center;
}

/* ------------------------------------------------
   Download links
   ------------------------------------------------ */

.crispy-download-link::before {
    content: "";
    display: inline-block;
    width: var(--crispy-link-icon-size);
    height: var(--crispy-link-icon-size);
    margin-inline-end: var(--crispy-link-icon-gap);
    vertical-align: baseline;

    background-color: currentColor;
    -webkit-mask-image: var(--crispy-download-icon);
    mask-image: var(--crispy-download-icon);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-position: center;
    mask-position: center;
}

/* Per-type icons. The download filter emits data-crispy-filetype on every
   labelled link, so a layout can swap any of these without touching the markup. */
.crispy-download-link[data-crispy-filetype="pdf"]::before {
    -webkit-mask-image: var(--crispy-file-icon-pdf);
    mask-image: var(--crispy-file-icon-pdf);
}

.crispy-download-link[data-crispy-filetype="doc"]::before,
.crispy-download-link[data-crispy-filetype="docx"]::before,
.crispy-download-link[data-crispy-filetype="odt"]::before,
.crispy-download-link[data-crispy-filetype="rtf"]::before,
.crispy-download-link[data-crispy-filetype="txt"]::before {
    -webkit-mask-image: var(--crispy-file-icon-doc);
    mask-image: var(--crispy-file-icon-doc);
}

.crispy-download-link[data-crispy-filetype="xls"]::before,
.crispy-download-link[data-crispy-filetype="xlsx"]::before,
.crispy-download-link[data-crispy-filetype="ods"]::before,
.crispy-download-link[data-crispy-filetype="csv"]::before {
    -webkit-mask-image: var(--crispy-file-icon-sheet);
    mask-image: var(--crispy-file-icon-sheet);
}

.crispy-download-link[data-crispy-filetype="zip"]::before {
    -webkit-mask-image: var(--crispy-file-icon-archive);
    mask-image: var(--crispy-file-icon-archive);
}

/* File-type icons carry more detail than the plain arrow, so give them a little
   more room to stay legible at body-text size. */
.crispy-download-link[data-crispy-filetype]::before {
    width: 1em;
    height: 1em;
    vertical-align: -0.125em;
}

/* A download link is not also an "external" link when it points at this site's
   own media, so the two icons rarely collide — but if a layout marks both, drop
   the arrow rather than showing two icons. */
.crispy-download-link.crispy-external-link::after {
    content: none;
}

/* The file metadata: "(PDF, 2 MB, Datei ist barrierefrei)".
   This is real, visible content, not decoration — it must never be hidden.
   nowrap keeps the label from breaking across lines mid-parenthesis. */
.crispy-file-meta {
    font-size: 0.875em;
    white-space: nowrap;
}

/* Status accents are intentionally weight-based rather than colour-only: the
   label already states the status in words, and colour alone would fail
   WCAG 1.4.1. Add colour here if it suits your design, but keep the text. */
.crispy-download-link[data-crispy-a11y="not-accessible"] .crispy-file-meta {
    font-weight: 600;
}

/* ------------------------------------------------
   Print
   ------------------------------------------------ */

@media print {

    /* On paper a link is only useful if its destination is readable. */
    .crispy-external-link::after {
        content: " (" attr(href) ")";
        display: inline;
        width: auto;
        height: auto;
        margin-inline-start: 0.25em;
        background: none;
        -webkit-mask-image: none;
        mask-image: none;
        font-size: 0.875em;
        overflow-wrap: anywhere;
    }

    .crispy-download-link::before {
        content: none;
    }
}

/* ------------------------------------------------
   Reduced data / no-icon fallback
   ------------------------------------------------ */

@supports not ((-webkit-mask-image: none) or (mask-image: none)) {

    /* Very old browsers: a text arrow beats an empty box. The pseudo-element is
       decorative — the accessible name already carries the information. */
    .crispy-external-link::after {
        content: "\2197";
        /* ↗ */
        background: none;
        width: auto;
        height: auto;
    }

    .crispy-download-link::before {
        content: "\2193";
        /* ↓ */
        background: none;
        width: auto;
        height: auto;
    }
}

/* ================================================
   Crispy Contact Form — Starter Stylesheet
   ================================================ */

.crispy-contact-form {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.crispy-contact-form-field {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.crispy-contact-form-field label {
    font-size: 0.875rem;
    font-weight: 500;
    color: #374151;
}

.crispy-contact-form-field input[type="text"],
.crispy-contact-form-field input[type="email"],
.crispy-contact-form-field input[type="tel"],
.crispy-contact-form-field input[type="number"],
.crispy-contact-form-field textarea,
.crispy-contact-form-field select {
    width: 100%;
    padding: 0.5rem 0.75rem;
    font-size: 0.9375rem;
    line-height: 1.5;
    color: #111827;
    background-color: #fff;
    border: 1px solid #d1d5db;
    border-radius: 0.375rem;
    box-sizing: border-box;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.crispy-contact-form-field input:focus,
.crispy-contact-form-field textarea:focus,
.crispy-contact-form-field select:focus {
    border-color: #3b82f6;
    outline: none;
    box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
}

.crispy-contact-form-field textarea {
    min-height: 6rem;
    resize: vertical;
}

.crispy-contact-form-field[data-field-type="checkbox"] label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    cursor: pointer;
}

.crispy-contact-form-submit {
    align-self: flex-start;
    padding: 0.5rem 1.5rem;
    font-size: 0.9375rem;
    font-weight: 500;
    color: #fff;
    background-color: #2563eb;
    border: none;
    border-radius: 0.375rem;
    cursor: pointer;
    transition: background-color 0.15s ease, opacity 0.15s ease;
}

.crispy-contact-form-submit:hover {
    background-color: #1d4ed8;
}

.crispy-contact-form-submit:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

.crispy-contact-form-feedback {
    font-size: 0.875rem;
    padding: 0.625rem 0.875rem;
    border-radius: 0.375rem;
    display: none;
}

.crispy-contact-form-feedback.success {
    color: #065f46;
    background-color: #d1fae5;
    border: 1px solid #6ee7b7;
}

.crispy-contact-form-feedback.error {
    color: #991b1b;
    background-color: #fee2e2;
    border: 1px solid #fca5a5;
}

/* Altcha captcha widget */
.crispy-contact-form altcha-widget {
    display: block;
}

/* ================================================
   Embed consent gate (DSGVO/GDPR)
   ================================================
   CrispyHelper.js hides a .crispy-embed-blocked iframe and inserts the
   interactive overlay before it once it has decided consent is needed.
   Without JavaScript that never happens - the iframe stays visible with no
   `src` (the real one only exists in data-crispy-embed-src, so no request is
   ever made) - so this gives it a visible placeholder shape instead of
   silently collapsing to nothing. Generated content (::before/::after) is
   not reliably rendered on <iframe>, which is why the no-JS placeholder is a
   plain background/border rather than a pseudo-element message. */

.crispy-embed-blocked {
    display: block;
    box-sizing: border-box;
    min-height: 12rem;
    background-color: var(--crispy-embed-placeholder-bg, #f4f4f5);
    border: 1px dashed var(--crispy-embed-placeholder-border, #d1d5db);
}

.crispy-embed-consent-overlay {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.5rem;
    box-sizing: border-box;
    padding: 1.25rem;
    background-color: var(--crispy-embed-placeholder-bg, #f4f4f5);
    border: 1px dashed var(--crispy-embed-placeholder-border, #d1d5db);
    border-radius: 0.375rem;
}

.crispy-embed-consent-title {
    margin: 0;
    font-weight: 600;
    color: #111827;
}

.crispy-embed-consent-message {
    margin: 0;
    font-size: 0.9375rem;
    color: #374151;
}

.crispy-embed-consent-accept {
    padding: 0.5rem 1.25rem;
    font-size: 0.9375rem;
    font-weight: 500;
    color: #fff;
    background-color: #2563eb;
    border: none;
    border-radius: 0.375rem;
    cursor: pointer;
    transition: background-color 0.15s ease;
}

.crispy-embed-consent-accept:hover {
    background-color: #1d4ed8;
}

.crispy-embed-consent-privacy-link {
    font-size: 0.8125rem;
    color: #2563eb;
    text-decoration: underline;
}

/* ================================================
   Cookie consent manager (DSGVO/GDPR)
   ================================================
   Bottom banner, manager modal and floating reopen icon rendered by
   CrispyHelper.js once CookieConsentInitFilter (or, manually,
   {{ crispyCookieConsentInit() }}) has populated
   window.crispyCookieCategories. Gated <script type="text/plain"> elements
   (Crispy\Services\ContentFilters\ScriptConsentFilter) have no visible
   footprint of their own - only the banner/manager/overlay UI below is
   visible to visitors.

   Deliberately not built from generic Bootstrap-style primitives: a
   dedicated, compact bottom-left card plus a purpose-built settings sheet,
   so it reads as a first-party product surface rather than a plugin bolted
   on top of the site. Every colour/spacing value below is a CSS custom
   property with a fallback, so a customer can override the look entirely
   from their own stylesheet without touching this file - e.g.
   `:root { --crispy-cookie-accent: #111827; }`. */

.crispy-cookie-banner,
.crispy-cookie-manager {
    --_cc-font: var(--crispy-cookie-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Roboto, sans-serif);
    --_cc-accent: var(--crispy-cookie-accent, #17213b);
    --_cc-accent-hover: var(--crispy-cookie-accent-hover, #0d1526);
    --_cc-surface: var(--crispy-cookie-surface, #fff);
    --_cc-surface-alt: var(--crispy-cookie-surface-alt, #f6f7f9);
    --_cc-border: var(--crispy-cookie-border, #e5e7eb);
    --_cc-text: var(--crispy-cookie-text, #12151c);
    --_cc-text-muted: var(--crispy-cookie-text-muted, #666e7d);
    --_cc-radius: var(--crispy-cookie-radius, 18px);
    font-family: var(--_cc-font);
    color: var(--_cc-text);
}

.crispy-cookie-banner {
    position: fixed;
    left: 1.25rem;
    bottom: 1.25rem;
    z-index: 1050;
    box-sizing: border-box;
    width: min(23rem, calc(100vw - 2.5rem));
    padding: 1.375rem 1.5rem 1.5rem;
    background-color: var(--_cc-surface);
    border: 1px solid var(--_cc-border);
    border-radius: var(--_cc-radius);
    box-shadow: 0 24px 48px -16px rgba(15, 23, 42, 0.28), 0 2px 6px rgba(15, 23, 42, 0.06);
}

.crispy-cookie-banner-header,
.crispy-cookie-manager-header {
    display: flex;
    align-items: center;
    gap: 0.625rem;
}

.crispy-cookie-icon {
    display: inline-flex;
    flex: none;
    color: var(--_cc-accent);
}

.crispy-cookie-banner-title {
    font-size: 0.9375rem;
    font-weight: 650;
    letter-spacing: -0.01em;
}

.crispy-cookie-banner-message {
    margin: 0.625rem 0 0;
    font-size: 0.8125rem;
    line-height: 1.55;
    color: var(--_cc-text-muted);
}

.crispy-cookie-banner-actions {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin-top: 1.125rem;
}

.crispy-cookie-btn {
    box-sizing: border-box;
    width: 100%;
    padding: 0.625rem 1.25rem;
    font-family: inherit;
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.005em;
    text-align: center;
    border-radius: calc(var(--_cc-radius) - 8px);
    cursor: pointer;
    transition: background-color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;
}

.crispy-cookie-btn-primary {
    color: #fff;
    background-color: var(--_cc-accent);
    border: 1px solid var(--_cc-accent);
}

.crispy-cookie-btn-primary:hover {
    background-color: var(--_cc-accent-hover);
    border-color: var(--_cc-accent-hover);
}

.crispy-cookie-btn-secondary {
    color: var(--_cc-text);
    background-color: transparent;
    border: 1px solid var(--_cc-border);
}

.crispy-cookie-btn-secondary:hover {
    background-color: var(--_cc-surface-alt);
}

.crispy-cookie-btn-text {
    width: auto;
    margin: 0 auto;
    padding: 0.25rem 0.5rem;
    color: var(--_cc-text-muted);
    background: none;
    border: none;
}

.crispy-cookie-btn-text:hover {
    color: var(--_cc-text);
    text-decoration: underline;
}

.crispy-cookie-manager-overlay {
    position: fixed;
    inset: 0;
    z-index: 1060;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
    background-color: rgba(12, 15, 22, 0.55);
    backdrop-filter: blur(2px);
}

.crispy-cookie-manager-overlay.crispy-cookie-manager-open {
    display: flex;
}

.crispy-cookie-manager {
    position: relative;
    box-sizing: border-box;
    width: 100%;
    max-width: 30rem;
    max-height: 85vh;
    overflow-y: auto;
    padding: 1.75rem;
    background-color: var(--_cc-surface);
    border-radius: calc(var(--_cc-radius) + 4px);
    box-shadow: 0 32px 64px -12px rgba(15, 23, 42, 0.35);
}

.crispy-cookie-manager-header {
    margin-bottom: 0.25rem;
}

.crispy-cookie-manager-title {
    flex: 1;
    margin: 0;
    font-size: 1.0625rem;
    font-weight: 650;
    letter-spacing: -0.01em;
}

.crispy-cookie-manager-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 1.75rem;
    height: 1.75rem;
    color: var(--_cc-text-muted);
    background: none;
    border: none;
    border-radius: 50%;
    cursor: pointer;
    transition: background-color 0.15s ease, color 0.15s ease;
}

.crispy-cookie-manager-close:hover {
    color: var(--_cc-text);
    background-color: var(--_cc-surface-alt);
}

.crispy-cookie-manager-list {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin: 1.25rem 0 1.5rem;
}

.crispy-cookie-manager-row {
    padding: 0.875rem 1rem;
    background-color: var(--_cc-surface-alt);
    border: 1px solid transparent;
    border-radius: calc(var(--_cc-radius) - 6px);
    transition: border-color 0.15s ease;
}

.crispy-cookie-manager-row:hover {
    border-color: var(--_cc-border);
}

.crispy-cookie-manager-row-label {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    cursor: pointer;
}

.crispy-cookie-manager-row-name {
    font-size: 0.875rem;
    font-weight: 600;
}

.crispy-cookie-manager-row-badge {
    display: inline-block;
    margin-left: 0.5rem;
    padding: 0.0625rem 0.5rem;
    font-size: 0.6875rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--_cc-text-muted);
    background-color: var(--_cc-surface);
    border: 1px solid var(--_cc-border);
    border-radius: 999px;
}

.crispy-cookie-manager-row-description {
    margin: 0.375rem 0 0;
    font-size: 0.8125rem;
    line-height: 1.5;
    color: var(--_cc-text-muted);
}

.crispy-cookie-toggle {
    appearance: none;
    -webkit-appearance: none;
    position: relative;
    flex: none;
    box-sizing: border-box;
    width: 2.5rem;
    height: 1.375rem;
    margin: 0;
    background-color: var(--crispy-cookie-toggle-off, #d3d7de);
    border: none;
    border-radius: 999px;
    cursor: pointer;
    transition: background-color 0.15s ease;
}

.crispy-cookie-toggle::after {
    content: "";
    position: absolute;
    top: 2px;
    left: 2px;
    width: 1.125rem;
    height: 1.125rem;
    background-color: #fff;
    border-radius: 50%;
    box-shadow: 0 1px 3px rgba(15, 23, 42, 0.3);
    transition: transform 0.15s ease;
}

.crispy-cookie-toggle:checked {
    background-color: var(--_cc-accent);
}

.crispy-cookie-toggle:checked::after {
    transform: translateX(1.125rem);
}

.crispy-cookie-toggle:disabled {
    cursor: not-allowed;
    opacity: 0.55;
}

.crispy-cookie-manager-actions {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.crispy-cookie-floating-icon {
    position: fixed;
    bottom: 1.25rem;
    left: 1.25rem;
    z-index: 1040;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 3rem;
    height: 3rem;
    color: #fff;
    background-color: var(--crispy-cookie-accent, #17213b);
    border: none;
    border-radius: 50%;
    cursor: pointer;
    box-shadow: 0 12px 24px -8px rgba(15, 23, 42, 0.4);
    transition: background-color 0.15s ease, transform 0.15s ease;
}

.crispy-cookie-floating-icon:hover {
    background-color: var(--crispy-cookie-accent-hover, #0d1526);
    transform: translateY(-1px);
}

.crispy-cookie-floating-icon svg {
    width: 22px;
    height: 22px;
}