.datev-card{margin-top:22px;padding:24px;overflow:hidden}.datev-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin-bottom:18px}.datev-card-head h2{margin:6px 0 5px}.datev-card-head p{max-width:720px;margin:0;color:var(--muted,#6f6f6f);font-size:var(--fs-xl);line-height:1.55}.datev-status{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:0 12px;border-radius:999px;font-size:var(--fs-md);font-weight:var(--fw-black);white-space:nowrap;background:#f2f2f2;color:#444}.datev-status.connected{background:#101010;color:#fff}.datev-status.error{background:#fff1f1;color:#9f1717}.datev-status.pending{background:#f7f4eb;color:#67551f}.datev-layout{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(280px,.7fr);gap:22px}.datev-layout>section{border:1px solid rgba(0,0,0,.08);border-radius:18px;padding:18px}.datev-layout h3{margin:0 0 14px;font-size:var(--fs-2xl)}.datev-alert{margin:0 0 18px;padding:14px 16px;border-radius:14px;background:#f7f4eb;display:grid;gap:7px;font-size:var(--fs-lg)}.datev-alert.error{background:#fff1f1;color:#8c1b1b}.datev-alert ul{margin:2px 0 0 18px;padding:0}.datev-alert small{line-height:1.45}.datev-empty{padding:14px 0;color:var(--muted,#6f6f6f);font-size:var(--fs-xl)}.datev-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 16px;margin:0 0 16px}.datev-meta div{padding:10px 0;border-bottom:1px solid rgba(0,0,0,.07)}.datev-meta dt{font-size:var(--fs-base);text-transform:uppercase;letter-spacing:.06em;color:var(--muted,#777);font-weight:var(--fw-bold)}.datev-meta dd{margin:4px 0 0;font-size:var(--fs-xl);font-weight:var(--fw-bold);overflow-wrap:anywhere}.datev-setup-form{margin-top:10px}.datev-setup-form .form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.datev-form-actions,.datev-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}.datev-links{display:flex;flex-wrap:wrap;gap:12px;margin-top:16px}.datev-links a{font-size:var(--fs-md);font-weight:var(--fw-bold);color:inherit;text-decoration:underline;text-underline-offset:3px}.datev-readiness{display:grid;gap:10px}.datev-readiness-row{display:grid;grid-template-columns:12px 1fr;gap:10px;align-items:flex-start;padding:9px 0;border-bottom:1px solid rgba(0,0,0,.06)}.datev-readiness-row:last-child{border-bottom:0}.datev-readiness-row strong{display:block;font-size:var(--fs-lg)}.datev-readiness-row small{display:block;margin-top:3px;color:var(--muted,#6f6f6f);font-size:var(--fs-md);line-height:1.4}.datev-dot{width:10px;height:10px;margin-top:4px;border-radius:50%;background:#d7d7d7}.datev-dot.ok{background:#111}@media(max-width:850px){.datev-layout{grid-template-columns:1fr}.datev-card-head{flex-direction:column}.datev-meta{grid-template-columns:1fr}.datev-setup-form .form-grid{grid-template-columns:1fr}.datev-card{padding:18px}}

/* Motion pass: refresh()/replaceCard() swap the whole card for a fresh node
   on every status check, so the entrance lives on .datev-card itself rather
   than its children. Status badge/dot get a transition as cheap insurance
   for the rare case a re-render lands on the same node; datev-links had no
   hover feedback at all. */
@keyframes datev-card-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.datev-card{animation:datev-card-in var(--motion-base) var(--ease-out) both}
.datev-status{transition:background-color var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard)}
.datev-dot{transition:background-color var(--motion-base) var(--ease-standard)}
.datev-links a{transition:opacity var(--motion-fast) var(--ease-standard)}
.datev-links a:hover{opacity:.65}