{"id":45300,"date":"2026-08-15T13:54:19","date_gmt":"2026-08-15T11:54:19","guid":{"rendered":"https:\/\/www.padelcreations.com\/ki-padel-club-designer\/"},"modified":"2026-09-26T13:32:29","modified_gmt":"2026-09-26T11:32:29","slug":"3d-padel-space-designer","status":"publish","type":"page","link":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/","title":{"rendered":"3D Padel Space Designer"},"content":{"rendered":"<div class=\"product\"><div class=\"product\">\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"45300\" class=\"elementor elementor-45300 elementor-45000\" 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-0741bad e-con-full e-flex e-con e-parent\" data-id=\"0741bad\" 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-8571b21 e-flex e-con-boxed e-con e-child\" data-id=\"8571b21\" 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-572eab1 elementor-widget elementor-widget-heading\" data-id=\"572eab1\" 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\">3D Padel Space Designer<\/h1>\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-4e1a631 e-grid e-con-full e-con e-child\" data-id=\"4e1a631\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-696c956 elementor-widget elementor-widget-text-editor\" data-id=\"696c956\" 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>Entdecken Sie schon vor der Umsetzung, wie Ihr zuk\u00fcnftiges Padel-Projekt aussehen k\u00f6nnte. W\u00e4hlen Sie die Umgebung, das Court-Modell und die Anzahl der Courts. Beschreiben Sie anschlie\u00dfend Ihre Vision oder laden Sie Fotos Ihres Standorts hoch, um ein individuelles visuelles Konzept zu erstellen.<\/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-c947e43 elementor-widget elementor-widget-text-editor\" data-id=\"c947e43\" 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>\ud83d\udc49 F\u00fcr die Nutzung des 3D Space Designer ist ein pers\u00f6nlicher Zugangscode erforderlich. Um Ihren Code zu erhalten, f\u00fcllen Sie bitte unser <a style=\"color: #ffffff !important; text-decoration: underline !important;\" href=\"https:\/\/www.padelcreations.com\/de\/kontakt\/\">Kontaktformular<\/a> mit den Details Ihres Padel-Projekts aus.<\/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\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-1f26f59 e-con-full e-flex e-con e-parent\" data-id=\"1f26f59\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-436a12c elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"436a12c\" 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<!-- PC SPACE DESIGNER \u00b7 TWO REFERENCE MODES \u00b7 VERSION 7 -->\n<div id=\"pc-ai-designer\">\n\n    <div class=\"pc-header\">\n        <div class=\"pc-eyebrow\">PADELCREATIONS \u00b7 PADEL VISION<\/div>\n\n        <h2>Stellen Sie sich Ihr Padel-Projekt vor.<br\/><span>Sehen Sie es jetzt zum Leben erwachen.<\/span><\/h2>\n\n        <p>\n            Ihr Projekt beginnt mit einer Idee. Teilen Sie uns mit, was Sie sich vorstellen, oder zeigen Sie uns Ihren Standort \u2014\n            und entdecken Sie, was aus Ihrem zuk\u00fcnftigen Padel-Projekt werden k\u00f6nnte.\n        <\/p> \n    <\/div>\n\n\n    <div class=\"pc-grid\">\n\n        <!-- =========================\n             LEFT PANEL\n        ========================== -->\n\n        <div class=\"pc-panel\">\n\n<!-- =========================\n     1 \u00b7 PROJECT DIRECTION\n========================= -->\n\n<div class=\"pc-vision-section\">\n\n    <div class=\"pc-vision-heading\">\n        <span class=\"pc-vision-heading-title\">1 \u00b7 Wovon tr\u00e4umen Sie?<\/span>\n        <span class=\"pc-vision-heading-sub\">\n            W\u00e4hlen Sie die Art des Projekts, das Sie erstellen m\u00f6chten, und ob es im Innen- oder Au\u00dfenbereich liegen soll.\n        <\/span> \n    <\/div>\n\n    <div class=\"pc-field\">\n        <label for=\"pc-application\">W\u00e4hlen Sie Ihren Ausgangspunkt<\/label>\n        <select id=\"pc-application\">\n            <option value=\"tennis-club\">Tennisclub<\/option>\n            <option value=\"padel-standalone\">Reiner Padel-Club<\/option>\n            <option value=\"leisure-sports\">Freizeit- & Sportanlagen<\/option>\n            <option value=\"private-house\">Wohn- & Unternehmensbereiche<\/option>\n        <\/select>\n        <div id=\"pc-application-help\"><\/div>\n    <\/div>\n\n    <div class=\"pc-field pc-field-last\">\n        <label>Wo werden Sie spielen?<\/label>\n        <div class=\"pc-toggle\" id=\"pc-environment\">\n            <button type=\"button\" data-value=\"outdoor\" class=\"active\">Au\u00dfenbereich<\/button>\n            <button type=\"button\" data-value=\"indoor\">Innenbereich<\/button>\n        <\/div> \n    <\/div>\n\n<\/div>\n\n\n<!-- =========================\n     2 \u00b7 YOUR VISION\n========================= -->\n\n<div class=\"pc-description-section\">\n\n    <div class=\"pc-mini-section-title pc-numbered-title pc-subsection-title\">\n         2 \u00b7 Beschreiben Sie Ihre Vision        Erz\u00e4hlen Sie der KI mehr \u00fcber den Stil und die Umgebung, die Sie sich vorstellen.\n    <\/div>\n\n    <div class=\"pc-field pc-field-last\">\n\n         <label for=\"pc-prompt\">\n            Ihre Vision\n            <span style=\"font-weight:400;\">(optional)<\/span>\n        <\/label>\n\n        <textarea id=\"pc-prompt\" rows=\"6\" placeholder=\"Stellen Sie sich Ihr zuk\u00fcnftiges Padel-Projekt vor\u2026 Ein mediterraner Club, umgeben von Olivenb\u00e4umen, ein stilvolles Clubhaus, eine Restaurantterrasse und eine warme Sonnenuntergangsatmosph\u00e4re\u2026\"><\/textarea>\n\n\n        <div class=\"pc-prompt-hint\">\n            Beschreiben Sie die Atmosph\u00e4re, Architektur, Landschaftsgestaltung,\n            Einrichtungen oder besondere Ideen, die Sie gerne verwirklicht sehen m\u00f6chten.\n        <\/div> \n\n\n        <!-- VISION TOOLS -->\n\n        <div class=\"pc-vision-tools\">\n\n             <button type=\"button\" id=\"pc-enhance-prompt\" class=\"pc-vision-tool-button\">\n                \u2728 Prompt verbessern\n            <\/button>\n\n            <button type=\"button\" id=\"pc-undo-enhance\" class=\"pc-vision-tool-button pc-undo-enhance\" style=\"display:none;\">\n                \u21b6 R\u00fcckg\u00e4ngig\n            <\/button>\n\n            <button type=\"button\" id=\"pc-preset-toggle\" class=\"pc-vision-tool-button pc-preset-toggle\" aria-expanded=\"false\">\n                Voreinstellungen\n                <span class=\"pc-preset-arrow\">\u203a<\/span>\n            <\/button> \n\n        <\/div>\n\n\n        <!-- PRESET PANEL -->\n\n        <div id=\"pc-example-prompts\" class=\"pc-preset-panel\" style=\"display:none;\">\n\n            <div id=\"pc-example-heading\" class=\"pc-example-heading\">\n W\u00e4hlen Sie einen Ausgangspunkt f\u00fcr Ihr Projekt.\n            <\/div>\n\n\n            <!-- Residential \/ Corporate only -->\n\n            <div id=\"pc-example-audience-toggle\" class=\"pc-example-audience-toggle\" style=\"display:none;\">\n\n                 <button type=\"button\" data-audience=\"residential\" class=\"pc-audience-button active\">\nPrivat\n<\/button>\n\n<button type=\"button\" data-audience=\"corporate\" class=\"pc-audience-button\">\nUnternehmen\n<\/button> \n\n            <\/div>\n\n\n            <!-- Existing preset buttons inserted here by JS -->\n\n            <div id=\"pc-example-buttons\" class=\"pc-example-buttons\"><\/div>\n\n            <!-- Outdoor presets only: regional background selection -->\n            <div id=\"pc-background-step\" class=\"pc-background-step\" style=\"display:none;\">\n                <div class=\"pc-background-heading\">W\u00e4hlen Sie die Umgebung<\/div>\n                <div id=\"pc-background-buttons\" class=\"pc-background-buttons\"><\/div>\n                <button type=\"button\" id=\"pc-apply-preset\" class=\"pc-apply-preset\" disabled=\"disabled\">\n                    Voreinstellung anwenden\n                <\/button> \n            <\/div>\n\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n\n<!-- =========================\n     3 \u00b7 PROJECT REFERENCE\n========================= -->\n\n<div class=\"pc-field pc-numbered-field\">\n    <label for=\"pc-reference-mode\">3 \u00b7 Mach es zu deinem<\/label>\n<select id=\"pc-reference-mode\">\n<option value=\"none\" selected=\"selected\">Beginne mit meiner Vorstellung<\/option>\n<option value=\"environment-photos\">Meinen tats\u00e4chlichen Standort nutzen<\/option>\n<\/select> \n    <div id=\"pc-reference-mode-help\"><\/div>\n<\/div>\n\n<div id=\"pc-environment-images-panel\" class=\"pc-reference-panel\" style=\"display:none;\">\n    <div class=\"pc-field\">\n        <div class=\"pc-layout-upload\">\n             \n<div class=\"pc-layout-file-row\"><input type=\"file\" id=\"pc-environment-images-file\" accept=\"image\/jpeg,image\/png,image\/webp\" multiple=\"multiple\"\/>\n<button type=\"button\" id=\"pc-delete-environment-images\" class=\"pc-delete-file\" style=\"display:none;\">L\u00f6schen<\/button><\/div>\n \n \n<div id=\"pc-environment-images-status\" class=\"pc-layout-upload-status\">Laden Sie ein oder mehrere Fotos Ihres tats\u00e4chlichen Standorts oder Geb\u00e4udes hoch. Die KI wird diese Umgebung nachbilden und Ihr ausgew\u00e4hltes Platzmodell sowie die Anzahl der Pl\u00e4tze darin integrieren.<\/div>\n \n \n<div class=\"pc-upload-privacy-note\">Bitte vermeiden Sie das Hochladen von Bildern, die unn\u00f6tige pers\u00f6nliche oder sensible Informationen enthalten.<\/div>\n \n        <\/div>\n    <\/div>\n<\/div>\n\n\n<!-- =========================\n     4 \u00b7 SHAPE PROJECT\n========================= -->\n\n<div class=\"pc-mini-section-title pc-numbered-title\">4 \u00b7 Gestalte dein Padel-Projekt<\/div>\n\n\n<div class=\"pc-field\"><label for=\"pc-court-model\">Platzmodell<\/label>\n<select id=\"pc-court-model\"><\/select><\/div>\n \n\n<div class=\"pc-field\">\n    <label for=\"pc-court-count\">Anzahl der Pl\u00e4tze<\/label>\n    <select id=\"pc-court-count\">\n        <option value=\"1\">1 Court<\/option><option value=\"2\" selected=\"selected\">2 Courts<\/option><option value=\"3\">3 Courts<\/option><option value=\"4\">4 Courts<\/option><option value=\"5\">5 Courts<\/option> <option value=\"6\">6 Courts<\/option><option value=\"7\">7 Courts<\/option><option value=\"8\">8 Courts<\/option><option value=\"9\">9 Courts<\/option><option value=\"10\">10 Courts<\/option> <option value=\"11\">11 Courts<\/option><option value=\"12\">12 Courts<\/option>\n    <\/select>\n<\/div>\n\n<div class=\"pc-field\">\n    <label for=\"pc-layout\">Court-Anordnung<\/label>\n    <select id=\"pc-layout\">\n        <option value=\"side-by-side\" selected=\"selected\">Nebeneinander<\/option>\n        <option value=\"2x2\">2 \u00d7 2<\/option>\n        <option value=\"linear\">Linear<\/option>\n        <option value=\"3x2\">3 \u00d7 2<\/option>\n        <option value=\"4x2\">4 \u00d7 2<\/option>\n    <\/select>\n<\/div>\n\n\n<!-- =========================\n     5 \u00b7 PRESENTATION OPTIONS\n========================= -->\n\n<div class=\"pc-mini-section-title pc-numbered-title\">5 \u00b7 Pr\u00e4sentationsoptionen<\/div>\n\n<div class=\"pc-field\">\n    <label for=\"pc-camera\">Kameraperspektive<\/label>\n    <select id=\"pc-camera\">\n        <option value=\"elevated\" selected=\"selected\">Erh\u00f6hte Architekturansicht<\/option>\n        <option value=\"corner\">Eckperspektive<\/option>\n        <option value=\"ground\">Bodenh\u00f6he<\/option>\n        <option value=\"aerial\">Luftaufnahme<\/option>\n    <\/select>\n<\/div>\n\n<div class=\"pc-field\" id=\"pc-time-field\">\n    <label for=\"pc-time-of-day\">Tageszeit<\/label>\n    <select id=\"pc-time-of-day\">\n        <option value=\"day\" selected=\"selected\">Tag<\/option>\n        <option value=\"sunset\">Sonnenuntergang<\/option>\n        <option value=\"night\">Nacht (beleuchtet)<\/option>\n    <\/select> \n<\/div>\n\n\n<!-- ACCESS CODE -->\n\n<div class=\"pc-access-intro\">\n    <div class=\"pc-access-title\">6 \u00b7 Ihr privater Konzeptzugang<\/div>\n    <div class=\"pc-access-copy\">Geben Sie den von Padelcreations bereitgestellten Zugangscode ein, um Ihre pers\u00f6nliche Visualisierung freizuschalten.<\/div>\n<\/div>\n\n<div class=\"pc-access-row\">\n\n    <input type=\"text\" id=\"pc-access-code\" class=\"pc-access-code\" placeholder=\"Zugangscode\" autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\" inputmode=\"text\">\n\n    <button id=\"pc-validate-access\" type=\"button\" class=\"pc-validate-access\">\n         Freischalten\n    <\/button>\n\n<\/div>\n\n\n<div id=\"pc-access-status\" class=\"pc-access-status\"><\/div>\n\n\n<!-- GENERATE -->\n\n <div class=\"pc-ready-intro\">\n    <div class=\"pc-ready-title\">7 \u00b7 Bereit, Ihre Idee zu sehen?<\/div>\n    <div class=\"pc-ready-copy\">Alles ist bereit. Entdecken Sie jetzt, was aus Ihrem Projekt werden k\u00f6nnte.<\/div>\n<\/div>\n\n<button id=\"pc-generate\" type=\"button\" disabled=\"disabled\">\n\n    <span class=\"pc-button-text\">\n        Meine Vision zum Leben erwecken\n    <\/span>\n\n    <span class=\"pc-spinner\"><\/span>\n\n<\/button> \n\n\n            <div id=\"pc-error\"><\/div>\n\n        <\/div>\n\n\n        <!-- =========================\n             RIGHT RESULT PANEL\n        ========================== -->\n\n        <div class=\"pc-result-column\">\n\n            <div class=\"pc-result-panel\">\n\n\n                <!-- PLACEHOLDER -->\n\n                <div id=\"pc-placeholder\">\n\n                     \n<div class=\"pc-placeholder-icon\"><img title=\"3D Padel Space Designer - Padelcreations - Wir bauen robuste Padel Courts\" decoding=\"async\" id=\"pc-placeholder-icon\" src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/Others\/icondark.png\" alt=\"Padelcreations KI-Padel-Club-Designer\"\/><\/div>\n \n\n <div class=\"pc-result-eyebrow\">IHR STANDORT \u00b7 IHRE VISION \u00b7 UNSERE PL\u00c4TZE<\/div>\n\n \n<h3>Stell dir vor, was m\u00f6glich ist.<\/h3>\n \n\n \n<p>Gestalte links deine Idee. Wir verwandeln sie in eine pers\u00f6nliche Padel-Vision, die du ansehen, teilen und weiterentwickeln kannst.<\/p>\n \n\n                <\/div>\n\n\n                <!-- PROGRESS -->\n\n                <div id=\"pc-generation-status\" style=\"display:none;\">\n\n                    <div class=\"pc-status-logo\" id=\"pc-status-logo\"><\/div>\n\n                    <h3>\n Ihre Vision wird zum Leben erweckt\n                    <\/h3>\n\n                    <p id=\"pc-progress-text\">\n Ihr Projekt wird vorbereitet...\n                    <\/p>\n\n                    <div class=\"pc-progress-track\">\n\n                        <div id=\"pc-progress-bar\"><\/div>\n\n                    <\/div>\n\n                    <div id=\"pc-progress-time\">\n Gesch\u00e4tzt ~60 Sek.\n                    <\/div>\n\n                <\/div>\n\n\n                <!-- GENERATED IMAGE -->\n\n                <div id=\"pc-result\" style=\"display:none;\">\n\n                    <img decoding=\"async\" id=\"pc-result-image\" src=\"\" alt=\"PADELCREATIONS KI-generierte Padel-Umgebung\">\n\n                <\/div>\n\n            <\/div>\n\n<!-- GENERATION LIMIT INFO -->\n\n        <div id=\"pc-generation-limit-note\" class=\"pc-generation-limit-note\">\n Sie k\u00f6nnen innerhalb von 24 Stunden bis zu 3 KI-Konzepte erstellen.\n            <span id=\"pc-runs-remaining\"><\/span>\n        <\/div>\n\n<!-- AI CONCEPT DISCLAIMER -->\n\n        <div class=\"pc-ai-disclosure\">\n            <strong>KI-gest\u00fctzte Visualisierung.<\/strong>\n            Projektinformationen und hochgeladene Bilder werden mithilfe von KI verarbeitet,\n            um Ihre Visualisierung zu erstellen.\n            <a href=\"https:\/\/www.padelcreations.com\/de\/datenschutzerklaerung\/\" target=\"_blank\" rel=\"noopener noreferrer\">\n                Datenschutzrichtlinie\n            <\/a> \n        <\/div>\n\n        <div id=\"pc-ai-disclaimer\" class=\"pc-ai-disclaimer\">\n             KI-generiertes Konzept nur zur Inspiration. Die gezeigte Anzahl,\n            Gr\u00f6\u00dfen, Positionen und Materialien der Courts entsprechen m\u00f6glicherweise nicht exakt\n            dem angeforderten Konzept oder dem endg\u00fcltigen Bauergebnis.\n            Dies ist keine technische Zeichnung und darf nicht f\u00fcr Bau-,\n            Genehmigungs- oder Vertragszwecke verwendet werden \u2014\n            bitte best\u00e4tigen Sie Ihr endg\u00fcltiges Design mit PADELCREATIONS.\n        <\/div>\n\n            <div id=\"pc-result-story\" class=\"pc-result-story\" style=\"display:none;\">\n                <div class=\"pc-result-story-kicker\">DAS K\u00d6NNTE IHRES SEIN.<\/div>\n                <div class=\"pc-result-story-title\">Ihre Idee. Ihre Umgebung. Ihr Padel-Projekt.<\/div>\n                <div class=\"pc-result-story-copy\">Ein erster Eindruck davon, was aus Ihrem Projekt mit Padelcreations werden k\u00f6nnte.<\/div>\n            <\/div>\n\n            <!-- RESULT ACTIONS -->\n\n            <div class=\"pc-result-actions\" id=\"pc-result-actions\" style=\"display:none;\">\n\n                <button type=\"button\" id=\"pc-regenerate\" class=\"pc-secondary\">\n                     Weitere Ansicht erstellen\n                <\/button>\n\n                <a id=\"pc-download\" class=\"pc-download\" href=\"#\" download=\"padelcreations-concept.png\" aria-label=\"Save my concept\">\n                    <span class=\"pc-download-icon\" aria-hidden=\"true\">\n                        <svg viewbox=\"0 0 24 24\" focusable=\"false\">\n                            <path d=\"M12 3v11m0 0 4-4m-4 4-4-4M5 15v4h14v-4\"><\/path>\n                        <\/svg>\n                    <\/span>\n                    <span class=\"pc-download-divider\" aria-hidden=\"true\"><\/span>\n                    <span class=\"pc-download-label\">Mein Konzept speichern<\/span>\n                    <span class=\"pc-download-arrow\" aria-hidden=\"true\">\n                        <svg viewbox=\"0 0 24 24\" focusable=\"false\">\n                            <path d=\"M5 12h13m-5-5 5 5-5 5\"><\/path>\n                        <\/svg>\n                    <\/span>\n                <\/a>\n\n            <\/div>\n\n\n<!-- =====================================================\n     PADELCREATIONS INSPIRATION GALLERY\n====================================================== -->\n\n<div id=\"pc-inspiration-gallery\" class=\"pc-inspiration-gallery\">\n\n    <div class=\"pc-gallery-heading\">\n\n         <div class=\"pc-gallery-eyebrow\">\n            PADELCREATIONS INSPIRATION\n        <\/div>\n\n        <h3>\n            Weitere Padel-Visionen entdecken\n        <\/h3>\n\n        <p>\n            Entdecken Sie Konzepte, die mit PADELCREATIONS-Pl\u00e4tzen erstellt wurden.\n            Erkunden Sie Ideen f\u00fcr Ihr eigenes zuk\u00fcnftiges Padel-Projekt.\n        <\/p> \n\n    <\/div>\n\n\n    <!-- LOCKED GALLERY CTA -->\n\n    <div id=\"pc-gallery-lock-message\" class=\"pc-gallery-lock-message\">\n\n        <div class=\"pc-gallery-lock-top\">\n\n            <div class=\"pc-gallery-lock-icon\">\n \ud83d\udd12\n            <\/div>\n\n            <div class=\"pc-gallery-lock-content\">\n\n                 <div class=\"pc-gallery-lock-title\">\n                    Arbeiten Sie an einem Padel-Projekt?\n                <\/div>\n\n                <div class=\"pc-gallery-lock-copy\">\n                    Senden Sie uns Ihre Projektdetails, um unsere vollst\u00e4ndigen\n                    Planungs- und Designdienstleistungen zu entdecken.\n                <\/div> \n\n            <\/div>\n\n            <a class=\"pc-gallery-lock-button\" href=\"https:\/\/www.padelcreations.com\/de\/kontakt\/\" target=\"_blank\" rel=\"noopener\">\n                 Projektdetails senden \u2192\n            <\/a>\n\n\n            <div class=\"pc-gallery-access-divider\"><\/div>\n\n\n            <div class=\"pc-gallery-access-inline\">\n\n                <input type=\"text\" id=\"pc-gallery-access-code\" class=\"pc-gallery-access-code\" placeholder=\"Geben Sie Ihren Zugangscode ein\" autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\" inputmode=\"text\">\n\n                <button type=\"button\" id=\"pc-gallery-unlock\" class=\"pc-gallery-unlock\" aria-label=\"Unlock gallery\">\n                     \u2192\n                <\/button>\n\n            <\/div>\n\n        <\/div>\n\n\n        <div id=\"pc-gallery-access-status\" class=\"pc-gallery-access-status\"><\/div>\n\n    <\/div>\n\n\n    <!-- GALLERY -->\n\n    <div id=\"pc-gallery-grid\" class=\"pc-gallery-grid\"><\/div>\n\n\n     <div id=\"pc-gallery-more-wrap\" class=\"pc-gallery-more-wrap\" style=\"display:none;\">\n        <button id=\"pc-gallery-more\" class=\"pc-gallery-more\" type=\"button\">\n            MEHR INSPIRATION ANZEIGEN \u2193\n        <\/button>\n\n        <button id=\"pc-gallery-less\" class=\"pc-gallery-less\" type=\"button\" style=\"display:none;\">\n            WENIGER ANZEIGEN \u2191\n        <\/button>\n    <\/div>\n\n\n    <div id=\"pc-gallery-empty\" class=\"pc-gallery-empty\">\n        Inspiration wird geladen...\n    <\/div> \n\n<\/div>\n\n\n<!-- LIGHTBOX -->\n\n<div id=\"pc-gallery-lightbox\" class=\"pc-gallery-lightbox\">\n\n    <div class=\"pc-gallery-lightbox-inner\">\n\n        <button type=\"button\" id=\"pc-gallery-close\" class=\"pc-gallery-close\" aria-label=\"Close\">\n \u00d7\n        <\/button>\n\n        <button type=\"button\" id=\"pc-gallery-prev\" class=\"pc-gallery-nav pc-gallery-prev\" aria-label=\"Previous inspiration\">\n \u2039\n        <\/button>\n\n        <button type=\"button\" id=\"pc-gallery-next\" class=\"pc-gallery-nav pc-gallery-next\" aria-label=\"Next inspiration\">\n \u203a\n        <\/button>\n\n        <img decoding=\"async\" id=\"pc-gallery-lightbox-image\" src=\"\" alt=\"PADELCREATIONS Inspirationskonzept\">\n\n        <button id=\"pc-gallery-download\" class=\"pc-gallery-download\" type=\"button\">\n \u2193 Inspiration herunterladen\n        <\/button>\n\n    <\/div>\n\n<\/div>\n\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n\n<style>\n\n.pc-reference-panel {\n    margin-top: 14px;\n}\n\n\n\n\n\n\n.pc-layout-upload {\n    padding: 12px;\n\n    border:\n        1px dashed\n        var(--pc-border);\n\n    border-radius: 8px;\n\n    background: #f8fafb;\n}\n\n.pc-layout-file-row {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n}\n\n.pc-layout-file-row input {\n    flex: 1;\n    min-width: 0;\n}\n\n.pc-delete-file {\n    flex: 0 0 auto;\n\n    min-height: 42px;\n\n    padding:\n        0 14px;\n\n    border:\n        1px solid #d7dee5;\n\n    border-radius: 7px;\n\n    background: #ffffff;\n\n    color: #c0392b;\n\n    font-size: 12px;\n    font-weight: 700;\n\n    cursor: pointer;\n}\n\n.pc-layout-upload-status {\n    margin-top: 7px;\n\n    color: #82909c;\n\n    font-size: 11px;\n\n    line-height: 1.45;\n}\n\n.pc-layout-upload-status.loaded {\n    color: var(--pc-green);\n    font-weight: 600;\n}\n\n.pc-layout-upload-status.error {\n    color: #c0392b;\n}\n\n.pc-upload-privacy-note {\n    margin-top: 6px;\n    font-size: 10.5px;\n    line-height: 1.45;\n    color: #7f8a94;\n}\n\n\/* =========================\n   VALIDATION AREA\n========================= *\/\n\n\n.pc-access-row {\n    display: grid;\n    grid-template-columns: 1fr 110px;\n    gap: 10px;\n    align-items: stretch;\n    width: 100%;\n    margin-bottom: 10px;\n}\n\n.pc-access-code {\n    width: 100%;\n    min-width: 0;\n    height: 58px;\n    box-sizing: border-box;\n    border: 1px solid #d7dee5;\n    border-radius: 8px;\n    padding: 0 14px;\n    font-size: 16px;\n    background: #ffffff;\n    outline: none;\n}\n\n.pc-validate-access {\n    width: 110px;\n    height: 58px;\n    box-sizing: border-box;\n    border: 1px solid #0c2d50;\n    border-radius: 8px;\n    background: #ffffff;\n    color: #0c2d50;\n    font-weight: 700;\n    cursor: pointer;\n    white-space: nowrap;\n}\n\n.pc-validate-access:hover {\n    background: #0c2d50;\n    color: #ffffff;\n}\n\n.pc-access-status {\n    min-height: 18px;\n    margin: -2px 0 8px;\n    font-size: 12px;\n    line-height: 1.4;\n}\n\n.pc-access-status.valid {\n    color: #66b447;\n}\n\n.pc-access-status.invalid {\n    color: #c0392b;\n}\n\n.pc-generation-limit-note {\n\n    margin-top: 12px;\n\n    padding: 10px 14px;\n\n    background: #f1f3f5;\n\n    border-radius: 7px;\n\n    color: #687684;\n\n    font-size: 12px;\n\n    line-height: 1.5;\n}\n\n#pc-runs-remaining {\n\n    font-weight: 700;\n\n    color: var(--pc-navy);\n}\n\n\/* =========================\n   AI CONCEPT DISCLAIMER\n========================= *\/\n\n.pc-ai-disclaimer {\n\n    margin-top: 8px;\n\n    padding: 10px 0;\n\n    color: #9aa5ad;\n\n    font-size: 10.5px;\n\n    line-height: 1.55;\n\n    font-style: italic;\n}\n\n@media (max-width: 600px) {\n\n    .pc-access-row {\n        grid-template-columns: 1fr 100px;\n    }\n\n    .pc-validate-access {\n        width: 100px;\n    }\n\n}\n\n@media (max-width: 500px) {\n\n    #pc-generation-status {\n        inset: 8px;\n        padding: 4px 8px;\n        box-sizing: border-box;\n    }\n\n    .pc-status-logo {\n        width: 52px;\n        height: 52px;\n        flex: 0 0 52px;\n        margin: 0 auto 10px;\n        background: transparent !important;\n        border-radius: 0;\n    }\n\n    .pc-status-logo img {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        display: block;\n    }\n\n    #pc-generation-status h3 {\n        margin: 0 0 6px;\n        font-size: 17px;\n        line-height: 1.2;\n    }\n\n    #pc-generation-status p {\n        margin: 0 0 10px;\n        font-size: 11px;\n        line-height: 1.3;\n    }\n\n    .pc-progress-track {\n        width: 90%;\n        height: 7px;\n    }\n\n    #pc-progress-time {\n        margin-top: 6px;\n        font-size: 10px;\n    }\n\n}\n\n\/* =========================\n   MAIN WIDTH\n========================= *\/\n\n#pc-ai-designer {\n\n    --pc-navy: #092546;\n    --pc-green: #66b447;\n    --pc-light: #f4f7f9;\n    --pc-border: #dce3e8;\n    --pc-text: #253445;\n\n    width: 100%;\n    max-width: 1280px;\n\n    margin: 0 auto;\n\n    font-family:\n        Arial,\n        Helvetica,\n        sans-serif;\n\n    color: var(--pc-text);\n\n    box-sizing: border-box;\n}\n\n\n\/* =========================\n   HEADER\n========================= *\/\n\n.pc-header {\n    width: 100%;\n    margin-bottom: 28px;\n}\n\n.pc-eyebrow {\n    margin-bottom: 8px;\n\n    color: var(--pc-green);\n\n    font-size: 12px;\n    font-weight: 700;\n    letter-spacing: 2px;\n}\n\n.pc-header h2 {\n    margin: 0 0 8px;\n\n    color: var(--pc-navy);\n\n    font-size: 36px;\n    line-height: 1.15;\n}\n\n.pc-header p {\n    margin: 0;\n\n    color: #687684;\n\n    font-size: 16px;\n}\n\n\n\/* =========================\n   GRID\n========================= *\/\n\n.pc-grid {\n\n    width: 100%;\n\n    display: grid;\n\n    grid-template-columns:\n        390px\n        minmax(0, 1fr);\n\n    gap: 28px;\n\n    align-items: start;\n}\n\n\n\/* =========================\n   LEFT PANEL\n========================= *\/\n\n.pc-panel {\n\n    width: 100%;\n\n    box-sizing: border-box;\n\n    padding: 26px;\n\n    background: #ffffff;\n\n    border:\n        1px solid\n        var(--pc-border);\n\n    border-radius: 16px;\n}\n\n\n\/* =========================\n   FIELDS\n========================= *\/\n\n.pc-field {\n    margin-bottom: 22px;\n}\n\n.pc-field label {\n\n    display: block;\n\n    margin-bottom: 9px;\n\n    color: var(--pc-navy);\n\n    font-size: 13px;\n    font-weight: 700;\n}\n\n\n\/* =========================\n   PROJECT VISION SECTION\n\n   Visually separates Application + Additional project details\n   from the structural\/mechanical fields above \u2014 these two are\n   what actually shape the AI's creative output, everything\n   above them is closer to fixed configuration.\n========================= *\/\n\n.pc-vision-section {\n\n    margin: 26px 0 24px;\n\n    padding: 17px;\n\n    background: #f6fbf3;\n\n    border: 1px solid #d7ecc9;\n    border-radius: 12px;\n}\n\n.pc-vision-heading {\n\n    display: flex;\n    flex-direction: column;\n    gap: 3px;\n\n    margin-bottom: 15px;\n}\n\n.pc-vision-heading-title {\n\n    font-size: 12.5px;\n    font-weight: 700;\n\n    color: var(--pc-navy);\n}\n\n.pc-vision-heading-sub {\n\n    font-size: 10.5px;\n    line-height: 1.4;\n\n    color: #5c7a49;\n}\n\n.pc-field-last {\n    margin-bottom: 0;\n}\n\n.pc-field select,\n.pc-field textarea {\n\n    width: 100%;\n\n    box-sizing: border-box;\n\n    padding: 12px 13px;\n\n    border:\n        1px solid\n        var(--pc-border);\n\n    border-radius: 8px;\n\n    background: #ffffff;\n\n    color: var(--pc-text);\n\n    font-size: 14px;\n\n    outline: none;\n\n    transition:\n        border-color 0.2s ease,\n        box-shadow 0.2s ease;\n}\n\n.pc-field select:focus,\n.pc-field textarea:focus {\n\n    border-color: var(--pc-green);\n\n    box-shadow:\n        0 0 0 3px\n        rgba(102,180,71,0.12);\n}\n\n.pc-field select:disabled {\n\n    background: #f1f3f5;\n\n    border-color: var(--pc-border);\n\n    color: #9aa5ad;\n\n    cursor: not-allowed;\n}\n\n.pc-disabled-hint {\n\n    margin-top: 7px;\n\n    color: #82909c;\n\n    font-size: 11px;\n\n    line-height: 1.45;\n\n    font-style: italic;\n}\n\n.pc-field textarea {\n\n    min-height: 135px;\n\n    resize: vertical;\n}\n\n.pc-prompt-hint {\n\n    margin-top: 7px;\n\n    color: #82909c;\n\n    font-size: 11px;\n\n    line-height: 1.45;\n}\n\n\n.pc-example-heading {\n    margin-bottom: 11px;\n    color: #5c7a49;\n    font-size: 11px;\n    line-height: 1.45;\n}\n\n.pc-example-audience-toggle {\n    display: flex;\n    gap: 8px;\n    margin-bottom: 10px;\n}\n\n.pc-audience-button {\n    padding: 7px 14px;\n    border: 1px solid #d7ecc9;\n    border-radius: 20px;\n    background: #fff;\n    color: var(--pc-navy);\n    font-size: 12px;\n    font-weight: 700;\n    cursor: pointer;\n}\n\n.pc-audience-button.active {\n    background: var(--pc-green);\n    border-color: var(--pc-green);\n    color: #fff;\n}\n\n.pc-example-buttons {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n}\n\n.pc-example-prompt-button {\n    padding: 9px 13px;\n    border: 1px solid #d7dee5;\n    border-radius: 7px;\n    background: #fff;\n    color: var(--pc-navy);\n    font-size: 12px;\n    font-weight: 700;\n    cursor: pointer;\n    text-align: left;\n    transition: 0.15s ease;\n}\n\n.pc-example-prompt-button:hover,\n.pc-example-prompt-button.pc-example-selected {\n    border-color: var(--pc-green);\n    background: #eef8e9;\n    color: #4f9635;\n}\n\n.pc-numbered-title {\n    margin-top: 4px;\n    margin-bottom: 14px;\n    color: var(--pc-navy);\n    font-size: 13px;\n    font-weight: 700;\n}\n\n.pc-description-section {\n    margin: 26px 0 24px;\n    padding: 17px;\n    background: #f6fbf3;\n    border: 1px solid #d7ecc9;\n    border-radius: 12px;\n}\n\n.pc-description-section .pc-numbered-title {\n    margin-top: 0;\n}\n\n\n\/* =====================================================\n   VISION TOOLS\n===================================================== *\/\n\n.pc-vision-tools {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n\n    margin-top: 12px;\n}\n\n\n.pc-vision-tool-button {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 6px;\n\n    min-height: 36px;\n\n    padding: 0 12px;\n\n    border: 1px solid #d7dee5;\n    border-radius: 7px;\n\n    background: #ffffff;\n    color: #092546;\n\n    font-size: 11px;\n    font-weight: 700;\n\n    cursor: pointer;\n\n    transition:\n        border-color .18s ease,\n        background .18s ease,\n        color .18s ease;\n}\n\n\n.pc-vision-tool-button:hover {\n    border-color: #66b447;\n    background: #f6fbf3;\n    color: #4f9635;\n}\n\n\n.pc-vision-tool-button:disabled {\n    opacity: .65;\n    cursor: wait;\n}\n\n\n.pc-undo-enhance {\n    color: #687684;\n    border-color: #e1e6ea;\n}\n\n.pc-undo-enhance:hover {\n    color: #092546;\n    border-color: #cbd4da;\n    background: #f7f9fa;\n}\n\n\n.pc-preset-toggle {\n    margin-left: auto;\n}\n\n\n.pc-preset-arrow {\n    display: inline-block;\n\n    font-size: 18px;\n    line-height: 1;\n\n    transition:\n        transform .2s ease;\n}\n\n\n.pc-preset-toggle.is-open\n.pc-preset-arrow {\n    transform: rotate(90deg);\n}\n\n\n\/* =====================================================\n   PRESET PANEL\n===================================================== *\/\n\n.pc-preset-panel {\n    margin-top: 10px;\n    padding: 12px;\n\n    border: 1px solid #d7ecc9;\n    border-radius: 9px;\n\n    background: #f8fbf6;\n}\n\n\n.pc-preset-panel .pc-example-heading {\n    margin-bottom: 10px;\n\n    color: #687684;\n\n    font-size: 10.5px;\n    line-height: 1.45;\n}\n\n\n.pc-preset-panel .pc-example-buttons {\n    display: flex;\n    flex-direction: column;\n    gap: 7px;\n}\n\n\n.pc-preset-panel .pc-example-prompt-button {\n    width: 100%;\n\n    padding: 9px 11px;\n\n    text-align: left;\n}\n\n.pc-background-step {\n    margin-top: 14px;\n    padding-top: 13px;\n    border-top: 1px solid #d7ecc9;\n}\n\n.pc-background-heading {\n    margin-bottom: 10px;\n    color: #687684;\n    font-size: 10.5px;\n    line-height: 1.45;\n}\n\n.pc-background-group + .pc-background-group { margin-top: 11px; }\n\n.pc-background-group-title {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    margin-bottom: 6px;\n    color: #4f9635;\n    font-size: 10px;\n    font-weight: 700;\n    letter-spacing: .02em;\n    text-transform: uppercase;\n}\n\n.pc-background-info {\n    position: relative;\n    display: inline-flex;\n    align-items: center;\n    text-transform: none;\n}\n\n.pc-background-info-button {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 16px;\n    height: 16px;\n    padding: 0;\n    border: 1px solid #9aa8b3;\n    border-radius: 50%;\n    background: transparent;\n    color: #7a8995;\n    font-family: Arial, sans-serif;\n    font-size: 10px;\n    font-weight: 700;\n    line-height: 1;\n    cursor: help;\n}\n\n.pc-background-info-button:hover,\n.pc-background-info-button:focus-visible {\n    border-color: var(--pc-green);\n    color: var(--pc-green);\n    outline: none;\n}\n\n.pc-background-info-tooltip {\n    position: absolute;\n    z-index: 20;\n    left: 50%;\n    bottom: calc(100% + 8px);\n    width: 230px;\n    padding: 9px 10px;\n    border-radius: 7px;\n    background: #26343d;\n    color: #fff;\n    font-size: 10.5px;\n    font-weight: 400;\n    line-height: 1.45;\n    letter-spacing: 0;\n    text-align: left;\n    text-transform: none;\n    box-shadow: 0 5px 16px rgba(24, 38, 48, .18);\n    opacity: 0;\n    visibility: hidden;\n    pointer-events: none;\n    transform: translate(-50%, 4px);\n    transition: opacity .15s ease, transform .15s ease, visibility .15s ease;\n}\n\n.pc-background-info-tooltip::after {\n    content: \"\";\n    position: absolute;\n    top: 100%;\n    left: 50%;\n    border: 5px solid transparent;\n    border-top-color: #26343d;\n    transform: translateX(-50%);\n}\n\n.pc-background-info:hover .pc-background-info-tooltip,\n.pc-background-info:focus-within .pc-background-info-tooltip {\n    opacity: 1;\n    visibility: visible;\n    transform: translate(-50%, 0);\n}\n\n.pc-background-group-buttons {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 7px;\n}\n\n.pc-background-group-siteSetting .pc-background-prompt-button:nth-child(3) {\n    grid-column: 1 \/ -1;\n}\n\n.pc-background-prompt-button {\n    min-width: 0;\n    padding: 9px 8px;\n    border: 1px solid #d7dee5;\n    border-radius: 7px;\n    background: #fff;\n    color: #56636f;\n    font-size: 10.5px;\n    line-height: 1.3;\n    text-align: center;\n    white-space: normal;\n    overflow-wrap: anywhere;\n    cursor: pointer;\n    transition: .15s ease;\n}\n\n.pc-background-prompt-button:hover,\n.pc-background-prompt-button.pc-background-selected {\n    border-color: var(--pc-green);\n    background: #eef8e9;\n    color: #4f9635;\n}\n\n.pc-apply-preset {\n    width: 100%;\n    margin-top: 12px;\n    padding: 10px 14px;\n    border: 0;\n    border-radius: 7px;\n    background: var(--pc-green);\n    color: #fff;\n    font-size: 11px;\n    font-weight: 700;\n    cursor: pointer;\n}\n\n.pc-apply-preset:disabled {\n    background: #cbd3d8;\n    cursor: not-allowed;\n}\n\n@media (max-width: 600px) {\n    .pc-background-group-buttons { grid-template-columns: 1fr; }\n    .pc-background-prompt-button { text-align: left; }\n}\n\n\n\/* =========================\n   APPLICATION HELP\n========================= *\/\n\n#pc-application-help {\n\n    margin-top: 9px;\n\n    padding: 10px 11px;\n\n    border-radius: 7px;\n\n    background: #f4f7f9;\n\n    color: #687684;\n\n    font-size: 11px;\n\n    line-height: 1.45;\n}\n\n\n\/* =========================\n   PROJECT REFERENCE HELP\n========================= *\/\n\n#pc-reference-mode-help {\n\n    margin-top: 9px;\n\n    padding: 10px 11px;\n\n    border-radius: 7px;\n\n    background: #f4f7f9;\n\n    color: #687684;\n\n    font-size: 11px;\n\n    line-height: 1.45;\n}\n\n\n\/* =========================\n   ENVIRONMENT TOGGLE\n========================= *\/\n\n.pc-toggle {\n\n    display: grid;\n\n    grid-template-columns:\n        1fr\n        1fr;\n\n    padding: 4px;\n\n    border-radius: 9px;\n\n    background: #edf1f4;\n}\n\n.pc-toggle button {\n\n    padding: 11px;\n\n    border: 0;\n\n    border-radius: 7px;\n\n    background: transparent;\n\n    color: var(--pc-navy);\n\n    cursor: pointer;\n\n    font-weight: 700;\n\n    transition: 0.2s ease;\n}\n\n.pc-toggle button.active {\n\n    background: #ffffff;\n\n    color: var(--pc-green);\n\n    box-shadow:\n        0 2px 8px\n        rgba(0,0,0,0.08);\n}\n\n\n.pc-ready-intro {\n    margin: 22px 0 12px;\n    text-align: center;\n}\n\n.pc-ready-title {\n    color: var(--pc-navy);\n    font-size: 13px;\n    font-weight: 700;\n}\n\n.pc-ready-copy {\n    margin-top: 4px;\n    color: #687684;\n    font-size: 11px;\n    line-height: 1.45;\n}\n\n\n\/* =========================\n   GENERATE BUTTON\n========================= *\/\n\n#pc-generate {\n\n    width: 100%;\n\n    padding: 15px 18px;\n\n    border: none;\n\n    border-radius: 8px;\n\n    \/* Default = locked *\/\n    background: #d7dee5;\n\n    color: #ffffff;\n\n    cursor: not-allowed;\n\n    font-size: 15px;\n\n    font-weight: 700;\n\n    transition:\n        background 0.2s ease,\n        transform 0.2s ease,\n        filter 0.2s ease;\n}\n\n\n\/* Access code validated *\/\n\n#pc-generate.pc-access-active {\n\n    background: var(--pc-green);\n\n    cursor: pointer;\n}\n\n\n\/* Hover only when active *\/\n\n#pc-generate.pc-access-active:hover {\n\n    transform: translateY(-1px);\n\n    filter: brightness(0.96);\n}\n\n\n\/* Disabled *\/\n\n#pc-generate:disabled {\n\n    background: #d7dee5;\n\n    color: #ffffff;\n\n    cursor: not-allowed;\n\n    opacity: 1;\n\n    transform: none;\n\n    filter: none;\n}\n\n\n\/* =========================\n   SPINNER\n========================= *\/\n\n.pc-spinner {\n\n    display: none;\n\n    width: 16px;\n\n    height: 16px;\n\n    margin-left: 8px;\n\n    border:\n        2px solid\n        rgba(255,255,255,0.4);\n\n    border-top-color:\n        #ffffff;\n\n    border-radius: 50%;\n\n    vertical-align: middle;\n\n    animation:\n        pcSpin\n        0.8s\n        linear\n        infinite;\n}\n\n#pc-generate.loading\n.pc-spinner {\n\n    display: inline-block;\n}\n\n@keyframes pcSpin {\n\n    to {\n        transform: rotate(360deg);\n    }\n\n}\n\n\n\/* =========================\n   RESULT COLUMN\n========================= *\/\n\n.pc-result-column {\n\n    width: 100%;\n\n    min-width: 0;\n}\n\n\n\/* =========================\n   FIXED 3:2 CANVAS\n========================= *\/\n\n.pc-result-panel {\n\n    position: relative;\n\n    width: 100%;\n\n    aspect-ratio: 3 \/ 2;\n\n    overflow: hidden;\n\n    box-sizing: border-box;\n\n    display: flex;\n\n    align-items: center;\n\n    justify-content: center;\n\n    padding: 20px;\n\n    background:\n        linear-gradient(\n            135deg,\n            #f5f8fa,\n            #e9eef2\n        );\n\n    border:\n        1px solid\n        var(--pc-border);\n\n    border-radius: 16px;\n}\n\n\n\/* =========================\n   PLACEHOLDER\n========================= *\/\n\n#pc-placeholder {\n\n    position: absolute;\n\n    inset: 20px;\n\n    display: flex;\n\n    flex-direction: column;\n\n    align-items: center;\n\n    justify-content: center;\n\n    text-align: center;\n}\n.pc-placeholder-icon {\n    width: 94px;\n    height: 94px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    margin: 0 auto 28px;\n\n    background: transparent;\n}\n\n.pc-placeholder-icon img {\n    width: 100%;\n    height: 100%;\n\n    object-fit: contain;\n    display: block;\n}\n\n\n.pc-placeholder-icon,\n.pc-status-logo {\n    width: 94px;\n    height: 94px;\n\n    flex: 0 0 94px;\n\n    margin:\n        0 auto\n        20px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    background: transparent;\n    border-radius: 0;\n}\n\n.pc-status-logo img {\n    width: 100%;\n    height: 100%;\n\n    object-fit: contain;\n    display: block;\n\n    background: transparent;\n}\n\n#pc-placeholder h3,\n#pc-generation-status h3 {\n\n    margin:\n        0 0 10px;\n\n    color:\n        var(--pc-navy);\n\n    font-size: 22px;\n}\n\n#pc-placeholder p {\n\n    margin: 0;\n\n    max-width: 460px;\n\n    color: #75818b;\n\n    line-height: 1.6;\n}\n\n\n\/* =========================\n   GENERATION STATUS\n========================= *\/\n\n#pc-generation-status {\n\n    position: absolute;\n\n    inset: 20px;\n\n    width: auto;\n\n    display: flex;\n\n    flex-direction: column;\n\n    align-items: center;\n\n    justify-content: center;\n\n    text-align: center;\n}\n\n#pc-generation-status p {\n\n    margin:\n        0 0 18px;\n\n    color: #687684;\n\n    font-size: 13px;\n}\n\n.pc-progress-track {\n\n    width:\n        min(520px, 75%);\n\n    height: 9px;\n\n    overflow: hidden;\n\n    border-radius: 30px;\n\n    background: #dfe6ea;\n}\n\n#pc-progress-bar {\n\n    width: 0%;\n\n    height: 100%;\n\n    border-radius: 30px;\n\n    background:\n        var(--pc-green);\n\n    transition:\n        width 1s linear;\n}\n\n#pc-progress-time {\n\n    margin-top: 9px;\n\n    color: #82909c;\n\n    font-size: 11px;\n}\n\n\n\/* =========================\n   GENERATED IMAGE\n========================= *\/\n\n#pc-result {\n\n    position: absolute;\n\n    inset: 20px;\n\n    overflow: hidden;\n\n    border-radius: 10px;\n}\n\n#pc-result-image {\n\n    display: block;\n\n    width: 100%;\n\n    height: 100%;\n\n    object-fit: contain;\n\n    object-position: center;\n\n    border-radius: 10px;\n}\n\n\n\/* =========================\n   RESULT ACTIONS\n========================= *\/\n\n.pc-result-actions {\n\n    min-height: 46px;\n\n    display: flex;\n\n    align-items: center;\n\n    justify-content: flex-end;\n\n    gap: 10px;\n\n    margin-top: 14px;\n}\n\n.pc-result-actions button,\n.pc-download {\n\n    padding: 11px 16px;\n\n    border-radius: 7px;\n\n    font-size: 13px;\n\n    font-weight: 700;\n\n    cursor: pointer;\n\n    text-decoration: none;\n}\n\n.pc-secondary {\n\n    background: #ffffff;\n\n    color:\n        var(--pc-navy);\n\n    border:\n        1px solid\n        var(--pc-border);\n}\n\n.pc-download {\n    position: relative;\n    display: inline-flex;\n    align-items: center;\n    gap: 11px;\n    min-height: 48px;\n    padding: 7px 8px 7px 14px;\n    overflow: hidden;\n    border: 1px solid rgba(255,255,255,0.20);\n    border-radius: 10px;\n    background: linear-gradient(180deg, #71c653 0%, #55b73e 52%, #42a933 100%);\n    color: #ffffff;\n    box-shadow: 0 8px 20px rgba(82,181,61,0.24), inset 0 1px 0 rgba(255,255,255,0.28);\n    transition: transform .18s ease, box-shadow .18s ease, filter .18s ease;\n}\n\n.pc-download::before {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    pointer-events: none;\n    background: linear-gradient(115deg, rgba(255,255,255,0.18), transparent 38%);\n}\n\n.pc-download:hover {\n    transform: translateY(-2px);\n    filter: saturate(1.05);\n    box-shadow: 0 12px 26px rgba(82,181,61,0.32), inset 0 1px 0 rgba(255,255,255,0.32);\n}\n\n.pc-download:active {\n    transform: translateY(0);\n    box-shadow: 0 5px 14px rgba(82,181,61,0.22), inset 0 1px 0 rgba(255,255,255,0.22);\n}\n\n.pc-download-icon,\n.pc-download-arrow {\n    position: relative;\n    z-index: 1;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    flex: 0 0 auto;\n}\n\n.pc-download-icon svg {\n    width: 20px;\n    height: 20px;\n    fill: none;\n    stroke: currentColor;\n    stroke-width: 1.9;\n    stroke-linecap: round;\n    stroke-linejoin: round;\n}\n\n.pc-download-divider {\n    position: relative;\n    z-index: 1;\n    width: 1px;\n    height: 24px;\n    background: rgba(255,255,255,0.30);\n}\n\n.pc-download-label {\n    position: relative;\n    z-index: 1;\n    white-space: nowrap;\n}\n\n.pc-download-arrow {\n    width: 34px;\n    height: 34px;\n    margin-left: 2px;\n    border-radius: 50%;\n    background: rgba(18,117,46,0.24);\n    transition: transform .18s ease, background .18s ease;\n}\n\n.pc-download-arrow svg {\n    width: 18px;\n    height: 18px;\n    fill: none;\n    stroke: currentColor;\n    stroke-width: 2;\n    stroke-linecap: round;\n    stroke-linejoin: round;\n}\n\n.pc-download:hover .pc-download-arrow {\n    transform: translateX(2px);\n    background: rgba(18,117,46,0.34);\n}\n\n\n\/* =========================\n   ERROR\n========================= *\/\n\n#pc-error {\n\n    display: none;\n\n    margin-top: 14px;\n\n    padding: 12px;\n\n    border-radius: 7px;\n\n    background: #fff0f0;\n\n    color: #a22;\n\n    font-size: 13px;\n\n    line-height: 1.5;\n}\n\n\n\/* =========================\n   TABLET\n========================= *\/\n\n@media (max-width: 1100px) {\n\n    #pc-ai-designer {\n\n        padding-left: 20px;\n\n        padding-right: 20px;\n    }\n\n    .pc-grid {\n\n        grid-template-columns:\n            340px\n            minmax(0,1fr);\n\n        gap: 20px;\n    }\n\n}\n\n\n\/* =========================\n   MOBILE\n========================= *\/\n\n@media (max-width: 850px) {\n\n    .pc-grid {\n\n        grid-template-columns:\n            1fr;\n    }\n\n    .pc-result-column {\n\n        width: 100%;\n    }\n\n}\n\n\n@media (max-width: 500px) {\n\n    .pc-header h2 {\n\n        font-size: 28px;\n    }\n\n    .pc-panel {\n\n        padding: 18px;\n    }\n\n    .pc-result-panel {\n\n        padding: 12px;\n    }\n\n    #pc-placeholder,\n    #pc-generation-status,\n    #pc-result {\n\n        inset: 12px;\n    }\n\n}\n\n\n\/* =========================\n   PADEL VISION EXPERIENCE\n========================= *\/\n.pc-header h2 span { color: var(--pc-green); }\n.pc-header p { max-width: 820px; line-height: 1.6; }\n.pc-panel { box-shadow: 0 18px 45px rgba(9,37,70,0.07); }\n.pc-vision-section { margin-top: 0; background: linear-gradient(180deg,#f7fbf5,#ffffff); border-color: #d7ecc9; }\n.pc-vision-heading-title { font-size: 18px; line-height: 1.25; }\n.pc-vision-heading-sub { font-size: 12px; line-height: 1.55; margin-top: 3px; }\n.pc-mini-section-title { margin: 4px 0 12px; padding-top: 16px; border-top: 1px solid var(--pc-border); color: #82909c; font-size: 11px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; }\n.pc-access-intro { margin: 6px 0 12px; }\n.pc-access-title { color: var(--pc-navy); font-size: 13px; font-weight: 700; margin-bottom: 4px; }\n.pc-access-copy { color: #82909c; font-size: 11px; line-height: 1.45; }\n#pc-generate { min-height: 58px; text-transform: uppercase; letter-spacing: .5px; }\n\n.pc-ai-disclosure {\n    margin-top: 8px;\n    margin-bottom: 6px;\n    font-size: 11px;\n    line-height: 1.45;\n    color: #7f8a94;\n}\n\n.pc-ai-disclosure strong {\n    font-weight: 600;\n    color: #687684;\n}\n\n.pc-ai-disclosure a {\n    color: #687684;\n    text-decoration: underline;\n    text-underline-offset: 2px;\n}\n\n.pc-ai-disclosure a:hover {\n    color: #092546;\n}\n\n.pc-result-panel { background: radial-gradient(circle at 50% 35%,#ffffff 0%,#f3f6f8 48%,#e9eef2 100%); }\n.pc-result-eyebrow { margin-bottom: 12px; color: var(--pc-green); font-size: 10px; font-weight: 700; letter-spacing: 1.5px; }\n.pc-result-story { margin-top: 16px; padding: 18px 20px; border-radius: 12px; background: #f6fbf3; border: 1px solid #d7ecc9; }\n.pc-result-story-kicker { color: var(--pc-green); font-size: 11px; font-weight: 800; letter-spacing: 1.4px; margin-bottom: 5px; }\n.pc-result-story-title { color: var(--pc-navy); font-size: 20px; font-weight: 700; line-height: 1.25; }\n.pc-result-story-copy { margin-top: 6px; color: #687684; font-size: 12px; line-height: 1.5; }\n\n\n\/* =========================================\n   SAVE MY CONCEPT \u2014 FORCE WHITE CONTENT\n========================================= *\/\n\n#pc-download,\n#pc-download:hover,\n#pc-download:focus,\n#pc-download:active,\n#pc-download:visited {\n    color: #ffffff !important;\n    text-decoration: none !important;\n}\n\n#pc-download .pc-download-label {\n    color: #ffffff !important;\n    background: transparent !important;\n    font-weight: 700;\n    text-shadow: 0 1px 2px rgba(0,70,30,.12);\n}\n\n#pc-download .pc-download-icon,\n#pc-download .pc-download-arrow {\n    color: #ffffff !important;\n}\n\n#pc-download svg {\n    stroke: #ffffff !important;\n}\n\n#pc-download .pc-download-divider {\n    background: rgba(255,255,255,.38) !important;\n}\n\n#pc-download .pc-download-arrow {\n    background: rgba(0,90,40,.22) !important;\n}\n\n\n\/* =====================================================\n   INSPIRATION GALLERY\n===================================================== *\/\n\n.pc-inspiration-gallery {\n    margin-top: 42px;\n    padding-top: 26px;\n    border-top: 1px solid #dce5eb;\n}\n\n.pc-gallery-heading {\n    margin-bottom: 18px;\n}\n\n.pc-gallery-eyebrow {\n    margin-bottom: 5px;\n    color: #55b73e;\n    font-size: 10px;\n    font-weight: 700;\n    letter-spacing: 1.5px;\n}\n\n.pc-gallery-heading h3 {\n    margin: 0 0 5px;\n    color: #092546;\n    font-size: 20px;\n    line-height: 1.25;\n}\n\n.pc-gallery-heading p {\n    max-width: 620px;\n    margin: 0;\n    color: #71808d;\n    font-size: 11px;\n    line-height: 1.5;\n}\n\n\n\/* GRID *\/\n\n.pc-gallery-grid {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 12px;\n}\n\n.pc-gallery-card {\n    position: relative;\n    overflow: hidden;\n    aspect-ratio: 3 \/ 2;\n    border-radius: 9px;\n    background: #eef2f4;\n    cursor: pointer;\n}\n\n.pc-gallery-card img {\n    display: block;\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    transition: transform .25s ease;\n}\n\n.pc-gallery-card:hover img {\n    transform: scale(1.025);\n}\n\n\n\/* =====================================================\n   GALLERY CARD - LOCKED \/ UNLOCKED STATES\n===================================================== *\/\n\n.pc-gallery-card {\n    position: relative;\n}\n\n\n\/* LOCKED IMAGE *\/\n\n.pc-gallery-card.pc-gallery-locked {\n    cursor: default;\n}\n\n.pc-gallery-card.pc-gallery-locked img {\n    filter: blur(0.8px);\n    transform: scale(1.02);\n}\n\n\n\/* =====================================================\n   LOCKED INFO ICON\n===================================================== *\/\n\n.pc-gallery-info {\n    position: absolute;\n\n    right: 11px;\n    bottom: 11px;\n\n    z-index: 3;\n\n    width: 22px;\n    height: 22px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    box-sizing: border-box;\n\n    border: 1.2px solid rgba(220, 225, 230, .9);\n    border-radius: 50%;\n\n    background: transparent;\n\n    color: rgba(220, 225, 230, .9);\n\n    font-family: Georgia, serif;\n    font-size: 14px;\n    font-weight: 700;\n    font-style: italic;\n    line-height: 1;\n\n    cursor: help;\n\n    text-shadow:\n        0 1px 3px rgba(0,0,0,.45);\n\n    transition:\n        color .18s ease,\n        border-color .18s ease,\n        transform .18s ease;\n}\n\n\n.pc-gallery-info:hover {\n    color: #ffffff;\n    border-color: #ffffff;\n    background: transparent;\n    transform: scale(1.05);\n}\n\n\n\/* =====================================================\n   INFO TOOLTIP\n===================================================== *\/\n\n.pc-gallery-info-tooltip {\n    position: absolute;\n\n    right: -4px;\n    bottom: 30px;\n\n    padding: 6px 9px;\n\n    border-radius: 7px;\n\n    background: rgba(20,24,30,.92);\n    color: #ffffff;\n\n    font-family: Arial, sans-serif;\n    font-size: 9px;\n    font-weight: 700;\n    font-style: normal;\n\n    white-space: nowrap;\n\n    opacity: 0;\n    visibility: hidden;\n\n    transform: translateY(4px);\n\n    pointer-events: none;\n\n    transition:\n        opacity .16s ease,\n        visibility .16s ease,\n        transform .16s ease;\n}\n\n\n\/* Small tooltip pointer *\/\n\n.pc-gallery-info-tooltip::after {\n    content: \"\";\n\n    position: absolute;\n\n    right: 12px;\n    bottom: -5px;\n\n    width: 10px;\n    height: 10px;\n\n    background: rgba(20,24,30,.92);\n\n    transform: rotate(45deg);\n}\n\n\n.pc-gallery-info:hover\n.pc-gallery-info-tooltip {\n    opacity: 1;\n    visibility: visible;\n\n    transform: translateY(0);\n}\n\n\n\/* =====================================================\n   UNLOCKED GALLERY - VIEW ICON\n===================================================== *\/\n\n.pc-gallery-view {\n    position: absolute;\n\n    right: 11px;\n    bottom: 11px;\n\n    width: 30px;\n    height: 30px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 0;\n\n    border: 0;\n    border-radius: 50%;\n\n    background: #092546;\n    color: #ffffff;\n\n    cursor: pointer;\n\n    transition:\n        background .18s ease,\n        transform .18s ease;\n}\n\n\n.pc-gallery-view:hover {\n    background: #123b66;\n    transform: scale(1.06);\n}\n\n\n.pc-gallery-view svg {\n    width: 15px;\n    height: 15px;\n\n    display: block;\n\n    stroke: currentColor;\n}\n\n\n\/* LOADING \/ EMPTY *\/\n\n.pc-gallery-empty {\n    padding: 22px 0;\n    color: #83909a;\n    font-size: 11px;\n}\n\n\n\/* =====================================================\n   GALLERY - SHOW MORE\n===================================================== *\/\n\n.pc-gallery-more-wrap {\n    width: 100%;\n    display: flex;\n    justify-content: center;\n    gap: 10px;\n    margin-top: 18px;\n}\n\n.pc-gallery-more,\n.pc-gallery-less {\n    padding: 9px 18px;\n\n    border: 1px solid #092546;\n    border-radius: 6px;\n\n    background: #ffffff;\n    color: #092546;\n\n    font-size: 10px;\n    font-weight: 700;\n    letter-spacing: .8px;\n\n    cursor: pointer;\n\n    transition:\n        background .18s ease,\n        color .18s ease,\n        transform .18s ease;\n}\n\n.pc-gallery-more:hover,\n.pc-gallery-less:hover {\n    background: #092546;\n    color: #ffffff;\n    transform: translateY(-1px);\n}\n\n\n\/* =====================================================\n   LOCKED GALLERY CTA\n===================================================== *\/\n\n.pc-gallery-lock-message {\n    margin: 0 0 18px;\n    padding: 15px 16px;\n\n    border: 1px solid #d7ecc9;\n    border-radius: 11px;\n\n    background:\n        linear-gradient(\n            135deg,\n            #f6fbf3,\n            #ffffff\n        );\n}\n\n\n.pc-gallery-lock-top {\n    display: flex;\n    align-items: center;\n    gap: 14px;\n}\n\n\n.pc-gallery-lock-icon {\n    flex: 0 0 auto;\n    font-size: 20px;\n}\n\n\n.pc-gallery-lock-content {\n    flex: 1;\n    min-width: 0;\n}\n\n\n.pc-gallery-lock-title {\n    margin-bottom: 3px;\n\n    color: #092546;\n\n    font-size: 12px;\n    font-weight: 700;\n}\n\n\n.pc-gallery-lock-copy {\n    color: #687684;\n\n    font-size: 10.5px;\n    line-height: 1.45;\n}\n\n\n.pc-gallery-lock-button {\n    flex: 0 0 auto;\n\n    padding: 9px 13px;\n\n    border-radius: 7px;\n\n    background: #55b73e;\n\n    color: #ffffff !important;\n\n    font-size: 10px;\n    font-weight: 700;\n\n    text-decoration: none !important;\n\n    white-space: nowrap;\n\n    transition:\n        transform .18s ease,\n        background .18s ease;\n}\n\n\n.pc-gallery-lock-button:hover {\n    background: #45a532;\n    transform: translateY(-1px);\n}\n\n\n\/* SMALL DIVIDER *\/\n\n.pc-gallery-access-divider {\n    width: 1px;\n    height: 34px;\n\n    flex: 0 0 auto;\n\n    margin: 0 2px;\n\n    background: #dde5df;\n}\n\n\n\/* ACCESS FIELD + ARROW *\/\n\n.pc-gallery-access-inline {\n    display: flex;\n    align-items: center;\n    gap: 7px;\n\n    flex: 0 0 auto;\n}\n\n\n.pc-gallery-access-code {\n    width: 190px;\n    height: 40px;\n\n    box-sizing: border-box;\n\n    padding: 0 12px;\n\n    border: 1px solid #cfd8de;\n    border-radius: 7px;\n\n    background: #ffffff;\n\n    color: #092546;\n\n    font-size: 11px;\n\n    outline: none;\n\n    transition:\n        border-color .18s ease,\n        box-shadow .18s ease;\n}\n\n\n.pc-gallery-access-code:focus {\n    border-color: #55b73e;\n\n    box-shadow:\n        0 0 0 3px\n        rgba(85,183,62,.10);\n}\n\n\n.pc-gallery-unlock {\n    width: 40px;\n    height: 40px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 0;\n\n    border: 0;\n    border-radius: 7px;\n\n    background: #092546;\n    color: #ffffff;\n\n    font-size: 19px;\n    line-height: 1;\n\n    cursor: pointer;\n\n    transition:\n        background .18s ease,\n        transform .18s ease;\n}\n\n\n.pc-gallery-unlock:hover {\n    background: #123b66;\n    transform: translateX(1px);\n}\n\n\n.pc-gallery-unlock:disabled {\n    opacity: .65;\n    cursor: default;\n    transform: none;\n}\n\n\n.pc-gallery-access-status {\n    min-height: 14px;\n\n    margin-top: 7px;\n    margin-left: 34px;\n\n    font-size: 10px;\n    line-height: 1.4;\n}\n\n\n.pc-gallery-access-status.valid {\n    color: #55b73e;\n}\n\n\n.pc-gallery-access-status.invalid {\n    color: #c0392b;\n}\n\n\n\/* MOBILE *\/\n\n@media (max-width: 800px) {\n\n    .pc-gallery-lock-top {\n        flex-wrap: wrap;\n        align-items: flex-start;\n    }\n\n    .pc-gallery-lock-content {\n        flex: 1 1 calc(100% - 40px);\n    }\n\n    .pc-gallery-lock-button {\n        margin-left: 34px;\n    }\n\n    .pc-gallery-access-divider {\n        display: none;\n    }\n\n    .pc-gallery-access-inline {\n        width: 100%;\n        margin-left: 34px;\n    }\n\n    .pc-gallery-access-code {\n        flex: 1;\n        width: auto;\n    }\n\n}\n\n\n\n\/* =====================================================\n   GALLERY LIGHTBOX\n===================================================== *\/\n\n.pc-gallery-lightbox {\n    position: fixed;\n    inset: 0;\n    z-index: 999999;\n\n    display: none;\n    align-items: center;\n    justify-content: center;\n\n    padding: 40px;\n\n    background: rgba(4,18,32,.82);\n    backdrop-filter: blur(5px);\n    -webkit-backdrop-filter: blur(5px);\n}\n\n.pc-gallery-lightbox.is-open {\n    display: flex;\n}\n\n\n\/* POPUP WINDOW *\/\n\n.pc-gallery-lightbox-inner {\n    position: relative;\n\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n\n    width: min(1100px, 82vw);\n    max-height: 86vh;\n\n    padding: 14px;\n\n    border-radius: 14px;\n\n    background: #ffffff;\n\n    box-shadow:\n        0 24px 70px rgba(0,0,0,.38);\n}\n\n\n\/* IMAGE *\/\n\n.pc-gallery-lightbox img {\n    display: block;\n\n    width: 100%;\n    max-height: calc(86vh - 85px);\n\n    object-fit: contain;\n\n    border-radius: 9px;\n}\n\n\n\/* CLOSE BUTTON *\/\n\n.pc-gallery-close {\n    position: absolute;\n\n    top: -14px;\n    right: -14px;\n\n    z-index: 3;\n\n    width: 38px;\n    height: 38px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 0;\n\n    border: 3px solid #ffffff;\n    border-radius: 50%;\n\n    background: #092546;\n    color: #ffffff;\n\n    font-size: 24px;\n    line-height: 1;\n\n    cursor: pointer;\n\n    box-shadow: 0 4px 14px rgba(0,0,0,.25);\n}\n\n\n\/* LIGHTBOX PREVIOUS \/ NEXT *\/\n\n.pc-gallery-nav {\n    position: absolute;\n    top: 50%;\n    z-index: 4;\n\n    width: 46px;\n    height: 46px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 0;\n\n    border: 3px solid #ffffff;\n    border-radius: 50%;\n\n    background: rgba(9,37,70,.90);\n    color: #ffffff;\n\n    font-size: 32px;\n    line-height: 1;\n\n    cursor: pointer;\n\n    transform: translateY(-50%);\n\n    box-shadow: 0 4px 14px rgba(0,0,0,.25);\n\n    transition:\n        background .18s ease,\n        transform .18s ease;\n}\n\n.pc-gallery-nav:hover {\n    background: #55b73e;\n}\n\n.pc-gallery-prev {\n    left: -23px;\n}\n\n.pc-gallery-next {\n    right: -23px;\n}\n\n@media (max-width: 700px) {\n\n    .pc-gallery-nav {\n        width: 38px;\n        height: 38px;\n        font-size: 27px;\n        border-width: 2px;\n    }\n\n    .pc-gallery-prev {\n        left: -10px;\n    }\n\n    .pc-gallery-next {\n        right: -10px;\n    }\n\n}\n\n\n\/* DOWNLOAD *\/\n\n.pc-gallery-download {\n    margin-top: 12px;\n    padding: 10px 18px;\n\n    border: 0;\n    border-radius: 7px;\n\n    background: #55b73e;\n    color: #ffffff !important;\n\n    font-size: 11px;\n    font-weight: 700;\n\n    cursor: pointer;\n}\n\n\n\/* MOBILE *\/\n\n@media (max-width: 700px) {\n\n    .pc-gallery-lightbox {\n        padding: 15px;\n    }\n\n    .pc-gallery-lightbox-inner {\n        width: 94vw;\n        max-height: 90vh;\n        padding: 9px;\n    }\n\n    .pc-gallery-lightbox img {\n        max-height: calc(90vh - 75px);\n    }\n\n}\n\n\n\/* TABLET *\/\n\n@media (max-width: 900px) {\n\n    .pc-gallery-grid {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n}\n\n\n\/* MOBILE *\/\n\n@media (max-width: 560px) {\n\n    .pc-gallery-grid {\n        grid-template-columns: 1fr;\n    }\n\n}\n\n\n\/* =====================================================\n   PORTRAIT PHONE REFINEMENT\n===================================================== *\/\n\n@media (max-width: 430px) {\n\n    #pc-ai-designer {\n        padding-left: 10px;\n        padding-right: 10px;\n    }\n\n    .pc-grid {\n        gap: 14px;\n    }\n\n    .pc-panel {\n        padding: 15px;\n        border-radius: 12px;\n    }\n\n    .pc-result-panel {\n        aspect-ratio: 3 \/ 2;\n        padding: 10px;\n        border-radius: 12px;\n    }\n\n    #pc-placeholder,\n    #pc-generation-status,\n    #pc-result {\n        inset: 10px;\n    }\n\n    .pc-placeholder-icon,\n    .pc-status-logo {\n        width: 54px;\n        height: 54px;\n        flex: 0 0 54px;\n        margin-bottom: 9px;\n    }\n\n    .pc-result-eyebrow {\n        margin-bottom: 6px;\n        font-size: 7.5px;\n        letter-spacing: 1px;\n    }\n\n    #pc-placeholder h3,\n    #pc-generation-status h3 {\n        margin-bottom: 6px;\n        font-size: 17px;\n        line-height: 1.15;\n    }\n\n    #pc-placeholder p {\n        max-width: 260px;\n        font-size: 10.5px;\n        line-height: 1.35;\n    }\n\n    .pc-generation-limit-note {\n        margin-top: 8px;\n        padding: 8px 10px;\n        font-size: 10px;\n        line-height: 1.35;\n    }\n\n    .pc-ai-disclaimer {\n        margin-top: 5px;\n        padding: 7px 9px;\n        font-size: 9px;\n        line-height: 1.4;\n    }\n\n}\n\n\n@media (max-width: 850px) {\n\n    \/* Mobile placeholder needs more vertical room *\/\n    .pc-result-panel:has(#pc-placeholder:not([style*=\"display: none\"])) {\n        aspect-ratio: auto !important;\n        min-height: 420px;\n        overflow: visible;\n    }\n\n    #pc-placeholder {\n        position: relative !important;\n        inset: auto !important;\n        padding: 28px 18px;\n        box-sizing: border-box;\n    }\n\n}\n\n\n@media (max-width: 500px) {\n\n    .pc-result-panel:has(#pc-placeholder:not([style*=\"display: none\"])) {\n        min-height: 390px;\n    }\n\n    .pc-placeholder-icon {\n        width: 70px;\n        height: 70px;\n        flex-basis: 70px;\n        margin-bottom: 16px;\n    }\n\n    #pc-placeholder h3 {\n        font-size: 20px;\n    }\n\n    #pc-placeholder p {\n        font-size: 14px;\n        line-height: 1.5;\n    }\n\n}\n\n\n\/* =========================================\n   MOBILE FILE-UPLOAD WIDTH FIX\n========================================= *\/\n\n.pc-reference-panel,\n.pc-layout-upload,\n.pc-layout-file-row {\n    width: 100%;\n    max-width: 100%;\n    min-width: 0;\n    box-sizing: border-box;\n}\n\n.pc-layout-file-row input[type=\"file\"] {\n    width: 100%;\n    max-width: 100%;\n    min-width: 0;\n    box-sizing: border-box;\n    overflow: hidden;\n}\n\n@media (max-width: 500px) {\n\n    .pc-layout-file-row {\n        display: block;\n    }\n\n    .pc-layout-file-row input[type=\"file\"] {\n        display: block;\n        width: 100%;\n        max-width: 100%;\n    }\n\n    .pc-delete-file {\n        width: 100%;\n        margin-top: 8px;\n    }\n\n}\n\n\n@media (max-width: 500px) {\n\n    .pc-panel {\n        width: 100%;\n        max-width: 100%;\n        min-width: 0;\n        overflow: hidden;\n        box-sizing: border-box;\n    }\n\n}\n\n<\/style>\n\n\n<script>\n\n(function () {\n\n\n    \/* =========================\n       API\n    ========================= *\/\n\n    const API_ENDPOINT =\n        \"\/wp-json\/padelcreations\/v1\/generate\";\n \n    const ACCESS_ENDPOINT =\n    \"\/wp-json\/padelcreations\/v1\/validate-access\";\n\n    const ENHANCE_PROMPT_ENDPOINT =\n        \"\/wp-json\/padelcreations\/v1\/enhance-prompt\";\n\n\n    \/* =========================\n       PROJECT REFERENCE FROM ACCESS CODE\n    ========================= *\/\n\n    function getProjectReference(accessCode) {\n        const match = String(accessCode || \"\")\n            .trim()\n            .match(\/^(P-\\d+)\/i);\n\n        return match ? match[1].toUpperCase() : \"\";\n    }\n\n\n    \/* =========================\n       COURT MODELS\n    ========================= *\/\n\n    const COURT_MODELS = {\n\n        indoor: [\n\n            {\n                value: \"basic\",\n                label: \"Mod. BASIC\"\n            },\n\n            {\n                value: \"panoramic-pro\",\n                label: \"Mod. PANORAMIC PRO\"\n            }\n\n        ],\n\n        outdoor: [\n\n            {\n                value: \"premium-sep-a\",\n                label: \"Mod. PREMIUM SEP-A\"\n            },\n\n            {\n                value: \"premium-sep-b\",\n                label: \"Mod. PREMIUM SEP-B\"\n            },\n\n            {\n                value: \"premium-sep-cd\",\n                label: \"Mod. PREMIUM SEP-C\/D\"\n            }\n\n        ]\n\n    };\n\n\n    \/* =========================\n       APPLICATION HELP\n    ========================= *\/\n\n    const APPLICATION_HELP = {\n\n        \"tennis-club\":\n            \"Integrates padel naturally into an existing premium tennis club with tennis courts, clubhouse, landscaping and social areas.\",\n\n        \"padel-standalone\":\n            \"Creates a dedicated premium padel destination centered around the selected PADELCREATIONS courts.\",\n\n        \"leisure-sports\":\n            \"Integrates padel into hotels, resorts, fitness clubs, golf clubs and other premium leisure or sports facilities.\",\n\n        \"private-house\":\n            \"Integrates padel into a private residential or corporate environment. The user's project description determines the setting, whether a private residence, company headquarters, office campus, production facility, factory or warehouse site.\"\n\n    };\n\n\n    \/* =========================\n       PROJECT REFERENCE HELP\n    ========================= *\/\n\n    const REFERENCE_MODE_HELP = {\n\n        \"none\":\n            \"Let the AI create the complete environment from your project configuration and description.\",\n\n        \"environment-photos\":\n            \"Upload up to 5 photos of the existing location. The AI will recreate the environment and integrate the selected courts.\"\n\n    };\n\n\n    \/* =========================\n       EXAMPLE PROMPTS\n\n       'private-house' is structured one level deeper than the\n       others (indoor\/outdoor, THEN residential\/corporate) since\n       that Application has its own audience sub-choice.\n    ========================= *\/\n\n    const examplePrompts = {\n\n        \/* =========================================================\n           TENNIS CLUB\n        ========================================================= *\/\n\n        \"tennis-club\": {\n\n            indoor: [\n\n                {\n                    title: \"Established Indoor Tennis Center\",\n                    courtCount: 3,\n                    text: \"Established indoor tennis center with 6 tennis courts inside a modern sports hall. Add 3 padel courts together in a dedicated area next to the existing tennis courts, with a reception, small caf\u00e9, seating area and clear pedestrian circulation.\"\n                },\n\n                {\n                    title: \"Premium Racket Club\",\n                    courtCount: 4,\n                    text: \"Premium indoor racket club with 8 existing tennis courts in a spacious high-ceiling sports hall. Add 4 padel courts in a separate zone alongside the tennis courts, connected to a modern clubhouse with reception, lounge, caf\u00e9 and spectator seating.\"\n                },\n\n                {\n                    title: \"Tennis Hall Conversion\",\n                    courtCount: 2,\n                    text: \"Existing indoor tennis club with 4 tennis courts inside a large steel-frame sports hall. Convert part of the available hall space into 2 padel courts next to the remaining tennis courts, with a compact social area, seating and improved modern lighting.\"\n                }\n\n            ],\n\n            outdoor: [\n\n                {\n                    title: \"Traditional Tennis Club\",\n                    courtCount: 3,\n                    text: \"Established tennis club with 5 clay tennis courts surrounded by mature trees. Add 3 padel courts next to the existing tennis courts, close to a traditional clubhouse with restaurant terrace, pedestrian paths and landscaped social areas.\"\n                },\n\n                {\n                    title: \"Premium Tennis Club\",\n                    courtCount: 2,\n                    text: \"Premium tennis club with 6 outdoor tennis courts, landscaped gardens and mature trees. Add 2 padel courts beside the existing tennis area, close to an elegant clubhouse with restaurant terrace, lounge seating and high-quality landscaping.\"\n                },\n\n                {\n                    title: \"Large Modern Tennis Complex\",\n                    courtCount: 4,\n                    text: \"Large modern tennis complex with 10 outdoor hard courts, a contemporary clubhouse and spectator areas. Add 4 padel courts together beside the existing tennis courts, connected by landscaped pedestrian paths with seating, a caf\u00e9 terrace and professional sports-club facilities.\"\n                }\n\n            ]\n\n        },\n\n\n        \/* =========================================================\n           PADEL STAND-ALONE CLUB\n        ========================================================= *\/\n\n        \"padel-standalone\": {\n\n            indoor: [\n\n                {\n                    title: \"Premium Indoor Padel Club\",\n                    courtCount: 6,\n                    text: \"Create a premium indoor padel club with 6 padel courts inside a spacious modern sports hall. Include a contemporary reception, changing rooms, caf\u00e9 and bar, comfortable lounge areas, spectator seating and clear pedestrian circulation around the courts.\"\n                },\n\n                {\n                    title: \"Industrial Warehouse Conversion\",\n                    courtCount: 5,\n                    text: \"Convert a large industrial warehouse with exposed steel structure and high ceilings into a modern padel club with 5 padel courts. Include a stylish reception, changing rooms, caf\u00e9-bar, social lounge, spectator areas and contemporary lighting while retaining some of the building's industrial character.\"\n                },\n\n                {\n                    title: \"Boutique Urban Padel Club\",\n                    courtCount: 3,\n                    text: \"Create a boutique urban indoor padel club with 3 padel courts in a modern high-ceiling building. Include a premium reception, compact changing facilities, stylish caf\u00e9 and lounge, spectator seating and carefully designed lighting for an exclusive contemporary atmosphere.\"\n                }\n\n            ],\n\n            outdoor: [\n\n                {\n                    title: \"Premium Padel Destination\",\n                    courtCount: 6,\n                    text: \"Develop a premium padel club with 6 outdoor padel courts on a spacious landscaped plot. Include a modern clubhouse with natural stone and timber details, restaurant terrace, lounge areas, pedestrian paths, high-quality regional landscaping and parking for around 30 cars.\"\n                },\n\n                {\n                    title: \"Modern Padel Club\",\n                    courtCount: 5,\n                    text: \"Create a modern outdoor padel club with 5 padel courts. Include a contemporary clubhouse with reception and changing rooms, caf\u00e9-bar with terrace, spectator and social areas, landscaped pedestrian paths, bicycle parking and parking for around 25 cars.\"\n                },\n\n                {\n                    title: \"Compact Padel Club\",\n                    courtCount: 3,\n                    text: \"Develop a compact premium padel club with 3 outdoor padel courts. Include a small contemporary clubhouse, reception, caf\u00e9 terrace, lounge seating, landscaped paths and attractive regional vegetation appropriate to the selected surroundings.\"\n                }\n\n            ]\n\n        },\n\n\n        \/* =========================================================\n           LEISURE & SPORTS FACILITIES\n        ========================================================= *\/\n\n        \"leisure-sports\": {\n\n            indoor: [\n\n                {\n                    title: \"Fitness & Wellness Center\",\n                    courtCount: 4,\n                    text: \"Large modern fitness and wellness center with gym areas, studios and indoor sports facilities. Add 4 padel courts inside a spacious high-ceiling sports hall, connected to the existing reception, changing rooms, caf\u00e9, lounge and wellness facilities.\"\n                },\n\n                {\n                    title: \"Multi-Sport Complex\",\n                    courtCount: 3,\n                    text: \"Established indoor multi-sport complex with basketball, badminton and fitness facilities. Add 3 padel courts in a dedicated section of the main sports hall, with spectator seating, clear pedestrian circulation and convenient access to the existing reception, changing rooms and caf\u00e9.\"\n                },\n\n                {\n                    title: \"Hotel & Resort Sports Center\",\n                    courtCount: 2,\n                    text: \"Premium hotel and wellness resort with an existing indoor sports center. Add 2 padel courts inside a modern high-ceiling hall, connected to the hotel through landscaped indoor circulation, with lounge seating, wellness facilities and a small caf\u00e9 area nearby.\"\n                }\n\n            ],\n\n            outdoor: [\n\n                {\n                    title: \"Golf & Country Club\",\n                    courtCount: 4,\n                    text: \"Established golf and country club surrounded by mature trees and landscaped grounds. Add 4 padel courts near the existing clubhouse and sports facilities, with pedestrian paths, spectator seating, a restaurant terrace and landscaping that integrates the courts naturally into the club.\"\n                },\n\n                {\n                    title: \"Luxury Resort\",\n                    courtCount: 2,\n                    text: \"Luxury resort with swimming pools, landscaped gardens and modern hospitality buildings. Add 2 padel courts within the resort's sports area, close to the fitness and wellness facilities, with shaded seating, pedestrian paths and premium regional landscaping.\"\n                },\n\n                {\n                    title: \"Large Municipal Sports Complex\",\n                    courtCount: 3,\n                    text: \"Large modern sports complex with football pitches, athletics and other outdoor sports facilities. Add 3 padel courts together in a dedicated area near the main sports building, with spectator seating, pedestrian access, bicycle parking, landscaping and nearby parking.\"\n                }\n\n            ]\n\n        },\n\n\n        \/* =========================================================\n           RESIDENTIAL & CORPORATE\n        ========================================================= *\/\n\n        \"private-house\": {\n\n            indoor: {\n\n                residential: [\n\n                    {\n                        title: \"Luxury Private Residence\",\n                        courtCount: 1,\n                        text: \"Luxury private residence with a large modern indoor leisure area. Add 1 private padel court inside a spacious high-ceiling sports hall, connected to a home gym and wellness area, with elegant lounge seating, premium materials and warm architectural lighting.\"\n                    },\n\n                    {\n                        title: \"Private Country Estate\",\n                        courtCount: 2,\n                        text: \"Large private country estate with a dedicated indoor sports building surrounded by landscaped grounds. Add 2 padel courts inside the building, together with a private gym, changing area and comfortable lounge overlooking the courts, using natural materials and sophisticated lighting.\"\n                    },\n\n                    {\n                        title: \"Exclusive Residential Development\",\n                        courtCount: 3,\n                        text: \"Exclusive residential development with several luxury apartment buildings and shared leisure facilities. Create 3 indoor padel courts inside a modern residents' sports center, with a fitness area, changing rooms, lounge seating and direct access to the landscaped communal gardens.\"\n                    }\n\n                ],\n\n                corporate: [\n\n                    {\n                        title: \"Modern Company Headquarters\",\n                        courtCount: 2,\n                        text: \"Modern corporate headquarters with contemporary offices and extensive employee facilities. Add 2 indoor padel courts inside a dedicated high-ceiling sports building, together with changing rooms, a fitness area, lounge seating and direct pedestrian access from the main offices.\"\n                    },\n\n                    {\n                        title: \"Industrial & Manufacturing Company\",\n                        courtCount: 2,\n                        text: \"Large manufacturing company with production buildings, warehouses and modern administrative offices. Convert part of an existing high-ceiling industrial hall into an employee sports area with 2 padel courts, changing facilities, a compact fitness area and comfortable seating overlooking the courts.\"\n                    },\n\n                    {\n                        title: \"Technology Campus\",\n                        courtCount: 3,\n                        text: \"Large technology company campus with modern office buildings and extensive employee amenities. Create 3 indoor padel courts inside a contemporary sports and wellness center, with a gym, changing rooms, social lounge, caf\u00e9 area and connections to the surrounding office buildings.\"\n                    }\n\n                ]\n\n            },\n\n            outdoor: {\n\n                residential: [\n\n                    {\n                        title: \"Luxury Private Villa\",\n                        courtCount: 1,\n                        text: \"Luxury private villa with a swimming pool, landscaped garden and existing tennis court. Add 1 padel court next to the tennis court, integrated naturally into the property and positioned to preserve the most attractive views toward the surrounding landscape.\"\n                    },\n\n                    {\n                        title: \"Luxury Private Estate\",\n                        courtCount: 2,\n                        text: \"Large luxury country estate with a contemporary villa, swimming pool and extensive landscaped gardens surrounded by mature trees. Add 2 padel courts together in a dedicated sports area away from the main house, connected by landscaped paths with a small shaded seating and lounge area.\"\n                    },\n\n                    {\n                        title: \"Premium Residential Community\",\n                        courtCount: 1,\n                        text: \"Premium gated residential community with modern villas, communal gardens, swimming pool and landscaped social areas. Add 1 padel court within the shared recreation area, close to the pool and residents' clubhouse, with pedestrian paths, seating, regional planting and subtle landscape lighting.\"\n                    }\n\n                ],\n\n                corporate: [\n\n                    {\n                        title: \"Corporate Headquarters Campus\",\n                        courtCount: 2,\n                        text: \"Modern corporate headquarters surrounded by landscaped gardens, office buildings and employee recreation areas. Add 2 outdoor padel courts close to the main offices, with pedestrian paths, shaded seating, bicycle parking and landscaping that integrates the courts naturally into the corporate campus.\"\n                    },\n\n                    {\n                        title: \"Manufacturing Facility\",\n                        courtCount: 2,\n                        text: \"Large manufacturing facility with production halls, warehouses, administrative offices and employee parking. Add 2 outdoor padel courts in a dedicated employee recreation area beside the administrative building, with changing facilities, shaded seating, pedestrian access and simple professional landscaping.\"\n                    },\n\n                    {\n                        title: \"Business & Technology Campus\",\n                        courtCount: 3,\n                        text: \"Contemporary business and technology campus with several modern office buildings, landscaped pedestrian areas and shared employee facilities. Add 3 outdoor padel courts within a central recreation zone, together with a caf\u00e9 terrace, lounge seating, bicycle parking, trees and landscaped paths connecting the surrounding offices.\"\n                    }\n\n                ]\n\n            }\n\n        }\n\n    };\n\n    const OUTDOOR_BACKGROUND_GROUPS = [\n        {\n            key: \"siteSetting\",\n            label: \"Site setting\",\n            options: [\n                { title: \"Urban\", text: \"Place the project in a realistic urban setting, surrounded by contemporary buildings, established streets and city infrastructure. Include efficient pedestrian access and an attractive city background while preserving sufficient open space around the courts.\" },\n                { title: \"Suburban\", text: \"Place the project in a spacious suburban setting near a town or city, surrounded by low-rise buildings, accessible roads, nearby parking and landscaped green buffers. Balance convenient infrastructure with an open and welcoming atmosphere.\" },\n                { title: \"Countryside\", text: \"Place the project in an open countryside setting with minimal surrounding development. Use natural terrain, extensive views and generous space around the facility so it feels peaceful and naturally integrated into the landscape.\" }\n            ]\n        },\n        {\n            key: \"landscapeCharacter\",\n            label: \"Landscape character\",\n            helpText: \"Choose the overall climate and scenery: Green & Temperate for the UK, Ireland, Germany or northern USA; Alpine & Mountain for Switzerland, Austria or the Rockies; Warm & Arid for the Middle East, Nevada or Arizona; and Lush & Tropical for Florida, the Caribbean or Indian Ocean regions.\",\n            options: [\n                { title: \"Green & Temperate\", text: \"Use a green temperate landscape with lawns, mature deciduous and evergreen trees, seasonal planting and soft natural daylight. The background may include wooded hills or distant mountains where appropriate, with architecture and materials suited to the local climate.\" },\n                { title: \"Alpine & Mountain\", text: \"Use a dramatic Alpine or mountain landscape with green valleys, mature evergreen trees, rocky slopes and high mountain peaks visible in the background. Show green or lightly snow-dusted peaks according to the season, with restrained timber-and-stone architecture suited to regions such as the Swiss or Austrian Alps and North American mountain areas.\" },\n                { title: \"Warm & Arid\", text: \"Use a warm, dry landscape with sandy or rocky terrain, natural stone, drought-resistant planting and shaded areas. Include distant dry hills or mountains where appropriate and use architecture and materials suited to a hot, arid climate.\" },\n                { title: \"Lush & Tropical\", text: \"Use a lush tropical landscape with dense green vegetation, tall palms and vibrant planting. Include shaded pathways and light contemporary architecture using materials suited to a warm, humid climate, with forest-covered hills or coastal scenery where appropriate.\" }\n            ]\n        }\n    ];\n\n\n    \/* =========================\n       STATE\n    ========================= *\/\n\n    let environment =\n        \"outdoor\";\n\n    let progressInterval =\n        null;\n\n    let progressSeconds =\n        0;\n\n    const ESTIMATED_TIME =\n        60;\n\n\n \/* =========================\n   ELEMENTS\n========================= *\/\n\nconst environmentButtons =\n    document.querySelectorAll(\n        \"#pc-environment button\"\n    );\n\nconst courtModelSelect =\n    document.getElementById(\n        \"pc-court-model\"\n    );\n\nconst applicationSelect =\n    document.getElementById(\n        \"pc-application\"\n    );\n\nconst applicationHelp =\n    document.getElementById(\n        \"pc-application-help\"\n    );\n\nconst timeField =\n    document.getElementById(\n        \"pc-time-field\"\n    );\n\nconst timeSelect =\n    document.getElementById(\n        \"pc-time-of-day\"\n    );\n\nconst generateButton =\n    document.getElementById(\n        \"pc-generate\"\n    );\n\nconst regenerateButton =\n    document.getElementById(\n        \"pc-regenerate\"\n    );\n\nconst errorBox =\n    document.getElementById(\n        \"pc-error\"\n    );\n\nconst accessInput =\n    document.getElementById(\n        \"pc-access-code\"\n    );\n\n\n\/* =========================\n   STATE\n========================= *\/\n\nlet accessValidated =\n    false;\n\nlet environmentImages =\n    [];\n\nlet exampleAudience =\n    \"residential\";\n\n\n\/* =========================\n   EXAMPLE PROMPTS ELEMENTS\n========================= *\/\n\nconst examplePromptsPanel =\n    document.getElementById(\n        \"pc-example-prompts\"\n    );\n\nconst presetToggleButton =\n    document.getElementById(\n        \"pc-preset-toggle\"\n    );\n\nconst exampleHeading =\n    document.getElementById(\n        \"pc-example-heading\"\n    );\n\nconst exampleAudienceToggle =\n    document.getElementById(\n        \"pc-example-audience-toggle\"\n    );\n\nconst exampleButtonsContainer =\n    document.getElementById(\n        \"pc-example-buttons\"\n    );\n\nconst backgroundStep = document.getElementById(\"pc-background-step\");\nconst backgroundButtonsContainer = document.getElementById(\"pc-background-buttons\");\nconst applyPresetButton = document.getElementById(\"pc-apply-preset\");\n\nconst promptTextarea =\n    document.getElementById(\n        \"pc-prompt\"\n    );\n\nconst enhancePromptButton =\n    document.getElementById(\n        \"pc-enhance-prompt\"\n    );\n\nconst undoEnhanceButton =\n    document.getElementById(\n        \"pc-undo-enhance\"\n    );\n\nlet previousPromptBeforeEnhance =\n    null;\n\nlet selectedPresetExample = null;\nlet selectedOutdoorChoices = {\n    siteSetting: null,\n    landscapeCharacter: null\n};\n\nconst EXAMPLE_HEADING_DEFAULT =\n    \"Choose an idea to start from, then personalize it to your project.\";\n\n\n\/* =========================\n   PRESET PANEL TOGGLE\n========================= *\/\n\nfunction openPresetPanel() {\n\n    examplePromptsPanel.style.display =\n        \"block\";\n\n    presetToggleButton.classList.add(\n        \"is-open\"\n    );\n\n    presetToggleButton.setAttribute(\n        \"aria-expanded\",\n        \"true\"\n    );\n\n}\n\n\nfunction closePresetPanel() {\n\n    examplePromptsPanel.style.display =\n        \"none\";\n\n    presetToggleButton.classList.remove(\n        \"is-open\"\n    );\n\n    presetToggleButton.setAttribute(\n        \"aria-expanded\",\n        \"false\"\n    );\n\n}\n\n\npresetToggleButton.addEventListener(\n    \"click\",\n    function () {\n\n        const isOpen =\n            presetToggleButton.classList.contains(\n                \"is-open\"\n            );\n\n\n        if (isOpen) {\n\n            closePresetPanel();\n\n        }\n\n        else {\n\n            openPresetPanel();\n\n        }\n\n    }\n);\n\n\n\/* =========================\n   ENHANCE PROMPT\n========================= *\/\n\nasync function enhancePrompt() {\n\n    const currentPrompt =\n        promptTextarea.value.trim();\n\n\n    if (!currentPrompt) {\n\n        promptTextarea.focus();\n\n        return;\n\n    }\n\n\n    const originalButtonText =\n        enhancePromptButton.innerHTML;\n\n\n    enhancePromptButton.disabled =\n        true;\n\n    enhancePromptButton.innerHTML =\n        \"\u2728 Enhancing...\";\n\n\n    try {\n\n        const response =\n            await fetch(\n                ENHANCE_PROMPT_ENDPOINT,\n                {\n                    method: \"POST\",\n\n                    headers: {\n                        \"Content-Type\":\n                            \"application\/json\"\n                    },\n\n                    body: JSON.stringify({\n\n                        user_prompt:\n                            currentPrompt,\n\n                        application:\n                            applicationSelect.value,\n\n                        environment:\n                            environment,\n\n                        audience:\n                            applicationSelect.value === \"private-house\"\n                                ? exampleAudience\n                                : \"\",\n\n                        court_count:\n                            parseInt(\n                                document.getElementById(\n                                    \"pc-court-count\"\n                                ).value,\n                                10\n                            )\n\n                    })\n                }\n            );\n\n\n        const data =\n            await response.json();\n\n\n        if (\n            !response.ok ||\n            !data.success ||\n            !data.enhanced_prompt\n        ) {\n\n            throw new Error(\n                data.message ||\n                \"Prompt enhancement failed.\"\n            );\n\n        }\n\n\n        \/*\n         * Only replace the text if the user\n         * has not changed it during the request.\n         *\/\n\n        if (\n            promptTextarea.value.trim() !==\n            currentPrompt\n        ) {\n\n            return;\n\n        }\n\n\n        previousPromptBeforeEnhance =\n            currentPrompt;\n\n\n        promptTextarea.value =\n            data.enhanced_prompt;\n\n\n        undoEnhanceButton.style.display =\n            \"inline-flex\";\n\n\n        promptTextarea.dispatchEvent(\n            new Event(\n                \"input\",\n                {\n                    bubbles: true\n                }\n            )\n        );\n\n\n        promptTextarea.focus();\n\n    }\n\n    catch (error) {\n\n        console.error(\n            \"Prompt enhancement:\",\n            error\n        );\n\n        showError(\n            error.message ||\n            \"Unable to enhance your description.\"\n        );\n\n    }\n\n    finally {\n\n        enhancePromptButton.disabled =\n            false;\n\n        enhancePromptButton.innerHTML =\n            originalButtonText;\n\n    }\n\n}\n\n\nenhancePromptButton.addEventListener(\n    \"click\",\n    enhancePrompt\n);\n\n\nundoEnhanceButton.addEventListener(\n    \"click\",\n    function () {\n\n        if (\n            previousPromptBeforeEnhance === null\n        ) {\n            return;\n        }\n\n        promptTextarea.value =\n            previousPromptBeforeEnhance;\n\n        promptTextarea.dispatchEvent(\n            new Event(\n                \"input\",\n                {\n                    bubbles: true\n                }\n            )\n        );\n\n        previousPromptBeforeEnhance =\n            null;\n\n        undoEnhanceButton.style.display =\n            \"none\";\n\n        promptTextarea.focus();\n\n    }\n);\n\n\n\/* =========================\n   ENVIRONMENT REFERENCE ELEMENTS\n========================= *\/\n\nconst environmentImagesInput =\n    document.getElementById(\n        \"pc-environment-images-file\"\n    );\n\nconst environmentImagesStatus =\n    document.getElementById(\n        \"pc-environment-images-status\"\n    );\n\nconst deleteEnvironmentImagesButton =\n    document.getElementById(\n        \"pc-delete-environment-images\"\n    );\n\nconst ENVIRONMENT_IMAGES_DEFAULT_STATUS =\n    \"Upload one or more photos of your actual site or \" +\n    \"building. The AI will recreate this environment \" +\n    \"and add your selected court model and number of \" +\n    \"courts into it.\";\n\nconst MAX_ENVIRONMENT_IMAGES = 5;\n\n\n\/* =========================\n   PROJECT REFERENCE MODE\n========================= *\/\n\nconst referenceModeSelect =\n    document.getElementById(\n        \"pc-reference-mode\"\n    );\n\nconst referenceModeHelp =\n    document.getElementById(\n        \"pc-reference-mode-help\"\n    );\n\nconst environmentImagesPanel =\n    document.getElementById(\n        \"pc-environment-images-panel\"\n    );\n\n\nfunction clearEnvironmentImages() {\n\n    environmentImages =\n        [];\n\n    environmentImagesInput.value =\n        \"\";\n\n    deleteEnvironmentImagesButton.style.display =\n        \"none\";\n\n    environmentImagesStatus.className =\n        \"pc-layout-upload-status\";\n\n    environmentImagesStatus.textContent =\n        ENVIRONMENT_IMAGES_DEFAULT_STATUS;\n\n}\n\n\nfunction updateReferenceModeHelp() {\n\n    referenceModeHelp.textContent =\n        REFERENCE_MODE_HELP[\n            referenceModeSelect.value\n        ] || \"\";\n\n}\n\n\nfunction applyReferenceMode(mode) {\n\n    const showEnvironment =\n        mode === \"environment-photos\";\n\n    if (environmentImagesPanel) {\n\n        environmentImagesPanel.style.display =\n            showEnvironment ? \"block\" : \"none\";\n\n    }\n\n    \/*\n     * Clear out any uploaded data for whichever mode is no\n     * longer selected, so a stale upload never gets silently\n     * submitted from a hidden panel.\n     *\/\n\n    if (!showEnvironment) {\n        clearEnvironmentImages();\n    }\n\n}\n\nreferenceModeSelect.addEventListener(\n    \"change\",\n    function () {\n\n        updateReferenceModeHelp();\n\n        applyReferenceMode(\n            referenceModeSelect.value\n        );\n\n    }\n);\n\n\n    \/* =========================\n       LOAD COURT MODELS\n    ========================= *\/\n\n    function loadCourtModels() {\n\n        courtModelSelect.innerHTML =\n            \"\";\n\n        COURT_MODELS[\n            environment\n        ].forEach(\n            function (model) {\n\n                const option =\n                    document.createElement(\n                        \"option\"\n                    );\n\n                option.value =\n                    model.value;\n\n                option.textContent =\n                    model.label;\n\n                courtModelSelect.appendChild(\n                    option\n                );\n\n            }\n        );\n\n    }\n\n\n    \/* =========================\n       TIME OF DAY VISIBILITY\n    ========================= *\/\n\n    function updateTimeOfDayVisibility() {\n\n        if (\n            environment === \"indoor\"\n        ) {\n\n            timeField.style.display =\n                \"none\";\n\n        }\n\n        else {\n\n            timeField.style.display =\n                \"block\";\n\n        }\n\n    }\n\n\n    \/* =========================\n       ENVIRONMENT SWITCH\n    ========================= *\/\n\n    environmentButtons.forEach(\n        function (button) {\n\n            button.addEventListener(\n                \"click\",\n                function () {\n\n                    environmentButtons.forEach(\n                        function (btn) {\n\n                            btn.classList.remove(\n                                \"active\"\n                            );\n\n                        }\n                    );\n\n\n                    button.classList.add(\n                        \"active\"\n                    );\n\n\n                    environment =\n                        button.dataset.value;\n\n\n                    loadCourtModels();\n\n\n                    updateTimeOfDayVisibility();\n\n\n                    renderExamplePrompts();\n\n                }\n            );\n\n        }\n    );\n\n\n    \/* =========================\n       APPLICATION HELP\n    ========================= *\/\n\n    function updateApplicationHelp() {\n\n        applicationHelp.textContent =\n            APPLICATION_HELP[\n                applicationSelect.value\n            ] || \"\";\n\n    }\n\n\n    \/* =========================\n       EXAMPLE PROMPTS\n\n       Renders the 3 example buttons relevant to the currently\n       selected Application + Environment (+ Residential\/Corporate\n       for private-house). Re-run whenever any of those change.\n    ========================= *\/\n\n    function renderExamplePrompts() {\n\n        if (!examplePromptsPanel) {\n            return;\n        }\n\n        const application =\n            applicationSelect.value;\n\n        const isPrivateHouse =\n            application === \"private-house\";\n\n        if (exampleAudienceToggle) {\n\n            exampleAudienceToggle.style.display =\n                isPrivateHouse ? \"flex\" : \"none\";\n\n        }\n\n        let examples;\n\n        if (isPrivateHouse) {\n\n            examples =\n                (\n                    examplePrompts[application] &&\n                    examplePrompts[application][environment] &&\n                    examplePrompts[application][environment][exampleAudience]\n                ) || [];\n\n        }\n\n        else {\n\n            examples =\n                (\n                    examplePrompts[application] &&\n                    examplePrompts[application][environment]\n                ) || [];\n\n        }\n\n        exampleHeading.textContent =\n            EXAMPLE_HEADING_DEFAULT;\n\n        exampleButtonsContainer.innerHTML =\n            \"\";\n\n        selectedPresetExample = null;\n        selectedOutdoorChoices = {\n            siteSetting: null,\n            landscapeCharacter: null\n        };\n        if (backgroundStep) backgroundStep.style.display = \"none\";\n        if (applyPresetButton) applyPresetButton.disabled = true;\n\n        examples.forEach(function (example) {\n\n            const button =\n                document.createElement(\"button\");\n\n            button.type = \"button\";\n            button.className = \"pc-example-prompt-button\";\n            button.textContent = example.title;\n\n            button.addEventListener(\n                \"click\",\n                function () {\n\n                    if (environment === \"outdoor\") {\n                        selectedPresetExample = example;\n                        selectedOutdoorChoices = {\n                            siteSetting: null,\n                            landscapeCharacter: null\n                        };\n\n                        exampleButtonsContainer.querySelectorAll(\n                            \".pc-example-prompt-button\"\n                        ).forEach(function (item) {\n                            item.classList.remove(\"pc-example-selected\");\n                        });\n\n                        button.classList.add(\"pc-example-selected\");\n                        renderOutdoorBackgrounds();\n                        backgroundStep.style.display = \"block\";\n                        applyPresetButton.disabled = true;\n                        return;\n                    }\n\n                    const inserted = insertExamplePrompt(\n                        example.text,\n                        example.courtCount\n                    );\n\n                    if (inserted !== false) {\n\n                        exampleButtonsContainer\n                            .querySelectorAll(\n                                \".pc-example-prompt-button\"\n                            )\n                            .forEach(\n                                function (item) {\n\n                                    item.classList.remove(\n                                        \"pc-example-selected\"\n                                    );\n\n                                }\n                            );\n\n\n                        button.classList.add(\n                            \"pc-example-selected\"\n                        );\n\n\n                        \/*\n                         * Brief visual acknowledgement,\n                         * then collapse the preset panel.\n                         *\/\n\n                        setTimeout(\n                            function () {\n\n                                closePresetPanel();\n\n                            },\n                            180\n                        );\n\n                    }\n\n                }\n            );\n\n            exampleButtonsContainer.appendChild(button);\n\n        });\n\n    }\n\n\n    function renderOutdoorBackgrounds() {\n        if (!backgroundButtonsContainer) return;\n\n        backgroundButtonsContainer.innerHTML = \"\";\n\n        OUTDOOR_BACKGROUND_GROUPS.forEach(function (group) {\n            const groupElement = document.createElement(\"div\");\n            groupElement.className =\n                \"pc-background-group pc-background-group-\" + group.key;\n\n            const groupTitle = document.createElement(\"div\");\n            groupTitle.className = \"pc-background-group-title\";\n            groupTitle.textContent = group.label;\n\n            if (group.helpText) {\n                const info = document.createElement(\"span\");\n                info.className = \"pc-background-info\";\n\n                const infoButton = document.createElement(\"button\");\n                infoButton.type = \"button\";\n                infoButton.className = \"pc-background-info-button\";\n                infoButton.textContent = \"i\";\n                infoButton.setAttribute(\n                    \"aria-label\",\n                    \"About \" + group.label\n                );\n\n                const tooltip = document.createElement(\"span\");\n                tooltip.className = \"pc-background-info-tooltip\";\n                tooltip.setAttribute(\"role\", \"tooltip\");\n                tooltip.textContent = group.helpText;\n\n                info.appendChild(infoButton);\n                info.appendChild(tooltip);\n                groupTitle.appendChild(info);\n            }\n\n            const groupButtons = document.createElement(\"div\");\n            groupButtons.className = \"pc-background-group-buttons\";\n\n            group.options.forEach(function (background) {\n                const button = document.createElement(\"button\");\n                button.type = \"button\";\n                button.className = \"pc-background-prompt-button\";\n                button.textContent = background.title;\n\n                button.addEventListener(\"click\", function () {\n                    selectedOutdoorChoices[group.key] = background;\n                    groupButtons.querySelectorAll(\n                        \".pc-background-prompt-button\"\n                    ).forEach(function (item) {\n                        item.classList.remove(\"pc-background-selected\");\n                    });\n                    button.classList.add(\"pc-background-selected\");\n                    applyPresetButton.disabled = !(\n                        selectedOutdoorChoices.siteSetting &&\n                        selectedOutdoorChoices.landscapeCharacter\n                    );\n                });\n\n                groupButtons.appendChild(button);\n            });\n\n            groupElement.appendChild(groupTitle);\n            groupElement.appendChild(groupButtons);\n            backgroundButtonsContainer.appendChild(groupElement);\n        });\n    }\n\n\n    if (applyPresetButton) {\n        applyPresetButton.addEventListener(\"click\", function () {\n            if (\n                !selectedPresetExample ||\n                !selectedOutdoorChoices.siteSetting ||\n                !selectedOutdoorChoices.landscapeCharacter\n            ) return;\n\n            const combinedPrompt = selectedPresetExample.text + \" \" +\n                selectedOutdoorChoices.siteSetting.text + \" \" +\n                selectedOutdoorChoices.landscapeCharacter.text;\n\n            const inserted = insertExamplePrompt(\n                combinedPrompt,\n                selectedPresetExample.courtCount\n            );\n\n            if (inserted !== false) closePresetPanel();\n        });\n    }\n\n\n    \/*\n     * Inserts an example into the Customer Description textarea.\n     * If the user has already typed something, confirms first so\n     * we never silently overwrite their own text.\n     *\/\n\n    function insertExamplePrompt(text, courtCount) {\n\n        const currentValue =\n            promptTextarea.value.trim();\n\n        if (currentValue !== \"\") {\n\n            const confirmed =\n                window.confirm(\n                    \"This will replace what you've already written. Continue?\"\n                );\n\n            if (!confirmed) {\n                return false;\n            }\n\n        }\n\n        promptTextarea.value =\n            text;\n\n        \/*\n         * Synchronize the Number of Courts selector with the\n         * selected example, so the configuration and the\n         * Customer Description text never contradict each other.\n         *\/\n\n        if (courtCount) {\n\n            const courtCountSelect =\n                document.getElementById(\n                    \"pc-court-count\"\n                );\n\n            if (courtCountSelect) {\n\n                courtCountSelect.value =\n                    String(courtCount);\n\n            }\n\n        }\n\n        promptTextarea.dispatchEvent(\n            new Event(\n                \"input\",\n                {\n                    bubbles: true\n                }\n            )\n        );\n\n        promptTextarea.focus();\n\n        exampleHeading.textContent =\n            \"Great starting point \u2014 now make it completely yours:\";\n\n        return true;\n\n    }\n\n\n    \/*\n     * Residential \/ Corporate sub-choice \u2014 only relevant (and\n     * only visible) for the private-house Application.\n     *\/\n\n    if (exampleAudienceToggle) {\n\n        exampleAudienceToggle.querySelectorAll(\n            \".pc-audience-button\"\n        ).forEach(function (button) {\n\n            button.addEventListener(\n                \"click\",\n                function () {\n\n                    exampleAudienceToggle.querySelectorAll(\n                        \".pc-audience-button\"\n                    ).forEach(function (btn) {\n\n                        btn.classList.remove(\n                            \"active\"\n                        );\n\n                    });\n\n                    button.classList.add(\n                        \"active\"\n                    );\n\n                    exampleAudience =\n                        button.dataset.audience;\n\n                    renderExamplePrompts();\n\n                }\n            );\n\n        });\n\n    }\n\n\n    applicationSelect.addEventListener(\n        \"change\",\n        function () {\n\n            updateApplicationHelp();\n\n            renderExamplePrompts();\n\n        }\n    );\n\n\n\/* =========================\n   ACCESS CODE VALIDATION\n========================= *\/\n\nconst validateAccessButton =\n    document.getElementById(\n        \"pc-validate-access\"\n    );\n\nconst accessStatus =\n    document.getElementById(\n        \"pc-access-status\"\n    );\n\n\nasync function validateAccessCode() {\n\n    const code =\n        accessInput.value.trim();\n\n\n    \/* Reset access state *\/\n\n    accessValidated = false;\n\n    generateButton.disabled = true;\n\n    generateButton.classList.remove(\n        \"pc-access-active\"\n    );\n\n\n    if (regenerateButton) {\n        regenerateButton.disabled = true;\n    }\n\n\n    accessStatus.textContent = \"\";\n    accessStatus.className =\n        \"pc-access-status\";\n\n\n    \/* No code entered *\/\n\n    if (!code) {\n\n        accessStatus.textContent =\n            \"Please enter your access code.\";\n\n        accessStatus.classList.add(\n            \"invalid\"\n        );\n\n        return;\n    }\n\n\n    \/* Validation button loading state *\/\n\n    validateAccessButton.disabled = true;\n\n    validateAccessButton.textContent =\n        \"Checking...\";\n\n\n    try {\n\n        const response =\n            await fetch(\n                ACCESS_ENDPOINT,\n                {\n                    method: \"POST\",\n\n                    headers: {\n                        \"Content-Type\":\n                            \"application\/json\"\n                    },\n\n                    body: JSON.stringify({\n                        access_code: code\n                    })\n                }\n            );\n\n\n        const data =\n            await response.json();\n\n\n        \/*\n         * Make sure the user has not changed\n         * the code while the request was running.\n         *\/\n\n        if (\n            accessInput.value.trim() !== code\n        ) {\n            return;\n        }\n\n\n        \/* GALLERY-ONLY CODE ENTERED HERE BY MISTAKE *\/\n\n        if (\n            response.ok &&\n            data.gallery_only === true\n        ) {\n\n            accessValidated = false;\n\n            generateButton.disabled = true;\n\n            generateButton.classList.remove(\n                'pc-access-active'\n            );\n\n            accessStatus.innerHTML =\n                '\u2713 <strong>Gallery access unlocked.<\/strong><br>' +\n                'This code gives access to the Inspiration Gallery only. ' +\n                'A project-specific access code is required to generate a personal concept.';\n\n            accessStatus.className =\n                'pc-access-status valid';\n\n            document.dispatchEvent(\n                new CustomEvent(\n                    'pcGalleryUnlocked',\n                    {\n                        detail: {\n                            accessCode: code\n                        }\n                    }\n                )\n            );\n\n            return;\n\n        }\n\n\n        \/* ACCESS ACCEPTED *\/\n\n        if (\n            response.ok &&\n            data.valid === true\n        ) {\n        \n            accessValidated = true;\n        \n            generateButton.disabled = false;\n        \n            generateButton.classList.add(\n                \"pc-access-active\"\n            );\n        \n        \n            if (regenerateButton) {\n                regenerateButton.disabled = false;\n            }\n        \n        \n            if (data.is_unlimited) {\n    accessStatus.textContent = \"\u2713 Your Padel Vision is unlocked.\";\n} else if (data.is_distributor) {\n    accessStatus.textContent = \"\u2713 Your Padel Vision is unlocked.\";\n} else if (data.is_zoho_verified) {\n    const projectRef = getProjectReference(code);\n\n    if (projectRef) {\n        accessStatus.innerHTML =\n            \"\u2713 <strong>Padel Vision unlocked for project \" +\n            projectRef +\n            \".<\/strong><br>Your personal concept is ready to create.\";\n    } else {\n        accessStatus.textContent =\n            \"\u2713 Your Padel Vision is ready to create.\";\n    }\n} else {\n    accessStatus.textContent = \"\u2713 Your Padel Vision is unlocked.\";\n}\n        \n            accessStatus.className =\n                \"pc-access-status valid\";\n        \n        \n            \/* Hide access code + Validate button *\/\n        \n            const accessRow =\n                document.querySelector(\n                    \".pc-access-row\"\n                );\n        \n            if (accessRow) {\n                accessRow.style.display = \"none\";\n            }\n        \n        \n            hideError();\n\n            document.dispatchEvent(\n                new CustomEvent(\n                    'pcDesignerUnlocked',\n                    {\n                        detail: {\n                            accessCode: code\n                        }\n                    }\n                )\n            );\n        }\n        \/* ACCESS DENIED *\/\n\n     \/* ACCESS DENIED *\/\n\n        else {\n        \n            accessValidated = false;\n        \n            generateButton.disabled = true;\n        \n            generateButton.classList.remove(\n                \"pc-access-active\"\n            );\n        \n            if (regenerateButton) {\n                regenerateButton.disabled = true;\n            }\n        \n            accessStatus.textContent =\n                data.message ||\n                \"Invalid access code.\";\n        \n            accessStatus.className =\n                \"pc-access-status invalid\";\n        }\n\n    }\n\n    catch (error) {\n\n        console.error(\n            \"Access validation:\",\n            error\n        );\n\n\n        accessValidated = false;\n\n        generateButton.disabled = true;\n\n        generateButton.classList.remove(\n            \"pc-access-active\"\n        );\n\n\n        if (regenerateButton) {\n            regenerateButton.disabled = true;\n        }\n\n\n        accessStatus.textContent =\n            \"Unable to validate the access code.\";\n\n        accessStatus.className =\n            \"pc-access-status invalid\";\n\n    }\n\n    finally {\n\n        validateAccessButton.disabled = false;\n\n        validateAccessButton.textContent =\n            \"Unlock\";\n    }\n\n}\n\n\n\/* =========================\n   VALIDATE BUTTON\n========================= *\/\n\nvalidateAccessButton.addEventListener(\n    \"click\",\n    validateAccessCode\n);\n\n\n\/* =========================\n   ENTER KEY\n========================= *\/\n\naccessInput.addEventListener(\n    \"keydown\",\n    function (event) {\n\n        if (event.key === \"Enter\") {\n\n            event.preventDefault();\n\n            validateAccessCode();\n        }\n    }\n);\n\n\n\/* =========================\n   ACCESS CODE CHANGED\n========================= *\/\n\naccessInput.addEventListener(\n    \"input\",\n    function () {\n\n        \/*\n         * Any change to the code invalidates\n         * the previous validation.\n         *\/\n\n        accessValidated = false;\n\n        generateButton.disabled = true;\n\n        generateButton.classList.remove(\n            \"pc-access-active\"\n        );\n\n\n        if (regenerateButton) {\n            regenerateButton.disabled = true;\n        }\n\n\n        accessStatus.textContent = \"\";\n\n        accessStatus.className =\n            \"pc-access-status\";\n    }\n);\n\n\/* =========================\n   RESET TIME\n========================= *\/\nfunction formatResetTime(seconds) {\n\n    const totalMinutes =\n        Math.max(\n            0,\n            Math.floor(\n                seconds \/ 60\n            )\n        );\n\n    const hours =\n        Math.floor(\n            totalMinutes \/ 60\n        );\n\n    const minutes =\n        totalMinutes % 60;\n\n\n    if (hours > 0) {\n\n        return (\n            hours +\n            \"h \" +\n            minutes +\n            \"m\"\n        );\n\n    }\n\n\n    return (\n        minutes +\n        \"m\"\n    );\n}\n\n\nconst ENVIRONMENT_IMAGE_MAX_DIMENSION = 1800;\nconst ENVIRONMENT_IMAGE_JPEG_QUALITY = 0.85;\n\n\n\/* =========================\n   ENVIRONMENT REFERENCE IMAGES\n========================= *\/\n\nfunction resizeImageFile(file, maxDimension, quality) {\n\n    return new Promise(\n        function (resolve, reject) {\n\n            const objectUrl =\n                URL.createObjectURL(file);\n\n            const img =\n                new Image();\n\n            img.onload =\n                function () {\n\n                    URL.revokeObjectURL(objectUrl);\n\n                    let targetWidth =\n                        img.naturalWidth;\n\n                    let targetHeight =\n                        img.naturalHeight;\n\n                    const largestSide =\n                        Math.max(targetWidth, targetHeight);\n\n                    \/*\n                     * Only scale DOWN, never up \u2014 an image\n                     * already smaller than the cap is left at\n                     * its own resolution.\n                     *\/\n\n                    if (largestSide > maxDimension) {\n\n                        const scale =\n                            maxDimension \/ largestSide;\n\n                        targetWidth =\n                            Math.round(targetWidth * scale);\n\n                        targetHeight =\n                            Math.round(targetHeight * scale);\n\n                    }\n\n                    const canvas =\n                        document.createElement(\"canvas\");\n\n                    canvas.width =\n                        targetWidth;\n\n                    canvas.height =\n                        targetHeight;\n\n                    const context =\n                        canvas.getContext(\"2d\");\n\n                    if (!context) {\n\n                        reject(\n                            new Error(\n                                \"Canvas is not supported in this browser.\"\n                            )\n                        );\n\n                        return;\n\n                    }\n\n                    context.drawImage(\n                        img,\n                        0,\n                        0,\n                        targetWidth,\n                        targetHeight\n                    );\n\n                    let dataUrl;\n\n                    try {\n\n                        \/*\n                         * Always re-encode as JPEG regardless of\n                         * the original format \u2014 this is the\n                         * actual compression step, and every\n                         * format we accept (JPEG\/PNG\/WebP)\n                         * decodes fine into the canvas above.\n                         *\/\n\n                        dataUrl =\n                            canvas.toDataURL(\n                                \"image\/jpeg\",\n                                quality\n                            );\n\n                    }\n\n                    catch (error) {\n\n                        reject(error);\n\n                        return;\n\n                    }\n\n                    resolve(dataUrl);\n\n                };\n\n            img.onerror =\n                function () {\n\n                    URL.revokeObjectURL(objectUrl);\n\n                    reject(\n                        new Error(\n                            \"Could not read \" + file.name\n                        )\n                    );\n\n                };\n\n            img.src =\n                objectUrl;\n\n        }\n    );\n\n}\n\n\nenvironmentImagesInput.addEventListener(\n    \"change\",\n    async function (event) {\n\n        const files =\n            Array.from(\n                event.target.files || []\n            );\n\n\n        if (!files.length) {\n            return;\n        }\n\n\n        const allowedTypes = [\n\n            \"image\/jpeg\",\n            \"image\/png\",\n            \"image\/webp\"\n\n        ];\n\n\n        const invalidFile =\n            files.find(\n                function (file) {\n                    return !allowedTypes.includes(file.type);\n                }\n            );\n\n\n        if (invalidFile) {\n\n            environmentImagesInput.value =\n                \"\";\n\n            environmentImagesStatus.className =\n                \"pc-layout-upload-status error\";\n\n            environmentImagesStatus.textContent =\n                \"Please upload only JPG, PNG or WebP images.\";\n\n            return;\n\n        }\n\n\n        const limitedFiles =\n            files.slice(0, MAX_ENVIRONMENT_IMAGES);\n\n        const wasTrimmed =\n            files.length > MAX_ENVIRONMENT_IMAGES;\n\n\n        try {\n\n            environmentImages =\n                await Promise.all(\n                    limitedFiles.map(function (file) {\n\n                        return resizeImageFile(\n                            file,\n                            ENVIRONMENT_IMAGE_MAX_DIMENSION,\n                            ENVIRONMENT_IMAGE_JPEG_QUALITY\n                        );\n\n                    })\n                );\n\n\n            deleteEnvironmentImagesButton.style.display =\n                \"block\";\n\n\n            environmentImagesStatus.className =\n                \"pc-layout-upload-status loaded\";\n\n\n            environmentImagesStatus.textContent =\n                \"\u2713 \" +\n                environmentImages.length +\n                (\n                    environmentImages.length === 1\n                        ? \" environment photo loaded.\"\n                        : \" environment photos loaded.\"\n                ) +\n                (\n                    wasTrimmed\n                        ? \" Only the first \" + MAX_ENVIRONMENT_IMAGES + \" were used.\"\n                        : \"\"\n                );\n\n        }\n\n        catch (error) {\n\n            console.error(\n                \"Environment reference images:\",\n                error\n            );\n\n\n            environmentImages =\n                [];\n\n\n            environmentImagesInput.value =\n                \"\";\n\n\n            environmentImagesStatus.className =\n                \"pc-layout-upload-status error\";\n\n\n            environmentImagesStatus.textContent =\n                \"One or more images could not be read. Please try again.\";\n\n        }\n\n    }\n);\n\n\ndeleteEnvironmentImagesButton.addEventListener(\n    \"click\",\n    function () {\n\n        clearEnvironmentImages();\n\n    }\n);\n\n\n\/* =========================\n   GENERATE\n========================= *\/\n\nasync function generateConcept() {\n\n\n        const courtModel =\n            courtModelSelect.value;\n\n\n        const courtModelLabel =\n            courtModelSelect.options[\n                courtModelSelect.selectedIndex\n            ].text;\n\n\n        const courtCount =\n            parseInt(\n                document.getElementById(\n                    \"pc-court-count\"\n                ).value,\n                10\n            );\n\n\n        const layout =\n            document.getElementById(\n                \"pc-layout\"\n            ).value;\n\n\n        const camera =\n            document.getElementById(\n                \"pc-camera\"\n            ).value;\n\n\n        const referenceMode =\n            referenceModeSelect.value;\n\n\n        \/*\n         * IMPORTANT:\n         * Time of day only applies outdoors.\n         *\/\n\n        const timeOfDay =\n            environment === \"outdoor\"\n                ? timeSelect.value\n                : \"\";\n\n\n        const application =\n            applicationSelect.value;\n\n\n        const userPrompt =\n            document.getElementById(\n                \"pc-prompt\"\n            ).value.trim();\n\n\nif (!accessValidated) {\n\n    showError(\n        \"Please enter a valid access code.\"\n    );\n\n    return;\n\n}\n\n\nif (\n    referenceMode === \"environment-photos\" &&\n    environmentImages.length === 0\n) {\n\n    showError(\n        \"Please upload at least one Environment Reference photo, or choose a different Project Reference option.\"\n    );\n\n    return;\n\n}\n\n\nhideError();\n\nsetLoading(true);\n\nstartProgress();\n\n\n        const requestData = {\n        \n            environment:\n                environment,\n        \n            court_model:\n                courtModel,\n        \n            court_model_label:\n                courtModelLabel,\n        \n            court_count:\n                courtCount,\n        \n            layout:\n                layout,\n        \n            camera:\n                camera,\n        \n            reference_mode:\n                referenceMode,\n        \n            time_of_day:\n                timeOfDay,\n        \n            application:\n                application,\n        \n            audience:\n                applicationSelect.value === \"private-house\"\n                    ? exampleAudience\n                    : \"\",\n        \n            user_prompt:\n                userPrompt,\n        \n            access_code:\n                accessInput.value.trim(),\n        \n            environment_images:\n                environmentImages\n        \n        };\n\n\n        try {\n\n\n            const response =\n                await fetch(\n                    API_ENDPOINT,\n                    {\n\n                        method:\n                            \"POST\",\n\n                        headers: {\n\n                            \"Content-Type\":\n                                \"application\/json\"\n\n                        },\n\n                        body:\n                            JSON.stringify(\n                                requestData\n                            )\n\n                    }\n                );\n\n\n            let data;\n\n\n            try {\n\n                data =\n                    await response.json();\n\n            }\n\n            catch (error) {\n\n                throw new Error(\n                    \"The server returned an invalid response.\"\n                );\n\n            }\n\n\n            if (!response.ok) {\n\n                throw new Error(\n                    data.message ||\n                    \"Image generation failed.\"\n                );\n\n            }\n\n\n            let imageSource;\n\n\n            if (data.image_url) {\n\n                imageSource =\n                    data.image_url;\n\n            }\n\n            else if (\n                data.image_base64\n            ) {\n            \n                const mimeType =\n                    data.image_mime ||\n                    \"image\/png\";\n            \n                imageSource =\n                    \"data:\" +\n                    mimeType +\n                    \";base64,\" +\n                    data.image_base64;\n            \n            }\n\n            else {\n\n                throw new Error(\n                    \"No image was returned.\"\n                );\n\n            }\n\n\n const runsRemainingElement =\n    document.getElementById(\n        \"pc-runs-remaining\"\n    );\n\n\nif (runsRemainingElement) {\n\n    \/*\n     * PRIVATE UNLIMITED ACCESS\n     *\/\n\n    if (data.unlimited === true) {\n\n        runsRemainingElement.textContent =\n            \" Unlimited access.\";\n\n    }\n\n    \/*\n     * NORMAL LIMITED ACCESS\n     *\/\n\n    else if (\n        typeof data.runs_remaining !==\n        \"undefined\"\n    ) {\n\n        const remaining =\n            Number(\n                data.runs_remaining\n            );\n\n        const resetSeconds =\n            Number(\n                data.reset_seconds || 0\n            );\n\n        const resetText =\n            formatResetTime(\n                resetSeconds\n            );\n\n\n        if (remaining === 0) {\n\n            runsRemainingElement.textContent =\n                \" No generations remaining. \" +\n                \"Limit resets in \" +\n                resetText +\n                \".\";\n\n        }\n\n        else if (remaining === 1) {\n\n            runsRemainingElement.textContent =\n                \" 1 generation remaining. \" +\n                \"Limit resets in \" +\n                resetText +\n                \".\";\n\n        }\n\n        else {\n\n            runsRemainingElement.textContent =\n                \" \" +\n                remaining +\n                \" generations remaining. \" +\n                \"Limit resets in \" +\n                resetText +\n                \".\";\n\n        }\n\n    }\n\n}\n\n\nshowImage(\n    imageSource\n);\n\n\n            finishProgress(\n                true\n            );\n\n\n        }\n\n        catch (error) {\n\n\n            console.error(\n                \"PADELCREATIONS AI:\",\n                error\n            );\n\n\n            finishProgress(\n                false\n            );\n\n\n            showError(\n                error.message ||\n                \"Something went wrong.\"\n            );\n\n\n        }\n\n        finally {\n\n            setLoading(\n                false\n            );\n\n        }\n\n    }\n\n\n\n\/* =========================\n   DOWNLOAD FILE NAME\n========================= *\/\n\nfunction createDownloadFilename() {\n\n    const now =\n        new Date();\n\n\n    const year =\n        now.getFullYear();\n\n\n    const month =\n        String(\n            now.getMonth() + 1\n        ).padStart(2, \"0\");\n\n\n    const day =\n        String(\n            now.getDate()\n        ).padStart(2, \"0\");\n\n\n    const hours =\n        String(\n            now.getHours()\n        ).padStart(2, \"0\");\n\n\n    const minutes =\n        String(\n            now.getMinutes()\n        ).padStart(2, \"0\");\n\n\n    const seconds =\n        String(\n            now.getSeconds()\n        ).padStart(2, \"0\");\n\n\n    const timestamp =\n        year +\n        month +\n        day +\n        \"-\" +\n        hours +\n        minutes +\n        seconds;\n\n\n    return (\n        timestamp +\n        \" - Concept AI Padel Club Designer Padelcreations.png\"\n    );\n}\n\n\n    \/* =========================\n       SHOW IMAGE\n    ========================= *\/\n\n    function showImage(\n        imageSource\n    ) {\n\n\n        const placeholder =\n            document.getElementById(\n                \"pc-placeholder\"\n            );\n\n        const status =\n            document.getElementById(\n                \"pc-generation-status\"\n            );\n\n        const result =\n            document.getElementById(\n                \"pc-result\"\n            );\n\n        const image =\n            document.getElementById(\n                \"pc-result-image\"\n            );\n\n        const download =\n            document.getElementById(\n                \"pc-download\"\n            );\n\n        const actions =\n            document.getElementById(\n                \"pc-result-actions\"\n            );\n\n        const resultStory =\n            document.getElementById(\n                \"pc-result-story\"\n            );\n\n\n            image.src =\n                imageSource;\n            \n            \n            download.href =\n                imageSource;\n            \n            \n            download.download =\n                createDownloadFilename();\n            \n            \n            placeholder.style.display =\n                \"none\";\n            \n            status.style.display =\n                \"none\";\n            \n            result.style.display =\n                \"block\";\n            \n            actions.style.display =\n                \"flex\";\n\n            if (resultStory) {\n                resultStory.style.display = \"block\";\n            }\n\n    }\n\n\n  \/* =========================\n   LOADING STATE\n========================= *\/\n\nfunction setLoading(\n    loading\n) {\n\n    const buttonText =\n        generateButton.querySelector(\n            \".pc-button-text\"\n        );\n\n\n    if (loading) {\n\n        generateButton.disabled =\n            true;\n\n        generateButton.classList.add(\n            \"loading\"\n        );\n\n        buttonText.textContent =\n            \"Bringing your vision to life...\";\n\n\n        if (regenerateButton) {\n\n            regenerateButton.disabled =\n                true;\n\n        }\n\n    }\n\n    else {\n\n        generateButton.disabled =\n            !accessValidated;\n\n        generateButton.classList.remove(\n            \"loading\"\n        );\n\n        buttonText.textContent =\n            \"Bring My Vision to Life\";\n\n\n        if (accessValidated) {\n\n            generateButton.classList.add(\n                \"pc-access-active\"\n            );\n\n        }\n\n        else {\n\n            generateButton.classList.remove(\n                \"pc-access-active\"\n            );\n\n        }\n\n\n        if (regenerateButton) {\n\n            regenerateButton.disabled =\n                !accessValidated;\n\n        }\n\n    }\n\n}\n\n\n    \/* =========================\n       PROGRESS\n    ========================= *\/\n\n    function startProgress() {\n\n        const placeholder =\n            document.getElementById(\n                \"pc-placeholder\"\n            );\n\n        const result =\n            document.getElementById(\n                \"pc-result\"\n            );\n\n        const status =\n            document.getElementById(\n                \"pc-generation-status\"\n            );\n\n        const actions =\n            document.getElementById(\n                \"pc-result-actions\"\n            );\n\n        const bar =\n            document.getElementById(\n                \"pc-progress-bar\"\n            );\n\n        const text =\n            document.getElementById(\n                \"pc-progress-text\"\n            );\n\n        const time =\n            document.getElementById(\n                \"pc-progress-time\"\n            );\n\n\n        if (progressInterval) {\n\n            clearInterval(\n                progressInterval\n            );\n\n        }\n\n\n        progressSeconds =\n            0;\n\n\n        placeholder.style.display =\n            \"none\";\n\n        result.style.display =\n            \"none\";\n\n        actions.style.display =\n            \"none\";\n\n        const resultStory = document.getElementById(\"pc-result-story\");\n        if (resultStory) {\n            resultStory.style.display = \"none\";\n        }\n\n        status.style.display =\n            \"flex\";\n\n        const statusLogo =\n            document.getElementById(\n                \"pc-status-logo\"\n            );\n        \n        if (statusLogo) {\n        \n            statusLogo.innerHTML = \"\";\n        \n            const loadingGif =\n                document.createElement(\n                    \"img\"\n                );\n        \n            loadingGif.src =\n                \"https:\/\/www.padelcreations.com\/wp-content\/uploads\/Others\/Please-wait-v2.gif?t=\" +\n                Date.now();\n        \n            loadingGif.alt =\n                \"Creating your concept\";\n        \n            statusLogo.appendChild(\n                loadingGif\n            );\n        \n        }\n\n        bar.style.width =\n            \"4%\";\n\n\n        text.textContent =\n            \"Understanding your vision...\";\n\n\n        time.textContent =\n            \"Estimated ~60 sec\";\n\n\n        progressInterval =\n            setInterval(\n                function () {\n\n\n                    progressSeconds++;\n\n\n                    const calculated =\n                        5 +\n                        (\n                            progressSeconds \/\n                            ESTIMATED_TIME\n                        ) * 87;\n\n\n                    const percentage =\n                        Math.min(\n                            92,\n                            calculated\n                        );\n\n\n                    bar.style.width =\n                        percentage + \"%\";\n\n\n                    const remaining =\n                        Math.max(\n                            0,\n                            ESTIMATED_TIME -\n                            progressSeconds\n                        );\n\n\n                    if (\n                        progressSeconds < 10\n                    ) {\n\n                        text.textContent =\n                            \"Understanding your vision...\";\n\n                    }\n\n                    else if (\n                        progressSeconds < 25\n                    ) {\n\n                        text.textContent =\n                            \"Shaping your Padel environment...\";\n\n                    }\n\n                    else if (\n                        progressSeconds < 45\n                    ) {\n\n                        text.textContent =\n                            \"Bringing architecture and courts together...\";\n\n                    }\n\n                    else {\n\n                        text.textContent =\n                            \"Adding the finishing touches...\";\n\n                    }\n\n\n                    if (\n                        remaining > 0\n                    ) {\n\n                        time.textContent =\n                            \"Estimated ~\" +\n                            remaining +\n                            \" sec\";\n\n                    }\n\n                    else {\n\n                        time.textContent =\n                            \"Almost ready...\";\n\n                    }\n\n\n                },\n                1000\n            );\n\n    }\n\n\n    function finishProgress(\n        success\n    ) {\n\n\n        const bar =\n            document.getElementById(\n                \"pc-progress-bar\"\n            );\n\n        const text =\n            document.getElementById(\n                \"pc-progress-text\"\n            );\n\n        const time =\n            document.getElementById(\n                \"pc-progress-time\"\n            );\n\n\n        if (progressInterval) {\n\n            clearInterval(\n                progressInterval\n            );\n\n            progressInterval =\n                null;\n\n        }\n\n\n        if (success) {\n\n            bar.style.width =\n                \"100%\";\n\n            text.textContent =\n                \"Concept ready\";\n\n            time.textContent =\n                \"100%\";\n\n        }\n\n        else {\n\n            text.textContent =\n                \"Generation stopped\";\n\n            time.textContent =\n                \"\";\n\n        }\n\n    }\n\n\n    \/* =========================\n       ERRORS\n    ========================= *\/\n\n    function showError(\n        message\n    ) {\n\n        errorBox.textContent =\n            message;\n\n        errorBox.style.display =\n            \"block\";\n\n    }\n\n\n    function hideError() {\n\n        errorBox.style.display =\n            \"none\";\n\n        errorBox.textContent =\n            \"\";\n\n    }\n\n\n    \/* =========================\n       EVENTS\n    ========================= *\/\n\n    generateButton.addEventListener(\n        \"click\",\n        generateConcept\n    );\n\n\n    if (regenerateButton) {\n\n        regenerateButton.addEventListener(\n            \"click\",\n            generateConcept\n        );\n\n    }\n\n\n    \/* =========================\n       INITIALIZE\n    ========================= *\/\n\n    loadCourtModels();\n\n    updateApplicationHelp();\n\n    updateTimeOfDayVisibility();\n    \n    updateReferenceModeHelp();\n\n    applyReferenceMode(\n        referenceModeSelect.value\n    );\n\n    renderExamplePrompts();\n\n\n})();\n\n\/* =====================================================\n   PADELCREATIONS INSPIRATION GALLERY\n\n   PUBLIC:\n   - low-resolution teaser images\n   - locked\n   - no lightbox \/ download\n\n   UNLOCKED:\n   - protected full gallery\n   - lightbox\n   - navigation\n   - download\n===================================================== *\/\n\n(function () {\n\n    const PREVIEW_ENDPOINT =\n        '\/wp-json\/padelcreations\/v1\/gallery-preview';\n\n    const FULL_ENDPOINT =\n        '\/wp-json\/padelcreations\/v1\/gallery';\n\n    const CONTACT_URL =\n        'https:\/\/www.padelcreations.com\/contact\/';\n\n\n    const grid =\n        document.getElementById('pc-gallery-grid');\n\n    const empty =\n        document.getElementById('pc-gallery-empty');\n\n    const lockMessage =\n        document.getElementById('pc-gallery-lock-message');\n\n    const lightbox =\n        document.getElementById('pc-gallery-lightbox');\n\n    const lightboxImage =\n        document.getElementById('pc-gallery-lightbox-image');\n\n    const download =\n        document.getElementById('pc-gallery-download');\n\n    const close =\n        document.getElementById('pc-gallery-close');\n\n    const prev =\n        document.getElementById('pc-gallery-prev');\n\n    const next =\n        document.getElementById('pc-gallery-next');\n\n    const applicationSelect =\n        document.getElementById('pc-application');\n\n    const accessInput =\n        document.getElementById('pc-access-code');\n\n    const galleryHeading =\n        document.querySelector(\n            '.pc-gallery-heading h3'\n        );\n\n    const ACCESS_ENDPOINT =\n        '\/wp-json\/padelcreations\/v1\/validate-gallery-access';\n\n    const galleryAccessInput =\n        document.getElementById(\n            'pc-gallery-access-code'\n        );\n\n    const galleryUnlockButton =\n        document.getElementById(\n            'pc-gallery-unlock'\n        );\n\n    const galleryAccessStatus =\n        document.getElementById(\n            'pc-gallery-access-status'\n        );\n\n    const galleryMoreWrap =\n        document.getElementById(\n            'pc-gallery-more-wrap'\n        );\n\n    const galleryMoreButton =\n        document.getElementById(\n            'pc-gallery-more'\n        );\n\n    const galleryLessButton =\n        document.getElementById(\n            'pc-gallery-less'\n        );\n\n\n    if (\n        !grid ||\n        !empty ||\n        !lightbox ||\n        !lightboxImage ||\n        !download ||\n        !close ||\n        !prev ||\n        !next ||\n        !applicationSelect ||\n        !accessInput ||\n        !galleryAccessInput ||\n        !galleryUnlockButton ||\n        !galleryAccessStatus ||\n        !galleryMoreWrap ||\n        !galleryMoreButton ||\n        !galleryLessButton\n    ) {\n        return;\n    }\n\n\n    \/* =====================================================\n       APPLICATION MAPPING\n    ===================================================== *\/\n\n    const APPLICATION_METADATA = {\n\n        'tennis-club': [\n            'tennis_club'\n        ],\n\n        'padel-standalone': [\n            'padel_stand_alone_club'\n        ],\n\n        'leisure-sports': [\n            'leisure___sports_facilities'\n        ],\n\n        'private-house': [\n            'residential',\n            'corporate'\n        ]\n\n    };\n\n\n    const APPLICATION_LABELS = {\n\n        'tennis-club':\n            'Tennis Club inspiration',\n\n        'padel-standalone':\n            'Padel Club inspiration',\n\n        'leisure-sports':\n            'Leisure & Sports inspiration',\n\n        'private-house':\n            'Residential & Corporate inspiration'\n\n    };\n\n\n    \/* =====================================================\n       STATE\n    ===================================================== *\/\n\n    let allImages = [];\n\n    let galleryUnlocked = false;\n\n    let currentGalleryImageUrl = '';\n\n    let currentFilteredImages = [];\n\n    let currentImageIndex = -1;\n\n    const GALLERY_INITIAL_LIMIT = 12;\n    const GALLERY_LOAD_MORE = 6;\n\n    let galleryVisibleLimit = GALLERY_INITIAL_LIMIT;\n\n\n    \/* =====================================================\n       PUBLIC PREVIEW\n    ===================================================== *\/\n\n    async function loadPreviewGallery() {\n\n        galleryUnlocked = false;\n\n        if (lockMessage) {\n            lockMessage.style.display = 'flex';\n        }\n\n\n        try {\n\n            const response =\n                await fetch(\n                    PREVIEW_ENDPOINT,\n                    {\n                        method: 'GET',\n                        cache: 'no-store'\n                    }\n                );\n\n\n            const data =\n                await response.json();\n\n\n            if (\n                !response.ok ||\n                !data.success ||\n                !Array.isArray(data.images)\n            ) {\n\n                throw new Error(\n                    'Invalid gallery preview response'\n                );\n\n            }\n\n\n            \/*\n             * The protected gallery may have been unlocked\n             * while this public preview request was still running.\n             * Never allow a late preview response to overwrite\n             * the authenticated gallery.\n             *\/\n\n            if (galleryUnlocked) {\n                return;\n            }\n\n\n            allImages =\n                data.images;\n\n\n            renderFilteredGallery();\n\n        }\n\n        catch (error) {\n\n            if (galleryUnlocked) {\n                return;\n            }\n\n\n            console.error(\n                'PADELCREATIONS gallery preview:',\n                error\n            );\n\n\n            grid.innerHTML = '';\n\n            empty.style.display =\n                'block';\n\n            empty.textContent =\n                'Inspiration gallery temporarily unavailable.';\n\n        }\n\n    }\n\n\n    \/* =====================================================\n       PROTECTED FULL GALLERY\n    ===================================================== *\/\n\n    async function loadFullGallery(accessCode) {\n\n        accessCode =\n            String(accessCode || '').trim();\n\n\n        if (!accessCode) {\n            return;\n        }\n\n\n        empty.style.display =\n            'block';\n\n        empty.textContent =\n            'Unlocking full inspiration gallery...';\n\n\n        try {\n\n            const response =\n                await fetch(\n                    FULL_ENDPOINT,\n                    {\n                        method: 'POST',\n\n                        headers: {\n                            'Content-Type':\n                                'application\/json'\n                        },\n\n                        body: JSON.stringify({\n                            access_code: accessCode\n                        })\n                    }\n                );\n\n\n            const data =\n                await response.json();\n\n\n            if (\n                !response.ok ||\n                !data.success ||\n                !Array.isArray(data.images)\n            ) {\n\n                throw new Error(\n                    data.message ||\n                    'Unable to unlock gallery.'\n                );\n\n            }\n\n\n            \/*\n             * Only mark the gallery unlocked AFTER\n             * the protected endpoint has accepted\n             * the access code.\n             *\/\n\n            galleryUnlocked = true;\n\n            allImages =\n                data.images;\n\n\n            if (lockMessage) {\n\n                lockMessage.style.display =\n                    'none';\n\n            }\n\n\n            renderFilteredGallery();\n\n        }\n\n        catch (error) {\n\n            console.error(\n                'PADELCREATIONS protected gallery:',\n                error\n            );\n\n\n            \/*\n             * Keep\/reload the public teaser if for\n             * any reason the protected request fails.\n             *\/\n\n            galleryUnlocked = false;\n\n            if (lockMessage) {\n                lockMessage.style.display = 'flex';\n            }\n\n            await loadPreviewGallery();\n\n        }\n\n    }\n\n\n    \/* =====================================================\n       FILTER BY CURRENT APPLICATION\n    ===================================================== *\/\n\n    function getFilteredImages() {\n\n        const selectedApplication =\n            applicationSelect.value;\n\n        const selectedEnvironment =\n            document.querySelector(\n                '#pc-environment button.active'\n            )?.dataset.value || 'outdoor';\n\n\n        let allowedApplicationValues =\n            APPLICATION_METADATA[\n                selectedApplication\n            ] || [];\n\n\n        if (\n            selectedApplication ===\n            'private-house'\n        ) {\n\n            const activeAudienceButton =\n                document.querySelector(\n                    '#pc-example-audience-toggle ' +\n                    '.pc-audience-button.active'\n                );\n\n\n            const selectedAudience =\n                activeAudienceButton\n                    ? activeAudienceButton.dataset.audience\n                    : 'residential';\n\n\n            allowedApplicationValues =\n                [\n                    selectedAudience\n                ];\n\n        }\n\n\n        return allImages.filter(\n            function (image) {\n\n                if (\n                    !image.metadata ||\n                    !Array.isArray(\n                        image.metadata.application\n                    ) ||\n                    !Array.isArray(\n                        image.metadata.environment\n                    )\n                ) {\n\n                    return false;\n\n                }\n\n\n                const applicationMatches =\n                    image.metadata.application.some(\n                        function (value) {\n\n                            return allowedApplicationValues.includes(\n                                value\n                            );\n\n                        }\n                    );\n\n\n                const environmentMatches =\n                    image.metadata.environment.includes(\n                        selectedEnvironment\n                    );\n\n\n                return (\n                    applicationMatches &&\n                    environmentMatches\n                );\n\n            }\n        );\n\n    }\n\n\n    \/* =====================================================\n       RENDER FILTERED GALLERY\n    ===================================================== *\/\n\n    function renderFilteredGallery() {\n\n        const selectedApplication =\n            applicationSelect.value;\n\n\n        const filteredImages =\n            getFilteredImages();\n\n\n        currentFilteredImages =\n            filteredImages;\n\n\n        const visibleImages =\n            currentFilteredImages.slice(\n                0,\n                galleryVisibleLimit\n            );\n\n\n        grid.innerHTML = '';\n\n\n        \/* Update heading *\/\n\n        if (galleryHeading) {\n\n            const activeEnvironmentButton =\n                document.querySelector(\n                    '#pc-environment button.active'\n                );\n\n\n            const environmentLabel =\n                activeEnvironmentButton\n                    ? activeEnvironmentButton.textContent.trim()\n                    : '';\n\n\n            let applicationLabel =\n                APPLICATION_LABELS[\n                    selectedApplication\n                ] ||\n                'Padel inspiration';\n\n\n            if (\n                selectedApplication ===\n                'private-house'\n            ) {\n\n                const activeAudienceButton =\n                    document.querySelector(\n                        '#pc-example-audience-toggle ' +\n                        '.pc-audience-button.active'\n                    );\n\n\n                const audienceLabel =\n                    activeAudienceButton\n                        ? activeAudienceButton.textContent.trim()\n                        : 'Residential';\n\n\n                applicationLabel =\n                    audienceLabel +\n                    ' inspiration';\n\n            }\n\n\n            galleryHeading.textContent =\n                environmentLabel +\n                ' ' +\n                applicationLabel;\n\n        }\n\n\n        if (\n            filteredImages.length === 0\n        ) {\n\n            empty.style.display =\n                'block';\n\n            empty.textContent =\n                'More inspiration for this project type is coming soon.';\n\n            return;\n\n        }\n\n\n        empty.style.display =\n            'none';\n\n\n        visibleImages.forEach(\n            function (image, imageIndex) {\n\n                const card =\n                    document.createElement(\n                        'div'\n                    );\n\n\n                card.className =\n                    'pc-gallery-card';\n\n\n                if (!galleryUnlocked) {\n\n                    card.classList.add(\n                        'pc-gallery-locked'\n                    );\n\n                }\n\n\n                const img =\n                    document.createElement(\n                        'img'\n                    );\n\n\n                \/*\n                 * Preview endpoint returns \"preview\".\n                 * Protected endpoint returns \"thumbnail\".\n                 *\/\n\n                img.src =\n                    galleryUnlocked\n                        ? image.thumbnail\n                        : image.preview;\n\n\n                img.alt =\n                    'PADELCREATIONS Padel concept';\n\n\n                img.loading =\n                    'lazy';\n\n\n                img.decoding =\n                    'async';\n\n\n                card.appendChild(\n                    img\n                );\n\n\n                \/*\n                 * LOCKED:\n                 * show only the small information icon.\n                 *\/\n\n                if (!galleryUnlocked) {\n\n                    const info =\n                        document.createElement(\n                            'div'\n                        );\n\n\n                    info.className =\n                        'pc-gallery-info';\n\n\n                    info.setAttribute(\n                        'aria-label',\n                        'Gallery locked'\n                    );\n\n\n                    info.innerHTML =\n                        'i' +\n                        '<span class=\"pc-gallery-info-tooltip\">' +\n                        'Unlock gallery first' +\n                        '<\/span>';\n\n\n                    card.appendChild(\n                        info\n                    );\n\n                }\n\n\n                \/*\n                 * UNLOCKED:\n                 * show the normal View button.\n                 *\/\n\n                else {\n\n                    const viewButton =\n                        document.createElement(\n                            'button'\n                        );\n\n\n                    viewButton.type =\n                        'button';\n\n\n                    viewButton.className =\n                        'pc-gallery-view';\n\n\n                    viewButton.setAttribute(\n                        'aria-label',\n                        'View image'\n                    );\n\n                    viewButton.setAttribute(\n                        'title',\n                        'View'\n                    );\n\n                    viewButton.innerHTML =\n                        '<svg viewBox=\"0 0 24 24\" ' +\n                        'fill=\"none\" ' +\n                        'xmlns=\"http:\/\/www.w3.org\/2000\/svg\" ' +\n                        'aria-hidden=\"true\">' +\n                            '<path ' +\n                                'd=\"M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z\" ' +\n                                'stroke-width=\"2\" ' +\n                                'stroke-linecap=\"round\" ' +\n                                'stroke-linejoin=\"round\"\/>' +\n                            '<circle ' +\n                                'cx=\"12\" ' +\n                                'cy=\"12\" ' +\n                                'r=\"2.7\" ' +\n                                'stroke-width=\"2\"\/>' +\n                        '<\/svg>';\n\n\n                    viewButton.addEventListener(\n                        'click',\n                        function (event) {\n\n                            event.stopPropagation();\n\n                            openLightbox(\n                                imageIndex\n                            );\n\n                        }\n                    );\n\n\n                    card.appendChild(\n                        viewButton\n                    );\n\n\n                    \/*\n                     * Also allow clicking the image itself\n                     * after the gallery is unlocked.\n                     *\/\n\n                    card.addEventListener(\n                        'click',\n                        function () {\n\n                            openLightbox(\n                                imageIndex\n                            );\n\n                        }\n                    );\n\n                }\n\n\n                grid.appendChild(\n                    card\n                );\n\n            }\n        );\n\n\n        if (\n            currentFilteredImages.length >\n            GALLERY_INITIAL_LIMIT\n        ) {\n\n            galleryMoreWrap.style.display =\n                'flex';\n\n            \/*\n             * More images still available.\n             *\/\n\n            if (\n                galleryVisibleLimit <\n                currentFilteredImages.length\n            ) {\n\n                galleryMoreButton.style.display =\n                    'inline-flex';\n\n            } else {\n\n                galleryMoreButton.style.display =\n                    'none';\n\n            }\n\n\n            \/*\n             * Show LESS only after gallery\n             * has been expanded beyond 18.\n             *\/\n\n            if (\n                galleryVisibleLimit >\n                GALLERY_INITIAL_LIMIT\n            ) {\n\n                galleryLessButton.style.display =\n                    'inline-flex';\n\n            } else {\n\n                galleryLessButton.style.display =\n                    'none';\n\n            }\n\n        } else {\n\n            galleryMoreWrap.style.display =\n                'none';\n\n        }\n\n    }\n\n\n    \/* =====================================================\n       FILTER UPDATES\n    ===================================================== *\/\n\n    applicationSelect.addEventListener(\n        'change',\n        function () {\n\n            galleryVisibleLimit =\n                GALLERY_INITIAL_LIMIT;\n\n            renderFilteredGallery();\n\n        }\n    );\n\n\n    document.querySelectorAll(\n        '#pc-environment button'\n    ).forEach(\n        function (button) {\n\n            button.addEventListener(\n                'click',\n                function () {\n\n                    setTimeout(\n                        function () {\n\n                            galleryVisibleLimit =\n                                GALLERY_INITIAL_LIMIT;\n\n                            renderFilteredGallery();\n\n                        },\n                        0\n                    );\n\n                }\n            );\n\n        }\n    );\n\n\n    document.querySelectorAll(\n        '#pc-example-audience-toggle ' +\n        '.pc-audience-button'\n    ).forEach(\n        function (button) {\n\n            button.addEventListener(\n                'click',\n                function () {\n\n                    setTimeout(\n                        function () {\n\n                            galleryVisibleLimit =\n                                GALLERY_INITIAL_LIMIT;\n\n                            renderFilteredGallery();\n\n                        },\n                        0\n                    );\n\n                }\n            );\n\n        }\n    );\n\n\n    galleryMoreButton.addEventListener(\n        'click',\n        function () {\n\n            galleryVisibleLimit +=\n                GALLERY_LOAD_MORE;\n\n            renderFilteredGallery();\n\n        }\n    );\n\n\n    galleryLessButton.addEventListener(\n        'click',\n        function () {\n\n            galleryVisibleLimit =\n                GALLERY_INITIAL_LIMIT;\n\n            renderFilteredGallery();\n\n\n            \/*\n             * Bring the user back to the\n             * beginning of the gallery.\n             *\/\n\n            const gallery =\n                document.getElementById(\n                    'pc-inspiration-gallery'\n                );\n\n            if (gallery) {\n\n                gallery.scrollIntoView({\n                    behavior: 'smooth',\n                    block: 'start'\n                });\n\n            }\n\n        }\n    );\n\n\n    \/* =====================================================\n       DESIGNER UNLOCK EVENT\n    ===================================================== *\/\n\n    document.addEventListener(\n        'pcDesignerUnlocked',\n        function (event) {\n\n            const code =\n                event.detail &&\n                event.detail.accessCode\n                    ? event.detail.accessCode\n                    : '';\n\n            loadFullGallery(\n                code\n            );\n\n        }\n    );\n\n\n    document.addEventListener(\n        'pcGalleryUnlocked',\n        function (event) {\n\n            loadFullGallery(\n                event.detail.accessCode\n            );\n\n        }\n    );\n\n\n    \/* =====================================================\n       GALLERY UNLOCK\n    ===================================================== *\/\n\n    async function unlockGallery() {\n\n        const code =\n            galleryAccessInput.value.trim();\n\n\n        galleryAccessStatus.textContent = '';\n        galleryAccessStatus.className =\n            'pc-gallery-access-status';\n\n\n        if (!code) {\n\n            galleryAccessStatus.textContent =\n                'Please enter your access code.';\n\n            galleryAccessStatus.classList.add(\n                'invalid'\n            );\n\n            return;\n        }\n\n\n        galleryUnlockButton.disabled =\n            true;\n\n        galleryUnlockButton.textContent =\n            '\u2026';\n\n\n        try {\n\n            const response =\n                await fetch(\n                    ACCESS_ENDPOINT,\n                    {\n                        method: 'POST',\n\n                        headers: {\n                            'Content-Type':\n                                'application\/json'\n                        },\n\n                        body: JSON.stringify({\n                            access_code: code\n                        })\n                    }\n                );\n\n\n            const data =\n                await response.json();\n\n\n            if (\n                !response.ok ||\n                data.valid !== true\n            ) {\n\n                throw new Error(\n                    data.message ||\n                    'Invalid access code.'\n                );\n\n            }\n\n\n            galleryAccessStatus.textContent =\n                '\u2713 Gallery unlocked.';\n\n            galleryAccessStatus.classList.add(\n                'valid'\n            );\n\n\n            await loadFullGallery(\n                code\n            );\n\n        }\n\n        catch (error) {\n\n            galleryAccessStatus.textContent =\n                error.message ||\n                'Unable to unlock gallery.';\n\n            galleryAccessStatus.classList.add(\n                'invalid'\n            );\n\n        }\n\n        finally {\n\n            galleryUnlockButton.disabled =\n                false;\n\n            galleryUnlockButton.textContent =\n                '\u2192';\n\n        }\n\n    }\n\n\n    galleryUnlockButton.addEventListener(\n        'click',\n        unlockGallery\n    );\n\n\n    galleryAccessInput.addEventListener(\n        'keydown',\n        function (event) {\n\n            if (event.key === 'Enter') {\n\n                event.preventDefault();\n\n                unlockGallery();\n\n            }\n\n        }\n    );\n\n\n    \/* =====================================================\n       LIGHTBOX\n    ===================================================== *\/\n\n    function openLightbox(index) {\n\n        if (\n            !galleryUnlocked ||\n            !currentFilteredImages.length ||\n            index < 0\n        ) {\n            return;\n        }\n\n\n        currentImageIndex =\n            index;\n\n\n        const image =\n            currentFilteredImages[\n                currentImageIndex\n            ];\n\n\n        if (!image || !image.url) {\n            return;\n        }\n\n\n        currentGalleryImageUrl =\n            image.url;\n\n\n        lightboxImage.src =\n            image.url;\n\n\n        lightbox.classList.add(\n            'is-open'\n        );\n\n\n        document.body.style.overflow =\n            'hidden';\n\n    }\n\n\n    function showNextImage() {\n\n        if (\n            !galleryUnlocked ||\n            !currentFilteredImages.length\n        ) {\n            return;\n        }\n\n\n        currentImageIndex =\n            (\n                currentImageIndex + 1\n            ) %\n            currentFilteredImages.length;\n\n\n        openLightbox(\n            currentImageIndex\n        );\n\n    }\n\n\n    function showPreviousImage() {\n\n        if (\n            !galleryUnlocked ||\n            !currentFilteredImages.length\n        ) {\n            return;\n        }\n\n\n        currentImageIndex =\n            (\n                currentImageIndex -\n                1 +\n                currentFilteredImages.length\n            ) %\n            currentFilteredImages.length;\n\n\n        openLightbox(\n            currentImageIndex\n        );\n\n    }\n\n\n    next.addEventListener(\n        'click',\n        function (event) {\n\n            event.stopPropagation();\n\n            showNextImage();\n\n        }\n    );\n\n\n    prev.addEventListener(\n        'click',\n        function (event) {\n\n            event.stopPropagation();\n\n            showPreviousImage();\n\n        }\n    );\n\n\n    function closeLightbox() {\n\n        lightbox.classList.remove(\n            'is-open'\n        );\n\n\n        lightboxImage.src =\n            '';\n\n\n        currentGalleryImageUrl =\n            '';\n\n\n        document.body.style.overflow =\n            '';\n\n    }\n\n\n    close.addEventListener(\n        'click',\n        closeLightbox\n    );\n\n\n    lightbox.addEventListener(\n        'click',\n        function (event) {\n\n            if (\n                event.target ===\n                lightbox\n            ) {\n\n                closeLightbox();\n\n            }\n\n        }\n    );\n\n\n    document.addEventListener(\n        'keydown',\n        function (event) {\n\n            if (\n                !lightbox.classList.contains(\n                    'is-open'\n                )\n            ) {\n                return;\n            }\n\n\n            if (\n                event.key ===\n                'Escape'\n            ) {\n\n                closeLightbox();\n\n            }\n\n            else if (\n                event.key ===\n                'ArrowRight'\n            ) {\n\n                showNextImage();\n\n            }\n\n            else if (\n                event.key ===\n                'ArrowLeft'\n            ) {\n\n                showPreviousImage();\n\n            }\n\n        }\n    );\n\n\n    \/* =====================================================\n       DOWNLOAD\n    ===================================================== *\/\n\n    download.addEventListener(\n        'click',\n        async function () {\n\n            if (\n                !galleryUnlocked ||\n                !currentGalleryImageUrl\n            ) {\n                return;\n            }\n\n\n            const originalText =\n                download.innerHTML;\n\n\n            try {\n\n                download.disabled =\n                    true;\n\n\n                download.textContent =\n                    'Downloading...';\n\n\n                const response =\n                    await fetch(\n                        currentGalleryImageUrl,\n                        {\n                            mode: 'cors',\n                            cache: 'no-store'\n                        }\n                    );\n\n\n                if (!response.ok) {\n\n                    throw new Error(\n                        'Image request failed.'\n                    );\n\n                }\n\n\n                const blob =\n                    await response.blob();\n\n\n                const objectUrl =\n                    URL.createObjectURL(\n                        blob\n                    );\n\n\n                const link =\n                    document.createElement(\n                        'a'\n                    );\n\n\n                const now =\n                    new Date();\n\n\n                const timestamp =\n                    now.getFullYear() +\n                    String(\n                        now.getMonth() + 1\n                    ).padStart(2, '0') +\n                    String(\n                        now.getDate()\n                    ).padStart(2, '0') +\n                    '-' +\n                    String(\n                        now.getHours()\n                    ).padStart(2, '0') +\n                    String(\n                        now.getMinutes()\n                    ).padStart(2, '0') +\n                    String(\n                        now.getSeconds()\n                    ).padStart(2, '0');\n\n\n                const applicationDownloadNames = {\n\n                    'tennis-club':\n                        'Tennis Club',\n\n                    'padel-standalone':\n                        'Padel Club',\n\n                    'leisure-sports':\n                        'Leisure & Sports',\n\n                    'private-house':\n                        'Residential & Corporate'\n\n                };\n\n\n                const applicationName =\n                    applicationDownloadNames[\n                        applicationSelect.value\n                    ] ||\n                    'Padel Project';\n\n\n                link.href =\n                    objectUrl;\n\n\n                link.download =\n                    timestamp +\n                    ' - Padelcreations - Inspiration for ' +\n                    applicationName +\n                    '.png';\n\n\n                document.body.appendChild(\n                    link\n                );\n\n\n                link.click();\n\n\n                link.remove();\n\n\n                setTimeout(\n                    function () {\n\n                        URL.revokeObjectURL(\n                            objectUrl\n                        );\n\n                    },\n                    1000\n                );\n\n            }\n\n            catch (error) {\n\n                console.error(\n                    'PADELCREATIONS gallery download:',\n                    error\n                );\n\n\n                download.textContent =\n                    'Download failed - try again';\n\n            }\n\n            finally {\n\n                setTimeout(\n                    function () {\n\n                        download.disabled =\n                            false;\n\n                        download.innerHTML =\n                            originalText;\n\n                    },\n                    1600\n                );\n\n            }\n\n        }\n    );\n\n\n    \/* =====================================================\n       START WITH PUBLIC PREVIEW\n    ===================================================== *\/\n\n    loadPreviewGallery();\n\n})();\n\n<\/script>\n\t\t\t\t<\/div>\n\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>Entdecken Sie schon vor der Umsetzung, wie Ihr zuk\u00fcnftiges Padel-Projekt aussehen k\u00f6nnte. W\u00e4hlen Sie die Umgebung, das Court-Modell und die Anzahl der Courts. Beschreiben Sie anschlie\u00dfend Ihre Vision oder laden Sie Fotos Ihres Standorts hoch, um ein individuelles visuelles Konzept zu erstellen. \ud83d\udc49 F\u00fcr die Nutzung des 3D Space Designer ist ein pers\u00f6nlicher Zugangscode erforderlich. [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":45213,"parent":0,"menu_order":0,"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":"https:\/\/www.padelcreations.com\/wp-content\/uploads\/2026\/09\/Padel_Court_Designer_Tool_Padelcreations.png","_thinkrank_twitter_title":"","_thinkrank_twitter_description":"","_thinkrank_twitter_image":"","_thinkrank_imported_from":"","_thinkrank_focus_keywords":[],"_thinkrank_focus_keyword":"3D-Padel-Raumplaner","_thinkrank_robots_meta_enabled":1,"_thinkrank_robots_meta":"{\"index\":false,\"noindex\":false,\"nofollow\":false,\"noarchive\":false,\"noimageindex\":false,\"nosnippet\":false}","_thinkrank_advanced_robots_meta":"[]","_thinkrank_exclude_from_search":0,"_thinkrank_exclude_from_archives":0,"_thinkrank_primary_category":0,"footnotes":""},"class_list":["post-45300","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/45300","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=45300"}],"version-history":[{"count":10,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/45300\/revisions"}],"predecessor-version":[{"id":45571,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/45300\/revisions\/45571"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/media\/45213"}],"wp:attachment":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/media?parent=45300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}