PageSourceSearch

https://deinperfectday.de/anbieter-shop-anbindung/

html deinperfectday.de collected 2026-10-02 00:19:48 UTC 236,142 bytes, 3,714 lines download raw bytes

1<!DOCTYPE html>
2<html lang="de-DE">
3<head>
4<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.1, maximum-scale=5.0, user-scalable=yes">
5
6	<meta charset="UTF-8" />
7<meta http-equiv="X-UA-Compatible" content="IE=edge">
8	<link rel="pingback" href="https://deinperfectday.de/xmlrpc.php" />
9
10	
10<script type="text/javascript">
11		document.documentElement.className = 'js';
12	</script>
12
13
14	<title>Coupons über deinen Webshop verkaufen | Perfect Day</title>
15<meta name='robots' content='max-image-preview:large' />
16        <meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-eval' 'unsafe-inline'    *.met.vgwort.de  https://webinaris.co www.webinaris.co        ;  script-src 'self' 'unsafe-eval' 'unsafe-inline' data:   *.met.vgwort.de   https://webinaris.co www.webinaris.co            https://js.stripe.com https://checkout.stripe.com;  style-src 'self' 'unsafe-inline'   *.met.vgwort.de      ;  img-src 'self' data:   *.met.vgwort.de   ;  connect-src *;  object-src 'self'   *.met.vgwort.de       ;  child-src 'self' blob:   *.met.vgwort.de       ;  form-action *;  frame-src 'self'   *.met.vgwort.de     https://webinaris.co www.webinaris.co          https://js.stripe.com https://hooks.stripe.com https://checkout.stripe.com https://hooks.stripe.com; *.mollie.com font-src 'self' data:;  media-src 'self'   *.met.vgwort.de       ; ">
17        <link rel="dns-prefetch" href="//plattform.deinperfectday.de">
18<script>
19(function(){
20  var vp = document.querySelector('meta[name="viewport"]');
21  if (!vp) return;
22  var c = vp.getAttribute('content') || '';
23  // user-scalable=no oder user-scalable=0 entfernen
24  c = c.replace(/,?\s*user-scalable\s*=\s*(no|0)/gi, '');
25  // maximum-scale < 5 auf 5.0 setzen
26  c = c.replace(/maximum-scale\s*=\s*([0-4](\.[0-9]+)?)/gi, 'maximum-scale=5.0');
27  vp.setAttribute('content', c.replace(/^,\s*/, '').trim());
28})();
29</script>
29
30    
30<script id="digelite-fp-init">
31(function(){var s=function(){try{return JSON.parse(localStorage.getItem('dbf_settings')||'{}');}catch(e){return{};}};var t=s();var h=document.documentElement;if(t.size&&t.size!=='normal'){h.setAttribute('data-bf-size',t.size);}if(t.contrast){h.setAttribute('data-bf-contrast','');}if(t.animOff){h.setAttribute('data-bf-anim-off','');}if(t.spacing){h.setAttribute('data-bf-spacing','');}if(t.font){h.setAttribute('data-bf-font','');}})();
32</script>
32
33    
33<script type="text/javascript">
34			let jqueryParams=[],jQuery=function(r){return jqueryParams=[...jqueryParams,r],jQuery},$=function(r){return jqueryParams=[...jqueryParams,r],$};window.jQuery=jQuery,window.$=jQuery;let customHeadScripts=!1;jQuery.fn=jQuery.prototype={},$.fn=jQuery.prototype={},jQuery.noConflict=function(r){if(window.jQuery)return jQuery=window.jQuery,$=window.jQuery,customHeadScripts=!0,jQuery.noConflict},jQuery.ready=function(r){jqueryParams=[...jqueryParams,r]},$.ready=function(r){jqueryParams=[...jqueryParams,r]},jQuery.load=function(r){jqueryParams=[...jqueryParams,r]},$.load=function(r){jqueryParams=[...jqueryParams,r]},jQuery.fn.ready=function(r){jqueryParams=[...jqueryParams,r]},$.fn.ready=function(r){jqueryParams=[...jqueryParams,r]};</script>
34<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://deinperfectday.de/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fdeinperfectday.de%2Fanbieter-shop-anbindung%2F" />
35<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://deinperfectday.de/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fdeinperfectday.de%2Fanbieter-shop-anbindung%2F&#038;format=xml" />
36<style id="digelite-skip-link-css">
37#digelite-skip {
38    position: absolute;
39    top: -12000px;
40    left: 0;
41    padding: 10px 18px;
42    background: #000;
43    color: #fff;
44    text-decoration: none;
45    font-size: 16px;
46    border-radius: 5px;
47    z-index: 999999;
48    pointer-events: none;
49}
50#digelite-skip:focus,
51#digelite-skip:focus-visible {
52    top: 15px;
53    left: 15px;
54    pointer-events: auto;
55}
56.digelite-focus-anchor {
57    position: absolute;
58    width: 1px; height: 1px;
59    padding: 0; margin: 0; border: 0;
60    overflow: hidden;
61    clip: rect(0 0 0 0);
62    clip-path: inset(50%);
63    white-space: nowrap;
64}
65</style>
66        <meta name="description" content="Verkaufe Perfect-Day-Coupons über Shopify, Shopware, Magento, PrestaShop oder WooCommerce. 10–30 Min Setup, danach automatischer Code-Versand an deine Kunden.">
67<link rel="canonical" href="https://deinperfectday.de/anbieter-shop-anbindung/">
68<meta property="og:title" content="Coupons über deinen Webshop verkaufen | Perfect Day">
69<meta name="twitter:title" content="Coupons über deinen Webshop verkaufen | Perfect Day">
70<meta property="og:description" content="Verkaufe Perfect-Day-Coupons über Shopify, Shopware, Magento, PrestaShop oder WooCommerce. 10–30 Min Setup, danach automatischer Code-Versand an deine Kunden.">
71<meta name="twitter:description" content="Verkaufe Perfect-Day-Coupons über Shopify, Shopware, Magento, PrestaShop oder WooCommerce. 10–30 Min Setup, danach automatischer Code-Versand an deine Kunden.">
72<meta property="og:type" content="website">
73<meta property="og:locale" content="de_DE">
74<meta content="DigElite Child Theme DIVI v.3.1.19" name="generator"/>
75<style id="global-styles-inline-css">
76:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
76--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}:root { --wp--style--global--content-size: 823px;--wp--style--global--wide-size: 1080px; }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
76.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
77/*# sourceURL=global-styles-inline-css */
78</style>
79
80<link rel='stylesheet' id='pixelmate-public-css-css' href='https://deinperfectday.de/wp-content/plugins/pixelmate/public//assets/css/pixelmate.css?ver=d6081ce7174f871f6c64a09e398c9604' media='all' />
81<link rel='stylesheet' id='wp-optimize-youtube-preview-css' href='https://deinperfectday.de/wp-content/plugins/wp-optimize-premium/css/youtube-image-preview-4-4-1.min.css?ver=4.4.1.1790823679' media='all' />
82<link rel='stylesheet' id='digelite-frontend-panel-css' href='https://deinperfectday.de/wp-content/plugins/digelite-barrierefreiheit/modules/frontend-panel/frontend-panel.css?ver=1.11.1' media='all' />
83<style id="divi-style-parent-inline-inline-css">
84/*!
85Theme Name: Divi
86Theme URI: http://www.elegantthemes.com/gallery/divi/
87Version: 4.27.6
88Description: Smart. Flexible. Beautiful. Divi is the most powerful theme in our collection.
89Author: Elegant Themes
90Author URI: http://www.elegantthemes.com
91License: GNU General Public License v2
92License URI: http://www.gnu.org/licenses/gpl-2.0.html
93*/
94a,abbr,acronym,address,applet,b,big,blockquote,body,center,cite,code,dd,del,dfn,div,dl,dt,em,fieldset,font,form,h1,h2,h3,h4,h5,h6,html,i,iframe,img,ins,kbd,label,legend,li,object,ol,p,pre,q,s,samp,small,span,strike,strong,sub,sup,tt,u,ul,var{margin:0;padding:0;border:0;outline:0;font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}blockquote{margin:20px 0 30px;border-left:5px solid;padding-left:20px}:focus{outline:0}del{text-decoration:line-through}pre{overflow:auto;padding:10px}figure{margin:0}table{border-collapse:collapse;border-spacing:0}article,aside,footer,header,hgroup,nav,section{display:block}body{font-family:Open Sans,Arial,sans-serif;font-size:14px;color:#666;background-color:#fff;line-height:1.7em;font-weight:500;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body.page-template-page-template-blank-php #page-container{padding-top:0!important}body.et_cover_background{background-size:cover!important;background-position:top!important;background-repeat:no-repeat!important;background-attachment:fixed}a{color:#2ea3f2}a,a:hover{text-decoration:none}p{padding-bottom:1em}p:not(.has-background):last-of-type{padding-bottom:0}p.et_normal_padding{padding-bottom:1em}strong{font-weight:700}cite,em,i{font-style:italic}code,pre{font-family:Courier New,monospace;margin-bottom:10px}ins{text-decoration:none}sub,sup{height:0;line-height:1;position:relative;vertical-align:baseline}sup{bottom:.8em}sub{top:.3em}dl{margin:0 0 1.5em}dl dt{font-weight:700}dd{margin-left:1.5em}blockquote p{padding-bottom:0}embed,iframe,object,video{max-width:100%}h1,h2,h3,h4,h5,h6{color:#333;padding-bottom:10px;line-height:1em;font-weight:500}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}h5{font-size:16px}h6{font-size:14px}input{-webkit-appearance:none}input[type=checkbox]{-webkit-appearance:checkbox}input[type=radio]{-webkit-appearance:radio}input.text,input.title,input[type=email],input[type=password],input[type=tel],input[type=text],select,textarea{background-color:#fff;border:1px solid #bbb;padding:2px;color:#4e4e4e}input.text:focus,input.title:focus,input[type=text]:focus,select:focus,textarea:focus{border-color:#2d3940;color:#3e3e3e}input.text,input.title,input[type=text],select,textarea{margin:0}textarea{padding:4px}button,input,select,textarea{font-family:inherit}img{max-width:100%;height:auto}.clear{clear:both}br.clear{margin:0;padding:0}.pagination{clear:both}#et_search_icon:hover,.et-social-icon a:hover,.et_password_protected_form .et_submit_button,.form-submit .et_pb_buttontton.alt.disabled,.nav-single a,.posted_in a{color:#2ea3f2}.et-search-form,blockquote{border-color:#2ea3f2}#main-content{background-color:#fff}.container{width:80%;max-width:1080px;margin:auto;position:relative}body:not(.et-tb) #main-content .container,body:not(.et-tb-has-header) #main-content .container{padding-top:58px}.et_full_width_page #main-content .container:before{display:none}.main_title{margin-bottom:20px}.et_password_protected_form .et_submit_button:hover,.form-submit .et_pb_button:hover{background:rgba(0,0,0,.05)}.et_button_icon_visible .et_pb_button{padding-right:2em;padding-left:.7em}.et_button_icon_visible .et_pb_button:after{opacity:1;margin-left:0}.et_button_left .et_pb_button:hover:after{left:.15em}.et_button_left .et_pb_button:after{margin-left:0;left:1em}.et_button_icon_visible.et_button_left .et_pb_button,.et_button_left .et_pb_button:hover,.et_button_left .et_pb_module .et_pb_button:hover{padding-left:2em;padding-right:.7em}.et_button_icon_visible.et_button_left .et_pb_button:after,.et_button_left .et_pb_button:hover:after{left:.15em}.et_password_protected_form .et_submit_button:hover,.form-submit .et_pb_button:hover{padding:.3em 1em}.et_button_no_icon .et_pb_button:after{display:none}.et_button_no_icon.et_button_icon_visible.et_button_left .et_pb_button,.et_button_no_icon.et_button_left .et_pb_button:hover,.et_button_no_icon .et_pb_button,.et_button_no_icon .et_pb_button:hover{padding:.3em 1em!important}.et_button_custom_icon .et_pb_button:after{line-height:1.7em}.et_button_custom_icon.et_button_icon_visible .et_pb_button:after,.et_button_custom_icon .et_pb_button:hover:after{margin-left:.3em}#left-area .post_format-post-format-gallery .wp-block-gallery:first-of-type{padding:0;margin-bottom:-16px}.entry-content table:not(.variations){border:1px solid #eee;margin:0 0 15px;text-align:left;width:100%}.entry-content thead th,.entry-content tr th{color:#555;font-weight:700;padding:9px 24px}.entry-content tr td{border-top:1px solid #eee;padding:6px 24px}#left-area ul,.entry-content ul,.et-l--body ul,.et-l--footer ul,.et-l--header ul{list-style-type:disc;padding:0 0 23px 1em;line-height:26px}#left-area ol,.entry-content ol,.et-l--body ol,.et-l--footer ol,.et-l--header ol{list-style-type:decimal;list-style-position:inside;padding:0 0 23px;line-height:26px}#left-area ul li ul,.entry-content ul li ol{padding:2px 0 2px 20px}#left-area ol li ul,.entry-content ol li ol,.et-l--body ol li ol,.et-l--footer ol li ol,.et-l--header ol li ol{padding:2px 0 2px 35px}#left-area ul.wp-block-gallery{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;padding:0}#left-area ul.products{padding:0!important;line-height:1.7!important;list-style:none!important}.gallery-item a{display:block}.gallery-caption,.gallery-item a{width:90%}#wpadminbar{z-index:100001}#left-area .post-meta{font-size:14px;padding-bottom:15px}#left-area .post-meta a{text-decoration:none;color:#666}#left-area .et_featured_image{padding-bottom:7px}.single .post{padding-bottom:25px}body.single .et_audio_content{margin-bottom:-6px}.nav-single a{text-decoration:none;color:#2ea3f2;font-size:14px;font-weight:400}.nav-previous{float:left}.nav-next{float:right}.et_password_protected_form p input{background-color:#eee;border:none!important;width:100%!important;border-radius:0!important;font-size:14px;color:#999!important;padding:16px!important;-webkit-box-sizing:border-box;box-sizing:border-box}.et_password_protected_form label{display:none}.et_password_protected_form .et_submit_button{font-family:inherit;display:block;float:right;margin:8px auto 0;
94cursor:pointer}.post-password-required p.nocomments.container{max-width:100%}.post-password-required p.nocomments.container:before{display:none}.aligncenter,div.post .new-post .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-caption{border:1px solid #ddd;text-align:center;background-color:#f3f3f3;margin-bottom:10px;max-width:96%;padding:8px}.wp-caption.alignleft{margin:0 30px 20px 0}.wp-caption.alignright{margin:0 0 20px 30px}.wp-caption img{margin:0;padding:0;border:0}.wp-caption p.wp-caption-text{font-size:12px;padding:0 4px 5px;margin:0}.alignright{float:right}.alignleft{float:left}img.alignleft{display:inline;float:left;margin-right:15px}img.alignright{display:inline;float:right;margin-left:15px}.page.et_pb_pagebuilder_layout #main-content{background-color:transparent}body #main-content .et_builder_inner_content>h1,body #main-content .et_builder_inner_content>h2,body #main-content .et_builder_inner_content>h3,body #main-content .et_builder_inner_content>h4,body #main-content .et_builder_inner_content>h5,body #main-content .et_builder_inner_content>h6{line-height:1.4em}body #main-content .et_builder_inner_content>p{line-height:1.7em}.wp-block-pullquote{margin:20px 0 30px}.wp-block-pullquote.has-background blockquote{border-left:none}.wp-block-group.has-background{padding:1.5em 1.5em .5em}@media (min-width:981px){#left-area{width:79.125%;padding-bottom:23px}#main-content .container:before{content:"";position:absolute;top:0;height:100%;width:1px;background-color:#e2e2e2}.et_full_width_page #left-area,.et_no_sidebar #left-area{float:none;width:100%!important}.et_full_width_page #left-area{padding-bottom:0}.et_no_sidebar #main-content .container:before{display:none}}@media (max-width:980px){#page-container{padding-top:80px}.et-tb #page-container,.et-tb-has-header #page-container{padding-top:0!important}#left-area,#sidebar{width:100%!important}#main-content .container:before{display:none!important}.et_full_width_page .et_gallery_item:nth-child(4n+1){clear:none}}@media print{#page-container{padding-top:0!important}}#wp-admin-bar-et-use-visual-builder a:before{font-family:ETmodules!important;content:"\e625";font-size:30px!important;width:28px;margin-top:-3px;color:#974df3!important}#wp-admin-bar-et-use-visual-builder:hover a:before{color:#fff!important}#wp-admin-bar-et-use-visual-builder:hover a,#wp-admin-bar-et-use-visual-builder a:hover{transition:background-color .5s ease;-webkit-transition:background-color .5s ease;-moz-transition:background-color .5s ease;background-color:#7e3bd0!important;color:#fff!important}* html .clearfix,:first-child+html .clearfix{zoom:1}.iphone .et_pb_section_video_bg video::-webkit-media-controls-start-playback-button{display:none!important;-webkit-appearance:none}.et_mobile_device .et_pb_section_parallax .et_pb_parallax_css{background-attachment:scroll}.et-social-facebook a.icon:before{content:"\e093"}.et-social-twitter a.icon:before{content:"\e094"}.et-social-google-plus a.icon:before{content:"\e096"}.et-social-instagram a.icon:before{content:"\e09a"}.et-social-rss a.icon:before{content:"\e09e"}.ai1ec-single-event:after{content:" ";display:table;clear:both}.evcal_event_details .evcal_evdata_cell .eventon_details_shading_bot.eventon_details_shading_bot{z-index:3}.wp-block-divi-layout{margin-bottom:1em}*{-webkit-box-sizing:border-box;box-sizing:border-box}#et-info-email:before,#et-info-phone:before,#et_search_icon:before,.comment-reply-link:after,.et-cart-info span:before,.et-pb-arrow-next:before,.et-pb-arrow-prev:before,.et-social-icon a:before,.et_audio_container .mejs-playpause-button button:before,.et_audio_container .mejs-volume-button button:before,.et_overlay:before,.et_password_protected_form .et_submit_button:after,.et_pb_button:after,.et_pb_contact_reset:after,.et_pb_contact_submit:after,.et_pb_font_icon:before,.et_pb_newsletter_button:after,.et_pb_pricing_table_button:after,.et_pb_promo_button:after,.et_pb_testimonial:before,.et_pb_toggle_title:before,.form-submit .et_pb_button:after,.mobile_menu_bar:before,a.et_pb_more_button:after{font-family:ETmodules!important;speak:none;font-style:normal;font-weight:400;-webkit-font-feature-settings:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-shadow:0 0;direction:ltr}.et-pb-icon,.et_pb_custom_button_icon.et_pb_button:after,.et_pb_login .et_pb_custom_button_icon.et_pb_button:after,.et_pb_woo_custom_button_icon .button.et_pb_custom_button_icon.et_pb_button:after,.et_pb_woo_custom_button_icon .button.et_pb_custom_button_icon.et_pb_button:hover:after{content:attr(data-icon)}.et-pb-icon{font-family:ETmodules;speak:none;font-weight:400;-webkit-font-feature-settings:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;font-size:96px;font-style:normal;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;direction:ltr}#et-ajax-saving{display:none;-webkit-transition:background .3s,-webkit-box-shadow .3s;transition:background .3s,-webkit-box-shadow .3s;transition:background .3s,box-shadow .3s;transition:background .3s,box-shadow .3s,-webkit-box-shadow .3s;-webkit-box-shadow:rgba(0,139,219,.247059) 0 0 60px;box-shadow:0 0 60px rgba(0,139,219,.247059);position:fixed;top:50%;left:50%;width:50px;height:50px;background:#fff;border-radius:50px;margin:-25px 0 0 -25px;z-index:999999;text-align:center}#et-ajax-saving img{margin:9px}.et-safe-mode-indicator,.et-safe-mode-indicator:focus,.et-safe-mode-indicator:hover{-webkit-box-shadow:0 5px 10px rgba(41,196,169,.15);box-shadow:0 5px 10px rgba(41,196,169,.15);background:#29c4a9;color:#fff;font-size:14px;font-weight:600;padding:12px;line-height:16px;border-radius:3px;position:fixed;bottom:30px;right:30px;z-index:999999;text-decoration:none;font-family:Open Sans,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et_pb_button{font-size:20px;font-weight:500;padding:.3em 1em;line-height:1.7em!important;background-color:transparent;background-size:cover;background-position:50%;background-repeat:no-repeat;border:2px solid;border-radius:3px;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:all!important;transition-property:all!important}.et_pb_button,.et_pb_button_inner{position:relative}.et_pb_button:hover,.et_pb_module .et_pb_button:hover{border:2px solid transparent;padding:.3em 2em .3em .7em}.et_pb_button:hover{background-color:hsla(0,0%,100%,.2)}.et_pb_bg_layout_light.et_pb_button:hover,.et_pb_bg_layout_light .et_pb_button:hover{background-color:rgba(0,0,0,.05)}.et_pb_button:after,.et_pb_button:before{font-size:32px;line-height:1em;content:"\35";opacity:0;position:absolute;margin-left:-1em;-webkit-transition:all .2s;transition:all .2s;text-transform:none;-webkit-font-feature-settings:"kern" off;font-feature-settings:"kern" off;font-variant:none;font-style:normal;font-weight:400;text-shadow:none}.et_pb_button.et_hover_enabled:hover:after,.et_pb_button.et_pb_hovered:hover:after{-webkit-transition:none!important;transition:none!important}.et_pb_button:before{display:none}.et_pb_button:hover:after{opacity:1;margin-left:0}.et_pb_column_1_3 h1,.et_pb_column_1_4 h1,.et_pb_column_1_5 h1,.et_pb_column_1_6 h1,.et_pb_column_2_5 h1{font-size:26px}.et_pb_column_1_3 h2,.et_pb_column_1_4 h2,.et_pb_column_1_5 h2,.et_pb_column_1_6 h2,.et_pb_column_2_5 h2{font-size:23px}.et_pb_column_1_3 h3,.et_pb_column_1_4 h3,.et_pb_column_1_5 h3,.et_pb_column_1_6 h3,.et_pb_column_2_5 h3{font-size:20px}.et_pb_column_1_3 h4,.et_pb_column_1_4 h4,.et_pb_column_1_5 h4,.et_pb_column_1_6 h4,.et_pb_column_2_5 h4{font-size:18px}.et_pb_column_1_3 h5,.et_pb_column_1_4 h5,.et_pb_column_1_5 h5,.et_pb_column_1_6 h5,.et_pb_column_2_5 h5{font-size:16px}.et_pb_column_1_3 h6,.et_pb_column_1_4 h6,.et_pb_column_1_5 h6,.et_pb_column_1_6 h6,.et_pb_column_2_5 h6{font-size:15px}.et_pb_bg_layout_dark,.et_pb_bg_layout_dark h1,.et_pb_bg_layout_dark h2,.et_pb_bg_layout_dark h3,.et_pb_bg_layout_dark h4,.et_pb_bg_layout_dark h5,.et_pb_bg_layout_dark h6{color:#fff!important}.et_pb_module.et_pb_text_align_left{text-align:left}.et_pb_module.et_pb_text_align_center{text-align:center}.et_pb_module.et_pb_text_align_right{text-align:right}.et_pb_module.et_pb_text_align_justified{text-align:justify}.clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.et_pb_bg_layout_light .et_pb_more_button{color:#2ea3f2}.et_builder_inner_content{position:relative;z-index:1}header .et_builder_inner_content{z-index:2}.et_pb_css_mix_blend_mode_passthrough{mix-blend-mode:unset!important}.et_pb_image_container{margin:-20px -20px 29px}.et_pb_module_inner{position:relative}.et_hover_enabled_preview{z-index:2}.et_hover_enabled:hover{position:relative;z-index:2}.et_pb_all_tabs,.et_pb_module,.et_pb_posts_nav a,.et_pb_tab,.et_pb_with_background{position:relative;background-size:cover;background-position:50%;background-repeat:no-repeat}.et_pb_background_mask,.et_pb_background_pattern{bottom:0;left:0;position:absolute;right:0;top:0}.et_pb_background_mask{background-size:calc(100% + 2px) calc(100% + 2px);background-repeat:no-repeat;background-position:50%;overflow:hidden}.et_pb_background_pattern{background-position:0 0;background-repeat:repeat}.et_pb_with_border{position:relative;border:0 solid #333}.post-password-required .et_pb_row{padding:0;width:100%}.post-password-required .et_password_protected_form{min-height:0}body.et_pb_pagebuilder_layout.et_pb_show_title .post-password-required .et_password_protected_form h1,body:not(.et_pb_pagebuilder_layout) .post-password-required .et_password_protected_form h1{display:none}.et_pb_no_bg{padding:0!important}.et_overlay.et_pb_inline_icon:before,.et_pb_inline_icon:before{content:attr(data-icon)}.et_pb_more_button{color:inherit;text-shadow:none;text-decoration:none;display:inline-block;margin-top:20px}.et_parallax_bg_wrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0}.et_parallax_bg{background-repeat:no-repeat;background-position:top;background-size:cover;position:absolute;bottom:0;left:0;width:100%;height:100%;display:block}.et_parallax_bg.et_parallax_bg__hover,.et_parallax_bg.et_parallax_bg_phone,.et_parallax_bg.et_parallax_bg_tablet,.et_parallax_gradient.et_parallax_gradient__hover,.et_parallax_gradient.et_parallax_gradient_phone,.et_parallax_gradient.et_parallax_gradient_tablet,.et_pb_section_parallax_hover:hover .et_parallax_bg:not(.et_parallax_bg__hover),.et_pb_section_parallax_hover:hover .et_parallax_gradient:not(.et_parallax_gradient__hover){display:none}.et_pb_section_parallax_hover:hover .et_parallax_bg.et_parallax_bg__hover,.et_pb_section_parallax_hover:hover .et_parallax_gradient.et_parallax_gradient__hover{display:block}.et_parallax_gradient{bottom:0;display:block;left:0;position:absolute;right:0;top:0}.et_pb_module.et_pb_section_parallax,.et_pb_posts_nav a.et_pb_section_parallax,.et_pb_tab.et_pb_section_parallax{position:relative}.et_pb_section_parallax .et_pb_parallax_css,.et_pb_slides .et_parallax_bg.et_pb_parallax_css{background-attachment:fixed}body.et-bfb .et_pb_section_parallax .et_pb_parallax_css,body.et-bfb .et_pb_slides .et_parallax_bg.et_pb_parallax_css{background-attachment:scroll;bottom:auto}.et_pb_section_parallax.et_pb_column .et_pb_module,.et_pb_section_parallax.et_pb_row .et_pb_column,.et_pb_section_parallax.et_pb_row .et_pb_module{z-index:9;position:relative}.et_pb_more_button:hover:after{opacity:1;margin-left:0}.et_pb_preload .et_pb_section_video_bg,.et_pb_preload>div{visibility:hidden}.et_pb_preload,.et_pb_section.et_pb_section_video.et_pb_preload{position:relative;background:#464646!important}.et_pb_preload:before{content:"";position:absolute;top:50%;left:50%;background:url(https://deinperfectday.de/wp-content/themes/Divi/includes/builder/styles/images/preloader.gif) no-repeat;border-radius:32px;width:32px;height:32px;margin:-16px 0 0 -16px}.box-shadow-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;pointer-events:none}.et_pb_section>.box-shadow-overlay~.et_pb_row{z-index:11}body.safari .section_has_divider{will-change:transform}.et_pb_row>.box-shadow-overlay{z-index:8}
94.has-box-shadow-overlay{position:relative}.et_clickable{cursor:pointer}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important}.et_multi_view_hidden,.et_multi_view_hidden_image{display:none!important}@keyframes multi-view-image-fade{0%{opacity:0}10%{opacity:.1}20%{opacity:.2}30%{opacity:.3}40%{opacity:.4}50%{opacity:.5}60%{opacity:.6}70%{opacity:.7}80%{opacity:.8}90%{opacity:.9}to{opacity:1}}.et_multi_view_image__loading{visibility:hidden}.et_multi_view_image__loaded{-webkit-animation:multi-view-image-fade .5s;animation:multi-view-image-fade .5s}#et-pb-motion-effects-offset-tracker{visibility:hidden!important;opacity:0;position:absolute;top:0;left:0}.et-pb-before-scroll-animation{opacity:0}header.et-l.et-l--header:after{clear:both;display:block;content:""}.et_pb_module{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes fadeBottom{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeBottom{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeLeft{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeLeft{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeRight{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeRight{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeTop{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeTop{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.et-waypoint:not(.et_pb_counters){opacity:0}
94@media (min-width:981px){.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_column .et_pb_module.et-last-child,.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_column .et_pb_module:last-child,.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_row_inner .et_pb_column .et_pb_module.et-last-child,.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_row_inner .et_pb_column .et_pb_module:last-child,.et_pb_section div.et_pb_row .et_pb_column .et_pb_module.et-last-child,.et_pb_section div.et_pb_row .et_pb_column .et_pb_module:last-child{margin-bottom:0}}@media (max-width:980px){.et_overlay.et_pb_inline_icon_tablet:before,.et_pb_inline_icon_tablet:before{content:attr(data-icon-tablet)}.et_parallax_bg.et_parallax_bg_tablet_exist,.et_parallax_gradient.et_parallax_gradient_tablet_exist{display:none}.et_parallax_bg.et_parallax_bg_tablet,.et_parallax_gradient.et_parallax_gradient_tablet{display:block}.et_pb_column .et_pb_module{margin-bottom:30px}.et_pb_row .et_pb_column .et_pb_module.et-last-child,.et_pb_row .et_pb_column .et_pb_module:last-child,.et_section_specialty .et_pb_row .et_pb_column .et_pb_module.et-last-child,.et_section_specialty .et_pb_row .et_pb_column .et_pb_module:last-child{margin-bottom:0}.et_pb_more_button{display:inline-block!important}.et_pb_bg_layout_light_tablet.et_pb_button,.et_pb_bg_layout_light_tablet.et_pb_module.et_pb_button,.et_pb_bg_layout_light_tablet .et_pb_more_button{color:#2ea3f2}.et_pb_bg_layout_light_tablet .et_pb_forgot_password a{color:#666}.et_pb_bg_layout_light_tablet h1,.et_pb_bg_layout_light_tablet h2,.et_pb_bg_layout_light_tablet h3,.et_pb_bg_layout_light_tablet h4,.et_pb_bg_layout_light_tablet h5,.et_pb_bg_layout_light_tablet h6{color:#333!important}.et_pb_module .et_pb_bg_layout_light_tablet.et_pb_button{color:#2ea3f2!important}.et_pb_bg_layout_light_tablet{color:#666!important}.et_pb_bg_layout_dark_tablet,.et_pb_bg_layout_dark_tablet h1,.et_pb_bg_layout_dark_tablet h2,.et_pb_bg_layout_dark_tablet h3,.et_pb_bg_layout_dark_tablet h4,.et_pb_bg_layout_dark_tablet h5,.et_pb_bg_layout_dark_tablet h6{color:#fff!important}.et_pb_bg_layout_dark_tablet.et_pb_button,.et_pb_bg_layout_dark_tablet.et_pb_module.et_pb_button,.et_pb_bg_layout_dark_tablet .et_pb_more_button{color:inherit}.et_pb_bg_layout_dark_tablet .et_pb_forgot_password a{color:#fff}.et_pb_module.et_pb_text_align_left-tablet{text-align:left}.et_pb_module.et_pb_text_align_center-tablet{text-align:center}.et_pb_module.et_pb_text_align_right-tablet{text-align:right}.et_pb_module.et_pb_text_align_justified-tablet{text-align:justify}}@media (max-width:767px){.et_pb_more_button{display:inline-block!important}.et_overlay.et_pb_inline_icon_phone:before,.et_pb_inline_icon_phone:before{content:attr(data-icon-phone)}.et_parallax_bg.et_parallax_bg_phone_exist,.et_parallax_gradient.et_parallax_gradient_phone_exist{display:none}.et_parallax_bg.et_parallax_bg_phone,.et_parallax_gradient.et_parallax_gradient_phone{display:block}.et-hide-mobile{display:none!important}.et_pb_bg_layout_light_phone.et_pb_button,.et_pb_bg_layout_light_phone.et_pb_module.et_pb_button,.et_pb_bg_layout_light_phone .et_pb_more_button{color:#2ea3f2}.et_pb_bg_layout_light_phone .et_pb_forgot_password a{color:#666}.et_pb_bg_layout_light_phone h1,.et_pb_bg_layout_light_phone h2,.et_pb_bg_layout_light_phone h3,.et_pb_bg_layout_light_phone h4,.et_pb_bg_layout_light_phone h5,.et_pb_bg_layout_light_phone h6{color:#333!important}.et_pb_module .et_pb_bg_layout_light_phone.et_pb_button{color:#2ea3f2!important}.et_pb_bg_layout_light_phone{color:#666!important}.et_pb_bg_layout_dark_phone,.et_pb_bg_layout_dark_phone h1,.et_pb_bg_layout_dark_phone h2,.et_pb_bg_layout_dark_phone h3,.et_pb_bg_layout_dark_phone h4,.et_pb_bg_layout_dark_phone h5,.et_pb_bg_layout_dark_phone h6{color:#fff!important}.et_pb_bg_layout_dark_phone.et_pb_button,.et_pb_bg_layout_dark_phone.et_pb_module.et_pb_button,.et_pb_bg_layout_dark_phone .et_pb_more_button{color:inherit}.et_pb_module .et_pb_bg_layout_dark_phone.et_pb_button{color:#fff!important}.et_pb_bg_layout_dark_phone .et_pb_forgot_password a{color:#fff}.et_pb_module.et_pb_text_align_left-phone{text-align:left}.et_pb_module.et_pb_text_align_center-phone{text-align:center}.et_pb_module.et_pb_text_align_right-phone{text-align:right}.et_pb_module.et_pb_text_align_justified-phone{text-align:justify}}@media (max-width:479px){a.et_pb_more_button{display:block}}@media (min-width:768px) and (max-width:980px){[data-et-multi-view-load-tablet-hidden=true]:not(.et_multi_view_swapped){display:none!important}}@media (max-width:767px){[data-et-multi-view-load-phone-hidden=true]:not(.et_multi_view_swapped){display:none!important}}.et_pb_menu.et_pb_menu--style-inline_centered_logo .et_pb_menu__menu nav ul{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}@-webkit-keyframes multi-view-image-fade{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(1.01);transform:scale(1.01);opacity:1}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}
95/*# sourceURL=divi-style-parent-inline-inline-css */
96</style>
97<style id="divi-dynamic-critical-inline-css">
98@font-face{font-family:ETmodules;font-display:block;src:url(//deinperfectday.de/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.eot);src:url(//deinperfectday.de/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.eot?#iefix) format("embedded-opentype"),url(//deinperfectday.de/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.woff) format("woff"),url(//deinperfectday.de/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.ttf) format("truetype"),url(//deinperfectday.de/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.svg#ETmodules) format("svg");font-weight:400;font-style:normal}
99@media (min-width:981px){.et_pb_gutters3 .et_pb_column,.et_pb_gutters3.et_pb_row .et_pb_column{margin-right:5.5%}.et_pb_gutters3 .et_pb_column_4_4,.et_pb_gutters3.et_pb_row .et_pb_column_4_4{width:100%}.et_pb_gutters3 .et_pb_column_4_4 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_4_4 .et_pb_module{margin-bottom:2.75%}.et_pb_gutters3 .et_pb_column_3_4,.et_pb_gutters3.et_pb_row .et_pb_column_3_4{width:73.625%}.et_pb_gutters3 .et_pb_column_3_4 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_3_4 .et_pb_module{margin-bottom:3.735%}.et_pb_gutters3 .et_pb_column_2_3,.et_pb_gutters3.et_pb_row .et_pb_column_2_3{width:64.833%}.et_pb_gutters3 .et_pb_column_2_3 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_2_3 .et_pb_module{margin-bottom:4.242%}.et_pb_gutters3 .et_pb_column_3_5,.et_pb_gutters3.et_pb_row .et_pb_column_3_5{width:57.8%}.et_pb_gutters3 .et_pb_column_3_5 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_3_5 .et_pb_module{margin-bottom:4.758%}.et_pb_gutters3 .et_pb_column_1_2,.et_pb_gutters3.et_pb_row .et_pb_column_1_2{width:47.25%}.et_pb_gutters3 .et_pb_column_1_2 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_2 .et_pb_module{margin-bottom:5.82%}.et_pb_gutters3 .et_pb_column_2_5,.et_pb_gutters3.et_pb_row .et_pb_column_2_5{width:36.7%}.et_pb_gutters3 .et_pb_column_2_5 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_2_5 .et_pb_module{margin-bottom:7.493%}.et_pb_gutters3 .et_pb_column_1_3,.et_pb_gutters3.et_pb_row .et_pb_column_1_3{width:29.6667%}.et_pb_gutters3 .et_pb_column_1_3 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_3 .et_pb_module{margin-bottom:9.27%}.et_pb_gutters3 .et_pb_column_1_4,.et_pb_gutters3.et_pb_row .et_pb_column_1_4{width:20.875%}.et_pb_gutters3 .et_pb_column_1_4 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_4 .et_pb_module{margin-bottom:13.174%}.et_pb_gutters3 .et_pb_column_1_5,.et_pb_gutters3.et_pb_row .et_pb_column_1_5{width:15.6%}.et_pb_gutters3 .et_pb_column_1_5 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_5 .et_pb_module{margin-bottom:17.628%}.et_pb_gutters3 .et_pb_column_1_6,.et_pb_gutters3.et_pb_row .et_pb_column_1_6{width:12.0833%}.et_pb_gutters3 .et_pb_column_1_6 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_6 .et_pb_module{margin-bottom:22.759%}.et_pb_gutters3 .et_full_width_page.woocommerce-page ul.products li.product{width:20.875%;margin-right:5.5%;margin-bottom:5.5%}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products li.product,.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products li.product{width:28.353%;margin-right:7.47%}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-1 li.product,.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-1 li.product{width:100%;margin-right:0}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-2 li.product,.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-2 li.product{width:48%;margin-right:4%}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(2n+2),.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(2n+2){margin-right:0}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(3n+1),.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(3n+1){clear:none}}
100@media (min-width:981px){.et_pb_gutter.et_pb_gutters1 #left-area{width:75%}.et_pb_gutter.et_pb_gutters1 #sidebar{width:25%}.et_pb_gutters1.et_right_sidebar #left-area{padding-right:0}.et_pb_gutters1.et_left_sidebar #left-area{padding-left:0}.et_pb_gutter.et_pb_gutters1.et_right_sidebar #main-content .container:before{right:25%!important}.et_pb_gutter.et_pb_gutters1.et_left_sidebar #main-content .container:before{left:25%!important}.et_pb_gutters1 .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column{margin-right:0}.et_pb_gutters1 .et_pb_column_4_4,.et_pb_gutters1.et_pb_row .et_pb_column_4_4{width:100%}.et_pb_gutters1 .et_pb_column_4_4 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_4_4 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_3_4,.et_pb_gutters1.et_pb_row .et_pb_column_3_4{width:75%}.et_pb_gutters1 .et_pb_column_3_4 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_3_4 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_2_3,.et_pb_gutters1.et_pb_row .et_pb_column_2_3{width:66.667%}.et_pb_gutters1 .et_pb_column_2_3 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_2_3 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_3_5,.et_pb_gutters1.et_pb_row .et_pb_column_3_5{width:60%}.et_pb_gutters1 .et_pb_column_3_5 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_3_5 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_2,.et_pb_gutters1.et_pb_row .et_pb_column_1_2{width:50%}.et_pb_gutters1 .et_pb_column_1_2 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_2 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_2_5,.et_pb_gutters1.et_pb_row .et_pb_column_2_5{width:40%}.et_pb_gutters1 .et_pb_column_2_5 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_2_5 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_3,.et_pb_gutters1.et_pb_row .et_pb_column_1_3{width:33.3333%}.et_pb_gutters1 .et_pb_column_1_3 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_3 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_4,.et_pb_gutters1.et_pb_row .et_pb_column_1_4{width:25%}.et_pb_gutters1 .et_pb_column_1_4 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_4 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_5,.et_pb_gutters1.et_pb_row .et_pb_column_1_5{width:20%}.et_pb_gutters1 .et_pb_column_1_5 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_5 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_6,.et_pb_gutters1.et_pb_row .et_pb_column_1_6{width:16.6667%}.et_pb_gutters1 .et_pb_column_1_6 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_6 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_full_width_page.woocommerce-page ul.products li.product{width:25%;margin-right:0;margin-bottom:0}.et_pb_gutters1.et_left_sidebar.woocommerce-page #main-content ul.products li.product,.et_pb_gutters1.et_right_sidebar.woocommerce-page #main-content ul.products li.product{width:33.333%;margin-right:0}}@media (max-width:980px){.et_pb_gutters1 .et_pb_column,.et_pb_gutters1 .et_pb_column .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_row_1-2_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_1-4_1-4_1-2>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_1-5_1-5_3-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1 .et_pb_row_3-5_1-5_1-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1 .et_pb_row_4col>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_5col>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1.et_pb_row_1-2_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_1-4_1-4_1-2>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_1-5_1-5_3-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1.et_pb_row_3-5_1-5_1-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1.et_pb_row_4col>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_5col>.et_pb_column.et_pb_column_1_5{width:50%;margin-right:0}.et_pb_gutters1 .et_pb_row_1-2_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1 .et_pb_row_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1 .et_pb_row_1-6_1-6_1-6_1-2>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1 .et_pb_row_6col>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-2_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-6_1-6_1-6_1-2>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_6col>.et_pb_column.et_pb_column_1_6{width:33.333%;margin-right:0}.et_pb_gutters1 .et_pb_row_1-6_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-6_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6{width:50%;margin-right:0}}@media (max-width:767px){.et_pb_gutters1 .et_pb_column,.et_pb_gutters1 .et_pb_column .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column .et_pb_module{margin-bottom:0}}@media (max-width:479px){.et_pb_gutters1 .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column{margin:0!important}.et_pb_gutters1 .et_pb_column .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column .et_pb_module{margin-bottom:0}}
101.et_pb_widget{float:left;max-width:100%;word-wrap:break-word}.et_pb_widget a{text-decoration:none;color:#666}.et_pb_widget li a:hover{color:#82c0c7}.et_pb_widget ol li,.et_pb_widget ul li{margin-bottom:.5em}.et_pb_widget ol li ol li,.et_pb_widget ul li ul li{margin-left:15px}.et_pb_widget select{width:100%;height:28px;padding:0 5px}.et_pb_widget_area .et_pb_widget a{color:inherit}.et_pb_bg_layout_light .et_pb_widget li a{color:#666}.et_pb_bg_layout_dark .et_pb_widget li a{color:inherit}
102.widget_search .screen-reader-text,.et_pb_widget .wp-block-search__label{display:none}.widget_search input#s,.widget_search input#searchsubmit,.et_pb_widget .wp-block-search__input,.et_pb_widget .wp-block-search__button{padding:.7em;height:40px !important;margin:0;font-size:14px;
102line-height:normal !important;border:1px solid #ddd;color:#666}.widget_search #s,.et_pb_widget .wp-block-search__input{width:100%;border-radius:3px}.widget_search #searchform,.et_pb_widget .wp-block-search{position:relative}.widget_search #searchsubmit,.et_pb_widget .wp-block-search__button{background-color:#ddd;-webkit-border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;position:absolute;right:0;top:0}#searchsubmit,.et_pb_widget .wp-block-search__button{cursor:pointer}
103/*# sourceURL=divi-dynamic-critical-inline-css */
104</style>
105<link rel='stylesheet' id='trp-language-switcher-v2-css' href='https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/css/trp-language-switcher-v2.css?ver=3.3.7' media='all' />
106<link rel='stylesheet' id='perfectday-pages-css' href='https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/css/perfectday-pages.min.css?ver=0.28.1' media='all' />
107<link rel='stylesheet' id='child-style-css' href='https://deinperfectday.de/wp-content/themes/divi-child-Digelite_Webseite/style.css?ver=3.1.19' media='all' />
108<link rel='stylesheet' id='digelite-pixelmate-cookie-banner-css' href='https://deinperfectday.de/wp-content/themes/divi-child-Digelite_Webseite/barrierefreiheit/modules/pixelmate-cookie-banner/css/cookie-banner.css?ver=3.1.19' media='all' />
109<script id="jquery-core-js" src="https://deinperfectday.de/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 109
109
110<script id="jquery-migrate-js" src="https://deinperfectday.de/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 110
110
111<script id="jquery-js-before">
112window.digeliteKontrastNonce = "7e8b24fafe";window.digeliteAjaxUrl = "https:\/\/deinperfectday.de\/wp-admin\/admin-ajax.php";
113//# sourceURL=jquery-js-before
114</script>
vendor: 1 bytes, line 114
114
115<script id="jquery-js-after">
116jqueryParams.length&&$.each(jqueryParams,function(e,r){if("function"==typeof r){var n=String(r);n.replace("$","jQuery");var a=new Function("return "+n)();$(document).ready(a)}});
117(function () {
118    'use strict';
119
120    function announce(text) {
121        var region = document.getElementById('digelite-live-region');
122        if (!region || !text) return;
123        region.textContent = '';
124        // Kurze Verzögerung damit Screenreader die Änderung bemerken
125        setTimeout(function () { region.textContent = text; }, 80);
126    }
127
128    // DOM-Änderungen überwachen (nutzt zentralen digeliteDOMBus falls vorhanden)
129    function observeDOM() {
130        var config = { childList: true, subtree: true };
131
132        function handleMutations(mutations) {
133            mutations.forEach(function (m) {
134                m.addedNodes.forEach(function (node) {
135                    if (node.nodeType !== 1) return;
136
137                    // Divi-Popup geöffnet
138                    if (node.classList && node.classList.contains('et_pb_popup_overlay')) {
139                        var heading = node.querySelector('h1,h2,h3,h4,h5,h6');
140                        if (heading) announce(heading.textContent.trim());
141                    }
142
143                    // Formular-Fehlermeldungen (Formidable Forms, CF7, WooCommerce)
144                    var msgSelectors = [
145                        '.frm_error_style', '.wpcf7-response-output',
146                        '.woocommerce-message', '.woocommerce-error',
147                        '.woocommerce-info', '.gfield_validation_message'
148                    ];
149                    msgSelectors.forEach(function (sel) {
150                        if (node.matches && node.matches(sel)) {
151                            announce(node.textContent.trim());
152                        }
153                        var found = node.querySelector && node.querySelector(sel);
154                        if (found) announce(found.textContent.trim());
155                    });
156
157                    // Cookie-Banner Statusänderungen
158                    if (node.id === 'cookie-banner' || (node.classList && node.classList.contains('cookie-notice'))) {
159                        announce(node.textContent.trim().substring(0, 120));
160                    }
161                });
162            });
163        }
164
165        if (window.digeliteDOMBus && window.digeliteDOMBus.register) {
166            window.digeliteDOMBus.register(handleMutations);
167        } else {
168            var observer = new MutationObserver(handleMutations);
169            observer.observe(document.body || document.documentElement, config);
170        }
171    }
172
173    // CF7-Events
174    document.addEventListener('wpcf7:mailsent', function () {
175        var msg = document.querySelector('.wpcf7-response-output');
176        announce(msg ? msg.textContent.trim() : 'Formular erfolgreich gesendet.');
177    });
178    document.addEventListener('wpcf7:mailfailed', function () {
179        var msg = document.querySelector('.wpcf7-response-output');
180        announce(msg ? msg.textContent.trim() : 'Fehler beim Senden des Formulars.');
181    });
182    document.addEventListener('wpcf7:invalid', function () {
183        var msg = document.querySelector('.wpcf7-response-output');
184        announce(msg ? msg.textContent.trim() : 'Bitte überprüfe deine Eingaben.');
185    });
186
187    if (document.readyState === 'loading') {
188        document.addEventListener('DOMContentLoaded', observeDOM);
189    } else {
190        observeDOM();
191    }
192})();
193(function () {
194    'use strict';
195
196    // ── Hilfsfunktionen ──────────────────────────────────────────────
197
198    function parseRgb(str) {
199        if (!str || str === 'transparent') return null;
200        var m = str.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);
201        return m ? { r: +m[1], g: +m[2], b: +m[3] } : null;
202    }
203
204    function relativeLuminance(c) {
205        var vals = [c.r, c.g, c.b].map(function (v) {
206            v /= 255;
207            return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
208        });
209        return 0.2126 * vals[0] + 0.7152 * vals[1] + 0.0722 * vals[2];
210    }
211
212    function contrastRatio(c1, c2) {
213        var l1 = relativeLuminance(c1);
214        var l2 = relativeLuminance(c2);
215        var lighter = Math.max(l1, l2);
216        var darker  = Math.min(l1, l2);
217        return (lighter + 0.05) / (darker + 0.05);
218    }
219
220    // Effektive Hintergrundfarbe ermitteln (Elternkette durchlaufen)
221    function getEffectiveBg(el) {
222        var node = el;
223        while (node && node !== document.documentElement) {
224            var bg = window.getComputedStyle(node).backgroundColor;
225            var c  = parseRgb(bg);
226            if (c) return c;
227            node = node.parentElement;
228        }
229        return { r: 255, g: 255, b: 255 }; // Fallback: weiß
230    }
231
232    // ── Scan ─────────────────────────────────────────────────────────
233
234    function runContrastScan() {
235        var issues  = [];
236        var sel     = 'p, h1, h2, h3, h4, h5, h6, a, li, td, th, span, label, button';
237        var els     = document.querySelectorAll(sel);
238
239        els.forEach(function (el) {
240            // Nur sichtbare, nicht-leere Elemente
241            if (!el.offsetParent || !el.textContent.trim()) return;
242
243            var style    = window.getComputedStyle(el);
244            var fg       = parseRgb(style.color);
245            if (!fg) return;
246
247            var bg       = getEffectiveBg(el);
248            var ratio    = contrastRatio(fg, bg);
249
250            var fontSize = parseFloat(style.fontSize);
251            var isBold   = parseInt(style.fontWeight, 10) >= 700;
252            var isLarge  = fontSize >= 18.67 || (isBold && fontSize >= 14);
253            var required = isLarge ? 3.0 : 4.5;
254
255            if (ratio < required) {
256                issues.push({
257                    selector: el.tagName.toLowerCase() +
258                              (el.id ? '#' + el.id : '') +
259                              (el.className ? '.' + el.className.trim().split(/\s+/).join('.') : ''),
260                    text:     el.textContent.trim().substring(0, 60),
261                    ratio:    +ratio.toFixed(2),
262                    required: required,
263                    url:      window.location.href
264                });
265            }
266        });
267
268        return issues;
269    }
270
271    // ── Ergebnisse ans Backend schicken ──────────────────────────────
272
273    function reportIssues(issues) {
274        if (!issues.length || typeof window.digeliteKontrastNonce === 'undefined') return;
275
276        var fd = new FormData();
277        fd.append('action',  'digelite_kontrast_report');
278        fd.append('nonce',   window.digeliteKontrastNonce);
279        fd.append('issues',  JSON.stringify(issues));
280
281        fetch(window.digeliteAjaxUrl || '/wp-admin/admin-ajax.php', {
282            method: 'POST',
283            body:   fd,
284            credentials: 'same-origin'
285        }).catch(function () {});
286    }
287
288    // Nach vollständigem Seitenaufbau scannen
289    function init() {
290        var issues = runContrastScan();
291        if (issues.length) reportIssues(issues);
292        // Globale API für manuellen Aufruf
293        window.digeliteKontrastScanner = { scan: runContrastScan, report: reportIssues };
294    }
295
296    if (document.readyState === 'loading') {
297        document.addEventListener('DOMContentLoaded', init);
298    } else {
299        init();
300    }
301})();
302//# sourceURL=jquery-js-after
303</script>
vendor: 1 bytes, line 303
303
304<script id="pixelmate-public-js-js-extra">
305var js_options = {"google_fonts":[],"flexTracking":[],"flexWerbung":[],"flexNotwendig":[],"flexSonstige":[],"webinaris":"","webinaris_load":"0","pixelmate_script":"0","pixelmate_script_code_head":"","pixelmate_script_code_body":"","pixelmate_script_code_footer":"","pixelmate_script_stats":"0","pixelmate_script_code_head_stats":"","pixelmate_script_code_body_stats":"","pixelmate_script_code_footer_stats":"","pixelmate_tag_manager":"0","pixelmate_gtm":"GTM-0000000","domain":"de","full_domain":"https://deinperfectday.de","wpmllang":"no-wpml","gen_banner_aktiv":"","gen_banner_delay":"0","gen_individuell":" ","gen_heading":" ","gen_text":" ","gen_allow_text":" ","gen_single_text":" ","gen_deny_text":" ","gen_dse_text":"Datenschutz","gen_impressum_text":"Impressum","speicherdauer_der_cookies":"14","cookies_secure":"0","alt_track":"0","pix_settings_check":null,"pix_settings_uberschrift":"Cookie Einstellungen","pix_settings_hinweis_dse":"Hier k\u00f6nnen die auf dieser Website verwendeten externen Dienste eingesehen und einzeln zugelassen/abgelehnt werden.","pix_settings_notwendige_c":"nur notwendige Cookies akzeptieren","pix_settings_notwendige_c_text":"","pix_settings_statistik":"Statistik Cookies akzeptieren","pix_settings_statistik_text":"","pix_settings_statistik_aus":null,"pix_settings_werbung":"Marketing Cookies akzeptieren","pix_settings_werbung_text":"","pix_settings_werbung_aus":null,"pix_settings_videos":"Externe Medien akzeptieren","pix_settings_videos_text":"","pix_settings_videos_aus":null,"pix_settings_sonstige":"Sonstigen externen Content akzeptieren","pix_settings_sonstige_text":"","pix_settings_sonstige_aus":null,"pix_settings_speichern_button":"speichern","pix_settings_more":"mehr","pix_settings_dse_ex":"Datenschutzerkl\u00e4rung","design_pos":"Unten (volle Breite)","elmentor_popup_id":"","pixelmate_logo_check":"0","pixelmate_logo":"","banner_padding_oben":"24","box_margin":"0px 0px 0px 0px","box_border_width":"0px 0px 0px 0px","box_border_style":"solid","box_border_color":"#ffffff","box_padding":"24px 24px 24px 24px","box_border_radius":"4px 4px 4px 4px","box_bg_color":"#ffffff","box_color_title":"#212121","box_color_text":"#212121","box_bg_verlauf":"0","box_bg_verlauf_1":"#ffffff","box_bg_verlauf_2":"#ffffff","box_shadow":"1","box_shadow_h":"5","box_shadow_v":"5","box_shadow_blur":"15","box_shadow_color":"#eee","box_h_font_size":"19","box_font_size":"12","box_line_height":"1","pixelmate_text_align":"left","cb_aktiv":"1","cb_position":"unten links","cb_font_size":"14","cb_background":"#00a3ad","cb_color":"#ffffff","cb_important":"1","btn_bg_color":"#00a3ad","btn_color":"#ffffff","btn_border_color":"rgba(0,0,0,0.06)","btn_border_width":"0","btn_border_radius":"4","btn_deny_bg_color":"#ffffff","btn_deny_color":"#212121","btn_deny_border_color":"#212121","btn_deny_border_width":"1","btn_deny_border_radius":"4","btn_set_bg_color":"#ffffff","btn_set_color":"#555555","btn_set_border_color":"#212121","btn_set_border_width":"1","btn_set_border_radius":"4","ga":"0","gaText":null,"gaId":"UA-000000","ga2":null,"gaId2":null,"gaAno":"1","google_optimize_aktivieren":"0","google_optimize_id":"000000","ga_cookie_duration":"730","ga_cookies_ssl":"0","media_youtube":"1","media_youtube_text":"YouTube ist eine Videohosting Plattform. Durch die externe Einbindung von Videos werden personenbezogene Daten an YouTube \u00fcbermittelt.","media_vimeo":"0","media_vimeo_text":"Vimeo ist eine Videohosting Plattform. Durch die externe Einbindung von Videos werden personenbezogene Daten an Vimeo \u00fcbermittelt.","media_twitter":"0","media_twitter_text":"Twitter ist ein Nachrichtendienst. Durch das einbetten von Twitter Beitr\u00e4gen auf unserer Website werden personenbezogene Daten an Twitter \u00fcbermittelt.","media_gmaps":"1","media_gmaps_text":"Wir haben auf unserer Website interaktive Karten mit Hilfe von Google Maps der Google LLC. (\u201eGoogle\u201c) integriert. Die Karten werden nur angezeigt, wenn Sie dem Setzen und Auslesen von Cookies durch Google zustimmen. Dadurch k\u00f6nnen personenbezogene Daten an Google \u00fcbermittelt werden.","media_osm":"0","media_osm_text":"Durch die Einbettung von Google Maps auf unserer Website werden personenbezogene Daten an Google \u00fcbermittelt.","media_calendly":"0","media_calendly_text":"Calendly ist Buchungstool. Durch die Einbettung auf unserer Website werden personenbezogene Daten an Calendly \u00fcbermittelt.","media_xing_events":"0","media_xing_events_text":"Durch die Einbettung von Xing werden personenbezogene Daten an Xing \u00fcbermittelt.","media_libsyn":"0","media_libsyn_text":"Durch die Einbettung des Podcast Players von Libsyn werden personenbezogene Daten an Libsyn \u00fcbermittelt.","media_trustindex":"0","media_trustindex_text":"Durch die Einbettung der Google Reviews werden Daten an Trustindex.io \u00fcbermittelt.","media_recaptcha":"0","media_recaptcha_text":"ReCaptcha muss auf unserer Website geladen werden, um Kontaktanfragen zu versenden.","dse_extern":"","dse_extern_url":null,"impressum_extern":"","impressum_extern_url":null,"fb":"0","fbText":null,"fbId":"00000000","fb_opt_out":"","fb_consent_mode":"","csp":"1","csp_admin":"","youtubeIn":"1","youtubeHeading":null,"youtubeText":null,"vimeoIn":null,"vimeoHeading":null,"vimeoText":null,"wlVimeo":"0","wlYoutube":"0","wlGmaps":"0","wlReCaptcha":"0","dse":"https://deinperfectday.de/agb/privacy-policy/","impressum":"https://deinperfectday.de/agb/impressum/","protokoll":"","txt_cookie_banner_heading":"Wir verwenden Cookies","txt_cookie_banner":"Wir nutzen auf unserer Webseite Cookies. Einige Cookies sind n
305otwendig (z.B. f\u00fcr den Warenkorb) andere sind nicht notwendig. Die nicht-notwendigen Cookies helfen uns bei der Optimierung unseres Online-Angebotes, unserer Webseitenfunktionen und werden f\u00fcr Marketingzwecke eingesetzt.\nDie Einwilligung umfasst die Speicherung von Informationen auf Ihrem Endger\u00e4t, das Auslesen personenbezogener Daten sowie deren Verarbeitung. \nKlicken Sie auf \u201eAlle akzeptieren\u201c, um in den Einsatz von nicht notwendigen Cookies einzuwilligen oder auf \u201eAlle ablehnen\u201c, wenn Sie sich anders entscheiden.\nSie k\u00f6nnen unter \u201eEinstellungen verwalten\u201c detaillierte Informationen der von uns eingesetzten Arten von Cookies erhalten und deren Einstellungen aufrufen. \nSie k\u00f6nnen die Einstellungen jederzeit aufrufen und Cookies auch nachtr\u00e4glich jederzeit abw\u00e4hlen (z.B. in der Datenschutzerkl\u00e4rung oder unten auf unserer Webseite).","txt_btn_allow":"Alle akzeptieren","txt_btn_deny":"Alle ablehnen","txt_btn_settings":"Einstellungen","txt_datenschutz":"Datenschutz","txt_impressum":"Impressum","txt_datenschutz_hinweis":"Mehr Informationen zu den verwendeten Diensten auf dieser Website stehen in der Datenschutzerkl\u00e4rung.","txt_allow":"Akzeptieren","txt_youtube_heading":"YouTube aktivieren?","txt_youtube_content":"YouTube Videos k\u00f6nnen nur angezeigt werden, wenn Cookies gesetzt werden d\u00fcrfen.","txt_youtube_footer":"Wenn YouTube f\u00fcr diese Website aktiviert wurde, werden Daten an YouTube \u00fcbermittelt und ausgewertet. Mehr dazu in der Datenschutzerkl\u00e4rung von YouTube:","txt_vimeo_heading":"Vimeo aktivieren?","txt_vimeo_content":"Vimeo Videos k\u00f6nnen nur angezeigt werden, wenn Cookies gesetzt werden d\u00fcrfen.","txt_vimeo_footer":"Wenn Vimeo auf dieser Website aktiviert wird, werden personenbezogene Daten zu Vimeo \u00fcbermittelt und ausgewertet. Mehr dazu in der Vimeo Datenschutzerkl\u00e4rung: ","txt_gmaps_heading":"Google Maps aktivieren?","txt_gmaps_content":"Google Maps kann nur aktiviert werden, wenn Cookies gesetzt werden d\u00fcrfen.","txt_gmaps_footer":"Wenn Google Maps aktiviert wurde, werden personenbezogene Daten an Google gesendet und verarbeitet. Mehr dazu in der Datenschutzerkl\u00e4rung von Google:","txt_osm_heading":"Open Street Maps aktivieren?","txt_osm_content":"Hier w\u00fcrden wir gerne eine Karte von Open Street Maps anzeigen und daf\u00fcr Cookies setzen. ","txt_osm_footer":"Wenn Open Street Maps f\u00fcr diese Seite aktiviert ist, werden personenbezogene Daten an openstreetmap.de \u00fcbermittelt und verarbeitet. Weitere Informationen findest du in den Datenschutzbestimmungen von OpenStreetMap: ","txt_twitter_heading":"Twitter aktivieren?","txt_twitter_content":"Hier w\u00fcrden wir gerne Inhalte von Twitter anzeigen.","txt_twitter_footer":"Wenn diese Inhalte auf dieser Website geladen werden d\u00fcrfen, wird eine externe Verbindung zu Twitter hergestellt und es k\u00f6nnen Cookies gesetzt werden.","txt_libsyn_heading":"Libsyn Podcast aktivieren?","txt_libsyn_content":"Hier w\u00fcrden wir gerne den Podcast Player von Libsyn anzeigen. Dazu m\u00fcssen Cookies gesetzt werden und es wird eine externe Verbindung zu Libsyn.com aufgebaut.","txt_libsyn_footer":"Wenn der Podcast Player von Libsyn.com aktiviert wird, werden personenbezogene Daten an Libsyn gesendet und verarbeitet. Mehr dazu findest du hier:","txt_trustindex_heading":"Google Reviews anzeigen?","txt_trustindex_content":"An dieser Stelle w\u00fcrden wir gerne Google Reviews einblenden. Daf\u00fcr muss eine Verbindung zu trustindex.io hergestellt werden.","txt_trustindex_footer":"F\u00fcr mehr Informationen findest du die Datenschutzerkl\u00e4rung von trustindex.io ","txt_here":"hier","txt_more":"mehr erfahren","calendly_h2":"Jetzt buchen","calendly_text":"F\u00fcr Buchungen nutzen wir das externe Tool Calendly. Wenn es aktiviert wird, werden personenbezogene Daten an Calendly \u00fcbermittelt und verarbeitet. ","calendly_btn":"weiter","xing_h2":"Xing Events anzeigen","xing_text":"Um Xing Events auf dieser Website anzeigen zu k\u00f6nnen, m\u00fcssen Cookies gesetzt werden.","xing_btn":"weiter","issingle":"no","pixe_test":{"margin":"0px 0px 0px 0px","border":"0px solid ","padding":"12px 24px 24px 24px","border-radius":"5px","margin-top":"0px","margin-right":"0px","margin-bottom":"0px","margin-left":"0px","border-top":"0px","border-right":"0px","border-bottom":"0px","border-left":"0px","padding-top":"12px","padding-right":"24px","padding-bottom":"24px","padding-left":"24px","background-color":"#ffffff","border-color":"","color":"#0a0a0a","border-style":"solid","border-top-left-radius":"4px","border-bottom-left-radius":"4px","border-top-right-radius":"4px","border-bottom-right-radius":"4px"},"client_ip":"85.13.130.39","wpml_exists":"0","sprachumschalter_aktivieren":"0","ajaxurl":"https://deinperfectday.de/wp-admin/admin-ajax.php","nonce":"cb0edcae06","elementor":"false","divi_builder":"true"};
306//# sourceURL=pixelmate-public-js-js-extra
307</script>
vendor: 1 bytes, line 307
307
308<script type="module" async src="https://deinperfectday.de/wp-content/plugins/pixelmate/public//assets/js/dist/bundle.js?ver=1.0.0"></script>
308<script id="wp-optimize-send-command-js" src="https://deinperfectday.de/wp-content/plugins/wp-optimize-premium/js/send-command-4-4-1.min.js?ver=4.4.1.1790823679"></script>
vendor: 1 bytes, line 308
308
309<script id="wp-optimize-lazy-load-js" src="https://deinperfectday.de/wp-content/plugins/wp-optimize-premium/js/wpo-lazy-load-4-4-1.min.js?ver=4.4.1.1790823679"></script>
vendor: 1 bytes, line 309
309
310<script id="trp-language-switcher-js-v2-js" src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/js/trp-frontend-language-switcher.js?ver=3.3.7"></script>
310
311<link rel="https://api.w.org/" href="https://deinperfectday.de/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://deinperfectday.de/wp-json/wp/v2/pages/233283" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://deinperfectday.de/xmlrpc.php?rsd" />
312
313<link rel="canonical" href="https://deinperfectday.de/anbieter-shop-anbindung/" />
314<link rel='shortlink' href='https://deinperfectday.de/?p=233283' />
315<link rel="alternate" hreflang="de-DE" href="https://deinperfectday.de/anbieter-shop-anbindung/"/>
316<link rel="alternate" hreflang="en-GB" href="https://deinperfectday.de/en/anbieter-shop-anbindung/"/>
317<link rel="alternate" hreflang="es-ES" href="https://deinperfectday.de/es/anbieter-shop-anbindung/"/>
318<link rel="alternate" hreflang="ru-RU" href="https://deinperfectday.de/ru/anbieter-shop-anbindung/"/>
319<link rel="alternate" hreflang="tr-TR" href="https://deinperfectday.de/tr/anbieter-shop-anbindung/"/>
320<link rel="alternate" hreflang="de" href="https://deinperfectday.de/anbieter-shop-anbindung/"/>
321<link rel="alternate" hreflang="en" href="https://deinperfectday.de/en/anbieter-shop-anbindung/"/>
322<link rel="alternate" hreflang="es" href="https://deinperfectday.de/es/anbieter-shop-anbindung/"/>
323<link rel="alternate" hreflang="ru" href="https://deinperfectday.de/ru/anbieter-shop-anbindung/"/>
324<link rel="alternate" hreflang="tr" href="https://deinperfectday.de/tr/anbieter-shop-anbindung/"/>
325<style>
326/* ----------------------------------------
327   TOOLTIP BASIS
328----------------------------------------- */
329.bf-tooltip {
330    position: absolute;
331    right: 55px;
332    background: #333;
333    color: white;
334    padding: 6px 10px;
335    font-size: 14px;
336    border-radius: 6px;
337    white-space: nowrap;
338    opacity: 0;
339    pointer-events: none;
340    transform: translateY(0);
341    transition: opacity .2s ease, transform .2s ease;
342    z-index: 9999999;
343}
344
345/* Tooltip sichtbar bei HOVER */
346.bf-fixed-nav__btn:hover .bf-tooltip {
347    opacity: 1;
348    transform: translateY(-2px);
349}
350
351/* Tooltip Pfeil */
352.bf-tooltip::after {
353    content: "";
354    position: absolute;
355    top: 50%;
356    right: -6px;
357    transform: translateY(-50%);
358    width: 0;
359    height: 0;
360    border-top: 6px solid transparent;
361    border-bottom: 6px solid transparent;
362    border-left: 6px solid #333;
363}
364
365/* ----------------------------------------
366   BEHÄLTER
367----------------------------------------- */
368.bf-fixed-nav {
369    position: fixed;
370    top: 50%;
371    right: 5px;
372    transform: translateY(-50%);
373    display: flex;
374    flex-direction: column;
375    gap: .75rem;
376    z-index: 999999;
377}
378
379/* ----------------------------------------
380   BUTTON STANDARD
381----------------------------------------- */
382.bf-fixed-nav__btn {
383    position: relative;
384    background: #ffffff !important;
385    border: 1px solid #f5f5f5 !important;
386    color: #333333 !important;
387    border-radius: 15%;
388    width: 48px;
389    height: 48px;
390    padding: 0;
391    font-size: 22px;
392    cursor: pointer;
393    display: flex;
394    align-items: center;
395    justify-content: center;
396}
397
398.bf-fixed-nav__btn:hover {
399    background: #f2f2f2!important;
400}
401
402.bf-fixed-nav__btn:focus-visible {
403    outline: 3px solid #333;
404    outline-offset: 3px;
405}
406
407/* ----------------------------------------
408   ACCESS ICON
409----------------------------------------- */
410.bf-icon-access {
411    background:#333333 !important;
412    border:none !important;
413}
414
415.bf-icon-access:hover {
416    background:#333333 !important;
417}
418
419.bf-access-img {
420    width: 28px;
421    height: 28px;
422    filter: invert(1);
423}
424
425/* ----------------------------------------
426   KI Leichte Sprache: Zustands-Styles
427----------------------------------------- */
428/* Aktiv: auf /leicht/-Seite – grüner Rahmen */
429.bf-fixed-nav__btn.bf-leicht-on {
430    border: 2px solid #4caf50 !important;
431    box-shadow: 0 0 0 2px rgba(76,175,80,0.3) !important;
432    text-decoration: none;
433}
434/* Nicht verfügbar: ausgegraut */
435.bf-fixed-nav__btn.bf-leicht-pending {
436    opacity: 0.4;
437    cursor: not-allowed;
438}
439/* <a>-Button hat dieselbe Optik wie <button> */
440a.bf-fixed-nav__btn {
441    display: flex;
442    align-items: center;
443    justify-content: center;
444    text-decoration: none;
445    color: inherit;
446}
447
448/* ----------------------------------------
449   DUPLIKAT-SCHUTZ
450   Wenn Plugin UND Child-Theme gleichzeitig laufen, wird jede
451   zweite (und folgende) .bf-fixed-nav ausgeblendet.
452----------------------------------------- */
453.bf-fixed-nav ~ .bf-fixed-nav {
454    display: none !important;
455}
456
457/* ----------------------------------------
458   MOBILE — horizontale Bottom-Bar
459   Unter allen anderen Fixed-Elementen (z-index 9000 < Panel 999998).
460   Body bekommt padding-bottom damit kein Inhalt verdeckt wird.
461----------------------------------------- */
462@media (max-width: 1024px) {
463
464    /* Menü-Button ausblenden */
465    .bf-btn-menu {
466        display: none !important;
467    }
468
469    /* Neu: volle Breite, Boden, horizontal */
470    .bf-fixed-nav {
471        top: auto !important;
472        bottom: 0 !important;
473        left: 0 !important;
474        right: 0 !important;
475        transform: none !important;
476        flex-direction: row !important;
477        justify-content: stretch !important;
478        align-items: stretch !important;
479        width: 100% !important;
480        gap: 0 !important;
481        padding: 0 !important;
482        /* iPhone-Notch / Home-Indicator */
483        padding-bottom: env(safe-area-inset-bottom, 0px) !important;
484        background: #ffffff !important;
485        border-top: 1px solid #e8e8e8 !important;
486        box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.10) !important;
487        border-radius: 0 !important;
488        /* Unter anderen Fixed-Elementen (Frontend-Panel: 999998, Barrierefreiheit-Trigger: 999999) */
489        z-index: 9000 !important;
490    }
491
492    /* Buttons als gleichgroße Felder — füllen die volle Breite */
493    .bf-fixed-nav__btn {
494        flex: 1 1 0 !important;
495        width: auto !important;
496        height: 56px !important;
497        min-height: 56px !important;
498        font-size: 22px !important;
499        border-radius: 0 !important;
500        border: none !important;
501        border-right: 1px solid #e8e8e8 !important;
502        flex-shrink: 1;
503    }
504
505    /* Letzter Button: kein rechter Trennstrich */
506    .bf-fixed-nav__btn:last-child {
507        border-right: none !important;
508    }
509
510    .bf-access-img {
511        width: 26px !important;
512        height: 26px !important;
513    }
514
515    /* Tooltips auf Mobile ausblenden */
516    .bf-tooltip {
517        display: none !important;
518    }
519}
520
521/* Seiteninhalt nicht von Bottom-Bar verdecken lassen */
522@media (max-width: 1024px) {
523    body {
524        padding-bottom: max(56px, calc(56px + env(safe-area-inset-bottom, 0px))) !important;
525    }
526}
527
528
529/* =========================================================
530   BUDDYBOSS: Feinnavigation (Sektion hoch / runter) ausblenden
531   Begründung:
532   - BuddyBoss rendert Inhalte meist in EINER Sektion
533   - Section-Sprünge sind dort semantisch sinnlos
534========================================================= */
535
536/* BuddyBoss typische Body-Klassen */
537/* =========================================================
538   BUDDYBOSS – FEINNAVIGATION NUR AUF SYSTEMSEITEN AUSBLENDEN
539   (Profile, Gruppen, Activity, Mitglieder)
540========================================================= */
541
542/* BuddyBoss: User-Profil */
543body.bp-user
544.bf-fixed-nav__btn[data-digilite-nav="up"],
545body.bp-user
546.bf-fixed-nav__btn[data-digilite-nav="down"],
547
548/* BuddyBoss: Gruppen (Single + Listen) */
549body.groups
550.bf-fixed-nav__btn[data-digilite-nav="up"],
551body.groups
552.bf-fixed-nav__btn[data-digilite-nav="down"],
553
554/* BuddyBoss: Activity Stream */
555body.activity
556.bf-fixed-nav__btn[data-digilite-nav="up"],
557body.activity
558.bf-fixed-nav__btn[data-digilite-nav="down"],
559
560/* BuddyBoss: Mitgliederverzeichnis */
561body.members
562.bf-fixed-nav__btn[data-digilite-nav="up"],
563body.members
564.bf-fixed-nav__btn[data-digilite-nav="down"] {
565    display: none !important;
566}
567
568
569</style>
570    <style id="digelite-ki-leicht-css">
571    .dkl-bar {
572        display: flex;
573        align-items: center;
574        gap: 12px;
575        flex-wrap: wrap;
576        padding: 10px 16px;
577        margin-bottom: 20px;
578        background: #f0f7ff;
579        border-left: 4px solid #2271b1;
580        border-radius: 4px;
581        font-size: 14px;
582        color: #1d2327;
583    }
584    .dkl-bar--active {
585        background: #e8f5e9;
586        border-left-color: #4caf50;
587    }
588    .dkl-bar a { color: #2271b1; text-decoration: none; }
589    .dkl-bar a:hover { text-decoration: underline; }
590    .dkl-switch-btn {
591        display: inline-block;
592        padding: 6px 14px;
593        background: #2271b1;
594        color: #fff !important;
595        border-radius: 3px;
596        font-size: 13px;
597        text-decoration: none !important;
598        cursor: pointer;
599    }
600    .dkl-switch-btn:hover { background: #135e96; }
601    .dkl-switch-btn--na {
602        background: #aaa;
603        cursor: default;
604    }
605    /* ── Vereinfachter Text (Panel) ─────────────────────────────── */
606    .dkl-content {
607        line-height: 1.65;
608        font-size: 1.05em;
609        padding: 24px 28px;
610        margin: 0 0 32px;
611        background: #f9fafb;
612        border: 1px solid #e2e8f0;
613        border-left: 5px solid #4caf50;
614        border-radius: 6px;
615    }
616    .dkl-content p  { margin-bottom: 0.8em; max-width: 65ch; }
617    .dkl-content h2 { font-size: 1.3em; font-weight: 700; margin: 1.2em 0 0.4em; line-height: 1.3; }
618    .dkl-content h3 { font-size: 1.1em; font-weight: 600; margin: 1.0em 0 0.3em; line-height: 1.3; }
619    .dkl-content ul, .dkl-content ol { margin: 0 0 0.8em 1.4em; }
620    .dkl-content li { margin-bottom: 0.3em; max-width: 65ch; }
621
622    /* Sprung-Link zum Originalinhalt */
623    .dkl-skip-to-original { margin-top: 1.4em !important; padding-top: 1em; border-top: 1px solid #e2e8f0; }
624    .dkl-skip-to-original a { color: #4caf50 !important; font-size: 0.9em; text-decoration: none; }
625    .dkl-skip-to-original a:hover { text-decoration: underline; }
626
627    /* Originalinhalt-Wrapper: dezente visuelle Trennung */
628    .dkl-original-wrapper {
629        margin-top: 8px;
630        padding-top: 4px;
631        border-top: 2px dashed #e2e8f0;
632    }
633
634    /* ── Vereinfachter Text direkt in Design-Sektionen ───────────── */
635    /* Erbt Farbe/Schrift der Sektion — nur Abstände und max-width */
636    .dkl-section-content {
637        max-width: 65ch;
638        padding-left: 4px;
639        margin-bottom: 1.2rem;
640    }
641    .dkl-section-content h2 { font-size: 1.4em; font-weight: 700; margin: 0 0 0.5em; line-height: 1.3; }
642    .dkl-section-content h3 { font-size: 1.15em; font-weight: 600; margin: 0.8em 0 0.3em; line-height: 1.3; }
643    .dkl-section-content p  { margin: 0 0 0.75em; line-height: 1.65; }
644    .dkl-section-content ul, .dkl-section-content ol { margin: 0 0 0.75em 1.4em; }
645    .dkl-section-content li { margin-bottom: 0.3em; }
646
647    /* In Divi-Textmodulen: Schriftgröße des Moduls dominiert */
648    .et_pb_text .dkl-content { padding: 12px 16px; font-size: 1.0em; }
649    .et_pb_text .dkl-content h2,
650    .et_pb_text .dkl-content h3 { font-size: 1.05em; font-weight: 700; margin: 0.8em 0 0.3em; line-height: 1.4; }
651    .et_pb_text .dkl-skip-to-original { display: none; } /* Kein Sprung-Link in Divi-Modulen */
652    .dkl-notice {
653        padding: 16px 20px;
654        background: #fff8e1;
655        border-left: 4px solid #ffc107;
656        border-radius: 4px;
657        margin-bottom: 20px;
658        font-size: 15px;
659    }
660    .dkl-notice p { margin: 0 0 8px; }
661    .dkl-notice p:last-child { margin: 0; }
662    </style>
663    
664<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https://deinperfectday.de/"},{"@type":"ListItem","position":2,"name":"Für Anbieter","item":"https://deinperfectday.de/anbieter/"},{"@type":"ListItem","position":3,"name":"Shop-Anbindung","item":"https://deinperfectday.de/anbieter-shop-anbindung/"}]},{"@type":"Service","name":"Perfect Day Shop-Anbindung","description":"Anbindung des eigenen Webshops an die Perfect-Day-Plattform — automatischer Code-Versand bei jeder Coupon-Bestellung.","provider":{"@type":"Organization","name":"Perfect Day"},"areaServed":"DE"},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Was kostet die Shop-Anbindung?","acceptedAnswer":{"@type":"Answer","text":"Nichts extra. Die Anbindung ist Teil deiner Plattform-Mitgliedschaft — du zahlst keine zusätzliche Gebühr für den Webhook oder den automatischen Code-Versand."}},{"@type":"Question","name":"Brauche ich eigenes Tech-Wissen?","acceptedA
664nswer":{"@type":"Answer","text":"Kommt aufs Shop-System an. Bei WooCommerce reicht ein Plugin-Klick. Bei Shopify richtest du einen Workflow ein. Bei Shopware, Magento und PrestaShop solltest du einen Entwickler zur Hand haben — oder unseren Setup-Service nutzen. Der Tech-Aufwand steht als Punkte-Indikator an jeder Shop-Karte."}},{"@type":"Question","name":"Wie schnell bekommt mein Kunde die Codes?","acceptedAnswer":{"@type":"Answer","text":"Typisch 5–15 Sekunden nach der bezahlten Bestellung. Der Kunde bekommt eine E-Mail mit den Aktivierungs-Codes und einem Druck-Link."}},{"@type":"Question","name":"Was passiert bei einer Stornierung im Shop?","acceptedAnswer":{"@type":"Answer","text":"Aktuell deaktivierst du den Code in dem Fall manuell im Plattform-Backoffice. Ein automatischer Refund-Webhook ist auf der Roadmap."}},{"@type":"Question","name":"Können meine Codes mehrfach genutzt werden?","acceptedAnswer":{"@type":"Answer","text":"Nein. Jeder Aktivierungs-Code ist genau einmal einlösbar. Bei Teilzahlungs-Coupons bleibt ein eventuelles Restguthaben dem selben Code erhalten."}},{"@type":"Question","name":"Ich nutze einen exotischen Shop — geht das trotzdem?","acceptedA
664nswer":{"@type":"Answer","text":"Ja. Solange dein Shop Webhooks oder eine Bestell-API hat, kannst du ihn über die generische Bridge anbinden — z. B. mit einem kleinen Code-Snippet oder einem Automatisierungs-Dienst. Siehe die Anleitung „Andere Shops\"."}}]}]}</script>
664
665
666<style id="digelite-color-contrast-fix">
667/* =============================================================
668   Digelite Color-Contrast-Fix
669   ----------------------------------------------------------
670   #757575 auf #f5f7f8 = 4.28:1 (WCAG AA-FAIL).
671   Korrektur: #595959 = 6.98:1 auf #f5f7f8 (AA + AAA PASS).
672   Selektoren: Divi-Textblöcke und Blockquotes — NUR auf Light-Layout.
673   ============================================================= */
674
675/* Standard-Fließtext in Divi-Textmodulen (Light-Layout) */
676.et_pb_bg_layout_light .et_pb_text_inner p,
677.et_pb_bg_layout_light .et_pb_text_inner li,
678.et_pb_bg_layout_light .et_pb_text_inner blockquote p,
679.et_pb_bg_layout_light .et_pb_text_inner blockquote {
680    color: #595959;
681}
682
683/* Fett-Auszeichnungen in denselben Blöcken (Light-Layout) */
684.et_pb_bg_layout_light .et_pb_text_inner p strong,
685.et_pb_bg_layout_light .et_pb_text_inner p b,
686.et_pb_bg_layout_light .et_pb_text_inner blockquote strong {
687    color: #595959;
688}
689
690/* BuddyBoss: gleiche Selektoren unter .bb-page-header-inner (Light-Layout) */
691.bb-page-header-inner .et_pb_bg_layout_light .et_pb_text_inner p,
692.bb-page-header-inner .et_pb_bg_layout_light .et_pb_text_inner li {
693    color: #595959;
694}
695</style>
696<style id="digelite-focus-visible">
697/* Digelite – Focus Visible (WCAG 2.4.11 / 2.4.12 / 2.4.13) */
698
699/* Divi entfernt outline global – hier wiederherstellen */
700*:focus {
701    outline: none;
702}
703
704/* Nur für Tastaturnutzer */
705*:focus-visible {
706    outline: 3px solid #0057b8 !important;
707    outline-offset: 2px !important;
708    border-radius: 4px;
709    box-shadow: 0 0 0 3px rgba(255,255,255,0.8);
710}
711
712/* WCAG 2.4.11 – Focus Not Obscured (Minimum)
713   Verhindert, dass Sticky-Header das fokussierte Element vollständig verdecken */
714:focus-visible {
715    scroll-margin-top: 80px;
716    scroll-margin-bottom: 20px;
717    scroll-margin-left: 20px;
718    scroll-margin-right: 20px;
719}
720
721/* WCAG 2.5.8 – Target Size (Minimum): Mindestgröße 24×24 CSS px für Interaktions-Ziele */
722a:not([role]),
723button,
724[role="button"],
725input[type="checkbox"],
726input[type="radio"],
727select {
728    min-height: 24px;
729    min-width: 24px;
730}
731/* Amelia / Third-party Kalender: min-size zurücksetzen (Layout-Isolation)
732   Amelia v3 (.amelia-v2-booking) und ältere Varianten verwenden präzise Grid-Layouts.
733   min-height/min-width brechen deren internen Kalender-Grid. */
734.amelia-v2-booking a, .amelia-v2-booking button,
735.amelia-v2-booking select, .amelia-v2-booking [role="button"],
736.amelia-app a, .amelia-app button, .amelia-app select,
737.amelia-booking a, .amelia-booking button, .amelia-booking select {
738    min-height: unset;
739    min-width: unset;
740}
741
742/* Spezifische Korrekturen für Divi-Elemente */
743.et_pb_button:focus-visible,
744.et_pb_menu .nav li a:focus-visible,
745.et-menu-nav li a:focus-visible {
746    outline: 3px solid #0057b8 !important;
747    outline-offset: 2px !important;
748}
749</style>
750<style id="et-critical-inline-css">body,.et_pb_column_1_2 .et_quote_content blockquote cite,.et_pb_column_1_2 .et_link_content a.et_link_main_url,.et_pb_column_1_3 .et_quote_content blockquote cite,.et_pb_column_3_8 .et_quote_content blockquote cite,.et_pb_column_1_4 .et_quote_content blockquote cite,.et_pb_blog_grid .et_quote_content blockquote cite,.et_pb_column_1_3 .et_link_content a.et_link_main_url,.et_pb_column_3_8 .et_link_content a.et_link_main_url,.et_pb_column_1_4 .et_link_content a.et_link_main_url,.et_pb_blog_grid .et_link_content a.et_link_main_url,body .et_pb_bg_layout_light .et_pb_post p,body .et_pb_bg_layout_dark .et_pb_post p{font-size:14px}.et_pb_slide_content,.et_pb_best_value{font-size:15px}body{color:#3f4343}h1,h2,h3,h4,h5,h6{color:#3f4343}#et_search_icon:hover,.mobile_menu_bar:before,.mobile_menu_bar:after,.et_toggle_slide_menu:after,.et-social-icon a:hover,.et_pb_sum,.et_pb_pricing li a,.et_pb_pricing_table_button,.et_overlay:before,.entry-summary p.price ins,.et_pb_member_social_links a:hover,.et_pb_widget li a:hover,.et_pb_filterable_portfolio .et_pb_portfolio_filters li a.active,.et_pb_filterable_portfolio .et_pb_portofolio_pagination ul li a.active,.et_pb_gallery .et_pb_gallery_pagination ul li a.active,.wp-pagenavi span.current,.wp-pagenavi a:hover,.nav-single a,.tagged_as a,.posted_in a{color:#00a3ad}.et_pb_contact_submit,.et_password_protected_form .et_submit_button,.et_pb_bg_layout_light .et_pb_newsletter_button,.comment-reply-link,.form-submit .et_pb_button,.et_pb_bg_layout_light .et_pb_promo_button,.et_pb_bg_layout_light .et_pb_more_button,.et_pb_contact p input[type="checkbox"]:checked+label i:before,.et_pb_bg_layout_light.et_pb_module.et_pb_button{color:#00a3ad}.footer-widget h4{color:#00a3ad}.et-search-form,.nav li ul,.et_mobile_menu,.footer-widget li:before,.et_pb_pricing li:before,blockquote{border-color:#00a3ad}.et_pb_counter_amount,.et_pb_featured_table .et_pb_pricing_heading,.et_quote_content,.et_link_content,.et_audio_content,.et_pb_post_slider.et_pb_bg_layout_dark,.et_slide_in_menu_container,.et_pb_contact p input[type="radio"]:checked+label i:before{background-color:#00a3ad}.container,.et_pb_row,.et_pb_slider .et_pb_container,.et_pb_fullwidth_section .et_pb_title_container,.et_pb_fullwidth_section .et_pb_title_featured_container,.et_pb_fullwidth_header:not(.et_pb_fullscreen) .et_pb_fullwidth_header_container{max-width:1250px}.et_boxed_layout #page-container,.et_boxed_layout.et_non_fixed_nav.et_transparent_nav #page-container #top-header,.et_boxed_layout.et_non_fixed_nav.et_transparent_nav #page-container #main-header,.et_fixed_nav.et_boxed_layout #page-container #top-header,.et_fixed_nav.et_boxed_layout #page-container #main-header,.et_boxed_layout #page-container .container,.et_boxed_layout #page-container .et_pb_row{max-width:1410px}a{color:#00a3ad}.et_secondary_nav_enabled #page-container #top-header{background-color:#00a3ad!important}#et-secondary-nav li ul{background-color:#00a3ad}#main-footer .footer-widget h4,#main-footer .widget_block h1,#main-footer .widget_block h2,#main-footer .widget_block h3,#main-footer .widget_block h4,#main-footer .widget_block h5,#main-footer .widget_block h6{color:#00a3ad}.footer-widget li:before{border-color:#00a3ad}@media only screen and (min-width:981px){.et_fixed_nav #page-container .et-fixed-header#top-header{background-color:#00a3ad!important}.et_fixed_nav #page-container .et-fixed-header#top-header #et-secondary-nav li ul{background-color:#00a3ad}}@media only screen and (min-width:1562px){.et_pb_row{padding:31px 0}.et_pb_section{padding:62px 0}.single.et_pb_pagebuilder_layout.et_full_width_page .et_post_meta_wrapper{padding-top:93px}.et_pb_fullwidth_section{padding:0}}	h1,h2,h3,h4,h5,h6{font-family:'Montserrat',sans-serif}body,input,textarea,select{font-family:'Montserrat',sans-serif}</style>
751<style id="wp-block-library-inline-css">
752:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}
752.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
753/*wp_block_styles_on_demand_placeholder:6abdccff7f747*/
754/*# sourceURL=wp-block-library-inline-css */
755</style>
756
757</head>
758<body class="wp-singular page-template page-template-page-template-blank page-template-page-template-blank-php page page-id-233283 wp-theme-Divi wp-child-theme-divi-child-Digelite_Webseite et-tb-has-template translatepress-de_DE et_pb_button_helper_class et_cover_background et_pb_gutter et_pb_gutters3 et_pb_pagebuilder_layout et_no_sidebar et_divi_theme et-db">
759<a id="digelite-skip" href="#" tabindex="0" aria-label="Zum Hauptinhalt springen">Zum Inhalt springen</a><div id="digelite-live-region" aria-live="polite" aria-atomic="true" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0"></div>
760	<div id="page-container">
761
762    <div id="main-content">
763
764
765			
766				<article id="post-233283" class="post-233283 page type-page status-publish hentry">
767
768				
769					<div class="entry-content">
770					<div class="et-l et-l--post">
771			<div class="et_builder_inner_content et_pb_gutters3">
772		<div class="pd-scope">        <div class="pd-scope">
773        <header id="site-header">
774          <div class="container nav">
775            <a href="https://deinperfectday.de/" class="logo logo-image" aria-label="Perfect Day Startseite">
776              <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Perfect Day — Enjoy your experience" width="220" height="50" fetchpriority="high" decoding="async" class="lazyload" data-src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/images/icons/logo-dunkel.png">
777            </a>
778
779            <button
780              type="button"
781              class="mega-toggle"
782              id="megaToggle"
783              aria-expanded="false"
784              aria-controls="mega-menu"
785              aria-label="Hauptmenü öffnen">
786              <span class="mega-toggle-text">Menü</span>
787              <span class="mega-toggle-icon" aria-hidden="true">
788                <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7h16M4 12h16M4 17h16"/></svg>
789              </span>
790            </button>
791
792            <div class="nav-cta">
793              <a class="btn btn-ghost" href="https://plattform.deinperfectday.de/">Anmelden</a>
794              <a class="btn btn-primary" href="https://deinperfectday.de/anbieter-werden/">Jetzt Anbieter werden <span class="arrow" aria-hidden="true">→</span></a>
795            </div>
796          </div>
797
798          <!-- ============== MEGA MENU DRAWER ============== -->
799          <div class="mega-menu" id="mega-menu" hidden role="dialog" aria-modal="false" aria-label="Hauptmenü">
800            <div class="container mega-grid">
801
802              <!-- Spalte 1: Für Anbieter -->
803              <div class="mega-col">
804                <h3 class="mega-col-title" id="fuer-anbieter">Für Anbieter</h3>
805                <ul class="mega-list">
806                                      <li>
807                      <a href="https://deinperfectday.de/stadtgutscheine/">
808                        <strong>Stadtgutscheine</strong>
809                        <span>Multi-Anbieter-Gutscheine, Teil-Einlösung, Restguthaben automatisch.</span>
810                      </a>
811                    </li>
812                                      <li>
813                      <a href="https://deinperfectday.de/online-ticketing/">
814                        <strong>Online-Ticketing</strong>
815                        <span>0,49 €/Ticket. Keine Buchungsgebühr für deine Gäste.</span>
816                      </a>
817                    </li>
818                                      <li>
819                      <a href="https://deinperfectday.de/gutscheinbuecher/">
820                        <strong>Gutscheinbücher</strong>
821                        <span>Digital, 5-sprachig, sofortige Updates. Keine Druckkosten.</span>
822                      </a>
823                    </li>
824                                      <li>
825                      <a href="https://deinperfectday.de/coupons/">
826                        <strong>Coupons</strong>
827                        <span>Ab 9,90 €/Monat. Drei Tiers, fester Preis, monatlich kündbar.</span>
828                      </a>
829                    </li>
830                                    <li class="mega-list-divider">
831                    <a href="https://deinperfectday.de/preise/">
832                      <strong>Preise &amp; Modelle</strong>
833                      <span>Transparente Konditionen, 10 % Bündel-Rabatt für drei Säulen.</span>
834                    </a>
835                  </li>
836                  <li>
837                    <a href="https://deinperfectday.de/buchen/">
838                      <strong>Säulen buchen</strong>
839                      <span>Buchungs-Assistent: Säulen wählen und verbindlich buchen.</span>
840                    </a>
841                  </li>
842                  <li>
843                    <a href="https://deinperfectday.de/anbieter-werden/" class="mega-link-highlight">
844                      <strong>Anbieter werden →</strong>
845                      <span>Kostenfrei registrieren, schnelle Rückmeldung.</span>
846                    </a>
847                  </li>
848                </ul>
849              </div>
850
851              <!-- Spalte 2: Entdecken & Konzept -->
852              <div class="mega-col">
853                <h3 class="mega-col-title" id="entdecken">Entdecken</h3>
854                <ul class="mega-list">
855                  <li>
856                    <a href="https://deinperfectday.de/app/">
857                      <strong>App entdecken</strong>
858                      <span>Wie die Endkunden-App funktioniert.</span>
859                    </a>
860                  </li>
861                  <li>
862                    <a href="https://deinperfectday.de/roi-rechner/">
863                      <strong>ROI-Rechner</strong>
864                      <span>Plattform-Kosten pro Jahr in 10 Sekunden.</span>
865                    </a>
866                  </li>
867                  <li>
868                    <a href="https://deinperfectday.de/app-versionen/">
869                      <strong>App-Versionen</strong>
870                      <span>Was ist neu in der App — der Versionsverlauf.</span>
871                    </a>
872                  </li>
873                  <li>
874                    <a href="https://deinperfectday.de/#prinzip">
875                      <strong>Das Konzept</strong>
876                      <span>Cross-Pollination der vier Säulen erklärt.</span>
877                    </a>
878                  </li>
879                  <li>
880                    <a href="https://deinperfectday.de/anbieter/">
881                      <strong>Anbieter-Hub</strong>
882                      <span>Übersicht aller Säulen mit Wettbewerbsvergleich.</span>
883                    </a>
884                  </li>
885                  <li>
886                    <a href="https://deinperfectday.de/mitarbeiter-benefits/">
887                      <strong>Mitarbeiter-Benefits</strong>
888                      <span>Firmen-Abos: Stadtgutscheine automatisiert fürs Team.</span>
889                    </a>
890                  </li>
891                </ul>
892
893                <h3 class="mega-col-title" style="margin-top: 1.6rem" id="stadtgutschein-live-in">Stadtgutschein live in</h3>
894                <p class="mega-cities">
895                  Garrel · Löningen · Twistringen<br>
896                  <small>Weitere Städte folgen 2026.</small>
897                </p>
898              </div>
899
900              <!-- Spalte 3: Service + Account -->
901              <div class="mega-col">
902                <h3 class="mega-col-title" id="service">Service</h3>
903                <ul class="mega-list">
904                  <li>
905                    <a href="https://deinperfectday.de/hilfe/">
906                      <strong>Hilfe &amp; Funktionen</strong>
907                      <span>Alle App-Funktionen Schritt für Schritt erklärt.</span>
908                    </a>
909                  </li>
910                  <li>
911                    <a href="https://deinperfectday.de/support/">
912                      <strong>Support</strong>
913                      <span>Hilfe für Anbieter und Kunden.</span>
914                    </a>
915                  </li>
916                  <li>
917                    <a href="https://plattform.deinperfectday.de/">
918                      <strong>Plattform-Login</strong>
919                      <span>Für aktive Anbieter mit Account.</span>
920                    </a>
921                  </li>
922                </ul>
923
924                                  <h3 class="mega-col-title" style="margin-top: 1.6rem" id="sprache">Sprache</h3>
925                  <div class="mega-lang-switcher"><div class="trp-shortcode-switcher__wrapper"
926     style="--bg:#ffffff;--bg-hover:#0000000d;--text:#143852;--text-hover:#1d2327;--border:1px solid #1438521a;--border-width:1px;--border-color:#1438521a;--border-radius:5px;--flag-radius:2px;--flag-size:18px;--aspect-ratio:4/3;--font-size:14px;--transition-duration:0.2s"
927     role="group"
928     data-open-mode="hover">
929
930    
931        <!-- ANCHOR (in-flow only; sizing/borders; inert) -->
932        <div class="trp-language-switcher trp-ls-dropdown trp-shortcode-switcher trp-shortcode-anchor trp-open-on-hover"
933             aria-hidden="true"
934             inert
935 data-no-translation>
936                <div class="trp-current-language-item__wrapper">
937        <a class="trp-language-item trp-language-item__default trp-language-item__current" data-no-translation href="https://deinperfectday.de/anbieter-shop-anbindung/" title="German"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="trp-flag-image lazyload" alt="" role="presentation" loading="lazy" data-src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/de_DE.svg"><span class="trp-language-item-name">German</span></a>                    <svg class="trp-shortcode-arrow" width="20" height="20" viewBox="0 0 20 21" fill="none" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">
938                <path d="M5 8L10 13L15 8" stroke="var(--text)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
939            </svg>
940            </div>
941            </div>
942
943        <!-- OVERLAY (positioned; interactive surface) -->
944        <div class="trp-language-switcher trp-ls-dropdown trp-shortcode-switcher trp-shortcode-overlay trp-open-on-hover"
945             role="navigation"
946             aria-label="Sprachauswahl der Website"
947             data-no-translation
948>
949                <div class="trp-current-language-item__wrapper">
950        <div class="trp-language-item trp-language-item__default trp-language-item__current" data-no-translation role="button" aria-expanded="false" tabindex="0" aria-label="Sprache ändern" aria-controls="trp-shortcode-dropdown-6abdccff7e98c"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="trp-flag-image lazyload" alt="" role="presentation" loading="lazy" data-src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/de_DE.svg"><span class="trp-language-item-name">German</span></div>                    <svg class="trp-shortcode-arrow" width="20" height="20" viewBox="0 0 20 21" fill="none" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">
951                <path d="M5 8L10 13L15 8" stroke="var(--text)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
952            </svg>
953            </div>
954    
955            <div class="trp-switcher-dropdown-list"
956                 id="trp-shortcode-dropdown-6abdccff7e98c"
957                 role="group"
958                 aria-label="Verfügbare Sprachen"
959                 hidden
960 inert
961>
962                                                            <a class="trp-language-item" href="https://deinperfectday.de/en/anbieter-shop-anbindung/" title="English">
963                            <img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="trp-flag-image lazyload" alt="" role="presentation" loading="lazy" data-src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/en_GB.svg">                                                            <span class="trp-language-item-name" data-no-translation>English</span>
964                                                                                </a>
965                                            <a class="trp-language-item" href="https://deinperfectday.de/es/anbieter-shop-anbindung/" title="Spanish">
966                            <img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="trp-flag-image lazyload" alt="" role="presentation" loading="lazy" data-src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/es_ES.svg">                                                            <span class="trp-language-item-name" data-no-translation>Spanish</span>
967                                                                                </a>
968                                            <a class="trp-language-item" href="https://deinperfectday.de/ru/anbieter-shop-anbindung/" title="Russian">
969                            <img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="trp-flag-image lazyload" alt="" role="presentation" loading="lazy" data-src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/ru_RU.svg">                                                            <span class="trp-language-item-name" data-no-translation>Russian</span>
970                                                                                </a>
971                                            <a class="trp-language-item" href="https://deinperfectday.de/tr/anbieter-shop-anbindung/" title="Turkish">
972                            <img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="trp-flag-image lazyload" alt="" role="presentation" loading="lazy" data-src="https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/tr_TR.svg">
972                                                            <span class="trp-language-item-name" data-no-translation>Turkish</span>
973                                                                                </a>
974                                                </div>
975        </div>
976
977    </div>
978</div>
979                
980                <h3 class="mega-col-title" style="margin-top: 1.6rem" id="lade-die-app">Lade die App</h3>
981                                  <div class="app-badges mega-app-badges">
982                                          <a href="https://apps.apple.com/de/app/id1525409363" class="app-badge" target="_blank" rel="noopener" aria-label="Perfect Day im Apple App Store öffnen">
983                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Im Apple App Store laden" width="135" height="40" loading="lazy" decoding="async" class="lazyload" data-src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/images/icons/badge-app-store.png">
984                      </a>
985                                                              <a href="https://play.google.com/store/apps/details?id=koop.perfect.day&#038;utm_source=emea_Med" class="app-badge" target="_blank" rel="noopener" aria-label="Perfect Day im Google Play Store öffnen">
986                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Im Google Play Store laden" width="135" height="40" loading="lazy" decoding="async" class="lazyload" data-src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/images/icons/badge-play-store.png">
987                      </a>
988                                      </div>
989                
990                <h3 class="mega-col-title" style="margin-top: 1.6rem" id="rechtliches">Rechtliches</h3>
991                <ul class="mega-list mega-list-compact">
992                                    <li><a href="https://deinperfectday.de/impressum/">Impressum</a></li>
993                  <li><a href="https://deinperfectday.de/datenschutz/">Datenschutz (Webseite)</a></li>
994                  <li><a href="https://deinperfectday.de/anbieter-agb/">Anbieter-AGB</a></li>
995                  <li><a href="https://deinperfectday.de/agb/terms-of-service/">App-Nutzungsbedingungen</a></li>
996                  <li><a href="https://deinperfectday.de/datenschutzerklaerung/">App-Datenschutz</a></li>
997                  <li><a href="https://deinperfectday.de/konto-loeschen/">Konto löschen</a></li>
998                </ul>
999              </div>
1000
1001            </div>
1002
1003            <button type="button" class="mega-close" id="megaClose" aria-label="Menü schließen">
1004              <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><path d="M6 6l12 12M6 18L18 6"/></svg>
1005            </button>
1006          </div>
1007          <!-- End Mega Menu -->
1008
1009        </header>
1010        </div>
1011                <main id="main">
1012
1013          <nav class="container breadcrumb" aria-label="Brotkrumen-Navigation">
1014            <ol>
1015              <li><a href="https://deinperfectday.de/">Startseite</a></li>
1016              <li><a href="https://deinperfectday.de/anbieter/">Für Anbieter</a></li>
1017              <li><span aria-current="page">Shop-Anbindung</span></li>
1018            </ol>
1019          </nav>
1020
1021          <!-- Hero -->
1022          <section class="subhero subhero-compact et_pb_section" aria-label="Einführung Shop-Anbindung">
1023            <div class="container">
1024              <div class="reveal subhero-center">
1025                <span class="eyebrow"><span class="pulse" aria-hidden="true"></span> &nbsp;10–30 Min Setup · danach vollautomatisch</span>
1026                <h1 id="verkaufe-perfect-day-coupons-ueber-deinen-eigenen-shop">Verkaufe Perfect-Day-Coupons über <span class="accent">deinen eigenen Shop.</span></h1>
1027                <p class="subhero-sub">Egal welches System du nutzt — wir docken an Shopify, Shopware, Magento, PrestaShop und WooCommerce an. Dein Kunde bekommt nach dem Kauf automatisch eine E-Mail mit den Aktivierungs-Codes und einem Druck-Link.</p>
1028                <div class="subhero-actions">
1029                  <a class="btn btn-primary" href="#shop-auswahl">Shop auswählen <span class="arrow" aria-hidden="true">→</span></a>
1030                  <a class="btn btn-ghost" href="#wie-funktioniert">Wie funktioniert das?</a>
1031                </div>
1032              </div>
1033            </div>
1034          </section>
1035
1036          <!-- Wie funktioniert das? -->
1037          <section class="block et_pb_section" id="wie-funktioniert" aria-labelledby="how-h">
1038            <div class="container">
1039              <div class="section-head reveal">
1040                <span class="eyebrow">So läuft's</span>
1041                <h2 id="how-h">Drei Schritte — und du machst keinen davon manuell.</h2>
1042                <p>Sobald eine Bestellung in deinem Shop bezahlt ist, läuft der Rest vollautomatisch über die Perfect-Day-Plattform.</p>
1043              </div>
1044              <div class="steps-grid">
1045                <div class="step reveal">
1046                  <div class="step-num">1</div>
1047                  <h3 id="kunde-kauft-in-deinem-shop">Kunde kauft in deinem Shop</h3>
1048                  <p>Dein Kunde bestellt einen Coupon — z. B. „Stadtgutschein 50 €" oder „Frühstück für zwei" — ganz normal in deinem Webshop.</p>
1049                </div>
1050                <div class="step reveal">
1051                  <div class="step-num">2</div>
1052                  <h3 id="plattform-generiert-die-codes">Plattform generiert die Codes</h3>
1053                  <p>Dein Shop meldet die bezahlte Bestellung an Perfect Day. Die Plattform erzeugt automatisch die Aktivierungs-Codes für genau diese Bestellung.</p>
1054                </div>
1055                <div class="step reveal">
1056                  <div class="step-num">3</div>
1057                  <h3 id="kunde-bekommt-die-e-mail">Kunde bekommt die E-Mail</h3>
1058                  <p>Der Kunde erhält eine Brand-Mail mit den Codes und einem Druck-Link. Er kann den Gutschein ausdrucken oder den Code in der App eingeben.</p>
1059                </div>
1060              </div>
1061            </div>
1062          </section>
1063
1064          <!-- Shop auswählen -->
1065          <section class="block et_pb_section" id="shop-auswahl" style="background: var(--paper)" aria-labelledby="shops-h">
1066            <div class="container">
1067              <div class="section-head reveal">
1068                <span class="eyebrow">Wähle dein System</span>
1069                <h2 id="shops-h">Shop auswählen.</h2>
1070                <p>Jede Anleitung führt dich Klick für Klick durchs Setup. Die Setup-Dauer und der Tech-Aufwand stehen pro Karte dabei — du weißt vorher, worauf du dich einlässt.</p>
1071              </div>
1072              <div class="shop-cards">
1073                                  <a class="shop-card reveal" href="https://deinperfectday.de/anbieter-shop-anbindung-woocommerce/">
1074                    <span class="shop-card-name">WooCommerce</span>
1075                    <p class="shop-card-desc">Plugin-Klick — der einfachste Weg.</p>
1076                    <div class="shop-card-meta">
1077                      <span class="shop-card-time">
1078                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
1079                        10 Min                      </span>
1080                      <span class="shop-diff" role="img" aria-label="Schwierigkeit: einfach">
1081                        <span class="shop-dot shop-dot-on"></span><span class="shop-dot"></span><span class="shop-dot"></span>                      </span>
1082                    </div>
1083                    <span class="shop-card-cta">Anleitung öffnen <span aria-hidden="true">→</span></span>
1084                  </a>
1085                                  <a class="shop-card reveal" href="https://deinperfectday.de/anbieter-shop-anbindung-shopify/">
1086                    <span class="shop-card-name">Shopify</span>
1087                    <p class="shop-card-desc">Workflow-Setup im Shopify-Admin.</p>
1088                    <div class="shop-card-meta">
1089                      <span class="shop-card-time">
1090                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
1091                        15–20 Min                      </span>
1092                      <span class="shop-diff" role="img" aria-label="Schwierigkeit: mittel">
1093                        <span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span><span class="shop-dot"></span>                      </span>
1094                    </div>
1095                    <span class="shop-card-cta">Anleitung öffnen <span aria-hidden="true">→</span></span>
1096                  </a>
1097                                  <a class="shop-card reveal" href="https://deinperfectday.de/anbieter-shop-anbindung-prestashop/">
1098                    <span class="shop-card-name">PrestaShop</span>
1099                    <p class="shop-card-desc">Webhook über das PrestaShop-Backend.</p>
1100                    <div class="shop-card-meta">
1101                      <span class="shop-card-time">
1102                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
1103                        20–25 Min                      </span>
1104                      <span class="shop-diff" role="img" aria-label="Schwierigkeit: mittel">
1105                        <span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span><span class="shop-dot"></span>                      </span>
1106                    </div>
1107                    <span class="shop-card-cta">Anleitung öffnen <span aria-hidden="true">→</span></span>
1108                  </a>
1109                                  <a class="shop-card reveal" href="https://deinperfectday.de/anbieter-shop-anbindung-shopware/">
1110                    <span class="shop-card-name">Shopware 6</span>
1111                    <p class="shop-card-desc">Flow-Builder oder Entwickler empfohlen.</p>
1112                    <div class="shop-card-meta">
1113                      <span class="shop-card-time">
1114                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
1115                        20–30 Min                      </span>
1116                      <span class="shop-diff" role="img" aria-label="Schwierigkeit: fortgeschritten">
1117                        <span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span>                      </span>
1118                    </div>
1119                    <span class="shop-card-cta">Anleitung öffnen <span aria-hidden="true">→</span></span>
1120                  </a>
1121                                  <a class="shop-card reveal" href="https://deinperfectday.de/anbieter-shop-anbindung-magento/">
1122                    <span class="shop-card-name">Magento 2</span>
1123                    <p class="shop-card-desc">Für Setups mit Entwickler-Hand.</p>
1124                    <div class="shop-card-meta">
1125                      <span class="shop-card-time">
1126                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
1127                        25–35 Min                      </span>
1128                      <span class="shop-diff" role="img" aria-label="Schwierigkeit: fortgeschritten">
1129                        <span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span>                      </span>
1130                    </div>
1131                    <span class="shop-card-cta">Anleitung öffnen <span aria-hidden="true">→</span></span>
1132                  </a>
1133                                  <a class="shop-card reveal" href="https://deinperfectday.de/anbieter-shop-anbindung-sonstige/">
1134                    <span class="shop-card-name">Andere Shops</span>
1135                    <p class="shop-card-desc">Generische Bridge für jeden Shop mit Webhook.</p>
1136                    <div class="shop-card-meta">
1137                      <span class="shop-card-time">
1138                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>
1139                        variabel                      </span>
1140                      <span class="shop-diff" role="img" aria-label="Schwierigkeit: mittel">
1141                        <span class="shop-dot shop-dot-on"></span><span class="shop-dot shop-dot-on"></span><span class="shop-dot"></span>                      </span>
1142                    </div>
1143                    <span class="shop-card-cta">Anleitung öffnen <span aria-hidden="true">→</span></span>
1144                  </a>
1145                              </div>
1146            </div>
1147          </section>
1148
1149          <!-- Was du brauchst -->
1150          <section class="block et_pb_section" aria-labelledby="brauchst-h">
1151            <div class="container">
1152              <div class="section-head reveal">
1153                <span class="eyebrow">Voraussetzungen</span>
1154                <h2 id="brauchst-h">Was du brauchst, bevor du startest.</h2>
1155                <p>Vier Dinge — die meisten hast du schon. Die allgemeine Vorbereitung dauert rund fünf Minuten und gilt für alle Shop-Systeme.</p>
1156              </div>
1157              <ul class="feature-list" style="max-width: 620px; margin: 0 auto">
1158                <li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> Ein Anbieter-Konto auf der Perfect-Day-Plattform</li>
1159                <li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> Pro Verkaufs-Produkt ein Coupon-Eintrag im Backoffice (Coupon-ID notiert)</li>
1160                <li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> Ein WordPress-Anwendungspasswort (in 2 Minuten erstellt)</li>
1161                <li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg> Admin-Zugang zu deinem Webshop</li>
1162              </ul>
1163              <p style="text-align: center; margin-top: 2rem">
1164                <a class="btn btn-primary" href="https://deinperfectday.de/anbieter-shop-anbindung-vorbereitung/">Allgemeine Vorbereitung starten <span class="arrow" aria-hidden="true">→</span></a>
1165              </p>
1166            </div>
1167          </section>
1168
1169          <!-- Vorteile -->
1170          <section class="block et_pb_section" style="background: var(--paper)" aria-labelledby="vorteile-h">
1171            <div class="container">
1172              <div class="section-head reveal">
1173                <span class="eyebrow">Warum die Anbindung</span>
1174                <h2 id="vorteile-h">Verkauf läuft automatisch im Hintergrund.</h2>
1175              </div>
1176              <div class="free-grid reveal">
1177                <div class="free-item">
1178                  <div class="free-icon" aria-hidden="true"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2 3 14h7l-1 8 10-12h-7z"/></svg></div>
1179                  <h3 id="vollautomatik">Vollautomatik</h3>
1180                  <p>Sobald die Bestellung bezahlt ist, gehen die Codes automatisch raus — typisch in 5–15 Sekunden. Kein manueller Schritt für dich.</p>
1181                </div>
1182                <div class="free-item">
1183                  <div class="free-icon" aria-hidden="true"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 7 9 6 9-6"/></svg></div>
1184                  <h3 id="brand-mail-an-deinen-kunden">Brand-Mail an deinen Kunden</h3>
1185                  <p>Im Perfect-Day-Layout, mit deinem Anbieter-Namen, Druck-Link und App-Hinweis. Bilingual und DSGVO-konform.</p>
1186                </div>
1187                <div class="free-item">
1188                  <div class="free-icon" aria-hidden="true"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9V2h12v7M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="6" y="14" width="12" height="8" rx="1"/></svg></div>
1189                  <h3 id="druck-oder-app">Druck oder App</h3>
1190                  <p>Dein Kunde kann den Gutschein ausdrucken — zum Verschenken — oder den Code in der App scannen. Beide Wege funktionieren.</p>
1191                </div>
1192                <div class="free-item">
1193                  <div class="free-icon" aria-hidden="true"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 3v18h18"/><rect x="7" y="12" width="3" height="6"/><rect x="13" y="8" width="3" height="10"/><rect x="19" y="5" width="0.1" height="13"/></svg></div>
1194                  <h3 id="backoffice-bersicht">Backoffice-Übersicht</h3>
1195                  <p>Alle Shop-Bestellungen, der Mail-Status und die erzeugten Codes — gesammelt in deinem Plattform-Backoffice unter „Shop-Bestellungen".</p>
1196                </div>
1197              </div>
1198            </div>
1199          </section>
1200
1201          <!-- FAQ -->
1202          <section class="block faq et_pb_section" aria-labelledby="faq-h">
1203            <div class="container">
1204              <div class="section-head reveal">
1205                <span class="eyebrow">Häufige Fragen</span>
1206                <h2 id="faq-h">Was Anbieter zur Shop-Anbindung wissen wollen.</h2>
1207              </div>
1208              <div class="faq-list">
1209                                  <details class="faq-item reveal"><summary>Was kostet die Shop-Anbindung?</summary><div class="faq-body">Nichts extra. Die Anbindung ist Teil deiner Plattform-Mitgliedschaft — du zahlst keine zusätzliche Gebühr für den Webhook oder den automatischen Code-Versand.</div></details>
1210                                  <details class="faq-item reveal"><summary>Brauche ich eigenes Tech-Wissen?</summary><div class="faq-body">Kommt aufs Shop-System an. Bei <strong>WooCommerce</strong> reicht ein Plugin-Klick. Bei <strong>Shopify</strong> richtest du einen Workflow ein. Bei <strong>Shopware, Magento und PrestaShop</strong> solltest du einen Entwickler zur Hand haben — oder unseren Setup-Service nutzen. Der Tech-Aufwand steht als Punkte-Indikator an jeder Shop-Karte.</div></details>
1211                                  <details class="faq-item reveal"><summary>Wie schnell bekommt mein Kunde die Codes?</summary><div class="faq-body">Typisch <strong>5–15 Sekunden</strong> nach der bezahlten Bestellung. Der Kunde bekommt eine E-Mail mit den Aktivierungs-Codes und einem Druck-Link.</div></details>
1212                                  <details class="faq-item reveal"><summary>Was passiert bei einer Stornierung im Shop?</summary><div class="faq-body">Aktuell deaktivierst du den Code in dem Fall manuell im Plattform-Backoffice. Ein automatischer Refund-Webhook ist auf der Roadmap.</div></details>
1213                                  <details class="faq-item reveal"><summary>Können meine Codes mehrfach genutzt werden?</summary><div class="faq-body">Nein. Jeder Aktivierungs-Code ist <strong>genau einmal</strong> einlösbar. Bei Teilzahlungs-Coupons bleibt ein eventuelles Restguthaben dem selben Code erhalten.</div></details>
1214                                  <details class="faq-item reveal"><summary>Ich nutze einen exotischen Shop — geht das trotzdem?</summary><div class="faq-body">Ja. Solange dein Shop Webhooks oder eine Bestell-API hat, kannst du ihn über die generische Bridge anbinden — z. B. mit einem kleinen Code-Snippet oder einem Automatisierungs-Dienst. Siehe die Anleitung „Andere Shops".</div></details>
1215                              </div>
1216            </div>
1217          </section>
1218
1219          <!-- Bottom-CTA -->
1220          <div class="container">
1221            <div class="big-cta reveal">
1222              <h2 id="bereit-deinen-shop-anzubinden">Bereit, deinen Shop anzubinden?</h2>
1223              <p>Geh einmal die allgemeine Vorbereitung durch — danach ist jeder weitere Shop in 10–30 Minuten verbunden.</p>
1224              <a class="btn btn-primary" href="https://deinperfectday.de/anbieter-shop-anbindung-vorbereitung/">Vorbereitung starten <span class="arrow" aria-hidden="true">→</span></a>
1225            </div>
1226          </div>
1227
1228        </main>
1229                <div class="pd-scope">
1230        <footer aria-labelledby="footer-h">
1231          <h2 id="footer-h" class="sr-only">Footer-Navigation</h2>
1232          <div class="container">
1233            <div class="footer-grid">
1234              <div class="footer-brand">
1235                <a href="https://deinperfectday.de/" class="logo logo-image" aria-label="Perfect Day Startseite">
1236                  <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Perfect Day — Enjoy your experience" width="200" height="46" loading="lazy" decoding="async" class="lazyload" data-src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/images/icons/logo-hell.png">
1237                </a>
1238                <p>Stadtgutscheine, Tickets, Gutscheinbücher und Coupons — eine App für deine Stadt. Datenschutz aus Deutschland, 5-sprachig.</p>
1239
1240                                  <div class="app-badges" style="margin-top: 1rem">
1241                                          <a href="https://apps.apple.com/de/app/id1525409363" class="app-badge" target="_blank" rel="noopener" aria-label="Perfect Day im Apple App Store öffnen">
1242                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Im Apple App Store laden" width="135" height="40" loading="lazy" decoding="async" class="lazyload" data-src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/images/icons/badge-app-store.png">
1243                      </a>
1244                                                              <a href="https://play.google.com/store/apps/details?id=koop.perfect.day&#038;utm_source=emea_Med" class="app-badge" target="_blank" rel="noopener" aria-label="Perfect Day im Google Play Store öffnen">
1245                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Im Google Play Store laden" width="135" height="40" loading="lazy" decoding="async" class="lazyload" data-src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/images/icons/badge-play-store.png">
1246                      </a>
1247                                      </div>
1248                              </div>
1249              <div class="footer-col">
1250                <h3 id="fuer-anbieter-2">Für Anbieter</h3>
1251                <ul>
1252                  <li><a href="https://deinperfectday.de/stadtgutscheine/">Stadtgutscheine</a></li>
1253                  <li><a href="https://deinperfectday.de/online-ticketing/">Online-Ticketing</a></li>
1254                  <li><a href="https://deinperfectday.de/gutscheinbuecher/">Gutscheinbücher</a></li>
1255                  <li><a href="https://deinperfectday.de/coupons/">Coupons</a></li>
1256                  <li><a href="https://deinperfectday.de/mitarbeiter-benefits/">Mitarbeiter-Benefits</a></li>
1257                  <li><a href="https://deinperfectday.de/anbieter-shop-anbindung/">Shop-Anbindung</a></li>
1258                  <li><a href="https://deinperfectday.de/preise/">Preise &amp; Modelle</a></li>
1259                  <li><a href="https://deinperfectday.de/anbieter-werden/">Anbieter werden</a></li>
1260                  <li><a href="https://deinperfectday.de/buchen/">Säulen buchen</a></li>
1261                </ul>
1262              </div>
1263              <div class="footer-col">
1264                <h3 id="ber-amp-kontakt">Über &amp; Kontakt</h3>
1265                <ul>
1266                  <li><a href="https://deinperfectday.de/app/">App entdecken</a></li>
1267                  <li><a href="https://deinperfectday.de/app-versionen/">App-Versionen</a></li>
1268                  <li><a href="https://deinperfectday.de/roi-rechner/">ROI-Rechner</a></li>
1269                  <li><a href="https://deinperfectday.de/#prinzip">Konzept</a></li>
1270                  <li><a href="https://plattform.deinperfectday.de/">Plattform-Login</a></li>
1271                  <li><a href="https://deinperfectday.de/hilfe/">Hilfe &amp; Funktionen</a></li>
1272                  <li><a href="https://deinperfectday.de/support/">Support</a></li>
1273                </ul>
1274              </div>
1275              <div class="footer-col">
1276                <h3 id="rechtliches-2">Rechtliches</h3>
1277                <ul>
1278                                    <li><a href="https://deinperfectday.de/impressum/">Impressum</a></li>
1279                  <li><a href="https://deinperfectday.de/datenschutz/">Datenschutz (Webseite)</a></li>
1280                  <li><a href="https://deinperfectday.de/anbieter-agb/">Anbieter-AGB</a></li>
1281                  <li><a href="https://deinperfectday.de/agb/terms-of-service/">App-Nutzungsbedingungen</a></li>
1282                  <li><a href="https://deinperfectday.de/datenschutzerklaerung/">App-Datenschutz</a></li>
1283                  <li><a href="https://deinperfectday.de/konto-loeschen/">Konto löschen</a></li>
1284                </ul>
1285              </div>
1286            </div>
1287            <div class="footer-bottom">
1288              <span class="logo-text">PERFECT <span class="teal">DAY</span></span>
1289              <span>© 2026 DigElite · deinperfectday.de</span>
1290            </div>
1291            <p class="footer-cities">Stadtgutschein aktuell live in: Garrel · Löningen · Twistringen — weitere Städte folgen 2026.</p>
1292            <p class="footer-vat">Alle genannten Preise verstehen sich zzgl. der gesetzlichen Mehrwertsteuer.</p>
1293          </div>
1294        </footer>
1295        </div>
1296        </div>
1297
1298		</div>
1299	</div>
1300						</div>
1301
1302				
1303				</article>
1304
1305			
1306
1307</div>
1308
1309
1310	</div>
1311
1312	<template id="tp-language" data-tp-language="de_DE"></template>
1312<script>
1313(function () {
1314    'use strict';
1315
1316    var callbacks   = [];
1317    var scheduled   = false;
1318    var pendingMuts = [];
1319
1320    function flush() {
1321        scheduled = false;
1322        var muts = pendingMuts.splice(0);
1323        callbacks.forEach(function (fn) {
1324            try { fn(muts); } catch (e) { /* Modul-Fehler isolieren */ }
1325        });
1326    }
1327
1328    var observer = new MutationObserver(function (mutations) {
1329        pendingMuts = pendingMuts.concat(Array.from(mutations));
1330        if (scheduled) return;
1331        scheduled = true;
1332        requestAnimationFrame(flush);
1333    });
1334
1335    function start() {
1336        observer.observe(document.body, { childList: true, subtree: true });
1337    }
1338
1339    if (document.body) {
1340        start();
1341    } else {
1342        document.addEventListener('DOMContentLoaded', start);
1343    }
1344
1345    window.digeliteDOMBus = {
1346        register: function (fn) {
1347            if (typeof fn === 'function') callbacks.push(fn);
1348        }
1349    };
1350
1351})();
1352</script>
vendor: 1 bytes, line 1352
1352
1353<script id="digelite-skip-link-js">
1354(function(){
1355    document.addEventListener('DOMContentLoaded', function () {
1356        var skip = document.getElementById('digelite-skip');
1357        if (!skip) return;
1358
1359        function getDownBtn() {
1360            var btns = document.querySelectorAll('[data-digilite-nav="down"]');
1361            for (var i = 0; i < btns.length; i++) {
1362                if (btns[i].offsetParent !== null) return btns[i];
1363            }
1364            return null;
1365        }
1366
1367        var fallbacks = ['#main-content','#main','#content','main','.site-main','#et-main-area','.et_builder_inner_content','.et_pb_section'];
1368        function findTarget() {
1369            for (var i = 0; i < fallbacks.length; i++) {
1370                var el = document.querySelector(fallbacks[i]);
1371                if (el) return el;
1372            }
1373            return null;
1374        }
1375
1376        function ensureAnchor(target) {
1377            var a = target.querySelector('.digelite-focus-anchor');
1378            if (a) return a;
1379            a = document.createElement('button');
1380            a.className = 'digelite-focus-anchor';
1381            a.type = 'button';
1382            a.tabIndex = 0;
1383            a.setAttribute('aria-hidden', 'true');
1384            target.insertBefore(a, target.firstChild);
1385            return a;
1386        }
1387
1388        function doSkip() {
1389            var down = getDownBtn();
1390            if (down) { down.focus({preventScroll:true}); return; }
1391            var target = findTarget();
1392            if (!target) return;
1393            var anchor = ensureAnchor(target);
1394            target.scrollIntoView({behavior:'auto', block:'start'});
1395            anchor.focus();
1396        }
1397
1398        skip.addEventListener('keydown', function(e) {
1399            if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); doSkip(); }
1400        });
1401        skip.addEventListener('click', function(e) { e.preventDefault(); doSkip(); });
1402    });
1403})();
1404</script>
1404
1405        
1405<script>
1406(function(){
1407  // Bereits ein echtes <main>-Element? Dann nichts tun.
1408  if (document.querySelector('main')) return;
1409
1410  // Kandidaten in Prioritätsreihenfolge (Divi, BuddyBoss, Fallback)
1411  var candidates = [
1412    '#main-content',           // Divi & BuddyBoss Standard
1413    '#et-main-area',           // Divi innerer Wrapper
1414    '.site-main',              // WordPress-Standard (Twenty-*)
1415    '#content',                // Generischer Fallback
1416    '[role="main"]'            // Schon gesetzt? Dann fertig.
1417  ];
1418
1419  for (var i = 0; i < candidates.length; i++) {
1420    var el = document.querySelector(candidates[i]);
1421    if (el) {
1422      // Schon role="main"? Dann fertig.
1423      if (el.getAttribute('role') === 'main') return;
1424      el.setAttribute('role', 'main');
1425      return;
1426    }
1427  }
1428})();
1429</script>
1429
1430        <div class="bf-fixed-nav" data-digelite-nav-plugin="1" aria-label="Seiten-Navigation">
1431
1432        <!-- MENÜ / GANZ NACH OBEN -->
1433        <button data-digilite-nav="top"
1434                class="bf-fixed-nav__btn bf-btn-menu"
1435                aria-label="Zum Menü springen">
1436            ☰
1437            <span class="bf-tooltip">Zum Menü springen</span>
1438        </button>
1439
1440        <!-- BARRIEREFREIHEIT -->
1441        <button id="mdp-readabler-trigger-button"
1442                data-digilite-nav="legal"
1443                class="bf-fixed-nav__btn bf-icon-access"
1444                aria-label="Barrierefreiheitserklärung öffnen">
1445
1446            <img
1447                src="https://deinperfectday.de/wp-content/plugins/digelite-barrierefreiheit/assets/images/icon-barrierefrei.png"
1448                alt=""
1449                width="100"
1450                height="100"
1451                class="bf-access-img">
1452
1453            <span class="bf-tooltip">Barrierefreiheit öffnen</span>
1454        </button>
1455
1456        
1457        
1458        <!-- SEKTION HOCH -->
1459        <button data-digilite-nav="up"
1460                class="bf-fixed-nav__btn"
1461                aria-label="Zur vorherigen Sektion springen">
1462            ▲
1463            <span class="bf-tooltip">Zur vorherigen Sektion</span>
1464        </button>
1465
1466        <!-- SEKTION RUNTER -->
1467        <button data-digilite-nav="down"
1468                class="bf-fixed-nav__btn"
1469                aria-label="Zur nächsten Sektion springen">
1470            ▼
1471            <span class="bf-tooltip">Zur nächsten Sektion</span>
1472        </button>
1473
1474    </div>
1475    
1475<script type="speculationrules">
1476{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/divi-child-Digelite_Webseite/*","/wp-content/themes/Divi/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
1477</script>
vendor: 1 bytes, line 1477
1477
1478<script>
1479document.addEventListener('DOMContentLoaded', function() {
1480
1481    function optimizeMenuStructure() {
1482
1483        /* ---------------------------------------------
1484           1) Dropdown-Eltern erkennen (alle Menüs)
1485           --------------------------------------------- */
1486        const parents = document.querySelectorAll('li.menu-item-has-children');
1487
1488        parents.forEach(function(li) {
1489
1490            const link    = li.querySelector(':scope > a');
1491            const submenu = li.querySelector(':scope > ul.sub-menu');
1492
1493            if (!submenu || !link) return;
1494
1495            // Submenü-ID generieren (für aria-controls, falls später nötig)
1496            if (!submenu.id) {
1497                submenu.id = 'submenu-' + Math.random().toString(36).substr(2, 8);
1498            }
1499
1500            // Dropdown-Eltern bekommen spezielles Basis-Label
1501            const text = (link.innerText || link.textContent || '').trim();
1502            if (text !== "" && !link.hasAttribute('data-aria-base')) {
1503                link.setAttribute('data-aria-base', 'Untermenü öffnen: ' + text);
1504            }
1505        });
1506
1507
1508        /* ---------------------------------------------
1509           2) Normale Menüpunkte labeln
1510              (Header + weitere Menüs)
1511           --------------------------------------------- */
1512        const navSel        = "#top-menu-nav, .et-menu-nav";
1513        const mobileNavSel  = ".et_mobile_menu";
1514        const widgetNavSel  = ".et_pb_menu, .et_pb_fullwidth_menu";
1515
1516        const navSelectors = [
1517            "#main-navigation",
1518            "#top-menu",        // UL im Divi-Header
1519            "#top-menu-nav",    // NAV im Divi-Header
1520            navSel,
1521            mobileNavSel,
1522            ".mobile_nav",
1523            widgetNavSel
1524        ];
1525
1526        navSelectors.forEach(function(sel) {
1527            const nav = document.querySelector(sel);
1528            if (!nav) return;
1529
1530            const links = nav.querySelectorAll("a");
1531
1532            links.forEach(function(a) {
1533
1534                // Dropdown-Eltern haben oben schon ein Label bekommen
1535                if (a.hasAttribute('data-aria-base')) return;
1536
1537                const text = (a.innerText || a.textContent || '').trim();
1538                if (!text) return;
1539
1540                // normaler Menüpunkt → Weiterleitung
1541                a.setAttribute('data-aria-base', 'Weiterleitung zu ' + text);
1542            });
1543        });
1544    }
1545
1546    // Divi ist langsam → mit kurzem Delay triggern
1547    setTimeout(optimizeMenuStructure, 250);
1548
1549});
1550
1551/* ------------------------------------------------------------------
1552   NAVIGATION – ARIA-Basislabels (Header)
1553   Jeder Menülink bekommt ein data-aria-base
1554   ------------------------------------------------------------------ */
1555const headerSelectors = ["#top-menu", "#top-menu-nav"];
1556
1557headerSelectors.forEach(function(sel) {
1558    const nav = document.querySelector(sel);
1559    if (!nav) return;
1560
1561    nav.querySelectorAll("a").forEach(function(a) {
1562
1563        // Nur setzen wenn nicht manuell oder per Plugin überschrieben
1564        if (!a.hasAttribute("data-aria-base")) {
1565            const text = (a.innerText || a.textContent || "").trim();
1566            if (text) {
1567                a.setAttribute("data-aria-base", "Weiterleitung zu " + text);
1568            }
1569        }
1570    });
1571});
1572
1573</script>
vendor: 1 bytes, line 1573
1573
1574<script>
1575/* ========================================================================
1576   ARIA-MANAGER – FINAL VERSION
1577   Divi/BuddyBoss kompatibel – Safe Mode – geprüft & stabil
1578   ======================================================================== */
1579
1580(function() {
1581
1582    /* ------------------------------------------
1583       1) Daten aus PHP übernehmen
1584    ------------------------------------------ */
1585    var manual       = [];
1586    var auto         = [];
1587    var bfSkipWithin = "#whats-new-wrap, .bb-aw-create-btn, .activity-update-form, .bb-activity-post-form, .bb-post-form, #bb-aw-form, .bb-modal, .bb-modal-backdrop, [data-modal-id], #activity-post-form, .activity-post-form, #whats-new";
1588
1589    /* ------------------------------------------
1590       VERWALTUNG: Welche Elemente sind bearbeitet?
1591    ------------------------------------------ */
1592    var processed = new WeakSet();
1593
1594
1595    /* ========================================================================
1596       2) MANUELLE REGELN
1597       (haben höchste Priorität)
1598    ======================================================================== */
1599    var DIGELITE_ARIA_ATTR_OK = /^(role|tabindex|aria-[a-z]+)$/;
1600    function applyManual() {
1601        manual.forEach(function(rule){
1602            try {
1603                document.querySelectorAll(rule.selector).forEach(function(node){
1604                    Object.entries(rule.attributes).forEach(function([attr,val]){
1605                        // Nur erlaubte Attributnamen setzen (schützt vor evtl. vor dem
1606                        // Server-Fix gespeicherten Regeln mit onXY/style/href-Namen).
1607                        if (val !== "" && DIGELITE_ARIA_ATTR_OK.test(String(attr).toLowerCase())) {
1608                            node.setAttribute(attr, val);
1609                        }
1610                    });
1611                    processed.add(node);
1612                });
1613            } catch(e){}
1614        });
1615    }
1616
1617
1618    /* ========================================================================
1619       3) SERVERSEITIGE SAFE-MODE-REGELN
1620       (H2/H3 IDs, Buttontexte → aria-label)
1621    ======================================================================== */
1622    function applyAutoSafe() {
1623        auto.forEach(function(rule){
1624            document.querySelectorAll(rule.tag).forEach(function(node){
1625                if (!node.hasAttribute(rule.attr)) {
1626                    node.setAttribute(rule.attr, rule.value);
1627                    processed.add(node);
1628                }
1629            });
1630        });
1631    }
1632
1633
1634    /* ========================================================================
1635       4) FESTE ICON-KLASSEN – PRIORITÄT 1
1636       Diese Labels überschreiben ALLES ANDERE.
1637    ======================================================================== */
1638
1639    const iconMap = [
1640        { cls: "icon-contact",       label: "Kontakt aufnehmen" },
1641        { cls: "icon-cookie",        label: "Cookie-Einstellungen oeffnen" },
1642        { cls: "icon-accessibility", label: "Barrierefreiheits-Einstellungen oeffnen" },
1643        { cls: "icon-appointment",   label: "Termin vereinbaren" },
1644        { cls: "icon-facebook",      label: "Facebook-Seite oeffnen" },
1645        { cls: "icon-instagram",     label: "Instagram-Profil oeffnen" },
1646        { cls: "icon-google",        label: "Google-Seite oeffnen" },
1647        { cls: "icon-mail",          label: "E-Mail schreiben" },
1648        { cls: "icon-phone",         label: "Jetzt anrufen" },
1649        { cls: "close",              label: "Jetzt schliessen" },
1650        { cls: "pixelmate-revoke",    label: "Cookie-Einstellungen ändern" }
1651
1652    ];
1653
1654    function applyIconRules() {
1655
1656        iconMap.forEach(item => {
1657            document.querySelectorAll("." + item.cls).forEach(function(el){
1658
1659                // Elemente in geschützten Bereichen überspringen
1660                if (bfSkipWithin && el.closest) {
1661                    try { if (el.closest(bfSkipWithin)) { return; } } catch(e) {}
1662                }
1663
1664               
1665                /* Divi: Link IN der Icon-Box */
1666                let link = el.querySelector("a");
1667
1668                /* Falls Icon selbst der Link ist */
1669                if (!link && el.tagName.toLowerCase() === "a") {
1670                    link = el;
1671                }
1672
1673                /* Gibt es keinen anklickbaren Bereich? Dann abbrechen */
1674                if (!link) return;
1675
1676                /* Divi/BuddyBoss setzen oft aria-label="" → entfernen */
1677                if (link.getAttribute("aria-label") === "") {
1678                    link.removeAttribute("aria-label");
1679                }
1680
1681                /* Label setzen, aber nicht doppelt */
1682                if (!link.hasAttribute("aria-label")) {
1683                    link.setAttribute("aria-label", item.label);
1684                }
1685
1686                /* Rolle setzen */
1687                if (!link.hasAttribute("role")) {
1688                    link.setAttribute("role", "button");
1689                }
1690
1691                /* Vermerken, dass dieses Element komplett fertig ist */
1692                processed.add(link);
1693                processed.add(el);
1694            });
1695        });
1696
1697    }
1698
1699
1700    /* ========================================================================
1701       5) AUTOMATISCHE LABELS FÜR ALLE ANDEREN LINKS
1702       (nur wenn NICHT von Icon-Regeln oder manuellen Regeln berührt)
1703    ======================================================================== */
1704
1705    function autoLabelLinks() {
1706
1707    document.querySelectorAll("a").forEach(function(a){
1708
1709        // Elemente in geschützten Bereichen (z. B. BuddyBoss Activity-Form) nicht anfassen
1710        if (bfSkipWithin && a.closest) {
1711            try { if (a.closest(bfSkipWithin)) { return; } } catch(e) {}
1712        }
1713
1714        // Verarbeitung für Navigationslinks niemals blockieren
1715if (processed.has(a)) {
1716    // Ausnahme: Wenn Navigation data-aria-base nutzt → nicht blockieren
1717    if (a.closest('#top-menu') || a.closest('#top-menu-nav')) {
1718        processed.delete(a); 
1719    } else {
1720        return; 
1721    }
1722}
1723
1724        /* ----------------------------------------------------------
1725           1) NEU: data-aria-base hat immer Vorrang – höchste Priorität
1726        ---------------------------------------------------------- */
1727        const baseLabel = a.getAttribute("data-aria-base");
1728        if (baseLabel && baseLabel.trim() !== "") {
1729            a.setAttribute("aria-label", baseLabel.trim());
1730            processed.add(a);
1731            return;
1732        }
1733
1734        /* ----------------------------------------------------------
1735           2) Existiert bereits aria-label / aria-labelledby? Dann nicht anfassen.
1736        ---------------------------------------------------------- */
1737        if (a.hasAttribute("aria-label") || a.hasAttribute("aria-labelledby")) {
1738            return;
1739        }
1740
1741        /* ----------------------------------------------------------
1742           3) Link-Basisvariablen
1743        ---------------------------------------------------------- */
1744        const href = a.getAttribute("href") || "";
1745        const cls  = a.getAttribute("class") || "";
1746        const text = (a.textContent || "").trim();
1747
1748        /* ----------------------------------------------------------
1749           4) Icon-Links automatisch ausschließen (eigene Engine verarbeitet Icons)
1750        ---------------------------------------------------------- */
1751        if (cls.includes("icon-") || cls.includes("close")) {
1752            return;
1753        }
1754
1755        /* ----------------------------------------------------------
1756           5) EXTERNE LINKS
1757           Erkennung: http(s):// + anderer Hostname
1758        ---------------------------------------------------------- */
1759        if (/^https?:\/\//i.test(href) && !href.includes(location.host)) {
1760            const txt = text !== "" ? text : "externer Inhalt";
1761            a.setAttribute("aria-label", "Externer Link: " + txt + " – öffnet in neuem Fenster");
1762            processed.add(a);
1763            return;
1764        }
1765
1766        /* ----------------------------------------------------------
1767           6) DOWNLOADS (PDF, DOCX, ZIP, XLSX usw.)
1768        ---------------------------------------------------------- */
1769        if (/\.(pdf|docx?|xlsx?|zip|rar|7z)$/i.test(href)) {
1770            const dlName = href.split("/").pop();
1771            a.setAttribute("aria-label", "Datei herunterladen: " + dlName);
1772            processed.add(a);
1773            return;
1774        }
1775
1776        /* ----------------------------------------------------------
1777           7) MAILTO → E-Mail schreiben
1778        ---------------------------------------------------------- */
1779        if (/^mailto:/i.test(href)) {
1780            const mail = href.replace("mailto:", "");
1781            a.setAttribute("aria-label", "E-Mail schreiben an " + mail);
1782            processed.add(a);
1783            return;
1784        }
1785
1786        /* ----------------------------------------------------------
1787           8) TELEFON → Anrufen
1788        ---------------------------------------------------------- */
1789        if (/^tel:/i.test(href)) {
1790            const tel = href.replace("tel:", "");
1791            a.setAttribute("aria-label", "Anrufen: " + tel);
1792            processed.add(a);
1793            return;
1794        }
1795
1796        /* ----------------------------------------------------------
1797           9) SOCIAL LINKS – intelligente Erkennung
1798        ---------------------------------------------------------- */
1799        if (/facebook\.com/i.test(href)) {
1800            a.setAttribute("aria-label", "Facebook-Seite öffnen");
1801            processed.add(a);
1802            return;
1803        }
1804
1805        if (/instagram\.com/i.test(href)) {
1806            a.setAttribute("aria-label", "Instagram-Profil öffnen");
1807            processed.add(a);
1808            return;
1809        }
1810
1811        if (/linkedin\.com/i.test(href)) {
1812            a.setAttribute("aria-label", "LinkedIn-Profil öffnen");
1813            processed.add(a);
1814            return;
1815        }
1816
1817        if (/wa\.me|whatsapp/i.test(href)) {
1818            a.setAttribute("aria-label", "Nachricht über WhatsApp senden");
1819            processed.add(a);
1820            return;
1821        }
1822
1823        if (/maps\.google\.com|goo\.gl\/maps/i.test(href)) {
1824            a.setAttribute("aria-label", "Kartenansicht öffnen");
1825            processed.add(a);
1826            return;
1827        }
1828
1829        /* ----------------------------------------------------------
1830           10) PDF direkt im Browser öffnen
1831        ---------------------------------------------------------- */
1832        if (/\.pdf/i.test(href)) {
1833            a.setAttribute("aria-label", "PDF öffnen: " + (text || "Dokument"));
1834            processed.add(a);
1835            return;
1836        }
1837
1838        /* ----------------------------------------------------------
1839           11) GENERISCHE TEXTE verbessern
1840        ---------------------------------------------------------- */
1841        if (/^(mehr|weiter|hier klicken)$/i.test(text)) {
1842            a.setAttribute("aria-label", text + " – mehr Informationen");
1843            processed.add(a);
1844            return;
1845        }
1846
1847        /* ----------------------------------------------------------
1848           12) LEERE LINKS (z. B. nur Icons) → generisches Label
1849        ---------------------------------------------------------- */
1850        if (text === "") {
1851            a.setAttribute("aria-label", "Link öffnen");
1852            processed.add(a);
1853            return;
1854        }
1855
1856        /* ----------------------------------------------------------
1857           13) INTERNE ANKER (#)
1858        ---------------------------------------------------------- */
1859        if (href.startsWith("#") && href.length > 1) {
1860            const anchor = href.replace("#", "").trim();
1861            a.setAttribute("aria-label", "Zum Abschnitt springen: " + anchor);
1862            processed.add(a);
1863            return;
1864        }
1865
1866        /* ----------------------------------------------------------
1867           14) Scroll / Smoothscroll Elemente
1868        ---------------------------------------------------------- */
1869        if (cls.includes("scroll") || href.startsWith("#")) {
1870            a.setAttribute("aria-label", "Zum Abschnitt scrollen: " + text);
1871            processed.add(a);
1872            return;
1873        }
1874
1875        /* ----------------------------------------------------------
1876           15) Sprachumschalter
1877        ---------------------------------------------------------- */
1878        if (/lang|locale|translate/i.test(cls)) {
1879            a.setAttribute("aria-label", "Sprache wechseln zu " + text);
1880            processed.add(a);
1881            return;
1882        }
1883
1884        /* ----------------------------------------------------------
1885           16) Pagination
1886        ---------------------------------------------------------- */
1887        if (/page|pagination|seite/i.test(cls)) {
1888            a.setAttribute("aria-label", "Zur Seite " + text);
1889            processed.add(a);
1890            return;
1891        }
1892
1893        /* ----------------------------------------------------------
1894           17) Suche (Buttons & Links)
1895        ---------------------------------------------------------- */
1896        if (/search|suche/i.test(cls)) {
1897            const t = text.trim() !== "" ? text : "Suche starten";
1898            a.setAttribute("aria-label", t);
1899            processed.add(a);
1900            return;
1901        }
1902
1903        /* ----------------------------------------------------------
1904           18) Buttons die JS auslösen (href="#")
1905        ---------------------------------------------------------- */
1906        if (href === "#") {
1907            a.setAttribute("aria-label", text + " – Aktion ausführen");
1908            processed.add(a);
1909            return;
1910        }
1911
1912        /* ----------------------------------------------------------
1913           19) Spezielle URL-Parameter (download / print / share)
1914        ---------------------------------------------------------- */
1915        if (href.includes("download")) {
1916            a.setAttribute("aria-label", "Download starten: " + text);
1917            processed.add(a);
1918            return;
1919        }
1920
1921        if (href.includes("print")) {
1922            a.setAttribute("aria-label", "Druckansicht öffnen");
1923            processed.add(a);
1924            return;
1925        }
1926
1927        if (href.includes("share")) {
1928            a.setAttribute("aria-label", "Diese Seite teilen");
1929            processed.add(a);
1930            return;
1931        }
1932
1933        /* ----------------------------------------------------------
1934           20) Fallback: Originaler Linktext
1935        ---------------------------------------------------------- */
1936        a.setAttribute("aria-label", text);
1937        processed.add(a);
1938    });
1939}
1940
1941
1942
1943    /* ========================================================================
1944       6) ALLES AUSFÜHREN
1945    ======================================================================== */
1946
1947    function applyAll() {
1948        applyManual();
1949        applyIconRules();
1950        applyAutoSafe();
1951        autoLabelLinks();
1952    }
1953
1954    applyAll();
1955
1956    /* Zentraler DOM-Bus statt eigenem MutationObserver */
1957    if (window.digeliteDOMBus) {
1958        window.digeliteDOMBus.register(applyAll);
1959    } else {
1960        new MutationObserver(applyAll).observe(document.body, { childList: true, subtree: true });
1961    }
1962
1963})();
1964</script>
vendor: 1 bytes, line 1964
1964
1965<script>
1966(function(){
1967
1968    const sectionsSel       = ".et_pb_section, .et_pb_fullwidth_section, .et_pb_specialty_section, section";
1969    const sectionsSkip      = ".et_pb_fullwidth_header, .et_pb_menu, .et_pb_fullwidth_menu";
1970    const sectionsFallback  = ".et_pb_section, .et_pb_fullwidth_section, .et_pb_specialty_section, .elementor-section, .elementor-top-section, .wp-block-group.alignfull, .wp-block-cover, .bb-grid-col, main section, section, article";
1971    const headerNavLinksSel = ".et_pb_menu__menu nav a[href], .et-l--header nav a[href]";
1972
1973// =============================================================
1974// 1) SEKTIONEN ERKENNEN
1975//    + AUTO-FALLBACK: wenn der konfigurierte Selektor < 2 sichtbare
1976//    Sektionen findet, wird der Universal-Fallback-Selektor probiert.
1977//    So bleibt der Navigator auch auf unbekannten Theme/Builder-
1978//    Kombinationen funktional.
1979// =============================================================
1980function findSectionsBySelector(selector) {
1981
1982    const raw = Array.from(document.querySelectorAll(selector));
1983    const visible = raw.filter(sec => sec.offsetParent !== null);
1984    const noSkip = visible.filter(sec => !sec.classList.contains("bf-skip-section"));
1985
1986    const skipSelectors = sectionsSkip.split(',').map(s => s.trim()).filter(Boolean);
1987
1988    const filtered = noSkip.filter(sec => {
1989        if (sec.closest("header") || sec.closest("footer")) return false;
1990        for (const sel of skipSelectors) {
1991            try { if (sec.matches(sel)) return false; } catch(e) {}
1992        }
1993        return true;
1994    });
1995
1996    // "Innermost wins" Dedupe: wenn ein Treffer einen anderen Treffer als
1997    // Nachfahre enthält (Wrapper-Container), wird der Wrapper rausgekippt
1998    // und nur die spezifischeren inneren Sektionen bleiben. Beispiel:
1999    // Eine `.et_pb_section` umschließt ein Code-Modul mit `<section class=
2000    // "hero">`, `<section class="block">` — wir behalten die echten
2001    // semantischen <section>, nicht den Container. Bei Sibling-Treffern
2002    // (keine enthält die andere) bleibt nichts gefiltert.
2003    const dedup = filtered.filter(sec =>
2004        !filtered.some(other => other !== sec && sec.contains(other))
2005    );
2006
2007    dedup.sort((a, b) => a.offsetTop - b.offsetTop);
2008    return dedup;
2009}
2010
2011function getSections() {
2012    let result = findSectionsBySelector(sectionsSel);
2013
2014    if (result.length < 2 && sectionsFallback) {
2015        const broader = findSectionsBySelector(sectionsFallback);
2016        if (broader.length > result.length) result = broader;
2017    }
2018
2019    return result;
2020}
2021
2022let sections     = getSections();
2023let currentIndex = 0;
2024let indexLocked  = false;
2025let skipWasUsed  = false;
2026
2027
2028// =============================================================
2029// 2) FOKUS-ELEMENTE EINER SEKTION
2030// =============================================================
2031const focusableSelector = [
2032    "a[href]",
2033    "button:not([disabled])",
2034    "input:not([disabled])",
2035    "select:not([disabled])",
2036    "textarea:not([disabled])",
2037    "[tabindex]:not([tabindex='-1'])"
2038].join(",");
2039
2040function getFocusableInSection(section) {
2041    if (!section) return [];
2042    const list = Array.from(section.querySelectorAll(focusableSelector));
2043    return list.filter(el => el.offsetParent !== null);
2044}
2045
2046
2047// =============================================================
2048// 3) AKTUELLEN INDEX ERMITTELN
2049// =============================================================
2050function updateIndex() {
2051
2052    if (indexLocked) return;
2053
2054    const scrollY = window.scrollY;
2055    const vh      = window.innerHeight;
2056
2057    const atBottom = vh + scrollY >= document.body.scrollHeight - 50;
2058
2059    if (atBottom) {
2060        currentIndex = sections.length ? sections.length - 1 : 0;
2061        return;
2062    }
2063
2064    const refY         = scrollY + vh * 0.25;
2065    const headerOffset = 0;
2066
2067    let idx = 20;
2068
2069    sections.forEach((sec, i) => {
2070        const top    = sec.offsetTop - headerOffset;
2071        const bottom = top + sec.offsetHeight;
2072        if (refY >= top && refY < bottom) idx = i;
2073    });
2074
2075    currentIndex = idx;
2076}
2077
2078updateIndex();
2079window.addEventListener("scroll", updateIndex);
2080
2081
2082// =============================================================
2083// 4) SCROLL ZU SEKTION
2084// =============================================================
2085function scrollToSection(i) {
2086
2087    if (!sections.length) return;
2088    if (i < 0 || i >= sections.length) return;
2089
2090    const target = sections[i];
2091
2092    indexLocked  = true;
2093    currentIndex = i;
2094
2095    window.scrollTo({
2096        top: target.offsetTop,
2097        behavior: "smooth"
2098    });
2099
2100    setTimeout(() =>
2100 indexLocked = false, 600);
2101}
2102
2103
2104// =============================================================
2105// 5) KLICK-EVENTS
2106// =============================================================
2107document.addEventListener("click", (e) => {
2108
2109    const btn = e.target.closest("[data-digilite-nav]");
2110    if (!btn) return;
2111
2112    const action = btn.dataset.digiliteNav;
2113
2114    // -----------------------------------------
2115    // MENÜ BUTTON
2116    // -----------------------------------------
2117    if (action === "top") {
2118
2119        const clickedBtn = btn;
2120
2121        window.scrollTo({ top: 0, behavior: "smooth" });
2122        indexLocked  = true;
2123        currentIndex = 0;
2124
2125        setTimeout(() => {
2126
2127            let mobileToggle = document.querySelector(
2128                ".mobile_menu_bar, button.menu-toggle, .bb-mobile-menu-toggle"
2129            );
2130            if (mobileToggle) mobileToggle.click();
2131
2132            setTimeout(() => {
2133
2134                if (clickedBtn) clickedBtn.blur();
2135
2136                let firstMenuLink = document.querySelector(
2137                    'header nav a[href], header .nav a[href], #main-header .nav li a[href], ' + headerNavLinksSel + ', .bb-mobile-menu a[href], .bb-primary-menu a[href]'
2138                );
2139
2140                if (firstMenuLink) {
2141                    firstMenuLink.setAttribute("tabindex","0");
2142                    firstMenuLink.focus({ preventScroll:true });
2143                }
2144
2145                indexLocked = false;
2146
2147            }, 220);
2148
2149        }, 400);
2150
2151        return;
2152    }
2153
2154if (action === "simple") {
2155    return;
2156}
2157
2158    if (action === "up") {
2159        scrollToSection(currentIndex - 1);
2160        return;
2161    }
2162
2163    if (action === "down") {
2164        scrollToSection(currentIndex + 1);
2165        return;
2166    }
2167
2168
2169});
2170	
2171// =============================================================
2172// 5b) ENTER-TASTE = DIREKTE NAV-AKTION (ROBUST)
2173// =============================================================
2174document.addEventListener("keydown", (e) => {
2175
2176    if (e.key !== "Enter") return;
2177
2178    const btn = e.target.closest("[data-digilite-nav]");
2179    if (!btn) return;
2180
2181    e.preventDefault();
2182
2183    const action = btn.dataset.digiliteNav;
2184
2185    // -----------------------------------------
2186    // TOP / MENÜ
2187    // -----------------------------------------
2188    if (action === "top") {
2189        window.scrollTo({ top: 0, behavior: "smooth" });
2190        return;
2191    }
2192
2193    // -----------------------------------------
2194    // LEICHTE SPRACHE
2195    // -----------------------------------------
2196    if (action === "simple") {
2197        btn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
2198        return;
2199    }
2200
2201    // -----------------------------------------
2202    // SEKTION HOCH
2203    // -----------------------------------------
2204    if (action === "up") {
2205        scrollToSection(currentIndex - 1);
2206        return;
2207    }
2208
2209    // -----------------------------------------
2210    // SEKTION RUNTER
2211    // -----------------------------------------
2212    if (action === "down") {
2213        scrollToSection(currentIndex + 1);
2214        return;
2215    }
2216
2217    // -----------------------------------------
2218    // RECHTLICHES / LEGAL
2219    // -----------------------------------------
2220    if (action === "legal") {
2221        btn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
2222        return;
2223    }
2224
2225});
2226
2227
2228
2229// =============================================================
2230// 6) TAB-FLOW (EMPTY-SECTION FIX + BUTTON-CHAIN + FOOTER-SPRUNG)
2231// =============================================================
2232
2233// Sichtbarkeits-Prüfung. WICHTIG: offsetParent ist bei position:fixed IMMER
2234// null – ein reiner offsetParent-Test würde fixierte Buttons fälschlich als
2235// unsichtbar einstufen. Daher zusätzlich die Bounding-Box prüfen.
2236function isVisible(el) {
2237    if (!el) return false;
2238    if (el.offsetParent !== null) return true;
2239    const r = el.getBoundingClientRect();
2240    return r.width > 0 && r.height > 0;
2241}
2242
2243// Hilfsfunktion: liefert IMMER den sichtbaren Button (oder null)
2244function getVisible(selector) {
2245    const list = Array.from(document.querySelectorAll(selector));
2246    if (!list.length) return null;
2247    return list.find(isVisible) || null;
2248}
2249
2250// Button-Kette = ALLE sichtbaren Buttons der Fixed-Nav in echter DOM-Reihenfolge.
2251// Früher war die Kette hart auf [data-digilite-nav='top'|'legal'|'simple'|'up'|'down']
2252// verdrahtet. Dabei fielen Buttons ohne dieses Attribut heraus und waren per Tab
2253// NICHT erreichbar – konkret der Barrierefreiheits-Button (.bf-icon-access) sowie
2254// die konfigurierbaren Extra-Slots (die tragen data-nav-selector).
2255function getButtonChain() {
2256    const nav = document.querySelector(".bf-fixed-nav");
2257    if (!nav) return [];
2258    return Array.from(nav.querySelectorAll("button, a[href]")).filter(isVisible);
2259}
2260
2261document.addEventListener("keydown", (e) => {
2262
2263    if (e.key !== "Tab") return;
2264
2265    const active = document.activeElement;
2266
2267    // Buttons immer dynamisch & nur sichtbar holen
2268    const btnMenu   = getVisible("[data-digilite-nav='top']");
2269    const btnDown   = getVisible("[data-digilite-nav='down']");
2270
2271    // Reihenfolge folgt dem DOM – neue Buttons sind automatisch dabei.
2272    const buttonChain = getButtonChain();
2273
2274    const section = sections[currentIndex];
2275    if (!section) return;
2276
2277    const foc      = getFocusableInSection(section);
2278    const firstSec = foc[0];
2279    const lastSec  = foc[foc.length - 1];
2280
2281    const inButtonChain = buttonChain.includes(active);
2282
2283
2284
2285
2286
2287 // =============================================================
2288// OPTIMIERT: TAB DURCH HAUPTMENÜ → danach IMMER PFEIL RUNTER
2289// =============================================================
2290
2291const headerMenuLinks = Array.from(document.querySelectorAll(
2292    '#top-menu a[href], #top-menu-nav a[href], header nav a[href], header .nav a[href], ' + headerNavLinksSel
2293)).filter(el => el.offsetParent !== null);
2294
2295const isHeaderMenuLink = headerMenuLinks.includes(active);
2296
2297if (isHeaderMenuLink && !e.shiftKey) {
2298
2299    const lastHeaderLink = headerMenuLinks[headerMenuLinks.length - 1];
2300
2301    if (active === lastHeaderLink) {
2302        e.preventDefault();
2303
2304        // Schutz: Nur wenn ein Down-Button existiert & sichtbar ist
2305        if (btnDown && isVisible(btnDown)) {
2306            btnDown.focus({ preventScroll: true });
2307            return;
2308        }
2309
2310        // Fallback (sehr selten)
2311        const first = getFocusableInSection(sections[0])[0];
2312        if (first) first.focus({ preventScroll: true });
2313
2314        return;
2315    }
2316}
2317
2318
2319// =============================================================
2320// GLOBALER ERST-FOKUS → AB JETZT NUR NOCH DER "UP"-BUTTON
2321// =============================================================
2322
2323(function makeUpButtonFirstFocus() {
2324
2325    const upBtn = document.querySelector('[data-digilite-nav="top"]');
2326    if (!upBtn) return;
2327
2328    // Normale Fokussierbarkeit sicherstellen
2329    upBtn.setAttribute("tabindex", "0");
2330    upBtn.style.pointerEvents = "auto";
2331
2332    // Neuer Fokus-Hook:
2333    // Wenn der Nutzer mit TAB startet (body oder html im Fokus),
2334    // springen wir NICHT nach unten, sondern nach oben → stabil & sicher.
2335    document.addEventListener("keydown", function(e) {
2336
2337        if (e.key !== "Tab" || e.shiftKey) return;
2338
2339        const active = document.activeElement;
2340
2341        const noRealFocus =
2342            active === document.body ||
2343            active === document.documentElement ||
2344            active === null;
2345
2346        if (noRealFocus) {
2347            e.preventDefault();
2348            upBtn.focus({ preventScroll: true });
2349        }
2350
2351    }, true);
2352
2353})();
2354
2355
2356
2357
2358   // =============================================================
2359// 1) LEERE SEKTION — NUR NACH SKIP-LINK AKTIV
2360//    → Startschutz: Tab darf erst NACH Skip-Link eingreifen
2361// =============================================================
2362if (!foc.length && !inButtonChain) {
2363
2364    // Wenn Skip-Link NICHT benutzt wurde → Tab normal laufen lassen
2365    if (!skipWasUsed) {
2366        return; // keine Manipulation – Browser übernimmt
2367    }
2368
2369    // SHIFT + TAB → rückwärts in Button-Kette
2370    if (e.shiftKey) {
2371        e.preventDefault();
2372
2373        const idx = buttonChain.indexOf(active);
2374        if (idx !== -1) {
2375            const prev = buttonChain[idx - 1] ?? btnMenu;
2376            prev.focus({ preventScroll: true });
2377            return;
2378        }
2379
2380        if (btnDown) {
2381            btnDown.focus({ preventScroll: true });
2382        }
2383        return;
2384    }
2385
2386    // TAB forward → Sektion leer → immer auf Pfeil runter
2387    e.preventDefault();
2388
2389    if (btnDown) {
2390        btnDown.focus({ preventScroll: true });
2391        return;
2392    }
2393
2394    // Fallback Anker (Edge Case)
2395    const fallback = document.createElement("button");
2396    fallback.className = "digelite-anchor-fallback";
2397    fallback.style.cssText = "position:absolute;opacity:0;width:1px;height:1px;";
2398    fallback.tabIndex = 0;
2399    section.prepend(fallback);
2400    fallback.focus();
2401    return;
2402}
2403
2404
2405    // =============================================================
2406    // 2) NORMALER TAB FORWARD
2407    // =============================================================
2408    if (!e.shiftKey) {
2409
2410        const idx = buttonChain.indexOf(active);
2411
2412        // ---------------------------------------------------------
2413        // A) Wir sind in der Button-Kette
2414        // ---------------------------------------------------------
2415        if (idx !== -1) {
2416            e.preventDefault();
2417
2418            const next = buttonChain[idx + 1];
2419
2420            // 1) Nächster Button existiert → dahin springen
2421            if (next) {
2422                next.focus();
2423                return;
2424            }
2425
2426            // 2) Letzter Button → erstes Element der aktuellen Sektion
2427            if (firstSec) {
2428                firstSec.focus({ preventScroll: true });
2429                return;
2430            }
2431
2432            // Wenn es in der Sektion GAR KEIN Element gibt,
2433            // machen wir hier einfach nichts weiter – dann greift
2434            // beim nächsten Tab wieder die normale Browser-Logik
2435            // oder die Up/Down-Buttons.
2436        }
2437
2438        // ---------------------------------------------------------
2439        // B) Letztes Element der Sektion → wohin?
2440        // ---------------------------------------------------------
2441        if (active === lastSec) {
2442
2443            const isLastSection = currentIndex === sections.length - 1;
2444
2445            // 1) Wenn WIRKLICH LETZTE SEKTION → in Footer springen
2446			if (isLastSection) {
2447
2448				const isBuddyBoss =
2449					document.body.classList.contains("buddyboss-theme");
2450
2451				if (isBuddyBoss) {
2452					e.preventDefault();
2453					focusFooterIfBuddyBoss();
2454					return;
2455				}
2456
2457				// bestehende Divi-Logik bleibt unangetastet
2458				const footer = document.querySelector("footer");
2459
2460				if (footer) {
2461					const footerFocus = getFocusableInSection(footer);
2462
2463					if (footerFocus.length) {
2464						e.preventDefault();
2465						footerFocus[0].focus({ preventScroll: true });
2466						return;
2467					}
2468				}
2469			}
2470
2471
2472            // 2) Normalfall → Down-Button
2473            if (btnDown) {
2474                e.preventDefault();
2475                btnDown.focus({ preventScroll: true });
2476                return;
2477            }
2478        }
2479
2480        // Alles andere → normaler Tab
2481        return;
2482    }
2483
2484
2485    // =============================================================
2486    // 3) SHIFT+TAB (RÜCKWÄRTS)
2487    // =============================================================
2488    if (e.shiftKey) {
2489
2490        const idx = buttonChain.indexOf(active);
2491
2492        // A) In der Button-Kette rückwärts
2493        if (idx !== -1) {
2494            e.preventDefault();
2495            const prev = buttonChain[idx - 1] ?? btnMenu;
2496            prev.focus({ preventScroll: true });
2497            return;
2498        }
2499
2500        // B) Erstes Element der Sektion → zurück zu Button Down
2501        if (active === firstSec && btnDown) {
2502            e.preventDefault();
2503            btnDown.focus({ preventScroll: true });
2504            return;
2505        }
2506
2507        // C) Alles andere → normaler Shift+Tab
2508        return;
2509    }
2510
2511});
2512
2513
2514
2515
2516// =============================================================
2517// 7) DYNAMISCHE INHALTE
2518// =============================================================
2519/* Zentraler DOM-Bus statt eigenem MutationObserver */
2520if (window.digeliteDOMBus) {
2521    window.digeliteDOMBus.register(function () {
2522        sections = getSections();
2523        updateIndex();
2524    });
2525} else {
2526    const mo = new MutationObserver(() => { sections = getSections(); updateIndex(); });
2527    mo.observe(document.body, { childList: true, subtree: true });
2528}
2529
2530})();
2531
2532// =============================================================
2533// 8) DUPLIKAT-ENTFERNUNG (DOM)
2534// Behält die Plugin-Navigation ([data-digelite-nav-plugin])
2535// und entfernt alle anderen .bf-fixed-nav Duplikate.
2536// Löst das Problem wenn Plugin + Child-Theme gleichzeitig laufen.
2537// =============================================================
2538document.addEventListener('DOMContentLoaded', function() {
2539    var allNavs = document.querySelectorAll('.bf-fixed-nav');
2540    if (allNavs.length <= 1) return;
2541    // Plugin-Nav bevorzugen (hat data-digelite-nav-plugin Attribut)
2542    var pluginNav = document.querySelector('.bf-fixed-nav[data-digelite-nav-plugin]');
2543    if (!pluginNav) return; // Kein Plugin-Nav → nichts tun
2544    allNavs.forEach(function(nav) {
2545        if (nav !== pluginNav) nav.remove();
2546    });
2547});
2548	
2549// =============================================================
2550// BUDDYBOSS — FOOTER FOCUS BRIDGE (NON-DESTRUCTIVE)
2551// =============================================================
2552function focusFooterIfBuddyBoss() {
2553
2554    if (!document.body.classList.contains("buddyboss-theme")) return;
2555
2556    const footer = document.querySelector("footer");
2557    if (!footer || footer.offsetParent === null) return;
2558
2559    const focusables = footer.querySelectorAll(
2560        "a[href], button:not([disabled]), [tabindex]:not([tabindex='-1'])"
2561    );
2562
2563    if (!focusables.length) return;
2564
2565    focusables[0].setAttribute("tabindex", "0");
2566    focusables[0].focus({ preventScroll: true });
2567}
2568
2569// =============================================================
2570// EXTRA SLOTS — CSS-Selektor-Klick-Delegation
2571// =============================================================
2572document.addEventListener('click', function(e) {
2573    var btn = e.target.closest('[data-nav-selector]');
2574    if (!btn) return;
2575    var sel = btn.getAttribute('data-nav-selector');
2576    if (!sel) return;
2577    var target = document.querySelector(sel);
2578    if (target) {
2579        e.preventDefault();
2580        target.click();
2581    }
2582});
2583
2584</script>
2584
2585
2586<script>
2587(function() {
2588
2589    const rules = [{"type":"normal","selector":".pixelmate-revoke","labels":{"de":"\u00d6ffnet die Datenschutzeinstellungen","en":"Open privacy settings"}},{"type":"normal","selector":"#logo","labels":{"de":"Zur Startseite springen","en":"Open Home"}},{"type":"normal","selector":".pixelmate-general-allow-bottom","labels":{"de":"Alle externen Inhalte und cookies zulassen","en":"Allow all external content and cookies"}},{"type":"normal","selector":".pixelmate-general-deny-bottom","labels":{"de":"Alle externen Inhalte und cookies ablehnen","en":"Reject all external content and cookies"}},{"type":"normal","selector":".pixelmate-general-single-bottom","labels":{"de":"Einstellungen f\u00fcr externen Inhalte und cookies bearbeiten","en":"Edit settings for external content and cookies"}},{"type":"normal","selector":".pixelmate-general-dse-btn","labels":{"de":"Datenschutzerklaerung oeffnen","en":"Open privacy policy"}},{"type":"normal","selector":".pixelmate-general-imp-btn","labels":{"de":"Impressum oeffnen","en":"Open legal notice"}},{"type":"normal","selector":".pixelmate-videos","labels":{"de":"Externe Videos zulassen","en":"Allow external videos"}},{"type":"normal","selector":".pixelmate-settings-save","labels":{"de":"Auswahl Speichern","en":"Save selection"}},{"type":"normal","selector":".pixelmate-settings-reset, .pixelmate-clear-all-cookies","labels":{"de":"Einstellungen l\u00f6schen","en":"Delete settings"}},{"type":"normal","selector":".aktivate-trustindex","labels":{"de":"Google Bewertungen anzeigen","en":"View Google reviews"}},{"type":"normal","selector":".aktivate-trustindex","labels":{"de":"Google Bewertungen anzeigen","en":"View Google reviews"}},{"type":"normal","selector":".aktivate-gmaps","labels":{"de":"Google Karte anzeigen","en":"View Google Map"}},{"type":"normal","selector":".pixelmate-gmaps-footer > a, .pixelmate-s-banner-footer >a, pixelmate-youtube-footer >a","labels":{"de":"Datenschutzerklaerung oeffnen","en":"Open privacy policy"}},{"type":"normal","selector":".pixelmate-s-banner-footer","labels":{"de":"Externe Videos zulassen","en":"Allow external videos"}},{"type":"normal","selector":".sbi_btn_text","labels":{"de":"Weitere Inhalte laden","en":"Load more content"}},{"type":"normal","selector":"#amelia-container > div.am-fs__main.am-fs__main-mobile > div > div.am-fs__main-footer > button > span","labels":{"de":"weiter zum n\u00e4chsten Schritt der Terminbuchung","en":"Open privacy settings"}},{"type":"starts","selector":".plugin-","labels":{"de":"Plugin Element \u2013 \u00f6ffnet Einstellungen","en":"Plugin element \u2013 opens settings"}},{"type":"regex","selector":"\/icon-(cookie|privacy|shield)\/","labels":{"de":"\u00d6ffnet Optionen zum Datenschutz","en":"Opens privacy options"}},{"type":"contains","selector":"open-cookie","labels":{"de":"\u00d6ffnet die Cookie-Einstellungen","en":"Opens cookie settings"}}] || [];
2590    if (!rules.length) return;
2591
2592    // Aktuelle Sprache bestimmen
2593    const lang = document.documentElement.lang?.substring(0,2) || 'de';
2594
2595    // Bereiche, die NICHT angefasst werden dürfen (z. B. BuddyBoss Activity-Form)
2596    const bfSkip = "#whats-new-wrap, .bb-aw-create-btn, .activity-update-form, .bb-activity-post-form, .bb-post-form, #bb-aw-form, .bb-modal, .bb-modal-backdrop, [data-modal-id], #activity-post-form, .activity-post-form, #whats-new";
2597
2598    /**
2599     * Holt Label abhängig von Sprache
2600     */
2601    function getLabel(item) {
2602        if (item.labels?.[lang]) return item.labels[lang];
2603        if (item.labels?.de)    return item.labels.de;
2604        return Object.values(item.labels)[0] || "";
2605    }
2606
2607    /**
2608     * Prüft, ob ein Node zu einer Regel passt
2609     */
2610    function matchesRule(node, rule) {
2611
2612        if (!node || !rule) return false;
2613
2614        // SVG-Elemente haben className als SVGAnimatedString — .split() würde fehlschlagen
2615        const cls = (typeof node.className === 'string') ? node.className : (node.className?.baseVal || "");
2616        const id  = node.id || "";
2617        const full = (id ? `#${id} ` : "") + node.outerHTML;
2618
2619        switch (rule.type) {
2620            case 'normal':
2621                return node.matches?.(rule.selector);
2622
2623            case 'starts':
2624                return cls.split(" ").some(c => c.startsWith(rule.selector.replace('.', '')));
2625
2626            case 'contains':
2627                return full.includes(rule.selector);
2628
2629            case 'ends':
2630                return cls.split(" ").some(c => c.endsWith(rule.selector.replace('.', '')));
2631
2632            case 'regex':
2633                try {
2634                    const rx = new RegExp(rule.selector.replace(/\//g, ""));
2635                    return rx.test(full);
2636                } catch(e) {
2637                    return false;
2638                }
2639        }
2640        return false;
2641    }
2642
2643    /**
2644     * Setzt aria-label, wenn Regel zutrifft
2645     */
2646    function applyAria(node) {
2647
2648        if (!node || node.nodeType !== 1) return; // nur Element-Nodes
2649
2650        // Geschützte Bereiche komplett überspringen (z. B. BuddyBoss Activity-Form)
2651        if (bfSkip && node.closest) {
2652            try { if (node.closest(bfSkip)) return; } catch(e) {}
2653        }
2654
2655        rules.forEach(rule => {
2656
2657            const label = getLabel(rule);
2658            if (!label) return;
2659
2660            // Direktes Matching
2661            if (matchesRule(node, rule)) {
2662                node.setAttribute("aria-label", label);
2663            }
2664
2665            // Suche innerhalb des Node — ebenfalls mit Skip-Prüfung
2666            node.querySelectorAll?.("*").forEach(child => {
2667                if (bfSkip && child.closest) {
2668                    try { if (child.closest(bfSkip)) return; } catch(e) {}
2669                }
2670                if (matchesRule(child, rule)) {
2671                    child.setAttribute("aria-label", label);
2672                }
2673            });
2674        });
2675    }
2676
2677
2678    // DOM fertig → erster Durchlauf
2679    document.addEventListener("DOMContentLoaded", () => {
2680        applyAria(document.body);
2681    });
2682
2683
2684    /* Zentraler DOM-Bus statt eigenem MutationObserver */
2685    if (window.digeliteDOMBus) {
2686        window.digeliteDOMBus.register(function (muts) {
2687            muts.forEach(function (m) {
2688                m.addedNodes.forEach(function (node) { applyAria(node); });
2689            });
2690        });
2691    } else {
2692        const observer = new MutationObserver(muts => {
2693            muts.forEach(m => { m.addedNodes.forEach(node => applyAria(node)); });
2694        });
2695        observer.observe(document.documentElement, { childList: true, subtree: true });
2696    }
2697
2698})();
2699</script>
2699
2700
2701    		<style>
2702			:root {
2703				-webkit-user-select: none;
2704				-webkit-touch-callout: none;
2705				-ms-user-select: none;
2706				-moz-user-select: none;
2707				user-select: none;
2708			}
2709		</style>
2710		
2710<script type="text/javascript">
2711			/*<![CDATA[*/
2712			document.oncontextmenu = function(event) {
2713				if (event.target.tagName != 'INPUT' && event.target.tagName != 'TEXTAREA') {
2714					event.preventDefault();
2715				}
2716			};
2717			document.ondragstart = function() {
2718				if (event.target.tagName != 'INPUT' && event.target.tagName != 'TEXTAREA') {
2719					event.preventDefault();
2720				}
2721			};
2722			/*]]>*/
2723		</script>
2723
2724		
2724<script id="remove-weak-pw-js" src="https://deinperfectday.de/wp-content/plugins/all-in-one-wp-security-and-firewall/js/remove-weak-pw.js?ver=5.4.10"></script>
vendor: 1 bytes, line 2724
2724
2725<script id="custom-script-js" src="https://deinperfectday.de/wp-content/themes/divi-child-Digelite_Webseite/assets/js/custom.js?ver=1780203307"></script>
vendor: 1 bytes, line 2725
2725
2726<script id="divi-custom-script-js-extra">
2727var DIVI = {"item_count":"%d Item","items_count":"%d Items"};
2728var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"};
2729var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"};
2730var et_pb_custom = {"ajaxurl":"https://deinperfectday.de/wp-admin/admin-ajax.php","images_uri":"https://deinperfectday.de/wp-content/themes/Divi/images","builder_images_uri":"https://deinperfectday.de/wp-content/themes/Divi/includes/builder/images","et_frontend_nonce":"eec538f4e8","subscription_failed":"Bitte \u00fcberpr\u00fcfen Sie die Felder unten aus, um sicherzustellen, dass Sie die richtigen Informationen eingegeben.","et_ab_log_nonce":"dde82ffc55","fill_message":"Bitte f\u00fcllen Sie die folgenden Felder aus:","contact_error_message":"Bitte folgende Fehler beheben:","invalid":"Ung\u00fcltige E-Mail","captcha":"Captcha","prev":"Vorherige","previous":"Vorherige","next":"Weiter","wrong_captcha":"Sie haben die falsche Zahl im Captcha eingegeben.","wrong_checkbox":"Kontrollk\u00e4stchen","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"233283","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"yes","is_shortcode_tracking":"","tinymce_uri":"https://deinperfectday.de/wp-content/themes/Divi/includes/builder/frontend-builder/assets/vendors","accent_color":"#00a3ad","waypoints_options":[]};
2731var et_pb_box_shadow_elements = [];
2732//# sourceURL=divi-custom-script-js-extra
2733</script>
vendor: 1 bytes, line 2733
2733
2734<script id="divi-custom-script-js" src="https://deinperfectday.de/wp-content/themes/Divi/js/scripts.min.js?ver=4.27.6"></script>
vendor: 1 bytes, line 2734
2734
2735<script id="digelite-frontend-panel-js-extra">
2736var diFpSettings = {"position":"bottom-right","color":"#1a56db","showLabel":"1","langSwitcherHtml":"\u003Cdiv class=\"trp-shortcode-switcher__wrapper\"\r\n     style=\"--bg:#ffffff;--bg-hover:#0000000d;--text:#143852;--text-hover:#1d2327;--border:1px solid #1438521a;--border-width:1px;--border-color:#1438521a;--border-radius:5px;--flag-radius:2px;--flag-size:18px;--aspect-ratio:4/3;--font-size:14px;--transition-duration:0.2s\"\r\n     role=\"group\"\r\n     data-open-mode=\"hover\"\u003E\r\n\r\n    \r\n        \u003C!-- ANCHOR (in-flow only; sizing/borders; inert) --\u003E\r\n        \u003Cdiv class=\"trp-language-switcher trp-ls-dropdown trp-shortcode-switcher trp-shortcode-anchor trp-open-on-hover\"\r\n             aria-hidden=\"true\"\r\n             inert\r\n             data-no-translation\u003E\r\n                \u003Cdiv class=\"trp-current-language-item__wrapper\"\u003E\r\n        \u003Ca class=\"trp-language-item trp-language-item__default trp-language-item__current\" data-no-translation href=\"https://deinperfectday.de/anbieter-shop-anbindung/\" title=\"German\"\u003E\u003Cimg src=\"https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/de_DE.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" /\u003E\u003Cspan class=\"trp-language-item-name\"\u003EGerman\u003C/span\u003E\u003C/
2736a\u003E                    \u003Csvg class=\"trp-shortcode-arrow\" width=\"20\" height=\"20\" viewBox=\"0 0 20 21\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\"\u003E\r\n                \u003Cpath d=\"M5 8L10 13L15 8\" stroke=\"var(--text)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/\u003E\r\n            \u003C/svg\u003E\r\n            \u003C/div\u003E\r\n            \u003C/div\u003E\r\n\r\n        \u003C!-- OVERLAY (positioned; interactive surface) --\u003E\r\n        \u003Cdiv class=\"trp-language-switcher trp-ls-dropdown trp-shortcode-switcher trp-shortcode-overlay trp-open-on-hover\"\r\n             role=\"navigation\"\r\n             aria-label=\"Sprachauswahl der Website\"\r\n             data-no-translation\r\n        \u003E\r\n                \u003Cdiv class=\"trp-current-language-item__wrapper\"\u003E\r\n        \u003Cdiv class=\"trp-language-item trp-language-item__default trp-language-item__current\" data-no-translation role=\"button\" aria-expanded=\"false\" tabindex=\"0\" aria-label=\"Sprache \u00e4ndern\" aria-controls=\"trp-shortcode-dropdown-6abdccff824df\"\u003E\u003Cimg src=\"https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/de_DE.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" /\u003E\u003Cspan class=\"trp-language-item-name\"\u003EGerman\u003C/span\u003E\u003C/div\u003E                    \u003Csvg class=\"trp-shortcode-arrow\" width=\"20\" height=\"20\" viewBox=\"0 0 20 21\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\"\u003E\r\n                \u003Cpath d=\"M5 8L10 13L15 8\" stroke=\"var(--text)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/\u003E\r\n            \u003C/svg\u003E\r\n            \u003C/div\u003E\r\n    \r\n            \u003Cdiv class=\"trp-switcher-dropdown-list\"\r\n                 id=\"trp-shortcode-dropdown-6abdccff824df\"\r\n                 role=\"group\"\r\n                 aria-label=\"Verf\u00fcgbare Sprachen\"\r\n                 hidden\r\n                 inert\r\n            \u003E\r\n                                                            \u003Ca class=\"trp-language-item\" href=\"https://deinperfectday.de/en/anbieter-shop-anbindung/\" title=\"English\"\u003E\r\n                            \u003Cimg src=\"https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/en_GB.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" /\u003E                                                            \u003Cspan class=\"trp-language-item-name\" data-no-translation\u003EEnglish\u003C/span\u003E\r\n                                                                                \u003C/a\u003E\r\n                                            \u003Ca class=\"trp-language-item\" href=\"https://deinperfectday.de/es/anbieter-shop-anbindung/\" title=\"Spanish\"\u003E\r\n                            \u003Cimg src=\"https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/es_ES.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" /\u003E                                                            \u003Cspan class=\"trp-language-item-name\" data-no-translation\u003ESpanish\u003C/span\u003E\r\n                                                                                \u003C/a\u003E\r\n                                            \u003Ca class=\"trp-language-item\" href=\"https://deinperfectday.de/ru/anbieter-shop-anbindung/\" title=\"Russian\"\u003E\r\n                            \u003Cimg src=\"https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/ru_RU.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" /\u003E                                                            \u003Cspan class=\"trp-language-item-name\" data-no-translation\u003ERussian\u003C/span\u003E\r\n                                                                                \u003C/a\u003E\r\n                                            \u003Ca class=\"trp-language-item\" href=\"https://deinperfectday.de/tr/anbieter-shop-anbindung/\" title=\"Turkish\"\u003E\r\n                            \u003Cimg src=\"https://deinperfectday.de/wp-content/plugins/translatepress-multilingual/assets/flags/4x3/tr_TR.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" /\u003E                                                            \u003Cspan class=\"trp-language-item-name\" data-no-translation\u003ETurkish\u003C/span\u003E\r\n                                                                                \u003C/a\u003E\r\n                                                \u003C/div\u003E\r\n        \u003C/div\u003E\r\n\r\n    \u003C/div\u003E\r\n","i18n":{"panelTitle":"Barrierefreiheit","openBtn":"Barrierefreiheits-Einstellungen \u00f6ffnen","closeBtn":"Einstellungen schlie\u00dfen","reset":"Zur\u00fccksetzen","languageTitle":"Sprache","profilesTitle":"Voreingestellte Profile","fontSize":"Schriftgr\u00f6\u00dfe","fontSizeGroup":"Schriftgr\u00f6\u00dfe w\u00e4hlen","sizeNormal":"Normal","sizeLarge":"Gro\u00df","sizeXL":"Sehr gro\u00df","contrast":"Hoher Kontrast","contrastDesc":"Erh\u00f6ht Lesbarkeit","animOff":"Animationen aus","animOffDesc":"Bewegungen stoppen","spacing":"Mehr Zeilenabstand","spacingDesc":"Erleichtert das Lesen","font":"Lesehilfe-Schrift","fontDesc":"Klare Schrift + Abstand","ruler":"Leselineal","rulerDesc":"Markiert Lesezeile","links":"Links hervorheben","linksDesc":"Alle Links unterstreichen","profileSehschwaeche":"Sehschw\u00e4che","profileDyslexie":"Legasthenie","profileAdhs":"ADHS","profileEpilepsie":"Photosensibel","profileMotorisch":"Motorisch","profileKognitiv":"Kognitiv"}};
2737//# sourceURL=digelite-frontend-panel-js-extra
2738</script>
vendor: 1 bytes, line 2738
2738
2739<script id="digelite-frontend-panel-js" src="https://deinperfectday.de/wp-content/plugins/digelite-barrierefreiheit/modules/frontend-panel/frontend-panel.js?ver=1.11.1"></script>
vendor: 1 bytes, line 2739
2739
2740<script id="et-core-common-js" src="https://deinperfectday.de/wp-content/themes/Divi/core/admin/js/common.js?ver=4.27.6"></script>
vendor: 1 bytes, line 2740
2740
2741<script data-wp-strategy="defer" defer id="perfectday-pages-js" src="https://deinperfectday.de/wp-content/plugins/perfectday-pages-plugin/assets/js/perfectday-pages.min.js?ver=0.28.1"></script>
vendor: 1 bytes, line 2741
2741
2742<script id="digelite-pixelmate-cookie-banner-js" src="https://deinperfectday.de/wp-content/themes/divi-child-Digelite_Webseite/barrierefreiheit/modules/pixelmate-cookie-banner/js/cookie-banner.js?ver=3.1.19"></script>
vendor: 1 bytes, line 2742
2742
2743<script id="digelite-color-contrast-fix-js">
2744(function () {
2745    'use strict';
2746
2747    var LUM_THRESHOLD = 175; // 0–255 (0.299R+0.587G+0.114B). >175 ≈ helle Fläche.
2748
2749    function parseRgb( str ) {
2750        if ( ! str ) { return null; }
2751        var m = str.match( /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/ );
2752        if ( ! m ) { return null; }
2753        var a = ( m[4] === undefined ) ? 1 : parseFloat( m[4] );
2754        return { r: +m[1], g: +m[2], b: +m[3], a: a };
2755    }
2756
2757    function effectiveBg( el ) {
2758        var cur = el;
2759        var stop = document.documentElement;
2760        while ( cur && cur !== stop ) {
2761            var cs = window.getComputedStyle( cur );
2762            var rgb = parseRgb( cs.backgroundColor );
2763            if ( rgb && rgb.a > 0.1 ) { return rgb; }
2764            cur = cur.parentElement;
2765        }
2766        return { r: 255, g: 255, b: 255, a: 1 }; // Fallback: weiß
2767    }
2768
2769    function isLight( rgb ) {
2770        var lum = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;
2771        return lum > LUM_THRESHOLD;
2772    }
2773
2774    function applyFix() {
2775        var modules = document.querySelectorAll( '.et_pb_text_inner' );
2776        for ( var i = 0; i < modules.length; i++ ) {
2777            var bg = effectiveBg( modules[ i ] );
2778            if ( isLight( bg ) ) { continue; } // hell → CSS-Fix darf greifen
2779            // dunkel → CSS-Fix für dieses Modul aufheben
2780            var targets = modules[ i ].querySelectorAll(
2781                'p, li, blockquote, blockquote p, p strong, p b, blockquote strong'
2782            );
2783            for ( var j = 0; j < targets.length; j++ ) {
2784                targets[ j ].style.color = 'revert';
2785            }
2786        }
2787    }
2788
2789    if ( document.readyState === 'loading' ) {
2790        document.addEventListener( 'DOMContentLoaded', applyFix );
2791    } else {
2792        applyFix();
2793    }
2794})();
2795</script>
2795
2796    <style id="digelite-sr-only-css">
2797.digelite-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
2798/* Touch-Ziele: WCAG 2.5.8 – mindestens 24×24 px für interaktive Elemente */
2799a,button,select,[role="button"],[role="link"],[role="checkbox"],[role="radio"],[tabindex="0"]{min-height:24px;min-width:24px}
2800/* Amelia / Third-party Kalender: min-size zurücksetzen (Layout-Isolation) */
2801.amelia-v2-booking a,.amelia-v2-booking button,.amelia-v2-booking select,.amelia-v2-booking [role="button"],
2802.amelia-app a,.amelia-app button,.amelia-app select,
2803.amelia-booking a,.amelia-booking button,.amelia-booking select{min-height:unset;min-width:unset}
2804</style>
2805<script id="digelite-global-auto-fix">
2806(function () {
2807    'use strict';
2808
2809    /* Hilfsfunktion: Amelia/Third-party-UI-Elemente identifizieren.
2810       Amelia v3 verwendet .amelia-v2-booking als Wrapper (Vue.js SPA).
2811       Keine Auto-Fixes innerhalb dieser Container – Vue.js verwaltet
2812       seinen DOM-Zustand selbst; Eingriffe führen zu Render-Fehlern. */
2813    var AMELIA_GUARD = '.amelia-v2-booking, .amelia-app, .amelia-booking, #amelia-container';
2814
2815    function isInAmelia(el) {
2816        return !!(el && el.closest && el.closest(AMELIA_GUARD));
2817    }
2818
2819    /* Hilfsfunktion: BuddyBoss Platform Activity-Form identifizieren.
2820       setAttribute()-Aufrufe auf BuddyBoss-Elementen triggern BuddyBoss's
2821       eigenen MutationObserver und öffnen das "Beitrag erstellen"-Modal. */
2822    var BB_GUARD = '#bp-nouveau-activity-form, .activity-update-form, ' +
2823        '#whats-new-wrap, .bb-aw-create-btn, #whats-new-form, ' +
2824        '.bb-activity-post-form, #activity-post-form, ' +
2825        '.bb-modal, .bb-modal-backdrop, ' +
2826        // Documents + Folders (Gruppen-Dateien, Vue-basiertes Move-Modal, 1.9.2)
2827        '.bb-media-create-folder-popup, .bbm-modal-wrap, .modal-mask, ' +
2828        '.bb-dropdown-wrap, .location-folder-list-wrap-main, ' +
2829        '.location-folder-list-wrap, .bb-folder-destination, ' +
2830        '.bb-folder-list-wrap, .bb-folder-selected-id, .bp-folder-exists, ' +
2831        '.bb-folder-footer, .ac_document_search_folder_list, ' +
2832        '.create-popup-folder-wrap, .popup-on-fly-create-folder, ' +
2833        '.bb-document, .bb-documents, .bb-document-list, .bb-document-move, ' +
2834        '.bp-document, .bp-media-document, .bp-document-folder, ' +
2835        '#bp-media-uploader, .bb-media-uploader, ' +
2836        '[data-document-id], [data-folder-id], ' +
2837        // bbPress + BuddyBoss-Foren / „Neue Diskussion"-Modal (1.9.12)
2838        '.bbp-topic-form, .bbp-reply-form, .bbp-forum-form, ' +
2839        '#new-post, #bbpress-forums, ' +
2840        '.bb-forum-form, .bb-topic-form, .bb-reply-form, ' +
2841        '.bb-modal-discussion, .bb-discussions-create, .bb-discussions, ' +
2842        '[data-discussion-id], [data-topic-id], [data-forum-id], [data-reply-id]';
2843
2844    function isInBuddyBoss(el) {
2845        return !!(el && el.closest && el.closest(BB_GUARD));
2846    }
2847
2848    /* Hilfsfunktion: BuddyBoss Vue-Modals (Documents/Folders, 1.9.2).
2849       BuddyBoss Media rendert seine Move-/Upload-Modals als Vue-Komponenten
2850       innerhalb <transition name="modal">. Vue-Reaktivität bricht, sobald
2851       externe DOM-Manipulation Attribute setzt → Modal "schliesst sich"
2852       (aria-hidden=true), Ordnerliste bleibt display:none → "kein Ordner
2853       vorhanden". Analog zu AMELIA_GUARD. */
2854    var BB_VUE_GUARD = '.bb-media-create-folder-popup, .modal-mask, ' +
2855        '.modal-wrapper, .modal-container, .bbm-modal-wrap';
2856
2857    function isInBuddyBossVue(el) {
2858        return !!(el && el.closest && el.closest(BB_VUE_GUARD));
2859    }
2860
2861    /* Hilfsfunktion: Screenreader-only Text erzeugen */
2862    function srOnly(text) {
2863        var s = document.createElement('span');
2864        s.className = 'digelite-sr-only';
2865        s.textContent = text;
2866        return s;
2867    }
2868
2869    /* -------------------------------------------------------
2870       Fix 1: onclick-Elemente ohne Rolle
2871       div[onclick], span[onclick] → role="button" + tabindex + Tastatur
2872    ------------------------------------------------------- */
2873    function fixOnclickElements() {
2874        var els = document.querySelectorAll(
2875            'div[onclick]:not([data-bf-onclick-fixed]),' +
2876            'span[onclick]:not([data-bf-onclick-fixed]),' +
2877            'p[onclick]:not([data-bf-onclick-fixed])'
2878        );
2879        els.forEach(function (el) {
2880            if (isInAmelia(el)) return;
2881            if (isInBuddyBoss(el)) return;
2882            if (!el.getAttribute('role')) {
2883                el.setAttribute('role', 'button');
2884            }
2885            if (!el.getAttribute('tabindex')) {
2886                el.setAttribute('tabindex', '0');
2887            }
2888            el.setAttribute('data-bf-onclick-fixed', '1');
2889            if (!el._bfKeyHandler) {
2890                el._bfKeyHandler = function (e) {
2891                    if (e.key === 'Enter' || e.key === ' ') {
2892                        e.preventDefault();
2893                        el.click();
2894                    }
2895                };
2896                el.addEventListener('keydown', el._bfKeyHandler);
2897            }
2898        });
2899    }
2900
2901    /* -------------------------------------------------------
2902       Fix 2: Links die in neuem Tab öffnen
2903       a[target="_blank"] → aria-label mit Hinweis ergänzen
2904    ------------------------------------------------------- */
2905    function fixNewTabLinks() {
2906        var els = document.querySelectorAll(
2907            'a[target="_blank"]:not([data-bf-newtab-fixed])'
2908        );
2909        els.forEach(function (el) {
2910            if (isInAmelia(el)) return;
2911            if (isInBuddyBoss(el)) return;
2912            el.setAttribute('data-bf-newtab-fixed', '1');
2913
2914            var hasHint = el.getAttribute('aria-label') &&
2915                el.getAttribute('aria-label').indexOf('neuem Tab') !== -1;
2916            if (hasHint) return;
2917
2918            var rel = el.getAttribute('rel') || '';
2919            if (rel.indexOf('noopener') === -1) {
2920                el.setAttribute('rel', (rel + ' noopener noreferrer').trim());
2921            }
2922
2923            var existingLabel = el.getAttribute('aria-label') || el.textContent.trim();
2924            if (existingLabel) {
2925                el.setAttribute('aria-label', existingLabel + ' (öffnet in neuem Tab)');
2926            } else {
2927                el.appendChild(srOnly('(öffnet in neuem Tab)'));
2928            }
2929        });
2930    }
2931
2932    /* -------------------------------------------------------
2933       Fix 3: Anker ohne href
2934       a:not([href]) → tabindex="0" + role="link"
2935    ------------------------------------------------------- */
2936    function fixAnchorsWithoutHref() {
2937        var els = document.querySelectorAll(
2938            'a:not([href]):not([data-bf-nohref-fixed])'
2939        );
2940        els.forEach(function (el) {
2941            if (isInAmelia(el)) return;
2942            if (isInBuddyBoss(el)) return;
2943            if (el.id === 'digelite-skip') return;
2944            el.setAttribute('data-bf-nohref-fixed', '1');
2945            if (!el.getAttribute('tabindex')) {
2946                el.setAttribute('tabindex', '0');
2947            }
2948            if (!el.getAttribute('role')) {
2949                el.setAttribute('role', 'link');
2950            }
2951        });
2952    }
2953
2954    /* -------------------------------------------------------
2955       Fix 4: Positive tabindex-Werte
2956       [tabindex] > 0 → tabindex="0"
2957    ------------------------------------------------------- */
2958    function fixPositiveTabindex() {
2959        var els = document.querySelectorAll('[tabindex]');
2960        els.forEach(function (el) {
2961            if (isInAmelia(el)) return; // Amelia verwaltet tabindex selbst (Vue.js)
2962            if (isInBuddyBoss(el)) return; // BuddyBoss Activity-Form nicht anfassen
2963            var val = parseInt(el.getAttribute('tabindex'), 10);
2964            if (val > 0) {
2965                el.setAttribute('tabindex', '0');
2966            }
2967        });
2968    }
2969
2970    /* -------------------------------------------------------
2971       Fix 5: Doppelte IDs deuplizieren
2972       Alle Duplikate (außer dem ersten) bekommen ein Suffix
2973       und werden aus dem Accessibility-Tree versteckt.
2974    ------------------------------------------------------- */
2975    function fixDuplicateIds() {
2976        // ID-Präfixe die BuddyBoss Platform für seine Activity-Form nutzt
2977        // → niemals umbenennen, sonst findet BuddyBoss seine Elemente nicht mehr
2978        var bbSkipPrefixes = [
2979            'whats-new', 'user-status', 'activity-', 'bp-nouveau',
2980            'buddypress', 'bbpress', 'bb-media', 'bb-internal', 'editor-toolbar', 'bp-',
2981            // BuddyBoss Documents/Folders (Vue-Modal-Welt, 1.9.2)
2982            'bb-document', 'bb-folder', 'document-', 'folder-',
2983            'bp-document', 'bp-media-document', 'bp-folder',
2984            'media-uploader', 'bp-media-uploader',
2985            'location-folder', 'ac_document', 'bb-media-create-folder',
2986            // bbPress + BuddyBoss-Foren / „Neue Diskussion"-Modal (1.9.12)
2987            'bbp-', 'bbp_', 'bb-forum', 'bb-topic', 'bb-reply', 'bb-discussion',
2988            'bb-modal', 'forum-', 'topic-', 'reply-', 'discussion-',
2989            'new-topic', 'new-reply', 'new-discussion',
2990            'subscription-toggle', 'favorite-toggle'
2991        ];
2992        function isBuddyBossId(id) {
2993            for (var i = 0; i < bbSkipPrefixes.length; i++) {
2994                if (id.indexOf(bbSkipPrefixes[i]) === 0) return true;
2995            }
2996            return false;
2997        }
2998
2999        var seen = {};
3000        var all = document.querySelectorAll('[id]');
3001        all.forEach(function (el) {
3002            if (isInAmelia(el)) return; // Amelia-IDs nie umbenennen (Vue.js-Reaktivität)
3003            if (isInBuddyBossVue(el)) return; // BuddyBoss Vue-Modals nicht anfassen (1.9.2)
3004            var id = el.getAttribute('id');
3005            if (!id) return;
3006            if (isBuddyBossId(id)) return; // BuddyBoss-IDs nie umbenennen
3007            if (seen[id]) {
3008                // Duplikat: nur umbenennen, Inhalt bleibt für Screenreader erreichbar (1.10.11)
3009                el.setAttribute('id', id + '-bf-dup-' + (++seen[id]));
3010            } else {
3011                seen[id] = 1;
3012            }
3013        });
3014    }
3015
3016    /* -------------------------------------------------------
3017       Fix 6: Formularfelder ohne zugängliches Label
3018       input/select/textarea ohne label, aria-label, aria-labelledby
3019       → aria-label aus placeholder, title oder name ableiten
3020    ------------------------------------------------------- */
3021    function fixFormLabels() {
3022        var fields = document.querySelectorAll(
3023            'input:not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="image"]),' +
3024            'select,' +
3025            'textarea'
3026        );
3027        fields.forEach(function (el) {
3028            if (isInAmelia(el)) return; // Amelia-Formulare nicht überschreiben (Vue.js-Bindings)
3029            if (isInBuddyBoss(el)) return; // BuddyBoss Activity-Form nicht anfassen
3030            if (el.getAttribute('data-bf-label-fixed')) return;
3031
3032            // Hat bereits ein zugängliches Label?
3033            var hasLabel = el.getAttribute('aria-label') ||
3034                el.getAttribute('aria-labelledby') ||
3035                (el.id && document.querySelector('label[for="' + CSS.escape(el.id) + '"]'));
3036            if (hasLabel) {
3037                el.setAttribute('data-bf-label-fixed', '1');
3038                return;
3039            }
3040
3041            // Label aus Kontext ableiten
3042            var label = el.getAttribute('placeholder') ||
3043                el.getAttribute('title') ||
3044                el.getAttribute('name') || '';
3045
3046            // Name-Attribut lesbarer machen (z.B. "first_name" → "first name")
3047            if (label === el.getAttribute('name')) {
3048                label = label.replace(/[_-]/g, ' ');
3049            }
3050
3051            if (label) {
3052                el.setAttribute('aria-label', label);
3053            }
3054
3055            el.setAttribute('data-bf-label-fixed', '1');
3056        });
3057    }
3058
3059    /* -------------------------------------------------------
3060       Fix 7: Generische Link-Texte
3061       "hier", "mehr", "weiter", "klicken" etc. → aria-label
3062       aus übergeordnetem Kontext (Überschrift oder nächster Text)
3063    ------------------------------------------------------- */
3064    var GENERIC_LINK_TEXTS = [
3065        'hier', 'here', 'mehr', 'more', 'weiter', 'next',
3066        'klicken', 'click', 'klicken sie hier', 'click here',
3067        'lesen', 'read more', 'weiterlesen', 'jetzt', 'now',
3068        'los', 'los geht\'s', 'go', 'details', 'info'
3069    ];
3070
3071    function fixGenericLinkText() {
3072        var links = document.querySelectorAll(
3073            'a[href]:not([data-bf-linktext-fixed])'
3074        );
3075        links.forEach(function (el) {
3076            if (isInAmelia(el)) return;
3077            el.setAttribute('data-bf-linktext-fixed', '1');
3078
3079            // Bereits ein gutes Label?
3080            if (el.getAttribute('aria-label')) return;
3081
3082            var text = el.textContent.trim().toLowerCase();
3083            if (!text || GENERIC_LINK_TEXTS.indexOf(text) === -1) return;
3084
3085            // Kontext suchen: nächste Überschrift im selben Container
3086            var context = '';
3087            var container = el.closest('p,li,td,div,section,article');
3088            if (container) {
3089                var heading = container.querySelector('h1,h2,h3,h4,h5,h6');
3090                if (heading) {
3091                    context = heading.textContent.trim();
3092                }
3093                // Fallback: benachbarter Text
3094                if (!context) {
3095                    var prev = el.previousSibling;
3096                    while (prev) {
3097                        var t = (prev.textContent || '').trim();
3098                        if (t.length > 3) { context = t.slice(0, 60); break; }
3099                        prev = prev.previousSibling;
3100                    }
3101                }
3102            }
3103
3104            if (context) {
3105                el.setAttribute('aria-label', el.textContent.trim() + ': ' + context);
3106            }
3107        });
3108    }
3109
3110    /* -------------------------------------------------------
3111       Alle Fixes zusammen ausführen
3112    ------------------------------------------------------- */
3113    function runAllFixes() {
3114        fixOnclickElements();
3115        fixNewTabLinks();
3116        fixAnchorsWithoutHref();
3117        fixPositiveTabindex();
3118        fixDuplicateIds();
3119        fixFormLabels();
3120        fixGenericLinkText();
3121    }
3122
3123    /* -------------------------------------------------------
3124       DOM Bus registrieren (MutationObserver für nachdgeladene Inhalte)
3125    ------------------------------------------------------- */
3126    function registerWithDOMBus() {
3127        if (window.digeliteDOMBus && typeof window.digeliteDOMBus.register === 'function') {
3128            window.digeliteDOMBus.register(runAllFixes);
3129            return true;
3130        }
3131        return false;
3132    }
3133
3134    /* -------------------------------------------------------
3135       Init: sofort ausführen + DOM Bus / Polling-Fallback
3136    ------------------------------------------------------- */
3137    function init() {
3138        runAllFixes();
3139
3140        if (!registerWithDOMBus()) {
3141            var attempts = 0;
3142            var interval = setInterval(function () {
3143                attempts++;
3144                if (registerWithDOMBus() || attempts >= 15) {
3145                    clearInterval(interval);
3146                }
3147            }, 200);
3148        }
3149    }
3150
3151    if (document.readyState === 'loading') {
3152        document.addEventListener('DOMContentLoaded', init);
3153    } else {
3154        init();
3155    }
3156})();
3157</script>
3157
3158        
3158<script>
3159    (function () {
3160        'use strict';
3161
3162        if (window.__bfTabindexManagerInitialized) {
3163            return;
3164        }
3165        window.__bfTabindexManagerInitialized = true;
3166
3167        const accordionSel         = ".et_pb_toggle";
3168        const accordionTitleSel    = ".et_pb_toggle_title";
3169        const accordionContentSel  = ".et_pb_toggle_content";
3170        const accordionOpenClass   = "et_pb_toggle_open";
3171        const formCheckboxSel      = ".et_pb_contact_field_checkbox";
3172        const accordionTitleClass  = "et_pb_toggle_title";
3173        const bfSkipWithin         = "#whats-new-wrap, .bb-aw-create-btn, .activity-update-form, .bb-activity-post-form, .bb-post-form, #bb-aw-form, .bb-modal, .bb-modal-backdrop, [data-modal-id], #activity-post-form, .activity-post-form, #whats-new"; // Bereiche, die komplett übersprungen werden
3174
3175        function initTabindexManager() {
3176            // Pixelmate-Elemente NICHT hier listen — positive tabindex verletzt WCAG 2.4.3.
3177            // Cookie-Banner ist fixed positioniert und liegt im natürlichen Tab-Fluss.
3178            // Tabindex-Bereinigung für Pixelmate erfolgt in cookie-banner.js.
3179            const prioritySelectors = [];
3180
3181            const autoTabindexClasses = [
3182                accordionTitleClass
3183            ];
3184
3185            const PRIORITY_ATTR = 'data-bf-priority';
3186            const INIT_TOGGLE_ATTR = 'data-bf-toggle-init';
3187            const INIT_CHECKBOX_ATTR = 'data-bf-checkbox-init';
3188            const INIT_KEY_ATTR = 'data-bf-key-init';
3189            const OBSERVED_ATTR = 'data-bf-observed';
3190
3191            function isVisible(el) {
3192                if (!el) {
3193                    return false;
3194                }
3195
3196                const s = window.getComputedStyle(el);
3197
3198                if (
3199                    s.display === 'none' ||
3200                    s.visibility === 'hidden' ||
3201                    s.opacity === '0'
3202                ) {
3203                    return false;
3204                }
3205
3206                if (el.offsetParent === null && el !== document.body && s.position !== 'fixed') {
3207                    return false;
3208                }
3209
3210                return true;
3211            }
3212
3213            function isNativeInteractive(el) {
3214                if (!el || !el.tagName) {
3215                    return false;
3216                }
3217
3218                return ['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'SUMMARY'].includes(el.tagName);
3219            }
3220
3221            function applyPriorityTabindex() {
3222                document.querySelectorAll('[' + PRIORITY_ATTR + '="1"]').forEach(function (el) {
3223                    el.removeAttribute('tabindex');
3224                    el.removeAttribute(PRIORITY_ATTR);
3225                });
3226
3227                let current = 1;
3228                const seen = new Set();
3229
3230                prioritySelectors.forEach(function (selector) {
3231                    document.querySelectorAll(selector).forEach(function (el) {
3232                        if (seen.has(el)) {
3233                            return;
3234                        }
3235
3236                        if (!isVisible(el)) {
3237                            return;
3238                        }
3239
3240                        seen.add(el);
3241                        el.setAttribute('tabindex', String(current++));
3242                        el.setAttribute(PRIORITY_ATTR, '1');
3243                    });
3244                });
3245            }
3246
3247            function applyBaseTabindexManager() {
3248                document.querySelectorAll('main a[href]').forEach(function (link) {
3249                    if (link.hasAttribute(PRIORITY_ATTR)) {
3250                        return;
3251                    }
3252
3253                    // Elemente in geschützten Bereichen (z. B. BuddyBoss Activity-Form) überspringen
3254                    if (bfSkipWithin && link.closest) {
3255                        try { if (link.closest(bfSkipWithin)) { return; } } catch(e) {}
3256                    }
3257
3258                    link.setAttribute('tabindex', '0');
3259                });
3260            }
3261
3262            function applyAutoTabindexClasses() {
3263                autoTabindexClasses.forEach(function (cls) {
3264                    document.querySelectorAll('.' + cls).forEach(function (el) {
3265                        if (!el.hasAttribute('tabindex')) {
3266                            el.setAttribute('tabindex', '0');
3267                        }
3268                    });
3269                });
3270            }
3271
3272            function syncToggleAria(toggle, title) {
3273                if (!toggle || !title) {
3274                    return;
3275                }
3276
3277                const isOpen = toggle.classList.contains(accordionOpenClass);
3278                title.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
3279
3280                const content = toggle.querySelector(accordionContentSel);
3281                if (content) {
3282                    if (!content.id) {
3283                        content.id = 'bf-toggle-content-' + Math.random().toString(36).slice(2, 10);
3284                    }
3285                    title.setAttribute('aria-controls', content.id);
3286                }
3287            }
3288
3289            function applyToggleFix() {
3290                document.querySelectorAll(accordionSel).forEach(function (toggle) {
3291                    const title = toggle.querySelector(accordionTitleSel);
3292                    if (!title) {
3293                        return;
3294                    }
3295
3296                    title.setAttribute('tabindex', '0');
3297                    title.setAttribute('role', 'button');
3298                    syncToggleAria(toggle, title);
3299
3300                    if (title.getAttribute(INIT_TOGGLE_ATTR) === '1') {
3301                        return;
3302                    }
3303
3304                    title.setAttribute(INIT_TOGGLE_ATTR, '1');
3305
3306                    title.addEventListener('keydown', function (e) {
3307                        if (e.key === 'Enter' || e.key === ' ') {
3308                            e.preventDefault();
3309                            title.click();
3310                        }
3311                    });
3312
3313                    title.addEventListener('click', function () {
3314                        window.setTimeout(function () {
3315                            syncToggleAria(toggle, title);
3316                        }, 0);
3317                    });
3318                });
3319            }
3320
3321            function applyDiviFormCheckboxFix() {
3322                document.querySelectorAll(formCheckboxSel).forEach(function (item) {
3323                    const input = item.querySelector("input[type='checkbox']");
3324                    const label = item.querySelector('label');
3325                    const icon = label ? label.querySelector('i') : null;
3326
3327                    if (!input || !label || !icon) {
3328                        return;
3329                    }
3330
3331                    if (!input.id) {
3332                        input.id = 'bf-checkbox-' + Math.random().toString(36).slice(2, 10);
3333                    }
3334
3335                    label.setAttribute('for', input.id);
3336
3337                    icon.setAttribute('tabindex', '0');
3338                    icon.setAttribute('role', 'checkbox');
3339                    icon.setAttribute('aria-checked', input.checked ? 'true' : 'false');
3340                    icon.setAttribute('aria-hidden', 'false');
3341
3342                    const syncState = function () {
3343                        icon.setAttribute('aria-checked', input.checked ? 'true' : 'false');
3344                    };
3345
3346                    syncState();
3347
3348                    if (icon.getAttribute(INIT_CHECKBOX_ATTR) === '1') {
3349                        return;
3350                    }
3351
3352                    icon.setAttribute(INIT_CHECKBOX_ATTR, '1');
3353
3354                    icon.addEventListener('keydown', function (e) {
3355                        if (e.key === ' ' || e.key === 'Enter') {
3356                            e.preventDefault();
3357                            input.checked = !input.checked;
3358                            syncState();
3359                            input.dispatchEvent(new Event('change', { bubbles: true }));
3360                        }
3361                    });
3362
3363                    icon.addEventListener('click', function (e) {
3364                        e.preventDefault();
3365                        input.checked = !input.checked;
3366                        syncState();
3367                        input.dispatchEvent(new Event('change', { bubbles: true }));
3368                    });
3369
3370                    input.addEventListener('change', syncState);
3371                });
3372            }
3373
3374            function applySafeUniversalKeyActivation() {
3375                document.querySelectorAll('[tabindex]').forEach(function (el) {
3376                    if (isNativeInteractive(el)) {
3377                        return;
3378                    }
3379
3380                    // Elemente in geschützten Bereichen überspringen (kein .click() per Tastatur drauf)
3381                    if (bfSkipWithin && el.closest) {
3382                        try { if (el.closest(bfSkipWithin)) { return; } } catch(e) {}
3383                    }
3384
3385                    const role = el.getAttribute('role');
3386                    const isPseudoButton =
3387                        role === 'button' ||
3388                        el.classList.contains(accordionTitleClass) ||
3389                        el.hasAttribute('data-bf-click');
3390
3391                    if (!isPseudoButton) {
3392                        return;
3393                    }
3394
3395                    if (el.classList.contains(accordionTitleClass)) {
3396                        return;
3397                    }
3398
3399                    if (el.getAttribute(INIT_KEY_ATTR) === '1') {
3400                        return;
3401                    }
3402
3403                    el.setAttribute(INIT_KEY_ATTR, '1');
3404
3405                    el.addEventListener('keydown', function (e) {
3406                        if (e.key === 'Enter' || e.key === ' ') {
3407                            e.preventDefault();
3408                            el.click();
3409                        }
3410                    });
3411                });
3412            }
3413
3414            function refreshObservedStates(scope) {
3415                const root = scope && scope.querySelectorAll ? scope : document;
3416
3417                root.querySelectorAll(accordionSel).forEach(function (toggle) {
3418                    const title = toggle.querySelector(accordionTitleSel);
3419                    if (!title) {
3420                        return;
3421                    }
3422
3423                    syncToggleAria(toggle, title);
3424
3425                    if (toggle.getAttribute(OBSERVED_ATTR) === '1') {
3426                        return;
3427                    }
3428
3429                    toggle.setAttribute(OBSERVED_ATTR, '1');
3430
3431                    const stateObserver = new MutationObserver(function () {
3432                        syncToggleAria(toggle, title);
3433                    });
3434
3435                    stateObserver.observe(toggle, {
3436                        attributes: true,
3437                        attributeFilter: ['class']
3438                    });
3439                });
3440            }
3441
3442            function run(scope) {
3443                applyPriorityTabindex();
3444                applyBaseTabindexManager();
3445                applyAutoTabindexClasses();
3446                applyToggleFix();
3447                applyDiviFormCheckboxFix();
3448                applySafeUniversalKeyActivation();
3449                refreshObservedStates(scope || document);
3450            }
3451
3452            run(document);
3453
3454            /* Zentraler DOM-Bus statt eigenem MutationObserver */
3455            if (window.digeliteDOMBus) {
3456                window.digeliteDOMBus.register(function (mutations) {
3457                    const hasChanges = mutations.some(function (m) {
3458                        return m.type === 'childList' && (m.addedNodes.length || m.removedNodes.length);
3459                    });
3460                    if (hasChanges) run(document);
3461                });
3462            } else {
3463                let scheduled = false;
3464                const observer = new MutationObserver(function (mutations) {
3465                    if (scheduled) return;
3466                    const shouldRun = mutations.some(function (m) {
3467                        return m.type === 'childList' && (m.addedNodes.length || m.removedNodes.length);
3468                    });
3469                    if (!shouldRun) return;
3470                    scheduled = true;
3471                    window.requestAnimationFrame(function () { run(document); scheduled = false; });
3472                });
3473                if (document.body) observer.observe(document.body, { childList: true, subtree: true });
3474            }
3475
3476            let polls = 0;
3477            const maxPolls = 10;
3478            const poller = window.setInterval(function () {
3479                run(document);
3480                polls++;
3481                if (polls >= maxPolls) {
3482                    window.clearInterval(poller);
3483                }
3484            }, 300);
3485        }
3486
3487        if (document.readyState === 'loading') {
3488            document.addEventListener('DOMContentLoaded', initTabindexManager, { once: true });
3489        } else {
3490            initTabindexManager();
3491        }
3492    })();
3493    </script>
3493
3494    			
3494<script>
3495			document.addEventListener('DOMContentLoaded', function () {
3496				'use strict';
3497
3498				var animatedElements = document.querySelectorAll('.animate-text');
3499
3500				if (!animatedElements.length) {
3501					return;
3502				}
3503
3504				var prefersReducedMotion = false;
3505
3506				try {
3507					prefersReducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
3508				} catch (e) {
3509					prefersReducedMotion = false;
3510				}
3511
3512				/**
3513				 * Safely parse words from data attribute.
3514				 *
3515				 * @param {HTMLElement} element
3516				 * @returns {string[]}
3517				 */
3518				function getWordsFromDataAttribute(element) {
3519					if (!element) {
3520						return [];
3521					}
3522
3523					var rawWords = element.getAttribute('data-words');
3524
3525					if (!rawWords) {
3526						return [];
3527					}
3528
3529					try {
3530						var parsedWords = JSON.parse(rawWords);
3531
3532						if (!Array.isArray(parsedWords)) {
3533							return [];
3534						}
3535
3536						return parsedWords
3537							.filter(function (item) {
3538								return typeof item === 'string';
3539							})
3540							.map(function (item) {
3541								return item.trim();
3542							})
3543							.filter(function (item) {
3544								return item.length > 0;
3545							});
3546					} catch (error) {
3547						return [];
3548					}
3549				}
3550
3551				/**
3552				 * Set final static text as safe fallback.
3553				 *
3554				 * @param {HTMLElement} element
3555				 * @param {string[]} words
3556				 * @returns {void}
3557				 */
3558				function setFallbackText(element, words) {
3559					if (!element || !words.length) {
3560						return;
3561					}
3562
3563					element.textContent = words[words.length - 1];
3564				}
3565
3566				/**
3567				 * Ensure screen readers get a stable label.
3568				 *
3569				 * If animated text is visually decorative or changes rapidly,
3570				 * a stable aria-label prevents repetitive/fragmented announcements.
3571				 *
3572				 * @param {HTMLElement} element
3573				 * @param {string[]} words
3574				 * @returns {void}
3575				 */
3576				function applyAccessibilityAttributes(element, words) {
3577					if (!element || !words.length) {
3578						return;
3579					}
3580
3581					if (!element.hasAttribute('aria-label')) {
3582						element.setAttribute('aria-label', words[words.length - 1]);
3583					}
3584
3585					element.setAttribute('aria-live', 'off');
3586				}
3587
3588				/**
3589				 * Animate text with typewriter effect.
3590				 *
3591				 * @param {HTMLElement} element
3592				 * @param {string[]} words
3593				 * @returns {void}
3594				 */
3595				function startAnimation(element, words) {
3596					if (!element || !words.length) {
3597						return;
3598					}
3599
3600					var currentWord = 0;
3601					var currentLetter = 0;
3602					var adding = true;
3603
3604					element.textContent = '';
3605
3606					function animate() {
3607						if (!document.body.contains(element)) {
3608							return;
3609						}
3610
3611						if (
3612							!words[currentWord] ||
3613							typeof words[currentWord] !== 'string'
3614						) {
3615							setFallbackText(element, words);
3616							return;
3617						}
3618
3619						if (adding) {
3620							if (currentLetter < words[currentWord].length) {
3621								element.textContent += words[currentWord].charAt(currentLetter);
3622								currentLetter++;
3623							}
3624
3625							if (currentLetter === words[currentWord].length) {
3626								if (currentWord === words.length - 1) {
3627									return;
3628								}
3629
3630								adding = false;
3631								window.setTimeout(animate, 1500);
3632								return;
3633							}
3634						} else {
3635							element.textContent = element.textContent.slice(0, -1);
3636
3637							if (element.textContent.length === 0) {
3638								adding = true;
3639								currentWord++;
3640								currentLetter = 0;
3641
3642								if (currentWord >= words.length) {
3643									setFallbackText(element, words);
3644									return;
3645								}
3646
3647								window.setTimeout(animate, 200);
3648								return;
3649							}
3650						}
3651
3652						window.setTimeout(animate, 200);
3653					}
3654
3655					animate();
3656				}
3657
3658				/**
3659				 * Initialize a single element.
3660				 *
3661				 * @param {HTMLElement} element
3662				 * @returns {void}
3663				 */
3664				function initElement(element) {
3665					var words = getWordsFromDataAttribute(element);
3666
3667					if (!words.length) {
3668						return;
3669					}
3670
3671					applyAccessibilityAttributes(element, words);
3672
3673					// Reduced motion: show final word directly.
3674					if (prefersReducedMotion) {
3675						setFallbackText(element, words);
3676						return;
3677					}
3678
3679					startAnimation(element, words);
3680				}
3681
3682				/**
3683				 * Use IntersectionObserver if supported.
3684				 */
3685				if ('IntersectionObserver' in window) {
3686					var observer = new IntersectionObserver(function (entries, currentObserver) {
3687						entries.forEach(function (entry) {
3688							if (!entry.isIntersecting) {
3689								return;
3690							}
3691
3692							initElement(entry.target);
3693							currentObserver.unobserve(entry.target);
3694						});
3695					}, {
3696						root: null,
3697						rootMargin: '0px',
3698						threshold: 0.1
3699					});
3700
3701					animatedElements.forEach(function (element) {
3702						observer.observe(element);
3703					});
3704				} else {
3705					// Fallback for older browsers: initialize immediately.
3706					animatedElements.forEach(function (element) {
3707						initElement(element);
3708					});
3709				}
3710			});
3711			</script>
3711
3712			</body>
3713</html>
3714<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: 1. October 2026 4:01 (Europe/Berlin UTC:1) -->

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.