{"id":36156,"date":"2022-09-22T09:53:50","date_gmt":"2022-09-22T07:53:50","guid":{"rendered":"https:\/\/padelcreations.com\/?page_id=36156"},"modified":"2026-10-23T12:52:57","modified_gmt":"2026-10-23T10:52:57","slug":"padel-grundriss-online","status":"publish","type":"page","link":"https:\/\/www.padelcreations.com\/de\/padel-grundriss-online\/","title":{"rendered":"Grundriss Planer f\u00fcr Padel"},"content":{"rendered":"<div class=\"product\"><div class=\"product\">\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"36156\" class=\"elementor elementor-36156 elementor-18645\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-89d85b6 start_working unlock e-grid e-con-boxed e-con e-parent\" data-id=\"89d85b6\" data-element_type=\"container\" data-e-type=\"container\" id=\"start_working unlock\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_bottom&quot;:&quot;triangle-asymmetrical&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-bottom\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M738,99l262-93V0H0v5.6L738,99z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bd2f2a5 elementor-widget elementor-widget-heading\" data-id=\"bd2f2a5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Grundriss Planer f\u00fcr Padel<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e576e1 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"4e576e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Planen Sie, mit Padel zu starten, und m\u00f6chten wissen, wie viele Padelpl\u00e4tze in den verf\u00fcgbaren Raum passen?<\/p><p>Dieses einzigartige und weltweit erste Online-Tool, das exklusiv f\u00fcr PADEL entwickelt wurde, wird Ihre Frage mit Sicherheit beantworten. Es ist eine Innovation in der Padel-Branche und wurde von PADELCREATIONS entwickelt. Das Beste daran: Es ist f\u00fcr jeden kostenlos nutzbar.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-926674d elementor-hidden-desktop e-flex e-con-boxed e-con e-parent\" data-id=\"926674d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-3e01aa3 e-con-full e-flex e-con e-child\" data-id=\"3e01aa3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97770c6 elementor-widget elementor-widget-heading\" data-id=\"97770c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">HINWEIS:<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ec5451c elementor-widget elementor-widget-text-editor\" data-id=\"ec5451c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Das 2D-Tool ist ausschlie\u00dflich f\u00fcr die Nutzung auf <strong>Desktop-Computern<\/strong> optimiert. Aufgrund der begrenzten Bildschirmaufl\u00f6sung und der Benutzeroberfl\u00e4chen-Einschr\u00e4nkungen wird das Tool auf Smartphones und Tablets nicht unterst\u00fctzt.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-8805478 elementor-hidden-mobile elementor-hidden-tablet e-flex e-con-boxed e-con e-parent\" data-id=\"8805478\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a8532e1 elementor-widget elementor-widget-off-canvas\" data-id=\"a8532e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"off-canvas.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div id=\"off-canvas-a8532e1\" class=\"e-off-canvas\" role=\"dialog\" aria-hidden=\"true\" aria-label=\"video tutorial\" aria-modal=\"true\" inert=\"\" data-delay-child-handlers=\"true\">\n\t\t\t<div class=\"e-off-canvas__overlay\"><\/div>\n\t\t\t<div class=\"e-off-canvas__main\">\n\t\t\t\t<div class=\"e-off-canvas__content\">\n\t\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-b3360ce e-con-full e-flex e-con e-child\" data-id=\"b3360ce\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-156f77c elementor-widget elementor-widget-video\" data-id=\"156f77c\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;video_type&quot;:&quot;hosted&quot;,&quot;controls&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-hosted-video elementor-wrapper elementor-open-inline\">\n\t\t\t\t\t<video class=\"elementor-video\" src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2025\/01\/Tutorial-2D-Planner-2023-DEU-V2.mp4\" controls=\"\" preload=\"metadata\" controlsList=\"nodownload\"><\/video>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d5a58b elementor-align-center elementor-widget elementor-widget-button\" data-id=\"4d5a58b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-md elementor-animation-grow\" href=\"#elementor-action%3Aaction%3Doff_canvas%3Aopen%26settings%3DeyJpZCI6ImE4NTMyZTEiLCJkaXNwbGF5TW9kZSI6Im9wZW4ifQ%3D%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-video\" viewBox=\"0 0 576 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M336.2 64H47.8C21.4 64 0 85.4 0 111.8v288.4C0 426.6 21.4 448 47.8 448h288.4c26.4 0 47.8-21.4 47.8-47.8V111.8c0-26.4-21.4-47.8-47.8-47.8zm189.4 37.7L416 177.3v157.4l109.6 75.5c21.2 14.6 50.4-.3 50.4-25.8V127.5c0-25.4-29.1-40.4-50.4-25.8z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">VIDEOANLEITUNG<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e6e680 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"0e6e680\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-md elementor-animation-grow\" href=\"#elementor-action%3Aaction%3Doff_canvas%3Aopen%26settings%3DeyJpZCI6ImI3YTM4YzgiLCJkaXNwbGF5TW9kZSI6Im9wZW4ifQ%3D%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-info-circle\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">SCHNELLANLEITUNG<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7a38c8 elementor-widget elementor-widget-off-canvas\" data-id=\"b7a38c8\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;prevent_scroll&quot;:&quot;yes&quot;}\" data-widget_type=\"off-canvas.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div id=\"off-canvas-b7a38c8\" class=\"e-off-canvas\" role=\"dialog\" aria-hidden=\"true\" aria-label=\"start guide\" aria-modal=\"true\" inert=\"\" data-delay-child-handlers=\"true\">\n\t\t\t<div class=\"e-off-canvas__overlay\"><\/div>\n\t\t\t<div class=\"e-off-canvas__main\">\n\t\t\t\t<div class=\"e-off-canvas__content\">\n\t\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-a8c077d e-con-full e-flex e-con e-child\" data-id=\"a8c077d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-91b4130 e-flex e-con-boxed e-con e-child\" data-id=\"91b4130\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;shape_divider_bottom&quot;:&quot;triangle-asymmetrical&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-shape elementor-shape-bottom\" aria-hidden=\"true\" data-negative=\"false\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1000 100\" preserveAspectRatio=\"none\">\n\t<path class=\"elementor-shape-fill\" d=\"M738,99l262-93V0H0v5.6L738,99z\"\/>\n<\/svg>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-49e7573 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"49e7573\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">SCHNELLANLEITUNG<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-750c4b9 e-flex e-con-boxed e-con e-child\" data-id=\"750c4b9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a0a5346 elementor-widget elementor-widget-text-editor\" data-id=\"a0a5346\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div id=\"modal-46447d6\" class=\"uael-modal uael-modal-custom uael-modal-content uael-effect-19 uael-aspect-ratio-16_9 uael-show\"><div class=\"uael-content\"><div class=\"uael-modal-text uael-modal-content-data clearfix\"><div class=\"uael-text-editor elementor-inline-editing\" data-elementor-setting-key=\"ct_content\" data-elementor-inline-editing-toolbar=\"advanced\"><blockquote><p><strong>SCHRITT 1:\u00a0<\/strong>\u00a0Standardm\u00e4\u00dfig ist es metrisch. Nicht verstellbar.\u00a0\u00a0<strong>Raster: 1 Quadrat = 1 x 1 m<\/strong><\/p><p><strong>SCHRITT 2:\u00a0<\/strong>Geben Sie die Abmessungen des Bereichs ein, in dem Sie die Padel Courts installieren m\u00f6chten.<\/p><p><strong>SCHRITT 3:\u00a0<\/strong>Direkt unter dem Bereich &#8222;Fl\u00e4chenma\u00dfe&#8220; sehen Sie die Grafik eines Padelplatzes in der normalen Gr\u00f6\u00dfe von 20 x 10 m und in der Gr\u00f6\u00dfe 20 x 6 m, sowie die sich gr\u00f6ssenverstellbare Objekte in rot.<strong>\u00a0Sie k\u00f6nnen alle diese Objekte in den Bereich reinziehen, indem Sie mit der Maus \u00fcber das Objekt fahren und es mit gedr\u00fcckter rechter Maustaste in den Bereich ziehen.<\/strong>\u00a0An dieser Stelle beginnen Sie mit den gr\u00f6\u00dfenverstellbaren Objekten, wie z. B. S\u00e4ulen, Ecken, Sozialbereich, Laden, Umkleider\u00e4ume, B\u00fcros, Rezeption usw.). Die Padelpl\u00e4tze haben eine feste Gr\u00f6\u00dfe und k\u00f6nnen nicht in der Gr\u00f6\u00dfe angepasst werden.<\/p><p><strong>SCHRITT 4:\u00a0<\/strong><strong>ZIEHEN, ENTFERNEN, KLICKEN, VERSCHIEBEN, DREHEN und BESCHRIFTEN<\/strong>\u00a0Mit den Tasten\u00a0<strong>-5\u00ba<\/strong>,\u00a0<strong>+5\u00ba<\/strong>\u00a0oder\u00a0<strong>+90\u00ba\u00a0<\/strong>k\u00f6nnen Sie die Padel Courts in die gew\u00fcnschte Position bringen. Um das Objekt verschieben zu k\u00f6nnen, muss es zun\u00e4chst angeklickt werden. Das Objekt erh\u00e4lt einen roten Rahmen.<br \/>Sie k\u00f6nnen das Objekt in Schritten von -5\u00ba, + 5\u00ba oder + 90\u00ba drehen. Bringen Sie die Padelpl\u00e4tze in die gew\u00fcnschte Position. Sie k\u00f6nnen so viele Padelpl\u00e4tze hinzuf\u00fcgen, wie Sie m\u00f6chten und passen. Die Anzahl der Padelpl\u00e4tze h\u00e4ngt dann auch vom verf\u00fcgbaren Platz ab.\u00a0<strong>Kennzeichnen Sie jedes Objekt mit einer kurzen Beschreibung.<\/strong><\/p><p><strong>SCHRITT 5:\u00a0<\/strong>F\u00fcgen Sie Ihr Layout in unserem\u00a0<strong>Padel Court Konfigurator<\/strong>\u00a0hinzu, um Ihre Angebotsanfrage zu vervollst\u00e4ndigen. Das wird uns helfen, unsere Magie zu entfalten.<\/p><p><strong>SCHRITT 6:<\/strong>\u00a0<strong>SPEICHERN SIE IHRE ARBEIT, DAMIT SIE AM N\u00c4CHSTEN TAG WEITERMACHEN K\u00d6NNEN.<\/strong><br \/><strong>BILD ALS PNG SPEICHERN<\/strong>:\u00a0Sie k\u00f6nnen Ihre neue Grundrisszeichnung als Bilddatei (PNG) herunterladen.<br \/><strong>DATEI SPEICHERN:<\/strong>\u00a0Sie k\u00f6nnen Ihre Grundrisszeichnung als Datendatei herunterladen.<br \/><strong>DATEI LADEN:<\/strong>\u00a0Sie k\u00f6nnen Ihre Grundrisszeichnung erneut hochladen und mit der Arbeit an Ihrem Projekt fortfahren.<\/p><\/blockquote><\/div><\/div><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-016846f elementor-hidden-mobile elementor-hidden-tablet e-flex e-con-boxed e-con e-parent\" data-id=\"016846f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-973d44f e-con-full e-flex e-con e-child\" data-id=\"973d44f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5eb22d8 elementor-widget elementor-widget-text-editor\" data-id=\"5eb22d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong><span style=\"color: red;\">\u27a1\ufe0f\u200b Erster Schritt:<\/span><\/strong> Klicken Sie auf das Padel-Spielfeld in der Mitte des Feldes, um es zu bewegen.<br \/>Siehe auch:\u00a0 \u00a0<a href=\"\/de\/grundrisszeichnungen-von-padel-clubs\/\" target=\"_blank\" rel=\"noopener\">Grundrisszeichnungen f\u00fcr Padelanlagen<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fbc8747 elementor-widget elementor-widget-html\" data-id=\"fbc8747\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =========================================================\r\n     PadelCreations \u2013 Unlock widget (Elementor HTML widget)\r\n     Personal access code (e.g. P-16847-58274), validated\r\n     server-side in Zoho. Master code in wp-config.php.\r\n     Bilingual: German on pages with <html lang=\"de-\u2026\">,\r\n     English everywhere else. Same widget for both pages.\r\n     Requires the PHP snippet: pc-unlock-snippet.php\r\n     ========================================================= -->\r\n\r\n<button id=\"show-password-section\" data-t=\"show\">\ud83d\udc49 UNLOCK RESTRICTIONS<\/button>\r\n\r\n<style>\r\n#show-password-section {\r\n  background: linear-gradient(135deg, #1c3757, #0000ff);\r\n  color: white;\r\n  font-size: 15px;\r\n  font-weight: 600;\r\n  padding: 12px 28px;\r\n  border: none;\r\n  border-radius: 12px;\r\n  cursor: pointer;\r\n  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);\r\n  animation: floatSideways 3s ease-in-out infinite;\r\n  transition: all 0.4s ease;\r\n}\r\n@keyframes floatSideways {\r\n  0%, 100% { transform: translateX(0); background: linear-gradient(135deg, #1c3757, #0000ff); }\r\n  50% { transform: translateX(8px); background: linear-gradient(135deg, #76a343, #1c3757); }\r\n}\r\n#show-password-section:hover {\r\n  transform: scale(1.05);\r\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\r\n  background: linear-gradient(135deg, #76a343, #1c3757);\r\n}\r\n@media (prefers-reduced-motion: reduce) { #show-password-section { animation: none; } }\r\n#unlock-btn {\r\n  display: inline-flex; align-items: center; gap: 8px;\r\n  background: linear-gradient(135deg, #76a343, #4f8a1f); color: #fff;\r\n  font-size: 15px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;\r\n  padding: 10px 24px; border: none; border-radius: 10px; cursor: pointer;\r\n  box-shadow: 0 6px 18px rgba(79,138,31,.35); transition: transform .15s, box-shadow .15s, background .2s;\r\n}\r\n#unlock-btn:hover { transform: translateY(-2px); box-shadow: 0 10px 24px rgba(79,138,31,.45); }\r\n#unlock-btn:focus-visible { outline: 3px solid #1c3757; outline-offset: 2px; }\r\n#unlock-btn.is-checking { background: linear-gradient(135deg, #1c3757, #2d4f7c); cursor: wait; transform: none; }\r\n#unlock-btn.is-checking::before {\r\n  content: \"\"; width: 14px; height: 14px; border: 2px solid rgba(255,255,255,.35); border-top-color: #fff;\r\n  border-radius: 50%; animation: pcSpin .7s linear infinite;\r\n}\r\n#unlock-btn.is-ok { background: linear-gradient(135deg, #76a343, #4f8a1f); cursor: default; }\r\n@keyframes pcSpin { to { transform: rotate(360deg); } }\r\n@media (prefers-reduced-motion: reduce) { #unlock-btn.is-checking::before { animation: none; } }\r\n#unlock-password { border: 2px solid #d0d6e0; border-radius: 10px; }\r\n#unlock-password:focus { outline: none; border-color: #76a343; box-shadow: 0 0 0 3px rgba(118,163,67,.18); }\r\n#unlock-password { font-family: monospace; letter-spacing: 0.04em; text-transform: uppercase; max-width: 100%; }\r\n#unlock-password::placeholder { text-transform: none; letter-spacing: 0; font-family: inherit; }\r\n<\/style>\r\n\r\n<!-- Code container (initially hidden) -->\r\n<div id=\"password-wrapper\" style=\"max-width: 700px; margin: 20px; background-color: #f7f7f7; padding: 10px; border-radius: 8px; display: none; opacity: 0; transition: opacity 3s;\">\r\n\r\n  <div id=\"unlock-container\" style=\"display: flex; gap: 10px; justify-content: center; align-items: center; margin: 20px; flex-wrap: wrap;\">\ud83d\udc49\r\n    <label for=\"unlock-password\" data-t=\"label\" style=\"position:absolute;left:-9999px;\">Your access code<\/label>\r\n    <input type=\"text\" id=\"unlock-password\" placeholder=\"Your access code, e.g. P-12345-67890\" autocomplete=\"off\" autocapitalize=\"characters\" spellcheck=\"false\" style=\"padding:8px 12px; width: 320px;\" \/>\r\n    <button id=\"unlock-btn\" type=\"button\" data-t=\"unlock\">Unlock<\/button>\r\n  <\/div>\r\n\r\n  <div id=\"password-error\" role=\"alert\" style=\"color: red; font-weight: bold; font-size: 14px; text-align: center; margin-top: 3px; display: none;\"><\/div>\r\n\r\n  <div class=\"password-info-message\" style=\"max-width: 600px; font-size: 16px; line-height: 1.6; text-align: center; margin: 0 auto;\">\r\n    <p><strong data-t=\"noCode\">Don't have your access code?<\/strong>\r\n      <span data-t=\"request\">Send us your project details<\/span>\r\n      <a id=\"unlock-contact\" href=\"https:\/\/www.padelcreations.com\/contact\/\" target=\"_blank\" style=\"color: #76a343; text-decoration: underline;\" data-t=\"here\">here<\/a>.<br>\r\n      <span data-t=\"sendMail\">Once we have received them, we'll email you your personal access code.<\/span>\r\n    <\/p>\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n\r\n  const SESSION_KEY = \"pc_tools_unlocked\";\r\n\r\n  \/* ---------- Language (German on \/de\/ pages) ---------- *\/\r\n  const DE = (document.documentElement.lang || \"\").toLowerCase().indexOf(\"de\") === 0;\r\n  const T = DE ? {\r\n    show: \"\ud83d\udc49 EINSCHR\u00c4NKUNGEN AUFHEBEN\",\r\n    label: \"Ihr Zugangscode\",\r\n    placeholder: \"Ihr Zugangscode, z. B. P-12345-67890\",\r\n    unlock: \"Freischalten\",\r\n    noCode: \"Sie haben noch keinen Zugangscode?\",\r\n    request: \"Senden Sie uns Ihre Projektdaten\",\r\n    here: \"\u00fcber dieses Formular\",\r\n    sendMail: \"Nach Erhalt senden wir Ihnen Ihren pers\u00f6nlichen Zugangscode per E-Mail.\",\r\n    contactUrl: \"https:\/\/www.padelcreations.com\/de\/kontakt\/\",\r\n    checking: \"Wird gepr\u00fcft\u2026\", unlocked: \"Freigeschaltet\",\r\n    empty: \"Bitte geben Sie Ihren Zugangscode ein.\",\r\n    unavailable: \"Freischaltung derzeit nicht verf\u00fcgbar. Bitte kontaktieren Sie uns.\",\r\n    wrong: \"Falscher Code. Bitte versuchen Sie es erneut.\",\r\n    expired: \"Code abgelaufen. Bitte kontaktieren Sie uns f\u00fcr eine Verl\u00e4ngerung.\",\r\n    network: \"Verbindungsfehler. Bitte versuchen Sie es erneut.\"\r\n  } : {\r\n    show: \"\ud83d\udc49 UNLOCK RESTRICTIONS\",\r\n    label: \"Your access code\",\r\n    placeholder: \"Your access code, e.g. P-12345-67890\",\r\n    unlock: \"Unlock\",\r\n    noCode: \"Don't have your access code?\",\r\n    request: \"Send us your project details\",\r\n    here: \"here\",\r\n    sendMail: \"Once we have received them, we'll email you your personal access code.\",\r\n    contactUrl: \"https:\/\/www.padelcreations.com\/contact\/\",\r\n    checking: \"Checking\u2026\", unlocked: \"Unlocked\",\r\n    empty: \"Please enter your access code.\",\r\n    unavailable: \"Unlock service not available. Please contact us.\",\r\n    wrong: \"Incorrect code. Please try again.\",\r\n    expired: \"Code expired. Please contact us to extend it.\",\r\n    network: \"Connection error. Please try again.\"\r\n  };\r\n  document.querySelectorAll(\"[data-t]\").forEach((el) => { const k = el.getAttribute(\"data-t\"); if (T[k]) el.textContent = T[k]; });\r\n  document.getElementById(\"unlock-password\").placeholder = T.placeholder;\r\n  document.getElementById(\"unlock-contact\").href = T.contactUrl;\r\n\r\n  \/* ---------- Show code section ---------- *\/\r\n  const btnShow = document.getElementById(\"show-password-section\");\r\n  btnShow.addEventListener(\"click\", function (e) {\r\n    e.preventDefault();\r\n    const wrapper = document.getElementById(\"password-wrapper\");\r\n    wrapper.style.display = \"block\";\r\n    setTimeout(() => {\r\n      wrapper.style.opacity = \"1\";\r\n      const target = document.querySelector(\"#start_working, .start_working\");\r\n      if (target) target.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n      document.getElementById(\"unlock-password\").focus();\r\n    }, 50);\r\n    this.style.display = \"none\";\r\n  });\r\n\r\n  const btnUnlock = document.getElementById(\"unlock-btn\");\r\n  const inputEl   = document.getElementById(\"unlock-password\");\r\n  const errorDiv  = document.getElementById(\"password-error\");\r\n\r\n  function showError(msg) {\r\n    errorDiv.textContent = msg;\r\n    errorDiv.style.display = \"block\";\r\n  }\r\n\r\n  \/* Removes the blur on every restricted section (planner has the new + original sidebar) *\/\r\n  function releaseRestrictions() {\r\n    document.querySelectorAll(\".blurred-section\").forEach((sec) => {\r\n      sec.classList.add(\"visible\");\r\n      const m = sec.querySelector(\".restriction-hover-message\");\r\n      if (m) m.style.display = \"none\";\r\n    });\r\n  }\r\n\r\n  function unlockTool(silent) {\r\n    releaseRestrictions();\r\n    try { sessionStorage.setItem(SESSION_KEY, \"1\"); } catch (_) {}\r\n    if (silent) return;\r\n    \/\/ Sin mensajes ni esperas: el bot\u00f3n confirma y la caja desaparece suavemente\r\n    errorDiv.style.display = \"none\";\r\n    btnUnlock.classList.remove(\"is-checking\"); btnUnlock.classList.add(\"is-ok\");\r\n    btnUnlock.textContent = \"\u2713 \" + T.unlocked; btnUnlock.disabled = true;\r\n    const wrapper = document.getElementById(\"password-wrapper\");\r\n    wrapper.style.transition = \"opacity .5s\"; wrapper.style.opacity = \"0\";\r\n    setTimeout(() => { wrapper.style.display = \"none\"; }, 550);\r\n  }\r\n\r\n  async function verifyCode() {\r\n    const input = inputEl.value.trim().toUpperCase().replace(\/\\s+\/g, \"\");\r\n    if (!input) { showError(T.empty); return; }\r\n\r\n    btnUnlock.disabled = true;\r\n    btnUnlock.classList.add(\"is-checking\"); btnUnlock.textContent = T.checking;\r\n    errorDiv.style.display = \"none\";\r\n    let ok = false;\r\n    try {\r\n      const body = new FormData();\r\n      body.append(\"action\", \"pc_verify_code\");\r\n      body.append(\"code\", input);\r\n      body.append(\"lang\", DE ? \"de\" : \"en\");\r\n      const res = await fetch(\"\/wp-admin\/admin-ajax.php\", { method: \"POST\", body: body, credentials: \"same-origin\" });\r\n      let data = null;\r\n      try { data = await res.json(); } catch (_) {}\r\n\r\n      if (data && data.success) {\r\n        \/\/ N\u00famero de proyecto (p. ej. P-16847) para las capturas 3D; con el c\u00f3digo de distribuidor no hay\r\n        try {\r\n          const pm = input.match(\/^([A-Z]+-\\d+)-\\d{5}$\/);\r\n          if (pm) sessionStorage.setItem(\"pc_tools_project\", pm[1]); else sessionStorage.removeItem(\"pc_tools_project\");\r\n        } catch (_) {}\r\n        ok = true; unlockTool(false);\r\n      } else if (data && data.data && data.data.expired) {\r\n        showError(T.expired);\r\n      } else if (data && data.data && data.data.message) {\r\n        showError(data.data.message);\r\n      } else if (res.status === 400) {\r\n        showError(T.unavailable);\r\n      } else {\r\n        showError(T.wrong);\r\n      }\r\n    } catch (err) {\r\n      showError(T.network);\r\n    } finally {\r\n      if (!ok) { btnUnlock.disabled = false; btnUnlock.classList.remove(\"is-checking\"); btnUnlock.textContent = T.unlock; }\r\n    }\r\n  }\r\n\r\n  btnUnlock.addEventListener(\"click\", verifyCode);\r\n  inputEl.addEventListener(\"keydown\", (e) => {\r\n    if (e.key === \"Enter\") { e.preventDefault(); verifyCode(); }\r\n  });\r\n\r\n  \/* Already unlocked in this browser session: release without asking again *\/\r\n  try {\r\n    if (sessionStorage.getItem(SESSION_KEY) === \"1\") {\r\n      unlockTool(true);\r\n      btnShow.style.display = \"none\";\r\n    }\r\n  } catch (_) {}\r\n\r\n  \/* ---------- Make restriction-hover-message clickable ---------- *\/\r\n  document.querySelectorAll(\".restriction-hover-message\").forEach((msg) => {\r\n    msg.style.pointerEvents = \"auto\";\r\n    msg.style.cursor = \"pointer\";\r\n    msg.addEventListener(\"click\", () => {\r\n      const unlockTarget = document.querySelector(\".unlock\");\r\n      if (unlockTarget) unlockTarget.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n      if (btnShow.style.display !== \"none\") btnShow.click();\r\n    });\r\n  });\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-74cbe1c elementor-widget elementor-widget-html\" data-id=\"74cbe1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n\r\n    <link href=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/css\/padelarea-3.css\" rel=\"stylesheet\">\r\n    <link href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\" rel=\"stylesheet\">\r\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow:wght@400;600;700&display=swap\" rel=\"stylesheet\">\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/drag-drop-touch@1.3.1\/DragDropTouch.js\"><\/script>\r\n\r\n    <script>\r\n        var lang = (document.documentElement.lang || 'en').substring(0, 2);\r\n        var isNS = (navigator.appName == \"Netscape\") ? 1 : 0;\r\n        if (navigator.appName == \"Netscape\") document.captureEvents(Event.MOUSEDOWN || Event.MOUSEUP);\r\n        document.addEventListener('contextmenu', function(e) { e.preventDefault(); });\r\n        if (window.location.hostname !== 'localhost') {\r\n            document.addEventListener('keydown', function(e) {\r\n                if (e.keyCode == 123) { e.preventDefault(); }\r\n                if (e.ctrlKey && e.shiftKey && e.keyCode == 73) { e.preventDefault(); }\r\n                if (e.ctrlKey && e.keyCode == 85) { e.preventDefault(); }\r\n            });\r\n        }\r\n    <\/script>\r\n\r\n    <style>\r\n    \/* ============================================================\r\n       DESIGN VARIABLES\r\n       ============================================================ *\/\r\n    :root {\r\n        --navy:        #1a2744;\r\n        --navy-mid:    #253a6e;\r\n        --navy-light:  #3d5fa0;\r\n        --pale:        #eef1f8;\r\n        --orange:      #ff7900;\r\n        --red:         #d92647;\r\n        --white:       #ffffff;\r\n        --grey-bg:     #f2f4f7;\r\n        --grey-border: #cdd4e0;\r\n        --text-dark:   #1a2435;\r\n        --text-mid:    #4a5a7a;\r\n        --shadow:      0 2px 8px rgba(0,0,0,0.13);\r\n        --radius:      10px;\r\n    }\r\n\r\n    \/* ============================================================\r\n       ORIGINAL STYLES \u2014 unchanged (needed by JS)\r\n       ============================================================ *\/\r\n    .padel-area-button:hover { text-shadow: 1px 1px 2px black; opacity: 0.8; background-color: #001830; }\r\n    .padel-area-button { background-color: darkgreen; border: none; padding: 0.5rem 1rem; font-size: 1rem; transition: 0.5s; color: white; cursor: pointer; height: 3.2rem; width: 100%; border-radius: 10px; text-align: left; }\r\n    .padel-area-form-hint { font-size: small; font-style: italic; line-height: 1.5em; padding-bottom: 10px; }\r\n    .padel-area-button1, .padel-area-button2, .padel-area-button3 { padding: 0.4rem 0.8rem; font-size: 1rem; transition: all 0.2s ease; color: white; cursor: pointer; height: auto; width: auto; border-radius: 12px; text-align: center; border: none; box-shadow: 0 4px 8px rgba(0,0,0,0.2); }\r\n    .padel-area-button1:active, .padel-area-button2:active, .padel-area-button3:active { transform: translateY(0); box-shadow: 0 3px 6px rgba(0,0,0,0.2); }\r\n    .padel-area-button1 { background-color: #76a343; }\r\n    .padel-area-button2 { background-color: #ff7900; }\r\n    .padel-area-button3 { background-color: #d92647; }\r\n    .padel-area-button1:hover { background-color: #5f8c32; }\r\n    .padel-area-button2:hover { background-color: #e66d00; }\r\n    .padel-area-button3:hover { background-color: #b71f3b; }\r\n    .padel-area-button1:hover, .padel-area-button2:hover, .padel-area-button3:hover { text-shadow: 1px 1px 2px rgba(0,0,0,0.4); transform: translateY(-2px); box-shadow: 0 6px 12px rgba(0,0,0,0.25); }\r\n    #textAreaLen, #textAreaWidth { font-size: 20px; font-weight: 800; border: 2px solid #44444; border-radius: 20px; padding: 18px; text-align: center; background: #ededed; width: 100%; }\r\n    #textItemName { float: left; width: 10rem; margin-left: 1rem; margin-top: 0.2rem; }\r\n    #textItemName input { width: 100%; padding: 0.7rem; height: 2rem; }\r\n    \/* \u2500\u2500 Modern popup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .overlay {\r\n        position: fixed !important;\r\n        inset: 0 !important;\r\n        background: rgba(10, 20, 50, 0.75) !important;\r\n        backdrop-filter: blur(4px) !important;\r\n        z-index: 9999 !important;\r\n        display: none;\r\n        align-items: center !important;\r\n        justify-content: center !important;\r\n    }\r\n    .overlay:target { display: flex !important; }\r\n    .popup {\r\n        position: relative !important;\r\n        top: auto !important;\r\n        left: auto !important;\r\n        transform: none !important;\r\n        margin: 0 !important;\r\n        background: #fff !important;\r\n        border-radius: 16px !important;\r\n        box-shadow: 0 24px 60px rgba(0,0,0,0.35) !important;\r\n        width: 480px !important;\r\n        max-width: 92vw !important;\r\n        padding: 0 !important;\r\n        overflow: hidden !important;\r\n        font-family: 'Barlow', sans-serif !important;\r\n        animation: popupIn 0.25s ease !important;\r\n    }\r\n    @keyframes popupIn {\r\n        from { opacity: 0; transform: scale(0.92); }\r\n        to   { opacity: 1; transform: scale(1); }\r\n    }\r\n    .popup-header {\r\n        background: var(--navy);\r\n        padding: 16px 20px;\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 12px;\r\n    }\r\n    .popup-header img { width: 28px; height: 28px; }\r\n    .popup-header h2 {\r\n        color: #fff;\r\n        font-size: 1rem;\r\n        font-weight: 700;\r\n        margin: 0;\r\n        flex: 1;\r\n        font-family: 'Barlow', sans-serif;\r\n    }\r\n    .popup .close {\r\n        color: rgba(255,255,255,0.7) !important;\r\n        font-size: 1.4rem !important;\r\n        text-decoration: none !important;\r\n        line-height: 1 !important;\r\n        transition: color 0.15s !important;\r\n    }\r\n    .popup .close:hover { color: #fff !important; }\r\n    .popup .content {\r\n        padding: 20px;\r\n        background: #f5f7fa;\r\n    }\r\n    .popup .content iframe,\r\n    .popup .content video {\r\n        width: 100% !important;\r\n        height: 280px !important;\r\n        border: none !important;\r\n        border-radius: 10px !important;\r\n        display: block !important;\r\n        background: #000;\r\n    }\r\n\r\n    \/* ============================================================\r\n       HIDE ORIGINAL SIDEBAR \u2014 keep in DOM so JS works,\r\n       but visually invisible. The canvas grid still has its\r\n       sibling so getBoundingClientRect() returns correct width.\r\n       ============================================================ *\/\r\n    .padel-area-box:first-child {\r\n        display: none !important;\r\n    }\r\n\r\n    \/* ============================================================\r\n       NEW DESIGN UI \u2014 scoped to #new-ui, safe in WordPress\r\n       ============================================================ *\/\r\n\r\n    \/* Row 1: Top bar *\/\r\n    #new-topbar {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 8px;\r\n        background: var(--navy);\r\n        padding: 7px 14px;\r\n        font-family: 'Barlow', sans-serif;\r\n        box-shadow: var(--shadow);\r\n        flex-wrap: nowrap;\r\n        overflow-x: auto;\r\n        -webkit-overflow-scrolling: touch;\r\n    }\r\n\r\n    #new-topbar-spacer { flex: 1; min-width: 8px; }\r\n\r\n    \/* Metric\/Imperial toggle in topbar *\/\r\n    #new-measure-toggle {\r\n        display: flex;\r\n        background: rgba(255,255,255,0.12);\r\n        border-radius: 8px;\r\n        overflow: hidden;\r\n        flex-shrink: 0;\r\n    }\r\n    #new-measure-toggle label {\r\n        padding: 5px 11px;\r\n        font-size: 0.78rem;\r\n        font-weight: 600;\r\n        color: rgba(255,255,255,0.6);\r\n        cursor: pointer;\r\n        user-select: none;\r\n        margin: 0;\r\n        font-family: 'Barlow', sans-serif;\r\n        transition: background 0.2s, color 0.2s;\r\n    }\r\n    \/* Highlight the checked radio label *\/\r\n    #new-measure-toggle .m-checked {\r\n        background: var(--navy-light);\r\n        color: #fff;\r\n    }\r\n\r\n    \/* Topbar icon buttons *\/\r\n    .ntb-btn {\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        gap: 2px;\r\n        background: rgba(255,255,255,0.12);\r\n        border: none;\r\n        border-radius: 8px;\r\n        color: #fff;\r\n        cursor: pointer;\r\n        padding: 5px 10px;\r\n        font-size: 0.6rem;\r\n        font-weight: 600;\r\n        font-family: 'Barlow', sans-serif;\r\n        min-width: 46px;\r\n        min-height: 40px;\r\n        flex-shrink: 0;\r\n        transition: background 0.2s;\r\n        text-decoration: none;\r\n        line-height: 1.2;\r\n    }\r\n    .ntb-btn i { font-size: 1rem; }\r\n\r\n\r\n    .ntb-btn:hover, .ntb-btn:active { background: rgba(255,255,255,0.25); color: #fff; }\r\n    .ntb-btn-action {\r\n        background: #7ecb00 !important;\r\n        color: #fff !important;\r\n        font-weight: 700 !important;\r\n    }\r\n    .ntb-btn-action:hover, .ntb-btn-action:active {\r\n        background: #5fa800 !important;\r\n        color: #fff !important;\r\n    }\r\n\r\n    \/* Row 2: Palette strip *\/\r\n    #new-palette {\r\n        display: flex;\r\n        align-items: stretch;\r\n        background: var(--white);\r\n        border-bottom: 2px solid var(--grey-border);\r\n        font-family: 'Barlow', sans-serif;\r\n    }\r\n\r\n    \/* Left 60%: area inputs + draggable objects *\/\r\n\r\n\r\n    \/* Area inputs section *\/\r\n    #new-area-inputs {\r\n        display: flex;\r\n        flex-direction: column;\r\n        justify-content: center;\r\n        gap: 6px;\r\n        padding: 8px 12px;\r\n        border-right: 2px solid var(--grey-border);\r\n        flex-shrink: 0;\r\n        background: var(--pale);\r\n    }\r\n    #new-area-inputs .ni-row {\r\n        display: grid !important;\r\n        grid-template-columns: 60px 80px 40px !important;\r\n        align-items: center !important;\r\n        column-gap: 10px !important;\r\n    }\r\n    #new-area-inputs .ni-row span:first-child {\r\n        text-align: left !important;\r\n    }\r\n    #new-area-inputs .ni-row .ni-input {\r\n        width: 80px !important;\r\n        box-sizing: border-box !important;\r\n        margin: 0 !important;\r\n        font-size: 1.2rem !important;\r\n        font-weight: 700 !important;\r\n        height: 44px !important;\r\n        padding: 8px 10px !important;\r\n    }\r\n    #new-area-inputs .ni-row .ni-unit {\r\n        text-align: left !important;\r\n        font-size: 1rem !important;\r\n        font-weight: 600 !important;\r\n        color: var(--text-mid) !important;\r\n        min-width: 35px !important;\r\n        display: block !important;\r\n    }\r\n\r\n    \/* Mirror inputs to the new UI \u2014 read-only display linked to real inputs *\/\r\n    .ni-input {\r\n        font-size: 0.85rem;\r\n        font-weight: 700;\r\n        border: 1px solid var(--grey-border);\r\n        border-radius: 6px;\r\n        padding: 3px 6px;\r\n        text-align: center;\r\n        background: var(--white);\r\n        width: 85px;\r\n        color: var(--text-dark);\r\n        font-family: 'Barlow', sans-serif;\r\n    }\r\n\r\n    \/* Each palette item: label top, image middle, + always at bottom *\/\r\n    .npal-item {\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        padding: 4px 10px 0;\r\n        border-right: 1px solid var(--grey-border);\r\n        flex-shrink: 0;\r\n        min-width: 110px;\r\n        box-sizing: border-box;\r\n        height: 100%;\r\n        position: relative;\r\n        padding-bottom: 36px;  \/* space for + button *\/\r\n    }\r\n    .npal-item:hover { background: var(--pale); }\r\n    .npal-item .npal-label {\r\n        font-size: 0.68rem;\r\n        font-weight: 600;\r\n        color: var(--text-mid);\r\n        white-space: nowrap;\r\n        pointer-events: none;\r\n        text-align: center;\r\n        width: 100%;\r\n        flex-shrink: 0;\r\n    }\r\n    .npal-item img {\r\n        width: 110px;\r\n        max-height: 58px;\r\n        object-fit: contain;\r\n        object-position: bottom;\r\n        pointer-events: none;\r\n        display: block;\r\n        flex: 1;\r\n        align-self: flex-end;\r\n    }\r\n    \/* + button wrapper in npal-item: same fixed height as np-r4 *\/\r\n    .npal-item .nadd-btn {\r\n        flex-shrink: 0;\r\n        margin-top: 4px;\r\n        align-self: center;\r\n    }\r\n\r\n    \/* Pillar group: IDENTICAL structure to .npal-item *\/\r\n    #new-pillar-group {\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        padding: 4px 10px 6px;\r\n        border-right: 1px solid var(--grey-border);\r\n        flex-shrink: 0;\r\n        height: 100%;\r\n        box-sizing: border-box;\r\n    }\r\n    \/* Title row: Pillars + size labels all on one line *\/\r\n    #new-pillar-group .np-title-row {\r\n        display: flex;\r\n        gap: 8px;\r\n        align-items: baseline;\r\n        flex-shrink: 0;\r\n        white-space: nowrap;\r\n    }\r\n    #new-pillar-group .np-title {\r\n        font-size: 0.68rem;\r\n        font-weight: 700;\r\n        color: var(--text-mid);\r\n    }\r\n    #new-pillar-group .np-size {\r\n        font-size: 0.68rem;\r\n        font-weight: 600;\r\n        color: var(--text-mid);\r\n    }\r\n    \/* Pillar boxes row: flex:1 so it fills same space as images *\/\r\n    #new-pillar-group .np-row {\r\n        display: flex;\r\n        gap: 20px;\r\n        align-items: flex-end;   \/* boxes sit on same bottom line as images *\/\r\n        justify-content: center;\r\n        flex: 1;\r\n        width: 100%;\r\n    }\r\n    .np-wrap {\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        gap: 3px;\r\n        cursor: grab;\r\n    }\r\n\r\n    \/* + buttons row: same margin-top as .npal-item .nadd-btn *\/\r\n    #new-pillar-group .np-btns {\r\n        display: flex;\r\n        gap: 20px;\r\n        flex-shrink: 0;\r\n        margin-top: 4px;\r\n        justify-content: center;\r\n        width: 100%;\r\n    }\r\n\r\n    \/* Right 40%: action buttons *\/\r\n    #new-palette-right {\r\n        display: flex;\r\n        flex-direction: column;\r\n        justify-content: space-between;\r\n        flex: 0 0 40%;\r\n        padding: 8px 10px;\r\n        background: var(--pa-pale, #eef1f8);\r\n        overflow: hidden;\r\n        align-self: stretch;\r\n        border-left: 2px solid var(--grey-border);\r\n    }\r\n\r\n    \/* Top section: coords\/hint *\/\r\n    #new-palette-right #new-coords-wrap {\r\n        flex: 1;\r\n    }\r\n\r\n    #new-palette-right #new-select-hint {\r\n        font-size: 0.78rem;\r\n        color: var(--text-mid);\r\n        font-style: italic;\r\n        font-family: 'Barlow', sans-serif;\r\n        display: block;\r\n    }\r\n\r\n    #new-palette-right #new-coords {\r\n        font-size: 1.1rem !important;\r\n        font-weight: 700 !important;\r\n        color: var(--navy) !important;\r\n        font-family: 'Barlow', sans-serif;\r\n        min-height: 1.4em;\r\n    }\r\n\r\n    \/* Bottom section: buttons row *\/\r\n    #new-palette-right #new-btns-row {\r\n        display: flex;\r\n        flex-wrap: wrap;\r\n        gap: 5px;\r\n        align-items: center;\r\n    }\r\n\r\n    \/* Action buttons *\/\r\n    .nact-btn {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 5px;\r\n        border: none;\r\n        border-radius: 8px;\r\n        font-family: 'Barlow', sans-serif;\r\n        font-size: 0.85rem;\r\n        font-weight: 700;\r\n        color: #fff;\r\n        cursor: pointer;\r\n        padding: 8px 12px;\r\n        min-height: 36px;\r\n        white-space: nowrap;\r\n        flex-shrink: 0;\r\n        transition: all 0.15s;\r\n        box-shadow: 0 2px 4px rgba(0,0,0,0.2);\r\n    }\r\n    .nact-btn i { font-size: 0.85rem; }\r\n    .nact-btn:disabled { opacity: 0.35; pointer-events: none; }\r\n    .nact-btn.green  { background: #76a343; }\r\n    .nact-btn.green:hover  { background: #5f8c32; }\r\n    .nact-btn.orange { background: var(--orange); }\r\n    .nact-btn.orange:hover { background: #e66d00; }\r\n    .nact-btn.red    { background: var(--red); }\r\n    .nact-btn.red:hover    { background: #b71f3b; }\r\n\r\n    #new-palette-right #textItemName {\r\n        flex: 1;\r\n        min-width: 80px;\r\n        float: none !important;\r\n        width: auto !important;\r\n        margin: 0 !important;\r\n    }\r\n    #new-palette-right #textItemName input {\r\n        width: 100%;\r\n        padding: 4px 8px;\r\n        border: 1px solid var(--grey-border);\r\n        border-radius: 7px;\r\n        font-size: 0.8rem;\r\n        font-family: 'Barlow', sans-serif;\r\n        background: var(--white);\r\n        height: auto !important;\r\n    }\r\n\r\n\r\n    \/* ============================================================\r\n       HIDE ORIGINAL TOOLBAR (replaced by new-palette-right)\r\n       Keep in DOM \u2014 JS writes button display states to these IDs\r\n       ============================================================ *\/\r\n    .padel-area-designer-toolbar { display: none !important; }\r\n\r\n    \/* Kill the grid entirely \u2014 canvas designer fills full width *\/\r\n    .padel-area-container {\r\n        display: block !important;\r\n        width: 100% !important;\r\n        height: 700px !important;\r\n        margin: 0 !important;\r\n        padding: 0 !important;\r\n    }\r\n    .padel-area-designer {\r\n        width: 100% !important;\r\n        height: 100% !important;\r\n        margin: 0 !important;\r\n        padding: 4px !important;\r\n        box-sizing: border-box !important;\r\n    }\r\n    #canvasAreasContainer {\r\n        width: 100% !important;\r\n    }\r\n\r\n    \/* Hide original sidebar \u2014 keep it at original width so grid works *\/\r\n    .padel-area-box:first-child {\r\n        visibility: hidden !important;\r\n        padding: 0 !important;\r\n        margin: 0 !important;\r\n        border: none !important;\r\n        overflow: hidden !important;\r\n    }\r\n\r\n    \/* Canvas box: full remaining space *\/\r\n    .padel-area-designer {\r\n        margin: 0 !important;\r\n        padding: 8px !important;\r\n    }\r\n\r\n    .nadd-btn {\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        background: var(--navy-light);\r\n        color: #fff;\r\n        border: none;\r\n        border-radius: 50%;\r\n        width: 20px;\r\n        height: 20px;\r\n        font-size: 0.7rem;\r\n        cursor: pointer;\r\n        padding: 0;\r\n        margin: 0 auto;\r\n        flex-shrink: 0;\r\n    }\r\n    .nadd-btn:hover { background: var(--navy); }\r\n\r\n    \/* Pillar size overrides *\/\r\n    .padel-area-form-pillar.pillar-60 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; }\r\n    .padel-area-form-pillar.pillar-40 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; }\r\n\r\n    \/* Popup *\/\r\n\r\n\r\n    \r\n    \/* ===== PALETTE TABLE - FINAL OVERRIDE ===== *\/\r\n    #new-palette-left {\r\n        flex: 0 0 60% !important;\r\n        border-right: 2px solid var(--grey-border) !important;\r\n        overflow: hidden !important;\r\n        display: flex !important;\r\n        align-items: stretch !important;\r\n        align-self: stretch !important;\r\n    }\r\n    #new-palette-left #new-area-inputs {\r\n        flex-shrink: 0 !important;\r\n        border-right: 2px solid var(--grey-border) !important;\r\n        padding: 6px 10px !important;\r\n        display: flex !important;\r\n        flex-direction: column !important;\r\n        justify-content: center !important;\r\n        gap: 6px !important;\r\n        background: var(--pale) !important;\r\n        width: 160px !important;\r\n        min-width: 160px !important;\r\n        z-index: 1 !important;\r\n        position: relative !important;\r\n        align-self: stretch !important;\r\n    }\r\n#new-palette-left #new-area-inputs {\r\n    width: 240px !important;\r\n    min-width: 240px !important;\r\n\r\n    padding: 14px 18px !important;\r\n    gap: 14px !important;\r\n}\r\n\r\n#npal-table {\r\n    table-layout: fixed !important;\r\n}\r\n\r\n#npal-table td:nth-child(1) {\r\n    width: 180px !important; \/* Double court *\/\r\n}\r\n\r\n#npal-table td:nth-child(2) {\r\n    width: 180px !important; \/* Single court *\/\r\n}\r\n\r\n#npal-table td:nth-child(3) {\r\n    width: 100px !important; \/* Object *\/\r\n}\r\n\r\n#npal-table td:nth-child(4),\r\n#npal-table td:nth-child(5) {\r\n    width: 65px !important; \/* Pillars *\/\r\n}\r\n\r\n#courtDouble,\r\n#courtSingle {\r\n    width: 150px !important;\r\n    height: 80px !important;\r\n    object-fit: fill !important;\r\n    display: block !important;\r\n    margin: 0 auto !important;\r\n    vertical-align: bottom !important;\r\n    align-self: flex-end !important;\r\n    margin-top: auto !important;\r\n}\r\n    #new-palette-left #npal-table {\r\n        flex: 1 !important;\r\n    }\r\n    #npal-table {\r\n        width: 100% !important;\r\n        height: 100% !important;\r\n        border-collapse: collapse !important;\r\n        table-layout: auto !important;\r\n    }\r\n    #npal-table td {\r\n        font-size: 11px !important;\r\n        font-weight: 600 !important;\r\n        padding: 1px 2px !important;\r\n        text-align: center !important;\r\n        vertical-align: middle !important;\r\n        white-space: nowrap !important;\r\n        overflow: hidden !important;\r\n        border-right: 1px solid var(--grey-border) !important;\r\n        line-height: 1.2 !important;\r\n        color: var(--text-mid) !important;\r\n    }\r\n    #npal-row-label td { height: 15% !important; }\r\n    #npal-row-img td   { height: 70% !important; padding: 4px !important; vertical-align: bottom !important; text-align: center !important; }\r\n    #npal-row-btn td   { height: 15% !important; }\r\n    #npal-row-img img  {\r\n        height: 80px !important;\r\n        width: 120px !important;\r\n        width: 100% !important;\r\n        object-fit: contain !important;\r\n        display: block !important;\r\n        margin: 0 auto !important;\r\n    }\r\n    .npal-td-inputs {\r\n        width: 80px !important;\r\n        padding: 4px !important;\r\n        font-size: 11px !important;\r\n        border-right: 2px solid var(--grey-border) !important;\r\n    }\r\n    .nadd-btn {\r\n        width: 22px !important;\r\n        height: 22px !important;\r\n        border-radius: 50% !important;\r\n        background: var(--navy-light) !important;\r\n        color: #fff !important;\r\n        border: none !important;\r\n        font-size: 14px !important;\r\n        cursor: pointer !important;\r\n        display: flex !important;\r\n        align-items: center !important;\r\n        justify-content: center !important;\r\n        margin: 0 auto !important;\r\n        padding: 0 !important;\r\n    }\r\n    .npal-pillar-size { font-size: 11px !important; padding: 0 !important; line-height: 1.2 !important; display: block !important; text-align: center !important; }\r\n    #npal-row-img td { display: table-cell !important; }\r\n    #npal-row-img .npal-td-img > * { margin: 0 auto !important; display: block !important; }\r\n    \/* ===== END PALETTE TABLE ===== *\/\r\n<\/style>\r\n<\/head>\r\n\r\n<body onLoad=\"pageLoad()\">\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     NEW DESIGN UI \u2014 sits above the original canvas structure\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div id=\"new-ui\">\r\n\r\n    <!-- Row 1: Top bar -->\r\n    <div id=\"new-topbar\">\r\n        <!-- How to \u2014 leftmost -->\r\n        <a href=\"#popup1\" class=\"ntb-btn\">\r\n            <i class=\"fas fa-circle-info\"><\/i><span>How to<\/span>\r\n        <\/a>\r\n\r\n        <div id=\"new-topbar-spacer\"><\/div>\r\n\r\n        <!-- Metric \/ Imperial \u2014 mirror the hidden real radios -->\r\n        <span id=\"formMeasureSystem\" style=\"display:none\"><\/span>\r\n        <div id=\"new-measure-toggle\">\r\n            <label id=\"new-label-metric\" class=\"m-checked\" onclick=\"newSetMeasure('METRIC')\">Metric<\/label>\r\n            <label id=\"new-label-imperial\" onclick=\"newSetMeasure('IMPERIAL')\">Imperial<\/label>\r\n        <\/div>\r\n\r\n\r\n        <!-- File actions -->\r\n        <button type=\"button\" class=\"ntb-btn ntb-btn-action\" onclick=\"paModernExport()\">\r\n            <i class=\"fas fa-image\"><\/i><span id=\"formButtonSave\">Export<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"ntb-btn ntb-btn-action\" onclick=\"padelAreaExport.saveToFile()\">\r\n            <i class=\"fas fa-save\"><\/i><span id=\"formButtonSaveFile\">Save<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"ntb-btn ntb-btn-action\" onclick=\"padelAreaExport.openFromFile()\">\r\n            <i class=\"fas fa-folder-open\"><\/i><span id=\"formButtonLoadFile\">Load<\/span>\r\n        <\/button>\r\n    <\/div>\r\n\r\n    <!-- Row 2: Palette -->\r\n    <div id=\"new-palette\">\r\n\r\n        <!-- LEFT 60%: inputs beside table, table has own rows -->\r\n        <div id=\"new-palette-left\">\r\n\r\n            <!-- Area inputs with lock \u2014 exact same markup as original -->\r\n            <div id=\"new-area-inputs\">\r\n                <div class=\"blurred-section\" id=\"new-restricted-section\">\r\n                    <div class=\"restriction-hover-message\">\ud83d\udd12 Restricted Area - <BR> CLICK <u>HERE<\/u> TO UNLOCK<\/div>\r\n                    <div class=\"ni-row\">\r\n                        <span id=\"formAreaLen\">Length<\/span>\r\n                        <input class=\"ni-input\" id=\"new-width-input\" value=\"68.5\"\r\n                               oninput=\"newSyncInput('textAreaWidth', this.value)\"\r\n                               onchange=\"newSyncInput('textAreaWidth', this.value)\">\r\n                        <span class=\"ni-unit\" id=\"new-unit-1\">m<\/span>\r\n                    <\/div>\r\n                    <div class=\"ni-row\">\r\n                        <span id=\"formLabelWidth\">Width<\/span>\r\n                        <input class=\"ni-input\" id=\"new-len-input\" value=\"26.5\"\r\n                               oninput=\"newSyncInput('textAreaLen', this.value)\"\r\n                               onchange=\"newSyncInput('textAreaLen', this.value)\">\r\n                        <span class=\"ni-unit\" id=\"new-unit-2\">m<\/span>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <table id=\"npal-table\" cellpadding=\"0\" cellspacing=\"0\">\r\n            <tr id=\"npal-row-label\">\r\n                <td class=\"npal-td npal-td-label\"><span id=\"courtDoubleMeasure\">20\u00d710m<\/span><\/td>\r\n                <td class=\"npal-td npal-td-label\"><span id=\"courtSingleMeasure\">20\u00d76m<\/span><\/td>\r\n                <td class=\"npal-td npal-td-label\" id=\"formAreaObstacle\">Obstacle<\/td>\r\n                <td class=\"npal-td npal-td-label\" colspan=\"2\" id=\"formPillars\">Pillars<\/td>\r\n            <\/tr>\r\n            <tr id=\"npal-row-img\">\r\n                <td class=\"npal-td npal-td-img\">\r\n                    <img title=\"Grundriss Planer f\u00fcr Padel - Padelcreations - Wir bauen robuste Padel Courts\" decoding=\"async\" id=\"courtDouble\"\r\n                         src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/images\/Padel20x10I.svg\"\r\n                         class=\"padel-area-form-img\" alt=\"Double\"\r\n                         style=\"width:75px;height:80px;object-fit:fill;display:block;\"\r\n                         draggable=\"true\" ondragstart=\"padelArea.drag(event)\">\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-img\" style=\"vertical-align:bottom\">\r\n                    <img title=\"Grundriss Planer f\u00fcr Padel - Padelcreations - Wir bauen robuste Padel Courts\" decoding=\"async\" id=\"courtSingle\"\r\n                         src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/images\/Padel20x6I.svg\"\r\n                         class=\"padel-area-form-img\" alt=\"Single\"\r\n                        style=\"width:75px;height:80px;object-fit:fill;display:block;margin:0 auto;\"\r\n                         draggable=\"true\" ondragstart=\"padelArea.drag(event)\">\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-img\">\r\n                    <img title=\"Grundriss Planer f\u00fcr Padel - Padelcreations - Wir bauen robuste Padel Courts\" decoding=\"async\" id=\"areaObstacle\" style=\"width:55px;height:55px;object-fit:contain;display:block;margin:0 auto;\"\r\n                         src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/images\/Obstacle.svg\"\r\n                         class=\"padel-area-form-img\" alt=\"Obstacle\"\r\n                         draggable=\"true\" ondragstart=\"padelArea.drag(event)\">\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-img\">\r\n                    <div class=\"npal-pillar-size\">60 cm<\/div>\r\n                    <div id=\"areaPillar60\" class=\"padel-area-form-pillar pillar-60\"\r\n                         draggable=\"true\" ondragstart=\"padelArea.drag(event)\"><\/div>\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-img\">\r\n                    <div class=\"npal-pillar-size\">40 cm<\/div>\r\n                    <div id=\"areaPillar40\" class=\"padel-area-form-pillar pillar-40\"\r\n                         draggable=\"true\" ondragstart=\"padelArea.drag(event)\"><\/div>\r\n                <\/td>\r\n            <\/tr>\r\n            <tr id=\"npal-row-btn\">\r\n                <td class=\"npal-td npal-td-btn\">\r\n                    <button class=\"nadd-btn\" onclick=\"paAddToCenter('courtDouble')\">\uff0b<\/button>\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-btn\">\r\n                    <button class=\"nadd-btn\" onclick=\"paAddToCenter('courtSingle')\">\uff0b<\/button>\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-btn\">\r\n                    <button class=\"nadd-btn\" onclick=\"paAddToCenter('areaObstacle')\">\uff0b<\/button>\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-btn\">\r\n                    <button class=\"nadd-btn\" onclick=\"paAddToCenter('areaPillar60')\">\uff0b<\/button>\r\n                <\/td>\r\n                <td class=\"npal-td npal-td-btn\">\r\n                    <button class=\"nadd-btn\" onclick=\"paAddToCenter('areaPillar40')\">\uff0b<\/button>\r\n                <\/td>\r\n            <\/tr>\r\n        <\/table>\r\n        <\/div><!-- \/new-palette-left -->\r\n\r\n        <!-- RIGHT 40%: coords top, action buttons bottom -->\r\n        <div id=\"new-palette-right\">\r\n            <div id=\"new-coords-wrap\">\r\n                <div id=\"new-measure-info\" style=\"text-align:right;width:100%;display:block;font-size:1.4rem;font-weight:700;color:#3d5fa0;margin-bottom:4px;\"><\/div>\r\n                <span id=\"new-select-hint\">Select an object to edit<\/span>\r\n                <div id=\"new-coords\"><\/div>\r\n            <\/div>\r\n            <div id=\"new-btns-row\">\r\n                <button id=\"buttonRotate90\" type=\"button\" class=\"nact-btn green\" onclick=\"padelArea.rotateAngle(90)\">\r\n                    <i class=\"fas fa-redo\"><\/i><span id=\"formButtonRotate90\">90\u00b0<\/span>\r\n                <\/button>\r\n                <button id=\"buttonRotate5\" type=\"button\" class=\"nact-btn green\" onclick=\"padelArea.rotateAngle(5)\">\r\n                    <i class=\"fas fa-redo\"><\/i><span id=\"formButtonRotate5\">+5\u00b0<\/span>\r\n                <\/button>\r\n                <button id=\"buttonRotate_5\" type=\"button\" class=\"nact-btn green\" onclick=\"padelArea.rotateAngle(-5)\">\r\n                    <i class=\"fas fa-undo\"><\/i><span id=\"formButtonRotate_5\">-5\u00b0<\/span>\r\n                <\/button>\r\n                <button id=\"buttonDuplicate\" type=\"button\" class=\"nact-btn orange\" onclick=\"padelArea.duplicateCourt()\">\r\n                    <i class=\"fas fa-copy\"><\/i><span id=\"formButtonDuplicate\">Copy<\/span>\r\n                <\/button>\r\n                <button id=\"buttonDelete\" type=\"button\" class=\"nact-btn red\" onclick=\"padelArea.deleteCourt()\">\r\n                    <i class=\"fas fa-trash\"><\/i><span id=\"formButtonDelete\">Delete<\/span>\r\n                <\/button>\r\n                <div id=\"textItemName\" style=\"display:none\">\r\n                    <input type=\"text\" id=\"inputItemName\" name=\"itemName\"\r\n                           placeholder=\"Description...\" onkeyup=\"padelArea.setDescription(this)\">\r\n                <\/div>\r\n            <\/div>\r\n        <\/div><!-- \/new-palette-right -->\r\n\r\n    <\/div><!-- \/new-palette -->\r\n\r\n<\/div><!-- \/new-ui -->\r\n\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     ORIGINAL STRUCTURE \u2014 100% intact, canvas works correctly.\r\n     Original sidebar is hidden via CSS but stays in DOM so the\r\n     padel-area-container grid\/flex gives canvas correct width.\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div class=\"padel-area-container\" style=\"line-height:30px;\">\r\n\r\n    <!-- ORIGINAL SIDEBAR: hidden but in DOM for layout sizing -->\r\n    <div class=\"padel-area-box\" style=\"width:270px\">\r\n        <form onsubmit=\"return false\" id=\"formComponent\">\r\n            <div class=\"padel-area-form\" style=\"width:240px\">\r\n                <div class=\"padel-area-form-section\">\r\n                    <div>\r\n                        <label><input type=\"radio\" name=\"measureSystem\" value=\"METRIC\" id=\"real-metric\" checked onchange=\"changeMeasureSystem()\"> <span id=\"formMeasureSystemMetric\"><\/span><\/label><br\/>\r\n                        <label><input type=\"radio\" name=\"measureSystem\" value=\"IMPERIAL\" id=\"real-imperial\" onchange=\"changeMeasureSystem()\"\/> <span id=\"formMeasureSystemImperial\"><\/span><\/label>\r\n                    <\/div>\r\n                <\/div>\r\n                <div class=\"padel-area-form-section blurred-section\" id=\"restrictedSection\">\r\n                    <div class=\"restriction-hover-message\">\ud83d\udd12 Restricted Area<\/div>\r\n                    <h2 id=\"formArea\"><\/h2>\r\n                    <div class=\"padel-area-form-row\">\r\n                        <label><input id=\"textAreaWidth\" name=\"areaWidth\" value=\"68.5\"><\/label>\r\n                        <label id=\"errorAreaWidth\" class=\"padel-area-form-error\"><\/label>\r\n                    <\/div>\r\n                    <div class=\"padel-area-form-row\">\r\n                        <label><input id=\"textAreaLen\" name=\"areaLen\" value=\"26.5\"><\/label>\r\n                        <label id=\"errorAreaLen\" class=\"padel-area-form-error\"><\/label>\r\n                        <label id=\"errorAreaSize\" class=\"padel-area-form-error\"><\/label>\r\n                    <\/div>\r\n                <\/div>\r\n                <div class=\"padel-area-form-section\">\r\n                    <h1 id=\"formCourts\"><\/h1>\r\n                <\/div>\r\n                <div class=\"padel-area-form-section\">\r\n                    <div id=\"formErrorFileLoad\" class=\"padel-area-form-error\" style=\"display:none\">Invalid file format<\/div>\r\n                    <input type=\"file\" id=\"forFileInput\" hidden onchange=\"padelAreaExport.loadFromFile(this)\"\/>\r\n                <\/div>\r\n                <div class=\"padel-area-form-section\">\r\n                    <img title=\"Grundriss Planer f\u00fcr Padel - Padelcreations - Wir bauen robuste Padel Courts\" alt=\"%alt%\" decoding=\"async\" src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2022\/08\/logo_padelcreations_brand_515x189.png\" width=\"90%\" id=\"imgLogo\">\r\n                <\/div>\r\n            <\/div>\r\n        <\/form>\r\n    <\/div>\r\n\r\n    <!-- ORIGINAL CANVAS \u2014 untouched -->\r\n    <div class=\"padel-area-box padel-area-designer\" style=\"margin-left:40px\">\r\n        <div id=\"canvasAreasContainer\">\r\n            <canvas class=\"padel-area-designer-canvas\" id=\"canvasAreas\"\r\n                    ondrop=\"padelArea.drop(event)\"\r\n                    ondragover=\"padelArea.allowDrop(event)\"\r\n                    onmousedown=\"padelArea.mouseDown(event)\"\r\n                    onmouseup=\"padelArea.mouseUp(event)\"\r\n                    onmousemove=\"padelArea.mouseMove(event)\">\r\n            <\/canvas>\r\n        <\/div>\r\n        <!-- Original toolbar: hidden, but IDs must exist for JS -->\r\n        <div class=\"padel-area-designer-toolbar\">\r\n            <div class=\"padel-area-designer-toolbar-buttons\">\r\n                <div id=\"textItemName\" style=\"display:none\">\r\n                    <input type=\"text\" name=\"itemName\" id=\"_inputItemName_orig\" placeholder=\"Descripci\u00f3n\">\r\n                <\/div>\r\n            <\/div>\r\n            <div id=\"designerInfo\" class=\"padel-area-designer-info\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<div id=\"canvasExportContainer\">\r\n    <canvas id=\"canvasExport\"><\/canvas>\r\n<\/div>\r\n\r\n<!-- Original JS \u2014 NOT modified -->\r\n<script>\r\n\/\/ language-v6 inlined\r\nlet Languages = [];\r\n\r\nLanguages['de'] = {\r\n    formArea: 'Fl\u00e4chengr\u00f6sse',\r\n    formAreaWidth: 'Breite',\r\n    formAreaLen: 'L\u00e4nge',\r\n    formCourts: 'Drag & Drop Elemente',\r\n    formMeasureSystem: 'L\u00e4ngeneinheiten',\r\n    formMeasureSystemMetric: 'Meter | 1 Feld = 1 m2',\r\n    formMeasureSystemImperial: 'F\u00fcsse | 1 Feld = 25 ft2',\r\n    formErrorInput: 'Die Zahl ist nicht korrekt',\r\n    formErrorSize: 'Die Breite muss kleiner sein als die L\u00e4nge.',\r\n    formAreaObstacle: 'Gr\u00f6ssenverstellbare Objekte',\r\n    formButtonSave: 'Bild runterladen',\r\n    formButtonSaveFile: 'Datei speichern',\r\n    formButtonLoadFile: 'Datei laden',\r\n    formButtonDelete: 'L\u00f6schen',\r\n    formButtonDuplicate: 'Duplizieren',\r\n    formButtonRotate90: '+90\u00ba',\r\n    formButtonRotate5: '+5\u00ba',\r\n    formButtonRotate_5: '-5\u00ba',\r\n    formTextName: 'Objektbeschreibung',\r\n    exportInfo: 'Grundrisszeichung erstellt durch Padel Floor Planner von',\r\n    exportDate: 'Datum',\r\n    drawerInfo: 'Position',\r\n    obstacleHint: 'Feste Objekte (z.B. Tennisplatz, S\u00e4ulen, Ecken, sozialer Bereich, Shop, Umkleider\u00e4ume, B\u00fcros, Rezeption, sonstiges)',\r\n    formPillars: 'S\u00e4ulen',\r\n    invalidShape: 'Ungew\u00f6hnliche Objektform',\r\n    invalidFileFormat: 'Ung\u00fcltiges Dateiformat',\r\n    hintStartClickCourt: \"Klicken Sie auf das Spielfeld, um zu starten\"\r\n}\r\n\r\nLanguages['en'] = {\r\n    formArea: 'Area dimensions',\r\n    formAreaWidth: 'Width',\r\n    formAreaLen: 'Length',\r\n    formCourts: 'Drag & Drop Items',\r\n    formMeasureSystem: 'Measurements',\r\n    formMeasureSystemMetric: 'Meters (m) | 1 sq = 1 m2',\r\n    formMeasureSystemImperial: 'Feet (ft) | 1 sq = 25 ft2',\r\n    formErrorInput: 'The number is not correct',\r\n    formErrorSize: 'This value has to be less or equal the length',\r\n    formAreaObstacle: 'Sizeable object',\r\n    formButtonSave: 'SAVE IMAGE',\r\n    formButtonSaveFile: 'SAVE TO FILE',\r\n    formButtonLoadFile: 'LOAD FROM FILE',\r\n    formButtonDelete: 'Remove',\r\n    formButtonDuplicate: 'Duplicate',\r\n    formButtonRotate90: '+90\u00ba',\r\n    formButtonRotate5: '+5\u00ba',\r\n    formButtonRotate_5: '-5\u00ba',\r\n    formTextName: 'Tag object',\r\n    exportInfo: 'Layout made with the Padel Floor Planner from',\r\n    exportDate: 'Date',\r\n    drawerInfo: 'Position',\r\n    obstacleHint: 'Sizeable non-movable objects (pillars, corners, social area, shop, changing rooms, store, reception, others)',\r\n    formPillars: 'Pillars',\r\n    invalidShape: 'Unusual object shape',\r\n    invalidFileFormat: 'Invalid file format',\r\n    hintStartClickCourt: \"START by clicking on the court\"\r\n}\r\n\r\nlet Translator = {\r\n    lang: 'es',\r\n\r\n    translate(prop) {\r\n        return Languages[this.lang] && Languages[this.lang][prop] ? Languages[this.lang][prop] : prop;\r\n    },\r\n\r\n    setTransalation(prop, ctrl) {\r\n        let el = document.getElementById(ctrl);\r\n        if (el) {\r\n            el.innerHTML = this.translate(prop);\r\n        }\r\n    },\r\n\r\n    setTransalations(lang) {\r\n        this.lang = lang;\r\n\r\n        this.setTransalation('formMeasureSystem', 'formMeasureSystem');\r\n        this.setTransalation('formMeasureSystemMetric', 'formMeasureSystemMetric');\r\n        this.setTransalation('formMeasureSystemImperial', 'formMeasureSystemImperial');\r\n\r\n        this.setTransalation('formArea', 'formArea');\r\n        this.setTransalation('formAreaWidth', 'formLabelWidth');\r\n        this.setTransalation('formAreaLen', 'formAreaLen');\r\n\r\n        this.setTransalation('formCourts', 'formCourts');\r\n        this.setTransalation('formAreaObstacle', 'formAreaObstacle');\r\n\r\n        this.setTransalation('formButtonSave', 'formButtonSave');\r\n        this.setTransalation('formButtonSaveFile', 'formButtonSaveFile');\r\n        this.setTransalation('formButtonLoadFile', 'formButtonLoadFile');\r\n        this.setTransalation('invalidFileFormat', 'formErrorFileLoad');\r\n        this.setTransalation('formButtonRotate90', 'formButtonRotate90');\r\n        this.setTransalation('formButtonRotate5', 'formButtonRotate5');\r\n        this.setTransalation('formButtonRotate_5', 'formButtonRotate_5');\r\n        this.setTransalation('formButtonDelete', 'formButtonDelete');\r\n        this.setTransalation('formButtonDuplicate', 'formButtonDuplicate');\r\n        this.setTransalation('formPillars', 'formPillars');\r\n        let el = document.getElementById('inputItemName');\r\n        if (el) {\r\n            el.placeholder = this.translate('formTextName');\r\n        }\r\n    }\r\n}\r\n\/\/ JavaScript Document\r\n<\/script>\r\n<script src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/js\/padelarea-v9.js\"><\/script>\r\n<script src=\"https:\/\/padelcreations.b-cdn.net\/wp-content\/uploads\/2D-Floorplanner-2026\/js\/hint-overlay8.js\"><\/script>\r\n\r\n<script>\r\n\/\/ \u2500\u2500 Reinit canvas after layout settles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nwindow.addEventListener('load', function() {\r\n    [100, 500].forEach(function(delay) {\r\n        setTimeout(function() {\r\n            if (typeof padelArea !== 'undefined' && typeof padelForm !== 'undefined') {\r\n                var fv = padelForm.getFormValues();\r\n                if (fv.valid) {\r\n                    padelArea.initCanvas(fv);\r\n                    padelArea.drawCourts();\r\n                }\r\n            }\r\n        }, delay);\r\n    });\r\n});\r\n\r\n\/\/ \u2500\u2500 Palette touch drag \u2014 single clean block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nwindow.addEventListener('load', function() {\r\n    var canvas = document.getElementById('canvasAreas');\r\n    var _lastTouch = null;\r\n    var _dragSourceId = null;\r\n\r\n    \/\/ Ghost\r\n    var _ghost = document.createElement('div');\r\n    _ghost.style.cssText = 'position:fixed;pointer-events:none;z-index:9998;'\r\n        + 'opacity:0.65;transform:translate(-50%,-50%);display:none;';\r\n    document.body.appendChild(_ghost);\r\n\r\n    function ghostSize(id) {\r\n        var s = 0.7;\r\n        try {\r\n            if (id==='courtDouble')  { var g=padelArea.scaleToCanvas(21,11); return {w:Math.round(g.x*s),h:Math.round(g.y*s)}; }\r\n            if (id==='courtSingle')  { var g=padelArea.scaleToCanvas(21,7);  return {w:Math.round(g.x*s),h:Math.round(g.y*s)}; }\r\n        } catch(e) {}\r\n        if (id==='areaObstacle') return {w:60,h:60};\r\n        if (id==='areaPillar60') return {w:36,h:36};\r\n        if (id==='areaPillar40') return {w:24,h:24};\r\n        return {w:80,h:60};\r\n    }\r\n\r\n    function showGhost(id, touch) {\r\n        var imgEl = document.getElementById(id);\r\n        var sz = ghostSize(id);\r\n        _ghost.innerHTML = '';\r\n        _ghost.style.width=sz.w+'px'; _ghost.style.height=sz.h+'px';\r\n        _ghost.style.background=''; _ghost.style.border='';\r\n        if (imgEl && imgEl.tagName==='IMG') {\r\n            var img=document.createElement('img');\r\n            img.src=imgEl.src;\r\n            img.style.cssText='width:'+sz.w+'px;height:'+sz.h+'px;display:block;';\r\n            _ghost.appendChild(img);\r\n        } else {\r\n            _ghost.style.background='rgba(255,120,0,0.7)';\r\n            _ghost.style.border='2px solid #c05000';\r\n        }\r\n        _ghost.style.display='block';\r\n        _ghost.style.left=touch.clientX+'px';\r\n        _ghost.style.top=touch.clientY+'px';\r\n    }\r\n\r\n    function moveGhost(t) {\r\n        _ghost.style.left=t.clientX+'px';\r\n        _ghost.style.top=t.clientY+'px';\r\n    }\r\n\r\n    function hideGhost() {\r\n        _ghost.style.display='none';\r\n    }\r\n\r\n    function dropOnCanvas() {\r\n        if (!_lastTouch || !_dragSourceId) return;\r\n        var rect = canvas.getBoundingClientRect();\r\n        var cx = _lastTouch.clientX, cy = _lastTouch.clientY;\r\n        if (cx < rect.left || cx > rect.right || cy < rect.top || cy > rect.bottom) return;\r\n        var offsetX = cx - rect.left;\r\n        var offsetY = cy - rect.top;\r\n        var xy = padelArea.scaleToArea(offsetX - padelArea.areaX, offsetY - padelArea.areaY);\r\n        padelArea.addDropCourt(xy, _dragSourceId);\r\n        padelArea.updateButtonsVisibility();\r\n        _lastTouch = null;\r\n        _dragSourceId = null;\r\n    }\r\n\r\n    var items = [\r\n        { id: 'courtDouble',  wrap: true },\r\n        { id: 'courtSingle',  wrap: true },\r\n        { id: 'areaObstacle', wrap: true },\r\n        { id: 'areaPillar60', wrap: false },\r\n        { id: 'areaPillar40', wrap: false }\r\n    ];\r\n\r\n    items.forEach(function(item) {\r\n        var el = document.getElementById(item.id);\r\n        if (!el) return;\r\n        var target = item.wrap ? (el.closest('.npal-item') || el.closest('.np-wrap') || el) : el;\r\n\r\n        target.addEventListener('touchstart', function(e) {\r\n            e.preventDefault();\r\n            _dragSourceId = item.id;\r\n            _lastTouch = e.touches[0];\r\n            showGhost(item.id, _lastTouch);\r\n        }, { passive: false });\r\n\r\n        target.addEventListener('touchmove', function(e) {\r\n            e.preventDefault();\r\n            _lastTouch = e.touches[0];\r\n            moveGhost(_lastTouch);\r\n        }, { passive: false });\r\n\r\n        target.addEventListener('touchend', function(e) {\r\n            e.preventDefault();\r\n            hideGhost();\r\n            dropOnCanvas();\r\n        }, { passive: false });\r\n    });\r\n\r\n    padelForm.addDropCourt = function() { dropOnCanvas(); };\r\n});\r\n\r\n\/\/ \u2500\u2500 New UI helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n\/\/ Increment\/decrement dimension input\r\nfunction niStep(visId, realId, delta) {\r\n    var vis  = document.getElementById(visId);\r\n    var real = document.getElementById(realId);\r\n    if (!vis || !real) return;\r\n    var val = parseFloat(vis.value) || 0;\r\n    val = Math.round((val + delta) * 10) \/ 10;  \/\/ step 1, 1 decimal\r\n    if (val < 1) val = 1;\r\n    vis.value  = val;\r\n    real.value = val;\r\n    real.dispatchEvent(new Event('blur'));\r\n}\r\n\r\n\/\/ Keep pillars always on top \u2014 sort in-place before every draw\r\nwindow.addEventListener('load', function() {\r\n    if (typeof padelArea === 'undefined') return;\r\n\r\n    \/\/ Pillar detection: pillars are CSS divs \u2014 they have no img.src\r\n    \/\/ Courts and obstacles have SVG images; pillars do not\r\n    function isPillar(c) {\r\n        \/\/ Method 1: no image src = pillar\r\n        if (!c.img || !c.img.src || c.img.src === '') return true;\r\n        \/\/ Method 2: tagName is DIV (not IMG)\r\n        if (c.img && c.img.tagName && c.img.tagName === 'DIV') return true;\r\n        \/\/ Method 3: any property containing 'illar'\r\n        var str = JSON.stringify(c).toLowerCase();\r\n        if (str.indexOf('pillar') >= 0) return true;\r\n        return false;\r\n    }\r\n\r\n    function sortPillarsOnTop() {\r\n        var courts = padelArea.padelCourts.courts;\r\n        var others  = [];\r\n        var pillars = [];\r\n        for (var i = 0; i < courts.length; i++) {\r\n            if (isPillar(courts[i])) pillars.push(courts[i]);\r\n            else others.push(courts[i]);\r\n        }\r\n        \/\/ Splice in-place so the array reference stays the same\r\n        var sorted = others.concat(pillars);\r\n        for (var j = 0; j < sorted.length; j++) {\r\n            courts[j] = sorted[j];\r\n        }\r\n    }\r\n\r\n    var _origDraw = padelArea.drawCourts.bind(padelArea);\r\n    padelArea.drawCourts = function() {\r\n        sortPillarsOnTop();\r\n        _origDraw.call(this);\r\n    };\r\n});\r\n\r\n\/\/ Patch duplicateCourt to place duplicate at a free spot\r\nwindow.addEventListener('load', function() {\r\n    if (typeof padelArea === 'undefined') return;\r\n    var _origDup = padelArea.duplicateCourt.bind(padelArea);\r\n    padelArea.duplicateCourt = function() {\r\n        if (!this.padelCourts.selectedCourt) return;\r\n        var item = this.padelCourts.selectedCourt;\r\n        \/\/ Get current position of selected item\r\n        var baseX = item.x !== undefined ? item.x : (item.ax || 0);\r\n        var baseY = item.y !== undefined ? item.y : (item.ay || 0);\r\n        \/\/ Find free spot near current position + small offset\r\n        var spot = paFindFreeSpot();\r\n        var offset = this.measureSystem === 'METRIC' ? 1 : 3.28084;\r\n        \/\/ Temporarily override courts array position by calling original\r\n        \/\/ then moving the new court to the free spot\r\n        var countBefore = this.padelCourts.courts.length;\r\n        _origDup();\r\n        var countAfter = this.padelCourts.courts.length;\r\n        if (countAfter > countBefore) {\r\n            var newItem = this.padelCourts.courts[countAfter - 1];\r\n            var dx = spot.x - baseX;\r\n            var dy = spot.y - baseY;\r\n            newItem.moveOrResizeSelectedCourt(dx - offset, dy - offset);\r\n        }\r\n        this.drawCourts();\r\n        this.updateButtonsVisibility();\r\n    };\r\n});\r\n\r\n\/\/ Patch getSelectedCourt to select topmost (last drawn) object first\r\nwindow.addEventListener('load', function() {\r\n    if (typeof padelArea === 'undefined') return;\r\n    var courts = padelArea.padelCourts;\r\n    var _orig = courts.getSelectedCourt.bind(courts);\r\n    courts.getSelectedCourt = function(p) {\r\n        \/\/ Iterate in reverse so last-added (top) object is selected first\r\n        this.selectedCourt = null;\r\n        for (var i = this.courts.length - 1; i >= 0; i--) {\r\n            if (this.courts[i].checkInside(p)) {\r\n                this.selectedCourt = this.courts[i];\r\n                break;\r\n            }\r\n        }\r\n        if (this.selectedCourt) {\r\n            this.selectedCourt.setDrapOp(p, this.selectionBox);\r\n        }\r\n        return this.selectedCourt;\r\n    };\r\n});\r\n\r\n\/\/ Find next free position: start top-left, move 2m down for each existing object\r\nfunction paFindFreeSpot() {\r\n    var courts = padelArea.padelCourts.courts;\r\n    var x = 2;\r\n    var y = 2 + (courts.length * 2);\r\n    \/\/ Keep within bounds\r\n    y = Math.min(y, padelArea.measureHeight - 2);\r\n    return { x: x, y: y };\r\n}\r\n\r\n\/\/ Add object \u2014 top-left, 2m below previous\r\nfunction paAddToCenter(id) {\r\n    var xy = paFindFreeSpot();\r\n    padelArea.addDropCourt(xy, id);\r\n    padelArea.updateButtonsVisibility();\r\n}\r\n\r\n\/\/ Sync new visible input \u2192 hidden real input \u2192 trigger redraw\r\nfunction newSyncInput(realId, value) {\r\n    var real = document.getElementById(realId);\r\n    if (real) {\r\n        real.value = value;\r\n        real.dispatchEvent(new Event('blur'));\r\n    }\r\n}\r\n\r\n\/\/ Toggle metric\/imperial from new UI labels\r\nfunction newSetMeasure(system) {\r\n    var metricRadio   = document.getElementById('real-metric');\r\n    var imperialRadio = document.getElementById('real-imperial');\r\n    var lm = document.getElementById('new-label-metric');\r\n    var li = document.getElementById('new-label-imperial');\r\n    if (system === 'METRIC') {\r\n        metricRadio.checked = true;\r\n        lm.classList.add('m-checked');\r\n        li.classList.remove('m-checked');\r\n    } else {\r\n        imperialRadio.checked = true;\r\n        li.classList.add('m-checked');\r\n        lm.classList.remove('m-checked');\r\n    }\r\n    changeMeasureSystem();\r\n    \/\/ Sync visible inputs, units and measure info after conversion\r\n    setTimeout(function() {\r\n        var rw = document.getElementById('textAreaWidth');\r\n        var rl = document.getElementById('textAreaLen');\r\n        var vw = document.getElementById('new-width-input');\r\n        var vl = document.getElementById('new-len-input');\r\n        if (rw && vw) vw.value = rw.value;\r\n        if (rl && vl) vl.value = rl.value;\r\n        \/\/ Update unit labels\r\n        var unit = (system === 'METRIC') ? 'm' : 'ft';\r\n        var u1 = document.getElementById('new-unit-1');\r\n        var u2 = document.getElementById('new-unit-2');\r\n        if (u1) u1.textContent = unit;\r\n        if (u2) u2.textContent = unit;\r\n        \/\/ Update measure info from translated spans\r\n        var info = document.getElementById('new-measure-info');\r\n        if (info) {\r\n            var metricSpan   = document.getElementById('formMeasureSystemMetric');\r\n            var imperialSpan = document.getElementById('formMeasureSystemImperial');\r\n            info.textContent = (system === 'METRIC')\r\n                ? (metricSpan   ? metricSpan.textContent   : 'METERS (M) | 1 SQ = 1 M\u00b2')\r\n                : (imperialSpan ? imperialSpan.textContent : 'FEET (FT) | 1 SQ = 25 FT\u00b2');\r\n        }\r\n    }, 50);\r\n}\r\n\r\n\/\/ Show\/hide hint and description input when buttons appear\r\nvar _origUpdateBtns = null;\r\nwindow.addEventListener('load', function() {\r\n    if (typeof padelArea !== 'undefined') {\r\n        _origUpdateBtns = padelArea.updateButtonsVisibility.bind(padelArea);\r\n        padelArea.updateButtonsVisibility = function() {\r\n            _origUpdateBtns();\r\n            var hasObjs = padelArea.padelCourts && padelArea.padelCourts.courts && padelArea.padelCourts.courts.length > 0;\r\n            var hasSel  = !!padelArea.padelCourts.selectedCourt;\r\n            var hint    = document.getElementById('new-select-hint');\r\n            var descWrap = document.getElementById('textItemName');\r\n            if (hint)     hint.style.display    = hasObjs ? 'none' : 'inline';\r\n            if (descWrap) descWrap.style.display = hasSel  ? 'block' : 'none';\r\n            \/\/ Show action buttons when objects exist on canvas\r\n            ['buttonRotate90','buttonRotate5','buttonRotate_5','buttonDuplicate','buttonDelete'].forEach(function(id) {\r\n                var btn = document.getElementById(id);\r\n                if (btn) btn.style.display = hasObjs ? 'inline-flex' : 'none';\r\n            });\r\n        };\r\n    }\r\n\r\n    \/\/ Set initial measure info\r\n    var initInfo = document.getElementById('new-measure-info');\r\n    if (initInfo) {\r\n        setTimeout(function() {\r\n            var metricSpan = document.getElementById('formMeasureSystemMetric');\r\n            initInfo.textContent = metricSpan ? metricSpan.textContent : 'METERS (M) | 1 SQ = 1 M\u00b2';\r\n        }, 100);\r\n    }\r\n\r\n    \/\/ Mirror designerInfo (coords) to new coords div\r\n    var orig = document.getElementById('designerInfo');\r\n    var newCoords = document.getElementById('new-coords');\r\n    if (orig && newCoords) {\r\n        var obs = new MutationObserver(function() {\r\n            newCoords.innerHTML = orig.innerHTML;\r\n        });\r\n        obs.observe(orig, { childList: true, subtree: true, characterData: true });\r\n    }\r\n});\r\n\r\n\r\n\r\n\/\/ \u2500\u2500 Modern export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ Called by patched exportCourt() in padelarea-v8.js with the drawn canvas\r\nwindow.paOnExportReady = null; \/\/ set on each export call\r\n\r\nfunction paModernExport() {\r\n    window.paOnExportReady = function(srcCanvas) {\r\n        paDoModernExport(srcCanvas);\r\n        window.paOnExportReady = null;\r\n    };\r\n    \/\/ Trigger original export \u2014 it will call paOnExportReady when done\r\n    padelAreaExport.exportCourt();\r\n}\r\n\r\nfunction paDoModernExport(mainCanvas) {\r\n    if (!mainCanvas) return;\r\n\r\n    var W = mainCanvas.width;\r\n    var H = mainCanvas.height;\r\n    var FOOTER = 80;\r\n    var cropFooter = 85;\r\n    var cH = H - cropFooter;\r\n\r\n    var out = document.createElement('canvas');\r\n    out.width  = W;\r\n    out.height = cH + FOOTER;\r\n    var ctx = out.getContext('2d');\r\n\r\n    ctx.drawImage(mainCanvas, 0, 0, W, cH, 0, 0, W, cH);\r\n\r\n    \/\/ Footer\r\n    ctx.fillStyle = '#1a2744';\r\n    ctx.fillRect(0, cH, W, FOOTER);\r\n\r\n    ctx.fillStyle = '#ffffff';\r\n    ctx.font = 'bold 13px Arial, sans-serif';\r\n    ctx.fillText('Layout made with the Padel Floor Planner', 24, cH + 24);\r\n    ctx.fillStyle = '#a8c0e8';\r\n    ctx.font = '12px Arial, sans-serif';\r\n    ctx.fillText('PADELCREATIONS INTERNATIONAL', 24, cH + 44);\r\n    ctx.fillStyle = '#7ecb00';\r\n    ctx.font = 'bold 12px Arial, sans-serif';\r\n    ctx.fillText('www.padelcreations.com', W\/2 - 90, cH + 28);\r\n    ctx.fillText('info@padelcreations.com', W\/2 - 90, cH + 50);\r\n\r\n    function getFilename() {\r\n        var d = new Date();\r\n        return 'Padelcreations_Layout_' +\r\n            d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0') + '-' + String(d.getDate()).padStart(2,'0') +\r\n            '_' + String(d.getHours()).padStart(2,'0') + '-' + String(d.getMinutes()).padStart(2,'0') + '.png';\r\n    }\r\n\r\n    function doDownload() {\r\n        var link = document.createElement('a');\r\n        link.download = getFilename();\r\n        link.href = out.toDataURL('image\/png');\r\n        document.body.appendChild(link);\r\n        link.click();\r\n        document.body.removeChild(link);\r\n    }\r\n\r\n    var logo = new Image();\r\n    logo.crossOrigin = 'anonymous';\r\n    logo.onload = function() {\r\n        var lh = FOOTER - 16;\r\n        var lw = logo.width * (lh \/ logo.height);\r\n        ctx.drawImage(logo, W - lw - 16, cH + 8, lw, lh);\r\n        doDownload();\r\n    };\r\n    logo.onerror = function() { doDownload(); };\r\n    logo.src = 'https:\/\/www.padelcreations.com\/wp-content\/uploads\/2024\/10\/logo-white.png';\r\n}\r\n\r\n\/\/ \u2500\u2500 Canvas touch events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nwindow.addEventListener('load', function() {\r\n    var canvas = document.getElementById('canvasAreas');\r\n\r\n    function getCanvasOffset(touch) {\r\n        var rect = canvas.getBoundingClientRect();\r\n        return {\r\n            offsetX: touch.clientX - rect.left,\r\n            offsetY: touch.clientY - rect.top\r\n        };\r\n    }\r\n\r\n    canvas.addEventListener('touchstart', function(e) {\r\n        e.preventDefault(); e.stopImmediatePropagation();\r\n        padelArea.mouseDown(getCanvasOffset(e.touches[0]));\r\n    }, { passive: false, capture: true });\r\n\r\n    canvas.addEventListener('touchmove', function(e) {\r\n        e.preventDefault(); e.stopImmediatePropagation();\r\n        padelArea.mouseMove(getCanvasOffset(e.touches[0]));\r\n    }, { passive: false, capture: true });\r\n\r\n    canvas.addEventListener('touchend', function(e) {\r\n        e.preventDefault(); e.stopImmediatePropagation();\r\n        padelArea.mouseUp(null);\r\n    }, { passive: false, capture: true });\r\n\r\n    \/\/ Touch drag handled by the re-registration block above\r\n});\r\n<\/script>\r\n\r\n<!-- Popup \u2014 original structure -->\r\n<div id=\"popup1\" class=\"overlay\">\r\n    <div class=\"popup\">\r\n        <div class=\"popup-header\">\r\n            <img title=\"Grundriss Planer f\u00fcr Padel - Padelcreations - Wir bauen robuste Padel Courts\" decoding=\"async\" src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/images\/info-ball.png\" alt=\"info\"\/>\r\n            <h2>How to drag and drop an object<\/h2>\r\n            <a class=\"close\" href=\"#!\">&times;<\/a>\r\n        <\/div>\r\n        <div class=\"content\">\r\n            <video controls autoplay muted loop playsinline>\r\n                <source src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/images\/Dragobject.mp4\" type=\"video\/mp4\">\r\n            <\/video>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6b35264 elementor-widget elementor-widget-html\" data-id=\"6b35264\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n     PadelCreations \u00b7 Vista 3D del plano (v12.7)\r\n     Pegar este bloque completo al final del widget HTML del planificador,\r\n     justo antes de <\/body>. A\u00f1ade el bot\u00f3n \u00ab3D\u00bb en la barra superior.\r\n     Requiere subir padel-3d-planner.js a \/wp-content\/uploads\/2D-Floorplanner-2026\/js\/\r\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<style>\r\n\/* \u2500\u2500 Vista 3D del plano \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.pc3d-ov{position:fixed;inset:0;z-index:10000;background:#0f1a2c;display:flex;flex-direction:column;font-family:'Barlow',sans-serif;}\r\n\/* Con sesi\u00f3n iniciada en WordPress: la vista 3D y el presupuesto empiezan debajo de la barra de administraci\u00f3n *\/\r\nbody.admin-bar .pc3d-ov,body.admin-bar .pcq{top:32px;}\r\n@media screen and (max-width:782px){body.admin-bar .pc3d-ov,body.admin-bar .pcq{top:46px;}}\r\n.pc3d-ov[hidden]{display:none;}\r\n.pc3d-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 12px;background:var(--navy,#1a2744);box-shadow:0 2px 8px rgba(0,0,0,.3);}\r\n.pc3d-title{color:#fff;font-weight:700;font-size:.95rem;display:flex;align-items:center;gap:6px;margin-right:6px;}\r\n.pc3d-grp{display:flex;gap:3px;background:rgba(255,255,255,.1);border-radius:8px;padding:3px;}\r\n.pc3d-grp[hidden]{display:none!important;}\r\n.pc3d-grp button{border:0;border-radius:6px;background:transparent;color:rgba(255,255,255,.75);font:600 .78rem 'Barlow',sans-serif;padding:6px 10px;cursor:pointer;min-height:32px;}\r\n.pc3d-grp button:hover{color:#fff;background:rgba(255,255,255,.12);}\r\n.pc3d-grp button[aria-pressed=\"true\"]{background:#7ecb00;color:#fff;}\r\n.pc3d-logos .pc3d-lg{display:inline-flex;align-items:center;gap:6px;}\r\n.pc3d-logos .pc3d-lg img{height:20px;max-width:56px;object-fit:contain;background:#fff;border-radius:3px;padding:1px;}\r\n.pc3d-logos .pc3d-lg-x{padding:6px 7px;min-width:0;color:rgba(255,255,255,.6);}\r\n.pc3d-logos [hidden]{display:none !important;}\r\n.pc3d-gl{align-self:center;padding:0 6px 0 4px;font-size:12px;font-weight:600;color:rgba(255,255,255,.72);white-space:nowrap;}\r\n.pc3d-sw button{width:30px;min-width:30px;padding:0;position:relative;}\r\n.pc3d-sw button::after{content:'';position:absolute;inset:7px;border-radius:50%;background:var(--c);box-shadow:0 0 0 2px rgba(255,255,255,.35);}\r\n.pc3d-sq button::after{border-radius:4px;}\r\n.pc3d-sw button[aria-pressed=\"true\"]{background:rgba(126,203,0,.35);}\r\n.pc3d-sw button[aria-pressed=\"true\"]::after{box-shadow:0 0 0 2px #fff;}\r\n.pc3d-spacer{flex:1;}\r\n.pc3d-views .pc3d-shot{margin-left:6px;}\r\n.pc3d-views button.pc3d-shot{display:inline-flex;align-items:center;gap:7px;background:rgba(255,255,255,.1);color:#fff;text-transform:none;letter-spacing:0;font:700 .78rem 'Barlow',sans-serif;padding:4px 12px 4px 4px;border-radius:100px;}\r\n.pc3d-views button.pc3d-shot:hover{background:rgba(255,255,255,.2);}\r\n.pc3d-views button.pc3d-shot:disabled{opacity:.6;cursor:progress;}\r\n.pc3d-ai-ico{background:#e0a21b !important;}\r\n#pc3d-aidlg{position:absolute;inset:0;z-index:30;display:flex;align-items:center;justify-content:center;padding:16px;background:rgba(10,20,40,.6);}\r\n#pc3d-aidlg[hidden]{display:none;}\r\n#pc3d-aidlg .aid-card{background:#fff;color:#1a2744;border-radius:16px;box-shadow:0 24px 60px rgba(0,0,0,.35);width:min(560px,100%);max-height:100%;overflow:auto;padding:22px 22px 18px;font-family:Barlow,Arial,sans-serif;}\r\n#pc3d-aidlg.aid-wide .aid-card{width:min(1100px,100%);}\r\n#pc3d-aidlg h3{margin:0 0 8px;font-size:20px;font-weight:800;display:flex;align-items:center;gap:8px;}\r\n#pc3d-aidlg p{margin:0 0 10px;font-size:14px;line-height:1.45;}\r\n#pc3d-aidlg .aid-note{font-size:12.5px;color:#55606f;background:#f4f6fa;border-radius:10px;padding:9px 11px;}\r\n#pc3d-aidlg label{display:block;font-size:13px;font-weight:700;margin:12px 0 5px;}\r\n#pc3d-aidlg input{width:100%;box-sizing:border-box;border:1.5px solid #cfd6e2;border-radius:10px;padding:10px 12px;font:600 15px Barlow,Arial,sans-serif;color:#1a2744;}\r\n#pc3d-aidlg input:focus{outline:none;border-color:#76a343;}\r\n#pc3d-aidlg .aid-btns{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin-top:14px;}\r\n#pc3d-aidlg button{border:0;border-radius:10px;font:700 14px Barlow,Arial,sans-serif;padding:10px 18px;cursor:pointer;}\r\n#pc3d-aidlg .aid-go{background:#76a343;color:#fff;}#pc3d-aidlg .aid-go:hover{background:#5f8c32;}\r\n#pc3d-aidlg .aid-x{background:#eef1f8;color:#1a2744;}#pc3d-aidlg .aid-x:hover{background:#dde3ee;}\r\n#pc3d-aidlg button:disabled{opacity:.55;cursor:progress;}\r\n#pc3d-aidlg .aid-err{color:#b3261e;font-weight:700;font-size:13.5px;min-height:1em;margin:8px 0 0;}\r\n#pc3d-aidlg .aid-wait{display:flex;align-items:center;gap:12px;margin:14px 0 4px;font-weight:700;font-size:14px;}\r\n#pc3d-aidlg .aid-spin{width:26px;height:26px;border-radius:50%;border:3px solid #dfe5ee;border-top-color:#76a343;animation:aidspin 1s linear infinite;flex:none;}\r\n@keyframes aidspin{to{transform:rotate(360deg);}}\r\n@media (prefers-reduced-motion:reduce){#pc3d-aidlg .aid-spin{animation:none;}}\r\n#pc3d-aidlg img{display:block;width:100%;height:auto;border-radius:10px;margin:6px 0 4px;}\r\n#pc3d-aidlg .aid-prev{aspect-ratio:16\/9;object-fit:cover;background:#eef1f8;margin:2px 0 4px;}\r\n#pc3d-aidlg .aid-pcap{font-size:12px;color:#55606f;margin:0 0 10px;}\r\n#pc3d-aidlg .aid-left{font-size:12.5px;color:#55606f;margin-right:auto;align-self:center;}\r\n#pc3d-aidlg [hidden]{display:none !important;}\r\n#pc3d-aidlg .aid-form .aid-left{flex:1 1 100%;margin:0 0 4px;text-align:left;}\r\n.pc3d-pdf-ico{background:#d64541 !important;}\r\n.pc3d-shot-ico{width:26px;height:26px;border-radius:50%;background:#5cc95a;box-shadow:inset 0 0 0 2px rgba(255,255,255,.25);display:grid;place-items:center;}\r\n.pc3d-views button.pc3d-close,.pc3d-close{border:0;border-radius:6px;background:#d92647;color:#fff;font:700 .78rem 'Barlow',sans-serif;padding:6px 14px;cursor:pointer;letter-spacing:0;text-transform:none;}\r\n.pc3d-views button.pc3d-close:hover,.pc3d-close:hover{background:#b71f3b;}\r\n.pc3d-ov button:focus-visible{outline:2px solid #7ecb00;outline-offset:2px;}\r\n.pc3d-stage{position:relative;flex:1;min-height:0;background:#dfe6ec;}\r\n.pc3d-stage canvas{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none;cursor:grab;}\r\n.pc3d-stage canvas:active{cursor:grabbing;}\r\n.pc3d-views{display:flex;gap:4px;flex-wrap:wrap;padding:6px 12px;background:#243556;border-top:1px solid rgba(255,255,255,.08);}\r\n.pc3d-views button{border:0;background:rgba(255,255,255,.08);color:rgba(255,255,255,.75);padding:6px 11px;border-radius:6px;cursor:pointer;font:700 .72rem 'Barlow',sans-serif;letter-spacing:.06em;text-transform:uppercase;}\r\n.pc3d-views button[aria-pressed=\"true\"]{background:#7ecb00;color:#fff;}\r\n.pc3d-msg{position:absolute;inset:0;display:grid;place-items:center;margin:0;color:#1a2744;font-weight:600;background:rgba(223,230,236,.85);}\r\n.pc3d-msg[hidden]{display:none;}\r\n@media (max-width:700px){.pc3d-title span{display:none;}.pc3d-grp button{padding:5px 7px;font-size:.72rem;}.pc3d-views button{padding:5px 7px;font-size:.66rem;}}\r\n.pc3d-tg button{display:inline-flex;align-items:center;gap:6px;}\r\n.pc3d-tg button::before{content:'';width:13px;height:13px;border-radius:3px;border:2px solid rgba(255,255,255,.7);box-sizing:border-box;flex:none;}\r\n.pc3d-tg button[aria-pressed=\"true\"]::before{background:#fff;border-color:#fff;box-shadow:inset 0 0 0 2px #7ecb00;}\r\n.pc3d-tg button:disabled{opacity:.4;cursor:not-allowed;}\r\n.pc3d-roof{align-items:center;flex-wrap:wrap;}\r\n.pc3d-roof[hidden]{display:none;}\r\n.pc3d-roof button{display:inline-flex;align-items:center;gap:6px;}\r\n.pc3d-roof button::before{content:'';width:13px;height:13px;border-radius:3px;border:2px solid rgba(255,255,255,.7);box-sizing:border-box;flex:none;}\r\n.pc3d-roof button[aria-pressed=\"true\"]::before{background:#fff;border-color:#fff;box-shadow:inset 0 0 0 2px #7ecb00;}\r\n.pc3d-roof select{padding:4px 4px;border:0;border-radius:5px;font:700 .8rem 'Barlow',sans-serif;color:#1a2744;background:#fff;}.pc3d-roof select:disabled{opacity:.45;}.pc3d-roof label[hidden]{display:none;}\r\n.pc3d-roof label{display:inline-flex;align-items:center;gap:4px;color:rgba(255,255,255,.8);font:600 .74rem 'Barlow',sans-serif;padding:0 4px;}\r\n.pc3d-roof input{width:56px;padding:4px 6px;border:0;border-radius:5px;font:700 .8rem 'Barlow',sans-serif;color:#1a2744;background:#fff;}\r\n.pc3d-roof input:disabled{opacity:.45;}\r\n.pc3d-roof-hint{color:#ffd166;font:600 .72rem 'Barlow',sans-serif;padding:0 6px;}\r\n.pc3d-roof-hint[hidden]{display:none;}\r\n.pc3d-clash{background:#e11d1d;color:#fff;border-radius:5px;font:700 .72rem 'Barlow',sans-serif;padding:3px 8px;}\r\n.pc3d-clash[hidden]{display:none;}\r\n\/* \u2500\u2500 Solicitud de oferta (popup sobre la vista 3D) \u2500\u2500 *\/\r\n.pcq{position:fixed;inset:0;z-index:10010;background:rgba(10,20,35,.72);display:flex;align-items:flex-start;justify-content:center;overflow-y:auto;padding:24px 12px;font-family:'Barlow',sans-serif;}\r\n.pcq[hidden]{display:none;}\r\n.pcq-box{background:#fff;border-radius:14px;width:min(1040px,100%);box-shadow:0 24px 60px rgba(0,0,0,.35);overflow:hidden;color:#1a2e42;}\r\n.pcq-head{display:flex;align-items:center;gap:12px;background:#1a2744;color:#fff;padding:14px 18px;}\r\n.pcq-head h2{flex:1;margin:0;font:800 1.1rem 'Barlow',sans-serif;letter-spacing:.04em;text-transform:uppercase;}\r\n.pcq-x{border:0;background:rgba(255,255,255,.12);color:#fff;width:34px;height:34px;border-radius:50%;font-size:1.3rem;cursor:pointer;}\r\n.pcq-x:hover{background:#d92647;}\r\n.pcq-body{padding:18px 20px 22px;}\r\n.pcq-summary{background:#eef1f8;border-radius:10px;padding:12px 14px;margin-bottom:18px;}\r\n.pcq-sum-ttl{font:700 .72rem 'Barlow',sans-serif;letter-spacing:.14em;text-transform:uppercase;color:#5a6e7e;margin-bottom:6px;}\r\n.pcq-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px;}\r\n.pcq-chip{background:#fff;border:1px solid #d0cfc9;border-radius:100px;padding:3px 11px;font-size:.8rem;font-weight:600;}\r\n.pcq-opts{display:flex;flex-wrap:wrap;gap:12px;}\r\n.pcq-opts label{display:flex;flex-direction:column;gap:3px;font-size:.72rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:#5a6e7e;min-width:220px;flex:1;}\r\n.pcq-att{margin:10px 0 0;font-size:.82rem;color:#3d6318;}\r\n.pcq-hidden{display:none!important;}\r\n.pcq-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;}\r\n.pcq-col-ttl{font:700 .74rem 'Barlow',sans-serif;letter-spacing:.12em;text-transform:uppercase;color:#5a6e7e;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #d0cfc9;}\r\n.pcq-f{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;}\r\n.pcq-f label{font-size:.68rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#5a6e7e;}\r\n.pcq .req{color:#d94040;margin-left:2px;}\r\n.pcq .fi,.pcq .fsel,.pcq .fta{width:100%;box-sizing:border-box;padding:9px 11px;border:2px solid #d0cfc9;border-radius:8px;font:400 .9rem 'Barlow',sans-serif;color:#1a2e42;background:#fff;outline:none;}\r\n.pcq .fi:focus,.pcq .fsel:focus,.pcq .fta:focus{border-color:#5a8f2d;box-shadow:0 0 0 3px rgba(90,143,45,.14);}\r\n.pcq .fta{min-height:70px;resize:vertical;}\r\n.pcq .err{border-color:#d94040!important;background:#fff5f5!important;}\r\n.pcq .errmsg{font-size:.72rem;color:#d94040;font-weight:500;}\r\n.pcq-foot{display:flex;align-items:center;gap:20px;flex-wrap:wrap;margin-top:12px;padding-top:16px;border-top:1px solid #d0cfc9;}\r\n.pcq-err{font-size:.8rem;color:#d94040;margin-top:6px;}\r\n.pcq-err[hidden]{display:none;}\r\n.pcq-send{border:0;border-radius:8px;background:linear-gradient(135deg,#5a8f2d,#3d6318);color:#fff;font:800 .95rem 'Barlow',sans-serif;letter-spacing:.1em;text-transform:uppercase;padding:14px 30px;cursor:pointer;box-shadow:0 6px 22px rgba(90,143,45,.3);}\r\n.pcq-send:disabled{opacity:.6;cursor:progress;}\r\n.pcq button:focus-visible,.pcq a:focus-visible{outline:2px solid #5a8f2d;outline-offset:2px;}\r\n@media (max-width:860px){.pcq-cols{grid-template-columns:1fr;gap:6px;}.pcq{padding:0;}.pcq-box{border-radius:0;min-height:100%;}}\r\n.pc3d-views button.pc3d-quote{margin-left:auto;background:#7ecb00;color:#fff;text-transform:none;letter-spacing:0;font:700 .8rem 'Barlow',sans-serif;padding:6px 14px;border-radius:6px;}\r\n.pc3d-views button.pc3d-quote:hover{background:#5fa800;}\r\n.pcq-done{text-align:center;padding:34px 16px 20px;outline:none;}\r\n.pcq-done[hidden]{display:none;}\r\n.pcq-done-ico{width:64px;height:64px;margin:0 auto 14px;border-radius:50%;background:#7ecb00;color:#fff;font-size:2rem;font-weight:800;display:grid;place-items:center;}\r\n.pcq-done h3{margin:0 0 10px;font:800 1.4rem 'Barlow',sans-serif;color:#1a2744;}\r\n.pcq-done p{max-width:520px;margin:0 auto 10px;line-height:1.55;color:#4a5a7a;}\r\n.pcq-done .pcq-next{font-weight:700;color:#1a2744;margin-bottom:22px;}\r\n<\/style>\r\n<!-- \u2550\u2550 Vista 3D del plano (PadelCreations) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div id=\"pc3d-overlay\" class=\"pc3d-ov\" hidden role=\"dialog\" aria-modal=\"true\" aria-label=\"3D view\">\r\n  <div class=\"pc3d-bar\">\r\n    <div class=\"pc3d-title\"><i class=\"fas fa-cube\" aria-hidden=\"true\"><\/i> <span data-i18n=\"title\">3D View<\/span><\/div>\r\n    <div class=\"pc3d-grp\" data-opt=\"application\" role=\"group\">\r\n      <button type=\"button\" data-val=\"INDOOR\" data-i18n=\"indoor\">Indoor<\/button>\r\n      <button type=\"button\" data-val=\"INDOOR_PANORAMIC_3M\" data-i18n=\"indoorPano\">Indoor Panoramic<\/button>\r\n      <button type=\"button\" data-val=\"OUTDOOR\" data-i18n=\"outdoor\">Outdoor<\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp\" data-opt=\"doors\" role=\"group\">\r\n      <button type=\"button\" data-val=\"none\" data-i18n=\"dNone\">No doors<\/button>\r\n      <button type=\"button\" data-val=\"one\" data-i18n=\"dOne\">Doors 1 side<\/button>\r\n      <button type=\"button\" data-val=\"two\" data-i18n=\"dTwo\">Doors 2 sides<\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp\" data-opt=\"lighting\" role=\"group\">\r\n      <button type=\"button\" data-val=\"none\" data-i18n=\"lNone\">No lights<\/button>\r\n      <button type=\"button\" data-val=\"straight\" data-i18n=\"lStraight\">Straight<\/button>\r\n      <button type=\"button\" data-val=\"angled\" data-i18n=\"lAngled\">Angled<\/button>\r\n      <button type=\"button\" data-val=\"curved\" data-i18n=\"lCurved\">Curved<\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp\" data-opt=\"lux\" role=\"group\" id=\"pc3d-lux\">\r\n      <button type=\"button\" data-val=\"300\">300 Lux<\/button>\r\n      <button type=\"button\" data-val=\"500\">500 Lux<\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-roof\" id=\"pc3d-roof\" role=\"group\">\r\n      <button type=\"button\" data-tg=\"roof\" aria-pressed=\"false\" data-i18n=\"roof\">Roof<\/button>\r\n      <label><span data-i18n=\"eave\">Eave<\/span><input type=\"number\" id=\"pc3d-eave\" min=\"3\" max=\"40\" step=\"0.1\" inputmode=\"decimal\"><span class=\"pc3d-u\">m<\/span><\/label>\r\n      <label><span data-i18n=\"ridge\">Ridge<\/span><input type=\"number\" id=\"pc3d-ridge\" min=\"3\" max=\"50\" step=\"0.1\" inputmode=\"decimal\"><span class=\"pc3d-u\">m<\/span><\/label>\r\n      <button type=\"button\" data-tg=\"roofCurved\" aria-pressed=\"false\" data-i18n=\"curved\">Curved<\/button>\r\n      <label id=\"pc3d-units-w\" hidden title=\"Identical halls side by side (curved roof, 1 court)\" data-i18n-title=\"unitsT\"><span data-i18n=\"units\">Units<\/span><select id=\"pc3d-units\"><option value=\"1\">\u00d71<\/option><option value=\"2\">\u00d72<\/option><option value=\"3\">\u00d73<\/option><option value=\"4\">\u00d74<\/option><option value=\"5\">\u00d75<\/option><option value=\"6\">\u00d76<\/option><\/select><\/label>\r\n      <label title=\"A\"><span data-i18n=\"bSp\">Beam spacing<\/span><input type=\"number\" id=\"pc3d-bsp\" min=\"2\" max=\"30\" step=\"0.1\" inputmode=\"decimal\"><span class=\"pc3d-u\">m<\/span><\/label>\r\n      <label title=\"B\"><span data-i18n=\"bTop\">Beam depth ridge<\/span><input type=\"number\" id=\"pc3d-btop\" min=\"0.1\" max=\"4\" step=\"0.05\" inputmode=\"decimal\"><span class=\"pc3d-u\">m<\/span><\/label>\r\n      <label title=\"C\"><span data-i18n=\"bWall\">Beam depth wall<\/span><input type=\"number\" id=\"pc3d-bwall\" min=\"0.1\" max=\"4\" step=\"0.05\" inputmode=\"decimal\"><span class=\"pc3d-u\">m<\/span><\/label>\r\n      <span class=\"pc3d-roof-hint\" id=\"pc3d-roof-hint\" hidden><\/span>\r\n      <span class=\"pc3d-clash\" id=\"pc3d-clash\" hidden><\/span>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-tg\" role=\"group\">\r\n      <button type=\"button\" data-tg=\"protect\" aria-pressed=\"false\" data-i18n=\"tProt\">Door protections<\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-sw\" data-opt=\"grass\" role=\"group\" aria-label=\"Grass colour\">\r\n      <button type=\"button\" data-val=\"GrassBlue\" title=\"Blue\" style=\"--c:#0a3cd6\"><\/button>\r\n      <button type=\"button\" data-val=\"GrassGreen\" title=\"Green\" style=\"--c:#0b6b22\"><\/button>\r\n      <button type=\"button\" data-val=\"GrassFuchsia\" title=\"Fuchsia\" style=\"--c:#76106c\"><\/button>\r\n      <button type=\"button\" data-val=\"GrassTerracotta\" title=\"Terracotta\" style=\"--c:#a03a18\"><\/button>\r\n      <button type=\"button\" data-val=\"GrassBlack\" title=\"Black\" style=\"--c:#2b2e33\"><\/button>\r\n      <button type=\"button\" data-val=\"GrassRed\" title=\"Red\" style=\"--c:#c0141c\"><\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-sw pc3d-sq\" data-opt=\"tennisSurface\" role=\"group\" aria-label=\"Tennis surface\" id=\"pc3d-tennis\" hidden>\r\n      <span class=\"pc3d-gl\" data-i18n=\"tennis\">Tennis<\/span>\r\n      <button type=\"button\" data-val=\"clay\" title=\"Clay\" data-i18n-title=\"tClay\" style=\"--c:#b3572f\"><\/button>\r\n      <button type=\"button\" data-val=\"hard\" title=\"Hard court\" data-i18n-title=\"tHard\" style=\"--c:#2f5d96\"><\/button>\r\n      <button type=\"button\" data-val=\"grass\" title=\"Grass\" data-i18n-title=\"tGrass\" style=\"--c:#4e8a36\"><\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-sw pc3d-sq\" data-opt=\"floor\" role=\"group\" aria-label=\"Floor colour\" id=\"pc3d-floor\">\r\n      <span class=\"pc3d-gl\" data-i18n=\"floor\">Floor<\/span>\r\n      <button type=\"button\" data-val=\"FloorLightGrey\" title=\"Light grey\" data-i18n-title=\"fLightGrey\" style=\"--c:#c9cdd2\"><\/button>\r\n      <button type=\"button\" data-val=\"FloorDarkGrey\" title=\"Dark grey\" data-i18n-title=\"fDarkGrey\" style=\"--c:#5e646b\"><\/button>\r\n      <button type=\"button\" data-val=\"FloorBlack\" title=\"Black\" data-i18n-title=\"fBlack\" style=\"--c:#26292d\"><\/button>\r\n      <button type=\"button\" data-val=\"FloorRed\" title=\"Red\" data-i18n-title=\"fRed\" style=\"--c:#8e2a27\"><\/button>\r\n      <button type=\"button\" data-val=\"FloorGreen\" title=\"Green\" data-i18n-title=\"fGreen\" style=\"--c:#2f6b45\"><\/button>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-logos\" role=\"group\" aria-label=\"Your logos\" id=\"pc3d-logos\">\r\n      <span class=\"pc3d-gl\" data-i18n=\"logos\">Your logos<\/span>\r\n      <button type=\"button\" class=\"pc3d-lg\" data-lg=\"0\" data-i18n-title=\"logoUp\" title=\"Upload a logo (PNG, JPG, SVG)\"><span data-i18n=\"logo1\">Logo 1<\/span><\/button><button type=\"button\" class=\"pc3d-lg-x\" data-lgx=\"0\" data-i18n-title=\"logoRm\" title=\"Remove logo\" hidden>\u2715<\/button>\r\n      <button type=\"button\" class=\"pc3d-lg\" data-lg=\"1\" data-i18n-title=\"logoUp\" title=\"Upload a logo (PNG, JPG, SVG)\"><span data-i18n=\"logo2\">Logo 2<\/span><\/button><button type=\"button\" class=\"pc3d-lg-x\" data-lgx=\"1\" data-i18n-title=\"logoRm\" title=\"Remove logo\" hidden>\u2715<\/button>\r\n      <input type=\"file\" id=\"pc3d-logo-file\" accept=\"image\/png,image\/jpeg,image\/webp,image\/svg+xml\" hidden>\r\n    <\/div>\r\n    <div class=\"pc3d-grp pc3d-sw pc3d-sq\" data-opt=\"colour\" role=\"group\" aria-label=\"Structure colour\">\r\n      <button type=\"button\" data-val=\"StructureBlack\" title=\"RAL 7016\" style=\"--c:#383e42\"><\/button>\r\n      <button type=\"button\" data-val=\"StructureGreen\" title=\"RAL 6005\" style=\"--c:#114232\"><\/button>\r\n      <button type=\"button\" data-val=\"StructureBlue\" title=\"RAL 5022\" style=\"--c:#252850\"><\/button>\r\n      <button type=\"button\" data-val=\"StructureRed\" title=\"RAL 3005\" style=\"--c:#5e2129\"><\/button>\r\n      <button type=\"button\" data-val=\"StructureFucsia\" title=\"RAL 4007\" style=\"--c:#4a203b\"><\/button>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"pc3d-views\" role=\"group\" aria-label=\"Camera views\">\r\n      <button type=\"button\" data-pc3d-view=\"general\" aria-pressed=\"true\" data-i18n=\"vOverview\">Overview<\/button>\r\n      <button type=\"button\" data-pc3d-view=\"lateral\" aria-pressed=\"false\" data-i18n=\"vSide\">Side<\/button>\r\n      <button type=\"button\" data-pc3d-view=\"fondo\" aria-pressed=\"false\" data-i18n=\"vBack\">From the back<\/button>\r\n      <button type=\"button\" data-pc3d-view=\"planta\" aria-pressed=\"false\" data-i18n=\"vTop\">Top<\/button>\r\n      <button type=\"button\" class=\"pc3d-quote\" id=\"pc3d-quote\"><span data-i18n=\"quote\">Ask for a quote<\/span><\/button>\r\n      <button type=\"button\" class=\"pc3d-shot\" id=\"pc3d-shot\" title=\"Image capture\"><span class=\"pc3d-shot-ico\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\"><path fill=\"#fff\" d=\"M9 4.5 7.6 6H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-2.6L15 4.5H9Zm3 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Zm0 1.8a2.2 2.2 0 1 0 0 4.4 2.2 2.2 0 0 0 0-4.4Z\"\/><\/svg><\/span><span data-i18n=\"shot\">Image capture<\/span><\/button>\r\n      <button type=\"button\" class=\"pc3d-shot\" id=\"pc3d-ai\" title=\"AI image: photo-style version of this view\"><span class=\"pc3d-shot-ico pc3d-ai-ico\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\"><path fill=\"#fff\" d=\"M12 2l1.9 5.6L19.5 9.5l-5.6 1.9L12 17l-1.9-5.6L4.5 9.5l5.6-1.9L12 2Zm6.5 11 .9 2.6 2.6.9-2.6.9-.9 2.6-.9-2.6-2.6-.9 2.6-.9.9-2.6ZM6 15l.7 1.8 1.8.7-1.8.7L6 20l-.7-1.8-1.8-.7 1.8-.7L6 15Z\"\/><\/svg><\/span><span data-i18n=\"ai\">AI image<\/span><\/button>\r\n      <button type=\"button\" class=\"pc3d-shot\" id=\"pc3d-pdf\" title=\"PDF: 2D layout + 3D view\"><span class=\"pc3d-shot-ico pc3d-pdf-ico\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\"><path fill=\"#fff\" d=\"M6 2h8l5 5v13a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm7 1.8V8h4.2L13 3.8ZM7.5 12v6h1.4v-2h.9a2 2 0 0 0 0-4H7.5Zm1.4 1.2h.9a.8.8 0 0 1 0 1.6h-.9v-1.6Zm3.6-1.2v6h1.7a3 3 0 0 0 0-6h-1.7Zm1.4 1.2h.3a1.8 1.8 0 0 1 0 3.6h-.3v-3.6Zm3.1-1.2v6h1.4v-2.4h1.8v-1.2H18v-1.2h2v-1.2h-3Z\"\/><\/svg><\/span><span data-i18n=\"pdf\">PDF<\/span><\/button>\r\n      <button type=\"button\" class=\"pc3d-close\" id=\"pc3d-close\"><span aria-hidden=\"true\">\u2715<\/span> <span data-i18n=\"close\">Close<\/span><\/button>\r\n    <\/div>\r\n  <div class=\"pc3d-stage\" id=\"pc3d-stage\">\r\n    <canvas aria-label=\"3D view of the layout\"><\/canvas>\r\n    <p class=\"pc3d-msg\" id=\"pc3d-msg\" data-i18n=\"loading\">Loading 3D view\u2026<\/p>\r\n  <\/div>\r\n<\/div>\r\n<!-- \u2550\u2550 Solicitud de oferta desde la vista 3D (mismo formulario Zoho que el configurador) \u2550\u2550 -->\r\n<div id=\"pcq\" class=\"pcq\" hidden role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"pcq-title\">\r\n  <div class=\"pcq-box\">\r\n    <div class=\"pcq-head\">\r\n      <h2 id=\"pcq-title\" data-en=\"Send Your Requirements for a Quote\" data-de=\"Anforderungen f\u00fcr ein Angebot senden\">Send Your Requirements for a Quote<\/h2>\r\n      <button type=\"button\" class=\"pcq-x\" id=\"pcq-x\" aria-label=\"Close\">\u00d7<\/button>\r\n    <\/div>\r\n    <div class=\"pcq-body\">\r\n      <div class=\"pcq-summary\">\r\n        <div class=\"pcq-sum-ttl\" data-en=\"Your layout\" data-de=\"Ihre Anlage\">Your layout<\/div>\r\n        <div class=\"pcq-chips\" id=\"pcq-chips\"><\/div>\r\n        <div class=\"pcq-opts\">\r\n          <label><span data-en=\"Turf quality\" data-de=\"Rasenqualit\u00e4t\">Turf quality<\/span>\r\n            <select id=\"pcq-quality\" class=\"fsel\">\r\n              <option value=\"fibrillated\" data-en=\"Fibrillated\" data-de=\"Fibrilliert\">Fibrillated<\/option>\r\n              <option value=\"monofilament\">Monofilament<\/option>\r\n              <option value=\"textured\" data-en=\"Textured (new)\" data-de=\"Texturiert (neu)\">Textured (new)<\/option>\r\n            <\/select><\/label>\r\n          <label id=\"pcq-lux-wrap\"><span data-en=\"LED floodlights\" data-de=\"LED-Flutlicht\">LED floodlights<\/span>\r\n            <select id=\"pcq-lux\" class=\"fsel\">\r\n              <option value=\"LED_II_300\" data-en=\"Class II \u00b7 300 lux (best seller for clubs)\" data-de=\"Klasse II \u00b7 300 Lux (Bestseller f\u00fcr Clubs)\">Class II \u00b7 300 lux (best seller for clubs)<\/option>\r\n              <option value=\"LED_I_500\" data-en=\"Class I \u00b7 500 lux (TV standard)\" data-de=\"Klasse I \u00b7 500 Lux (TV-Standard)\">Class I \u00b7 500 lux (TV standard)<\/option>\r\n            <\/select><\/label>\r\n        <\/div>\r\n        <p class=\"pcq-att\" data-en=\"\ud83d\udcce The 3D image and your floor plan file are attached automatically.\" data-de=\"\ud83d\udcce Das 3D-Bild und Ihre Grundrissdatei werden automatisch angeh\u00e4ngt.\">\ud83d\udcce The 3D image and your floor plan file are attached automatically.<\/p>\r\n      <\/div>\r\n\r\n      <form id=\"pcq-form\" action=\"https:\/\/crm.zoho.com\/crm\/WebForm\" name=\"WebForm1444747000099583074\" target=\"pcq-target\" method=\"POST\" enctype=\"multipart\/form-data\" accept-charset=\"UTF-8\" novalidate>\r\n        <div class=\"pcq-hidden\">\r\n          <input type=\"text\" name=\"xnQsjsdp\" value=\"2a25e30de279f80c59abeacf811e0321c6854c59bd62f1f82ef2961bf80bb73a\">\r\n          <input type=\"hidden\" name=\"zc_gad\" value=\"\">\r\n          <input type=\"text\" name=\"xmIwtLD\" value=\"7f98ee107f757d6dc307d6d95682e9fa843dcaa59c120549984c3b5ce23a2632a77dcdd51bf09c78caae5b59b8c757ce\">\r\n          <input type=\"text\" name=\"actionType\" value=\"Q3VzdG9tTW9kdWxlMQ==\">\r\n          <input type=\"text\" name=\"returnURL\" id=\"pcq-return\" value=\"https:\/\/www.padelcreations.com\/thanks-for-your-requirements\/\">\r\n          <input type=\"text\" name=\"COBJ1CF5\" id=\"pcq-courts\">\r\n          <input type=\"text\" name=\"COBJ1CF21\" id=\"pcq-app\">\r\n          <input type=\"text\" name=\"COBJ1CF28\" id=\"pcq-colour\">\r\n          <input type=\"text\" name=\"COBJ1CF23\" id=\"pcq-entrance\">\r\n          <input type=\"text\" name=\"COBJ1CF22\" id=\"pcq-turf\">\r\n          <input type=\"text\" name=\"COBJ1CF25\" id=\"pcq-tq\">\r\n          <input type=\"text\" name=\"COBJ1CF24\" id=\"pcq-lighting\">\r\n          <input type=\"text\" name=\"COBJ1CF27\" id=\"pcq-masts\">\r\n          <input type=\"text\" name=\"COBJ1CF9\" id=\"pcq-curved\">\r\n          <input type=\"text\" name=\"COBJ1CF26\" id=\"pcq-net\">\r\n          <select name=\"COBJ1CF20\" id=\"pcq-lang\"><option selected value=\"English\">English<\/option><option value=\"German\">German<\/option><\/select>\r\n          <select name=\"COBJ1CF13\"><option selected value=\"Desktop\">Desktop<\/option><\/select>\r\n        <\/div>\r\n        <div class=\"pcq-cols\">\r\n          <div>\r\n            <div class=\"pcq-col-ttl\" data-en=\"\ud83d\udccb Your Contact Details\" data-de=\"\ud83d\udccb Ihre Kontaktdaten\">\ud83d\udccb Your Contact Details<\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f1\"><span data-en=\"Company Name\" data-de=\"Firmenname\">Company Name<\/span><span class=\"req\">*<\/span><\/label><input class=\"fi\" id=\"pcq-f1\" type=\"text\" name=\"NAME\" maxlength=\"120\" autocomplete=\"organization\" data-en-ph=\"Your company\" data-de-ph=\"Ihr Unternehmen\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f2\"><span data-en=\"Your Name\" data-de=\"Ihr Name\">Your Name<\/span><span class=\"req\">*<\/span><\/label><input class=\"fi\" id=\"pcq-f2\" type=\"text\" name=\"COBJ1CF12\" maxlength=\"255\" autocomplete=\"name\" data-en-ph=\"Full name\" data-de-ph=\"Vollst\u00e4ndiger Name\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f3\"><span data-en=\"Phone\" data-de=\"Telefon\">Phone<\/span><span class=\"req\">*<\/span><\/label><input class=\"fi\" id=\"pcq-f3\" type=\"tel\" name=\"COBJ1CF2\" maxlength=\"30\" autocomplete=\"tel\" data-en-ph=\"+1 702 123 4567\" data-de-ph=\"+49 30 123456\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f4\"><span data-en=\"Email\" data-de=\"E-Mail\">Email<\/span><span class=\"req\">*<\/span><\/label><input class=\"fi\" id=\"pcq-f4\" type=\"email\" name=\"Email\" maxlength=\"100\" autocomplete=\"email\" data-en-ph=\"you@company.com\" data-de-ph=\"sie@unternehmen.de\"><\/div>\r\n          <\/div>\r\n          <div>\r\n            <div class=\"pcq-col-ttl\" data-en=\"\ud83d\udccd Place of Installation\" data-de=\"\ud83d\udccd Installationsort\">\ud83d\udccd Place of Installation<\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f5\"><span data-en=\"Address\" data-de=\"Adresse\">Address<\/span><\/label><input class=\"fi\" id=\"pcq-f5\" type=\"text\" name=\"COBJ1CF4\" maxlength=\"255\" autocomplete=\"street-address\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f6\"><span data-en=\"City\" data-de=\"Stadt\">City<\/span><span class=\"req\">*<\/span><\/label><input class=\"fi\" id=\"pcq-f6\" type=\"text\" name=\"COBJ1CF3\" maxlength=\"255\" autocomplete=\"address-level2\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f7\"><span data-en=\"Region \/ State\" data-de=\"Region \/ Bundesland\">Region \/ State<\/span><\/label><input class=\"fi\" id=\"pcq-f7\" type=\"text\" name=\"COBJ1CF19\" maxlength=\"255\" autocomplete=\"address-level1\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f8\"><span data-en=\"ZIP \/ Postal Code\" data-de=\"PLZ \/ Postleitzahl\">ZIP \/ Postal Code<\/span><\/label><input class=\"fi\" id=\"pcq-f8\" type=\"text\" name=\"COBJ1CF10\" maxlength=\"255\" autocomplete=\"postal-code\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f9\"><span data-en=\"Country\" data-de=\"Land\">Country<\/span><span class=\"req\">*<\/span><\/label><input class=\"fi\" id=\"pcq-f9\" type=\"text\" name=\"COBJ1CF6\" maxlength=\"255\" autocomplete=\"country-name\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f10\"><span data-en=\"Terrain Category\" data-de=\"Gel\u00e4ndekategorie\">Terrain Category<\/span><\/label>\r\n              <select class=\"fsel\" id=\"pcq-f10\" name=\"COBJ1CF8\">\r\n                <option value=\"-None-\" data-en=\"Please select\u2026\" data-de=\"Bitte w\u00e4hlen\u2026\">Please select\u2026<\/option>\r\n                <option value=\"INDOOR\" data-en=\"Indoor \u2014 Not relevant\" data-de=\"INDOOR (Innenbereich) - Nicht relevant\">Indoor \u2014 Not relevant<\/option>\r\n                <option value=\"Terrain category: 0 - Open sea\" data-en=\"Cat. 0 \u2014 Open sea\" data-de=\"Gel\u00e4ndekategorie: 0 - Offene See\">Cat. 0 \u2014 Open sea<\/option>\r\n                <option value=\"Terrain category: 1 - Flat area with no obstacles\" data-en=\"Cat. 1 \u2014 Flat, no obstacles\" data-de=\"Gel\u00e4ndekategorie: I - Seen mit mind. 5 km freier Fl\u00e4che in Windrichtung, glattes, flaches Land ohne Hindernisse\">Cat. 1 \u2014 Flat, no obstacles<\/option>\r\n                <option value=\"Terrain category: 2 - Area with low vegetation such as grass and isolated obstacles\" data-en=\"Cat. 2 \u2014 Low vegetation\" data-de=\"Gel\u00e4ndekategorie: II - Gel\u00e4nde mit Hecken, einzelnen Geh\u00f6ften, H\u00e4usern oder B\u00e4umen\">Cat. 2 \u2014 Low vegetation<\/option>\r\n                <option value=\"Terrain category: 3 - Area with regular cover of vegetation or buildings\" data-en=\"Cat. 3 \u2014 Regular vegetation\/buildings\" data-de=\"Gel\u00e4ndekategorie: III - Vorst\u00e4dte, Industrie- oder Gewerbegebiete und W\u00e4lder.\">Cat. 3 \u2014 Regular vegetation\/buildings<\/option>\r\n                <option value=\"Terrain category: 4 - Area in which at least 15 % of the surface is covered with buildings\" data-en=\"Cat. 4 \u2014 Dense urban\" data-de=\"Gel\u00e4ndekategorie: IV - Stadtgebiete, mindestens 15 % der Fl\u00e4che mit Geb\u00e4uden ist bebaut.\">Cat. 4 \u2014 Dense urban<\/option>\r\n              <\/select><\/div>\r\n          <\/div>\r\n          <div>\r\n            <div class=\"pcq-col-ttl\" data-en=\"\ud83d\uddd3\ufe0f Timeline, Budget & Notes\" data-de=\"\ud83d\uddd3\ufe0f Zeitplan, Budget & Notizen\">\ud83d\uddd3\ufe0f Timeline, Budget &amp; Notes<\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f11\"><span data-en=\"Project Phase\" data-de=\"Projektphase\">Project Phase<\/span><span class=\"req\">*<\/span><\/label>\r\n              <select class=\"fsel\" id=\"pcq-f11\" name=\"COBJ1CF14\">\r\n                <option value=\"-None-\" data-en=\"Please select\u2026\" data-de=\"Bitte w\u00e4hlen\u2026\">Please select\u2026<\/option>\r\n                <option value=\"Estimates\" data-en=\"\ud83d\udd0d Estimates\" data-de=\"Erste Informationsbeschaffung\">\ud83d\udd0d Estimates<\/option>\r\n                <option value=\"Planning\" data-en=\"\ud83d\udcd0 Planning\" data-de=\"Start Projektplanung\">\ud83d\udcd0 Planning<\/option>\r\n                <option value=\"Funded\" data-en=\"\ud83d\udcb0 Funded\" data-de=\"Pr\u00fcfung der Finanzierung\">\ud83d\udcb0 Funded<\/option>\r\n                <option value=\"Ready for Construction\" data-en=\"\ud83d\udd28 Ready for Construction\" data-de=\"Auswahl der Anbieter\">\ud83d\udd28 Ready for Construction<\/option>\r\n              <\/select><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f12\"><span data-en=\"Timeline\" data-de=\"Zeitplan\">Timeline<\/span><span class=\"req\">*<\/span><\/label><textarea class=\"fta\" id=\"pcq-f12\" name=\"COBJ1CF11\" maxlength=\"2000\" data-en-ph=\"e.g. Q3 2026, within 6 months\u2026\" data-de-ph=\"z.B. Q3 2026, innerhalb von 6 Monaten\u2026\"><\/textarea><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f13\"><span data-en=\"Budget per Court\" data-de=\"Budget pro Platz\">Budget per Court<\/span><\/label><textarea class=\"fta\" id=\"pcq-f13\" name=\"COBJ1CF1\" maxlength=\"2000\" data-en-ph=\"e.g. \u20ac xxx, if available\" data-de-ph=\"z.B. \u20ac xxx, falls bekannt\"><\/textarea><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-f14\"><span data-en=\"Notes & Special Requirements\" data-de=\"Notizen & Sonderanforderungen\">Notes &amp; Special Requirements<\/span><\/label><textarea class=\"fta\" id=\"pcq-f14\" maxlength=\"1500\" data-en-ph=\"Specific colours, site conditions, questions\u2026\" data-de-ph=\"Spezifische Farben, Standortbedingungen, Fragen\u2026\"><\/textarea>\r\n              <input type=\"hidden\" name=\"COBJ1CF17\" id=\"pcq-notes\"><\/div>\r\n            <div class=\"pcq-f\"><label for=\"pcq-file\"><span data-en=\"Add your own files (optional, max. 1)\" data-de=\"Eigene Dateien hinzuf\u00fcgen (optional, max. 1)\">Add your own files (optional, max. 1)<\/span><\/label>\r\n              <input type=\"file\" id=\"pcq-user-file\" class=\"fi\"><input type=\"file\" name=\"theFile\" id=\"pcq-file\" multiple hidden><\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"pcq-foot\">\r\n          <div><div id=\"pcq-recap\"><\/div><div class=\"pcq-err\" id=\"pcq-recap-err\" hidden data-en=\"\u26a0 Please complete the reCAPTCHA verification.\" data-de=\"\u26a0 Bitte reCAPTCHA-Verifizierung abschlie\u00dfen.\">\u26a0 Please complete the reCAPTCHA verification.<\/div><\/div>\r\n          <button type=\"submit\" class=\"pcq-send\" id=\"pcq-send\"><span data-en=\"Send My Requirements for Quote\" data-de=\"Anforderungen f\u00fcr Angebot senden\">Send My Requirements for Quote<\/span><\/button>\r\n        <\/div>\r\n      <\/form>\r\n      <!-- Confirmaci\u00f3n: se muestra aqu\u00ed en vez de salir de la herramienta -->\r\n      <div class=\"pcq-done\" id=\"pcq-done\" hidden tabindex=\"-1\">\r\n        <div class=\"pcq-done-ico\" aria-hidden=\"true\">\u2713<\/div>\r\n        <h3 data-en=\"Quote request sent\" data-de=\"Anfrage gesendet\">Quote request sent<\/h3>\r\n        <p data-en=\"Thank you! We have received your requirements together with your 3D image and your floor plan. Our team will get back to you shortly.\" data-de=\"Vielen Dank! Wir haben Ihre Anforderungen zusammen mit Ihrem 3D-Bild und Ihrem Grundriss erhalten. Unser Team meldet sich in K\u00fcrze bei Ihnen.\">Thank you! We have received your requirements together with your 3D image and your floor plan. Our team will get back to you shortly.<\/p>\r\n        <p class=\"pcq-next\" data-en=\"Next step: continue exploring your layout in 3D. You can close the 3D view whenever you are ready.\" data-de=\"N\u00e4chster Schritt: Erkunden Sie Ihr Layout weiter in 3D. Die 3D-Ansicht k\u00f6nnen Sie jederzeit selbst schlie\u00dfen.\">Next step: continue exploring your layout in 3D. You can close the 3D view whenever you are ready.<\/p>\r\n        <button type=\"button\" class=\"pcq-send\" id=\"pcq-continue\" data-en=\"Continue\" data-de=\"Weiter\">Continue<\/button>\r\n      <\/div>\r\n      <p class=\"pcq-err\" id=\"pcq-send-err\" hidden data-en=\"The request could not be confirmed. Please check your connection and try again.\" data-de=\"Die Anfrage konnte nicht best\u00e4tigt werden. Bitte Verbindung pr\u00fcfen und erneut versuchen.\">The request could not be confirmed. Please check your connection and try again.<\/p>\r\n      <iframe name=\"pcq-target\" id=\"pcq-target\" title=\"Zoho\" tabindex=\"-1\" aria-hidden=\"true\" style=\"display:none\"><\/iframe>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>window.PC3D_PLANNER_SRC='https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/js\/padel-3d-planner.js?v=12.7';<\/script>\r\n<script data-no-optimize=\"1\" data-cfasync=\"false\">\r\n\/* \u2500\u2500 Vista 3D del plano: abre el visor con la distribuci\u00f3n actual del planificador \u2500\u2500 *\/\r\n(function(){\r\n  var SRC=window.PC3D_PLANNER_SRC||'https:\/\/www.padelcreations.com\/wp-content\/uploads\/2D-Floorplanner-2026\/js\/padel-3d-planner.js?v=12.7';\r\n  var T={\r\n    en:{paving:'Paving 20\u00d710 cm',pvBond:'Running bond',pvHb45:'Herringbone 45\u00b0',pvHb90:'Herringbone 90\u00b0',tennis:'Tennis',tClay:'Clay',tHard:'Hard court',tGrass:'Grass',logos:'Your logos',logo1:'Logo 1',logo2:'Logo 2',logoUp:'Upload a logo (PNG, JPG, SVG)',logoRm:'Remove logo',logoBad:'This image could not be read. Please use PNG, JPG or SVG.',logoBig:'The logo file is too large (max. 10 MB).',ai:'AI image',pdf:'PDF',floor:'Floor',fLightGrey:'Light grey',fDarkGrey:'Dark grey',fBlack:'Black',fRed:'Red',fGreen:'Green',curved:'Curved',units:'Units',unitsT:'Identical halls side by side (curved roof, 1 court)',radius:'Radius',hintRadius:'Radius reduced to fit eave and ridge',bSp:'Beam spacing',bTop:'Beam depth ridge',bWall:'Beam depth wall',clash1:'1 element above the roof',clashN:' elements above the roof',roof:'Roof',eave:'Eave',ridge:'Ridge',hintLow:'Usual clear height for padel: min. 8 m',hintRidge:'Ridge raised to eave height',tExt:'Turf extension 8\u00d72 m',tProt:'Door protections',quote:'Ask for a quote',shot:'Image capture',dNone:'No doors',dOne:'Doors 1 side',dTwo:'Doors 2 sides',lNone:'No lights',lStraight:'Straight',lAngled:'Angled',lCurved:'Curved',title:'3D View',indoor:'Indoor',indoorPano:'Indoor Panoramic',outdoor:'Outdoor',close:'Close',vOverview:'Overview',vSide:'Side',vBack:'From the back',vTop:'Top',loading:'Loading 3D view\u2026',fail:'The 3D view could not be loaded. Please try again.',empty:'Add at least one court to see it in 3D.'},\r\n    de:{paving:'Pflaster 20\u00d710 cm',pvBond:'L\u00e4uferverband',pvHb45:'Fischgr\u00e4t 45\u00b0',pvHb90:'Fischgr\u00e4t 90\u00b0',tennis:'Tennis',tClay:'Sand (Ziegelmehl)',tHard:'Hartplatz',tGrass:'Rasen',logos:'Ihre Logos',logo1:'Logo 1',logo2:'Logo 2',logoUp:'Logo hochladen (PNG, JPG, SVG)',logoRm:'Logo entfernen',logoBad:'Dieses Bild konnte nicht gelesen werden. Bitte PNG, JPG oder SVG verwenden.',logoBig:'Die Logo-Datei ist zu gross (max. 10 MB).',ai:'KI-Bild',pdf:'PDF',floor:'Boden',fLightGrey:'Hellgrau',fDarkGrey:'Dunkelgrau',fBlack:'Schwarz',fRed:'Rot',fGreen:'Gr\u00fcn',curved:'Gew\u00f6lbt',units:'Einheiten',unitsT:'Gleiche Hallen nebeneinander (gew\u00f6lbtes Dach, 1 Platz)',radius:'Radius',hintRadius:'Radius an Traufe und First angepasst',bSp:'Binderabstand',bTop:'Binderh\u00f6he First',bWall:'Binderh\u00f6he Wand',clash1:'1 Element \u00fcber dem Dach',clashN:' Elemente \u00fcber dem Dach',roof:'Dach',eave:'Traufe',ridge:'First',hintLow:'\u00dcbliche lichte H\u00f6he f\u00fcr Padel: mind. 8 m',hintRidge:'First auf Traufh\u00f6he angehoben',tExt:'Rasen-Auslaufzone 8\u00d72 m',tProt:'Kantenschutz',quote:'Angebot anfordern',shot:'Bild speichern',dNone:'Ohne T\u00fcren',dOne:'T\u00fcren 1 Seite',dTwo:'T\u00fcren 2 Seiten',lNone:'Ohne Licht',lStraight:'Gerade',lAngled:'Abgewinkelt',lCurved:'Gebogen',title:'3D-Ansicht',indoor:'Innenbereich',indoorPano:'Indoor-Panoramic',outdoor:'Aussenbereich',close:'Schliessen',vOverview:'\u00dcbersicht',vSide:'Seite',vBack:'Von hinten',vTop:'Draufsicht',loading:'3D-Ansicht wird geladen\u2026',fail:'Die 3D-Ansicht konnte nicht geladen werden. Bitte erneut versuchen.',empty:'F\u00fcgen Sie mindestens einen Platz hinzu, um ihn in 3D zu sehen.'}\r\n  };\r\n  var L=((document.documentElement.lang||'en').substring(0,2).toLowerCase()==='de')?T.de:T.en;\r\n  var custLogos=[null,null];   \/\/ logos del cliente (data URL PNG, m\u00e1x. 1024 px); van en el archivo .padel (\u00ablogos\u00bb), no en opts (textos de Zoho, PDF)\r\n  var ov,stage,msg,lastFocus,opts={application:'INDOOR',doors:'none',lighting:'straight',lux:'500',floor:'FloorLightGrey',grass:'GrassBlue',colour:'StructureBlack',turfExt:false,protect:false,roof:false,eave:8,ridge:12,beamSp:6,beamTop:1.0,beamWall:0.4,roofCurved:false,units:1,tennisSurface:'clay',paving:'bond'};\r\n  function $(id){return document.getElementById(id);}\r\n  function tr(){ov.querySelectorAll('[data-i18n]').forEach(function(el){var k=el.getAttribute('data-i18n');if(L[k])el.textContent=L[k];});\r\n    ov.querySelectorAll('[data-i18n-title]').forEach(function(el){var k=el.getAttribute('data-i18n-title');if(L[k])el.title=L[k];});}\r\n  \/\/ Cubierta: alturas en la unidad del plano (m o ft); internamente siempre en metros\r\n  var FT=3.28084;\r\n  function imperial(){try{var d=planData();return d&&d.measureSystem==='IMPERIAL';}catch(e){return false;}}\r\n  \/\/ Media luz de la nave (m): la mitad del lado corto del \u00e1rea\r\n  function halfSpan(){try{var d=planData();var k=d.measureSystem==='IMPERIAL'?1\/FT:1;return Math.min(+d.areaWidth*k,+d.areaLen*k)\/2;}catch(e){return 0;}}\r\n  function roofUI(){\r\n    var g=$('pc3d-roof');if(!g)return;\r\n    var indoor=opts.application!=='OUTDOOR';g.hidden=!indoor;\r\n    var f=imperial()?FT:1,u=imperial()?'ft':'m';\r\n    g.querySelectorAll('.pc3d-u').forEach(function(s){s.textContent=u;});\r\n    var e=$('pc3d-eave'),r=$('pc3d-ridge');\r\n    if(document.activeElement!==e)e.value=(Math.round(opts.eave*f*10)\/10);\r\n    if(document.activeElement!==r)r.value=(Math.round(opts.ridge*f*10)\/10);\r\n    [['pc3d-bsp','beamSp',10],['pc3d-btop','beamTop',100],['pc3d-bwall','beamWall',100]].forEach(function(x){var el=$(x[0]);if(el&&document.activeElement!==el)el.value=Math.round(opts[x[1]]*f*x[2])\/x[2];});\r\n    var locked=window.pcToolsUnlocked&&!window.pcToolsUnlocked();\r\n    e.disabled=!opts.roof||!!locked;\r\n    \/\/ Cubierta curva: la cumbrera la da el radio (se muestra calculada y no se edita)\r\n    r.disabled=!opts.roof||!!locked;   \/\/ la cumbrera se edita tambi\u00e9n con la cubierta curva\r\n\r\n    ['pc3d-bsp','pc3d-btop','pc3d-bwall'].forEach(function(id){var el=$(id);if(el)el.disabled=!opts.roof||!!locked;});\r\n    var cb=ov.querySelector('[data-tg=roofCurved]');if(cb)cb.disabled=!opts.roof;\r\n    \/\/ Multiplicador de naves: solo con cubierta curva, interior y una sola pista en el plano\r\n    var uw=$('pc3d-units-w'),us=$('pc3d-units');\r\n    if(uw&&us){var ok=unitsOK(opts);uw.hidden=!ok;us.value=String(opts.units||1);us.disabled=!!locked;}\r\n    \/\/ Aviso de choque: cu\u00e1ntas columnas de luz o redes atraviesan la cubierta (marcadas en rojo en 3D)\r\n    var cl=$('pc3d-clash');\r\n    if(cl&&window.PC3DPlanner&&window.PC3DPlanner.info)window.PC3DPlanner.info().then(function(i){\r\n      var n=i&&indoor&&opts.roof?i.clashes:0;cl.hidden=!n;cl.textContent=n?('\u26a0 '+(n===1?L.clash1:n+L.clashN)):'';\r\n    });\r\n  }\r\n  function oneCourt(){try{var d=planData();return (d.items||[]).filter(function(i){return i.court==='courtDouble'||i.court==='courtSingle';}).length===1;}catch(e){return false;}}\r\n  function unitsOK(o){return o.application!=='OUTDOOR'&&!!o.roof&&!!o.roofCurved&&oneCourt();}\r\n  window.paUnits=function(o){o=o||opts;return unitsOK(o)?Math.max(1,Math.min(6,+o.units||1)):1;};\r\n  function roofInput(){\r\n    var f=imperial()?FT:1,e=$('pc3d-eave'),r=$('pc3d-ridge'),hint=$('pc3d-roof-hint');\r\n    var ev=parseFloat(String(e.value).replace(',','.'))\/f,rv=parseFloat(String(r.value).replace(',','.'))\/f;\r\n    if(!(ev>0))ev=opts.eave;if(!(rv>0))rv=opts.ridge;\r\n    ev=Math.max(3,Math.min(40,ev));var msg='';\r\n    if(rv<ev){rv=ev;msg=L.hintRidge;}   \/\/ sin aviso de altura m\u00ednima: el contador de choques en rojo gu\u00eda al usuario\r\n    opts.eave=Math.round(ev*100)\/100;opts.ridge=Math.round(rv*100)\/100;\r\n    var num=function(id,def,min,max){var v=parseFloat(String($(id).value).replace(',','.'))\/f;if(!(v>0))v=def;return Math.round(Math.max(min,Math.min(max,v))*100)\/100;};\r\n    opts.beamSp=num('pc3d-bsp',opts.beamSp,2,30);opts.beamTop=num('pc3d-btop',opts.beamTop,0.1,4);opts.beamWall=num('pc3d-bwall',opts.beamWall,0.1,4);\r\n    hint.textContent=msg;hint.hidden=!msg;\r\n    if(window.PC3DPlanner)window.PC3DPlanner.set(opts);\r\n  }\r\n  \/\/ Nivel de iluminaci\u00f3n por defecto: 500 lux en interior, 300 lux en exterior\r\n  function luxDefault(){return opts.application==='OUTDOOR'?'300':'500';}\r\n  function mark(){\r\n    if(opts.lux!=='300'&&opts.lux!=='500')opts.lux=luxDefault();\r\n    var lg=document.getElementById('pc3d-lux');if(lg)lg.style.display=opts.lighting==='none'?'none':'';\r\n    var fg=document.getElementById('pc3d-floor');if(fg)fg.style.display=opts.application==='OUTDOOR'?'none':'';\r\n    var pv=document.getElementById('pc3d-paving');if(pv)pv.style.display=opts.application==='OUTDOOR'?'':'none';   \/\/ enlosado: solo exterior\r\n    var lgg=document.getElementById('pc3d-logos');if(lgg)lgg.style.display=opts.application==='OUTDOOR'?'none':'';\r\n    ov.querySelectorAll('.pc3d-grp[data-opt]').forEach(function(g){var k=g.getAttribute('data-opt');g.querySelectorAll('button').forEach(function(b){b.setAttribute('aria-pressed',String(b.getAttribute('data-val')===opts[k]));});});\r\n    \/\/ Protecciones solo con accesos sin puertas (igual que en el configurador)\r\n    if(opts.doors!=='none')opts.protect=false;\r\n    ov.querySelectorAll('[data-tg]').forEach(function(b){var k=b.getAttribute('data-tg');b.setAttribute('aria-pressed',String(!!opts[k]));if(k==='protect')b.disabled=opts.doors!=='none';});\r\n    roofUI();\r\n  }\r\n  function loadScript(){\r\n    if(window.PC3DPlanner)return Promise.resolve();\r\n    return new Promise(function(res,rej){var s=document.createElement('script');s.src=SRC;s.setAttribute('data-no-optimize','1');s.setAttribute('data-cfasync','false');s.onload=res;s.onerror=rej;document.head.appendChild(s);});\r\n  }\r\n  \/\/ Datos del plano: por defecto, el planificador en pantalla; la p\u00e1gina puede aportar su propia funci\u00f3n\r\n  function planData(){\r\n    if(typeof window.PC3D_PLAN_DATA==='function')return window.PC3D_PLAN_DATA();\r\n    var fv=padelForm.getFormValues();\r\n    return {measureSystem:fv.measureSystem,areaWidth:fv.areaWidth,areaLen:fv.areaLen,\r\n      items:padelArea.padelCourts.courts.map(function(pc){\r\n        if(pc.court==='courtDouble'||pc.court==='courtSingle'||pc.court==='courtTennis')return {court:pc.court,x:pc.x,y:pc.y,w:pc.w,h:pc.h,angle:pc.angle,description:pc.description||''};\r\n        if(pc.isDoor)return {court:pc.court,wall:pc.wall,pos:pc.pos,width:pc.width,description:pc.description||''};\r\n        return {court:pc.court,ax:pc.ax,ay:pc.ay,bx:pc.bx,by:pc.by,cx:pc.cx,cy:pc.cy,dx:pc.dx,dy:pc.dy,description:pc.description||''};\r\n      })};\r\n  }\r\n  function open(){\r\n    var data;try{data=planData();}catch(e){data=null;}\r\n    lastFocus=document.activeElement;\r\n    ov.hidden=false;document.documentElement.style.overflow='hidden';\r\n    ov.querySelectorAll('[data-pc3d-view]').forEach(function(x){x.setAttribute('aria-pressed',String(x.getAttribute('data-pc3d-view')==='general'));});\r\n    msg.hidden=false;msg.textContent=L.loading;\r\n    $('pc3d-close').focus();\r\n    var tg=document.getElementById('pc3d-tennis');if(tg)tg.hidden=!(data&&data.items&&data.items.some(function(i){return i.court==='courtTennis';}));\r\n    if(!data||!data.items||!data.items.some(function(i){return i.court==='courtDouble'||i.court==='courtSingle';})){msg.textContent=L.empty;}\r\n    loadScript().then(function(){return window.PC3DPlanner.open(stage,data||{items:[]},Object.assign({},opts,{logos:custLogos}));})\r\n      .then(function(){if(data&&data.items&&data.items.some(function(i){return i.court==='courtDouble'||i.court==='courtSingle';}))msg.hidden=true;})\r\n      .catch(function(e){msg.hidden=false;msg.textContent=L.fail;if(window.console)console.error('[PadelCreations 3D]',e);});\r\n  }\r\n  \/\/ Captura: Padelcreations_3D-Capture_AAAA-MM-DD_HH-MM-SS.jpg\r\n  function stamp(){var d=new Date(),p=function(n){return String(n).padStart(2,'0');};\r\n    return d.getFullYear()+'-'+p(d.getMonth()+1)+'-'+p(d.getDate())+'_'+p(d.getHours())+'-'+p(d.getMinutes())+'-'+p(d.getSeconds());}\r\n  function capture(){\r\n    if(!window.PC3DPlanner)return;var b=$('pc3d-shot');b.disabled=true;\r\n    window.PC3DPlanner.capture().then(function(url){\r\n      var pj='';try{pj=sessionStorage.getItem('pc_tools_project')||'';}catch(e){}\r\n      var a=document.createElement('a');a.href=url;a.download='Padelcreations_'+(pj?pj+'_':'')+'3D-Capture_'+stamp()+'.jpg';\r\n      document.body.appendChild(a);a.click();document.body.removeChild(a);\r\n    }).catch(function(e){if(window.console)console.error('[PadelCreations 3D]',e);})\r\n      .then(function(){b.disabled=false;});\r\n  }\r\n\r\n  \/* \u2500\u2500 Imagen IA: la vista 3D actual convertida en imagen de aspecto fotogr\u00e1fico (Gemini, en el servidor) \u2500\u2500\r\n     Usa el mismo endpoint, c\u00f3digos y l\u00edmite (3 por 24 h, compartido con el 3D Space Designer) que el Designer. *\/\r\n  var AI_URL=location.origin+'\/wp-json\/padelcreations\/v1\/render-3d';\r\n  var AT=(document.documentElement.lang||'').toLowerCase().indexOf('de')===0?{\r\n      title:'KI-Bild',frame:'Bildausschnitt f\u00fcr das KI-Bild (16:9). F\u00fcr einen anderen Ausschnitt schliessen Sie dieses Fenster und drehen oder zoomen Sie die 3D-Ansicht.',intro:'Verwandelt die aktuelle 3D-Ansicht mit KI in ein fotorealistisches Bild. Das dauert etwa 30\u201360 Sekunden.',\r\n      note:'KI-Visualisierung zur Illustration: kleine Details k\u00f6nnen vom Plan abweichen. F\u00fcr eine exakte Darstellung bieten wir projektbezogene Renderings an.',\r\n      limit:'3 KI-Bilder pro 24 Stunden (gemeinsam mit dem 3D Space Designer).',code:'Zugangscode',go:'KI-Bild erstellen',close:'Schliessen',\r\n      wait:'Ihr Bild wird erstellt \u2026 das kann bis zu einer Minute dauern.',dl:'Herunterladen',again:'Neues Bild',\r\n      left:function(n){return n===1?'Noch 1 KI-Bild in den n\u00e4chsten 24 Stunden.':'Noch '+n+' KI-Bilder in den n\u00e4chsten 24 Stunden.';},\r\n      needCode:'Bitte geben Sie Ihren Zugangscode ein.',fail:'Das Bild konnte nicht erstellt werden. Bitte versuchen Sie es erneut.',\r\n      bad:'Ung\u00fcltiger Zugangscode.',exp:'Code abgelaufen. Bitte kontaktieren Sie uns f\u00fcr eine Verl\u00e4ngerung.',lim:'Sie haben das Limit von 3 KI-Bildern in 24 Stunden erreicht.'}:{\r\n      title:'AI image',frame:'Image frame for the AI image (16:9). For a different frame, close this window and rotate or zoom the 3D view.',intro:'Turns the current 3D view into a photo-style image with AI. It takes about 30\u201360 seconds.',\r\n      note:'AI visualisation for illustration: small details can differ from your plan. For an exact image, we offer project renders.',\r\n      limit:'3 AI images per 24 hours (shared with the 3D Space Designer).',code:'Access code',go:'Create AI image',close:'Close',\r\n      wait:'Creating your image\u2026 this can take up to a minute.',dl:'Download',again:'New image',\r\n      left:function(n){return n===1?'1 AI image left in the next 24 hours.':n+' AI images left in the next 24 hours.';},\r\n      needCode:'Please enter your access code.',fail:'The image could not be created. Please try again.',\r\n      bad:'Invalid access code.',exp:'Code expired. Please contact us to extend it.',lim:'You have reached the limit of 3 AI images within 24 hours.'};\r\n  var aiDlg=null,aiBusy=false,aiResult=null,aiAsk=false,aiCap=null;\r\n  function aiCode(){try{return sessionStorage.getItem('pc_tools_code')||sessionStorage.getItem('pc_ai_code')||'';}catch(e){return '';}}\r\n  function aiEl(){\r\n    if(aiDlg)return aiDlg;\r\n    aiDlg=document.createElement('div');aiDlg.id='pc3d-aidlg';aiDlg.hidden=true;aiDlg.setAttribute('role','dialog');aiDlg.setAttribute('aria-modal','true');\r\n    aiDlg.innerHTML='<div class=\"aid-card\"><h3><span aria-hidden=\"true\">\u2728<\/span> <span class=\"aid-t\"><\/span><\/h3>'+\r\n      '<div class=\"aid-form\"><p class=\"aid-intro\"><\/p><img class=\"aid-prev\" alt=\"\"><p class=\"aid-pcap\"><\/p><p class=\"aid-note\"><\/p><label for=\"aid-code\" class=\"aid-cl\"><\/label>'+\r\n      '<input id=\"aid-code\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\"><p class=\"aid-err\" aria-live=\"polite\"><\/p>'+\r\n      '<div class=\"aid-wait\" hidden><span class=\"aid-spin\" aria-hidden=\"true\"><\/span><span class=\"aid-wt\"><\/span><\/div>'+\r\n      '<div class=\"aid-btns\"><span class=\"aid-left aid-lim\"><\/span><button type=\"button\" class=\"aid-x aid-close\"><\/button><button type=\"button\" class=\"aid-go aid-run\"><\/button><\/div><\/div>'+\r\n      '<div class=\"aid-res\" hidden><img alt=\"\"><div class=\"aid-btns\"><span class=\"aid-left aid-rem\"><\/span><button type=\"button\" class=\"aid-x aid-close\"><\/button>'+\r\n      '<button type=\"button\" class=\"aid-x aid-new\"><\/button><button type=\"button\" class=\"aid-go aid-dl\"><\/button><\/div><\/div><\/div>';\r\n    ov.appendChild(aiDlg);\r\n    var q=function(c){return aiDlg.querySelector(c);};\r\n    q('.aid-t').textContent=AT.title;q('.aid-pcap').textContent=AT.frame;q('.aid-intro').textContent=AT.intro;q('.aid-note').textContent=AT.note;q('.aid-cl').textContent=AT.code;\r\n    q('.aid-wt').textContent=AT.wait;q('.aid-lim').textContent=AT.limit;q('.aid-run').textContent=AT.go;q('.aid-dl').textContent=AT.dl;q('.aid-new').textContent=AT.again;\r\n    aiDlg.querySelectorAll('.aid-close').forEach(function(b){b.textContent=AT.close;b.addEventListener('click',aiHide);});\r\n    q('.aid-run').addEventListener('click',aiRun);q('.aid-dl').addEventListener('click',aiDownload);q('.aid-new').addEventListener('click',function(){aiShow(true);});\r\n    q('#aid-code').addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();aiRun();}});\r\n    aiDlg.addEventListener('keydown',function(e){if(e.key==='Escape'){e.stopPropagation();aiHide();}});\r\n    return aiDlg;\r\n  }\r\n  function aiShow(fresh){\r\n    var d=aiEl(),q=function(c){return d.querySelector(c);};\r\n    if(fresh)aiResult=null;\r\n    d.classList.toggle('aid-wide',!!aiResult);\r\n    q('.aid-form').hidden=!!aiResult;q('.aid-res').hidden=!aiResult;q('.aid-err').textContent='';\r\n    var c=aiCode();\r\n    if(!q('#aid-code').value)q('#aid-code').value=c;\r\n    \/\/ Con el c\u00f3digo de la sesi\u00f3n no se pide nada: el campo solo aparece si falta o no es v\u00e1lido\r\n    var ask=!c||aiAsk;q('.aid-cl').hidden=!ask;q('#aid-code').hidden=!ask;\r\n    if(!aiResult&&window.PC3DPlanner&&window.PC3DPlanner.captureClean){\r\n      \/\/ Vista previa del encuadre 16:9 que se enviar\u00e1 (la misma captura se usa al crear la imagen)\r\n      aiCap=null;q('.aid-prev').removeAttribute('src');\r\n      window.PC3DPlanner.captureClean().then(function(c){aiCap=c;q('.aid-prev').src=c.previewUrl||c.url;}).catch(function(){});\r\n    }\r\n    d.hidden=false;setTimeout(function(){(aiResult?q('.aid-dl'):(ask?q('#aid-code'):q('.aid-run'))).focus();},30);\r\n  }\r\n  function aiHide(){if(aiBusy)return;if(aiDlg)aiDlg.hidden=true;var b=$('pc3d-ai');if(b)b.focus();}\r\n  function aiRun(){\r\n    if(aiBusy||!window.PC3DPlanner||!window.PC3DPlanner.captureClean)return;\r\n    var d=aiEl(),q=function(c){return d.querySelector(c);},code=(q('#aid-code').hidden?aiCode():q('#aid-code').value).trim();\r\n    if(!code){aiAsk=true;q('.aid-cl').hidden=false;q('#aid-code').hidden=false;q('.aid-err').textContent=AT.needCode;q('#aid-code').focus();return;}\r\n    if(!q('#aid-code').hidden){try{sessionStorage.setItem('pc_ai_code',code);}catch(e){}}\r\n    aiBusy=true;q('.aid-run').disabled=true;q('#aid-code').disabled=true;q('.aid-err').textContent='';q('.aid-wait').hidden=false;\r\n    var o=window.paGet3DOpts?window.paGet3DOpts():{},dd=window.paPlanData?window.paPlanData():{items:[]};\r\n    var n=(dd.items||[]).filter(function(i){return i.court==='courtDouble'||i.court==='courtSingle';}).length;\r\n    var pj='';try{pj=sessionStorage.getItem('pc_tools_project')||'';}catch(e){}\r\n    (aiCap?Promise.resolve(aiCap):window.PC3DPlanner.captureClean()).then(function(cap){\r\n      var sc=cap.scene||{};\r\n      return fetch(AI_URL,{method:'POST',headers:{'Content-Type':'application\/json'},credentials:'same-origin',\r\n        body:JSON.stringify({access_code:code,image:cap.url.split(',')[1],environment:sc.environment||(o.application==='OUTDOOR'?'outdoor':'indoor'),\r\n          court_model:{INDOOR:'basic',INDOOR_PANORAMIC_3M:'panoramic-pro',OUTDOOR:'premium'}[o.application]||'',court_count:Math.max(1,(window.paUnits?window.paUnits(o):1)*n),project:pj,\r\n          \/\/ Lo que se ve en la imagen: pistas visibles, bloques del plano (etiqueta, tama\u00f1o, posici\u00f3n) e iluminaci\u00f3n\r\n          visible_courts:sc.visible_courts,elements:sc.elements||[],lighting:sc.lighting||o.lighting,lux:sc.lux,roof:!!sc.roof,\r\n          turf:sc.turf||null,structure:sc.structure||null,floor:sc.floor||null,roof_info:sc.roofInfo||null})});\r\n    }).then(function(r){return r.json().catch(function(){return {success:false};}).then(function(j){j._status=r.status;return j;});})\r\n    .then(function(j){\r\n      if(!j||!j.success||!j.image_base64){\r\n        if(j&&j._status===403){\r\n          \/\/ C\u00f3digo no v\u00e1lido para im\u00e1genes IA: se muestra el campo para introducir otro\r\n          aiAsk=true;q('.aid-cl').hidden=false;q('#aid-code').hidden=false;q('#aid-code').value='';\r\n          try{sessionStorage.removeItem('pc_ai_code');}catch(e){}\r\n          setTimeout(function(){q('#aid-code').focus();},30);\r\n        }\r\n        var m=j&&j._status===403?(j.expired?AT.exp:AT.bad):j&&j._status===429&&\/limit\/i.test(j.message||'')?AT.lim:(j&&j.message)||AT.fail;\r\n        throw new Error(m);\r\n      }\r\n      aiAsk=false;aiResult={src:'data:'+(j.image_mime||'image\/png')+';base64,'+j.image_base64,left:j.unlimited?null:j.runs_remaining};\r\n      q('.aid-res img').src=aiResult.src;\r\n      q('.aid-rem').textContent=aiResult.left===null||aiResult.left===undefined?'':AT.left(aiResult.left);\r\n      aiShow(false);\r\n    }).catch(function(e){q('.aid-err').textContent=(e&&e.message&&e.message!=='Failed to fetch')?e.message:AT.fail;})\r\n    .then(function(){aiBusy=false;q('.aid-run').disabled=false;q('#aid-code').disabled=false;q('.aid-wait').hidden=true;});\r\n  }\r\n  \/\/ Descarga como JPEG (el PNG con marca de agua pesa varios MB)\r\n  function aiDownload(){\r\n    if(!aiResult)return;\r\n    var pj='';try{pj=sessionStorage.getItem('pc_tools_project')||'';}catch(e){}\r\n    var name='Padelcreations_'+(pj?pj+'_':'')+'3D-AI_'+stamp()+'.jpg',im=new Image();\r\n    im.onload=function(){var c=document.createElement('canvas');c.width=im.width;c.height=im.height;var g=c.getContext('2d');g.fillStyle='#fff';g.fillRect(0,0,c.width,c.height);g.drawImage(im,0,0);\r\n      var a=document.createElement('a');a.href=c.toDataURL('image\/jpeg',0.92);a.download=name;document.body.appendChild(a);a.click();document.body.removeChild(a);};\r\n    im.src=aiResult.src;\r\n  }\r\n  \/* \u2500\u2500 PDF del proyecto: plano 2D arriba y vista 3D actual debajo (A4 vertical) \u2500\u2500\r\n     jsPDF se carga solo al pulsar el bot\u00f3n. Nombre: Padelcreations_[proyecto_]Layout-3D_AAAA-MM-DD_HH-MM-SS.pdf *\/\r\n  var jspP=null;\r\n  function pdfLib(){\r\n    if(window.jspdf&&window.jspdf.jsPDF)return Promise.resolve(window.jspdf.jsPDF);\r\n    if(jspP)return jspP;\r\n    var urls=['https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js','https:\/\/cdn.jsdelivr.net\/npm\/jspdf@2.5.1\/dist\/jspdf.umd.min.js'];\r\n    jspP=new Promise(function(res,rej){(function next(i){\r\n      if(i>=urls.length){jspP=null;rej(new Error('jsPDF no disponible'));return;}\r\n      var sc=document.createElement('script');sc.src=urls[i];sc.async=true;sc.setAttribute('data-no-optimize','1');sc.setAttribute('data-cfasync','false');\r\n      sc.onload=function(){if(window.jspdf&&window.jspdf.jsPDF)res(window.jspdf.jsPDF);else next(i+1);};\r\n      sc.onerror=function(){next(i+1);};document.head.appendChild(sc);\r\n    })(0);});\r\n    return jspP;\r\n  }\r\n  \/\/ Plano 2D: se recorta al \u00e1rea dibujada (con margen para las cotas), sin la selecci\u00f3n activa\r\n  function plan2D(){\r\n    var A=null;try{A=padelArea;}catch(e){}\r\n    var cv=(A&&A.canvas)||document.getElementById('canvasAreas');if(!cv||!cv.width)return null;\r\n    var sel=null,hasSel=false;\r\n    try{if(A&&A.padelCourts&&A.padelCourts.selectedCourt){sel=A.padelCourts.selectedCourt;hasSel=true;A.padelCourts.selectedCourt=null;A.drawCourts();}}catch(e){}\r\n    var W=cv.width,H=cv.height,x0=0,y0=0,x1=W,y1=H,ok=false,area=null;\r\n    try{\r\n      \/\/ Recorte ajustado al marco del \u00e1rea: el PDF dibuja su propio marco y sus cotas\r\n      var p0=A.scaleToCanvas(0,0),p1=A.scaleToCanvas(A.measureWidth,A.measureHeight);A.applyOffset(p0);A.applyOffset(p1);\r\n      var m=4,ax=Math.min(p0.x,p1.x),ay=Math.min(p0.y,p1.y),bx=Math.max(p0.x,p1.x),by=Math.max(p0.y,p1.y);\r\n      if(isFinite(ax+ay+bx+by)&&bx-ax>100&&by-ay>100){\r\n        x0=Math.max(0,ax-m);y0=Math.max(0,ay-m);x1=Math.min(W,bx+m);y1=Math.min(H,by+m);ok=true;\r\n        var imp=(A.measureSystem==='IMPERIAL')||(function(){try{return padelForm.getFormValues().measureSystem==='IMPERIAL';}catch(e){return false;}})();\r\n        area={x:ax-x0,y:ay-y0,w:bx-ax,h:by-ay,mw:+A.measureWidth,mh:+A.measureHeight,u:imp?'ft':'m'};\r\n      }\r\n    }catch(e){}\r\n    if(!ok){\r\n      \/\/ Respaldo: recorte por contenido (todo lo que no sea fondo blanco o transparente)\r\n      try{\r\n        var d=cv.getContext('2d').getImageData(0,0,W,H).data,minX=W,minY=H,maxX=-1,maxY=-1;\r\n        for(var y=0;y<H;y+=2)for(var x=0;x<W;x+=2){var i=(y*W+x)*4;if(d[i+3]>10&&(d[i]<245||d[i+1]<245||d[i+2]<245)){if(x<minX)minX=x;if(x>maxX)maxX=x;if(y<minY)minY=y;if(y>maxY)maxY=y;}}\r\n        if(maxX>minX&&maxY>minY){x0=Math.max(0,minX-20);y0=Math.max(0,minY-20);x1=Math.min(W,maxX+20);y1=Math.min(H,maxY+20);}\r\n      }catch(e){}\r\n    }\r\n    var out=document.createElement('canvas');out.width=Math.round(x1-x0);out.height=Math.round(y1-y0);\r\n    var g=out.getContext('2d');g.fillStyle='#ffffff';g.fillRect(0,0,out.width,out.height);g.drawImage(cv,x0,y0,x1-x0,y1-y0,0,0,out.width,out.height);\r\n    try{if(hasSel){A.padelCourts.selectedCourt=sel;A.drawCourts();}}catch(e){}\r\n    try{return {url:out.toDataURL('image\/png'),w:out.width,h:out.height,area:area};}catch(e){return null;}\r\n  }\r\n  function imgInfo(url,jpeg){\r\n    return new Promise(function(res){\r\n      if(!url){res(null);return;}\r\n      var im=new Image();\r\n      im.onload=function(){\r\n        if(!jpeg){res({url:url,w:im.width,h:im.height});return;}\r\n        try{var c=document.createElement('canvas');c.width=im.width;c.height=im.height;var g=c.getContext('2d');g.fillStyle='#ffffff';g.fillRect(0,0,c.width,c.height);g.drawImage(im,0,0);\r\n          res({url:c.toDataURL('image\/jpeg',0.9),w:im.width,h:im.height,jpeg:true});}catch(e){res({url:url,w:im.width,h:im.height});}\r\n      };\r\n      im.onerror=function(){res(null);};im.src=url;\r\n    });\r\n  }\r\n  function logoWhite(){\r\n    return new Promise(function(res){\r\n      var im=new Image(),done=false,fin=function(v){if(!done){done=true;res(v);}};\r\n      im.onload=function(){try{var c=document.createElement('canvas');c.width=im.width;c.height=im.height;c.getContext('2d').drawImage(im,0,0);fin({url:c.toDataURL('image\/png'),w:im.width,h:im.height});}catch(e){fin(null);}};\r\n      im.onerror=function(){fin(null);};setTimeout(function(){fin(null);},3000);\r\n      im.src=location.origin+'\/wp-content\/uploads\/2024\/10\/logo-white.png';\r\n    });\r\n  }\r\n  function makePdf(){\r\n    if(!window.PC3DPlanner)return;\r\n    var b=$('pc3d-pdf');b.disabled=true;\r\n    var de=(document.documentElement.lang||'').toLowerCase().indexOf('de')===0;\r\n    var T=de?{title:'Padel Floor Planner \u00b7 Layout & 3D-Ansicht',p2:'2D-LAYOUT',p3:'3D-VISUALISIERUNG',na:'Nicht verf\u00fcgbar',proj:'Projekt '}\r\n            :{title:'Padel Floor Planner \u00b7 Layout & 3D view',p2:'2D LAYOUT',p3:'3D VISUALISATION',na:'Not available',proj:'Project '};\r\n    var pj='';try{pj=sessionStorage.getItem('pc_tools_project')||'';}catch(e){}\r\n    var p2=plan2D();\r\n    Promise.all([pdfLib(),window.PC3DPlanner.capture().then(function(u){return imgInfo(u,true);}).catch(function(){return null;}),logoWhite()]).then(function(r){\r\n      var JsPDF=r[0],i3=r[1],logo=r[2];\r\n      var doc=new JsPDF({orientation:'portrait',unit:'mm',format:'a4',compress:true}),PW=210,PH=297,MX=12,CW=PW-2*MX;\r\n      \/\/ Cabecera azul marino con proyecto, fecha y logo blanco\r\n      doc.setFillColor(26,39,68);doc.rect(0,0,PW,24,'F');\r\n      doc.setTextColor(255,255,255);doc.setFont('helvetica','bold');doc.setFontSize(14);\r\n      doc.text(pj?T.proj+pj:T.title,MX,11);\r\n      doc.setFont('helvetica','normal');doc.setFontSize(9);doc.setTextColor(168,192,232);\r\n      var d=new Date(),z=function(n){return String(n).padStart(2,'0');};\r\n      doc.text((pj?T.title+'  \u00b7  ':'')+z(d.getDate())+'.'+z(d.getMonth()+1)+'.'+d.getFullYear()+'  '+z(d.getHours())+':'+z(d.getMinutes()),MX,18);\r\n      if(logo){var lh=14,lw=lh*logo.w\/logo.h;doc.addImage(logo.url,'PNG',PW-MX-lw,5,lw,lh);}\r\n      else{doc.setFont('helvetica','bold');doc.setFontSize(11);doc.setTextColor(255,255,255);doc.text('PADELCREATIONS',PW-MX,13,{align:'right'});}\r\n      \/\/ Resumen de la configuraci\u00f3n\r\n      var sum=(window.pcLayoutSummary?window.pcLayoutSummary():[]).join('  \u00b7  ');\r\n      var y=31;\r\n      if(sum){doc.setFont('helvetica','normal');doc.setFontSize(8.5);doc.setTextColor(70,80,95);\r\n        var lines=doc.splitTextToSize(sum,CW).slice(0,2);doc.text(lines,MX,y);y+=lines.length*3.8+2;}\r\n      \/\/ Dos bloques iguales: 2D arriba, 3D debajo\r\n      var bottom=281,LBL=7,GAP=6,BH=(bottom-y-2*LBL-GAP)\/2;\r\n      function block(label,img,fmt){\r\n        doc.setFont('helvetica','bold');doc.setFontSize(9);doc.setTextColor(26,39,68);doc.text(label,MX,y+4);\r\n        doc.setDrawColor(126,203,0);doc.setLineWidth(0.6);doc.line(MX,y+5.5,MX+16,y+5.5);\r\n        var by=y+LBL;\r\n        if(img&&img.area){\r\n          \/\/ Plano 2D: marco de la l\u00e1mina, \u00e1rea enmarcada y cotas de ancho y largo (como en el plano)\r\n          doc.setDrawColor(210,215,222);doc.setLineWidth(0.2);doc.rect(MX,by,CW,BH);\r\n          var PADL=13,PADT=11,PADR=5,PADB=5,aw=CW-PADL-PADR,ah=BH-PADT-PADB;\r\n          var s=Math.min(aw\/img.w,ah\/img.h),w=img.w*s,h=img.h*s,x=MX+PADL+(aw-w)\/2,yy=by+PADT+(ah-h)\/2;\r\n          doc.addImage(img.url,fmt,x,yy,w,h,undefined,'FAST');\r\n          var a=img.area,ax=x+a.x*s,ay=yy+a.y*s,aW=a.w*s,aH=a.h*s;\r\n          doc.setDrawColor(26,39,68);doc.setLineWidth(0.5);doc.rect(ax,ay,aW,aH);\r\n          var fmtN=function(v){return (Math.round(v*100)\/100).toFixed(2)+' '+a.u;};\r\n          doc.setLineWidth(0.25);doc.setFillColor(26,39,68);\r\n          var AR=1.6,AW=0.7;\r\n          \/\/ Cota horizontal (ancho) por encima del \u00e1rea\r\n          var dy=ay-5;\r\n          doc.line(ax,ay-1,ax,dy-1.5);doc.line(ax+aW,ay-1,ax+aW,dy-1.5);\r\n          doc.line(ax,dy,ax+aW,dy);\r\n          doc.triangle(ax,dy,ax+AR,dy-AW,ax+AR,dy+AW,'F');doc.triangle(ax+aW,dy,ax+aW-AR,dy-AW,ax+aW-AR,dy+AW,'F');\r\n          doc.setFont('helvetica','bold');doc.setFontSize(9);doc.setTextColor(94,150,0);\r\n          var tw=doc.getTextWidth(fmtN(a.mw))+3;doc.setFillColor(255,255,255);doc.rect(ax+aW\/2-tw\/2,dy-2.2,tw,4.4,'F');\r\n          doc.text(fmtN(a.mw),ax+aW\/2,dy+1.1,{align:'center'});\r\n          \/\/ Cota vertical (largo) a la izquierda del \u00e1rea\r\n          var dx=ax-5;doc.setFillColor(26,39,68);\r\n          doc.line(ax-1,ay,dx-1.5,ay);doc.line(ax-1,ay+aH,dx-1.5,ay+aH);\r\n          doc.line(dx,ay,dx,ay+aH);\r\n          doc.triangle(dx,ay,dx-AW,ay+AR,dx+AW,ay+AR,'F');doc.triangle(dx,ay+aH,dx-AW,ay+aH-AR,dx+AW,ay+aH-AR,'F');\r\n          var th=doc.getTextWidth(fmtN(a.mh))+3;doc.setFillColor(255,255,255);doc.rect(dx-2.2,ay+aH\/2-th\/2,4.4,th,'F');\r\n          \/\/ Texto girado 90\u00b0: se centra a mano (jsPDF desplaza el texto si se combina align con angle)\r\n          var tl=doc.getTextWidth(fmtN(a.mh));doc.text(fmtN(a.mh),dx+1.1,ay+aH\/2+tl\/2,{angle:90});\r\n        }else if(img){\r\n          var s=Math.min(CW\/img.w,BH\/img.h),w=img.w*s,h=img.h*s,x=MX+(CW-w)\/2,yy=by+(BH-h)\/2;\r\n          doc.addImage(img.url,fmt,x,yy,w,h,undefined,'FAST');\r\n          doc.setDrawColor(210,215,222);doc.setLineWidth(0.2);doc.rect(x,yy,w,h);\r\n        }else{doc.setDrawColor(210,215,222);doc.setLineWidth(0.2);doc.rect(MX,by,CW,BH);doc.setFont('helvetica','normal');doc.setFontSize(10);doc.setTextColor(150,155,165);doc.text(T.na,PW\/2,by+BH\/2,{align:'center'});}\r\n        y=by+BH+GAP;\r\n      }\r\n      block(T.p2,p2,'PNG');\r\n      block(T.p3,i3,i3&&i3.jpeg?'JPEG':'PNG');\r\n      \/\/ Pie\r\n      doc.setDrawColor(210,215,222);doc.setLineWidth(0.2);doc.line(MX,PH-12,PW-MX,PH-12);\r\n      doc.setFont('helvetica','normal');doc.setFontSize(7.5);doc.setTextColor(110,118,130);\r\n      doc.text('Layout made with the Padel Floor Planner  \u00b7  PADELCREATIONS INTERNATIONAL',MX,PH-7);\r\n      doc.setTextColor(94,150,0);doc.text('www.padelcreations.com  \u00b7  info@padelcreations.com',PW-MX,PH-7,{align:'right'});\r\n      doc.save('Padelcreations_'+(pj?pj+'_':'')+'Layout-3D_'+stamp()+'.pdf');\r\n    }).catch(function(e){if(window.console)console.error('[PadelCreations PDF]',e);alert(de?'Das PDF konnte nicht erstellt werden. Bitte erneut versuchen.':'The PDF could not be created. Please try again.');})\r\n      .then(function(){b.disabled=false;});\r\n  }\r\n  function close(){\r\n    ov.hidden=true;document.documentElement.style.overflow='';\r\n    if(window.PC3DPlanner)window.PC3DPlanner.close();\r\n    if(lastFocus&&lastFocus.focus)lastFocus.focus();\r\n  }\r\n  function init(){\r\n    ov=$('pc3d-overlay');stage=$('pc3d-stage');msg=$('pc3d-msg');if(!ov)return;\r\n    tr();mark();\r\n    var us=$('pc3d-units');if(us)us.addEventListener('change',function(){opts.units=Math.max(1,Math.min(6,+us.value||1));mark();if(window.PC3DPlanner)window.PC3DPlanner.set(opts);});\r\n    ov.querySelectorAll('[data-tg]').forEach(function(b){\r\n      b.addEventListener('click',function(){var k=b.getAttribute('data-tg');opts[k]=!opts[k];if(k==='roofCurved'){mark();roofInput();return;}mark();if(window.PC3DPlanner)window.PC3DPlanner.set(opts);});\r\n    });\r\n    ov.querySelectorAll('.pc3d-grp[data-opt] button').forEach(function(b){\r\n      b.addEventListener('click',function(){var k=b.parentNode.getAttribute('data-opt');opts[k]=b.getAttribute('data-val');if(k==='application')opts.lux=luxDefault();mark();if(window.PC3DPlanner)window.PC3DPlanner.set(opts);try{if(typeof padelArea!=='undefined'&&padelArea.ctx)padelArea.drawCourts();}catch(e){}});\r\n    });\r\n    ov.querySelectorAll('[data-pc3d-view]').forEach(function(b){b.addEventListener('click',function(){\r\n      ov.querySelectorAll('[data-pc3d-view]').forEach(function(x){x.setAttribute('aria-pressed',String(x===b));});\r\n      if(window.PC3DPlanner)window.PC3DPlanner.view(b.getAttribute('data-pc3d-view'));\r\n    });});\r\n    ['pc3d-eave','pc3d-ridge','pc3d-bsp','pc3d-btop','pc3d-bwall'].forEach(function(id){var el=$(id);el.addEventListener('change',function(){roofInput();roofUI();});el.addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();el.blur();}});});\r\n    setInterval(function(){if(!ov.hidden)roofUI();},800);\r\n    $('pc3d-shot').addEventListener('click',capture);\r\n    $('pc3d-pdf').addEventListener('click',makePdf);\r\n    $('pc3d-ai').addEventListener('click',function(){aiShow(!aiResult);});\r\n    $('pc3d-close').addEventListener('click',close);\r\n    \/\/ Logos del cliente: se reducen a 1024 px como m\u00e1ximo (PNG, conserva la transparencia)\r\n    var lgFile=$('pc3d-logo-file'),lgSlot=0;\r\n    function logoUI(){\r\n      ov.querySelectorAll('.pc3d-lg').forEach(function(b){var i=+b.getAttribute('data-lg'),u=custLogos[i];\r\n        b.innerHTML=u?'<img title=\"Grundriss Planer f\u00fcr Padel - Padelcreations - Wir bauen robuste Padel Courts\" decoding=\"async\" alt=\"%alt%\" src=\"'+u+'\">':'';var t=document.createElement('span');t.textContent=L['logo'+(i+1)];b.appendChild(t);\r\n        b.setAttribute('aria-pressed',String(!!u));});\r\n      ov.querySelectorAll('.pc3d-lg-x').forEach(function(b){b.hidden=!custLogos[+b.getAttribute('data-lgx')];});\r\n    }\r\n    function logoSet(){logoUI();if(window.PC3DPlanner&&!ov.hidden)window.PC3DPlanner.set(Object.assign({},opts,{logos:custLogos}));}\r\n    ov.querySelectorAll('.pc3d-lg').forEach(function(b){b.addEventListener('click',function(){lgSlot=+b.getAttribute('data-lg');lgFile.value='';lgFile.click();});});\r\n    ov.querySelectorAll('.pc3d-lg-x').forEach(function(b){b.addEventListener('click',function(){custLogos[+b.getAttribute('data-lgx')]=null;logoSet();});});\r\n    lgFile.addEventListener('change',function(){\r\n      var f=lgFile.files&&lgFile.files[0],slot=lgSlot;if(!f)return;\r\n      if(f.size>10*1024*1024){alert(L.logoBig);return;}            \/\/ archivo subido: m\u00e1x. 10 MB\r\n      var rd=new FileReader();\r\n      rd.onload=function(){var im=new Image();\r\n        im.onload=function(){try{\r\n          \/\/ Logo guardado: PNG (conserva la transparencia) de m\u00e1x. 1024 px y m\u00e1x. 500 KB; si pesa m\u00e1s, se reduce\r\n          var W0=im.naturalWidth||1024,H0=im.naturalHeight||512,side=1024,url='';\r\n          for(var n=0;n<8;n++){\r\n            var k=Math.min(1,side\/Math.max(W0,H0)),w=Math.max(1,Math.round(W0*k)),h=Math.max(1,Math.round(H0*k));\r\n            var c=document.createElement('canvas');c.width=w;c.height=h;c.getContext('2d').drawImage(im,0,0,w,h);\r\n            url=c.toDataURL('image\/png');\r\n            if(url.length*0.75<=500*1024||side<=256)break;\r\n            side=Math.round(side*0.8);\r\n          }\r\n          custLogos[slot]=url;logoSet();\r\n        }catch(e){alert(L.logoBad);}};\r\n        im.onerror=function(){alert(L.logoBad);};im.src=rd.result;};\r\n      rd.onerror=function(){alert(L.logoBad);};rd.readAsDataURL(f);\r\n    });\r\n    logoUI();\r\n    \/\/ Guardar \/ cargar los logos con el archivo .padel (solo im\u00e1genes en data URL)\r\n    window.paGetLogos=function(){return custLogos[0]||custLogos[1]?custLogos.slice():null;};\r\n    window.paSetLogos=function(a){\r\n      if(!Array.isArray(a))return;\r\n      custLogos=[0,1].map(function(i){var u=a[i];return (typeof u==='string'&&u.length<=700*1024&&\/^data:image\\\/(png|jpeg|webp|svg\\+xml);base64,\/.test(u))?u:null;});\r\n      logoSet();\r\n    };\r\n\r\n    document.addEventListener('keydown',function(e){if(e.key==='Escape'&&!ov.hidden)close();});\r\n  }\r\n  window.paOpen3D=open;\r\n  window.paGet3DOpts=function(){return JSON.parse(JSON.stringify(opts));};\r\n  \/\/ Cambiar una opci\u00f3n desde fuera de la vista 3D (p. ej. la casilla de extensi\u00f3n del plano 2D)\r\n  \/\/ Restaurar toda la configuraci\u00f3n 3D (al cargar un archivo .padel)\r\n  var OPT_KEYS=['application','doors','lighting','lux','floor','grass','colour','turfExt','protect','roof','roofCurved','units','eave','ridge','beamSp','beamTop','beamWall','tennisSurface','paving'];\r\n  window.paSetAll3DOpts=function(o){\r\n    if(!o||typeof o!=='object')return;\r\n    OPT_KEYS.forEach(function(k){if(o[k]!==undefined&&o[k]!==null)opts[k]=o[k];});\r\n    opts.paving='bond';   \/\/ enlosado exterior: siempre adoqu\u00edn 20\u00d710 a soga (las otras opciones se han retirado)\r\n    if(o.lux===undefined||o.lux===null)opts.lux=opts.application==='OUTDOOR'?'300':'500';\r\n    if(ov)mark();\r\n    if(window.PC3DPlanner&&ov&&!ov.hidden)window.PC3DPlanner.set(opts);\r\n    var c=document.getElementById('pc-turfext');if(c)c.checked=!!opts.turfExt;\r\n    try{if(typeof padelArea!=='undefined'&&padelArea.ctx)padelArea.drawCourts();}catch(e){}\r\n  };\r\n  window.paSet3DOpt=function(k,v){opts[k]=v;if(ov)mark();if(window.PC3DPlanner&&ov&&!ov.hidden)window.PC3DPlanner.set(opts);try{if(typeof padelArea!=='undefined'&&padelArea.ctx)padelArea.drawCourts();}catch(e){}};\r\n  window.paPlanData=function(){try{return planData();}catch(e){return {items:[]};}};\r\n  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();\r\n})();\r\n\r\n\/* \u2500\u2500 Solicitud de oferta desde la vista 3D: mismo formulario Zoho que el configurador \u2500\u2500 *\/\r\n(function(){\r\n  var isDE=(document.documentElement.lang||'').substring(0,2).toLowerCase()==='de';\r\n  var CFG='\/wp-content\/uploads\/configurador\/js\/';      \/\/ mismos textos para Zoho que el configurador\r\n  var SITEKEY='6LcJxKslAAAAAFDLyVPaZlWBiH7bs6jJ0pepYlpI';\r\n  var M={\r\n    req:isDE?' ist erforderlich.':' is required.', sel:isDE?': bitte ausw\u00e4hlen.':': please select.',\r\n    email:isDE?'Bitte g\u00fcltige E-Mail eingeben.':'Please enter a valid email.',\r\n    files:isDE?'Maximal 1 eigene Datei (20 MB gesamt).':'Max. 1 own file (20 MB total).',\r\n    sending:isDE?'Senden\u2026':'Sending\u2026',\r\n    courts:function(d,s){var n=d+s;return n+(isDE?(n===1?' Platz':' Pl\u00e4tze'):(n===1?' court':' courts'))+(s?(isDE?' ('+d+' Doppel, '+s+' Einzel)':' ('+d+' doubles, '+s+' single)'):'');},\r\n    labels:{INDOOR:'Indoor',INDOOR_PANORAMIC_3M:'Indoor Panoramic',OUTDOOR:'Outdoor',\r\n      none:isDE?'Ohne T\u00fcren':'No doors',one:isDE?'T\u00fcren 1 Seite':'Doors 1 side',two:isDE?'T\u00fcren 2 Seiten':'Doors 2 sides',\r\n      lnone:isDE?'Ohne Licht':'No lights',straight:isDE?'Masten gerade':'Straight masts',angled:isDE?'Masten abgewinkelt':'Angled masts',curved:isDE?'Masten gebogen':'Curved masts',\r\n      StructureBlack:'RAL 7016',StructureGreen:'RAL 6005',StructureBlue:'RAL 5022',StructureRed:'RAL 3005',StructureFucsia:'RAL 4007',\r\n      GrassBlue:isDE?'Rasen blau':'Blue grass',GrassGreen:isDE?'Rasen gr\u00fcn':'Green grass',GrassFuchsia:isDE?'Rasen fuchsia':'Fuchsia grass',\r\n      GrassTerracotta:isDE?'Rasen terrakotta':'Terracotta grass',GrassBlack:isDE?'Rasen schwarz':'Black grass',GrassRed:isDE?'Rasen rot':'Red grass'}\r\n  };\r\n  var REQ=[['NAME','Company Name','Firmenname'],['COBJ1CF12','Your name','Ihr Name'],['COBJ1CF2','Phone','Telefon'],['Email','Email','E-Mail'],\r\n           ['COBJ1CF3','City','Stadt'],['COBJ1CF6','Country','Land'],['COBJ1CF14','Project phase','Projektphase'],['COBJ1CF11','Timeline','Zeitplan']];\r\n  var box,form,recapId=null,recapOK=false,cfgLoaded=null,lastFocus,waiting=false,waitT=null,sendBtnHTML='';\r\n  function $(id){return document.getElementById(id);}\r\n  function tr(){\r\n    box.querySelectorAll('[data-en]').forEach(function(el){var t=el.getAttribute(isDE?'data-de':'data-en');if(t)el.textContent=t;});\r\n    box.querySelectorAll('[data-en-ph]').forEach(function(el){el.placeholder=el.getAttribute(isDE?'data-de-ph':'data-en-ph');});\r\n    if(isDE){$('pcq-return').value='https:\/\/www.padelcreations.com\/de\/danke-fuer-ihre-anfrage\/';$('pcq-lang').value='German';}\r\n  }\r\n  function loadScript(src){return new Promise(function(res){var s=document.createElement('script');s.src=src;s.onload=res;s.onerror=res;document.head.appendChild(s);});}\r\n  \/\/ Textos de los valores para Zoho: se usan los mismos mapas que el configurador (configurator-engl.js \/ -deu.js)\r\n  function loadCfg(){\r\n    if(cfgLoaded)return cfgLoaded;\r\n    cfgLoaded=loadScript(CFG+'configurator-engl.js').then(function(){return isDE?loadScript(CFG+'configurator-deu.js'):null;});\r\n    return cfgLoaded;\r\n  }\r\n  function lbl(map,key){try{return(window[map]&&window[map][key])?window[map][key]:key;}catch(e){return key;}}\r\n  function recaptcha(){\r\n    function render(){if(recapId!==null||!window.grecaptcha||!grecaptcha.render)return;\r\n      recapId=grecaptcha.render('pcq-recap',{sitekey:SITEKEY,callback:function(){recapOK=true;$('pcq-recap-err').hidden=true;},'expired-callback':function(){recapOK=false;}});}\r\n    if(window.grecaptcha&&grecaptcha.render){render();return;}\r\n    window.pcqRecapReady=render;\r\n    if(!document.querySelector('script[src*=\"recaptcha\/api.js\"]'))loadScript('https:\/\/www.google.com\/recaptcha\/api.js?onload=pcqRecapReady&render=explicit');\r\n    else{var t=setInterval(function(){if(window.grecaptcha&&grecaptcha.render){clearInterval(t);render();}},300);}\r\n  }\r\n  function summary(){\r\n    var o=window.paGet3DOpts?window.paGet3DOpts():{},d=window.paPlanData?window.paPlanData():{items:[]};\r\n    var nd=0,ns=0;(d.items||[]).forEach(function(i){if(i.court==='courtDouble')nd++;else if(i.court==='courtSingle')ns++;});\r\n    var f=d.measureSystem==='IMPERIAL'?0.3048:1,W=Math.round((+d.areaWidth||0)*f*10)\/10,L=Math.round((+d.areaLen||0)*f*10)\/10;\r\n    \/\/ Multiplicador de naves (cubierta curva, 1 pista): total de pistas y medidas totales (se multiplica el lado de la luz, el corto)\r\n    var u=window.paUnits?window.paUnits(o):1;\r\n    if(u>1){nd*=u;ns*=u;if(W>=L)L=Math.round(L*u*10)\/10;else W=Math.round(W*u*10)\/10;}\r\n    return {o:o,d:d,nd:nd,ns:ns,units:u,area:W+' \u00d7 '+L+' m'};\r\n  }\r\n  \/\/ Resumen del plano como lista de textos (tambi\u00e9n para el PDF)\r\n  window.pcLayoutSummary=function(){try{return chipList(summary());}catch(e){return [];}};\r\n  function chipList(s){\r\n    var L=M.labels;return [M.courts(s.nd,s.ns),(isDE?'Fl\u00e4che ':'Area ')+s.area,L[s.o.application],L[s.o.doors],s.o.protect?(isDE?'Kantenschutz':'Door protections'):'',s.o.lighting==='none'?L.lnone:L[s.o.lighting]+(s.o.lux?' \u00b7 '+s.o.lux+' Lux':''),L[s.o.colour],L[s.o.grass],(s.o.application!=='OUTDOOR'&&s.o.roof)?((isDE?'Traufe ':'Eave ')+s.o.eave+' m \u00b7 '+(isDE?'First ':'Ridge ')+s.o.ridge+' m'):'',s.o.turfExt?(isDE?'Auslaufzone 8\u00d72 m':'Turf extension 8\u00d72 m'):''].filter(Boolean);\r\n  }\r\n  function chips(s){\r\n    var c=chipList(s);\r\n    $('pcq-chips').innerHTML=c.map(function(x){return '<span class=\"pcq-chip\">'+x+'<\/span>';}).join('');\r\n    $('pcq-lux-wrap').style.display=s.o.lighting==='none'?'none':'';\r\n    if(s.o.lux)$('pcq-lux').value=s.o.lux==='300'?'LED_II_300':'LED_I_500';\r\n  }\r\n  \/\/ El desplegable del formulario y los botones de la vista 3D muestran siempre el mismo nivel de iluminaci\u00f3n\r\n  document.addEventListener('change',function(e){if(e.target&&e.target.id==='pcq-lux'&&window.paSet3DOpt)window.paSet3DOpt('lux',e.target.value==='LED_II_300'?'300':'500');});\r\n  function showErr(el,msg){el.classList.add('err');var n=el.nextElementSibling;if(n&&n.classList.contains('errmsg'))n.remove();\r\n    var sp=document.createElement('span');sp.className='errmsg';sp.textContent=msg;el.insertAdjacentElement('afterend',sp);}\r\n  function clearErr(el){el.classList.remove('err');var n=el.nextElementSibling;if(n&&n.classList.contains('errmsg'))n.remove();}\r\n  function validate(){\r\n    for(var i=0;i<REQ.length;i++){\r\n      var el=form.querySelector('[name=\"'+REQ[i][0]+'\"]'),v=(el.value||'').trim(),lab=isDE?REQ[i][2]:REQ[i][1];\r\n      if(!v||v==='-None-'){showErr(el,lab+(el.tagName==='SELECT'?M.sel:M.req));el.focus();return false;}clearErr(el);\r\n    }\r\n    var em=form.querySelector('[name=\"Email\"]');if(!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(em.value.trim())){showErr(em,M.email);em.focus();return false;}\r\n    var uf=$('pcq-user-file');if(uf.files.length>1||(uf.files[0]&&uf.files[0].size>15*1048576)){showErr(uf,M.files);return false;}clearErr(uf);\r\n    if(recapId!==null&&!recapOK){$('pcq-recap-err').hidden=false;return false;}\r\n    return true;\r\n  }\r\n  function dataURLtoFile(url,name){var p=url.split(','),b=atob(p[1]),n=b.length,u=new Uint8Array(n);while(n--)u[n]=b.charCodeAt(n);return new File([u],name,{type:(p[0].match(\/:(.*?);\/)||[])[1]||'image\/jpeg'});}\r\n  function stamp(){var d=new Date(),p=function(n){return String(n).padStart(2,'0');};return d.getFullYear()+'-'+p(d.getMonth()+1)+'-'+p(d.getDate())+'_'+p(d.getHours())+'-'+p(d.getMinutes());}\r\n  function submit(e){\r\n    e.preventDefault();\r\n    if(!validate())return;\r\n    var btn=$('pcq-send');btn.disabled=true;var old=btn.innerHTML;btn.textContent=M.sending;\r\n    var s=summary(),o=s.o,set=function(id,v){$(id).value=v;};\r\n    loadCfg().then(function(){\r\n      var n=s.nd+s.ns;set('pcq-courts',Math.min(15,Math.max(1,n))+(n===1?' Padel Court':' Padel Courts'));\r\n      set('pcq-app',lbl('application',o.application));\r\n      set('pcq-colour',lbl('colourSteelStructure',o.colour));\r\n      set('pcq-entrance',lbl('entranceArea',{none:'NoDoors',one:'Doors1',two:'Doors2'}[o.doors]||'NoDoors')+(o.protect?(isDE?' - mit Kantenschutz':' - with door protections'):''));\r\n      set('pcq-turf',lbl('colourArtificialGrass',o.grass)+(o.turfExt?(isDE?' - mit Auslaufzone':' - with extension'):''));\r\n      set('pcq-tq',lbl('turfQuality',$('pcq-quality').value));\r\n      set('pcq-lighting',lbl('lighting',o.lighting==='none'?'WithoutLighting':$('pcq-lux').value));\r\n      set('pcq-masts',o.lighting==='none'?'':lbl('lightingSystem',o.lighting));\r\n      set('pcq-curved','');\r\n      set('pcq-net',lbl('safetyTopNet','WithoutNet'));\r\n      \/\/ Notas: texto del cliente + resumen del plano (origen, pistas, \u00e1rea)\r\n      var note=$('pcq-f14').value.trim();\r\n      var hall=(o.application!=='OUTDOOR'&&o.roof)?' \u00b7 '+(isDE?'Halle: Traufe ':'Hall: eave ')+o.eave+' m, '+(isDE?'First ':'ridge ')+o.ridge+' m'+(o.roofCurved?(isDE?' (gew\u00f6lbt)':' (curved)'):'')+(s.units>1?(isDE?', '+s.units+' Hallen nebeneinander':', '+s.units+' halls side by side'):'')+', '+(isDE?'Binder alle ':'beams every ')+o.beamSp+' m':'';\r\n      set('pcq-notes',(note?note+'\\n\\n':'')+'[Floor Planner 3D] '+M.courts(s.nd,s.ns)+' \u00b7 '+(isDE?'Fl\u00e4che ':'Area ')+s.area+hall+(n>15?' \u00b7 '+n+' courts':''));\r\n      \/\/ Adjuntos: imagen 3D con logo + archivo del plano (.padel) + archivo propio opcional\r\n      return (window.PC3DPlanner?window.PC3DPlanner.capture():Promise.resolve(null)).then(function(url){\r\n        var dt=new DataTransfer(),ts=stamp();\r\n        var pj='';try{pj=sessionStorage.getItem('pc_tools_project')||'';}catch(e){}var pre='Padelcreations_'+(pj?pj+'_':'');\r\n        if(url)dt.items.add(dataURLtoFile(url,pre+'3D-Capture_'+ts+'.jpg'));\r\n        var lgq=window.paGetLogos&&window.paGetLogos();\r\n        dt.items.add(new File([JSON.stringify(Object.assign({},s.d,{turfExt:!!s.o.turfExt,view3d:s.o},lgq?{logos:lgq}:{}))],pre+'Layout_'+ts+'.padel',{type:'text\/plain'}));\r\n        var uf=$('pcq-user-file');if(uf.files[0])dt.items.add(uf.files[0]);\r\n        $('pcq-file').files=dt.files;\r\n      });\r\n    }).then(function(){\r\n      \/\/ Se env\u00eda a un marco oculto: la herramienta no se abandona\r\n      waiting=true;sendBtnHTML=old;$('pcq-send-err').hidden=true;\r\n      clearTimeout(waitT);waitT=setTimeout(function(){if(!waiting)return;waiting=false;btn.disabled=false;btn.innerHTML=old;$('pcq-send-err').hidden=false;},45000);\r\n      form.submit();\r\n    })\r\n      .catch(function(err){if(window.console)console.error('[PadelCreations quote]',err);btn.disabled=false;btn.innerHTML=old;});\r\n  }\r\n  function open(){\r\n    lastFocus=document.activeElement;\r\n    chips(summary());box.hidden=false;recaptcha();loadCfg();\r\n    setTimeout(function(){$('pcq-f1').focus();},50);\r\n  }\r\n  function done(){\r\n    waiting=false;clearTimeout(waitT);\r\n    form.hidden=true;box.querySelector('.pcq-summary').hidden=true;$('pcq-done').hidden=false;$('pcq-done').focus();\r\n  }\r\n  function reset(){\r\n    \/\/ Tras un env\u00edo correcto se deja el formulario listo por si quiere pedir otra oferta (se conservan los datos de contacto)\r\n    form.hidden=false;box.querySelector('.pcq-summary').hidden=false;$('pcq-done').hidden=true;\r\n    ['pcq-f14','pcq-user-file'].forEach(function(id){$(id).value='';});\r\n    var b=$('pcq-send');b.disabled=false;if(sendBtnHTML)b.innerHTML=sendBtnHTML;\r\n    recapOK=false;if(recapId!==null&&window.grecaptcha)try{grecaptcha.reset(recapId);}catch(e){}\r\n  }\r\n  function close(){if(!$('pcq-done').hidden)reset();box.hidden=true;if(lastFocus&&lastFocus.focus)lastFocus.focus();}\r\n  function init(){\r\n    box=$('pcq');if(!box)return;form=$('pcq-form');tr();\r\n    form.addEventListener('submit',submit);\r\n    form.querySelectorAll('input,select,textarea').forEach(function(el){el.addEventListener('input',function(){clearErr(el);});});\r\n    $('pcq-x').addEventListener('click',close);\r\n    \/\/ \u00abContinue\u00bb: solo desaparece el mensaje y se vuelve a la vista 3D, que sigue abierta; el usuario la cierra cuando quiera\r\n    $('pcq-continue').addEventListener('click',function(e){\r\n      e.preventDefault();e.stopPropagation();\r\n      reset();box.hidden=true;\r\n      var q=$('pc3d-quote');if(q&&q.focus)q.focus();\r\n    });\r\n    $('pcq-target').addEventListener('load',function(){if(waiting)done();});\r\n    box.addEventListener('click',function(e){if(e.target===box)close();});\r\n    document.addEventListener('keydown',function(e){if(e.key==='Escape'&&!box.hidden){e.stopImmediatePropagation();close();}},true);\r\n    var b=$('pc3d-quote');if(b)b.addEventListener('click',open);\r\n  }\r\n  window.paOpenQuote=open;\r\n  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();\r\n})();\r\n<\/script>\r\n<script data-no-optimize=\"1\" data-cfasync=\"false\">\r\n\/* \u2500\u2500 Bot\u00f3n \u00ab3D\u00bb en la barra superior y arreglo de guardar\/cargar pilares \u2500\u2500 *\/\r\n(function(){\r\n  \/\/ Bot\u00f3n grande \u00ab3D\u00bb en el panel de acciones (a la derecha de Remove), siempre visible\r\n  function addButton(){\r\n    if(document.getElementById('pc3d-open'))return;\r\n    var de=(document.documentElement.lang||'').substring(0,2).toLowerCase()==='de';\r\n    var st=document.createElement('style');\r\n    st.textContent='#pc3d-open{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;margin-left:auto;'+\r\n      'width:84px;height:70px;border:0;border-radius:14px;cursor:pointer;color:#fff;font:800 1.35rem Barlow,Arial,sans-serif;letter-spacing:.04em;line-height:1;'+\r\n      'background:#1a2744;box-shadow:0 6px 16px rgba(26,39,68,.35);transition:transform .15s,box-shadow .15s,background .2s;}'+\r\n      '#pc3d-open svg{width:26px;height:26px;}'+\r\n      '#pc3d-open:hover,#pc3d-open:focus-visible{background:#76a343;transform:translateY(-2px);box-shadow:0 10px 22px rgba(118,163,67,.45);}'+\r\n      '#pc3d-open:focus-visible{outline:3px solid #1a2744;outline-offset:3px;}'+\r\n      '#pc3d-open.pc3d-hint{animation:pc3dPulse 1.6s ease-in-out 3;}'+\r\n      '@keyframes pc3dPulse{0%,100%{box-shadow:0 6px 16px rgba(26,39,68,.35);}50%{box-shadow:0 0 0 8px rgba(118,163,67,.35),0 6px 16px rgba(26,39,68,.35);}}'+\r\n      '@media (prefers-reduced-motion:reduce){#pc3d-open.pc3d-hint{animation:none;}}'+\r\n      \/* Separaci\u00f3n de la paleta m\u00e1s a la derecha (los textos en alem\u00e1n son m\u00e1s largos) y columnas algo m\u00e1s compactas *\/\r\n      '';\r\n    \/\/ Separaci\u00f3n de la paleta m\u00e1s a la derecha (los textos en alem\u00e1n son m\u00e1s largos) y columnas algo m\u00e1s compactas.\r\n    \/\/ Selectores m\u00e1s espec\u00edficos y a\u00f1adidos al final de la p\u00e1gina: as\u00ed prevalecen sobre el CSS del planificador.\r\n    var pal=document.createElement('style');\r\n    pal.textContent='#new-palette > #new-palette-left{flex:0 0 70%!important;}#new-palette > #new-palette-right{flex:1 1 30%!important;min-width:0;}'+\r\n      '#new-palette #new-palette-left #new-area-inputs{width:232px!important;min-width:232px!important;padding:14px 14px!important;}'+\r\n      '#new-palette #npal-table td:nth-child(1),#new-palette #npal-table td:nth-child(2){width:146px!important;}'+\r\n      '#new-palette #npal-table td:nth-child(3){width:118px!important;}'+\r\n      '#new-palette #npal-table td:nth-child(4),#new-palette #npal-table td:nth-child(5){width:54px!important;}'+\r\n      '#new-palette #npal-row-label td:nth-child(4){width:108px!important;}#new-palette #npal-row-label td:nth-child(5){width:160px!important;}'+\r\n      '#new-palette #npal-table #courtDouble,#new-palette #npal-table #courtSingle{width:128px!important;}';\r\n    document.body.appendChild(pal);\r\n    document.head.appendChild(st);\r\n    var b=document.createElement('button');b.type='button';b.id='pc3d-open';\r\n    b.title=de?'Anlage in 3D ansehen':'View your layout in 3D';\r\n    b.innerHTML='<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linejoin=\"round\"><path d=\"M12 2.8 20 7.2v9.6L12 21.2 4 16.8V7.2Z\"\/><path d=\"M4 7.2 12 11.6 20 7.2M12 11.6v9.6\"\/><\/svg><span>3D<\/span>';\r\n    b.addEventListener('click',function(){window.paOpen3D&&window.paOpen3D();});\r\n    var row=document.getElementById('new-btns-row');\r\n    if(row){row.style.alignItems='flex-end';row.appendChild(b);}   \/\/ botones alineados abajo con el 3D\r\n    \/\/ Posici\u00f3n arriba a la izquierda, en la misma l\u00ednea que \u00abMeters | 1 sq = 1 m2\u00bb (a la derecha)\r\n    var cw=document.getElementById('new-coords-wrap'),mi=document.getElementById('new-measure-info');\r\n    if(cw&&mi){\r\n      cw.style.display='flex';cw.style.flexWrap='wrap';cw.style.alignItems='flex-start';cw.style.justifyContent='space-between';cw.style.columnGap='12px';\r\n      mi.style.width='auto';mi.style.order='2';mi.style.marginLeft='auto';mi.style.marginBottom='0';\r\n      mi.style.fontSize='1.05rem';mi.style.whiteSpace='nowrap';mi.style.lineHeight='1.3';   \/\/ m\u00e1s peque\u00f1o: cabe en la l\u00ednea de \u00abPosition\u00bb\r\n      ['new-select-hint','new-coords'].forEach(function(id){var e=document.getElementById(id);if(e){e.style.order='1';}});\r\n      var hint=document.getElementById('new-select-hint'),co=document.getElementById('new-coords');\r\n      if(hint&&co){var box=document.createElement('div');box.style.order='1';hint.parentNode.insertBefore(box,hint);box.appendChild(hint);box.appendChild(co);}\r\n    }\r\n    \/\/ \u00abPosition\u00bb y las cifras en una sola l\u00ednea: el planificador escribe un salto de l\u00ednea entre ambos\r\n    var coEl=document.getElementById('new-coords');\r\n    if(coEl){\r\n      var oneLine=function(){coEl.querySelectorAll('br').forEach(function(br){br.replaceWith(document.createTextNode('\\u00a0 '));});};\r\n      oneLine();new MutationObserver(oneLine).observe(coEl,{childList:true,subtree:true});\r\n    }\r\n    \/\/ Campo de descripci\u00f3n del objeto justo encima de los botones (+90\u00ba\u2026), en su propia l\u00ednea:\r\n    \/\/ no se mueve aunque cambien las cifras de la posici\u00f3n ni empuja los botones\r\n    var tag=document.getElementById('textItemName');\r\n    if(tag&&row&&tag.nextElementSibling!==row){\r\n      row.parentNode.insertBefore(tag,row);\r\n      tag.style.flex='none';tag.style.width='100%';tag.style.maxWidth='240px';tag.style.margin='0 0 8px';\r\n      \/\/ Campo de descripci\u00f3n m\u00e1s corto; si el texto es largo, salta de l\u00ednea y el campo crece (hasta 3 l\u00edneas)\r\n      var inp=document.getElementById('inputItemName');\r\n      if(inp&&inp.tagName==='INPUT'){\r\n        var ta=document.createElement('textarea');\r\n        ta.id=inp.id;ta.name=inp.name;ta.placeholder=inp.placeholder;ta.rows=1;ta.value=inp.value;ta.className=inp.className;\r\n        ta.style.cssText='width:100%;box-sizing:border-box;resize:none;overflow:hidden;line-height:1.35;min-height:30px;height:30px;padding:5px 8px;border:1px solid #cdd4e0;border-radius:7px;font:0.8rem Barlow,Arial,sans-serif;background:#fff;display:block;';\r\n        var grow=function(){\r\n          if(!ta.offsetParent)return;            \/\/ oculto (sin objeto seleccionado): no se mide\r\n          ta.style.height='auto';var sh=ta.scrollHeight;\r\n          ta.style.height=Math.max(30,Math.min(sh+2,66))+'px';ta.style.overflowY=sh>66?'auto':'hidden';\r\n        };\r\n        ta.addEventListener('keydown',function(e){if(e.key==='Enter')e.preventDefault();});   \/\/ sin saltos manuales: solo ajuste autom\u00e1tico\r\n        ta.addEventListener('keyup',function(){padelArea.setDescription(ta);grow();});\r\n        ta.addEventListener('input',grow);\r\n        inp.parentNode.replaceChild(ta,inp);\r\n        \/\/ El planificador rellena el campo al seleccionar otro objeto: se ajusta la altura\r\n        var last=null,wasVis=false;setInterval(function(){var vis=!!ta.offsetParent;if(ta.value!==last||(vis&&!wasVis)){last=ta.value;grow();}wasVis=vis;},300);\r\n        grow();\r\n      }\r\n      tag.style.position='relative';tag.style.zIndex='1';\r\n      \/\/ Los botones verdes son m\u00e1s bajos que el 3D: se ajusta el margen para que el campo quede\r\n      \/\/ pegado justo encima de ellos (8 px), tambi\u00e9n si la fila se parte en dos l\u00edneas\r\n      var fit=function(){\r\n        if(tag.style.display==='none'||!tag.offsetParent)return;\r\n        var first=null;row.querySelectorAll('button').forEach(function(x){if(!first&&x.id!=='pc3d-open'&&x.offsetParent)first=x;});\r\n        if(!first)return;\r\n        var diff=first.getBoundingClientRect().top-row.getBoundingClientRect().top;\r\n        tag.style.marginBottom=Math.round(8-diff)+'px';\r\n      };\r\n      setInterval(fit,400);window.addEventListener('resize',fit);\r\n    }\r\n    else{var bar=document.getElementById('new-topbar');if(bar)bar.appendChild(b);}\r\n    \/\/ Un breve pulso al a\u00f1adir la primera pista, para que el usuario lo descubra\r\n    var shown=false;\r\n    var t=setInterval(function(){\r\n      try{\r\n        if(typeof padelArea!=='undefined'&&padelArea.padelCourts&&padelArea.padelCourts.courts.some(function(c){return c.court==='courtDouble'||c.court==='courtSingle';})){\r\n          if(!shown){shown=true;b.classList.add('pc3d-hint');setTimeout(function(){b.classList.remove('pc3d-hint');},5200);}\r\n          clearInterval(t);\r\n        }\r\n      }catch(e){}\r\n    },800);\r\n  }\r\n  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',addButton);else addButton();\r\n\r\n  window.addEventListener('load',function(){\r\n    if(typeof padelAreaExport==='undefined'||typeof padelForm==='undefined')return;\r\n    var CORNERS=['ax','ay','bx','by','cx','cy','dx','dy'];\r\n    \/\/ Guardar: los pilares se guardan con sus esquinas (antes se perd\u00edan)\r\n    padelAreaExport.saveToFile=function(){\r\n      var fv=padelForm.getFormValues();if(!fv.valid)return;\r\n      var info={measureSystem:fv.measureSystem,areaWidth:fv.areaWidth,areaLen:fv.areaLen,items:[]};\r\n      var o3=window.paGet3DOpts?window.paGet3DOpts():{};info.turfExt=!!o3.turfExt;\r\n      info.view3d=o3;   \/\/ configuraci\u00f3n completa de la vista 3D (tipo de pista, puertas, luces, colores, cubierta\u2026)\r\n      var lg=window.paGetLogos&&window.paGetLogos();if(lg)info.logos=lg;   \/\/ logos del cliente (Logo 1, Logo 2)\r\n      this.padelCourts.courts.forEach(function(pc){\r\n        var it={id:pc.id,court:pc.court,description:pc.description};\r\n        if(window.pcIsDoor&&pcIsDoor(pc)){it.wall=pc.wall;it.pos=pc.pos;it.width=pc.width;}\r\n        else if(pc.court==='areaObstacle'||pc.court==='pillar')CORNERS.forEach(function(k){it[k]=pc[k];});\r\n        else{it.angle=pc.angle;it.x=pc.x;it.y=pc.y;it.w=pc.w;it.h=pc.h;}\r\n        info.items.push(it);\r\n      });\r\n      this.createAndClickDownloadLink('Padelcreations','.padel',new Blob([JSON.stringify(info)],{type:'text\/plain'}));\r\n    };\r\n    \/\/ Cargar: tambi\u00e9n recupera los pilares y actualiza las medidas visibles\r\n    padelAreaExport.loadFromFile=function(input){\r\n      var file=input.files&&input.files[0];if(!file)return;\r\n      var reader=new FileReader();\r\n      reader.onload=function(e){\r\n        try{\r\n          var json=JSON.parse(e.target.result);\r\n          padelForm.setFormValues(json.measureSystem,json.areaWidth,json.areaLen);\r\n          if(json.turfExt!==undefined){var c=document.getElementById('pc-turfext');if(c)c.checked=!!json.turfExt;if(window.paSet3DOpt)window.paSet3DOpt('turfExt',!!json.turfExt);}\r\n          if(json.view3d&&window.paSetAll3DOpts)window.paSetAll3DOpts(json.view3d);\r\n          if(Array.isArray(json.logos)&&window.paSetLogos)window.paSetLogos(json.logos);\r\n          padelArea.initCanvas(new FormValues(json.measureSystem,json.areaWidth,json.areaLen,true));\r\n          padelArea.padelCourts.clear();\r\n          json.items.forEach(function(it){\r\n            if(it.court==='courtDouble'||it.court==='courtSingle'||it.court==='courtTennis')padelArea.padelCourts.addCourt(it.x,it.y,it.w,it.h,it.angle,it.court,it.description);\r\n            else if(it.court==='areaObstacle')padelArea.padelCourts.loadObstacle(it.ax,it.ay,it.bx,it.by,it.cx,it.cy,it.dx,it.dy,it.description);\r\n            else if(it.court==='pillar'&&it.ax!==undefined)padelArea.padelCourts.loadPillar(it.ax,it.ay,it.bx,it.by,it.cx,it.cy,it.dx,it.dy,it.description);\r\n            else if((it.court==='doorEntrance'||it.court==='doorExit')&&window.PadelDoor)padelArea.padelCourts.courts.push(new PadelDoor(it.court,it.wall,it.pos,it.width,it.description));\r\n          });\r\n          var vw=document.getElementById('new-width-input'),vl=document.getElementById('new-len-input');\r\n          if(vw)vw.value=json.areaWidth;if(vl)vl.value=json.areaLen;\r\n          padelArea.drawCourts();\r\n          if(padelArea.updateButtonsVisibility)padelArea.updateButtonsVisibility();\r\n        }catch(err){\r\n          if(window.console)console.log(err);\r\n          var el=document.getElementById('formErrorFileLoad');if(el)el.style.display='block';\r\n        }\r\n        input.value='';\r\n      };\r\n      reader.readAsText(file);\r\n    };\r\n  });\r\n})();\r\n\r\n\/* \u2500\u2500 \u00abLoad from File\u00bb: el selector muestra solo los archivos .padel \u2500\u2500\r\n   Solo en ordenador. En iPad\/iPhone y Android el navegador no conoce la extensi\u00f3n .padel\r\n   y dejar\u00eda todos los archivos en gris, as\u00ed que all\u00ed el selector sigue mostrando todo. *\/\r\nwindow.addEventListener('load',function(){\r\n  var ua=navigator.userAgent||'';\r\n  var touchMac=\/Macintosh\/.test(ua)&&navigator.maxTouchPoints>1;   \/\/ iPadOS se presenta como Mac\r\n  if(\/iPad|iPhone|iPod|Android\/i.test(ua)||touchMac)return;\r\n  var set=function(){\r\n    Array.prototype.forEach.call(document.querySelectorAll('input[type=\"file\"]'),function(el){\r\n      if(\/^pc3d-|^pcq-\/.test(el.id||''))return;   \/\/ campos propios del bloque (logos, archivos del presupuesto)\r\n      var h=(el.getAttribute('onchange')||'')+' '+(el.id||'')+' '+(el.name||'');\r\n      if(\/loadFromFile|load|padel\/i.test(h))el.setAttribute('accept','.padel');\r\n    });\r\n  };\r\n  set();setTimeout(set,1500);\r\n});\r\n\r\n\/* \u2500\u2500 Objetos dimensionables: cambiar el tama\u00f1o arrastrando los lados \u2500\u2500\r\n   Asas azules en el centro de cada lado del objeto seleccionado. Al arrastrar un lado,\r\n   se mueve solo ese lado (perpendicular a s\u00ed mismo) y el opuesto queda fijo.\r\n   Las esquinas siguen funcionando igual. No se aplica a pilares (tama\u00f1o fijo). *\/\r\nwindow.addEventListener('load',function(){\r\n  if(typeof PadelObstable==='undefined'||typeof padelArea==='undefined')return;\r\n  var P=PadelObstable.prototype;\r\n  var EDGES={EDGE_AB:['a','b','c','d'],EDGE_CD:['c','d','a','b'],EDGE_AC:['a','c','b','d'],EDGE_BD:['b','d','a','c']};\r\n  var HANDLE_COLOR='#1d4ed8',HANDLE_LEN=18,HANDLE_W=5;\r\n  function isObstacle(o){return o&&o.court===COURT_OBSTACLE;}\r\n  function mid(o,p,q){return {x:(o[p+'x']+o[q+'x'])\/2,y:(o[p+'y']+o[q+'y'])\/2};}\r\n  function edgeAt(o,p,tol){\r\n    for(var k in EDGES){var e=EDGES[k],m=mid(o,e[0],e[1]);if(Math.abs(m.x-p.x)<tol&&Math.abs(m.y-p.y)<tol)return k;}\r\n    return null;\r\n  }\r\n  var origSet=P.setDrapOp;\r\n  P.setDrapOp=function(p,sel){\r\n    origSet.call(this,p,sel);\r\n    if(isObstacle(this)&&this.dragOp===DRAG_MODE.NONE){var k=edgeAt(this,p,sel*1.6);if(k)this.dragOp=k;}\r\n  };\r\n  var origMove=P.moveOrResizeSelectedCourt;\r\n  P.moveOrResizeSelectedCourt=function(x,y){\r\n    var e=isObstacle(this)&&EDGES[this.dragOp];\r\n    if(!e)return origMove.call(this,x,y);\r\n    this.intersect=false;\r\n    var p=e[0],q=e[1],r=e[2],s=e[3];\r\n    \/\/ Normal unitaria del lado: el desplazamiento se proyecta sobre ella (el lado se mueve en l\u00ednea recta)\r\n    var ex=this[q+'x']-this[p+'x'],ey=this[q+'y']-this[p+'y'],len=Math.hypot(ex,ey)||1;\r\n    var nx=-ey\/len,ny=ex\/len,d=x*nx+y*ny;\r\n    var m1=mid(this,p,q),m2=mid(this,r,s);\r\n    var before=(m1.x-m2.x)*nx+(m1.y-m2.y)*ny,after=before+d;\r\n    var minSize=padelArea.measureSystem==='METRIC'?0.2:0.66;\r\n    \/\/ No se puede cruzar ni colapsar: si se pasa, el lado se queda al tama\u00f1o m\u00ednimo\r\n    if(Math.abs(after)<minSize||Math.sign(after)!==Math.sign(before)){after=Math.sign(before)*minSize;d=after-before;}\r\n    this[p+'x']+=d*nx;this[p+'y']+=d*ny;this[q+'x']+=d*nx;this[q+'y']+=d*ny;\r\n  };\r\n  var origDraw=P.draw;\r\n  P.draw=function(area,corners){\r\n    origDraw.call(this,area,corners);\r\n    if(!isObstacle(this)||!corners||corners.courtId!==this.id)return;\r\n    var ctx=area.ctx,self=this;\r\n    Object.keys(EDGES).forEach(function(k){\r\n      var e=EDGES[k],a=area.scaleToCanvas(self[e[0]+'x'],self[e[0]+'y']),b=area.scaleToCanvas(self[e[1]+'x'],self[e[1]+'y']);\r\n      area.applyOffset(a);area.applyOffset(b);\r\n      var mx=(a.x+b.x)\/2,my=(a.y+b.y)\/2,ang=Math.atan2(b.y-a.y,b.x-a.x);\r\n      ctx.save();ctx.translate(mx,my);ctx.rotate(ang);\r\n      ctx.fillStyle=HANDLE_COLOR;ctx.strokeStyle='#ffffff';ctx.lineWidth=1.5;\r\n      ctx.beginPath();\r\n      if(ctx.roundRect)ctx.roundRect(-HANDLE_LEN\/2,-HANDLE_W\/2,HANDLE_LEN,HANDLE_W,2.5);else ctx.rect(-HANDLE_LEN\/2,-HANDLE_W\/2,HANDLE_LEN,HANDLE_W);\r\n      ctx.fill();ctx.stroke();ctx.restore();\r\n    });\r\n  };\r\n  \/\/ Cursor de redimensionar al pasar por encima de un asa (escritorio)\r\n  var cv=document.getElementById('canvasAreas');\r\n  if(cv)cv.addEventListener('mousemove',function(ev){\r\n    var o=padelArea.padelCourts.selectedCourt,cur='';\r\n    if(isObstacle(o)&&!padelArea.startDragging){\r\n      var xy=padelArea.scaleToArea(ev.offsetX-padelArea.areaX,ev.offsetY-padelArea.areaY);\r\n      var k=edgeAt(o,xy,padelArea.padelCourts.selectionBox*1.6);\r\n      if(k){var e=EDGES[k],horiz=Math.abs(o[e[1]+'x']-o[e[0]+'x'])>=Math.abs(o[e[1]+'y']-o[e[0]+'y']);cur=horiz?'ns-resize':'ew-resize';}\r\n    }\r\n    cv.style.cursor=cur;\r\n  });\r\n  if(padelArea.ctx)padelArea.drawCourts();\r\n});\r\n\r\n\/* \u2500\u2500 Girar pistas (dobles e individuales) y objetos dimensionables con un asa de rotaci\u00f3n \u2500\u2500\r\n   Al seleccionar una pista u objeto aparece un asa redonda con flechas por fuera del lado superior.\r\n   Arrastr\u00e1ndola, gira alrededor de su centro. Las pistas giran en pasos de 5\u00b0 (como los antiguos\r\n   botones); los objetos, libremente. El \u00e1ngulo se muestra junto al asa. Sustituye a los botones\r\n   +90\u00ba \/ +5\u00ba \/ \u22125\u00ba, que se ocultan (siguen en el c\u00f3digo porque el planificador los usa). *\/\r\nwindow.addEventListener('load',function(){\r\n  if(typeof PadelObstable==='undefined'||typeof PadelCourt==='undefined'||typeof padelArea==='undefined')return;\r\n  var KEYS=['a','b','c','d'],GAP=30,R=11,STEP=5;\r\n  var st=document.createElement('style');\r\n  st.textContent='#buttonRotate90,#buttonRotate5,#buttonRotate_5{display:none!important;}';\r\n  document.head.appendChild(st);\r\n  function isObstacle(o){return o&&o.court===COURT_OBSTACLE;}\r\n  function isCourt(o){return o&&(o.court==='courtDouble'||o.court==='courtSingle'||o.court==='courtTennis');}\r\n  function rotatable(o){return isObstacle(o)||isCourt(o);}\r\n  function center(o){\r\n    if(isCourt(o))return {x:o.x+o.w\/2,y:o.y+o.h\/2};\r\n    return {x:(o.ax+o.bx+o.cx+o.dx)\/4,y:(o.ay+o.by+o.cy+o.dy)\/4};\r\n  }\r\n  function rotateCorners(o,deg,c){\r\n    c=c||center(o);var r=deg*Math.PI\/180,cs=Math.cos(r),sn=Math.sin(r);\r\n    KEYS.forEach(function(k){var x=o[k+'x']-c.x,y=o[k+'y']-c.y;o[k+'x']=c.x+x*cs-y*sn;o[k+'y']=c.y+x*sn+y*cs;});\r\n  }\r\n  function norm(a){a=Math.round(a);return ((a%360)+540)%360-180;}\r\n  \/\/ Asa: por fuera del lado A-B (el \u00absuperior\u00bb del objeto o de la pista), alej\u00e1ndose del centro\r\n  function handlePos(o){\r\n    var k=o.getCurtCorners(),c=center(o);\r\n    var a=padelArea.scaleToCanvas(k.A.x,k.A.y),b=padelArea.scaleToCanvas(k.B.x,k.B.y),cc=padelArea.scaleToCanvas(c.x,c.y);\r\n    [a,b,cc].forEach(function(p){padelArea.applyOffset(p);});\r\n    var mx=(a.x+b.x)\/2,my=(a.y+b.y)\/2,vx=mx-cc.x,vy=my-cc.y,l=Math.hypot(vx,vy)||1;\r\n    var h={mx:mx,my:my,x:mx+vx\/l*GAP,y:my+vy\/l*GAP};\r\n    \/\/ Si el asa se saldr\u00eda del plano (pista pegada a una pared), se coloca en el lado opuesto\r\n    var cw=padelArea.canvas?padelArea.canvas.width:1e9,ch=padelArea.canvas?padelArea.canvas.height:1e9,m=R+2;\r\n    if(h.x<m||h.y<m||h.x>cw-m||h.y>ch-m){\r\n      var mx2=2*cc.x-mx,my2=2*cc.y-my;h={mx:mx2,my:my2,x:mx2-vx\/l*GAP,y:my2-vy\/l*GAP};\r\n    }\r\n    return h;\r\n  }\r\n  function drawHandle(o){\r\n    var h=handlePos(o),ctx=padelArea.ctx;\r\n    ctx.save();\r\n    ctx.strokeStyle='#1d4ed8';ctx.lineWidth=1.5;ctx.setLineDash([3,3]);\r\n    ctx.beginPath();ctx.moveTo(h.mx,h.my);ctx.lineTo(h.x,h.y);ctx.stroke();ctx.setLineDash([]);\r\n    ctx.fillStyle='#ffffff';ctx.lineWidth=2;ctx.beginPath();ctx.arc(h.x,h.y,R,0,Math.PI*2);ctx.fill();ctx.stroke();\r\n    ctx.lineWidth=1.8;ctx.beginPath();ctx.arc(h.x,h.y,5.5,-Math.PI*0.15,Math.PI*1.35);ctx.stroke();\r\n    var ea=Math.PI*1.35,ex=h.x+5.5*Math.cos(ea),ey=h.y+5.5*Math.sin(ea);\r\n    ctx.fillStyle='#1d4ed8';ctx.beginPath();ctx.moveTo(ex-3.2,ey-1.2);ctx.lineTo(ex+2.6,ey-2.8);ctx.lineTo(ex+0.6,ey+3);ctx.closePath();ctx.fill();\r\n    if(o._rotating){\r\n      var t=isCourt(o)?norm(o.angle):norm(o._rotTotal||0);\r\n      var label=(t>0?'+':'')+t+'\u00b0';\r\n      ctx.font='bold 13px Arial';var w=ctx.measureText(label).width;\r\n      ctx.fillStyle='rgba(255,255,255,.85)';ctx.fillRect(h.x+R+3,h.y-10,w+6,17);\r\n      ctx.fillStyle='#1d4ed8';ctx.fillText(label,h.x+R+6,h.y+3);\r\n    }\r\n    ctx.restore();\r\n  }\r\n  window.pcDrawRotHandle=function(o){if(rotatable(o))drawHandle(o);};   \/\/ para redibujarla encima del aviso de choque\r\n  [PadelObstable.prototype,PadelCourt.prototype].forEach(function(P){\r\n    var origDraw=P.draw;\r\n    P.draw=function(area,corners){\r\n      origDraw.call(this,area,corners);\r\n      if(area===padelArea&&rotatable(this)&&corners&&corners.courtId===this.id)drawHandle(this);\r\n    };\r\n    var origMove=P.moveOrResizeSelectedCourt;\r\n    P.moveOrResizeSelectedCourt=function(x,y){\r\n      if(this.dragOp!=='ROTATE_PC')return origMove.call(this,x,y);\r\n      var c=this._rotCenter,p0=padelArea.startDragging;if(!c||!p0)return;\r\n      var a0=Math.atan2(p0.y-c.y,p0.x-c.x),a1=Math.atan2(p0.y+y-c.y,p0.x+x-c.x),d=(a1-a0)*180\/Math.PI;\r\n      if(d>180)d-=360;if(d<-180)d+=360;\r\n      this._rotTotal=(this._rotTotal||0)+d;\r\n      if(isCourt(this)){\r\n        \/\/ Pistas: en pasos de 5\u00b0\r\n        this.angle=this._rotStart+Math.round(this._rotTotal\/STEP)*STEP;\r\n      }else{\r\n        rotateCorners(this,d,c);\r\n      }\r\n    };\r\n  });\r\n  var TOUCH=('ontouchstart' in window)||navigator.maxTouchPoints>0;\r\n  function nearHandle(o,ev){var h=handlePos(o);return Math.hypot(ev.offsetX-h.x,ev.offsetY-h.y)<=R+(TOUCH?16:8);}\r\n  var origDown=padelArea.mouseDown.bind(padelArea);\r\n  padelArea.mouseDown=function(ev){\r\n    var o=this.padelCourts.selectedCourt;\r\n    if(rotatable(o)&&ev&&nearHandle(o,ev)){\r\n      o.dragOp='ROTATE_PC';o._rotating=true;o._rotTotal=0;o._rotCenter=center(o);o._rotStart=o.angle||0;\r\n      this.startDragging=this.scaleToArea(ev.offsetX-this.areaX,ev.offsetY-this.areaY);\r\n      this.drawCourts();return;\r\n    }\r\n    return origDown(ev);\r\n  };\r\n  var origUp=padelArea.mouseUp.bind(padelArea);\r\n  padelArea.mouseUp=function(ev){\r\n    var o=this.padelCourts.selectedCourt;\r\n    if(rotatable(o)&&o._rotating){\r\n      o._rotating=false;o.dragOp=DRAG_MODE.NONE;\r\n      \/\/ Clic simple en el asa (sin arrastrar): gira 90\u00b0. Muchos usuarios hacen clic en lugar de arrastrar.\r\n      if(Math.abs(o._rotTotal||0)<1){\r\n        if(isCourt(o))o.angle=(o._rotStart||0)+90;else rotateCorners(o,90);\r\n      }\r\n      if(isCourt(o))o.angle=norm(o.angle);\r\n      this.drawCourts();\r\n    }\r\n    return origUp(ev);\r\n  };\r\n  \/\/ Los botones (ocultos) siguen funcionando tambi\u00e9n con objetos, por compatibilidad\r\n  var origRot=padelArea.rotateAngle.bind(padelArea);\r\n  padelArea.rotateAngle=function(deg){\r\n    var o=this.padelCourts.selectedCourt;\r\n    if(isObstacle(o)){rotateCorners(o,deg);this.drawCourts();return;}\r\n    return origRot(deg);\r\n  };\r\n  var cv=document.getElementById('canvasAreas');\r\n  if(cv)cv.addEventListener('mousemove',function(ev){\r\n    var o=padelArea.padelCourts.selectedCourt;\r\n    if(rotatable(o)&&(o._rotating||(!padelArea.startDragging&&nearHandle(o,ev))))cv.style.cursor=o._rotating?'grabbing':'grab';\r\n  });\r\n  if(padelArea.ctx)padelArea.drawCourts();\r\n});\r\n\r\n\/* \u2500\u2500 Puertas de entrada y salidas de emergencia (elementos nuevos del plano) \u2500\u2500\r\n   Se colocan siempre sobre una pared del \u00e1rea y se deslizan por ella; al arrastrar,\r\n   saltan a la pared m\u00e1s cercana. Entrada: puerta doble de 2,0 m. Emergencia: 1,2 m.\r\n   Ancho ajustable arrastrando sus extremos. Se guardan en el archivo .padel y se ven\r\n   en la vista 3D (solo en interior). *\/\r\nvar PC_DOOR_TYPES={doorEntrance:{w:2.0,color:'#1a2744'},doorExit:{w:1.2,color:'#16a34a'}};\r\nfunction pcIsDoor(o){return !!(o&&PC_DOOR_TYPES[o.court]);}\r\nwindow.addEventListener('load',function(){\r\n  if(typeof PadelObstable==='undefined'||typeof padelArea==='undefined')return;\r\n  var de=(document.documentElement.lang||'').substring(0,2).toLowerCase()==='de';\r\n  var unit=function(){return padelArea.measureSystem==='METRIC'?1:3.28084;};\r\n  var seq=0;\r\n  class PadelDoor extends PadelObstable{\r\n    constructor(type,wall,pos,width,description){\r\n      super(0,0,1,1,description||'');\r\n      this.court=type;this.wall=wall;this.pos=pos;this.width=width;this.id='door-'+Date.now()+'-'+(++seq);\r\n      this.isDoor=true;this.sync();\r\n    }\r\n    dims(a){a=a||padelArea;return {W:a.measureWidth,H:a.measureHeight};}\r\n    depth(){return Math.max(0.6*unit(),this.court==='doorExit'?0:this.width\/2);}\r\n    sync(){\r\n      var d=this.dims(),h=this.width\/2,dp=this.depth(),p1=this.pos-h,p2=this.pos+h;\r\n      var r={T:[p1,0,p2,0,p1,dp,p2,dp],B:[p1,d.H-dp,p2,d.H-dp,p1,d.H,p2,d.H],\r\n             L:[0,p1,dp,p1,0,p2,dp,p2],R:[d.W-dp,p1,d.W,p1,d.W-dp,p2,d.W,p2]}[this.wall];\r\n      this.ax=r[0];this.ay=r[1];this.bx=r[2];this.by=r[3];this.cx=r[4];this.cy=r[5];this.dx=r[6];this.dy=r[7];\r\n    }\r\n    \/\/ Pared m\u00e1s cercana a un punto y posici\u00f3n a lo largo de ella (sin salirse de la pared)\r\n    place(p){\r\n      var d=this.dims(),cand=[['T',p.y,p.x,d.W],['B',d.H-p.y,p.x,d.W],['L',p.x,p.y,d.H],['R',d.W-p.x,p.y,d.H]];\r\n      cand.sort(function(a,b){return a[1]-b[1];});\r\n      var c=cand[0],h=this.width\/2;\r\n      this.wall=c[0];this.pos=Math.min(Math.max(c[2],h),c[3]-h);this.sync();\r\n    }\r\n    ends(){return this.wall==='T'||this.wall==='B'?['x',this.pos-this.width\/2,this.pos+this.width\/2]:['y',this.pos-this.width\/2,this.pos+this.width\/2];}\r\n    setDrapOp(p,sel){\r\n      this.dragOp=DRAG_MODE.NONE;var e=this.ends(),along=p[e[0]],tol=Math.min(sel*1.6,this.width*0.22);   \/\/ el centro siempre sirve para mover\r\n      var onWall=this.checkInside(p);\r\n      if(onWall&&Math.abs(along-e[1])<tol)this.dragOp='DOOR_END_1';\r\n      else if(onWall&&Math.abs(along-e[2])<tol)this.dragOp='DOOR_END_2';\r\n    }\r\n    moveOrResizeSelectedCourt(dx,dy){\r\n      var p0=padelArea.startDragging;if(!p0)return;\r\n      var p={x:p0.x+dx,y:p0.y+dy};\r\n      if(this.dragOp==='DOOR_END_1'||this.dragOp==='DOOR_END_2'){\r\n        var e=this.ends(),along=p[e[0]],fixed=this.dragOp==='DOOR_END_1'?e[2]:e[1];\r\n        var d=this.dims(),len=(this.wall==='T'||this.wall==='B')?d.W:d.H,minW=0.8*unit();\r\n        along=Math.min(Math.max(along,0),len);\r\n        var w=Math.abs(fixed-along);if(w<minW)return;\r\n        this.width=w;this.pos=(fixed+along)\/2;this.sync();return;\r\n      }\r\n      this.place(p);\r\n    }\r\n    draw(area,corners){\r\n      var self=this,sel=corners&&corners.courtId===this.id,ctx=area.ctx,t=PC_DOOR_TYPES[this.court];\r\n      var W=area.measureWidth,H=area.measureHeight,h=this.width\/2;\r\n      var pt=function(x,y){var q=area.scaleToCanvas(x,y);area.applyOffset(q);return q;};\r\n      var seg={T:[[this.pos-h,0],[this.pos+h,0],[0,1]],B:[[this.pos-h,H],[this.pos+h,H],[0,-1]],\r\n               L:[[0,this.pos-h],[0,this.pos+h],[1,0]],R:[[W,this.pos-h],[W,this.pos+h],[-1,0]]}[this.wall];\r\n      var P1=pt(seg[0][0],seg[0][1]),P2=pt(seg[1][0],seg[1][1]),n=seg[2];\r\n      var L=Math.hypot(P2.x-P1.x,P2.y-P1.y),ux=(P2.x-P1.x)\/(L||1),uy=(P2.y-P1.y)\/(L||1);\r\n      ctx.save();\r\n      \/\/ Hueco en la pared\r\n      ctx.strokeStyle='#ffffff';ctx.lineWidth=7;ctx.beginPath();ctx.moveTo(P1.x,P1.y);ctx.lineTo(P2.x,P2.y);ctx.stroke();\r\n      ctx.strokeStyle=t.color;ctx.fillStyle=t.color;ctx.lineWidth=2;\r\n      var leaf=function(H0,dir,r){   \/\/ hoja abierta 90\u00b0 hacia dentro + arco de giro\r\n        var ex=H0.x+n[0]*r,ey=H0.y+n[1]*r;\r\n        ctx.beginPath();ctx.moveTo(H0.x,H0.y);ctx.lineTo(ex,ey);ctx.stroke();\r\n        var a0=Math.atan2(n[1],n[0]),a1=Math.atan2(dir*uy,dir*ux);\r\n        ctx.save();ctx.setLineDash([4,3]);ctx.lineWidth=1.2;ctx.beginPath();\r\n        var diff=a1-a0;while(diff>Math.PI)diff-=2*Math.PI;while(diff<-Math.PI)diff+=2*Math.PI;\r\n        ctx.arc(H0.x,H0.y,r,a0,a0+diff,diff<0);ctx.stroke();ctx.restore();\r\n      };\r\n      if(this.court==='doorEntrance'){leaf(P1,1,L\/2);leaf(P2,-1,L\/2);}\r\n      else{\r\n        \/\/ Salida de emergencia: s\u00edmbolo simple, l\u00ednea verde en la pared (abre hacia fuera, en sentido de evacuaci\u00f3n)\r\n        ctx.lineWidth=5;ctx.lineCap='butt';ctx.beginPath();ctx.moveTo(P1.x,P1.y);ctx.lineTo(P2.x,P2.y);ctx.stroke();\r\n      }\r\n      \/\/ Jambas\r\n      if(this.court==='doorEntrance')[P1,P2].forEach(function(q){ctx.beginPath();ctx.moveTo(q.x-n[0]*4,q.y-n[1]*4);ctx.lineTo(q.x+n[0]*5,q.y+n[1]*5);ctx.lineWidth=3;ctx.stroke();});\r\n      \/\/ Etiqueta\r\n      \/\/ Textos fuera del arco de giro: primero el ancho y, m\u00e1s lejos de la pared, el tipo y la descripci\u00f3n\r\n      var off=(this.court==='doorEntrance'?L\/2:0)+10,mx=(P1.x+P2.x)\/2,my=(P1.y+P2.y)\/2;\r\n      var lab=this.court==='doorExit'?'EXIT':(de?'EINGANG':'ENTRANCE');\r\n      var lines=this.court==='doorExit'?[[lab,'bold 10px Arial',t.color],[this.width.toFixed(2),'10px Arial','#6b7280']]:[[this.width.toFixed(2),'10px Arial','#6b7280'],[lab,'bold 10px Arial',t.color]];\r\n      if(this.description)lines.push([this.description,'10px Arial',t.color]);\r\n      ctx.textAlign=n[0]>0?'left':(n[0]<0?'right':'center');ctx.textBaseline='middle';\r\n      lines.forEach(function(ln,k){\r\n        var d=off+k*12,x=mx+n[0]*(n[0]?off:0),y=n[1]?my+n[1]*d:my+(k-(lines.length-1)\/2)*12;\r\n        ctx.font=ln[1];ctx.fillStyle=ln[2];ctx.fillText(ln[0],x,y);\r\n      });\r\n      if(sel){\r\n        var A=pt(this.ax,this.ay),B=pt(this.bx,this.by),C=pt(this.cx,this.cy),D=pt(this.dx,this.dy);\r\n        ctx.strokeStyle='red';ctx.lineWidth=1.5;ctx.setLineDash([4,3]);\r\n        ctx.beginPath();ctx.moveTo(A.x,A.y);ctx.lineTo(B.x,B.y);ctx.lineTo(D.x,D.y);ctx.lineTo(C.x,C.y);ctx.closePath();ctx.stroke();ctx.setLineDash([]);\r\n        ctx.fillStyle='#1d4ed8';ctx.strokeStyle='#fff';\r\n        [P1,P2].forEach(function(q){ctx.beginPath();ctx.arc(q.x+n[0]*3,q.y+n[1]*3,5,0,Math.PI*2);ctx.fill();ctx.stroke();});\r\n      }\r\n      ctx.restore();\r\n    }\r\n  }\r\n  window.PadelDoor=PadelDoor;\r\n\r\n  \/\/ Alta de puertas desde la paleta (arrastrar o \u00ab+\u00bb)\r\n  var origAdd=padelArea.addDropCourt.bind(padelArea);\r\n  padelArea.addDropCourt=function(xy,id){\r\n    var type={areaDoorEntrance:'doorEntrance',areaDoorExit:'doorExit'}[id];\r\n    if(!type)return origAdd(xy,id);\r\n    var d=new PadelDoor(type,'T',0,PC_DOOR_TYPES[type].w*unit());d.place(xy);\r\n    this.padelCourts.courts.push(d);this.padelCourts.selectedCourt=d;\r\n    this.drawCourts();if(this.updateButtonsVisibility)this.updateButtonsVisibility();\r\n  };\r\n  \/\/ Duplicar una puerta: misma pared, al lado\r\n  var origDup=padelArea.duplicateCourt.bind(padelArea);\r\n  padelArea.duplicateCourt=function(){\r\n    var o=this.padelCourts.selectedCourt;\r\n    if(!pcIsDoor(o))return origDup();\r\n    var d=new PadelDoor(o.court,o.wall,o.pos,o.width,o.description);\r\n    var len=(o.wall==='T'||o.wall==='B')?this.measureWidth:this.measureHeight;\r\n    d.pos=Math.min(o.pos+o.width+0.5*unit(),len-o.width\/2);if(d.pos-o.pos<o.width)d.pos=Math.max(o.pos-o.width-0.5*unit(),o.width\/2);\r\n    d.sync();this.padelCourts.courts.push(d);this.padelCourts.selectedCourt=d;this.drawCourts();\r\n    if(this.updateButtonsVisibility)this.updateButtonsVisibility();\r\n  };\r\n  \/\/ Si cambian las medidas del \u00e1rea, las puertas se recolocan sobre sus paredes\r\n  var origDraw=padelArea.drawCourts.bind(padelArea);\r\n  padelArea.drawCourts=function(){\r\n    (this.padelCourts.courts||[]).forEach(function(c){if(pcIsDoor(c)){var len=(c.wall==='T'||c.wall==='B')?padelArea.measureWidth:padelArea.measureHeight;c.pos=Math.min(Math.max(c.pos,c.width\/2),len-c.width\/2);c.sync();}});\r\n    return origDraw();\r\n  };\r\n\r\n  \/\/ Paleta: dos celdas nuevas \u00abDoors\u00bb (entrada \/ emergencia), igual que \u00abPillars\u00bb\r\n  var icon=function(color,exit){\r\n    var s=exit\r\n      ?'<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 60 44\"><rect x=\"0\" y=\"10\" width=\"60\" height=\"4\" fill=\"#1a2744\"\/><rect x=\"12\" y=\"8\" width=\"36\" height=\"8\" fill=\"#fff\"\/><rect x=\"12\" y=\"9\" width=\"36\" height=\"6\" fill=\"'+color+'\"\/><text x=\"30\" y=\"30\" text-anchor=\"middle\" font-family=\"Arial\" font-weight=\"700\" font-size=\"10\" fill=\"'+color+'\">EXIT<\/text><\/svg>'\r\n      :'<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 60 44\"><rect x=\"0\" y=\"2\" width=\"60\" height=\"4\" fill=\"#1a2744\"\/><rect x=\"6\" y=\"1\" width=\"48\" height=\"6\" fill=\"#fff\"\/><path d=\"M6 4v24M54 4v24\" stroke=\"'+color+'\" stroke-width=\"3\"\/><path d=\"M6 28A24 24 0 0 0 30 4M54 28A24 24 0 0 1 30 4\" fill=\"none\" stroke=\"'+color+'\" stroke-width=\"1.6\" stroke-dasharray=\"4 3\"\/><\/svg>';\r\n    return 'data:image\/svg+xml;charset=utf-8,'+encodeURIComponent(s);\r\n  };\r\n  var rl=document.getElementById('npal-row-label'),ri=document.getElementById('npal-row-img'),rb=document.getElementById('npal-row-btn');\r\n  if(rl&&ri&&rb&&!document.getElementById('areaDoorEntrance')){\r\n    var st=document.createElement('style');\r\n    st.textContent='#new-palette #npal-table td:nth-child(6),#new-palette #npal-table td:nth-child(7){width:78px!important;}#npal-row-img img.pc-door-ico{width:60px!important;height:44px!important;margin:0 auto!important;cursor:grab;}';\r\n    document.head.appendChild(st);\r\n    var th=document.createElement('td');th.className='npal-td npal-td-label';th.colSpan=2;th.textContent=de?'T\u00fcren':'Doors';rl.appendChild(th);\r\n    [['areaDoorEntrance',de?'Eingang 2 m':'Entrance 2 m',icon('#1a2744',false)],['areaDoorExit',de?'Notausgang 1,2 m':'Exit 1.2 m',icon('#16a34a',true)]].forEach(function(it){\r\n      var td=document.createElement('td');td.className='npal-td npal-td-img';\r\n      td.innerHTML='<div class=\"npal-pillar-size\">'+it[1]+'<\/div>';\r\n      var img=document.createElement('img');img.id=it[0];img.src=it[2];img.alt=it[1];img.className='padel-area-form-img pc-door-ico';img.draggable=true;\r\n      img.addEventListener('dragstart',function(ev){padelArea.drag(ev);});\r\n      td.appendChild(img);ri.appendChild(td);\r\n      var tb=document.createElement('td');tb.className='npal-td npal-td-btn';\r\n      var b=document.createElement('button');b.className='nadd-btn';b.type='button';b.textContent='\uff0b';b.setAttribute('aria-label',it[1]);\r\n      b.addEventListener('click',function(){var w=padelArea.measureWidth;padelArea.addDropCourt({x:w\/2,y:0},it[0]);});\r\n      tb.appendChild(b);rb.appendChild(tb);\r\n      \/\/ Arrastrar en pantallas t\u00e1ctiles\r\n      img.addEventListener('touchend',function(ev){\r\n        var t=ev.changedTouches[0],cv=document.getElementById('canvasAreas');if(!cv)return;\r\n        var r=cv.getBoundingClientRect();if(t.clientX<r.left||t.clientX>r.right||t.clientY<r.top||t.clientY>r.bottom)return;\r\n        ev.preventDefault();\r\n        padelArea.addDropCourt(padelArea.scaleToArea(t.clientX-r.left-padelArea.areaX,t.clientY-r.top-padelArea.areaY),it[0]);\r\n      },{passive:false});\r\n    });\r\n    \/\/ Casilla \u00abExtensi\u00f3n de c\u00e9sped 8\u00d72 m\u00bb junto a las puertas (afecta a la vista 3D, la oferta y el archivo)\r\n    var eh=document.createElement('td');eh.className='npal-td npal-td-label';eh.textContent=de?'Auslaufzone':'Extension';rl.appendChild(eh);\r\n    var ei=document.createElement('td');ei.className='npal-td npal-td-img';ei.id='pc-turfext-cell';\r\n    \/\/ Texto en la fila de im\u00e1genes y casilla abajo, en la misma fila que los \u00ab+\u00bb\r\n    ei.innerHTML='<label class=\"pc-ext\" for=\"pc-turfext\">'+(de?'Rasen-Auslaufzone 8\u00d72 m':'Turf extension 8\u00d72 m')+'<\/label>';\r\n    ri.appendChild(ei);\r\n    var eb=document.createElement('td');eb.className='npal-td npal-td-btn';eb.id='pc-turfext-btn';\r\n    eb.innerHTML='<input type=\"checkbox\" id=\"pc-turfext\" aria-label=\"'+(de?'Rasen-Auslaufzone 8\u00d72 m':'Turf extension 8\u00d72 m')+'\">';\r\n    rb.appendChild(eb);\r\n    var es=document.createElement('style');\r\n    es.textContent='#new-palette #npal-table td#pc-turfext-cell{width:92px!important;white-space:normal!important;vertical-align:middle!important;}'+\r\n      '.pc-ext{display:block;cursor:pointer;font:600 10.5px Barlow,Arial,sans-serif;color:#4a5a7a;line-height:1.25;text-align:center;}'+\r\n      '#pc-turfext-btn{text-align:center!important;vertical-align:middle!important;}'+\r\n      '#pc-turfext{width:20px;height:20px;accent-color:#76a343;cursor:pointer;margin:0 auto;display:block;}';\r\n    document.body.appendChild(es);\r\n    var cb=document.getElementById('pc-turfext');\r\n    cb.addEventListener('change',function(){if(window.paSet3DOpt)window.paSet3DOpt('turfExt',cb.checked);});\r\n  }\r\n  if(padelArea.ctx)padelArea.drawCourts();\r\n});\r\n\r\n\/* \u2500\u2500 Funciones reservadas mientras la herramienta est\u00e1 bloqueada \u2500\u2500\r\n   Sin c\u00f3digo de acceso (o de distribuidor): no se puede guardar\/cargar archivos, usar los \u00ab+\u00bb\r\n   de la paleta, \u00abDuplicate\u00bb ni \u00abRemove\u00bb, exportar im\u00e1genes (2D y capturas 3D) ni cambiar la configuraci\u00f3n\r\n   en la vista 3D. Ver el plano en 3D y \u00abAsk for a quote\u00bb siguen libres.\r\n   El desbloqueo lo guarda el widget de desbloqueo en la sesi\u00f3n del navegador. *\/\r\n(function(){\r\n  var KEY='pc_tools_unlocked';\r\n  var LOCKED=['#new-topbar [onclick*=\"saveToFile\"]','#new-topbar [onclick*=\"openFromFile\"]','#new-topbar [onclick*=\"paModernExport\"]',\r\n              '.nadd-btn','#buttonDuplicate','#buttonDelete','#pc3d-shot','#pc3d-ai','#pc3d-overlay .pc3d-grp button',\r\n              '#npal-row-img [draggable=\"true\"]','#pc-turfext-cell label','#pc-turfext'];\r\n  \/\/ Elementos de la paleta que se arrastran al plano (pistas, objeto, pilares, puertas)\r\n  var DRAG_SRC='#npal-row-img [draggable=\"true\"],#courtDouble,#courtSingle,#areaObstacle,#areaPillar60,#areaPillar40,#areaDoorEntrance,#areaDoorExit';\r\n  var de=(document.documentElement.lang||'').substring(0,2).toLowerCase()==='de';\r\n  var T=de?{msg:'\ud83d\udd12 Diese Funktion ist mit Ihrem Zugangscode verf\u00fcgbar.',btn:'Freischalten',close:'Schliessen'}\r\n          :{msg:'\ud83d\udd12 This function is available with your access code.',btn:'Unlock',close:'Close'};\r\n  function unlocked(){try{return sessionStorage.getItem(KEY)==='1';}catch(e){return false;}}\r\n  window.pcToolsUnlocked=unlocked;\r\n  var css=document.createElement('style');\r\n  css.textContent=LOCKED.map(function(s){return 'body.pc-tools-locked '+s;}).join(',')+'{opacity:.5;cursor:not-allowed!important;filter:grayscale(.35);}'+\r\n    '#pc-lock-toast{position:fixed;inset:0;z-index:10030;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(10,20,40,.55);}'+\r\n    '#pc-lock-toast[hidden]{display:none;}'+\r\n    '#pc-lock-toast .pc-lock-card{background:#fff;color:#1a2744;border-radius:16px;box-shadow:0 24px 60px rgba(0,0,0,.35);max-width:420px;width:100%;padding:26px 24px 22px;text-align:center;font-family:Barlow,Arial,sans-serif;animation:pcLockIn .18s ease;}'+\r\n    '@keyframes pcLockIn{from{opacity:0;transform:scale(.94);}to{opacity:1;transform:none;}}'+\r\n    '@media (prefers-reduced-motion:reduce){#pc-lock-toast .pc-lock-card{animation:none;}}'+\r\n    '#pc-lock-toast .pc-lock-ico{width:56px;height:56px;margin:0 auto 12px;border-radius:50%;background:#1a2744;color:#fff;display:grid;place-items:center;font-size:26px;}'+\r\n    '#pc-lock-toast .pc-lock-msg{font-size:17px;font-weight:700;line-height:1.4;margin:0 0 18px;}'+\r\n    '#pc-lock-toast .pc-lock-btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;}'+\r\n    '#pc-lock-toast button{border:0;border-radius:10px;font:700 14px Barlow,Arial,sans-serif;padding:11px 22px;cursor:pointer;}'+\r\n    '#pc-lock-toast .pc-lock-go{background:#76a343;color:#fff;}#pc-lock-toast .pc-lock-go:hover{background:#5f8c32;}'+\r\n    '#pc-lock-toast .pc-lock-x{background:#eef1f8;color:#1a2744;}#pc-lock-toast .pc-lock-x:hover{background:#dde3ee;}'+\r\n    '#pc-lock-toast button:focus-visible{outline:3px solid #1a2744;outline-offset:2px;}';\r\n  document.head.appendChild(css);\r\n  var toast;\r\n  function goUnlock(){\r\n    lastFocus=null;hide();\r\n    var ov=document.getElementById('pc3d-overlay');\r\n    if(ov&&!ov.hidden){var c=document.getElementById('pc3d-close');if(c)c.click();}\r\n    var sb=document.getElementById('show-password-section');\r\n    if(sb&&sb.style.display!=='none')sb.click();\r\n    var tgt=document.getElementById('password-wrapper')||document.querySelector('.unlock')||sb;\r\n    if(tgt)tgt.scrollIntoView({behavior:'smooth',block:'center'});\r\n    setTimeout(function(){var i=document.getElementById('unlock-password');if(i)i.focus();},600);\r\n  }\r\n  var lastFocus=null;\r\n  function hide(){if(toast&&!toast.hidden){toast.hidden=true;if(lastFocus&&lastFocus.focus)lastFocus.focus();}}\r\n  function show(){\r\n    if(!toast){\r\n      \/\/ Ventana emergente en el centro de la pantalla, junto a la herramienta\r\n      toast=document.createElement('div');toast.id='pc-lock-toast';\r\n      toast.innerHTML='<div class=\"pc-lock-card\" role=\"alertdialog\" aria-modal=\"true\" aria-labelledby=\"pc-lock-msg\"><div class=\"pc-lock-ico\" aria-hidden=\"true\">\ud83d\udd12<\/div><p class=\"pc-lock-msg\" id=\"pc-lock-msg\"><\/p><div class=\"pc-lock-btns\"><button type=\"button\" class=\"pc-lock-go\"><\/button><button type=\"button\" class=\"pc-lock-x\"><\/button><\/div><\/div>';\r\n      toast.querySelector('.pc-lock-msg').textContent=T.msg.replace('\ud83d\udd12 ','');\r\n      toast.querySelector('.pc-lock-go').textContent=T.btn;toast.querySelector('.pc-lock-x').textContent=T.close;\r\n      toast.querySelector('.pc-lock-go').addEventListener('click',goUnlock);toast.querySelector('.pc-lock-x').addEventListener('click',hide);\r\n      toast.addEventListener('click',function(e){if(e.target===toast)hide();});\r\n      document.addEventListener('keydown',function(e){if(e.key==='Escape'&&toast&&!toast.hidden){e.stopImmediatePropagation();hide();}},true);\r\n      document.body.appendChild(toast);\r\n    }\r\n    lastFocus=document.activeElement;\r\n    toast.hidden=false;\r\n    toast.querySelector('.pc-lock-go').focus();\r\n  }\r\n  \/\/ Se intercepta en fase de captura: el clic no llega a la funci\u00f3n del bot\u00f3n\r\n  document.addEventListener('click',function(ev){\r\n    if(unlocked())return;\r\n    var t=ev.target&&ev.target.closest&&ev.target.closest(LOCKED.join(','));\r\n    if(!t)return;\r\n    ev.preventDefault();ev.stopPropagation();if(ev.stopImmediatePropagation)ev.stopImmediatePropagation();\r\n    show();\r\n  },true);\r\n  \/\/ Arrastrar desde la paleta (rat\u00f3n y pantallas t\u00e1ctiles) tambi\u00e9n queda reservado\r\n  function blockDrag(ev){\r\n    if(unlocked())return;\r\n    var t=ev.target&&ev.target.closest&&ev.target.closest(DRAG_SRC);\r\n    if(!t)return;\r\n    ev.preventDefault();ev.stopPropagation();if(ev.stopImmediatePropagation)ev.stopImmediatePropagation();\r\n    if(ev.type==='dragstart'||ev.type==='touchstart')show();\r\n  }\r\n  document.addEventListener('dragstart',blockDrag,true);\r\n  ['touchstart','touchmove','touchend'].forEach(function(t){document.addEventListener(t,blockDrag,{capture:true,passive:false});});\r\n  function mark(){document.body&&document.body.classList.toggle('pc-tools-locked',!unlocked());}\r\n  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',mark);else mark();\r\n  setInterval(mark,800);\r\n})();\r\n\r\n\/* \u2500\u2500 Extensi\u00f3n de c\u00e9sped 8\u00d72 m dibujada tambi\u00e9n en el plano 2D (pistas dobles e individuales) \u2500\u2500\r\n   Se dibuja a ambos lados (o solo en el lado de acceso si hay puertas en un lado), girando con la pista. *\/\r\nwindow.addEventListener('load',function(){\r\n  if(typeof PadelCourt==='undefined'||typeof padelArea==='undefined')return;\r\n  var P=PadelCourt.prototype,orig=P.draw;\r\n  P.draw=function(area,corners){\r\n    var o=window.paGet3DOpts?window.paGet3DOpts():{};\r\n    if(o.turfExt&&(this.court==='courtDouble'||this.court==='courtSingle')){\r\n      var single=this.court==='courtSingle';\r\n      \/\/ Medidas relativas a la huella de la pista (21\u00d711 m dobles, 21\u00d77 m individuales): vale en m y en ft\r\n      var L=this.w*8\/21,D=this.w*2\/21,half=single?this.h*3\/7:this.h*5\/11;\r\n      var sides=o.doors==='one'?[-1]:[-1,1];        \/\/ con puertas en un lado, la extensi\u00f3n solo en ese lado\r\n      var cx=this.x+this.w\/2,cy=this.y+this.h\/2,a=(this.angle||0)*Math.PI\/180,cs=Math.cos(a),sn=Math.sin(a);\r\n      var ctx=area.ctx,self=this;\r\n      ctx.save();\r\n      sides.forEach(function(sd){\r\n        var pts=[[-L\/2,sd*half],[L\/2,sd*half],[L\/2,sd*(half+D)],[-L\/2,sd*(half+D)]].map(function(p){\r\n          var x=cx+p[0]*cs-p[1]*sn,y=cy+p[0]*sn+p[1]*cs,q=area.scaleToCanvas(x,y);area.applyOffset(q);return q;});\r\n        ctx.beginPath();pts.forEach(function(q,i){i?ctx.lineTo(q.x,q.y):ctx.moveTo(q.x,q.y);});ctx.closePath();\r\n        ctx.fillStyle='rgba(20,40,230,0.45)';ctx.fill();\r\n        ctx.setLineDash([4,3]);ctx.strokeStyle='#1a2fb0';ctx.lineWidth=1.2;ctx.stroke();ctx.setLineDash([]);\r\n      });\r\n      ctx.restore();\r\n    }\r\n    return orig.call(this,area,corners);\r\n  };\r\n  if(padelArea.ctx)padelArea.drawCourts();\r\n});\r\n\r\n\/* \u2500\u2500 Exportaci\u00f3n de imagen 2D (\u00abSave image\u00bb) con n\u00famero de proyecto y fecha \u2500\u2500\r\n   Sustituye a paDoModernExport del planificador: mismo pie azul marino, ahora con el n\u00famero de\r\n   proyecto (del c\u00f3digo de acceso) y la fecha a la izquierda. Sin proyecto, solo la fecha. *\/\r\nfunction pcProject(){try{return sessionStorage.getItem('pc_tools_project')||'';}catch(e){return '';}}\r\n\r\n\/* \u2500\u2500 C\u00f3digo de acceso de la sesi\u00f3n \u2500\u2500\r\n   El widget de desbloqueo solo guarda \u00abdesbloqueado\u00bb y el n\u00famero de proyecto. Para que la imagen IA no vuelva\r\n   a pedir el c\u00f3digo, se guarda aqu\u00ed el c\u00f3digo con el que se ha desbloqueado (solo en esta sesi\u00f3n del navegador).\r\n   El servidor lo vuelve a comprobar en cada imagen. *\/\r\n(function(){\r\n  var last='';\r\n  function grab(){var i=document.getElementById('unlock-password');if(i&&i.value&&i.value.trim())last=i.value.trim();}\r\n  document.addEventListener('input',function(e){if(e.target&&e.target.id==='unlock-password')grab();},true);\r\n  document.addEventListener('change',function(e){if(e.target&&e.target.id==='unlock-password')grab();},true);\r\n  document.addEventListener('keydown',function(e){if(e.target&&e.target.id==='unlock-password')setTimeout(grab,0);},true);\r\n  document.addEventListener('click',grab,true);\r\n  setInterval(function(){\r\n    try{\r\n      if(sessionStorage.getItem('pc_tools_unlocked')!=='1')return;\r\n      if(!last)grab();\r\n      if(last&&sessionStorage.getItem('pc_tools_code')!==last)sessionStorage.setItem('pc_tools_code',last);\r\n    }catch(e){}\r\n  },500);\r\n})();\r\nfunction pcStampDate(){\r\n  var de=(document.documentElement.lang||'').toLowerCase().indexOf('de')===0,d=new Date(),p=function(n){return String(n).padStart(2,'0');};\r\n  return de?p(d.getDate())+'.'+p(d.getMonth()+1)+'.'+d.getFullYear()+' \u00b7 '+p(d.getHours())+':'+p(d.getMinutes())\r\n           :d.toLocaleDateString('en-GB',{day:'2-digit',month:'short',year:'numeric'})+' \u00b7 '+p(d.getHours())+':'+p(d.getMinutes());\r\n}\r\nvar pcOrigExport=(typeof paDoModernExport==='function')?paDoModernExport:null;   \/\/ versi\u00f3n original, como respaldo\r\nwindow.paDoModernExport=function(mainCanvas){\r\n  if(!mainCanvas)return;\r\n  try{pcExport2D(mainCanvas);}\r\n  catch(err){\r\n    if(window.console)console.error('[PadelCreations] Save image:',err);\r\n    if(pcOrigExport)pcOrigExport(mainCanvas);   \/\/ si algo falla, se guarda como antes\r\n  }\r\n};\r\nfunction pcExport2D(mainCanvas){\r\n  var W=mainCanvas.width,H=mainCanvas.height,FOOTER=80,cropFooter=85,cH=H-cropFooter;\r\n  var out=document.createElement('canvas');out.width=W;out.height=cH+FOOTER;\r\n  var ctx=out.getContext('2d');\r\n  ctx.drawImage(mainCanvas,0,0,W,cH,0,0,W,cH);\r\n  ctx.fillStyle='#1a2744';ctx.fillRect(0,cH,W,FOOTER);\r\n  var proj=pcProject(),x0=24;\r\n  \/\/ Izquierda: proyecto (grande) y fecha (peque\u00f1a); las columnas siguientes se colocan seg\u00fan el ancho real del texto\r\n  var date=pcStampDate(),wL;\r\n  if(proj){ctx.fillStyle='#ffffff';ctx.font='bold 26px Arial, sans-serif';ctx.fillText(proj,x0,cH+38);var w1=ctx.measureText(proj).width;\r\n    ctx.fillStyle='#a8c0e8';ctx.font='12px Arial, sans-serif';ctx.fillText(date,x0+1,cH+60);wL=Math.max(w1,ctx.measureText(date).width);}\r\n  else{ctx.fillStyle='#a8c0e8';ctx.font='bold 13px Arial, sans-serif';ctx.fillText(date,x0,cH+45);wL=ctx.measureText(date).width;}\r\n  var x1=Math.round(Math.max(W*0.2,x0+wL+40));\r\n  ctx.fillStyle='#ffffff';ctx.font='bold 13px Arial, sans-serif';ctx.fillText('Layout made with the Padel Floor Planner',x1,cH+30);var w2=ctx.measureText('Layout made with the Padel Floor Planner').width;\r\n  ctx.fillStyle='#a8c0e8';ctx.font='12px Arial, sans-serif';ctx.fillText('PADELCREATIONS INTERNATIONAL',x1,cH+50);\r\n  var x2=Math.round(Math.max(W*0.5,x1+w2+40));\r\n  ctx.fillStyle='#7ecb00';ctx.font='bold 12px Arial, sans-serif';ctx.fillText('www.padelcreations.com',x2,cH+30);ctx.fillText('info@padelcreations.com',x2,cH+50);\r\n  function stamp(){var d=new Date(),p=function(n){return String(n).padStart(2,'0');};return d.getFullYear()+'-'+p(d.getMonth()+1)+'-'+p(d.getDate())+'_'+p(d.getHours())+'-'+p(d.getMinutes());}\r\n  var done=false;\r\n  function download(){\r\n    if(done)return;done=true;\r\n    var name='Padelcreations_'+(proj?proj+'_':'')+'Layout_'+stamp()+'.png';\r\n    var go=function(href,revoke){var a=document.createElement('a');a.download=name;a.href=href;a.style.display='none';\r\n      document.body.appendChild(a);a.click();setTimeout(function(){document.body.removeChild(a);if(revoke)URL.revokeObjectURL(href);},1500);};\r\n    try{\r\n      if(out.toBlob)out.toBlob(function(b){if(b)go(URL.createObjectURL(b),true);else go(out.toDataURL('image\/png'));},'image\/png');\r\n      else go(out.toDataURL('image\/png'));\r\n    }catch(err){\r\n      if(window.console)console.error('[PadelCreations] Save image:',err);\r\n      if(pcOrigExport)pcOrigExport(mainCanvas);\r\n    }\r\n  }\r\n  \/\/ Logo del pie: si no carga en 3 s (o falla), se guarda igualmente sin \u00e9l\r\n  var logo=new Image();\r\n  logo.onload=function(){try{var lh=FOOTER-16,lw=logo.width*(lh\/logo.height);ctx.drawImage(logo,W-lw-16,cH+8,lw,lh);}catch(e){}download();};\r\n  logo.onerror=download;setTimeout(download,3000);\r\n  \/\/ Mismo dominio que la p\u00e1gina (el CDN lo cambiar\u00eda a otro dominio y bloquear\u00eda el guardado)\r\n  logo.src=location.origin+'\/wp-content\/uploads\/2024\/10\/logo-white.png';\r\n}\r\n\r\n\/* \u2500\u2500 Im\u00e1genes del plano servidas desde el mismo dominio \u2500\u2500\r\n   El CDN\/plugin de cach\u00e9 cambia las im\u00e1genes a otro dominio (p. ej. cdn.padelcreations.com). Al dibujarlas\r\n   en el lienzo de exportaci\u00f3n, el navegador lo marca como \u00abcontaminado\u00bb y no permite guardar la imagen\r\n   (\u00abTainted canvases may not be exported\u00bb). Se vuelven a cargar desde el dominio de la p\u00e1gina. *\/\r\n(function(){\r\n  function sameOrigin(img){\r\n    try{\r\n      if(!img||!img.src||img.src.indexOf('data:')===0)return;\r\n      var u=new URL(img.src,location.href);\r\n      if(u.origin!==location.origin){var s=location.origin+u.pathname+u.search;img.removeAttribute('srcset');img.src=s;}\r\n    }catch(e){}\r\n  }\r\n  function fixAll(){\r\n    ['courtDouble','courtSingle','areaObstacle','imgLogo'].forEach(function(id){sameOrigin(document.getElementById(id));});\r\n    document.querySelectorAll('#npal-table img, .padel-area-box img').forEach(sameOrigin);\r\n  }\r\n  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',fixAll);else fixAll();\r\n  window.addEventListener('load',fixAll);\r\n})();\r\n\r\n\/* \u2500\u2500 Pista de tenis en el plano 2D (contexto para clubes de tenis; no entra en el presupuesto) \u2500\u2500\r\n   Elemento \u00abTennis\u00bb en la paleta con dos tama\u00f1os (ITF recomendado 36,57 \u00d7 18,29 m y m\u00ednimo 34,75 \u00d7 17,07 m,\r\n   ambos con las zonas de salida). Se dibuja a escala con sus l\u00edneas, red y valla, se mueve y gira como una pista\r\n   de p\u00e1del, y se guarda en el archivo .padel. En la vista 3D lleva valla de 4 m y superficie a elegir.\r\n   Adem\u00e1s: \u00abDuplicate\u00bb y \u00abRemove\u00bb pasan a dos botones peque\u00f1os junto al asa de giro del objeto seleccionado. *\/\r\n(function(){\r\n  \/\/ Se instala en cuanto carga el bloque (antes que el asa de giro y la extensi\u00f3n de c\u00e9sped, que se apoyan en \u00e9l)\r\n  if(typeof PadelCourt==='undefined')return;\r\n  var FT=typeof METRIC_FT!=='undefined'?METRIC_FT:3.28084;\r\n  var SURF={clay:{out:'#B85F38',in:'#B85F38'},hard:{out:'#3F7552',in:'#2F5D96'},grass:{out:'#4E8A36',in:'#5B9A3E'}};\r\n  function surf(){var o=window.paGet3DOpts?window.paGet3DOpts():{};return SURF[o.tennisSurface]||SURF.clay;}\r\n  function unitOf(area){return (area&&area.measureSystem==='IMPERIAL')?FT:1;}\r\n  \/\/ Dibujo a escala (vectorial): recuadro con zonas de salida, l\u00edneas ITF, red, postes y valla\r\n  var P=PadelCourt.prototype,origDraw=P.draw;\r\n  P.draw=function(area,corners){\r\n    if(this.court!=='courtTennis')return origDraw.call(this,area,corners);\r\n    var ctx=area.ctx,u=unitOf(area);\r\n    var wh=area.scaleToCanvas(this.w,this.h),xy=area.scaleToCanvas(this.x,this.y);\r\n    var sx=wh.x\/(this.w\/u),sy=wh.y\/(this.h\/u);          \/\/ p\u00edxeles por metro (largo y ancho)\r\n    var c=surf();\r\n    ctx.save();\r\n    ctx.translate(area.areaX+xy.x+wh.x\/2,area.areaY+xy.y+wh.y\/2);\r\n    ctx.rotate(this.angle*Math.PI\/180);\r\n    ctx.fillStyle=c.out;ctx.fillRect(-wh.x\/2,-wh.y\/2,wh.x,wh.y);\r\n    var HL=23.77\/2,HD=10.97\/2,HS=8.23\/2,SV=6.40;\r\n    var iw=Math.min(this.w\/u-0.2,2*HL+6.4),ih=Math.min(this.h\/u-0.2,2*HD+3.2);\r\n    if(c.in!==c.out){ctx.fillStyle=c.in;ctx.fillRect(-iw\/2*sx,-ih\/2*sy,iw*sx,ih*sy);}\r\n    ctx.strokeStyle='#ffffff';ctx.lineWidth=Math.max(1,0.08*Math.min(sx,sy));\r\n    ctx.beginPath();\r\n    ctx.rect(-HL*sx,-HD*sy,2*HL*sx,2*HD*sy);                                  \/\/ dobles\r\n    ctx.moveTo(-HL*sx,-HS*sy);ctx.lineTo(HL*sx,-HS*sy);ctx.moveTo(-HL*sx,HS*sy);ctx.lineTo(HL*sx,HS*sy);   \/\/ individuales\r\n    ctx.moveTo(-SV*sx,-HS*sy);ctx.lineTo(-SV*sx,HS*sy);ctx.moveTo(SV*sx,-HS*sy);ctx.lineTo(SV*sx,HS*sy);   \/\/ servicio\r\n    ctx.moveTo(-SV*sx,0);ctx.lineTo(SV*sx,0);                                 \/\/ l\u00ednea central de servicio\r\n    ctx.moveTo(-HL*sx,0);ctx.lineTo((-HL+0.3)*sx,0);ctx.moveTo(HL*sx,0);ctx.lineTo((HL-0.3)*sx,0);       \/\/ marcas centrales\r\n    ctx.stroke();\r\n    \/\/ Red y postes\r\n    var PY=(HD+0.914)*sy;\r\n    ctx.strokeStyle='#1a1d22';ctx.lineWidth=Math.max(1.5,0.12*sx);ctx.beginPath();ctx.moveTo(0,-PY);ctx.lineTo(0,PY);ctx.stroke();\r\n    ctx.fillStyle='#1a1d22';[-PY,PY].forEach(function(y){ctx.beginPath();ctx.arc(0,y,Math.max(2,0.12*sx),0,Math.PI*2);ctx.fill();});\r\n    \/\/ Valla perimetral\r\n    ctx.strokeStyle='#1F3D2A';ctx.lineWidth=2;ctx.strokeRect(-wh.x\/2+1,-wh.y\/2+1,wh.x-2,wh.y-2);\r\n    if(this.description){ctx.fillStyle='#FFFFFF';ctx.font='16px Arial';ctx.fillText(this.description,10,-10);}\r\n    ctx.restore();\r\n    if(corners&&corners.courtId===this.id){\r\n      var A=area.scaleToCanvas(corners.A.x,corners.A.y),B=area.scaleToCanvas(corners.B.x,corners.B.y),\r\n          C=area.scaleToCanvas(corners.C.x,corners.C.y),D=area.scaleToCanvas(corners.D.x,corners.D.y);\r\n      [A,B,C,D].forEach(function(q){if(area.applyOffset)area.applyOffset(q);else{q.x+=area.areaX;q.y+=area.areaY;}});\r\n      ctx.save();ctx.lineWidth=3;ctx.strokeStyle='red';ctx.beginPath();\r\n      ctx.moveTo(A.x,A.y);ctx.lineTo(B.x,B.y);ctx.lineTo(D.x,D.y);ctx.lineTo(C.x,C.y);ctx.closePath();ctx.stroke();ctx.restore();\r\n    }\r\n  };\r\n\r\n})();\r\nwindow.addEventListener('load',function(){\r\n  if(typeof PadelCourt==='undefined'||typeof padelArea==='undefined')return;\r\n  var de=(document.documentElement.lang||'').substring(0,2).toLowerCase()==='de';\r\n  var FT=typeof METRIC_FT!=='undefined'?METRIC_FT:3.28084;\r\n  var SIZES={std:{L:36.57,W:18.29,label:de?'36,6 \u00d7 18,3 m':'36.6 \u00d7 18.3 m'},\r\n             min:{L:34.75,W:17.07,label:de?'34,8 \u00d7 17,1 m (min.)':'34.8 \u00d7 17.1 m (min.)'}};\r\n  var tennisSize='std';\r\n  var SURF={clay:{out:'#B85F38',in:'#B85F38'},hard:{out:'#3F7552',in:'#2F5D96'},grass:{out:'#4E8A36',in:'#5B9A3E'}};\r\n  function surf(){var o=window.paGet3DOpts?window.paGet3DOpts():{};return SURF[o.tennisSurface]||SURF.clay;}\r\n  function unitOf(area){return (area&&area.measureSystem==='IMPERIAL')?FT:1;}\r\n\r\n  \/\/ Alta desde la paleta (arrastrar o \u00ab+\u00bb)\r\n  var origAdd=padelArea.addDropCourt.bind(padelArea);\r\n  padelArea.addDropCourt=function(xy,id){\r\n    if(id!=='courtTennis')return origAdd(xy,id);\r\n    var u=unitOf(this),s=SIZES[tennisSize];\r\n    this.padelCourts.addCourt(xy.x,xy.y,s.L*u,s.W*u,0,'courtTennis','');\r\n    this.padelCourts.selectedCourt=this.padelCourts.courts[this.padelCourts.courts.length-1];\r\n    this.drawCourts();if(this.updateButtonsVisibility)this.updateButtonsVisibility();\r\n  };\r\n\r\n  \/\/ Paleta: celda \u00abTennis\u00bb con selector de tama\u00f1o, icono arrastrable y \u00ab+\u00bb\r\n  function icon(){\r\n    var s='<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 120 60\"><rect width=\"120\" height=\"60\" fill=\"#B85F38\"\/>'+\r\n      '<rect x=\"1\" y=\"1\" width=\"118\" height=\"58\" fill=\"none\" stroke=\"#1F3D2A\" stroke-width=\"2\"\/>'+\r\n      '<g fill=\"none\" stroke=\"#fff\" stroke-width=\"1.4\"><rect x=\"21\" y=\"12\" width=\"78\" height=\"36\"\/><path d=\"M21 16.5H99M21 43.5H99M39.5 16.5V43.5M80.5 16.5V43.5M39.5 30H80.5\"\/><\/g>'+\r\n      '<path d=\"M60 8V52\" stroke=\"#1a1d22\" stroke-width=\"2\"\/><\/svg>';\r\n    return 'data:image\/svg+xml;charset=utf-8,'+encodeURIComponent(s);\r\n  }\r\n  var rl=document.getElementById('npal-row-label'),ri=document.getElementById('npal-row-img'),rb=document.getElementById('npal-row-btn');\r\n  if(rl&&ri&&rb&&!document.getElementById('courtTennis')){\r\n    var st=document.createElement('style');\r\n    st.textContent='#new-palette #npal-table td.pc-tennis-td{width:112px!important;}'+\r\n      '#npal-row-img img#courtTennis{width:96px!important;height:48px!important;margin:0 auto!important;cursor:grab;object-fit:fill!important;}'+\r\n      '#pc-tennis-size{display:block;margin:2px auto 0;max-width:104px;font:600 10px Barlow,Arial,sans-serif;color:#4a5a7a;border:1px solid #cdd4e0;border-radius:5px;padding:1px 2px;background:#fff;}';\r\n    document.head.appendChild(st);\r\n    \/\/ Columna justo despu\u00e9s de \u00abObject\u00bb (antes de los pilares)\r\n    var ref=function(row){return row.children[3]||null;};\r\n    var th=document.createElement('td');th.className='npal-td npal-td-label pc-tennis-td';th.textContent=de?'Tennisplatz':'Tennis court';\r\n    rl.insertBefore(th,ref(rl));\r\n    var td=document.createElement('td');td.className='npal-td npal-td-img pc-tennis-td';\r\n    var sel=document.createElement('select');sel.id='pc-tennis-size';sel.setAttribute('aria-label',de?'Gr\u00f6sse des Tennisplatzes':'Tennis court size');\r\n    Object.keys(SIZES).forEach(function(k){var o=document.createElement('option');o.value=k;o.textContent=SIZES[k].label;sel.appendChild(o);});\r\n    sel.addEventListener('change',function(){tennisSize=sel.value;});\r\n    var img=document.createElement('img');img.id='courtTennis';img.src=icon();img.alt=de?'Tennisplatz':'Tennis court';\r\n    img.className='padel-area-form-img';img.draggable=true;\r\n    img.addEventListener('dragstart',function(ev){padelArea.drag(ev);});\r\n    td.appendChild(img);td.appendChild(sel);ri.insertBefore(td,ref(ri));\r\n    var tb=document.createElement('td');tb.className='npal-td npal-td-btn pc-tennis-td';\r\n    var b=document.createElement('button');b.className='nadd-btn';b.type='button';b.textContent='\uff0b';b.setAttribute('aria-label',de?'Tennisplatz hinzuf\u00fcgen':'Add tennis court');\r\n    b.addEventListener('click',function(){var xy=typeof paFindFreeSpot==='function'?paFindFreeSpot():{x:2,y:2};window._pcAddFree=true;try{padelArea.addDropCourt(xy,'courtTennis');}finally{window._pcAddFree=false;}});\r\n    tb.appendChild(b);rb.insertBefore(tb,ref(rb));\r\n    \/\/ Arrastrar en pantallas t\u00e1ctiles\r\n    img.addEventListener('touchend',function(ev){\r\n      var t=ev.changedTouches[0],cv=document.getElementById('canvasAreas');if(!cv)return;\r\n      var r=cv.getBoundingClientRect();if(t.clientX<r.left||t.clientX>r.right||t.clientY<r.top||t.clientY>r.bottom)return;\r\n      ev.preventDefault();\r\n      padelArea.addDropCourt(padelArea.scaleToArea(t.clientX-r.left-padelArea.areaX,t.clientY-r.top-padelArea.areaY),'courtTennis');\r\n    },{passive:false});\r\n  }\r\n\r\n  \/\/ \u00abDuplicate\u00bb y \u00abRemove\u00bb: dos botones peque\u00f1os junto al asa de giro del objeto seleccionado.\r\n  \/\/ Los botones de abajo se ocultan (siguen en la p\u00e1gina: el bloqueo y el planificador los usan).\r\n  var hs=document.createElement('style');hs.textContent='#buttonDuplicate,#buttonDelete{display:none!important;}'+\r\n    \/\/ Sin esos botones, el panel derecho necesita menos sitio: la paleta ocupa el resto y, si aun as\u00ed no cabe\r\n    \/\/ (pantallas estrechas), se desplaza en horizontal en lugar de cortar columnas\r\n    '#new-palette > #new-palette-left{flex:1 1 auto!important;min-width:0;overflow-x:auto!important;overflow-y:hidden!important;}'+\r\n    '#new-palette > #new-palette-right{flex:0 0 250px!important;}'+\r\n    '#new-palette #new-palette-left #new-area-inputs{width:204px!important;min-width:204px!important;padding:14px 10px!important;}'+\r\n    '#new-palette #npal-table td:nth-child(1),#new-palette #npal-table td:nth-child(2){width:128px!important;}'+\r\n    '#new-palette #npal-table #courtDouble,#new-palette #npal-table #courtSingle{width:112px!important;}'+\r\n    '#new-palette #npal-table td:nth-child(3){width:104px!important;}';\r\n  document.body.appendChild(hs);\r\n  var BR=10,BG=28;\r\n  function itemCenter(o){\r\n    if(o.x!==undefined&&o.w!==undefined)return {x:o.x+o.w\/2,y:o.y+o.h\/2};\r\n    return {x:(o.ax+o.bx+o.cx+o.dx)\/4,y:(o.ay+o.by+o.cy+o.dy)\/4};\r\n  }\r\n  function btnPos(o){\r\n    \/\/ Sobre el lado A-B, por fuera (igual que el asa de giro), a izquierda y derecha del asa\r\n    var k=o.getCurtCorners&&o.getCurtCorners();if(!k||!k.A)return null;\r\n    var c=itemCenter(o),a=padelArea.scaleToCanvas(k.A.x,k.A.y),bb=padelArea.scaleToCanvas(k.B.x,k.B.y),cc=padelArea.scaleToCanvas(c.x,c.y);\r\n    [a,bb,cc].forEach(function(p){padelArea.applyOffset(p);});\r\n    var mx=(a.x+bb.x)\/2,my=(a.y+bb.y)\/2,vx=mx-cc.x,vy=my-cc.y,l=Math.hypot(vx,vy)||1,nx=vx\/l,ny=vy\/l;\r\n    var cw=padelArea.canvas?padelArea.canvas.width:1e9,ch=padelArea.canvas?padelArea.canvas.height:1e9,m=BR+2;\r\n    var hx=mx+nx*30,hy=my+ny*30;\r\n    if(hx<m||hy<m||hx>cw-m||hy>ch-m){mx=2*cc.x-mx;my=2*cc.y-my;nx=-nx;ny=-ny;hx=mx+nx*30;hy=my+ny*30;}\r\n    var tx=-ny,ty=nx;   \/\/ direcci\u00f3n a lo largo del lado\r\n    return {copy:{x:hx-tx*BG,y:hy-ty*BG},del:{x:hx+tx*BG,y:hy+ty*BG}};\r\n  }\r\n  function drawBtn(ctx,p,color,kind){\r\n    ctx.save();ctx.fillStyle=color;ctx.strokeStyle='#fff';ctx.lineWidth=2;\r\n    ctx.beginPath();ctx.arc(p.x,p.y,BR,0,Math.PI*2);ctx.fill();ctx.stroke();\r\n    ctx.strokeStyle='#fff';ctx.lineWidth=1.6;ctx.beginPath();\r\n    if(kind==='copy'){ctx.rect(p.x-4.5,p.y-2.5,6.5,7);ctx.moveTo(p.x-2,p.y-2.5);ctx.lineTo(p.x-2,p.y-5);ctx.lineTo(p.x+4.5,p.y-5);ctx.lineTo(p.x+4.5,p.y+2);ctx.lineTo(p.x+2,p.y+2);}\r\n    else{ctx.moveTo(p.x-4,p.y-4);ctx.lineTo(p.x+4,p.y+4);ctx.moveTo(p.x+4,p.y-4);ctx.lineTo(p.x-4,p.y+4);}\r\n    ctx.stroke();ctx.restore();\r\n  }\r\n  \/\/ Choques: pistas (p\u00e1del y tenis), objetos y pilares que se solapan o se salen del \u00e1rea se marcan en rojo transl\u00facido\r\n  \/\/ (mientras se mueve un elemento y tambi\u00e9n en reposo). Las puertas no cuentan. Tocarse borde con borde no es choque.\r\n  function poly(o){\r\n    if(pcIsDoor&&pcIsDoor(o))return null;\r\n    var k=o.getCurtCorners&&o.getCurtCorners();if(!k||!k.A||!k.D)return null;\r\n    var p=[k.A,k.B,k.D,k.C].map(function(q){return {x:q.x,y:q.y};});\r\n    var cx=(p[0].x+p[1].x+p[2].x+p[3].x)\/4,cy=(p[0].y+p[1].y+p[2].y+p[3].y)\/4,e=0.02;   \/\/ 2 cm hacia dentro\r\n    return p.map(function(q){var dx=q.x-cx,dy=q.y-cy,l=Math.hypot(dx,dy)||1;return {x:q.x-dx\/l*e,y:q.y-dy\/l*e};});\r\n  }\r\n  function segX(a,b,c,d){\r\n    var d1=(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x),d2=(b.x-a.x)*(d.y-a.y)-(b.y-a.y)*(d.x-a.x),\r\n        d3=(d.x-c.x)*(a.y-c.y)-(d.y-c.y)*(a.x-c.x),d4=(d.x-c.x)*(b.y-c.y)-(d.y-c.y)*(b.x-c.x);\r\n    return ((d1>0&&d2<0)||(d1<0&&d2>0))&&((d3>0&&d4<0)||(d3<0&&d4>0));\r\n  }\r\n  function inside(p,P){var c=false;for(var i=0,j=P.length-1;i<P.length;j=i++){\r\n    if(((P[i].y>p.y)!==(P[j].y>p.y))&&(p.x<(P[j].x-P[i].x)*(p.y-P[i].y)\/(P[j].y-P[i].y)+P[i].x))c=!c;}return c;}\r\n  function overlap(P,Q){\r\n    for(var i=0;i<4;i++)for(var j=0;j<4;j++)if(segX(P[i],P[(i+1)%4],Q[j],Q[(j+1)%4]))return true;\r\n    return inside(P[0],Q)||inside(Q[0],P);\r\n  }\r\n  \/\/ Fuera del \u00e1rea: alguna esquina m\u00e1s all\u00e1 de los bordes del plano (con 2 cm de tolerancia)\r\n  function outside(P){\r\n    var W=padelArea.measureWidth,H=padelArea.measureHeight,e=0;if(!(W>0&&H>0))return false;\r\n    return P.some(function(q){return q.x<-e||q.y<-e||q.x>W+e||q.y>H+e;});\r\n  }\r\n  function clashes(list){\r\n    var ps=list.map(poly),hit=ps.map(function(P){return !!P&&outside(P);});\r\n    for(var i=0;i<list.length;i++){if(!ps[i])continue;\r\n      for(var j=i+1;j<list.length;j++){if(!ps[j])continue;\r\n        if(overlap(ps[i],ps[j])){hit[i]=true;hit[j]=true;}}}\r\n    return hit;\r\n  }\r\n  window.pcLayoutClashes=function(){var l=padelArea.padelCourts.courts||[];return clashes(l).filter(Boolean).length;};\r\n  function drawClashes(area){\r\n    var list=area.padelCourts.courts||[],hit=clashes(list),ctx=area.ctx;\r\n    list.forEach(function(o,i){\r\n      if(!hit[i])return;\r\n      var k=o.getCurtCorners();\r\n      var pts=[k.A,k.B,k.D,k.C].map(function(q){var c=area.scaleToCanvas(q.x,q.y);area.applyOffset(c);return c;});\r\n      ctx.save();ctx.beginPath();pts.forEach(function(q,n){n?ctx.lineTo(q.x,q.y):ctx.moveTo(q.x,q.y);});ctx.closePath();\r\n      ctx.fillStyle='rgba(220,38,38,0.38)';ctx.fill();\r\n      ctx.setLineDash([6,4]);ctx.lineWidth=2;ctx.strokeStyle='#dc2626';ctx.stroke();ctx.restore();\r\n    });\r\n  }\r\n  \/\/ Colocaci\u00f3n libre al a\u00f1adir: con \u00ab+\u00bb, al soltar desde la paleta y al duplicar, el elemento nuevo se coloca\r\n  \/\/ en un sitio donde no choca con nada y queda dentro del \u00e1rea. \u00ab+\u00bb: el primer hueco libre empezando arriba a la\r\n  \/\/ izquierda; soltar o duplicar: el hueco libre m\u00e1s cercano a ese punto. Si no cabe en ning\u00fan sitio, se queda\r\n  \/\/ donde est\u00e1 (y se ve en rojo).\r\n  function shift(o,dx,dy){\r\n    if(o.x!==undefined&&o.w!==undefined){o.x+=dx;o.y+=dy;}\r\n    else ['a','b','c','d'].forEach(function(k){o[k+'x']+=dx;o[k+'y']+=dy;});\r\n  }\r\n  function fits(o,others){\r\n    var P=poly(o);if(!P||outside(P))return false;\r\n    for(var i=0;i<others.length;i++){var Q=others[i];if(Q&&overlap(P,Q))return false;}\r\n    return true;\r\n  }\r\n  \/\/ Puertas: si la nueva puerta pisa otra puerta de la misma pared, se desplaza a lo largo de la pared al hueco\r\n  \/\/ libre m\u00e1s cercano (con 50 cm de separaci\u00f3n); si esa pared est\u00e1 llena, prueba las dem\u00e1s (arriba, derecha, abajo, izquierda)\r\n  function placeDoor(o){\r\n    var u=padelArea.measureSystem==='IMPERIAL'?3.28084:1,gap=0.5*u,step=0.1*u;\r\n    var doors=padelArea.padelCourts.courts.filter(function(c){return c!==o&&pcIsDoor(c);});\r\n    function free(w,p){return doors.every(function(d){return d.wall!==w||Math.abs(d.pos-p)>=(d.width+o.width)\/2+gap-1e-6;});}\r\n    if(free(o.wall,o.pos))return;\r\n    var walls=[o.wall].concat(['T','R','B','L'].filter(function(w){return w!==o.wall;}));\r\n    for(var k=0;k<walls.length;k++){\r\n      var w=walls[k],len=(w==='T'||w==='B')?padelArea.measureWidth:padelArea.measureHeight,h=o.width\/2;\r\n      if(!(len>o.width))continue;\r\n      var ref=k===0?o.pos:len\/2,c=[];\r\n      for(var p=h;p<=len-h+1e-6;p+=step)c.push(p);\r\n      c.sort(function(a,b){return Math.abs(a-ref)-Math.abs(b-ref);});\r\n      for(var i=0;i<c.length;i++)if(free(w,c[i])){o.wall=w;o.pos=c[i];o.sync();return;}\r\n    }\r\n  }\r\n  function placeFree(o,mode){\r\n    if(o&&pcIsDoor&&pcIsDoor(o)){placeDoor(o);return;}\r\n    if(!o)return;\r\n    var list=padelArea.padelCourts.courts,others=list.filter(function(c){return c!==o;}).map(poly);\r\n    if(fits(o,others))return;\r\n    var W=padelArea.measureWidth,H=padelArea.measureHeight;if(!(W>0&&H>0))return;\r\n    var c0=itemCenter(o),k=o.getCurtCorners(),xs=[k.A.x,k.B.x,k.C.x,k.D.x],ys=[k.A.y,k.B.y,k.C.y,k.D.y];\r\n    var hw=(Math.max.apply(null,xs)-Math.min.apply(null,xs))\/2,hh=(Math.max.apply(null,ys)-Math.min.apply(null,ys))\/2;\r\n    var u=padelArea.measureSystem==='IMPERIAL'?3.28084:1,step=Math.max(0.5*u,Math.sqrt(W*H\/9000));\r\n    var cand=[];\r\n    for(var y=hh;y<=H-hh+1e-6;y+=step)for(var x=hw;x<=W-hw+1e-6;x+=step)cand.push({x:x,y:y});\r\n    if(mode==='free')cand.sort(function(p,q){return (p.y-q.y)||(p.x-q.x);});\r\n    else cand.sort(function(p,q){return Math.hypot(p.x-c0.x,p.y-c0.y)-Math.hypot(q.x-c0.x,q.y-c0.y);});\r\n    for(var i=0;i<cand.length;i++){\r\n      var cc=itemCenter(o);shift(o,cand[i].x-cc.x,cand[i].y-cc.y);\r\n      if(fits(o,others))return;\r\n    }\r\n    var ce=itemCenter(o);shift(o,c0.x-ce.x,c0.y-ce.y);   \/\/ sin hueco: vuelve a su sitio\r\n  }\r\n  if(typeof window.paAddToCenter==='function'){\r\n    var origPlus=window.paAddToCenter;\r\n    window.paAddToCenter=function(id){window._pcAddFree=true;try{return origPlus.apply(this,arguments);}finally{window._pcAddFree=false;}};\r\n  }\r\n  var addW=padelArea.addDropCourt.bind(padelArea);\r\n  padelArea.addDropCourt=function(xy,id){\r\n    var n=this.padelCourts.courts.length,mode=window._pcAddFree?'free':'near';\r\n    var r=addW(xy,id);\r\n    if(this.padelCourts.courts.length>n){\r\n      var o=this.padelCourts.courts[this.padelCourts.courts.length-1];\r\n      try{placeFree(o,mode);}catch(e){}\r\n      this.padelCourts.selectedCourt=o;this.drawCourts();if(this.updateButtonsVisibility)this.updateButtonsVisibility();\r\n    }\r\n    return r;\r\n  };\r\n  var dupW=padelArea.duplicateCourt.bind(padelArea);\r\n  padelArea.duplicateCourt=function(){\r\n    var n=this.padelCourts.courts.length,r=dupW();\r\n    if(this.padelCourts.courts.length>n){\r\n      var o=this.padelCourts.courts[this.padelCourts.courts.length-1];\r\n      try{placeFree(o,'near');}catch(e){}\r\n      this.padelCourts.selectedCourt=o;this.drawCourts();if(this.updateButtonsVisibility)this.updateButtonsVisibility();\r\n    }\r\n    return r;\r\n  };\r\n  var dd=padelArea.drawCourts.bind(padelArea);\r\n  padelArea.drawCourts=function(){\r\n    var r=dd.apply(this,arguments);\r\n    if(this.ctx)try{drawClashes(this);var so=this.padelCourts.selectedCourt;if(so&&window.pcDrawRotHandle)window.pcDrawRotHandle(so);}catch(e){}\r\n    var o=this.padelCourts&&this.padelCourts.selectedCourt;\r\n    if(o&&this.padelCourts.courts.indexOf(o)<0){this.padelCourts.selectedCourt=null;o=null;}   \/\/ objeto ya borrado\r\n    if(o&&this.ctx&&!o._rotating){var p=btnPos(o);if(p){drawBtn(this.ctx,p.copy,'#ff7900','copy');drawBtn(this.ctx,p.del,'#d92647','del');}}\r\n    return r;\r\n  };\r\n  function hit(ev){\r\n    var o=padelArea.padelCourts.selectedCourt;if(!o||!ev||ev.offsetX===undefined)return null;\r\n    var p=btnPos(o);if(!p)return null;\r\n    if(Math.hypot(ev.offsetX-p.copy.x,ev.offsetY-p.copy.y)<=BR+4)return 'buttonDuplicate';\r\n    if(Math.hypot(ev.offsetX-p.del.x,ev.offsetY-p.del.y)<=BR+4)return 'buttonDelete';\r\n    return null;\r\n  }\r\n  var md=padelArea.mouseDown.bind(padelArea);\r\n  padelArea.mouseDown=function(ev){\r\n    var h=hit(ev);\r\n    if(h){var btn=document.getElementById(h);if(btn)btn.click();   \/\/ el clic pasa por el control de acceso\r\n      var sc=padelArea.padelCourts;if(sc.selectedCourt&&sc.courts.indexOf(sc.selectedCourt)<0){sc.selectedCourt=null;padelArea.drawCourts();if(padelArea.updateButtonsVisibility)padelArea.updateButtonsVisibility();}\r\n      return;}\r\n    return md(ev);\r\n  };\r\n  var cv=document.getElementById('canvasAreas');\r\n  if(cv)cv.addEventListener('mousemove',function(ev){if(!padelArea.startDragging&&hit(ev))cv.style.cursor='pointer';});\r\n  if(padelArea.ctx)padelArea.drawCourts();\r\n});\r\n\r\n\/* \u2500\u2500 Textos del planificador (traducciones) \u2500\u2500\r\n   Si el plugin de cach\u00e9 retrasa el script que define \u00ablang\u00bb, pageLoad() falla al final y no aplica\r\n   los textos: aparecen \u00abdrawerInfo\u00bb, \u00abExport\u00bb, \u00abCopy\u00bb\u2026 Se define \u00ablang\u00bb a tiempo y, si aun as\u00ed no\r\n   se aplicaron, se aplican al terminar de cargar la p\u00e1gina. *\/\r\nif(typeof lang==='undefined'){window.lang=(document.documentElement.lang||'en').substring(0,2).toLowerCase();}\r\nwindow.addEventListener('load',function(){\r\n  setTimeout(function(){\r\n    try{\r\n      if(typeof Translator==='undefined'||typeof Languages==='undefined')return;\r\n      var L=(document.documentElement.lang||'en').substring(0,2).toLowerCase();if(!Languages[L])L='en';\r\n      if(Translator.lang===L)return;                       \/\/ ya aplicado por pageLoad()\r\n      window.lang=L;Translator.setTransalations(L);\r\n      if(typeof padelForm!=='undefined'&&typeof METRIC_21x7!=='undefined'){\r\n        var imp=typeof padelArea!=='undefined'&&padelArea.measureSystem==='IMPERIAL';\r\n        padelForm.setTextValue('courtSingleMeasure',imp?IMPERIAL_21x7:METRIC_21x7);\r\n        padelForm.setTextValue('courtDoubleMeasure',imp?IMPERIAL_21x11:METRIC_21x11);\r\n      }\r\n      var ob=document.getElementById('areaObstacle');if(ob)ob.setAttribute('title',Translator.translate('obstacleHint'));\r\n      var co=document.getElementById('new-coords'),di=document.getElementById('designerInfo');\r\n      if(co&&di&&\/drawerInfo\/.test(co.textContent))co.textContent=co.textContent.replace('drawerInfo',Translator.translate('drawerInfo'));\r\n    }catch(e){if(window.console)console.error('[PadelCreations] translations:',e);}\r\n  },150);\r\n});\r\n<\/script>\r\n<!-- \u2550\u2550\u2550 fin de la vista 3D \u2550\u2550\u2550 -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f949a8a elementor-widget elementor-widget-html\" data-id=\"f949a8a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- PadelCreations \u00b7 FAQ - 2D Planner (EN + DE, popup, language detected automatically) \u00b7 paste into an Elementor HTML widget -->\r\n<div class=\"pcfaq pcfaq--compact pcfaq--popup\" id=\"pcfaq-planner\">\r\n<style>\r\n.pcfaq{--navy:#0D2B55;--navy-d:#092546;--accent:#558833;--hl:#558833;--hl-soft:#EEF3E8;--blue:#1E7BF0;--ink:#1B2433;--muted:#5B6678;--line:#E3E8EF;--bg:#F5F7FA;--card:#fff;\r\n  font-family:inherit;color:var(--ink);max-width:960px;margin:0 auto;padding:0 16px;box-sizing:border-box;line-height:1.6}\r\n.pcfaq *,.pcfaq *::before,.pcfaq *::after{box-sizing:border-box}\r\n.pcfaq-hero{text-align:center;padding:48px 0 28px}\r\n.pcfaq-eyebrow{display:inline-block;font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:10px}\r\n.pcfaq-hero h2{font-size:clamp(28px,4vw,40px);line-height:1.15;margin:0 0 12px;color:var(--navy);font-weight:800}\r\n.pcfaq-hero p{margin:0 auto;max-width:620px;color:var(--muted);font-size:17px}\r\n.pcfaq-search{position:relative;max-width:620px;margin:26px auto 0}\r\n.pcfaq-search svg{position:absolute;left:18px;top:50%;transform:translateY(-50%);width:20px;height:20px;stroke:var(--muted);pointer-events:none}\r\n.pcfaq-search input{width:100%;height:56px;border:1.5px solid var(--line);border-radius:999px;padding:0 52px;font:inherit;font-size:16px;color:var(--ink);background:var(--card);box-shadow:0 6px 24px rgba(13,43,85,.07);outline:none;transition:border-color .2s,box-shadow .2s}\r\n.pcfaq-search input:focus{border-color:var(--navy);box-shadow:0 6px 24px rgba(13,43,85,.14)}\r\n.pcfaq-search input::-webkit-search-cancel-button{-webkit-appearance:none;display:none}\r\n.pcfaq-clear{position:absolute;right:12px;top:50%;transform:translateY(-50%);border:0;background:var(--bg);color:var(--muted);width:32px;height:32px;border-radius:50%;cursor:pointer;font-size:18px;line-height:1;display:none}\r\n.pcfaq-clear.show{display:block}\r\n.pcfaq-bar{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:22px 0 8px}\r\n.pcfaq-chip{border:1.5px solid var(--line);background:var(--card);color:var(--navy);font:inherit;font-size:14px;font-weight:600;padding:8px 14px;border-radius:999px;cursor:pointer;transition:all .15s}\r\n.pcfaq-chip span{display:inline-block;min-width:22px;margin-left:4px;padding:0 6px;border-radius:999px;background:var(--bg);color:var(--muted);font-size:12px}\r\n.pcfaq-chip:hover{border-color:var(--navy)}\r\n.pcfaq-chip.is-active{background:var(--navy);border-color:var(--navy);color:#fff}\r\n.pcfaq-chip.is-active span{background:rgba(255,255,255,.18);color:#fff}\r\n.pcfaq-tools{display:flex;justify-content:space-between;align-items:center;margin:14px 0 4px;font-size:14px;color:var(--muted)}\r\n.pcfaq-toggle{border:0;background:none;color:var(--navy);font:inherit;font-size:14px;font-weight:600;cursor:pointer;padding:6px 0;text-decoration:underline;text-underline-offset:3px}\r\n.pcfaq-group{margin-top:28px}\r\n.pcfaq-group[hidden]{display:none}\r\n.pcfaq-gt{font-size:13px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:0 0 10px;padding-left:4px}\r\n.pcfaq-item{background:var(--card);border:1px solid var(--line);border-radius:14px;margin-bottom:10px;transition:box-shadow .2s,border-color .2s}\r\n.pcfaq-item[hidden]{display:none}\r\n.pcfaq-item{scroll-margin-top:170px}\r\n.pcfaq-item.is-open{border-color:rgba(13,43,85,.35);box-shadow:0 8px 28px rgba(13,43,85,.08)}\r\n.pcfaq-q{margin:0;font-size:inherit}\r\n.pcfaq-q button{all:unset;box-sizing:border-box;display:flex;width:100%;align-items:center;gap:16px;padding:18px 20px;cursor:pointer;font-size:17px;font-weight:650;color:var(--navy);line-height:1.4}\r\n.pcfaq-q button:focus-visible{outline:3px solid var(--blue);outline-offset:-3px;border-radius:14px}\r\n.pcfaq-qt{flex:1}\r\n.pcfaq-ic{flex:none;width:30px;height:30px;border-radius:50%;background:var(--bg);position:relative;transition:background .2s,transform .25s}\r\n.pcfaq-ic::before,.pcfaq-ic::after{content:\"\";position:absolute;left:50%;top:50%;width:12px;height:2px;background:var(--navy);border-radius:2px;transform:translate(-50%,-50%);transition:transform .25s,background .2s}\r\n.pcfaq-ic::after{transform:translate(-50%,-50%) rotate(90deg)}\r\n.pcfaq-item.is-open .pcfaq-ic{background:var(--navy)}\r\n.pcfaq-item.is-open .pcfaq-ic::before,.pcfaq-item.is-open .pcfaq-ic::after{background:#fff}\r\n.pcfaq-item.is-open .pcfaq-ic::after{transform:translate(-50%,-50%) rotate(0)}\r\n.pcfaq-ai{padding:0 20px 20px;color:#344054;font-size:16px}\r\n.pcfaq-ai p{margin:0 0 12px}\r\n.pcfaq-ai ul,.pcfaq-ai ol{margin:0 0 12px;padding-left:22px}\r\n.pcfaq-ai li{margin-bottom:6px}\r\n.pcfaq-ai strong{color:var(--navy)}\r\n.pcfaq .pcfaq-ai a:not(.pcfaq-link){color:var(--hl)!important;font-weight:600;text-decoration:underline;text-underline-offset:3px}\r\n.pcfaq-link{display:inline-block;font-size:13px;color:var(--muted);text-decoration:none;border-bottom:1px dashed currentColor}\r\n.pcfaq-link:hover{color:var(--navy)}\r\n.pcfaq mark{background:#E3EDD8;color:inherit;padding:0 2px;border-radius:3px}\r\n.pcfaq-empty{display:none;text-align:center;padding:40px 16px;color:var(--muted)}\r\n.pcfaq-empty.show{display:block}\r\n.pcfaq-empty strong{display:block;color:var(--navy);font-size:18px;margin-bottom:6px}\r\n.pcfaq-cta{margin:44px 0 56px;background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);color:#fff;border-radius:20px;padding:36px 28px;display:flex;flex-wrap:wrap;gap:20px;align-items:center;justify-content:space-between}\r\n.pcfaq-cta h3{margin:0 0 6px;font-size:24px;color:#fff}\r\n.pcfaq-cta p{margin:0;color:rgba(255,255,255,.8);max-width:520px}\r\n.pcfaq-btn{display:inline-block;background:var(--accent);color:#fff;text-decoration:none;font-weight:700;padding:14px 26px;border-radius:999px;transition:transform .15s,box-shadow .15s;white-space:nowrap}\r\n.pcfaq-btn:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(85,136,51,.4);color:#fff}\r\n.pcfaq-toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,20px);background:var(--navy);color:#fff;padding:10px 18px;border-radius:999px;font-size:14px;opacity:0;pointer-events:none;transition:all .25s;z-index:9999}\r\n.pcfaq-toast.show{opacity:1;transform:translate(-50%,0)}\r\n\/* shield against theme\/Elementor button styles *\/\r\n.pcfaq .pcfaq-q button,.pcfaq .pcfaq-q button:hover,.pcfaq .pcfaq-q button:focus,.pcfaq .pcfaq-q button:active{background:transparent!important;color:var(--navy)!important;border:0!important;box-shadow:none!important;text-transform:none!important;letter-spacing:normal!important}\r\n.pcfaq .pcfaq-q button:hover .pcfaq-qt{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}\r\n.pcfaq .pcfaq-toggle,.pcfaq .pcfaq-toggle:hover,.pcfaq .pcfaq-toggle:focus{background:transparent!important;color:var(--navy)!important;border:0!important;box-shadow:none!important}\r\n.pcfaq .pcfaq-chip:hover,.pcfaq .pcfaq-chip:focus{background:var(--card)!important;color:var(--navy)!important}\r\n.pcfaq .pcfaq-chip.is-active,.pcfaq .pcfaq-chip.is-active:hover,.pcfaq .pcfaq-chip.is-active:focus{background:var(--navy)!important;color:#fff!important}\r\n.pcfaq .pcfaq-clear:hover,.pcfaq .pcfaq-clear:focus{background:var(--bg)!important;color:var(--muted)!important}\r\n\/* green highlight for hovered \/ open questions *\/\r\n.pcfaq .pcfaq-item{overflow:hidden}\r\n.pcfaq .pcfaq-q button:hover,.pcfaq .pcfaq-q button:focus{background:var(--hl-soft)!important;color:var(--navy)!important}\r\n.pcfaq .pcfaq-q button:hover .pcfaq-qt{text-decoration:none}\r\n.pcfaq .pcfaq-item.is-open .pcfaq-q button,.pcfaq .pcfaq-item.is-open .pcfaq-q button:hover,.pcfaq .pcfaq-item.is-open .pcfaq-q button:focus{background:var(--hl)!important;color:#fff!important}\r\n.pcfaq .pcfaq-item.is-open .pcfaq-ic{background:#fff}\r\n.pcfaq .pcfaq-item.is-open .pcfaq-ic::before,.pcfaq .pcfaq-item.is-open .pcfaq-ic::after{background:var(--hl)}\r\n.pcfaq .pcfaq-item.is-open{border-color:var(--hl)}\r\n.pcfaq .pcfaq-item.is-open .pcfaq-ai{padding-top:16px}\r\n.pcfaq a.pcfaq-btn,.pcfaq a.pcfaq-btn:link,.pcfaq a.pcfaq-btn:visited{color:#fff!important;background:var(--accent)!important;text-decoration:none!important}\r\n.pcfaq a.pcfaq-btn:hover,.pcfaq a.pcfaq-btn:focus{color:var(--accent)!important;background:#fff!important}\r\n.pcfaq--compact .pcfaq-hero{text-align:left;padding:32px 0 8px}\r\n.pcfaq--compact .pcfaq-hero h2{font-size:clamp(24px,3vw,30px);margin-bottom:8px}\r\n.pcfaq--compact .pcfaq-hero p{margin:0;font-size:16px;max-width:none}\r\n.pcfaq--compact .pcfaq-group{margin-top:16px}\r\n.pcfaq-cta--slim{margin:24px 0 40px;padding:20px 24px;border-radius:16px}\r\n.pcfaq-cta--slim p{color:#fff;font-weight:600;font-size:17px}\r\n@media (max-width:600px){.pcfaq-hero{padding-top:32px}.pcfaq-q button{padding:16px;font-size:16px}.pcfaq-ai{padding:0 16px 16px}.pcfaq-cta{padding:28px 20px}.pcfaq-bar{justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;padding-bottom:6px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px;scrollbar-width:none}.pcfaq-bar::-webkit-scrollbar{display:none}.pcfaq-chip{flex:none}}\r\n\/* ---- popup mode ---- *\/\r\n.pcfaq--popup{padding:0;max-width:none;margin:16px 0;text-align:center}\r\n.pcfaq .pcfaq-trigger,.pcfaq .pcfaq-trigger:hover,.pcfaq .pcfaq-trigger:focus{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:10px;cursor:pointer;padding:10px 18px 10px 10px;border:1.5px solid var(--hl)!important;border-radius:999px;background:#fff!important;color:var(--navy)!important;font:inherit;font-weight:600;font-size:15px;line-height:1.3;transition:background .15s,color .15s}\r\n.pcfaq .pcfaq-trigger:hover,.pcfaq .pcfaq-trigger:focus-visible{background:var(--hl-soft)!important}\r\n.pcfaq .pcfaq-trigger:focus-visible{outline:3px solid var(--blue);outline-offset:2px}\r\n.pcfaq-trigger-ic{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:var(--hl);color:#fff;font-weight:800;font-size:15px}\r\n.pcfaq-modal{position:fixed;inset:0;z-index:2147483000;max-width:none;margin:0;padding:0;display:flex;align-items:center;justify-content:center}\r\n.pcfaq-modal[hidden]{display:none}\r\n.pcfaq-backdrop{position:absolute;inset:0;background:rgba(9,37,70,.6);opacity:0;transition:opacity .2s}\r\n.pcfaq-dialog{position:relative;width:min(880px,calc(100% - 32px));max-height:min(86vh,900px);background:#fff;border-radius:20px;box-shadow:0 24px 80px rgba(9,37,70,.35);display:flex;flex-direction:column;opacity:0;transform:translateY(16px) scale(.98);transition:opacity .2s,transform .2s}\r\n.pcfaq-modal.is-in .pcfaq-backdrop{opacity:1}\r\n.pcfaq-modal.is-in .pcfaq-dialog{opacity:1;transform:none}\r\n.pcfaq-box{overflow-y:auto;overscroll-behavior:contain;padding:0 28px 8px;border-radius:20px}\r\n.pcfaq-box .pcfaq-hero{padding-top:28px;padding-right:48px}\r\n.pcfaq-box .pcfaq-cta{margin-bottom:24px}\r\n.pcfaq .pcfaq-x,.pcfaq .pcfaq-x:hover,.pcfaq .pcfaq-x:focus{all:unset;position:absolute;top:14px;right:14px;z-index:2;width:38px;height:38px;border-radius:50%;background:var(--bg)!important;color:var(--navy)!important;font-size:24px;line-height:38px;text-align:center;cursor:pointer}\r\n.pcfaq .pcfaq-x:hover{background:var(--hl-soft)!important}\r\n.pcfaq .pcfaq-x:focus-visible{outline:3px solid var(--blue)}\r\nhtml.pcfaq-lock,html.pcfaq-lock body{overflow:hidden!important}\r\n@media (max-width:600px){.pcfaq-modal{align-items:flex-end}.pcfaq-dialog{width:100%;max-height:92vh;border-radius:20px 20px 0 0}.pcfaq-box{padding:0 16px 8px}}\r\n@media (prefers-reduced-motion:reduce){.pcfaq *{transition:none!important}}\r\n<\/style>\r\n<template data-lang=\"en\" data-ltrig=\"Questions about the 2D Planner? Read the FAQ\" data-lclose=\"Close\">\r\n  <header class=\"pcfaq-hero\">\r\n    <span class=\"pcfaq-eyebrow\">2D Planner \u00b7 FAQ<\/span>\r\n    <h2>2D Planner &amp; 3D view<\/h2>\r\n    <p>Plan your courts to scale, view them in 3D, capture images and create your PDF.<\/p>\r\n  <\/header>\r\n\r\n  <div class=\"pcfaq-tools\">\r\n    <span class=\"pcfaq-count\" aria-live=\"polite\"><\/span>\r\n    <button type=\"button\" class=\"pcfaq-toggle\" data-state=\"closed\">Expand all<\/button>\r\n  <\/div>\r\n\r\n  <div class=\"pcfaq-list\">\r\n    <section class=\"pcfaq-group\" data-cat=\"planner\">\r\n      <div class=\"pcfaq-item\" id=\"faq-planner-what\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-planner-what-a\" id=\"faq-planner-what-q\"><span class=\"pcfaq-qt\">What can I do with the 2D Planner?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-planner-what-a\" role=\"region\" aria-labelledby=\"faq-planner-what-q\" hidden><div class=\"pcfaq-ai\"><p>Define the dimensions of your hall or plot, place padel courts to scale, move and rotate them, and check distances to walls, between courts and to other areas. It is the fastest way to find out how many courts really fit and which arrangement works best.<\/p><a class=\"pcfaq-link\" href=\"#faq-planner-what\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-accuracy\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-accuracy-a\" id=\"faq-accuracy-q\"><span class=\"pcfaq-qt\">Are the court dimensions accurate?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-accuracy-a\" role=\"region\" aria-labelledby=\"faq-accuracy-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. Courts are drawn to scale with the standard padel playing area of 20&nbsp;&times;&nbsp;10&nbsp;m. The planner is ideal for feasibility and layout decisions; final dimensions, clearances and structural details are always confirmed by our technical team for your specific site.<\/p><p>Some spaces are very special &ndash; tight halls, existing buildings with columns, irregular plots &ndash; where every centimetre counts. For these cases, our team uses its in-house design tool to work out a precise layout that makes the most of every centimetre. Just send us your plans and we will take it from there.<\/p><a class=\"pcfaq-link\" href=\"#faq-accuracy\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-3d-view\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-3d-view-a\" id=\"faq-3d-view-q\"><span class=\"pcfaq-qt\">How do I see my layout in 3D?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-3d-view-a\" role=\"region\" aria-labelledby=\"faq-3d-view-q\" hidden><div class=\"pcfaq-ai\"><p>Once your layout is ready, click the 3D button. Your courts are converted into a 3D model instantly &ndash; no extra software required. Rotate and zoom freely, or jump to one of the preset views: <strong>Overview<\/strong>, <strong>Side<\/strong>, <strong>From the back<\/strong> or <strong>Top<\/strong>.<\/p><p>In the 3D view you can also try out your options and see every change immediately:<\/p><ul><li><strong>Court type:<\/strong> Indoor, Indoor Panoramic or Outdoor<\/li><li><strong>Access:<\/strong> no doors, doors on one side or doors on both sides, with optional door protections<\/li><li><strong>Lighting:<\/strong> no lights, straight, angled or curved light posts, with 300 or 500 lux<\/li><li><strong>Colours:<\/strong> court surface and structure colours<\/li><\/ul><p>From the same toolbar you can create an <strong>Image capture<\/strong> of the current view, an <a href=\"#faq-ai-enhance\">AI image<\/a>, a <a href=\"#faq-pdf\">PDF<\/a> &ndash; or click <strong>Ask for a quote<\/strong> to send us your project directly.<\/p><a class=\"pcfaq-link\" href=\"#faq-3d-view\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-ai-enhance\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-ai-enhance-a\" id=\"faq-ai-enhance-q\"><span class=\"pcfaq-qt\">What does the AI image button in the 3D view do?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-ai-enhance-a\" role=\"region\" aria-labelledby=\"faq-ai-enhance-q\" hidden><div class=\"pcfaq-ai\"><p>The <strong>AI image<\/strong> button turns exactly the view you see on screen into an enhanced, more realistic image. You decide the perspective, court type, lighting and colours in the 3D view &ndash; the AI then adds realistic materials, light and atmosphere to that same view. It does not change your camera angle or create a different scene.<\/p><p>Tip: set up the view you like best (or use one of the preset views) before clicking the button.<\/p><p>Each AI image counts towards the shared limit of <a href=\"#faq-limits\">3 AI images per 24 hours<\/a>, together with the 3D Space Designer. Because the result is AI-generated, small details may differ from your plan. For exact visuals, use the <strong>Image capture<\/strong> of the 3D view or ask us for a <a href=\"#faq-project-renders\">project-specific render<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-ai-enhance\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-save\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-save-a\" id=\"faq-save-q\"><span class=\"pcfaq-qt\">Can I save my layout and continue later?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-save-a\" role=\"region\" aria-labelledby=\"faq-save-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. Save your layout as a <strong>.padel<\/strong> file on your device and load it again whenever you want to keep working. You can also send the same file to our team for a technical review.<\/p><a class=\"pcfaq-link\" href=\"#faq-save\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-export\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-export-a\" id=\"faq-export-q\"><span class=\"pcfaq-qt\">Can I export or share my plan?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-export-a\" role=\"region\" aria-labelledby=\"faq-export-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. With one click the planner creates a clean export of your layout, branded with the PadelCreations logo. Share it with partners, investors or your architect &ndash; or send it to us as the basis for your quotation. Need plan and 3D view together in one document? Use the <a href=\"#faq-pdf\">PDF button<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-export\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-pdf\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-pdf-a\" id=\"faq-pdf-q\"><span class=\"pcfaq-qt\">Can I create a PDF of my project?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-pdf-a\" role=\"region\" aria-labelledby=\"faq-pdf-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. Click the <strong>PDF<\/strong> button in the 3D view to create a one-page, PadelCreations-branded PDF of your project. It includes:<\/p><ul><li><strong>Project summary<\/strong> &ndash; number of courts, area dimensions, court type, doors, lighting (mast type and lux), structure colour (RAL) and court surface colour<\/li><li><strong>2D layout<\/strong> &ndash; your courts drawn to scale inside your hall or plot, with the main dimensions<\/li><li><strong>3D visualisation<\/strong> &ndash; the 3D view you have chosen on screen<\/li><li>Date and time of creation, plus our contact details<\/li><\/ul><p>Tip: set the 3D perspective you like best before clicking PDF. The PDF is ideal for sharing your concept with partners, investors or your architect &ndash; and for sending it to us as the basis for your quotation.<\/p><a class=\"pcfaq-link\" href=\"#faq-pdf\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-models\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-models-a\" id=\"faq-models-q\"><span class=\"pcfaq-qt\">Which court models can I plan with?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-models-a\" role=\"region\" aria-labelledby=\"faq-models-q\" hidden><div class=\"pcfaq-ai\"><p>The planner uses the standard court footprint, which is the same for all models. Whether your project needs an indoor model such as <strong>Basic<\/strong> or <strong>Panoramic PRO<\/strong>, or our outdoor <strong>Premium Line<\/strong>, is defined together with our team based on your site, climate and budget.<\/p><a class=\"pcfaq-link\" href=\"#faq-models\" data-copy>Copy link to this answer<\/a><\/div><\/div>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n\r\n  <div class=\"pcfaq-empty\"><strong>No matching questions<\/strong>Try another word &ndash; or simply ask us directly below.<\/div>\r\n  <aside class=\"pcfaq-cta pcfaq-cta--slim\">\r\n    <p>Still have a question about your project?<\/p>\r\n    <a class=\"pcfaq-btn\" href=\"https:\/\/www.padelcreations.com\/contact\/\">Contact our team<\/a>\r\n  <\/aside>\r\n  <div class=\"pcfaq-toast\" role=\"status\">Link copied<\/div>\r\n\r\n<script type=\"application\/ld+json\">\r\n{\r\n \"@context\": \"https:\/\/schema.org\",\r\n \"@type\": \"FAQPage\",\r\n \"inLanguage\": \"en\",\r\n \"mainEntity\": [\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"What can I do with the 2D Planner?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Define the dimensions of your hall or plot, place padel courts to scale, move and rotate them, and check distances to walls, between courts and to other areas. It is the fastest way to find out how many courts really fit and which arrangement works best.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Are the court dimensions accurate?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Yes. Courts are drawn to scale with the standard padel playing area of 20\u00a0\u00d7\u00a010\u00a0m. The planner is ideal for feasibility and layout decisions; final dimensions, clearances and structural details are always confirmed by our technical team for your specific site. Some spaces are very special \u2013 tight halls, existing buildings with columns, irregular plots \u2013 where every centimetre counts. For these cases, our team uses its in-house design tool to work out a precise layout that makes the most of every centimetre. Just send us your plans and we will take it from there.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"How do I see my layout in 3D?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Once your layout is ready, click the 3D button. Your courts are converted into a 3D model instantly \u2013 no extra software required. Rotate and zoom freely, or jump to one of the preset views: Overview, Side, From the back or Top. In the 3D view you can also try out your options and see every change immediately: Court type: Indoor, Indoor Panoramic or Outdoor Access: no doors, doors on one side or doors on both sides, with optional door protections Lighting: no lights, straight, angled or curved light posts, with 300 or 500 lux Colours: court surface and structure colours From the same toolbar you can create an Image capture of the current view, an AI image, a PDF \u2013 or click Ask for a quote to send us your project directly.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"What does the AI image button in the 3D view do?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"The AI image button turns exactly the view you see on screen into an enhanced, more realistic image. You decide the perspective, court type, lighting and colours in the 3D view \u2013 the AI then adds realistic materials, light and atmosphere to that same view. It does not change your camera angle or create a different scene. Tip: set up the view you like best (or use one of the preset views) before clicking the button. Each AI image counts towards the shared limit of 3 AI images per 24 hours, together with the 3D Space Designer. Because the result is AI-generated, small details may differ from your plan. For exact visuals, use the Image capture of the 3D view or ask us for a project-specific render.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Can I save my layout and continue later?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Yes. Save your layout as a .padel file on your device and load it again whenever you want to keep working. You can also send the same file to our team for a technical review.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Can I export or share my plan?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Yes. With one click the planner creates a clean export of your layout, branded with the PadelCreations logo. Share it with partners, investors or your architect \u2013 or send it to us as the basis for your quotation. Need plan and 3D view together in one document? Use the PDF button.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Can I create a PDF of my project?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Yes. Click the PDF button in the 3D view to create a one-page, PadelCreations-branded PDF of your project. It includes: Project summary \u2013 number of courts, area dimensions, court type, doors, lighting (mast type and lux), structure colour (RAL) and court surface colour 2D layout \u2013 your courts drawn to scale inside your hall or plot, with the main dimensions 3D visualisation \u2013 the 3D view you have chosen on screen Date and time of creation, plus our contact details Tip: set the 3D perspective you like best before clicking PDF. The PDF is ideal for sharing your concept with partners, investors or your architect \u2013 and for sending it to us as the basis for your quotation.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Which court models can I plan with?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"The planner uses the standard court footprint, which is the same for all models. Whether your project needs an indoor model such as Basic or Panoramic PRO, or our outdoor Premium Line, is defined together with our team based on your site, climate and budget.\"\r\n   }\r\n  }\r\n ]\r\n}\r\n<\/script>\r\n<\/template>\r\n<template data-lang=\"de\" data-lq=\" Fragen\" data-lof=\" von \" data-lex=\"Alle erweitern\" data-lco=\"Alle schlie\u00dfen\" data-ltrig=\"Fragen zum 2D-Planer? Zu den FAQ\" data-lclose=\"Schlie\u00dfen\">\r\n  <header class=\"pcfaq-hero\">\r\n    <span class=\"pcfaq-eyebrow\">2D-Planer \u00b7 FAQ<\/span>\r\n    <h2>2D-Planer + 3D-Ansicht<\/h2>\r\n    <p>Pl\u00e4tze ma\u00dfstabsgetreu planen, in 3D ansehen, Bilder aufnehmen und Ihr PDF erstellen.<\/p>\r\n  <\/header>\r\n\r\n  <div class=\"pcfaq-tools\">\r\n    <span class=\"pcfaq-count\" aria-live=\"polite\"><\/span>\r\n    <button type=\"button\" class=\"pcfaq-toggle\" data-state=\"closed\">Alle erweitern<\/button>\r\n  <\/div>\r\n\r\n  <div class=\"pcfaq-list\">\r\n    <section class=\"pcfaq-group\" data-cat=\"planner\">\r\n      <div class=\"pcfaq-item\" id=\"faq-planner-what\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-planner-what-a\" id=\"faq-planner-what-q\"><span class=\"pcfaq-qt\">Was kann ich mit dem 2D-Planer machen?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-planner-what-a\" role=\"region\" aria-labelledby=\"faq-planner-what-q\" hidden><div class=\"pcfaq-ai\"><p>Legen Sie die Ma\u00dfe Ihrer Halle oder Ihres Grundst\u00fccks fest, platzieren Sie Padelpl\u00e4tze ma\u00dfstabsgetreu, verschieben und drehen Sie sie und pr\u00fcfen Sie die Abst\u00e4nde zu W\u00e4nden, zwischen den Pl\u00e4tzen und zu anderen Bereichen. So finden Sie am schnellsten heraus, wie viele Pl\u00e4tze wirklich passen und welche Anordnung am besten funktioniert.<\/p><a class=\"pcfaq-link\" href=\"#faq-planner-what\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-accuracy\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-accuracy-a\" id=\"faq-accuracy-q\"><span class=\"pcfaq-qt\">Sind die Platzma\u00dfe genau?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-accuracy-a\" role=\"region\" aria-labelledby=\"faq-accuracy-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Die Pl\u00e4tze werden ma\u00dfstabsgetreu mit der Standard-Spielfl\u00e4che von 20&nbsp;&times;&nbsp;10&nbsp;m dargestellt. Der Planer ist ideal f\u00fcr Machbarkeits- und Layoutentscheidungen; endg\u00fcltige Ma\u00dfe, Abst\u00e4nde und statische Details werden immer von unserem technischen Team f\u00fcr Ihren konkreten Standort best\u00e4tigt.<\/p><p>Manche R\u00e4ume sind ganz besonders &ndash; enge Hallen, Bestandsgeb\u00e4ude mit St\u00fctzen, unregelm\u00e4\u00dfige Grundst\u00fccke &ndash; und jeder Zentimeter z\u00e4hlt. F\u00fcr diese F\u00e4lle nutzt unser Team sein eigenes Planungstool und erarbeitet ein pr\u00e4zises Layout, das jeden Zentimeter optimal nutzt. Senden Sie uns einfach Ihre Pl\u00e4ne, den Rest \u00fcbernehmen wir.<\/p><a class=\"pcfaq-link\" href=\"#faq-accuracy\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-3d-view\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-3d-view-a\" id=\"faq-3d-view-q\"><span class=\"pcfaq-qt\">Wie sehe ich mein Layout in 3D?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-3d-view-a\" role=\"region\" aria-labelledby=\"faq-3d-view-q\" hidden><div class=\"pcfaq-ai\"><p>Sobald Ihr Layout fertig ist, klicken Sie auf den 3D-Button. Ihre Pl\u00e4tze werden sofort in ein 3D-Modell umgewandelt &ndash; ganz ohne zus\u00e4tzliche Software. Drehen und zoomen Sie frei oder w\u00e4hlen Sie eine der vordefinierten Ansichten: <strong>Overview<\/strong>, <strong>Side<\/strong>, <strong>From the back<\/strong> oder <strong>Top<\/strong>.<\/p><p>In der 3D-Ansicht k\u00f6nnen Sie au\u00dferdem Ihre Optionen ausprobieren und sehen jede \u00c4nderung sofort:<\/p><ul><li><strong>Platztyp:<\/strong> Indoor, Indoor Panoramic oder Outdoor<\/li><li><strong>Zugang:<\/strong> ohne T\u00fcren, T\u00fcren auf einer Seite oder T\u00fcren auf beiden Seiten, optional mit T\u00fcrschutz<\/li><li><strong>Beleuchtung:<\/strong> ohne Licht, gerade, abgewinkelte oder gebogene Lichtmasten, mit 300 oder 500 Lux<\/li><li><strong>Farben:<\/strong> Farbe des Belags und der Struktur<\/li><\/ul><p>\u00dcber dieselbe Werkzeugleiste erstellen Sie eine <strong>Bildaufnahme<\/strong> der aktuellen Ansicht, ein <a href=\"#faq-ai-enhance\">KI-Bild<\/a>, ein <a href=\"#faq-pdf\">PDF<\/a> &ndash; oder Sie senden uns Ihr Projekt direkt \u00fcber <strong>Angebot anfragen<\/strong>.<\/p><a class=\"pcfaq-link\" href=\"#faq-3d-view\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-ai-enhance\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-ai-enhance-a\" id=\"faq-ai-enhance-q\"><span class=\"pcfaq-qt\">Was macht der KI-Bild-Button in der 3D-Ansicht?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-ai-enhance-a\" role=\"region\" aria-labelledby=\"faq-ai-enhance-q\" hidden><div class=\"pcfaq-ai\"><p>Der <strong>KI-Bild<\/strong>-Button verwandelt genau die Ansicht, die Sie auf dem Bildschirm sehen, in ein aufgewertetes, realistischeres Bild. Sie bestimmen in der 3D-Ansicht Perspektive, Platztyp, Beleuchtung und Farben &ndash; die KI erg\u00e4nzt dann realistische Materialien, Licht und Atmosph\u00e4re in genau dieser Ansicht. Sie ver\u00e4ndert weder den Blickwinkel noch erstellt sie eine andere Szene.<\/p><p>Tipp: Stellen Sie zuerst Ihre Lieblingsansicht ein (oder nutzen Sie eine der vordefinierten Ansichten), bevor Sie auf den Button klicken.<\/p><p>Jedes KI-Bild z\u00e4hlt zum gemeinsamen Limit von <a href=\"#faq-limits\">3 KI-Bildern pro 24 Stunden<\/a>, zusammen mit dem 3D Space Designer. Da das Ergebnis KI-generiert ist, k\u00f6nnen kleine Details von Ihrer Planung abweichen. F\u00fcr exakte Darstellungen nutzen Sie die <strong>Bildaufnahme<\/strong> der 3D-Ansicht oder fragen Sie uns nach einem <a href=\"#faq-project-renders\">projektspezifischen Rendering<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-ai-enhance\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-save\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-save-a\" id=\"faq-save-q\"><span class=\"pcfaq-qt\">Kann ich mein Layout speichern und sp\u00e4ter weiterarbeiten?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-save-a\" role=\"region\" aria-labelledby=\"faq-save-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Speichern Sie Ihr Layout als <strong>.padel<\/strong>-Datei auf Ihrem Ger\u00e4t und laden Sie es jederzeit wieder, um weiterzuarbeiten. Dieselbe Datei k\u00f6nnen Sie auch unserem Team zur technischen Pr\u00fcfung senden.<\/p><a class=\"pcfaq-link\" href=\"#faq-save\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-export\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-export-a\" id=\"faq-export-q\"><span class=\"pcfaq-qt\">Kann ich meinen Plan exportieren oder teilen?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-export-a\" role=\"region\" aria-labelledby=\"faq-export-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Mit einem Klick erstellt der Planer einen sauberen Export Ihres Layouts mit dem PadelCreations-Logo. Teilen Sie ihn mit Partnern, Investoren oder Ihrem Architekten &ndash; oder senden Sie ihn uns als Grundlage f\u00fcr Ihr Angebot. Sie m\u00f6chten Plan und 3D-Ansicht in einem Dokument? Nutzen Sie den <a href=\"#faq-pdf\">PDF-Button<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-export\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-pdf\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-pdf-a\" id=\"faq-pdf-q\"><span class=\"pcfaq-qt\">Kann ich ein PDF meines Projekts erstellen?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-pdf-a\" role=\"region\" aria-labelledby=\"faq-pdf-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Klicken Sie in der 3D-Ansicht auf den <strong>PDF<\/strong>-Button, um ein einseitiges PDF Ihres Projekts im PadelCreations-Design zu erstellen. Es enth\u00e4lt:<\/p><ul><li><strong>Projekt\u00fcbersicht<\/strong> &ndash; Anzahl der Pl\u00e4tze, Fl\u00e4chenma\u00dfe, Platztyp, T\u00fcren, Beleuchtung (Mastform und Lux), Strukturfarbe (RAL) und Belagsfarbe<\/li><li><strong>2D-Layout<\/strong> &ndash; Ihre Pl\u00e4tze ma\u00dfstabsgetreu in Ihrer Halle oder auf Ihrem Grundst\u00fcck, mit den Hauptma\u00dfen<\/li><li><strong>3D-Visualisierung<\/strong> &ndash; die 3D-Ansicht, die Sie auf dem Bildschirm gew\u00e4hlt haben<\/li><li>Datum und Uhrzeit der Erstellung sowie unsere Kontaktdaten<\/li><\/ul><p>Tipp: Stellen Sie die gew\u00fcnschte 3D-Perspektive ein, bevor Sie auf PDF klicken. Das PDF ist ideal, um Ihr Konzept mit Partnern, Investoren oder Ihrem Architekten zu teilen &ndash; und um es uns als Grundlage f\u00fcr Ihr Angebot zu senden.<\/p><a class=\"pcfaq-link\" href=\"#faq-pdf\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"pcfaq-item\" id=\"faq-models\" data-cat=\"planner\">\r\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-models-a\" id=\"faq-models-q\"><span class=\"pcfaq-qt\">Mit welchen Platzmodellen kann ich planen?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\r\n        <div class=\"pcfaq-a\" id=\"faq-models-a\" role=\"region\" aria-labelledby=\"faq-models-q\" hidden><div class=\"pcfaq-ai\"><p>Der Planer verwendet die Standard-Grundfl\u00e4che, die bei allen Modellen gleich ist. Ob Ihr Projekt ein Indoor-Modell wie <strong>Basic<\/strong> oder <strong>Panoramic PRO<\/strong> oder unsere Outdoor-<strong>Premium Line<\/strong> ben\u00f6tigt, legen wir gemeinsam mit Ihnen anhand von Standort, Klima und Budget fest.<\/p><a class=\"pcfaq-link\" href=\"#faq-models\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n\r\n  <div class=\"pcfaq-empty\"><strong>Keine passenden Fragen<\/strong>Versuchen Sie ein anderes Wort &ndash; oder fragen Sie uns einfach direkt.<\/div>\r\n  <aside class=\"pcfaq-cta pcfaq-cta--slim\">\r\n    <p>Noch Fragen zu Ihrem Projekt?<\/p>\r\n    <a class=\"pcfaq-btn\" href=\"https:\/\/www.padelcreations.com\/de\/kontakt\/\">Unser Team kontaktieren<\/a>\r\n  <\/aside>\r\n  <div class=\"pcfaq-toast\" role=\"status\">Link kopiert<\/div>\r\n\r\n<script type=\"application\/ld+json\">\r\n{\r\n \"@context\": \"https:\/\/schema.org\",\r\n \"@type\": \"FAQPage\",\r\n \"inLanguage\": \"de\",\r\n \"mainEntity\": [\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Was kann ich mit dem 2D-Planer machen?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Legen Sie die Ma\u00dfe Ihrer Halle oder Ihres Grundst\u00fccks fest, platzieren Sie Padelpl\u00e4tze ma\u00dfstabsgetreu, verschieben und drehen Sie sie und pr\u00fcfen Sie die Abst\u00e4nde zu W\u00e4nden, zwischen den Pl\u00e4tzen und zu anderen Bereichen. So finden Sie am schnellsten heraus, wie viele Pl\u00e4tze wirklich passen und welche Anordnung am besten funktioniert.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Sind die Platzma\u00dfe genau?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Ja. Die Pl\u00e4tze werden ma\u00dfstabsgetreu mit der Standard-Spielfl\u00e4che von 20\u00a0\u00d7\u00a010\u00a0m dargestellt. Der Planer ist ideal f\u00fcr Machbarkeits- und Layoutentscheidungen; endg\u00fcltige Ma\u00dfe, Abst\u00e4nde und statische Details werden immer von unserem technischen Team f\u00fcr Ihren konkreten Standort best\u00e4tigt. Manche R\u00e4ume sind ganz besonders \u2013 enge Hallen, Bestandsgeb\u00e4ude mit St\u00fctzen, unregelm\u00e4\u00dfige Grundst\u00fccke \u2013 und jeder Zentimeter z\u00e4hlt. F\u00fcr diese F\u00e4lle nutzt unser Team sein eigenes Planungstool und erarbeitet ein pr\u00e4zises Layout, das jeden Zentimeter optimal nutzt. Senden Sie uns einfach Ihre Pl\u00e4ne, den Rest \u00fcbernehmen wir.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Wie sehe ich mein Layout in 3D?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Sobald Ihr Layout fertig ist, klicken Sie auf den 3D-Button. Ihre Pl\u00e4tze werden sofort in ein 3D-Modell umgewandelt \u2013 ganz ohne zus\u00e4tzliche Software. Drehen und zoomen Sie frei oder w\u00e4hlen Sie eine der vordefinierten Ansichten: Overview, Side, From the back oder Top. In der 3D-Ansicht k\u00f6nnen Sie au\u00dferdem Ihre Optionen ausprobieren und sehen jede \u00c4nderung sofort: Platztyp: Indoor, Indoor Panoramic oder Outdoor Zugang: ohne T\u00fcren, T\u00fcren auf einer Seite oder T\u00fcren auf beiden Seiten, optional mit T\u00fcrschutz Beleuchtung: ohne Licht, gerade, abgewinkelte oder gebogene Lichtmasten, mit 300 oder 500 Lux Farben: Farbe des Belags und der Struktur \u00dcber dieselbe Werkzeugleiste erstellen Sie eine Bildaufnahme der aktuellen Ansicht, ein KI-Bild, ein PDF \u2013 oder Sie senden uns Ihr Projekt direkt \u00fcber Angebot anfragen.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Was macht der KI-Bild-Button in der 3D-Ansicht?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Der KI-Bild-Button verwandelt genau die Ansicht, die Sie auf dem Bildschirm sehen, in ein aufgewertetes, realistischeres Bild. Sie bestimmen in der 3D-Ansicht Perspektive, Platztyp, Beleuchtung und Farben \u2013 die KI erg\u00e4nzt dann realistische Materialien, Licht und Atmosph\u00e4re in genau dieser Ansicht. Sie ver\u00e4ndert weder den Blickwinkel noch erstellt sie eine andere Szene. Tipp: Stellen Sie zuerst Ihre Lieblingsansicht ein (oder nutzen Sie eine der vordefinierten Ansichten), bevor Sie auf den Button klicken. Jedes KI-Bild z\u00e4hlt zum gemeinsamen Limit von 3 KI-Bildern pro 24 Stunden, zusammen mit dem 3D Space Designer. Da das Ergebnis KI-generiert ist, k\u00f6nnen kleine Details von Ihrer Planung abweichen. F\u00fcr exakte Darstellungen nutzen Sie die Bildaufnahme der 3D-Ansicht oder fragen Sie uns nach einem projektspezifischen Rendering.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Kann ich mein Layout speichern und sp\u00e4ter weiterarbeiten?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Ja. Speichern Sie Ihr Layout als .padel-Datei auf Ihrem Ger\u00e4t und laden Sie es jederzeit wieder, um weiterzuarbeiten. Dieselbe Datei k\u00f6nnen Sie auch unserem Team zur technischen Pr\u00fcfung senden.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Kann ich meinen Plan exportieren oder teilen?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Ja. Mit einem Klick erstellt der Planer einen sauberen Export Ihres Layouts mit dem PadelCreations-Logo. Teilen Sie ihn mit Partnern, Investoren oder Ihrem Architekten \u2013 oder senden Sie ihn uns als Grundlage f\u00fcr Ihr Angebot. Sie m\u00f6chten Plan und 3D-Ansicht in einem Dokument? Nutzen Sie den PDF-Button.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Kann ich ein PDF meines Projekts erstellen?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Ja. Klicken Sie in der 3D-Ansicht auf den PDF-Button, um ein einseitiges PDF Ihres Projekts im PadelCreations-Design zu erstellen. Es enth\u00e4lt: Projekt\u00fcbersicht \u2013 Anzahl der Pl\u00e4tze, Fl\u00e4chenma\u00dfe, Platztyp, T\u00fcren, Beleuchtung (Mastform und Lux), Strukturfarbe (RAL) und Belagsfarbe 2D-Layout \u2013 Ihre Pl\u00e4tze ma\u00dfstabsgetreu in Ihrer Halle oder auf Ihrem Grundst\u00fcck, mit den Hauptma\u00dfen 3D-Visualisierung \u2013 die 3D-Ansicht, die Sie auf dem Bildschirm gew\u00e4hlt haben Datum und Uhrzeit der Erstellung sowie unsere Kontaktdaten Tipp: Stellen Sie die gew\u00fcnschte 3D-Perspektive ein, bevor Sie auf PDF klicken. Das PDF ist ideal, um Ihr Konzept mit Partnern, Investoren oder Ihrem Architekten zu teilen \u2013 und um es uns als Grundlage f\u00fcr Ihr Angebot zu senden.\"\r\n   }\r\n  },\r\n  {\r\n   \"@type\": \"Question\",\r\n   \"name\": \"Mit welchen Platzmodellen kann ich planen?\",\r\n   \"acceptedAnswer\": {\r\n    \"@type\": \"Answer\",\r\n    \"text\": \"Der Planer verwendet die Standard-Grundfl\u00e4che, die bei allen Modellen gleich ist. Ob Ihr Projekt ein Indoor-Modell wie Basic oder Panoramic PRO oder unsere Outdoor-Premium Line ben\u00f6tigt, legen wir gemeinsam mit Ihnen anhand von Standort, Klima und Budget fest.\"\r\n   }\r\n  }\r\n ]\r\n}\r\n<\/script>\r\n<\/template>\r\n<script>\r\n(function(){\r\n  var root=document.getElementById('pcfaq-planner'); if(!root||root.querySelector('.pcfaq-hero')) return;\r\n  var dl=(document.documentElement.lang||'').toLowerCase(), path=location.pathname.toLowerCase();\r\n  var lang=(dl.indexOf('de')===0||\/^\\\/de(\\\/|$)\/.test(path))?'de':'en';\r\n  var t=root.querySelector('template[data-lang=\"'+lang+'\"]')||root.querySelector('template[data-lang=\"en\"]');\r\n  ['data-lq','data-lof','data-lex','data-lco','data-ltrig','data-lclose'].forEach(function(a){if(t.hasAttribute(a))root.setAttribute(a,t.getAttribute(a));});\r\n  root.setAttribute('lang',t.getAttribute('data-lang'));\r\n  root.insertBefore(t.content.cloneNode(true), root.querySelector('template'));\r\n  [].slice.call(root.querySelectorAll('template')).forEach(function(x){x.remove();});\r\n})();\r\n<\/script>\r\n<script>\r\n(function(){\r\n  var host=document.getElementById('pcfaq-planner'); if(!host||host.dataset.ready) return; host.dataset.ready='1';\r\n  var root=host, modal=null, box=null, lastFocus=null;\r\n  if(host.classList.contains('pcfaq--popup')){\r\n    \/* build trigger button + modal; the modal lives in <body> so fixed positioning is never broken by page builders *\/\r\n    var trig=document.createElement('button'); trig.type='button'; trig.className='pcfaq-trigger';\r\n    trig.innerHTML='<span class=\"pcfaq-trigger-ic\" aria-hidden=\"true\">?<\/span><span>'+(host.getAttribute('data-ltrig')||'FAQ')+'<\/span>';\r\n    modal=document.createElement('div'); modal.className='pcfaq pcfaq--compact pcfaq-modal'; modal.id='pcfaq-planner-modal';\r\n    modal.setAttribute('lang',host.getAttribute('lang')||'en'); modal.hidden=true;\r\n    ['data-lq','data-lof','data-lex','data-lco'].forEach(function(a){if(host.hasAttribute(a))modal.setAttribute(a,host.getAttribute(a));});\r\n    modal.innerHTML='<div class=\"pcfaq-backdrop\" data-close><\/div><div class=\"pcfaq-dialog\" role=\"dialog\" aria-modal=\"true\"><button type=\"button\" class=\"pcfaq-x\" data-close aria-label=\"'+(host.getAttribute('data-lclose')||'Close')+'\">&times;<\/button><div class=\"pcfaq-box\"><\/div><\/div>';\r\n    box=modal.querySelector('.pcfaq-box');\r\n    var st=host.querySelector('style'); if(st) modal.appendChild(st.cloneNode(true));\r\n    [].slice.call(host.childNodes).forEach(function(n){ if(n.nodeType===1&&(n.tagName==='STYLE'||n.tagName==='SCRIPT'&&n.type!=='application\/ld+json')) return; box.appendChild(n); });\r\n    var h2=box.querySelector('.pcfaq-hero h2'); if(h2){h2.id='pcfaq-planner-title'; modal.querySelector('.pcfaq-dialog').setAttribute('aria-labelledby',h2.id);}\r\n    host.appendChild(trig); document.body.appendChild(modal); root=modal;\r\n    trig.addEventListener('click',function(){openModal();});\r\n    modal.addEventListener('click',function(e){ if(e.target.closest('[data-close]')) closeModal(); });\r\n    document.addEventListener('keydown',function(e){ if(e.key==='Escape'&&!modal.hidden) closeModal(); });\r\n  }\r\n  function openModal(){ if(!modal||!modal.hidden) return; lastFocus=document.activeElement; modal.hidden=false; document.documentElement.classList.add('pcfaq-lock'); setTimeout(function(){modal.classList.add('is-in'); modal.querySelector('.pcfaq-x').focus();},10); }\r\n  function closeModal(){ if(!modal||modal.hidden) return; modal.classList.remove('is-in'); document.documentElement.classList.remove('pcfaq-lock'); modal.hidden=true;\r\n    if(location.hash&&modal.querySelector(location.hash)&&history.replaceState) history.replaceState(null,'',location.pathname+location.search);\r\n    if(lastFocus&&lastFocus.focus) lastFocus.focus(); }\r\n  var items=[].slice.call(root.querySelectorAll('.pcfaq-item')),\r\n      groups=[].slice.call(root.querySelectorAll('.pcfaq-group')),\r\n      chips=[].slice.call(root.querySelectorAll('.pcfaq-chip')),\r\n      input=root.querySelector('.pcfaq-search input'), clear=root.querySelector('.pcfaq-clear'),\r\n      count=root.querySelector('.pcfaq-count'), empty=root.querySelector('.pcfaq-empty'),\r\n      toggle=root.querySelector('.pcfaq-toggle'), toast=root.querySelector('.pcfaq-toast'),\r\n      cat='all',\r\n      L={q:root.getAttribute('data-lq')||' questions',of:root.getAttribute('data-lof')||' of ',ex:root.getAttribute('data-lex')||'Expand all',co:root.getAttribute('data-lco')||'Collapse all'};\r\n  items.forEach(function(it){\r\n    var q=it.querySelector('.pcfaq-qt'), a=it.querySelector('.pcfaq-ai');\r\n    it._q=q.innerHTML; it._a=a.innerHTML;\r\n    it._t=(q.textContent+' '+a.textContent).toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g,'');\r\n  });\r\n  function setOpen(it,open){\r\n    it.classList.toggle('is-open',open);\r\n    it.querySelector('.pcfaq-q button').setAttribute('aria-expanded',open);\r\n    it.querySelector('.pcfaq-a').hidden=!open;\r\n  }\r\n  function esc(s){return s.replace(\/[.*+?^${}()|[\\]\\\\]\/g,'\\\\$&');}\r\n  function highlight(html,terms){\r\n    if(!terms.length) return html;\r\n    var re=new RegExp('('+terms.map(esc).join('|')+')','gi');\r\n    return html.replace(\/(<[^>]+>)|([^<]+)\/g,function(m,tag,txt){return tag?tag:txt.replace(re,'<mark>$1<\/mark>');});\r\n  }\r\n  function apply(){\r\n    var raw=input?input.value.trim():'', q=raw.toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g,''),\r\n        terms=q.split(\/\\s+\/).filter(function(t){return t.length>1;}), shown=0;\r\n    if(clear) clear.classList.toggle('show',!!raw);\r\n    items.forEach(function(it){\r\n      var okCat=cat==='all'||it.dataset.cat===cat,\r\n          okQ=!terms.length||terms.every(function(t){return it._t.indexOf(t)>-1;}),\r\n          vis=okCat&&okQ;\r\n      it.hidden=!vis; if(vis) shown++;\r\n      it.querySelector('.pcfaq-qt').innerHTML=highlight(it._q,terms);\r\n      it.querySelector('.pcfaq-ai').innerHTML=highlight(it._a,terms);\r\n      if(terms.length&&vis) setOpen(it,true);\r\n      if(!terms.length&&!it.dataset.keep) setOpen(it,false);\r\n    });\r\n    groups.forEach(function(g){g.hidden=!g.querySelector('.pcfaq-item:not([hidden])');});\r\n    empty.classList.toggle('show',shown===0);\r\n    count.textContent=shown===items.length?shown+L.q:shown+L.of+items.length+L.q;\r\n    syncToggle();\r\n  }\r\n  function syncToggle(){\r\n    var vis=items.filter(function(i){return !i.hidden;}), allOpen=vis.length&&vis.every(function(i){return i.classList.contains('is-open');});\r\n    toggle.textContent=allOpen?L.co:L.ex; toggle.dataset.state=allOpen?'open':'closed';\r\n  }\r\n  root.addEventListener('click',function(e){\r\n    var b=e.target.closest('.pcfaq-q button');\r\n    if(b){var it=b.closest('.pcfaq-item'),o=!it.classList.contains('is-open');setOpen(it,o);if(o)it.dataset.keep='1';else delete it.dataset.keep;syncToggle();\r\n      if(o&&history.replaceState) history.replaceState(null,'','#'+it.id); return;}\r\n    var c=e.target.closest('.pcfaq-chip');\r\n    if(c){cat=c.dataset.cat;chips.forEach(function(x){var a=x===c;x.classList.toggle('is-active',a);x.setAttribute('aria-pressed',a);});apply();return;}\r\n    var j=e.target.closest('.pcfaq-ai a[href^=\"#faq-\"]:not([data-copy])');\r\n    if(j){var t=root.querySelector(j.getAttribute('href'));\r\n      if(!t){var h=j.getAttribute('href');if(document.querySelector(h)){e.preventDefault();closeModal();if(location.hash===h){window.dispatchEvent(new HashChangeEvent('hashchange'));}else{location.hash=h;}}return;}\r\n      e.preventDefault();\r\n      if(t){if(history.replaceState)history.replaceState(null,'',j.getAttribute('href'));\r\n        if(t.hidden){cat='all';if(input)input.value='';chips.forEach(function(x){var a=x.dataset.cat==='all';x.classList.toggle('is-active',a);x.setAttribute('aria-pressed',a);});apply();}\r\n        setOpen(t,true);t.dataset.keep='1';syncToggle();goTo(t);} return;}\r\n    var l=e.target.closest('[data-copy]');\r\n    if(l){e.preventDefault();var url=location.href.split('#')[0]+l.getAttribute('href');\r\n      (navigator.clipboard?navigator.clipboard.writeText(url):Promise.reject()).then(function(){toast.classList.add('show');setTimeout(function(){toast.classList.remove('show');},1600);},function(){location.hash=l.getAttribute('href');});}\r\n  });\r\n  toggle.addEventListener('click',function(){var open=toggle.dataset.state!=='open';\r\n    items.forEach(function(it){if(!it.hidden){setOpen(it,open);if(open)it.dataset.keep='1';else delete it.dataset.keep;}});syncToggle();});\r\n  var timer;if(input){input.addEventListener('input',function(){clearTimeout(timer);timer=setTimeout(apply,120);});\r\n  clear.addEventListener('click',function(){input.value='';apply();input.focus();});}\r\n  function openHash(){var h=location.hash; if(!h||h.indexOf('#faq-')!==0) return;\r\n    var it=root.querySelector(h); if(!it||!it.classList.contains('pcfaq-item')) return;\r\n    openModal();\r\n    setOpen(it,true); it.dataset.keep='1'; syncToggle();\r\n    goTo(it);}\r\n  \/* height of any fixed\/sticky site header covering the top of the viewport *\/\r\n  function headerOffset(){\r\n    var max=0, w=window.innerWidth, xs=[w*0.1,w*0.3,w*0.5,w*0.7,w*0.9];\r\n    xs.forEach(function(x){\r\n      var el=document.elementFromPoint(x,2);\r\n      while(el&&el!==document.body&&el!==document.documentElement){\r\n        if(root.contains(el)) break;\r\n        var pos=getComputedStyle(el).position;\r\n        if(pos==='fixed'||pos==='sticky'){var r=el.getBoundingClientRect(); if(r.top<=2&&r.bottom>max&&r.bottom<window.innerHeight*0.5) max=r.bottom; break;}\r\n        el=el.parentElement;\r\n      }\r\n    });\r\n    return max;\r\n  }\r\n  function scrollToItem(it,smooth){\r\n    if(box){ var y0=it.getBoundingClientRect().top-box.getBoundingClientRect().top+box.scrollTop-16; box.scrollTo({top:Math.max(0,y0),behavior:smooth?'smooth':'auto'}); return; }\r\n    var y=it.getBoundingClientRect().top+window.pageYOffset-headerOffset()-20;\r\n    window.scrollTo({top:Math.max(0,y),behavior:smooth?'smooth':'auto'});\r\n  }\r\n  function goTo(it){\r\n    setTimeout(function(){scrollToItem(it,true);},150);\r\n    \/* re-check once sticky headers have settled (e.g. Elementor shrinking header) *\/\r\n    if(!box) setTimeout(function(){var o=headerOffset(), t=it.getBoundingClientRect().top; if(t<o+8||t>o+60) scrollToItem(it,true);},900);\r\n  }\r\n  apply(); openHash(); window.addEventListener('hashchange',openHash);\r\n})();\r\n<\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Planen Sie, mit Padel zu starten, und m\u00f6chten wissen, wie viele Padelpl\u00e4tze in den verf\u00fcgbaren Raum passen? Dieses einzigartige und weltweit erste Online-Tool, das exklusiv f\u00fcr PADEL entwickelt wurde, wird Ihre Frage mit Sicherheit beantworten. Es ist eine Innovation in der Padel-Branche und wurde von PADELCREATIONS entwickelt. Das Beste daran: Es ist f\u00fcr jeden kostenlos [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":32326,"parent":0,"menu_order":3,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_thinkrank_schema_form_data":"","_thinkrank_selected_schema_type":"","_thinkrank_additional_schemas":"","_thinkrank_canonical_url":"","_thinkrank_og_title":"","_thinkrank_og_description":"","_thinkrank_og_image":"","_thinkrank_twitter_title":"","_thinkrank_twitter_description":"","_thinkrank_twitter_image":"","_thinkrank_imported_from":"aioseo","_thinkrank_focus_keywords":["Padelplatz Planer","Padelhalle planen","Padelanlage planen","Padel Court Planer","Padel Grundriss"],"_thinkrank_focus_keyword":"Padelplatz Planer","_thinkrank_robots_meta_enabled":0,"_thinkrank_robots_meta":"[]","_thinkrank_advanced_robots_meta":"[]","_thinkrank_exclude_from_search":0,"_thinkrank_exclude_from_archives":0,"_thinkrank_primary_category":0,"footnotes":""},"class_list":["post-36156","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/36156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/comments?post=36156"}],"version-history":[{"count":301,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/36156\/revisions"}],"predecessor-version":[{"id":46660,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/36156\/revisions\/46660"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/media\/32326"}],"wp:attachment":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/media?parent=36156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}