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&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 & 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 & 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&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> 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&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 & 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 & 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 & 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.