diff --git a/Profice WebSite/images/icons/mail.PNG b/Profice WebSite/images/icons/mail.PNG new file mode 100644 index 0000000..f9c0ebf Binary files /dev/null and b/Profice WebSite/images/icons/mail.PNG differ diff --git a/Profice WebSite/images/icons/phone.PNG b/Profice WebSite/images/icons/phone.PNG new file mode 100644 index 0000000..5ba55cc Binary files /dev/null and b/Profice WebSite/images/icons/phone.PNG differ diff --git a/Profice WebSite/index.html b/Profice WebSite/index.html index 605ed12..b880fca 100644 --- a/Profice WebSite/index.html +++ b/Profice WebSite/index.html @@ -56,12 +56,6 @@
- Keine Mindestlaufzeit über 3 Monate - Danach monatlich kündbar - Keine versteckten Kosten + ✓ Keine Mindestlaufzeit über 3 Monate + ✓ Danach monatlich kündbar + ✓ Keine versteckten Kosten
@@ -374,6 +368,7 @@
+

In 3 Schritten zum digitalen Mitarbeiter.

@@ -413,6 +408,7 @@
+

Messbare Ergebnisse

diff --git a/Profice WebSite/scripts/add/send.php b/Profice WebSite/scripts/add/send.php index f576ef4..7c31e24 100644 --- a/Profice WebSite/scripts/add/send.php +++ b/Profice WebSite/scripts/add/send.php @@ -187,39 +187,102 @@ function checkRateLimit($ip) { function sendToWebhook($data, $webhookUrl = null) { $url = $webhookUrl ?? WEBHOOK_URL; + $jsonData = json_encode($data); - $ch = curl_init(); - curl_setopt_array($ch, [ - CURLOPT_URL => $url, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => json_encode($data), - CURLOPT_HTTPHEADER => [ - 'Content-Type: application/json', - 'User-Agent: Profice-Web-API/2.0' - ], - CURLOPT_TIMEOUT => 30, - CURLOPT_SSL_VERIFYPEER => false, // Disable SSL verification for n8n connection - CURLOPT_SSL_VERIFYHOST => false, // Disable host verification - CURLOPT_FOLLOWLOCATION => true - ]); + // Log the attempt + error_log("Webhook attempt - URL: " . $url . " - Data length: " . strlen($jsonData)); + + // Try cURL first if available + if (function_exists('curl_init')) { + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $jsonData, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Accept: application/json', + 'User-Agent: Profice-Web-API/2.0' + ], + CURLOPT_TIMEOUT => 30, + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_MAXREDIRS => 3 + ]); - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $error = curl_error($ch); - $errno = curl_errno($ch); - curl_close($ch); + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); + $errno = curl_errno($ch); + curl_close($ch); - if ($error) { - error_log("Webhook Error [$errno]: " . $error . " - URL: " . $url); - return ['success' => false, 'error' => $error, 'errno' => $errno, 'response' => $response]; + error_log("Webhook cURL response - HTTP: $httpCode, Error: $error, Response: " . substr($response, 0, 500)); + + if (!$error && $httpCode > 0) { + return [ + 'success' => $httpCode >= 200 && $httpCode < 300, + 'http_code' => $httpCode, + 'response' => $response, + 'error' => $error, + 'method' => 'curl' + ]; + } + + error_log("Webhook cURL failed [$errno]: $error - trying file_get_contents fallback"); } - + + // Fallback to file_get_contents if cURL fails or unavailable + $context = stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'header' => "Content-Type: application/json\r\nAccept: application/json\r\nUser-Agent: Profice-Web-API/2.0\r\n", + 'content' => $jsonData, + 'timeout' => 30, + 'ignore_errors' => true + ], + 'ssl' => [ + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] + ]); + + $response = @file_get_contents($url, false, $context); + + // Get HTTP response code from headers + $httpCode = 0; + if (isset($http_response_header) && is_array($http_response_header)) { + foreach ($http_response_header as $header) { + if (preg_match('/^HTTP\/\d+\.?\d*\s+(\d+)/', $header, $matches)) { + $httpCode = (int)$matches[1]; + } + } + } + + error_log("Webhook file_get_contents response - HTTP: $httpCode, Response: " . substr($response ?: '', 0, 500)); + + if ($response !== false) { + return [ + 'success' => $httpCode >= 200 && $httpCode < 300, + 'http_code' => $httpCode, + 'response' => $response, + 'error' => null, + 'method' => 'file_get_contents' + ]; + } + + $lastError = error_get_last(); + error_log("Webhook all methods failed - Last error: " . json_encode($lastError)); + return [ - 'success' => $httpCode >= 200 && $httpCode < 300, - 'http_code' => $httpCode, - 'response' => $response, - 'error' => $error + 'success' => false, + 'error' => $lastError['message'] ?? 'All HTTP methods failed', + 'errno' => 0, + 'response' => null, + 'method' => 'none' ]; } diff --git a/Profice WebSite/scripts/chat.js b/Profice WebSite/scripts/chat.js index f9759e5..85d6261 100644 --- a/Profice WebSite/scripts/chat.js +++ b/Profice WebSite/scripts/chat.js @@ -145,10 +145,16 @@ class KIChat { this.isTyping = true; try { - const response = await fetch('/scripts/add/send.php', { + // Use relative path that works from any page location + const basePath = window.location.pathname.includes('/') ? + window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) : '/'; + const apiUrl = new URL('/scripts/add/send.php', window.location.origin).href; + + const response = await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', + 'Accept': 'application/json' }, body: JSON.stringify({ type: 'chat', diff --git a/Profice WebSite/scripts/leads.js b/Profice WebSite/scripts/leads.js index 18fb993..38ca2dd 100644 --- a/Profice WebSite/scripts/leads.js +++ b/Profice WebSite/scripts/leads.js @@ -1,22 +1,9 @@ // leads.js // ========================================== -// 1. MENU TOGGLE +// 1. MENU TOGGLE (REMOVED) // ========================================== -const menuToggle = document.getElementById('menuToggle'); -const slideMenu = document.getElementById('slideMenu'); -const overlay = document.getElementById('overlay'); - -if (menuToggle && slideMenu && overlay) { - function toggleMenu() { - menuToggle.classList.toggle('active'); - slideMenu.classList.toggle('active'); - overlay.classList.toggle('active'); - } - - menuToggle.addEventListener('click', toggleMenu); - overlay.addEventListener('click', toggleMenu); -} +// Menu toggle functionality has been removed // ========================================== // 2. LEADS TABLE LOGIC diff --git a/Profice WebSite/scripts/script.js b/Profice WebSite/scripts/script.js index c6158c7..4e647ff 100644 --- a/Profice WebSite/scripts/script.js +++ b/Profice WebSite/scripts/script.js @@ -199,22 +199,10 @@ document.addEventListener("DOMContentLoaded", function() { initPhoneCallFunctionality(); // ========================================== - // 2. MENU TOGGLE + // 2. MENU TOGGLE (REMOVED) // ========================================== - const menuToggle = document.getElementById('menuToggle'); - const slideMenu = document.getElementById('slideMenu'); - const overlay = document.getElementById('overlay'); - - if (menuToggle && slideMenu && overlay) { - const toggleMenu = () => { - menuToggle.classList.toggle('active'); - slideMenu.classList.toggle('active'); - overlay.classList.toggle('active'); - }; - menuToggle.addEventListener('click', toggleMenu); - overlay.addEventListener('click', toggleMenu); - } + // Menu toggle functionality has been removed // ========================================== // 3. LOGIN BUTTON (REMOVED) diff --git a/Profice WebSite/style/cursor.css b/Profice WebSite/style/cursor.css index 89300ee..9a21dcc 100644 --- a/Profice WebSite/style/cursor.css +++ b/Profice WebSite/style/cursor.css @@ -8,7 +8,6 @@ body.system-cursor button, body.system-cursor input, body.system-cursor textarea, body.system-cursor select, -body.system-cursor .menu-toggle, body.system-cursor label, body.system-cursor [role="button"], body.system-cursor [onclick], @@ -24,7 +23,6 @@ body:not(.system-cursor) button, body:not(.system-cursor) input, body:not(.system-cursor) textarea, body:not(.system-cursor) select, -body:not(.system-cursor) .menu-toggle, body:not(.system-cursor) label, body:not(.system-cursor) [role="button"], body:not(.system-cursor) [onclick], @@ -38,7 +36,6 @@ body:not(.system-cursor) button, body:not(.system-cursor) .btn, body:not(.system-cursor) .offer-card, body:not(.system-cursor) .service-card, -body:not(.system-cursor) .menu-toggle, body:not(.system-cursor) #cursorToggle { cursor: none !important; } diff --git a/Profice WebSite/style/design.css b/Profice WebSite/style/design.css index 9a3c32a..e8a9029 100644 --- a/Profice WebSite/style/design.css +++ b/Profice WebSite/style/design.css @@ -3,10 +3,10 @@ display: flex; align-items: center; justify-content: center; - gap: 10px; - height: 100px; + gap: 8px; + height: 80px; margin-top: 80px; - margin-bottom: 30px; + margin-bottom: 20px; opacity: 1; transition: opacity 0.3s ease; } @@ -16,21 +16,21 @@ } .sound-bar { - width: 10px; + width: 8px; background: linear-gradient(to top, var(--accent-orange), var(--accent-teal)); - border-radius: 5px; + border-radius: 4px; animation: soundWave 1.2s ease-in-out infinite; transform-origin: bottom; } -.sound-bar:nth-child(1) { animation-delay: 0s; height: 25px; } -.sound-bar:nth-child(2) { animation-delay: 0.1s; height: 40px; } -.sound-bar:nth-child(3) { animation-delay: 0.2s; height: 32px; } -.sound-bar:nth-child(4) { animation-delay: 0.3s; height: 50px; } -.sound-bar:nth-child(5) { animation-delay: 0.4s; height: 40px; } -.sound-bar:nth-child(6) { animation-delay: 0.5s; height: 28px; } -.sound-bar:nth-child(7) { animation-delay: 0.6s; height: 45px; } -.sound-bar:nth-child(8) { animation-delay: 0.7s; height: 35px; } +.sound-bar:nth-child(1) { animation-delay: 0s; height: 20px; } +.sound-bar:nth-child(2) { animation-delay: 0.1s; height: 32px; } +.sound-bar:nth-child(3) { animation-delay: 0.2s; height: 26px; } +.sound-bar:nth-child(4) { animation-delay: 0.3s; height: 40px; } +.sound-bar:nth-child(5) { animation-delay: 0.4s; height: 32px; } +.sound-bar:nth-child(6) { animation-delay: 0.5s; height: 24px; } +.sound-bar:nth-child(7) { animation-delay: 0.6s; height: 36px; } +.sound-bar:nth-child(8) { animation-delay: 0.7s; height: 28px; } @keyframes soundWave { 0%, 100% { @@ -181,27 +181,6 @@ body { height: 40px; } -.menu-toggle { - background: transparent; - border: 2px solid var(--primary-dark); - color: var(--primary-dark); - width: 45px; - height: 45px; - border-radius: 12px; - cursor: pointer; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); -} - -.top-banner.scrolled .menu-toggle, -.top-banner.scrolled #cursorToggle { - width: 35px; - height: 35px; -} - .opening-hours { font-size: 14px; color: var(--primary-mid); @@ -408,22 +387,6 @@ body { transition: font-size 0.25s cubic-bezier(0.4, 0, 0.2, 1), padding 0.25s cubic-bezier(0.4, 0, 0.2, 1); } -.menu-toggle { - background: transparent; - border: 2px solid var(--primary-dark); - color: var(--primary-dark); - width: 45px; - height: 45px; - border-radius: 12px; - cursor: pointer; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 5px; - transition: background 0.3s ease, color 0.3s ease, width 0.25s cubic-bezier(0.4, 0, 0.2, 1), height 0.25s cubic-bezier(0.4, 0, 0.2, 1); -} - #cursorToggle { background: transparent; border: 2px solid var(--primary-dark); @@ -447,7 +410,6 @@ body { opacity: 1 !important; filter: none !important; } - #cursorToggle:hover { background: var(--primary-dark); } @@ -457,90 +419,6 @@ body { opacity: 1 !important; } -.menu-toggle:hover { - background: var(--primary-dark); -} - -.menu-toggle:hover span { - background: var(--primary-light); -} - -.menu-toggle span { - display: block; - width: 20px; - height: 2px; - background: var(--primary-dark); - border-radius: 2px; - transition: all 0.3s ease; -} - -.menu-toggle.active { - background: var(--primary-dark); -} - -.menu-toggle.active span { - background: var(--primary-light); -} - -.menu-toggle.active span:nth-child(1) { - transform: rotate(45deg) translate(5px, 5px); -} - -.menu-toggle.active span:nth-child(2) { - opacity: 0; -} - -.menu-toggle.active span:nth-child(3) { - transform: rotate(-45deg) translate(5px, -5px); -} - -/* Slide Menu */ -.slide-menu { - position: fixed; - top: 110px; - left: -280px; - width: 280px; - background: white; - box-shadow: 4px 0 25px rgba(79, 71, 71, 0.15); - border-radius: 0 20px 20px 0; - padding: 30px 0; - transition: left 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94), top 0.3s ease; - z-index: 1000; -} - -.top-banner.scrolled ~ .slide-menu, -.top-banner.scrolled + .overlay + .slide-menu { - top: 80px; -} - -.slide-menu.active { - left: 0; -} - -.slide-menu a { - display: block; - padding: 18px 30px; - color: var(--primary-dark); - text-decoration: none; - font-size: 17px; - font-weight: 500; - transition: all 0.3s ease; - border-left: 4px solid transparent; -} - -.slide-menu a:hover { - background: var(--primary-light); - border-left-color: var(--accent-teal); - padding-left: 40px; - color: var(--accent-teal); -} - -.slide-menu a.active { - background: var(--primary-light); - border-left-color: var(--accent-teal); - color: var(--accent-teal); -} - /* Main Content */ .main-content { max-width: 700px; @@ -801,22 +679,6 @@ body { color: var(--primary-light); } -.top-banner.dark-theme .menu-toggle { - border-color: var(--primary-light); -} - -.top-banner.dark-theme .menu-toggle span { - background: var(--primary-light); -} - -.top-banner.dark-theme .menu-toggle:hover { - background: var(--primary-light); -} - -.top-banner.dark-theme .menu-toggle:hover span { - background: var(--primary-dark); -} - /* 2. Home Page Layout */ .home-content { max-width: 1200px; @@ -1200,21 +1062,6 @@ body { height: 32px; } - .menu-toggle { - width: 38px; - height: 38px; - } - - .top-banner.scrolled .menu-toggle { - width: 32px; - height: 32px; - } - - #cursorToggle { - width: 38px; - height: 38px; - } - .top-banner.scrolled #cursorToggle { width: 32px; height: 32px; @@ -1248,7 +1095,6 @@ body { height: 28px; } - .menu-toggle, #cursorToggle { width: 34px; height: 34px; @@ -1956,8 +1802,7 @@ body { display: block; color: var(--accent-teal); font-size: 0.85rem; - font-weight: 600; - letter-spacing: 1px; + font-weight: 500; margin-bottom: 15px; } @@ -1965,6 +1810,14 @@ body { text-align: center; } +.process-section .section-label { + text-align: center; +} + +.results-section .section-label { + text-align: center; +} + .problems-headline { font-size: 2.5rem; color: var(--primary-dark);