{"id":1812,"date":"2026-10-22T19:11:46","date_gmt":"2026-10-22T17:11:46","guid":{"rendered":"https:\/\/web2027.padelcreations.com\/3d-raumdesigner\/"},"modified":"2026-11-10T22:10:01","modified_gmt":"2026-11-10T21:10:01","slug":"3d-padel-space-designer","status":"publish","type":"page","link":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/","title":{"rendered":"3D-Raumdesigner"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1812\" class=\"elementor elementor-1812 elementor-448\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-401274d e-flex e-con-boxed e-con e-parent\" data-id=\"401274d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-643dbf8 e-con-full e-flex e-con e-child\" data-id=\"643dbf8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-48bfa86 elementor-widget elementor-widget-heading\" data-id=\"48bfa86\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">PadelCreations \u00b7 Padel Vision<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-10dd18b elementor-widget elementor-widget-heading\" data-id=\"10dd18b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">3D-Padel-Platz-Design-Tool<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8f0718d elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"8f0718d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Erkunden Sie, wie Ihr zuk\u00fcnftiges Padel-Projekt aussehen k\u00f6nnte, bevor es gebaut wird. W\u00e4hlen Sie die Umgebung, das Platzmodell und die Anzahl der Pl\u00e4tze, beschreiben Sie dann Ihre Vision oder laden Sie Fotos Ihres Standorts hoch, um ein personalisiertes visuelles Konzept zu erstellen.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e9ce70 elementor-widget__width-auto elementor-widget elementor-widget-button\" data-id=\"3e9ce70\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#planner-tool\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">TESTEN SIE UNSER 3D-RAUMDESIGNER-TOOL\u2193<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-94530a5 e-flex e-con-boxed e-con e-parent\" data-id=\"94530a5\" data-element_type=\"container\" data-e-type=\"container\" id=\"planner-tool\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2e00201 e-con-full e-flex e-con e-child\" data-id=\"2e00201\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d27e540 elementor-widget elementor-widget-heading\" data-id=\"d27e540\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">PadelCreations \u00b7 Padel Vision<\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef945e6 elementor-widget elementor-widget-heading\" data-id=\"ef945e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Stellen Sie sich Ihr Padel-Projekt vor.<br \/>Jetzt sehen Sie, wie es lebendig wird.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f304bc8 elementor-widget elementor-widget-text-editor\" data-id=\"f304bc8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Unser KI-Tool verwandelt Ihr Padel-Platz-Design in etwa 60 Sekunden in ein realistisches 3D-Konzept \u2013 f\u00fcr Clubs, Hotels, Sportanlagen und private Projekte.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-719968a elementor-widget elementor-widget-text-editor\" data-id=\"719968a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>F\u00fcr die Nutzung des 3D-Raumdesigners ist ein pers\u00f6nlicher Zugangscode erforderlich. Um Ihren Code zu erhalten, f\u00fcllen Sie bitte unser <a href=\"https:\/\/www.padelcreations.com\/de\/kontakt\/\" style=\"color:var(--e-global-color-8ad2385);text-decoration:underline\">Kontaktformular<\/a> mit Details zu Ihrem Padel-Projekt aus.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-eef8e53 e-flex e-con-boxed e-con e-parent\" data-id=\"eef8e53\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d8787d2 elementor-widget elementor-widget-shortcode\" data-id=\"d8787d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- PadelCreations Tools: space-designer -->\n<!-- PC SPACE DESIGNER \u00b7 TWO REFERENCE MODES \u00b7 VERSION 8 \u00b7 BILINGUAL EN + DE -->\n<!--\n    LANGUAGE\n    - The same block can be placed on the English page (\/tools\/) and the German page (\/de\/planung\/).\n    - Language is chosen in this order:\n        1. ?lang=de \/ ?lang=en in the URL\n        2. data-default-lang=\"de\" \/ \"en\" on #pc-ai-designer (leave \"auto\" to detect)\n        3. <html lang=\"\u2026\"> of the page (set by WPML)\n        4. the browser language\n    - \"language\" is now sent to all backend endpoints, so the PHP side can reply in the same language.\n-->\n<div id=\"pc-ai-designer\" data-default-lang=\"auto\">\n\n    <div class=\"pc-header\">\n        <div class=\"pc-eyebrow\">PADELCREATIONS \u00b7 PADEL VISION<\/div>\n\n        <h2 data-i18n-html=\"header.title\">Imagine your Padel project.<br><span>Now see it come to life.<\/span><\/h2>\n\n        <p data-i18n=\"header.intro\">\n            Your project starts with an idea. Tell us what you imagine or show us your location \u2014\n            and discover what your future Padel project could become.\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\" data-i18n=\"s1.title\">1 \u00b7 What are you dreaming of?<\/span>\n        <span class=\"pc-vision-heading-sub\" data-i18n=\"s1.sub\">\n            Choose the kind of project you want to create and whether it will be indoors or outdoors.\n        <\/span>\n    <\/div>\n\n    <div class=\"pc-field\">\n        <label for=\"pc-application\" data-i18n=\"s1.applicationLabel\">Choose your starting point<\/label>\n        <select id=\"pc-application\">\n            <option value=\"tennis-club\" data-i18n=\"app.tennis-club\">Tennis Club<\/option>\n            <option value=\"padel-standalone\" data-i18n=\"app.padel-standalone\">Padel Stand-Alone Club<\/option>\n            <option value=\"leisure-sports\" data-i18n=\"app.leisure-sports\">Leisure &amp; Sports Facilities<\/option>\n            <option value=\"private-house\" data-i18n=\"app.private-house\">Residential &amp; Corporate<\/option>\n        <\/select>\n        <div id=\"pc-application-help\"><\/div>\n    <\/div>\n\n    <div class=\"pc-field pc-field-last\">\n        <label data-i18n=\"s1.envLabel\">Where will you play?<\/label>\n        <div class=\"pc-toggle\" id=\"pc-environment\">\n            <button type=\"button\" data-value=\"outdoor\" class=\"active\" data-i18n=\"env.outdoor\">Outdoor<\/button>\n            <button type=\"button\" data-value=\"indoor\" data-i18n=\"env.indoor\">Indoor<\/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\" data-i18n=\"s2.title\">\n        2 \u00b7 Tell us what you imagine\n    <\/div>\n\n    <div class=\"pc-field pc-field-last\">\n\n        <label for=\"pc-prompt\">\n            <span data-i18n=\"s2.label\">Your vision<\/span>\n            <span style=\"font-weight:400;\" data-i18n=\"s2.optional\">(optional)<\/span>\n        <\/label>\n\n        <textarea\n            id=\"pc-prompt\"\n            rows=\"6\"\n            data-i18n-placeholder=\"s2.placeholder\"\n            placeholder=\"Imagine your future Padel project\u2026 A Mediterranean club surrounded by olive trees, a stylish clubhouse, restaurant terrace and warm sunset atmosphere\u2026\"\n        ><\/textarea>\n\n        <div class=\"pc-prompt-hint\" data-i18n=\"s2.hint\">\n            Describe the atmosphere, architecture, landscaping,\n            facilities or special ideas you would love to see.\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 Enhance prompt\n            <\/button>\n\n            <button type=\"button\" id=\"pc-undo-enhance\" class=\"pc-vision-tool-button pc-undo-enhance\" style=\"display:none;\" data-i18n=\"btn.undo\">\n                \u21b6 Undo\n            <\/button>\n\n            <button type=\"button\" id=\"pc-preset-toggle\" class=\"pc-vision-tool-button pc-preset-toggle\" aria-expanded=\"false\">\n                <span data-i18n=\"btn.presets\">Presets<\/span>\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                Choose a starting point for your project.\n            <\/div>\n\n            <!-- Residential \/ Corporate only -->\n            <div id=\"pc-example-audience-toggle\" class=\"pc-example-audience-toggle\" style=\"display:none;\">\n                <button type=\"button\" data-audience=\"residential\" class=\"pc-audience-button active\" data-i18n=\"audience.residential\">Residential<\/button>\n                <button type=\"button\" data-audience=\"corporate\" class=\"pc-audience-button\" data-i18n=\"audience.corporate\">Corporate<\/button>\n            <\/div>\n\n            <!-- Preset buttons inserted here by JS -->\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\" data-i18n=\"bg.heading\">Choose the surroundings<\/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 data-i18n=\"bg.apply\">\n                    Apply preset\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\" data-i18n=\"s3.label\">3 \u00b7 Make it yours<\/label>\n    <select id=\"pc-reference-mode\">\n        <option value=\"none\" selected data-i18n=\"ref.none\">Start from my imagination<\/option>\n        <option value=\"environment-photos\" data-i18n=\"ref.photos\">Use my real location<\/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            <div class=\"pc-layout-file-row\">\n                <input type=\"file\" id=\"pc-environment-images-file\" accept=\"image\/jpeg,image\/png,image\/webp\" multiple>\n                <button type=\"button\" id=\"pc-delete-environment-images\" class=\"pc-delete-file\" style=\"display:none;\" data-i18n=\"envimg.delete\">Delete<\/button>\n            <\/div>\n            <div id=\"pc-environment-images-status\" class=\"pc-layout-upload-status\"><\/div>\n            <div class=\"pc-upload-privacy-note\" data-i18n=\"envimg.privacy\">\n                Please avoid uploading images containing unnecessary personal or sensitive information.\n            <\/div>\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\" data-i18n=\"s4.title\">4 \u00b7 Shape your Padel project<\/div>\n\n<div class=\"pc-field\">\n    <label for=\"pc-court-model\" data-i18n=\"s4.model\">Court model<\/label>\n    <select id=\"pc-court-model\"><\/select>\n<\/div>\n\n<div class=\"pc-field\">\n    <label for=\"pc-court-count\" data-i18n=\"s4.count\">Number of courts<\/label>\n    <!-- Options are built by JS (1\u201312) in the active language -->\n    <select id=\"pc-court-count\"><\/select>\n<\/div>\n\n<div class=\"pc-field\">\n    <label for=\"pc-layout\" data-i18n=\"s4.layout\">Court layout<\/label>\n    <select id=\"pc-layout\">\n        <option value=\"side-by-side\" selected data-i18n=\"layout.side-by-side\">Side by side<\/option>\n        <option value=\"2x2\">2 \u00d7 2<\/option>\n        <option value=\"linear\" data-i18n=\"layout.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\" data-i18n=\"s5.title\">5 \u00b7 Presentation options<\/div>\n\n<div class=\"pc-field\">\n    <label for=\"pc-camera\" data-i18n=\"s5.camera\">Camera view<\/label>\n    <select id=\"pc-camera\">\n        <option value=\"elevated\" selected data-i18n=\"camera.elevated\">Elevated architectural view<\/option>\n        <option value=\"corner\" data-i18n=\"camera.corner\">Corner perspective<\/option>\n        <option value=\"ground\" data-i18n=\"camera.ground\">Ground level<\/option>\n        <option value=\"aerial\" data-i18n=\"camera.aerial\">Aerial view<\/option>\n    <\/select>\n<\/div>\n\n<div class=\"pc-field\" id=\"pc-time-field\">\n    <label for=\"pc-time-of-day\" data-i18n=\"s5.time\">Time of day<\/label>\n    <select id=\"pc-time-of-day\">\n        <option value=\"day\" selected data-i18n=\"time.day\">Day<\/option>\n        <option value=\"sunset\" data-i18n=\"time.sunset\">Sunset<\/option>\n        <option value=\"night\" data-i18n=\"time.night\">Night<\/option>\n    <\/select>\n<\/div>\n\n\n<!-- ACCESS CODE -->\n\n<div class=\"pc-access-intro\">\n    <div class=\"pc-access-title\" data-i18n=\"s6.title\">6 \u00b7 Your private concept access<\/div>\n    <div class=\"pc-access-copy\" data-i18n=\"s6.copy\">Enter the access code provided by Padelcreations to unlock your personal visualization.<\/div>\n<\/div>\n\n<div class=\"pc-access-row\">\n    <input\n        type=\"text\"\n        id=\"pc-access-code\"\n        class=\"pc-access-code\"\n        placeholder=\"Access code\"\n        data-i18n-placeholder=\"access.placeholder\"\n        autocomplete=\"off\"\n        autocapitalize=\"off\"\n        spellcheck=\"false\"\n        inputmode=\"text\"\n    >\n    <button id=\"pc-validate-access\" type=\"button\" class=\"pc-validate-access\">Unlock<\/button>\n<\/div>\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\" data-i18n=\"s7.title\">7 \u00b7 Ready to see your idea?<\/div>\n    <div class=\"pc-ready-copy\" data-i18n=\"s7.copy\">Everything is set. Now discover what your project could become.<\/div>\n<\/div>\n\n<button id=\"pc-generate\" type=\"button\" disabled>\n    <span class=\"pc-button-text\">Bring My Vision to Life<\/span>\n    <span class=\"pc-spinner\"><\/span>\n<\/button>\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                <!-- PLACEHOLDER -->\n                <div id=\"pc-placeholder\">\n                    <div class=\"pc-placeholder-icon\">\n                        <img title=\"3D Padel Space Designer - Padelcreations | Padel Court Construction &amp; Installation Worldwide\" decoding=\"async\"\n                            id=\"pc-placeholder-icon\"\n                            src=\"https:\/\/www.padelcreations.com\/wp-content\/uploads\/Others\/icondark.png\"\n                            alt=\"Padelcreations 3D Space Designer\"\n                        >\n                    <\/div>\n                    <div class=\"pc-result-eyebrow\" data-i18n=\"placeholder.eyebrow\">YOUR PLACE \u00b7 YOUR VISION \u00b7 OUR COURTS<\/div>\n                    <h3 data-i18n=\"placeholder.title\">Imagine what's possible.<\/h3>\n                    <p data-i18n=\"placeholder.copy\">\n                        Shape your idea on the left. We'll turn it into a personal Padel vision you can see, share and develop.\n                    <\/p>\n                <\/div>\n\n                <!-- PROGRESS -->\n                <div id=\"pc-generation-status\" style=\"display:none;\">\n                    <div class=\"pc-status-logo\" id=\"pc-status-logo\"><\/div>\n                    <h3 data-i18n=\"progress.title\">Bringing your vision to life<\/h3>\n                    <p id=\"pc-progress-text\">Preparing your project...<\/p>\n                    <div class=\"pc-progress-track\">\n                        <div id=\"pc-progress-bar\"><\/div>\n                    <\/div>\n                    <div id=\"pc-progress-time\">Estimated ~60 sec<\/div>\n                <\/div>\n\n                <!-- GENERATED IMAGE -->\n                <div id=\"pc-result\" style=\"display:none;\">\n                    <img decoding=\"async\" id=\"pc-result-image\" src=\"\" alt=\"PADELCREATIONS AI generated padel environment\" data-i18n-alt=\"result.alt\">\n                <\/div>\n\n            <\/div>\n\n            <!-- GENERATION LIMIT INFO -->\n            <div id=\"pc-generation-limit-note\" class=\"pc-generation-limit-note\">\n                <span data-i18n=\"limit.note\">You can generate up to 3 AI concepts within 24 hours.<\/span>\n                <span id=\"pc-runs-remaining\"><\/span>\n            <\/div>\n\n            <!-- AI DISCLOSURE (link URL comes from the dictionary: url.privacy) -->\n            <div class=\"pc-ai-disclosure\" data-i18n-html=\"disclosure\">\n                <strong>AI-powered visualization.<\/strong>\n                Project information and uploaded images are processed using AI\n                to create your visualization.\n                <a href=\"https:\/\/www.padelcreations.com\/privacy-policy\/\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy<\/a>\n            <\/div>\n\n            <div id=\"pc-ai-disclaimer\" class=\"pc-ai-disclaimer\" data-i18n=\"disclaimer\">\n                AI-generated concept for inspiration only. Court count,\n                sizes, positions and materials shown may not exactly\n                match the requested concept or the final built result.\n                This is not a technical drawing and must not be used for\n                construction, permitting or contractual purposes \u2014\n                please confirm your final design with PADELCREATIONS.\n            <\/div>\n\n            <div id=\"pc-result-story\" class=\"pc-result-story\" style=\"display:none;\">\n                <div class=\"pc-result-story-kicker\" data-i18n=\"story.kicker\">THIS COULD BE YOURS.<\/div>\n                <div class=\"pc-result-story-title\" data-i18n=\"story.title\">Your idea. Your environment. Your Padel project.<\/div>\n                <div class=\"pc-result-story-copy\" data-i18n=\"story.copy\">A first glimpse of what your project could become with Padelcreations.<\/div>\n            <\/div>\n\n            <!-- RESULT ACTIONS -->\n            <div class=\"pc-result-actions\" id=\"pc-result-actions\" style=\"display:none;\">\n\n                <button type=\"button\" id=\"pc-regenerate\" class=\"pc-secondary\" data-i18n=\"result.regenerate\">\n                    Create another view\n                <\/button>\n\n                <a id=\"pc-download\" class=\"pc-download\" href=\"#\" download=\"padelcreations-concept.png\" aria-label=\"Save my concept\" data-i18n-aria=\"result.save\">\n                    <span class=\"pc-download-icon\" aria-hidden=\"true\">\n                        <svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M12 3v11m0 0 4-4m-4 4-4-4M5 15v4h14v-4\"\/><\/svg>\n                    <\/span>\n                    <span class=\"pc-download-divider\" aria-hidden=\"true\"><\/span>\n                    <span class=\"pc-download-label\" data-i18n=\"result.save\">Save my concept<\/span>\n                    <span class=\"pc-download-arrow\" aria-hidden=\"true\">\n                        <svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M5 12h13m-5-5 5 5-5 5\"\/><\/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        <div class=\"pc-gallery-eyebrow\" data-i18n=\"gallery.eyebrow\">PADELCREATIONS INSPIRATION<\/div>\n        <h3>Explore more Padel visions<\/h3>\n        <p data-i18n=\"gallery.copy\">\n            Discover concepts created with PADELCREATIONS courts.\n            Explore ideas for your own future Padel project.\n        <\/p>\n    <\/div>\n\n    <!-- LOCKED GALLERY CTA -->\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\">\ud83d\udd12<\/div>\n\n            <div class=\"pc-gallery-lock-content\">\n                <div class=\"pc-gallery-lock-title\" data-i18n=\"lock.title\">Working on a Padel project?<\/div>\n                <div class=\"pc-gallery-lock-copy\" data-i18n=\"lock.copy\">\n                    Send us your project details to explore our full\n                    collection of Padel club concepts and inspiration.\n                <\/div>\n            <\/div>\n\n            <a class=\"pc-gallery-lock-button\" href=\"https:\/\/www.padelcreations.com\/contact\/\" data-i18n-href=\"url.contact\" target=\"_blank\" rel=\"noopener\" data-i18n=\"lock.button\">\n                Send project details \u2192\n            <\/a>\n\n            <div class=\"pc-gallery-access-divider\"><\/div>\n\n            <div class=\"pc-gallery-access-inline\">\n                <input\n                    type=\"text\"\n                    id=\"pc-gallery-access-code\"\n                    class=\"pc-gallery-access-code\"\n                    placeholder=\"Enter your access code\"\n                    data-i18n-placeholder=\"lock.placeholder\"\n                    autocomplete=\"off\"\n                    autocapitalize=\"off\"\n                    spellcheck=\"false\"\n                    inputmode=\"text\"\n                >\n                <button type=\"button\" id=\"pc-gallery-unlock\" class=\"pc-gallery-unlock\" aria-label=\"Unlock gallery\" data-i18n-aria=\"lock.unlockAria\">\u2192<\/button>\n            <\/div>\n\n        <\/div>\n\n        <div id=\"pc-gallery-access-status\" class=\"pc-gallery-access-status\"><\/div>\n\n    <\/div>\n\n    <!-- GALLERY -->\n    <div id=\"pc-gallery-grid\" class=\"pc-gallery-grid\"><\/div>\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\" data-i18n=\"gallery.more\">SHOW MORE INSPIRATION \u2193<\/button>\n        <button id=\"pc-gallery-less\" class=\"pc-gallery-less\" type=\"button\" style=\"display:none;\" data-i18n=\"gallery.less\">SHOW LESS \u2191<\/button>\n    <\/div>\n\n    <div id=\"pc-gallery-empty\" class=\"pc-gallery-empty\">Loading inspiration...<\/div>\n\n<\/div>\n\n\n<!-- LIGHTBOX -->\n\n<div id=\"pc-gallery-lightbox\" class=\"pc-gallery-lightbox\">\n    <div class=\"pc-gallery-lightbox-inner\">\n        <button type=\"button\" id=\"pc-gallery-close\" class=\"pc-gallery-close\" aria-label=\"Close\" data-i18n-aria=\"lightbox.close\">\u00d7<\/button>\n        <button type=\"button\" id=\"pc-gallery-prev\" class=\"pc-gallery-nav pc-gallery-prev\" aria-label=\"Previous inspiration\" data-i18n-aria=\"lightbox.prev\">\u2039<\/button>\n        <button type=\"button\" id=\"pc-gallery-next\" class=\"pc-gallery-nav pc-gallery-next\" aria-label=\"Next inspiration\" data-i18n-aria=\"lightbox.next\">\u203a<\/button>\n        <img decoding=\"async\" id=\"pc-gallery-lightbox-image\" src=\"\" alt=\"PADELCREATIONS inspiration concept\" data-i18n-alt=\"lightbox.alt\">\n        <button id=\"pc-gallery-download\" class=\"pc-gallery-download\" type=\"button\">\u2193&nbsp;&nbsp; Download inspiration<\/button>\n    <\/div>\n<\/div>\n\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n\n<style>\n\n\n.pc-reference-panel { margin-top: 14px; }\n\n.pc-layout-upload { padding: 12px; border: 1px dashed var(--pc-border); border-radius: 8px; background: #f8fafb; }\n.pc-layout-file-row { display: flex; align-items: center; gap: 10px; }\n.pc-layout-file-row input { flex: 1; min-width: 0; }\n\n.pc-delete-file {\n    flex: 0 0 auto; min-height: 42px; padding: 0 14px;\n    border: 1px solid #d7dee5; border-radius: 7px; background: #ffffff;\n    color: #c0392b; font-size: 12px; font-weight: 700; cursor: pointer;\n}\n\n.pc-layout-upload-status { margin-top: 7px; color: #82909c; font-size: 11px; line-height: 1.45; }\n.pc-layout-upload-status.loaded { color: var(--pc-green); font-weight: 600; }\n.pc-layout-upload-status.error { color: #c0392b; }\n\n.pc-upload-privacy-note { margin-top: 6px; font-size: 10.5px; line-height: 1.45; color: #7f8a94; }\n\n\/* =========================\n   VALIDATION AREA\n========================= *\/\n\n.pc-access-row {\n    display: grid;\n    grid-template-columns: 1fr auto;   \/* auto: German \"Freischalten\" is longer *\/\n    gap: 10px; align-items: stretch; width: 100%; margin-bottom: 10px;\n}\n\n.pc-access-code {\n    width: 100%; min-width: 0; height: 58px; box-sizing: border-box;\n    border: 1px solid #d7dee5; border-radius: 8px; padding: 0 14px;\n    font-size: 16px; background: #ffffff; outline: none;\n}\n\n.pc-validate-access {\n    min-width: 110px; height: 58px; box-sizing: border-box; padding: 0 14px;\n    border: 1px solid #0c2d50; border-radius: 8px; background: #ffffff;\n    color: #0c2d50; font-weight: 700; cursor: pointer; white-space: nowrap;\n}\n.pc-validate-access:hover { background: #0c2d50; color: #ffffff; }\n\n.pc-access-status { min-height: 18px; margin: -2px 0 8px; font-size: 12px; line-height: 1.4; }\n.pc-access-status.valid { color: #66b447; }\n.pc-access-status.invalid { color: #c0392b; }\n\n.pc-generation-limit-note {\n    margin-top: 12px; padding: 10px 14px; background: #f1f3f5; border-radius: 7px;\n    color: #687684; font-size: 12px; line-height: 1.5;\n}\n#pc-runs-remaining { font-weight: 700; color: var(--pc-navy); }\n\n\/* =========================\n   AI CONCEPT DISCLAIMER\n========================= *\/\n\n.pc-ai-disclaimer { margin-top: 8px; padding: 10px 0; color: #9aa5ad; font-size: 10.5px; line-height: 1.55; font-style: italic; }\n\n@media (max-width: 600px) {\n    .pc-validate-access { min-width: 100px; }\n}\n\n@media (max-width: 500px) {\n    #pc-generation-status { inset: 8px; padding: 4px 8px; box-sizing: border-box; }\n    .pc-status-logo { width: 52px; height: 52px; flex: 0 0 52px; margin: 0 auto 10px; background: transparent !important; border-radius: 0; }\n    .pc-status-logo img { width: 100%; height: 100%; object-fit: contain; display: block; }\n    #pc-generation-status h3 { margin: 0 0 6px; font-size: 17px; line-height: 1.2; }\n    #pc-generation-status p { margin: 0 0 10px; font-size: 11px; line-height: 1.3; }\n    .pc-progress-track { width: 90%; height: 7px; }\n    #pc-progress-time { margin-top: 6px; font-size: 10px; }\n}\n\n\/* =========================\n   MAIN WIDTH\n========================= *\/\n\n#pc-ai-designer {\n    --pc-navy: #092546;\n    --pc-green: #66b447;\n    --pc-light: #f4f7f9;\n    --pc-border: #dce3e8;\n    --pc-text: #253445;\n\n    width: 100%; max-width: 1280px; margin: 0 auto;\n    font-family: Arial, Helvetica, sans-serif;\n    color: var(--pc-text);\n    box-sizing: border-box;\n}\n\n\/* =========================\n   HEADER\n========================= *\/\n\n.pc-header { width: 100%; margin-bottom: 28px; }\n.pc-eyebrow { margin-bottom: 8px; color: var(--pc-green); font-size: 12px; font-weight: 700; letter-spacing: 2px; }\n.pc-header h2 { margin: 0 0 8px; color: var(--pc-navy); font-size: 36px; line-height: 1.15; }\n.pc-header p { margin: 0; color: #687684; font-size: 16px; }\n\n\/* =========================\n   GRID\n========================= *\/\n\n.pc-grid { width: 100%; display: grid; grid-template-columns: 390px minmax(0, 1fr); gap: 28px; align-items: start; }\n\n\/* =========================\n   LEFT PANEL\n========================= *\/\n\n.pc-panel { width: 100%; box-sizing: border-box; padding: 26px; background: #ffffff; border: 1px solid var(--pc-border); border-radius: 16px; }\n\n\/* =========================\n   FIELDS\n========================= *\/\n\n.pc-field { margin-bottom: 22px; }\n.pc-field label { display: block; margin-bottom: 9px; color: var(--pc-navy); font-size: 13px; font-weight: 700; }\n\n\/* =========================\n   PROJECT VISION SECTION\n========================= *\/\n\n.pc-vision-section { margin: 26px 0 24px; padding: 17px; background: #f6fbf3; border: 1px solid #d7ecc9; border-radius: 12px; }\n.pc-vision-heading { display: flex; flex-direction: column; gap: 3px; margin-bottom: 15px; }\n.pc-vision-heading-title { font-size: 12.5px; font-weight: 700; color: var(--pc-navy); }\n.pc-vision-heading-sub { font-size: 10.5px; line-height: 1.4; color: #5c7a49; }\n\n.pc-field-last { margin-bottom: 0; }\n\n.pc-field select,\n.pc-field textarea {\n    width: 100%; box-sizing: border-box; padding: 12px 13px;\n    border: 1px solid var(--pc-border); border-radius: 8px;\n    background: #ffffff; color: var(--pc-text); font-size: 14px; outline: none;\n    transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n.pc-field select:focus,\n.pc-field textarea:focus { border-color: var(--pc-green); box-shadow: 0 0 0 3px rgba(102,180,71,0.12); }\n.pc-field select:disabled { background: #f1f3f5; border-color: var(--pc-border); color: #9aa5ad; cursor: not-allowed; }\n\n.pc-disabled-hint { margin-top: 7px; color: #82909c; font-size: 11px; line-height: 1.45; font-style: italic; }\n\n.pc-field textarea { min-height: 135px; resize: vertical; }\n\n.pc-prompt-hint { margin-top: 7px; color: #82909c; font-size: 11px; line-height: 1.45; }\n\n.pc-example-heading { margin-bottom: 11px; color: #5c7a49; font-size: 11px; line-height: 1.45; }\n\n.pc-example-audience-toggle { display: flex; gap: 8px; margin-bottom: 10px; }\n\n.pc-audience-button {\n    padding: 7px 14px; border: 1px solid #d7ecc9; border-radius: 20px; background: #fff;\n    color: var(--pc-navy); font-size: 12px; font-weight: 700; cursor: pointer;\n}\n.pc-audience-button.active { background: var(--pc-green); border-color: var(--pc-green); color: #fff; }\n\n.pc-example-buttons { display: flex; flex-wrap: wrap; gap: 8px; }\n\n.pc-example-prompt-button {\n    padding: 9px 13px; border: 1px solid #d7dee5; border-radius: 7px; background: #fff;\n    color: var(--pc-navy); font-size: 12px; font-weight: 700; cursor: pointer; text-align: left; transition: 0.15s ease;\n}\n.pc-example-prompt-button:hover,\n.pc-example-prompt-button.pc-example-selected { border-color: var(--pc-green); background: #eef8e9; color: #4f9635; }\n\n.pc-numbered-title { margin-top: 4px; margin-bottom: 14px; color: var(--pc-navy); font-size: 13px; font-weight: 700; }\n\n.pc-description-section { margin: 26px 0 24px; padding: 17px; background: #f6fbf3; border: 1px solid #d7ecc9; border-radius: 12px; }\n.pc-description-section .pc-numbered-title { margin-top: 0; }\n\n\/* =====================================================\n   VISION TOOLS\n===================================================== *\/\n\n.pc-vision-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; }\n\n.pc-vision-tool-button {\n    display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n    min-height: 36px; padding: 0 12px;\n    border: 1px solid #d7dee5; border-radius: 7px; background: #ffffff; color: #092546;\n    font-size: 11px; font-weight: 700; cursor: pointer;\n    transition: border-color .18s ease, background .18s ease, color .18s ease;\n}\n.pc-vision-tool-button:hover { border-color: #66b447; background: #f6fbf3; color: #4f9635; }\n.pc-vision-tool-button:disabled { opacity: .65; cursor: wait; }\n\n.pc-undo-enhance { color: #687684; border-color: #e1e6ea; }\n.pc-undo-enhance:hover { color: #092546; border-color: #cbd4da; background: #f7f9fa; }\n\n.pc-preset-toggle { margin-left: auto; }\n.pc-preset-arrow { display: inline-block; font-size: 18px; line-height: 1; transition: transform .2s ease; }\n.pc-preset-toggle.is-open .pc-preset-arrow { transform: rotate(90deg); }\n\n\/* =====================================================\n   PRESET PANEL\n===================================================== *\/\n\n.pc-preset-panel { margin-top: 10px; padding: 12px; border: 1px solid #d7ecc9; border-radius: 9px; background: #f8fbf6; }\n.pc-preset-panel .pc-example-heading { margin-bottom: 10px; color: #687684; font-size: 10.5px; line-height: 1.45; }\n.pc-preset-panel .pc-example-buttons { display: flex; flex-direction: column; gap: 7px; }\n.pc-preset-panel .pc-example-prompt-button { width: 100%; padding: 9px 11px; text-align: left; }\n\n.pc-background-step { margin-top: 14px; padding-top: 13px; border-top: 1px solid #d7ecc9; }\n.pc-background-heading { margin-bottom: 10px; color: #687684; font-size: 10.5px; line-height: 1.45; }\n\n.pc-background-group + .pc-background-group { margin-top: 11px; }\n\n.pc-background-group-title {\n    display: flex; align-items: center; gap: 6px; margin-bottom: 6px;\n    color: #4f9635; font-size: 10px; font-weight: 700; letter-spacing: .02em; text-transform: uppercase;\n}\n\n.pc-background-info { position: relative; display: inline-flex; align-items: center; text-transform: none; }\n\n.pc-background-info-button {\n    display: inline-flex; align-items: center; justify-content: center;\n    width: 16px; height: 16px; padding: 0;\n    border: 1px solid #9aa8b3; border-radius: 50%; background: transparent; color: #7a8995;\n    font-family: Arial, sans-serif; font-size: 10px; font-weight: 700; line-height: 1; cursor: help;\n}\n.pc-background-info-button:hover,\n.pc-background-info-button:focus-visible { border-color: var(--pc-green); color: var(--pc-green); outline: none; }\n\n.pc-background-info-tooltip {\n    position: absolute; z-index: 20; left: 50%; bottom: calc(100% + 8px);\n    width: 230px; padding: 9px 10px; border-radius: 7px; background: #26343d; color: #fff;\n    font-size: 10.5px; font-weight: 400; line-height: 1.45; letter-spacing: 0; text-align: left; text-transform: none;\n    box-shadow: 0 5px 16px rgba(24, 38, 48, .18);\n    opacity: 0; visibility: hidden; pointer-events: none; transform: translate(-50%, 4px);\n    transition: opacity .15s ease, transform .15s ease, visibility .15s ease;\n}\n.pc-background-info-tooltip::after {\n    content: \"\"; position: absolute; top: 100%; left: 50%;\n    border: 5px solid transparent; border-top-color: #26343d; transform: translateX(-50%);\n}\n.pc-background-info:hover .pc-background-info-tooltip,\n.pc-background-info:focus-within .pc-background-info-tooltip { opacity: 1; visibility: visible; transform: translate(-50%, 0); }\n\n.pc-background-group-buttons { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; }\n.pc-background-group-siteSetting .pc-background-prompt-button:nth-child(3) { grid-column: 1 \/ -1; }\n\n.pc-background-prompt-button {\n    min-width: 0; padding: 9px 8px; border: 1px solid #d7dee5; border-radius: 7px; background: #fff;\n    color: #56636f; font-size: 10.5px; line-height: 1.3; text-align: center;\n    white-space: normal; overflow-wrap: anywhere; cursor: pointer; transition: .15s ease;\n}\n.pc-background-prompt-button:hover,\n.pc-background-prompt-button.pc-background-selected { border-color: var(--pc-green); background: #eef8e9; color: #4f9635; }\n\n.pc-apply-preset {\n    width: 100%; margin-top: 12px; padding: 10px 14px; border: 0; border-radius: 7px;\n    background: var(--pc-green); color: #fff; font-size: 11px; font-weight: 700; cursor: pointer;\n}\n.pc-apply-preset:disabled { background: #cbd3d8; cursor: not-allowed; }\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   APPLICATION \/ REFERENCE HELP\n========================= *\/\n\n#pc-application-help,\n#pc-reference-mode-help {\n    margin-top: 9px; padding: 10px 11px; border-radius: 7px;\n    background: #f4f7f9; color: #687684; font-size: 11px; line-height: 1.45;\n}\n\n\/* =========================\n   ENVIRONMENT TOGGLE\n========================= *\/\n\n.pc-toggle { display: grid; grid-template-columns: 1fr 1fr; padding: 4px; border-radius: 9px; background: #edf1f4; }\n.pc-toggle button {\n    padding: 11px; border: 0; border-radius: 7px; background: transparent;\n    color: var(--pc-navy); cursor: pointer; font-weight: 700; transition: 0.2s ease;\n}\n.pc-toggle button.active { background: #ffffff; color: var(--pc-green); box-shadow: 0 2px 8px rgba(0,0,0,0.08); }\n\n.pc-ready-intro { margin: 22px 0 12px; text-align: center; }\n.pc-ready-title { color: var(--pc-navy); font-size: 13px; font-weight: 700; }\n.pc-ready-copy { margin-top: 4px; color: #687684; font-size: 11px; line-height: 1.45; }\n\n\/* =========================\n   GENERATE BUTTON\n========================= *\/\n\n#pc-generate {\n    width: 100%; padding: 15px 18px; border: none; border-radius: 8px;\n    background: #d7dee5; \/* default = locked *\/\n    color: #ffffff; cursor: not-allowed; font-size: 15px; font-weight: 700;\n    transition: background 0.2s ease, transform 0.2s ease, filter 0.2s ease;\n}\n#pc-generate.pc-access-active { background: var(--pc-green); cursor: pointer; }\n#pc-generate.pc-access-active:hover { transform: translateY(-1px); filter: brightness(0.96); }\n#pc-generate:disabled { background: #d7dee5; color: #ffffff; cursor: not-allowed; opacity: 1; transform: none; filter: none; }\n\n\/* =========================\n   SPINNER\n========================= *\/\n\n.pc-spinner {\n    display: none; width: 16px; height: 16px; margin-left: 8px;\n    border: 2px solid rgba(255,255,255,0.4); border-top-color: #ffffff; border-radius: 50%;\n    vertical-align: middle; animation: pcSpin 0.8s linear infinite;\n}\n#pc-generate.loading .pc-spinner { display: inline-block; }\n@keyframes pcSpin { to { transform: rotate(360deg); } }\n\n\/* =========================\n   RESULT COLUMN\n========================= *\/\n\n.pc-result-column { width: 100%; min-width: 0; }\n\n\/* =========================\n   FIXED 3:2 CANVAS\n========================= *\/\n\n.pc-result-panel {\n    position: relative; width: 100%; aspect-ratio: 3 \/ 2; overflow: hidden; box-sizing: border-box;\n    display: flex; align-items: center; justify-content: center; padding: 20px;\n    background: linear-gradient(135deg, #f5f8fa, #e9eef2);\n    border: 1px solid var(--pc-border); border-radius: 16px;\n}\n\n\/* =========================\n   PLACEHOLDER\n========================= *\/\n\n#pc-placeholder {\n    position: absolute; inset: 20px;\n    display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center;\n}\n\n.pc-placeholder-icon {\n    width: 94px; height: 94px; display: flex; align-items: center; justify-content: center;\n    margin: 0 auto 28px; background: transparent;\n}\n.pc-placeholder-icon img { width: 100%; height: 100%; object-fit: contain; display: block; }\n\n.pc-placeholder-icon,\n.pc-status-logo {\n    width: 94px; height: 94px; flex: 0 0 94px; margin: 0 auto 20px;\n    display: flex; align-items: center; justify-content: center; background: transparent; border-radius: 0;\n}\n.pc-status-logo img { width: 100%; height: 100%; object-fit: contain; display: block; background: transparent; }\n\n#pc-placeholder h3,\n#pc-generation-status h3 { margin: 0 0 10px; color: var(--pc-navy); font-size: 22px; }\n\n#pc-placeholder p { margin: 0; max-width: 460px; color: #75818b; line-height: 1.6; }\n\n\/* =========================\n   GENERATION STATUS\n========================= *\/\n\n#pc-generation-status {\n    position: absolute; inset: 20px; width: auto;\n    display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center;\n}\n#pc-generation-status p { margin: 0 0 18px; color: #687684; font-size: 13px; }\n\n.pc-progress-track { width: min(520px, 75%); height: 9px; overflow: hidden; border-radius: 30px; background: #dfe6ea; }\n#pc-progress-bar { width: 0%; height: 100%; border-radius: 30px; background: var(--pc-green); transition: width 1s linear; }\n#pc-progress-time { margin-top: 9px; color: #82909c; font-size: 11px; }\n\n\/* =========================\n   GENERATED IMAGE\n========================= *\/\n\n#pc-result { position: absolute; inset: 20px; overflow: hidden; border-radius: 10px; }\n#pc-result-image { display: block; width: 100%; height: 100%; object-fit: contain; object-position: center; border-radius: 10px; }\n\n\/* =========================\n   RESULT ACTIONS\n========================= *\/\n\n.pc-result-actions { min-height: 46px; display: flex; align-items: center; justify-content: flex-end; gap: 10px; margin-top: 14px; }\n\n.pc-result-actions button,\n.pc-download { padding: 11px 16px; border-radius: 7px; font-size: 13px; font-weight: 700; cursor: pointer; text-decoration: none; }\n\n.pc-secondary { background: #ffffff; color: var(--pc-navy); border: 1px solid var(--pc-border); }\n\n.pc-download {\n    position: relative; display: inline-flex; align-items: center; gap: 11px;\n    min-height: 48px; padding: 7px 8px 7px 14px; overflow: hidden;\n    border: 1px solid rgba(255,255,255,0.20); 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.pc-download::before {\n    content: \"\"; position: absolute; inset: 0; pointer-events: none;\n    background: linear-gradient(115deg, rgba(255,255,255,0.18), transparent 38%);\n}\n.pc-download:hover { transform: translateY(-2px); filter: saturate(1.05); box-shadow: 0 12px 26px rgba(82,181,61,0.32), inset 0 1px 0 rgba(255,255,255,0.32); }\n.pc-download:active { transform: translateY(0); box-shadow: 0 5px 14px rgba(82,181,61,0.22), inset 0 1px 0 rgba(255,255,255,0.22); }\n\n.pc-download-icon,\n.pc-download-arrow { position: relative; z-index: 1; display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; }\n\n.pc-download-icon svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }\n\n.pc-download-divider { position: relative; z-index: 1; width: 1px; height: 24px; background: rgba(255,255,255,0.30); }\n.pc-download-label { position: relative; z-index: 1; white-space: nowrap; }\n\n.pc-download-arrow { width: 34px; height: 34px; margin-left: 2px; border-radius: 50%; background: rgba(18,117,46,0.24); transition: transform .18s ease, background .18s ease; }\n.pc-download-arrow svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\n.pc-download:hover .pc-download-arrow { transform: translateX(2px); background: rgba(18,117,46,0.34); }\n\n\/* =========================\n   ERROR\n========================= *\/\n\n#pc-error { display: none; margin-top: 14px; padding: 12px; border-radius: 7px; background: #fff0f0; color: #a22; font-size: 13px; line-height: 1.5; }\n\n\/* =========================\n   TABLET\n========================= *\/\n\n@media (max-width: 1100px) {\n    #pc-ai-designer { padding-left: 20px; padding-right: 20px; }\n    .pc-grid { grid-template-columns: 340px minmax(0,1fr); gap: 20px; }\n}\n\n\/* =========================\n   MOBILE\n========================= *\/\n\n@media (max-width: 850px) {\n    .pc-grid { grid-template-columns: 1fr; }\n    .pc-result-column { width: 100%; }\n}\n\n@media (max-width: 500px) {\n    .pc-header h2 { font-size: 28px; }\n    .pc-panel { padding: 18px; }\n    .pc-result-panel { padding: 12px; }\n    #pc-placeholder,\n    #pc-generation-status,\n    #pc-result { inset: 12px; }\n}\n\n\/* =========================\n   PADEL VISION EXPERIENCE\n========================= *\/\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 { margin-top: 8px; margin-bottom: 6px; font-size: 11px; line-height: 1.45; color: #7f8a94; }\n.pc-ai-disclosure strong { font-weight: 600; color: #687684; }\n.pc-ai-disclosure a { color: #687684; text-decoration: underline; text-underline-offset: 2px; }\n.pc-ai-disclosure a:hover { color: #092546; }\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   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 { color: #ffffff !important; text-decoration: none !important; }\n\n#pc-download .pc-download-label { color: #ffffff !important; background: transparent !important; font-weight: 700; text-shadow: 0 1px 2px rgba(0,70,30,.12); }\n#pc-download .pc-download-icon,\n#pc-download .pc-download-arrow { color: #ffffff !important; }\n#pc-download svg { stroke: #ffffff !important; }\n#pc-download .pc-download-divider { background: rgba(255,255,255,.38) !important; }\n#pc-download .pc-download-arrow { background: rgba(0,90,40,.22) !important; }\n\n\/* =====================================================\n   INSPIRATION GALLERY\n===================================================== *\/\n\n.pc-inspiration-gallery { margin-top: 42px; padding-top: 26px; border-top: 1px solid #dce5eb; }\n.pc-gallery-heading { margin-bottom: 18px; }\n.pc-gallery-eyebrow { margin-bottom: 5px; color: #55b73e; font-size: 10px; font-weight: 700; letter-spacing: 1.5px; }\n.pc-gallery-heading h3 { margin: 0 0 5px; color: #092546; font-size: 20px; line-height: 1.25; }\n.pc-gallery-heading p { max-width: 620px; margin: 0; color: #71808d; font-size: 11px; line-height: 1.5; }\n\n.pc-gallery-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }\n\n.pc-gallery-card { position: relative; overflow: hidden; aspect-ratio: 3 \/ 2; border-radius: 9px; background: #eef2f4; cursor: pointer; }\n.pc-gallery-card img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform .25s ease; }\n.pc-gallery-card:hover img { transform: scale(1.025); }\n\n.pc-gallery-card.pc-gallery-locked { cursor: default; }\n.pc-gallery-card.pc-gallery-locked img { filter: blur(0.8px); transform: scale(1.02); }\n\n.pc-gallery-info {\n    position: absolute; right: 11px; bottom: 11px; z-index: 3;\n    width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; box-sizing: border-box;\n    border: 1.2px solid rgba(220, 225, 230, .9); border-radius: 50%; background: transparent;\n    color: rgba(220, 225, 230, .9);\n    font-family: Georgia, serif; font-size: 14px; font-weight: 700; font-style: italic; line-height: 1;\n    cursor: help; text-shadow: 0 1px 3px rgba(0,0,0,.45);\n    transition: color .18s ease, border-color .18s ease, transform .18s ease;\n}\n.pc-gallery-info:hover { color: #ffffff; border-color: #ffffff; background: transparent; transform: scale(1.05); }\n\n.pc-gallery-info-tooltip {\n    position: absolute; right: -4px; bottom: 30px; padding: 6px 9px; border-radius: 7px;\n    background: rgba(20,24,30,.92); color: #ffffff;\n    font-family: Arial, sans-serif; font-size: 9px; font-weight: 700; font-style: normal; white-space: nowrap;\n    opacity: 0; visibility: hidden; transform: translateY(4px); pointer-events: none;\n    transition: opacity .16s ease, visibility .16s ease, transform .16s ease;\n}\n.pc-gallery-info-tooltip::after {\n    content: \"\"; position: absolute; right: 12px; bottom: -5px; width: 10px; height: 10px;\n    background: rgba(20,24,30,.92); transform: rotate(45deg);\n}\n.pc-gallery-info:hover .pc-gallery-info-tooltip { opacity: 1; visibility: visible; transform: translateY(0); }\n\n.pc-gallery-view {\n    position: absolute; right: 11px; bottom: 11px; width: 30px; height: 30px;\n    display: flex; align-items: center; justify-content: center; padding: 0;\n    border: 0; border-radius: 50%; background: #092546; color: #ffffff; cursor: pointer;\n    transition: background .18s ease, transform .18s ease;\n}\n.pc-gallery-view:hover { background: #123b66; transform: scale(1.06); }\n.pc-gallery-view svg { width: 15px; height: 15px; display: block; stroke: currentColor; }\n\n.pc-gallery-empty { padding: 22px 0; color: #83909a; font-size: 11px; }\n\n.pc-gallery-more-wrap { width: 100%; display: flex; justify-content: center; gap: 10px; margin-top: 18px; }\n.pc-gallery-more,\n.pc-gallery-less {\n    padding: 9px 18px; border: 1px solid #092546; border-radius: 6px; background: #ffffff; color: #092546;\n    font-size: 10px; font-weight: 700; letter-spacing: .8px; cursor: pointer;\n    transition: background .18s ease, color .18s ease, transform .18s ease;\n}\n.pc-gallery-more:hover,\n.pc-gallery-less:hover { background: #092546; color: #ffffff; transform: translateY(-1px); }\n\n.pc-gallery-lock-message { margin: 0 0 18px; padding: 15px 16px; border: 1px solid #d7ecc9; border-radius: 11px; background: linear-gradient(135deg, #f6fbf3, #ffffff); }\n.pc-gallery-lock-top { display: flex; align-items: center; gap: 14px; }\n.pc-gallery-lock-icon { flex: 0 0 auto; font-size: 20px; }\n.pc-gallery-lock-content { flex: 1; min-width: 0; }\n.pc-gallery-lock-title { margin-bottom: 3px; color: #092546; font-size: 12px; font-weight: 700; }\n.pc-gallery-lock-copy { color: #687684; font-size: 10.5px; line-height: 1.45; }\n\n.pc-gallery-lock-button {\n    flex: 0 0 auto; padding: 9px 13px; border-radius: 7px; background: #55b73e;\n    color: #ffffff !important; font-size: 10px; font-weight: 700; text-decoration: none !important; white-space: nowrap;\n    transition: transform .18s ease, background .18s ease;\n}\n.pc-gallery-lock-button:hover { background: #45a532; transform: translateY(-1px); }\n\n.pc-gallery-access-divider { width: 1px; height: 34px; flex: 0 0 auto; margin: 0 2px; background: #dde5df; }\n.pc-gallery-access-inline { display: flex; align-items: center; gap: 7px; flex: 0 0 auto; }\n\n.pc-gallery-access-code {\n    width: 190px; height: 40px; box-sizing: border-box; padding: 0 12px;\n    border: 1px solid #cfd8de; border-radius: 7px; background: #ffffff; color: #092546; font-size: 11px; outline: none;\n    transition: border-color .18s ease, box-shadow .18s ease;\n}\n.pc-gallery-access-code:focus { border-color: #55b73e; box-shadow: 0 0 0 3px rgba(85,183,62,.10); }\n\n.pc-gallery-unlock {\n    width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; padding: 0;\n    border: 0; border-radius: 7px; background: #092546; color: #ffffff; font-size: 19px; line-height: 1; cursor: pointer;\n    transition: background .18s ease, transform .18s ease;\n}\n.pc-gallery-unlock:hover { background: #123b66; transform: translateX(1px); }\n.pc-gallery-unlock:disabled { opacity: .65; cursor: default; transform: none; }\n\n.pc-gallery-access-status { min-height: 14px; margin-top: 7px; margin-left: 34px; font-size: 10px; line-height: 1.4; }\n.pc-gallery-access-status.valid { color: #55b73e; }\n.pc-gallery-access-status.invalid { color: #c0392b; }\n\n@media (max-width: 800px) {\n    .pc-gallery-lock-top { flex-wrap: wrap; align-items: flex-start; }\n    .pc-gallery-lock-content { flex: 1 1 calc(100% - 40px); }\n    .pc-gallery-lock-button { margin-left: 34px; }\n    .pc-gallery-access-divider { display: none; }\n    .pc-gallery-access-inline { width: 100%; margin-left: 34px; }\n    .pc-gallery-access-code { flex: 1; width: auto; }\n}\n\n\/* =====================================================\n   GALLERY LIGHTBOX\n===================================================== *\/\n\n.pc-gallery-lightbox {\n    position: fixed; inset: 0; z-index: 999999; display: none; align-items: center; justify-content: center;\n    padding: 40px; background: rgba(4,18,32,.82); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px);\n}\n.pc-gallery-lightbox.is-open { display: flex; }\n\n.pc-gallery-lightbox-inner {\n    position: relative; display: flex; flex-direction: column; align-items: center;\n    width: min(1100px, 82vw); max-height: 86vh; padding: 14px; border-radius: 14px; background: #ffffff;\n    box-shadow: 0 24px 70px rgba(0,0,0,.38);\n}\n\n.pc-gallery-lightbox img { display: block; width: 100%; max-height: calc(86vh - 85px); object-fit: contain; border-radius: 9px; }\n\n.pc-gallery-close {\n    position: absolute; top: -14px; right: -14px; z-index: 3; width: 38px; height: 38px;\n    display: flex; align-items: center; justify-content: center; padding: 0;\n    border: 3px solid #ffffff; border-radius: 50%; background: #092546; color: #ffffff;\n    font-size: 24px; line-height: 1; cursor: pointer; box-shadow: 0 4px 14px rgba(0,0,0,.25);\n}\n\n.pc-gallery-nav {\n    position: absolute; top: 50%; z-index: 4; width: 46px; height: 46px;\n    display: flex; align-items: center; justify-content: center; padding: 0;\n    border: 3px solid #ffffff; border-radius: 50%; background: rgba(9,37,70,.90); color: #ffffff;\n    font-size: 32px; line-height: 1; cursor: pointer; transform: translateY(-50%);\n    box-shadow: 0 4px 14px rgba(0,0,0,.25); transition: background .18s ease, transform .18s ease;\n}\n.pc-gallery-nav:hover { background: #55b73e; }\n.pc-gallery-prev { left: -23px; }\n.pc-gallery-next { right: -23px; }\n\n@media (max-width: 700px) {\n    .pc-gallery-nav { width: 38px; height: 38px; font-size: 27px; border-width: 2px; }\n    .pc-gallery-prev { left: -10px; }\n    .pc-gallery-next { right: -10px; }\n}\n\n.pc-gallery-download {\n    margin-top: 12px; padding: 10px 18px; border: 0; border-radius: 7px;\n    background: #55b73e; color: #ffffff !important; font-size: 11px; font-weight: 700; cursor: pointer;\n}\n\n@media (max-width: 700px) {\n    .pc-gallery-lightbox { padding: 15px; }\n    .pc-gallery-lightbox-inner { width: 94vw; max-height: 90vh; padding: 9px; }\n    .pc-gallery-lightbox img { max-height: calc(90vh - 75px); }\n}\n\n@media (max-width: 900px) {\n    .pc-gallery-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n@media (max-width: 560px) {\n    .pc-gallery-grid { grid-template-columns: 1fr; }\n}\n\n\/* =====================================================\n   PORTRAIT PHONE REFINEMENT\n===================================================== *\/\n\n@media (max-width: 430px) {\n    #pc-ai-designer { padding-left: 10px; padding-right: 10px; }\n    .pc-grid { gap: 14px; }\n    .pc-panel { padding: 15px; border-radius: 12px; }\n    .pc-result-panel { aspect-ratio: 3 \/ 2; padding: 10px; border-radius: 12px; }\n    #pc-placeholder,\n    #pc-generation-status,\n    #pc-result { inset: 10px; }\n    .pc-placeholder-icon,\n    .pc-status-logo { width: 54px; height: 54px; flex: 0 0 54px; margin-bottom: 9px; }\n    .pc-result-eyebrow { margin-bottom: 6px; font-size: 7.5px; letter-spacing: 1px; }\n    #pc-placeholder h3,\n    #pc-generation-status h3 { margin-bottom: 6px; font-size: 17px; line-height: 1.15; }\n    #pc-placeholder p { max-width: 260px; font-size: 10.5px; line-height: 1.35; }\n    .pc-generation-limit-note { margin-top: 8px; padding: 8px 10px; font-size: 10px; line-height: 1.35; }\n    .pc-ai-disclaimer { margin-top: 5px; padding: 7px 9px; font-size: 9px; line-height: 1.4; }\n}\n\n@media (max-width: 850px) {\n    \/* Mobile placeholder needs more vertical room *\/\n    .pc-result-panel:has(#pc-placeholder:not([style*=\"display: none\"])) { aspect-ratio: auto !important; min-height: 420px; overflow: visible; }\n    #pc-placeholder { position: relative !important; inset: auto !important; padding: 28px 18px; box-sizing: border-box; }\n}\n\n@media (max-width: 500px) {\n    .pc-result-panel:has(#pc-placeholder:not([style*=\"display: none\"])) { min-height: 390px; }\n    .pc-placeholder-icon { width: 70px; height: 70px; flex-basis: 70px; margin-bottom: 16px; }\n    #pc-placeholder h3 { font-size: 20px; }\n    #pc-placeholder p { font-size: 14px; line-height: 1.5; }\n}\n\n\/* =========================================\n   MOBILE FILE-UPLOAD WIDTH FIX\n========================================= *\/\n\n.pc-reference-panel,\n.pc-layout-upload,\n.pc-layout-file-row { width: 100%; max-width: 100%; min-width: 0; box-sizing: border-box; }\n\n.pc-layout-file-row input[type=\"file\"] { width: 100%; max-width: 100%; min-width: 0; box-sizing: border-box; overflow: hidden; }\n\n@media (max-width: 500px) {\n    .pc-layout-file-row { display: block; }\n    .pc-layout-file-row input[type=\"file\"] { display: block; width: 100%; max-width: 100%; }\n    .pc-delete-file { width: 100%; margin-top: 8px; }\n    .pc-panel { width: 100%; max-width: 100%; min-width: 0; overflow: hidden; box-sizing: border-box; }\n}\n\n<\/style>\n\n\n<script>\n\n\/* =====================================================\n   PADELCREATIONS \u00b7 I18N CORE (EN + DE)\n\n   window.pcI18n = {\n       lang            current language (\"en\" | \"de\")\n       t(key, vars)    translated string, {placeholders} filled from vars\n       loc(obj)        picks obj[lang] (fallback obj.en) \u2014 for preset data\n       bind(el, fn)    renders el now AND again on every language change\n       onChange(fn)    callback after each language change\n       setLang(lang)\n   }\n===================================================== *\/\n\n(function () {\n\n    const root = document.getElementById('pc-ai-designer');\n\n    if (!root) {\n        return;\n    }\n\n    const SUPPORTED = ['en', 'de'];\n\n\n    const DICT = {\n\n        en: {\n\n            'url.privacy': 'https:\/\/www.padelcreations.com\/privacy-policy\/',\n            'url.contact': 'https:\/\/www.padelcreations.com\/contact\/',\n\n            'header.title': 'Imagine your Padel project.<br><span>Now see it come to life.<\/span>',\n            'header.intro': 'Your project starts with an idea. Tell us what you imagine or show us your location \u2014 and discover what your future Padel project could become.',\n\n            's1.title': '1 \u00b7 What are you dreaming of?',\n            's1.sub': 'Choose the kind of project you want to create and whether it will be indoors or outdoors.',\n            's1.applicationLabel': 'Choose your starting point',\n            's1.envLabel': 'Where will you play?',\n\n            'app.tennis-club': 'Tennis Club',\n            'app.padel-standalone': 'Padel Stand-Alone Club',\n            'app.leisure-sports': 'Leisure & Sports Facilities',\n            'app.private-house': 'Residential & Corporate',\n\n            'apphelp.tennis-club': 'Integrates padel naturally into an existing premium tennis club with tennis courts, clubhouse, landscaping and social areas.',\n            'apphelp.padel-standalone': 'Creates a dedicated premium padel destination centered around the selected PADELCREATIONS courts.',\n            'apphelp.leisure-sports': 'Integrates padel into hotels, resorts, fitness clubs, golf clubs and other premium leisure or sports facilities.',\n            'apphelp.private-house': \"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            'env.outdoor': 'Outdoor',\n            'env.indoor': 'Indoor',\n\n            's2.title': '2 \u00b7 Tell us what you imagine',\n            's2.label': 'Your vision',\n            's2.optional': '(optional)',\n            's2.placeholder': 'Imagine your future Padel project\u2026 A Mediterranean club surrounded by olive trees, a stylish clubhouse, restaurant terrace and warm sunset atmosphere\u2026',\n            's2.hint': 'Describe the atmosphere, architecture, landscaping, facilities or special ideas you would love to see.',\n\n            'btn.enhance': '\u2728 Enhance prompt',\n            'btn.enhancing': '\u2728 Enhancing...',\n            'btn.undo': '\u21b6 Undo',\n            'btn.presets': 'Presets',\n\n            'presets.heading': 'Choose an idea to start from, then personalize it to your project.',\n            'presets.headingDone': 'Great starting point \u2014 now make it completely yours:',\n            'audience.residential': 'Residential',\n            'audience.corporate': 'Corporate',\n            'bg.heading': 'Choose the surroundings',\n            'bg.apply': 'Apply preset',\n            'bg.infoAria': 'About {label}',\n            'confirm.replace': \"This will replace what you've already written. Continue?\",\n\n            's3.label': '3 \u00b7 Make it yours',\n            'ref.none': 'Start from my imagination',\n            'ref.photos': 'Use my real location',\n            'refhelp.none': 'Let the AI create the complete environment from your project configuration and description.',\n            'refhelp.environment-photos': 'Upload up to 5 photos of the existing location. The AI will recreate the environment and integrate the selected courts.',\n\n            'envimg.default': 'Upload one or more photos of your actual site or building. The AI will recreate this environment and add your selected court model and number of courts into it.',\n            'envimg.privacy': 'Please avoid uploading images containing unnecessary personal or sensitive information.',\n            'envimg.delete': 'Delete',\n            'envimg.invalidType': 'Please upload only JPG, PNG or WebP images.',\n            'envimg.loadedOne': '\u2713 1 environment photo loaded.',\n            'envimg.loadedMany': '\u2713 {n} environment photos loaded.',\n            'envimg.trimmed': ' Only the first {max} were used.',\n            'envimg.readError': 'One or more images could not be read. Please try again.',\n\n            's4.title': '4 \u00b7 Shape your Padel project',\n            's4.model': 'Court model',\n            's4.count': 'Number of courts',\n            'court.one': '{n} Court',\n            'court.many': '{n} Courts',\n            's4.layout': 'Court layout',\n            'layout.side-by-side': 'Side by side',\n            'layout.linear': 'Linear',\n\n            's5.title': '5 \u00b7 Presentation options',\n            's5.camera': 'Camera view',\n            'camera.elevated': 'Elevated architectural view',\n            'camera.corner': 'Corner perspective',\n            'camera.ground': 'Ground level',\n            'camera.aerial': 'Aerial view',\n            's5.time': 'Time of day',\n            'time.day': 'Day',\n            'time.sunset': 'Sunset',\n            'time.night': 'Night',\n\n            's6.title': '6 \u00b7 Your private concept access',\n            's6.copy': 'Enter the access code provided by Padelcreations to unlock your personal visualization.',\n            'access.placeholder': 'Access code',\n            'access.unlock': 'Unlock',\n            'access.checking': 'Checking...',\n            'access.empty': 'Please enter your access code.',\n            'access.galleryOnly': '\u2713 <strong>Gallery access unlocked.<\/strong><br>This code gives access to the Inspiration Gallery only. A project-specific access code is required to generate a personal concept.',\n            'access.unlocked': '\u2713 Your Padel Vision is unlocked.',\n            'access.unlockedProject': '\u2713 <strong>Padel Vision unlocked for project {ref}.<\/strong><br>Your personal concept is ready to create.',\n            'access.ready': '\u2713 Your Padel Vision is ready to create.',\n            'access.invalid': 'Invalid access code.',\n            'access.error': 'Unable to validate the access code.',\n\n            's7.title': '7 \u00b7 Ready to see your idea?',\n            's7.copy': 'Everything is set. Now discover what your project could become.',\n            'gen.button': 'Bring My Vision to Life',\n            'gen.loading': 'Bringing your vision to life...',\n\n            'placeholder.eyebrow': 'YOUR PLACE \u00b7 YOUR VISION \u00b7 OUR COURTS',\n            'placeholder.title': \"Imagine what's possible.\",\n            'placeholder.copy': \"Shape your idea on the left. We'll turn it into a personal Padel vision you can see, share and develop.\",\n\n            'progress.title': 'Bringing your vision to life',\n            'progress.preparing': 'Preparing your project...',\n            'progress.p1': 'Understanding your vision...',\n            'progress.p2': 'Shaping your Padel environment...',\n            'progress.p3': 'Bringing architecture and courts together...',\n            'progress.p4': 'Adding the finishing touches...',\n            'progress.estimated': 'Estimated ~{s} sec',\n            'progress.almost': 'Almost ready...',\n            'progress.ready': 'Concept ready',\n            'progress.stopped': 'Generation stopped',\n            'progress.gifAlt': 'Creating your concept',\n\n            'limit.note': 'You can generate up to 3 AI concepts within 24 hours.',\n            'runs.unlimited': ' Unlimited access.',\n            'runs.none': ' No generations remaining. Limit resets in {t}.',\n            'runs.one': ' 1 generation remaining. Limit resets in {t}.',\n            'runs.many': ' {n} generations remaining. Limit resets in {t}.',\n            'time.hm': '{h}h {m}m',\n            'time.m': '{m}m',\n\n            'disclosure': '<strong>AI-powered visualization.<\/strong> Project information and uploaded images are processed using AI to create your visualization. <a href=\"{privacyUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy<\/a>',\n            'disclaimer': 'AI-generated concept for inspiration only. Court count, sizes, positions and materials shown may not exactly match the requested concept or the final built result. This is not a technical drawing and must not be used for construction, permitting or contractual purposes \u2014 please confirm your final design with PADELCREATIONS.',\n\n            'story.kicker': 'THIS COULD BE YOURS.',\n            'story.title': 'Your idea. Your environment. Your Padel project.',\n            'story.copy': 'A first glimpse of what your project could become with Padelcreations.',\n\n            'result.regenerate': 'Create another view',\n            'result.save': 'Save my concept',\n            'result.alt': 'PADELCREATIONS AI generated padel environment',\n            'result.filename': 'Concept AI Padel Club Designer Padelcreations',\n\n            'err.enhance': 'Unable to enhance your description.',\n            'err.needAccess': 'Please enter a valid access code.',\n            'err.needPhotos': 'Please upload at least one Environment Reference photo, or choose a different Project Reference option.',\n            'err.invalidResponse': 'The server returned an invalid response.',\n            'err.genFailed': 'Image generation failed.',\n            'err.noImage': 'No image was returned.',\n            'err.generic': 'Something went wrong.',\n\n            'gallery.eyebrow': 'PADELCREATIONS INSPIRATION',\n            'gallery.title': 'Explore more Padel visions',\n            'gallery.copy': 'Discover concepts created with PADELCREATIONS courts. Explore ideas for your own future Padel project.',\n            'gallery.heading': '{env} {app}',\n            'gallery.app.tennis-club': 'Tennis Club inspiration',\n            'gallery.app.padel-standalone': 'Padel Club inspiration',\n            'gallery.app.leisure-sports': 'Leisure & Sports inspiration',\n            'gallery.app.residential': 'Residential inspiration',\n            'gallery.app.corporate': 'Corporate inspiration',\n            'gallery.app.default': 'Padel inspiration',\n            'gallery.more': 'SHOW MORE INSPIRATION \u2193',\n            'gallery.less': 'SHOW LESS \u2191',\n            'gallery.loading': 'Loading inspiration...',\n            'gallery.unavailable': 'Inspiration gallery temporarily unavailable.',\n            'gallery.unlocking': 'Unlocking full inspiration gallery...',\n            'gallery.empty': 'More inspiration for this project type is coming soon.',\n            'gallery.locked': 'Unlock gallery first',\n            'gallery.lockedAria': 'Gallery locked',\n            'gallery.view': 'View',\n            'gallery.viewAria': 'View image',\n            'gallery.imgAlt': 'PADELCREATIONS Padel concept',\n            'gallery.unlocked': '\u2713 Gallery unlocked.',\n            'gallery.unlockError': 'Unable to unlock gallery.',\n\n            'lock.title': 'Working on a Padel project?',\n            'lock.copy': 'Send us your project details to explore our full collection of Padel club concepts and inspiration.',\n            'lock.button': 'Send project details \u2192',\n            'lock.placeholder': 'Enter your access code',\n            'lock.unlockAria': 'Unlock gallery',\n\n            'lightbox.close': 'Close',\n            'lightbox.prev': 'Previous inspiration',\n            'lightbox.next': 'Next inspiration',\n            'lightbox.alt': 'PADELCREATIONS inspiration concept',\n            'lightbox.download': '\u2193&nbsp;&nbsp; Download inspiration',\n            'lightbox.downloading': 'Downloading...',\n            'lightbox.failed': 'Download failed - try again',\n            'lightbox.filename': 'Padelcreations - Inspiration for {app}',\n            'dl.tennis-club': 'Tennis Club',\n            'dl.padel-standalone': 'Padel Club',\n            'dl.leisure-sports': 'Leisure & Sports',\n            'dl.private-house': 'Residential & Corporate',\n            'dl.default': 'Padel Project'\n        },\n\n\n        de: {\n\n            \/* TODO: replace with the German pages if they exist (e.g. WPML \/de\/ URLs) *\/\n            'url.privacy': 'https:\/\/www.padelcreations.com\/privacy-policy\/',\n            'url.contact': 'https:\/\/www.padelcreations.com\/contact\/',\n\n            'header.title': 'Stellen Sie sich Ihr Padel-Projekt vor.<br><span>Und sehen Sie, wie es Wirklichkeit wird.<\/span>',\n            'header.intro': 'Ihr Projekt beginnt mit einer Idee. Beschreiben Sie, was Sie sich vorstellen, oder zeigen Sie uns Ihren Standort \u2013 und entdecken Sie, was aus Ihrem zuk\u00fcnftigen Padel-Projekt werden kann.',\n\n            's1.title': '1 \u00b7 Wovon tr\u00e4umen Sie?',\n            's1.sub': 'W\u00e4hlen Sie die Art Ihres Projekts und ob es indoor oder outdoor entstehen soll.',\n            's1.applicationLabel': 'W\u00e4hlen Sie Ihren Ausgangspunkt',\n            's1.envLabel': 'Wo wird gespielt?',\n\n            'app.tennis-club': 'Tennisclub',\n            'app.padel-standalone': 'Eigenst\u00e4ndiger Padel-Club',\n            'app.leisure-sports': 'Freizeit- & Sportanlagen',\n            'app.private-house': 'Privat & Unternehmen',\n\n            'apphelp.tennis-club': 'Integriert Padel harmonisch in einen bestehenden Premium-Tennisclub mit Tennispl\u00e4tzen, Clubhaus, Gr\u00fcnanlagen und Aufenthaltsbereichen.',\n            'apphelp.padel-standalone': 'Schafft eine eigenst\u00e4ndige Premium-Padel-Anlage rund um die gew\u00e4hlten PADELCREATIONS-Pl\u00e4tze.',\n            'apphelp.leisure-sports': 'Integriert Padel in Hotels, Resorts, Fitnessclubs, Golfclubs und andere hochwertige Freizeit- oder Sportanlagen.',\n            'apphelp.private-house': 'Integriert Padel in ein privates oder unternehmerisches Umfeld. Ihre Projektbeschreibung bestimmt das Setting \u2013 ob Privatresidenz, Firmenzentrale, B\u00fcrocampus, Produktionsst\u00e4tte, Fabrik oder Lagerstandort.',\n\n            'env.outdoor': 'Outdoor',\n            'env.indoor': 'Indoor',\n\n            's2.title': '2 \u00b7 Beschreiben Sie Ihre Vorstellung',\n            's2.label': 'Ihre Vision',\n            's2.optional': '(optional)',\n            's2.placeholder': 'Stellen Sie sich Ihr zuk\u00fcnftiges Padel-Projekt vor\u2026 Ein mediterraner Club zwischen Olivenb\u00e4umen, ein stilvolles Clubhaus, eine Restaurantterrasse und warme Abendstimmung\u2026',\n            's2.hint': 'Beschreiben Sie Atmosph\u00e4re, Architektur, Landschaft, Einrichtungen oder besondere Ideen, die Sie gerne sehen m\u00f6chten.',\n\n            'btn.enhance': '\u2728 Text verbessern',\n            'btn.enhancing': '\u2728 Wird verbessert...',\n            'btn.undo': '\u21b6 R\u00fcckg\u00e4ngig',\n            'btn.presets': 'Vorlagen',\n\n            'presets.heading': 'W\u00e4hlen Sie eine Idee als Ausgangspunkt und passen Sie sie an Ihr Projekt an.',\n            'presets.headingDone': 'Guter Ausgangspunkt \u2013 jetzt machen Sie ihn ganz zu Ihrem eigenen:',\n            'audience.residential': 'Privat',\n            'audience.corporate': 'Unternehmen',\n            'bg.heading': 'W\u00e4hlen Sie die Umgebung',\n            'bg.apply': 'Vorlage \u00fcbernehmen',\n            'bg.infoAria': 'Info: {label}',\n            'confirm.replace': 'Dadurch wird Ihr bisheriger Text ersetzt. Fortfahren?',\n\n            's3.label': '3 \u00b7 Machen Sie es zu Ihrem Projekt',\n            'ref.none': 'Frei nach meiner Vorstellung',\n            'ref.photos': 'Meinen echten Standort verwenden',\n            'refhelp.none': 'Die KI gestaltet die gesamte Umgebung auf Basis Ihrer Projektkonfiguration und Beschreibung.',\n            'refhelp.environment-photos': 'Laden Sie bis zu 5 Fotos des bestehenden Standorts hoch. Die KI bildet die Umgebung nach und integriert die gew\u00e4hlten Pl\u00e4tze.',\n\n            'envimg.default': 'Laden Sie ein oder mehrere Fotos Ihres tats\u00e4chlichen Grundst\u00fccks oder Geb\u00e4udes hoch. Die KI bildet diese Umgebung nach und f\u00fcgt das gew\u00e4hlte Platzmodell in der gew\u00fcnschten Anzahl ein.',\n            'envimg.privacy': 'Bitte laden Sie keine Bilder mit unn\u00f6tigen personenbezogenen oder sensiblen Informationen hoch.',\n            'envimg.delete': 'L\u00f6schen',\n            'envimg.invalidType': 'Bitte laden Sie nur JPG-, PNG- oder WebP-Bilder hoch.',\n            'envimg.loadedOne': '\u2713 1 Standortfoto geladen.',\n            'envimg.loadedMany': '\u2713 {n} Standortfotos geladen.',\n            'envimg.trimmed': ' Nur die ersten {max} wurden verwendet.',\n            'envimg.readError': 'Ein oder mehrere Bilder konnten nicht gelesen werden. Bitte versuchen Sie es erneut.',\n\n            's4.title': '4 \u00b7 Gestalten Sie Ihr Padel-Projekt',\n            's4.model': 'Platzmodell',\n            's4.count': 'Anzahl der Pl\u00e4tze',\n            'court.one': '{n} Platz',\n            'court.many': '{n} Pl\u00e4tze',\n            's4.layout': 'Anordnung der Pl\u00e4tze',\n            'layout.side-by-side': 'Nebeneinander',\n            'layout.linear': 'In einer Reihe',\n\n            's5.title': '5 \u00b7 Darstellungsoptionen',\n            's5.camera': 'Kameraperspektive',\n            'camera.elevated': 'Erh\u00f6hte Architekturansicht',\n            'camera.corner': 'Eckperspektive',\n            'camera.ground': 'Augenh\u00f6he',\n            'camera.aerial': 'Luftansicht',\n            's5.time': 'Tageszeit',\n            'time.day': 'Tag',\n            'time.sunset': 'Sonnenuntergang',\n            'time.night': 'Nacht',\n\n            's6.title': '6 \u00b7 Ihr pers\u00f6nlicher Konzeptzugang',\n            's6.copy': 'Geben Sie den Zugangscode ein, den Sie von Padelcreations erhalten haben, um Ihre pers\u00f6nliche Visualisierung freizuschalten.',\n            'access.placeholder': 'Zugangscode',\n            'access.unlock': 'Freischalten',\n            'access.checking': 'Wird gepr\u00fcft...',\n            'access.empty': 'Bitte geben Sie Ihren Zugangscode ein.',\n            'access.galleryOnly': '\u2713 <strong>Galeriezugang freigeschaltet.<\/strong><br>Dieser Code gilt nur f\u00fcr die Inspirationsgalerie. F\u00fcr ein pers\u00f6nliches Konzept ben\u00f6tigen Sie einen projektbezogenen Zugangscode.',\n            'access.unlocked': '\u2713 Ihre Padel Vision ist freigeschaltet.',\n            'access.unlockedProject': '\u2713 <strong>Padel Vision f\u00fcr Projekt {ref} freigeschaltet.<\/strong><br>Ihr pers\u00f6nliches Konzept kann jetzt erstellt werden.',\n            'access.ready': '\u2713 Ihre Padel Vision kann jetzt erstellt werden.',\n            'access.invalid': 'Ung\u00fcltiger Zugangscode.',\n            'access.error': 'Der Zugangscode konnte nicht gepr\u00fcft werden.',\n\n            's7.title': '7 \u00b7 Bereit f\u00fcr Ihre Idee?',\n            's7.copy': 'Alles ist vorbereitet. Entdecken Sie jetzt, was aus Ihrem Projekt werden kann.',\n            'gen.button': 'Vision zum Leben erwecken',\n            'gen.loading': 'Ihre Vision entsteht...',\n\n            'placeholder.eyebrow': 'IHR ORT \u00b7 IHRE VISION \u00b7 UNSERE PL\u00c4TZE',\n            'placeholder.title': 'Stellen Sie sich vor, was m\u00f6glich ist.',\n            'placeholder.copy': 'Gestalten Sie Ihre Idee links. Wir machen daraus eine pers\u00f6nliche Padel-Vision, die Sie sehen, teilen und weiterentwickeln k\u00f6nnen.',\n\n            'progress.title': 'Ihre Vision entsteht',\n            'progress.preparing': 'Ihr Projekt wird vorbereitet...',\n            'progress.p1': 'Ihre Vision wird analysiert...',\n            'progress.p2': 'Ihre Padel-Umgebung wird gestaltet...',\n            'progress.p3': 'Architektur und Pl\u00e4tze werden zusammengef\u00fchrt...',\n            'progress.p4': 'Der letzte Schliff wird hinzugef\u00fcgt...',\n            'progress.estimated': 'Noch ca. {s} Sek.',\n            'progress.almost': 'Gleich fertig...',\n            'progress.ready': 'Konzept fertig',\n            'progress.stopped': 'Erstellung abgebrochen',\n            'progress.gifAlt': 'Ihr Konzept wird erstellt',\n\n            'limit.note': 'Sie k\u00f6nnen innerhalb von 24 Stunden bis zu 3 KI-Konzepte erstellen.',\n            'runs.unlimited': ' Unbegrenzter Zugang.',\n            'runs.none': ' Keine Erstellungen mehr verf\u00fcgbar. Das Limit wird in {t} zur\u00fcckgesetzt.',\n            'runs.one': ' Noch 1 Erstellung verf\u00fcgbar. Das Limit wird in {t} zur\u00fcckgesetzt.',\n            'runs.many': ' Noch {n} Erstellungen verf\u00fcgbar. Das Limit wird in {t} zur\u00fcckgesetzt.',\n            'time.hm': '{h} Std. {m} Min.',\n            'time.m': '{m} Min.',\n\n            'disclosure': '<strong>KI-gest\u00fctzte Visualisierung.<\/strong> Projektangaben und hochgeladene Bilder werden mithilfe von KI verarbeitet, um Ihre Visualisierung zu erstellen. <a href=\"{privacyUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">Datenschutzerkl\u00e4rung<\/a>',\n            'disclaimer': 'KI-generiertes Konzept, nur zur Inspiration. Anzahl, Gr\u00f6\u00dfe, Position und Materialien der dargestellten Pl\u00e4tze k\u00f6nnen vom gew\u00fcnschten Konzept oder vom sp\u00e4teren Bauergebnis abweichen. Dies ist keine technische Zeichnung und darf nicht f\u00fcr Bau-, Genehmigungs- oder Vertragszwecke verwendet werden \u2013 bitte stimmen Sie Ihr endg\u00fcltiges Design mit PADELCREATIONS ab.',\n\n            'story.kicker': 'SO K\u00d6NNTE ES AUSSEHEN.',\n            'story.title': 'Ihre Idee. Ihre Umgebung. Ihr Padel-Projekt.',\n            'story.copy': 'Ein erster Eindruck davon, was mit Padelcreations aus Ihrem Projekt werden kann.',\n\n            'result.regenerate': 'Weitere Ansicht erstellen',\n            'result.save': 'Mein Konzept speichern',\n            'result.alt': 'Mit KI erstellte Padel-Umgebung von PADELCREATIONS',\n            'result.filename': 'Konzept KI Padel Club Designer Padelcreations',\n\n            'err.enhance': 'Ihre Beschreibung konnte nicht verbessert werden.',\n            'err.needAccess': 'Bitte geben Sie einen g\u00fcltigen Zugangscode ein.',\n            'err.needPhotos': 'Bitte laden Sie mindestens ein Foto Ihres Standorts hoch oder w\u00e4hlen Sie in Schritt 3 eine andere Option.',\n            'err.invalidResponse': 'Der Server hat eine ung\u00fcltige Antwort gesendet.',\n            'err.genFailed': 'Die Bilderstellung ist fehlgeschlagen.',\n            'err.noImage': 'Es wurde kein Bild zur\u00fcckgegeben.',\n            'err.generic': 'Etwas ist schiefgelaufen.',\n\n            'gallery.eyebrow': 'PADELCREATIONS INSPIRATION',\n            'gallery.title': 'Weitere Padel-Visionen entdecken',\n            'gallery.copy': 'Entdecken Sie Konzepte mit PADELCREATIONS-Pl\u00e4tzen und lassen Sie sich f\u00fcr Ihr eigenes Padel-Projekt inspirieren.',\n            'gallery.heading': '{app} \u00b7 {env}',\n            'gallery.app.tennis-club': 'Inspiration f\u00fcr Tennisclubs',\n            'gallery.app.padel-standalone': 'Inspiration f\u00fcr Padel-Clubs',\n            'gallery.app.leisure-sports': 'Inspiration f\u00fcr Freizeit- & Sportanlagen',\n            'gallery.app.residential': 'Inspiration f\u00fcr Privatprojekte',\n            'gallery.app.corporate': 'Inspiration f\u00fcr Unternehmen',\n            'gallery.app.default': 'Padel-Inspiration',\n            'gallery.more': 'MEHR INSPIRATION ANZEIGEN \u2193',\n            'gallery.less': 'WENIGER ANZEIGEN \u2191',\n            'gallery.loading': 'Inspiration wird geladen...',\n            'gallery.unavailable': 'Die Inspirationsgalerie ist vor\u00fcbergehend nicht verf\u00fcgbar.',\n            'gallery.unlocking': 'Vollst\u00e4ndige Inspirationsgalerie wird freigeschaltet...',\n            'gallery.empty': 'Weitere Inspiration f\u00fcr diesen Projekttyp folgt in K\u00fcrze.',\n            'gallery.locked': 'Bitte zuerst die Galerie freischalten',\n            'gallery.lockedAria': 'Galerie gesperrt',\n            'gallery.view': 'Ansehen',\n            'gallery.viewAria': 'Bild ansehen',\n            'gallery.imgAlt': 'PADELCREATIONS Padel-Konzept',\n            'gallery.unlocked': '\u2713 Galerie freigeschaltet.',\n            'gallery.unlockError': 'Die Galerie konnte nicht freigeschaltet werden.',\n\n            'lock.title': 'Planen Sie ein Padel-Projekt?',\n            'lock.copy': 'Senden Sie uns Ihre Projektdaten, um unsere vollst\u00e4ndige Sammlung an Padel-Club-Konzepten und Inspirationen zu entdecken.',\n            'lock.button': 'Projektdaten senden \u2192',\n            'lock.placeholder': 'Zugangscode eingeben',\n            'lock.unlockAria': 'Galerie freischalten',\n\n            'lightbox.close': 'Schlie\u00dfen',\n            'lightbox.prev': 'Vorherige Inspiration',\n            'lightbox.next': 'N\u00e4chste Inspiration',\n            'lightbox.alt': 'PADELCREATIONS Inspirationskonzept',\n            'lightbox.download': '\u2193&nbsp;&nbsp; Inspiration herunterladen',\n            'lightbox.downloading': 'Wird heruntergeladen...',\n            'lightbox.failed': 'Download fehlgeschlagen \u2013 bitte erneut versuchen',\n            'lightbox.filename': 'Padelcreations - Inspiration f\u00fcr {app}',\n            'dl.tennis-club': 'Tennisclub',\n            'dl.padel-standalone': 'Padel-Club',\n            'dl.leisure-sports': 'Freizeit & Sport',\n            'dl.private-house': 'Privat & Unternehmen',\n            'dl.default': 'Padel-Projekt'\n        }\n\n    };\n\n\n    function normalize(value) {\n        const v = String(value || '').toLowerCase().slice(0, 2);\n        return SUPPORTED.includes(v) ? v : '';\n    }\n\n    function detectLanguage() {\n\n        try {\n            const fromUrl = normalize(new URLSearchParams(window.location.search).get('lang'));\n            if (fromUrl) return fromUrl;\n        } catch (e) {}\n\n        const fromAttribute = normalize(root.dataset.defaultLang);\n        if (fromAttribute) return fromAttribute;\n\n        const fromPage = normalize(document.documentElement.getAttribute('lang'));\n        if (fromPage) return fromPage;\n\n        return normalize(navigator.language) || 'en';\n    }\n\n\n    let lang = detectLanguage();\n\n    const listeners = [];\n    const bound = new Map();\n\n\n    function t(key, vars) {\n\n        let text = DICT[lang] && DICT[lang][key];\n\n        if (text == null) text = DICT.en[key];\n        if (text == null) return key;\n\n        if (vars) {\n            text = text.replace(\/\\{(\\w+)\\}\/g, function (match, name) {\n                return vars[name] != null ? vars[name] : match;\n            });\n        }\n\n        return text;\n    }\n\n    function loc(obj) {\n        if (!obj) return obj;\n        return obj[lang] || obj.en;\n    }\n\n    function bind(el, render) {\n        if (!el) return;\n        bound.set(el, render);\n        render(el);\n    }\n\n    function applyStatic() {\n\n        const htmlVars = { privacyUrl: t('url.privacy'), contactUrl: t('url.contact') };\n\n        root.setAttribute('lang', lang);\n\n        root.querySelectorAll('[data-i18n]').forEach(function (el) {\n            el.textContent = t(el.dataset.i18n);\n        });\n\n        root.querySelectorAll('[data-i18n-html]').forEach(function (el) {\n            el.innerHTML = t(el.dataset.i18nHtml, htmlVars);\n        });\n\n        root.querySelectorAll('[data-i18n-placeholder]').forEach(function (el) {\n            el.setAttribute('placeholder', t(el.dataset.i18nPlaceholder));\n        });\n\n        root.querySelectorAll('[data-i18n-aria]').forEach(function (el) {\n            el.setAttribute('aria-label', t(el.dataset.i18nAria));\n        });\n\n        root.querySelectorAll('[data-i18n-alt]').forEach(function (el) {\n            el.setAttribute('alt', t(el.dataset.i18nAlt));\n        });\n\n        root.querySelectorAll('[data-i18n-href]').forEach(function (el) {\n            el.setAttribute('href', t(el.dataset.i18nHref));\n        });\n    }\n\n    function setLang(next) {\n\n        next = normalize(next);\n\n        if (!next || next === lang) return;\n\n        lang = next;\n\n        applyStatic();\n\n        bound.forEach(function (render, el) {\n            try { render(el); } catch (e) { console.error('pcI18n bind:', e); }\n        });\n\n        listeners.forEach(function (fn) {\n            try { fn(lang); } catch (e) { console.error('pcI18n listener:', e); }\n        });\n    }\n\n    function onChange(fn) {\n        listeners.push(fn);\n    }\n\n\n    applyStatic();\n\n    window.pcI18n = {\n        get lang() { return lang; },\n        t: t,\n        loc: loc,\n        bind: bind,\n        onChange: onChange,\n        setLang: setLang\n    };\n\n})();\n\n\n(function () {\n\n    const I = window.pcI18n;\n    const t = I.t;\n\n\n    \/* =========================\n       API\n    ========================= *\/\n\n    const API_ENDPOINT = \"\/wp-json\/padelcreations\/v1\/generate\";\n    const ACCESS_ENDPOINT = \"\/wp-json\/padelcreations\/v1\/validate-access\";\n    const ENHANCE_PROMPT_ENDPOINT = \"\/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 || \"\").trim().match(\/^(P-\\d+)\/i);\n        return match ? match[1].toUpperCase() : \"\";\n    }\n\n\n    \/* =========================\n       COURT MODELS (product names \u2014 same in all languages)\n    ========================= *\/\n\n    const COURT_MODELS = {\n        indoor: [\n            { value: \"basic\", label: \"Mod. BASIC\" },\n            { value: \"panoramic-pro\", label: \"Mod. PANORAMIC PRO\" }\n        ],\n        outdoor: [\n            { value: \"premium-sep-a\", label: \"Mod. PREMIUM SEP-A\" },\n            { value: \"premium-sep-b\", label: \"Mod. PREMIUM SEP-B\" },\n            { value: \"premium-sep-cd\", label: \"Mod. PREMIUM SEP-C\/D\" }\n        ]\n    };\n\n\n    \/* =========================\n       PRESETS (EN + DE)\n\n       P(courtCount, enTitle, enText, deTitle, deText)\n       'private-house' is one level deeper (indoor\/outdoor,\n       THEN residential\/corporate).\n    ========================= *\/\n\n    function P(courtCount, enTitle, enText, deTitle, deText) {\n        return {\n            courtCount: courtCount,\n            en: { title: enTitle, text: enText },\n            de: { title: deTitle, text: deText }\n        };\n    }\n\n    const examplePrompts = {\n\n        \/* ================= TENNIS CLUB ================= *\/\n\n        \"tennis-club\": {\n\n            indoor: [\n                P(3,\n                    \"Established Indoor Tennis Center\",\n                    \"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                    \"Etabliertes Indoor-Tenniszentrum\",\n                    \"Etabliertes Indoor-Tenniszentrum mit 6 Tennispl\u00e4tzen in einer modernen Sporthalle. F\u00fcgen Sie 3 Padelpl\u00e4tze gemeinsam in einem eigenen Bereich neben den bestehenden Tennispl\u00e4tzen hinzu, mit Empfang, kleinem Caf\u00e9, Sitzbereich und klarer Fu\u00dfg\u00e4ngerf\u00fchrung.\"\n                ),\n                P(4,\n                    \"Premium Racket Club\",\n                    \"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                    \"Premium-Racket-Club\",\n                    \"Premium-Indoor-Racket-Club mit 8 bestehenden Tennispl\u00e4tzen in einer gro\u00dfz\u00fcgigen Sporthalle mit hoher Decke. F\u00fcgen Sie 4 Padelpl\u00e4tze in einer separaten Zone neben den Tennispl\u00e4tzen hinzu, verbunden mit einem modernen Clubhaus mit Empfang, Lounge, Caf\u00e9 und Zuschauerpl\u00e4tzen.\"\n                ),\n                P(2,\n                    \"Tennis Hall Conversion\",\n                    \"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                    \"Umbau einer Tennishalle\",\n                    \"Bestehender Indoor-Tennisclub mit 4 Tennispl\u00e4tzen in einer gro\u00dfen Sporthalle mit Stahlkonstruktion. Wandeln Sie einen Teil der verf\u00fcgbaren Hallenfl\u00e4che in 2 Padelpl\u00e4tze neben den verbleibenden Tennispl\u00e4tzen um, mit kompaktem Aufenthaltsbereich, Sitzgelegenheiten und verbesserter moderner Beleuchtung.\"\n                )\n            ],\n\n            outdoor: [\n                P(3,\n                    \"Traditional Tennis Club\",\n                    \"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                    \"Traditioneller Tennisclub\",\n                    \"Etablierter Tennisclub mit 5 Sandpl\u00e4tzen, umgeben von altem Baumbestand. F\u00fcgen Sie 3 Padelpl\u00e4tze neben den bestehenden Tennispl\u00e4tzen hinzu, in der N\u00e4he eines traditionellen Clubhauses mit Restaurantterrasse, Fu\u00dfwegen und begr\u00fcnten Aufenthaltsbereichen.\"\n                ),\n                P(2,\n                    \"Premium Tennis Club\",\n                    \"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                    \"Premium-Tennisclub\",\n                    \"Premium-Tennisclub mit 6 Outdoor-Tennispl\u00e4tzen, gepflegten G\u00e4rten und altem Baumbestand. F\u00fcgen Sie 2 Padelpl\u00e4tze neben dem bestehenden Tennisbereich hinzu, nahe einem eleganten Clubhaus mit Restaurantterrasse, Lounge-Sitzbereichen und hochwertiger Landschaftsgestaltung.\"\n                ),\n                P(4,\n                    \"Large Modern Tennis Complex\",\n                    \"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                    \"Gro\u00dfe moderne Tennisanlage\",\n                    \"Gro\u00dfe moderne Tennisanlage mit 10 Outdoor-Hartpl\u00e4tzen, zeitgem\u00e4\u00dfem Clubhaus und Zuschauerbereichen. F\u00fcgen Sie 4 Padelpl\u00e4tze gemeinsam neben den bestehenden Tennispl\u00e4tzen hinzu, verbunden durch begr\u00fcnte Fu\u00dfwege mit Sitzgelegenheiten, einer Caf\u00e9-Terrasse und professioneller Sportclub-Infrastruktur.\"\n                )\n            ]\n\n        },\n\n\n        \/* ================= PADEL STAND-ALONE CLUB ================= *\/\n\n        \"padel-standalone\": {\n\n            indoor: [\n                P(6,\n                    \"Premium Indoor Padel Club\",\n                    \"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                    \"Premium-Indoor-Padel-Club\",\n                    \"Gestalten Sie einen Premium-Indoor-Padel-Club mit 6 Padelpl\u00e4tzen in einer gro\u00dfz\u00fcgigen modernen Sporthalle. Mit zeitgem\u00e4\u00dfem Empfang, Umkleiden, Caf\u00e9 und Bar, komfortablen Lounge-Bereichen, Zuschauerpl\u00e4tzen und klarer Fu\u00dfg\u00e4ngerf\u00fchrung rund um die Pl\u00e4tze.\"\n                ),\n                P(5,\n                    \"Industrial Warehouse Conversion\",\n                    \"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                    \"Umbau einer Industriehalle\",\n                    \"Bauen Sie eine gro\u00dfe Industriehalle mit sichtbarer Stahlkonstruktion und hohen Decken zu einem modernen Padel-Club mit 5 Padelpl\u00e4tzen um. Mit stilvollem Empfang, Umkleiden, Caf\u00e9-Bar, Social Lounge, Zuschauerbereichen und zeitgem\u00e4\u00dfer Beleuchtung \u2013 unter Erhalt eines Teils des industriellen Charakters des Geb\u00e4udes.\"\n                ),\n                P(3,\n                    \"Boutique Urban Padel Club\",\n                    \"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                    \"Urbaner Boutique-Padel-Club\",\n                    \"Gestalten Sie einen urbanen Boutique-Indoor-Padel-Club mit 3 Padelpl\u00e4tzen in einem modernen Geb\u00e4ude mit hoher Decke. Mit Premium-Empfang, kompakten Umkleiden, stilvollem Caf\u00e9 und Lounge, Zuschauerpl\u00e4tzen und sorgf\u00e4ltig geplanter Beleuchtung f\u00fcr eine exklusive, zeitgem\u00e4\u00dfe Atmosph\u00e4re.\"\n                )\n            ],\n\n            outdoor: [\n                P(6,\n                    \"Premium Padel Destination\",\n                    \"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                    \"Premium-Padel-Destination\",\n                    \"Entwickeln Sie einen Premium-Padel-Club mit 6 Outdoor-Padelpl\u00e4tzen auf einem gro\u00dfz\u00fcgigen, begr\u00fcnten Grundst\u00fcck. Mit modernem Clubhaus mit Naturstein- und Holzdetails, Restaurantterrasse, Lounge-Bereichen, Fu\u00dfwegen, hochwertiger regionaler Landschaftsgestaltung und Parkpl\u00e4tzen f\u00fcr rund 30 Autos.\"\n                ),\n                P(5,\n                    \"Modern Padel Club\",\n                    \"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                    \"Moderner Padel-Club\",\n                    \"Gestalten Sie einen modernen Outdoor-Padel-Club mit 5 Padelpl\u00e4tzen. Mit zeitgem\u00e4\u00dfem Clubhaus mit Empfang und Umkleiden, Caf\u00e9-Bar mit Terrasse, Zuschauer- und Aufenthaltsbereichen, begr\u00fcnten Fu\u00dfwegen, Fahrradstellpl\u00e4tzen und Parkpl\u00e4tzen f\u00fcr rund 25 Autos.\"\n                ),\n                P(3,\n                    \"Compact Padel Club\",\n                    \"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                    \"Kompakter Padel-Club\",\n                    \"Entwickeln Sie einen kompakten Premium-Padel-Club mit 3 Outdoor-Padelpl\u00e4tzen. Mit kleinem, zeitgem\u00e4\u00dfem Clubhaus, Empfang, Caf\u00e9-Terrasse, Lounge-Sitzbereichen, begr\u00fcnten Wegen und attraktiver regionaler Bepflanzung passend zur gew\u00e4hlten Umgebung.\"\n                )\n            ]\n\n        },\n\n\n        \/* ================= LEISURE & SPORTS FACILITIES ================= *\/\n\n        \"leisure-sports\": {\n\n            indoor: [\n                P(4,\n                    \"Fitness & Wellness Center\",\n                    \"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                    \"Fitness- & Wellnesscenter\",\n                    \"Gro\u00dfes modernes Fitness- und Wellnesscenter mit Trainingsfl\u00e4chen, Kursr\u00e4umen und Indoor-Sportanlagen. F\u00fcgen Sie 4 Padelpl\u00e4tze in einer gro\u00dfz\u00fcgigen Sporthalle mit hoher Decke hinzu, verbunden mit dem bestehenden Empfang, den Umkleiden, dem Caf\u00e9, der Lounge und dem Wellnessbereich.\"\n                ),\n                P(3,\n                    \"Multi-Sport Complex\",\n                    \"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                    \"Multisport-Anlage\",\n                    \"Etablierte Indoor-Multisportanlage mit Basketball-, Badminton- und Fitnessangeboten. F\u00fcgen Sie 3 Padelpl\u00e4tze in einem eigenen Bereich der Haupthalle hinzu, mit Zuschauerpl\u00e4tzen, klarer Fu\u00dfg\u00e4ngerf\u00fchrung und bequemem Zugang zu Empfang, Umkleiden und Caf\u00e9.\"\n                ),\n                P(2,\n                    \"Hotel & Resort Sports Center\",\n                    \"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                    \"Sportzentrum f\u00fcr Hotel & Resort\",\n                    \"Premium-Hotel- und Wellnessresort mit bestehendem Indoor-Sportzentrum. F\u00fcgen Sie 2 Padelpl\u00e4tze in einer modernen Halle mit hoher Decke hinzu, \u00fcber gestaltete Innenwege mit dem Hotel verbunden, mit Lounge-Sitzbereichen, Wellnessangeboten und einem kleinen Caf\u00e9 in der N\u00e4he.\"\n                )\n            ],\n\n            outdoor: [\n                P(4,\n                    \"Golf & Country Club\",\n                    \"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                    \"Golf- & Country-Club\",\n                    \"Etablierter Golf- und Country-Club, umgeben von altem Baumbestand und gepflegten Au\u00dfenanlagen. F\u00fcgen Sie 4 Padelpl\u00e4tze in der N\u00e4he des bestehenden Clubhauses und der Sportanlagen hinzu, mit Fu\u00dfwegen, Zuschauerpl\u00e4tzen, Restaurantterrasse und einer Landschaftsgestaltung, die die Pl\u00e4tze nat\u00fcrlich in den Club einbindet.\"\n                ),\n                P(2,\n                    \"Luxury Resort\",\n                    \"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                    \"Luxusresort\",\n                    \"Luxusresort mit Swimmingpools, gepflegten G\u00e4rten und modernen Hotelgeb\u00e4uden. F\u00fcgen Sie 2 Padelpl\u00e4tze im Sportbereich des Resorts hinzu, nahe den Fitness- und Wellnessanlagen, mit schattigen Sitzbereichen, Fu\u00dfwegen und hochwertiger regionaler Bepflanzung.\"\n                ),\n                P(3,\n                    \"Large Municipal Sports Complex\",\n                    \"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                    \"Gro\u00dfe kommunale Sportanlage\",\n                    \"Gro\u00dfe moderne Sportanlage mit Fu\u00dfballpl\u00e4tzen, Leichtathletik und weiteren Outdoor-Sportangeboten. F\u00fcgen Sie 3 Padelpl\u00e4tze gemeinsam in einem eigenen Bereich nahe dem Hauptgeb\u00e4ude hinzu, mit Zuschauerpl\u00e4tzen, Fu\u00dfg\u00e4ngerzugang, Fahrradstellpl\u00e4tzen, Begr\u00fcnung und Parkpl\u00e4tzen in der N\u00e4he.\"\n                )\n            ]\n\n        },\n\n\n        \/* ================= RESIDENTIAL & CORPORATE ================= *\/\n\n        \"private-house\": {\n\n            indoor: {\n\n                residential: [\n                    P(1,\n                        \"Luxury Private Residence\",\n                        \"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                        \"Luxuri\u00f6se Privatresidenz\",\n                        \"Luxuri\u00f6se Privatresidenz mit gro\u00dfem, modernem Indoor-Freizeitbereich. F\u00fcgen Sie 1 privaten Padelplatz in einer gro\u00dfz\u00fcgigen Sporthalle mit hoher Decke hinzu, verbunden mit Home-Gym und Wellnessbereich, mit eleganten Lounge-Sitzpl\u00e4tzen, hochwertigen Materialien und warmer Architekturbeleuchtung.\"\n                    ),\n                    P(2,\n                        \"Private Country Estate\",\n                        \"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                        \"Privates Landgut\",\n                        \"Gro\u00dfes privates Landgut mit eigenem Indoor-Sportgeb\u00e4ude inmitten gepflegter Au\u00dfenanlagen. F\u00fcgen Sie 2 Padelpl\u00e4tze im Geb\u00e4ude hinzu, zusammen mit privatem Fitnessraum, Umkleidebereich und komfortabler Lounge mit Blick auf die Pl\u00e4tze, mit nat\u00fcrlichen Materialien und anspruchsvoller Beleuchtung.\"\n                    ),\n                    P(3,\n                        \"Exclusive Residential Development\",\n                        \"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                        \"Exklusive Wohnanlage\",\n                        \"Exklusive Wohnanlage mit mehreren Luxusapartmentgeb\u00e4uden und gemeinsamen Freizeiteinrichtungen. Schaffen Sie 3 Indoor-Padelpl\u00e4tze in einem modernen Sportzentrum f\u00fcr die Bewohner, mit Fitnessbereich, Umkleiden, Lounge-Sitzpl\u00e4tzen und direktem Zugang zu den begr\u00fcnten Gemeinschaftsg\u00e4rten.\"\n                    )\n                ],\n\n                corporate: [\n                    P(2,\n                        \"Modern Company Headquarters\",\n                        \"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                        \"Moderne Unternehmenszentrale\",\n                        \"Moderne Unternehmenszentrale mit zeitgem\u00e4\u00dfen B\u00fcros und umfangreichen Angeboten f\u00fcr Mitarbeitende. F\u00fcgen Sie 2 Indoor-Padelpl\u00e4tze in einem eigenen Sportgeb\u00e4ude mit hoher Decke hinzu, mit Umkleiden, Fitnessbereich, Lounge-Sitzpl\u00e4tzen und direktem Fu\u00dfweg von den Hauptb\u00fcros.\"\n                    ),\n                    P(2,\n                        \"Industrial & Manufacturing Company\",\n                        \"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                        \"Industrie- & Produktionsunternehmen\",\n                        \"Gro\u00dfes Produktionsunternehmen mit Fertigungsgeb\u00e4uden, Lagerhallen und modernen Verwaltungsb\u00fcros. Bauen Sie einen Teil einer bestehenden Industriehalle mit hoher Decke zu einem Sportbereich f\u00fcr Mitarbeitende mit 2 Padelpl\u00e4tzen, Umkleiden, kompaktem Fitnessbereich und komfortablen Sitzpl\u00e4tzen mit Blick auf die Pl\u00e4tze um.\"\n                    ),\n                    P(3,\n                        \"Technology Campus\",\n                        \"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                        \"Technologie-Campus\",\n                        \"Gro\u00dfer Campus eines Technologieunternehmens mit modernen B\u00fcrogeb\u00e4uden und umfangreichen Angeboten f\u00fcr Mitarbeitende. Schaffen Sie 3 Indoor-Padelpl\u00e4tze in einem zeitgem\u00e4\u00dfen Sport- und Wellnesszentrum, mit Fitnessstudio, Umkleiden, Social Lounge, Caf\u00e9 und Verbindungen zu den umliegenden B\u00fcrogeb\u00e4uden.\"\n                    )\n                ]\n\n            },\n\n            outdoor: {\n\n                residential: [\n                    P(1,\n                        \"Luxury Private Villa\",\n                        \"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                        \"Luxuri\u00f6se Privatvilla\",\n                        \"Luxuri\u00f6se Privatvilla mit Swimmingpool, gepflegtem Garten und bestehendem Tennisplatz. F\u00fcgen Sie 1 Padelplatz neben dem Tennisplatz hinzu, nat\u00fcrlich in das Grundst\u00fcck integriert und so platziert, dass die sch\u00f6nsten Ausblicke in die umgebende Landschaft erhalten bleiben.\"\n                    ),\n                    P(2,\n                        \"Luxury Private Estate\",\n                        \"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                        \"Luxuri\u00f6ses Privatanwesen\",\n                        \"Gro\u00dfes, luxuri\u00f6ses Landanwesen mit zeitgem\u00e4\u00dfer Villa, Swimmingpool und weitl\u00e4ufigen G\u00e4rten, umgeben von altem Baumbestand. F\u00fcgen Sie 2 Padelpl\u00e4tze gemeinsam in einem eigenen Sportbereich abseits des Haupthauses hinzu, verbunden durch begr\u00fcnte Wege mit einem kleinen schattigen Sitz- und Loungebereich.\"\n                    ),\n                    P(1,\n                        \"Premium Residential Community\",\n                        \"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                        \"Exklusive Wohnsiedlung\",\n                        \"Exklusive, geschlossene Wohnsiedlung mit modernen Villen, Gemeinschaftsg\u00e4rten, Swimmingpool und gestalteten Aufenthaltsbereichen. F\u00fcgen Sie 1 Padelplatz im gemeinsamen Freizeitbereich hinzu, nahe Pool und Clubhaus der Bewohner, mit Fu\u00dfwegen, Sitzgelegenheiten, regionaler Bepflanzung und dezenter Landschaftsbeleuchtung.\"\n                    )\n                ],\n\n                corporate: [\n                    P(2,\n                        \"Corporate Headquarters Campus\",\n                        \"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                        \"Campus einer Unternehmenszentrale\",\n                        \"Moderne Unternehmenszentrale, umgeben von gepflegten G\u00e4rten, B\u00fcrogeb\u00e4uden und Erholungsbereichen f\u00fcr Mitarbeitende. F\u00fcgen Sie 2 Outdoor-Padelpl\u00e4tze nahe den Hauptb\u00fcros hinzu, mit Fu\u00dfwegen, schattigen Sitzbereichen, Fahrradstellpl\u00e4tzen und einer Landschaftsgestaltung, die die Pl\u00e4tze nat\u00fcrlich in den Campus einbindet.\"\n                    ),\n                    P(2,\n                        \"Manufacturing Facility\",\n                        \"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                        \"Produktionsstandort\",\n                        \"Gro\u00dfer Produktionsstandort mit Fertigungshallen, Lagern, Verwaltungsb\u00fcros und Mitarbeiterparkpl\u00e4tzen. F\u00fcgen Sie 2 Outdoor-Padelpl\u00e4tze in einem eigenen Erholungsbereich f\u00fcr Mitarbeitende neben dem Verwaltungsgeb\u00e4ude hinzu, mit Umkleiden, schattigen Sitzbereichen, Fu\u00dfg\u00e4ngerzugang und schlichter, professioneller Landschaftsgestaltung.\"\n                    ),\n                    P(3,\n                        \"Business & Technology Campus\",\n                        \"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                        \"Business- & Technologie-Campus\",\n                        \"Zeitgem\u00e4\u00dfer Business- und Technologie-Campus mit mehreren modernen B\u00fcrogeb\u00e4uden, begr\u00fcnten Fu\u00dfg\u00e4ngerbereichen und gemeinsamen Einrichtungen f\u00fcr Mitarbeitende. F\u00fcgen Sie 3 Outdoor-Padelpl\u00e4tze in einer zentralen Erholungszone hinzu, mit Caf\u00e9-Terrasse, Lounge-Sitzbereichen, Fahrradstellpl\u00e4tzen, B\u00e4umen und begr\u00fcnten Wegen, die die umliegenden B\u00fcros verbinden.\"\n                    )\n                ]\n\n            }\n\n        }\n\n    };\n\n\n    \/* =========================\n       OUTDOOR SURROUNDINGS (EN + DE)\n    ========================= *\/\n\n    function B(enTitle, enText, deTitle, deText) {\n        return {\n            en: { title: enTitle, text: enText },\n            de: { title: deTitle, text: deText }\n        };\n    }\n\n    const OUTDOOR_BACKGROUND_GROUPS = [\n        {\n            key: \"siteSetting\",\n            label: { en: \"Site setting\", de: \"Lage\" },\n            options: [\n                B(\"Urban\",\n                  \"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                  \"St\u00e4dtisch\",\n                  \"Platzieren Sie das Projekt in einem realistischen st\u00e4dtischen Umfeld, umgeben von zeitgem\u00e4\u00dfen Geb\u00e4uden, gewachsenen Stra\u00dfen und st\u00e4dtischer Infrastruktur. Mit effizientem Fu\u00dfg\u00e4ngerzugang und einem attraktiven Stadthintergrund, wobei ausreichend Freiraum um die Pl\u00e4tze erhalten bleibt.\"),\n                B(\"Suburban\",\n                  \"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                  \"Stadtrand\",\n                  \"Platzieren Sie das Projekt in einem gro\u00dfz\u00fcgigen Umfeld am Stadtrand, umgeben von niedriger Bebauung, gut erreichbaren Stra\u00dfen, nahen Parkpl\u00e4tzen und begr\u00fcnten Pufferzonen. Verbinden Sie bequeme Infrastruktur mit einer offenen, einladenden Atmosph\u00e4re.\"),\n                B(\"Countryside\",\n                  \"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                  \"L\u00e4ndlich\",\n                  \"Platzieren Sie das Projekt in einer offenen l\u00e4ndlichen Umgebung mit kaum umliegender Bebauung. Nutzen Sie nat\u00fcrliches Gel\u00e4nde, weite Ausblicke und gro\u00dfz\u00fcgigen Raum um die Anlage, damit sie ruhig wirkt und sich nat\u00fcrlich in die Landschaft einf\u00fcgt.\")\n            ]\n        },\n        {\n            key: \"landscapeCharacter\",\n            label: { en: \"Landscape character\", de: \"Landschaftscharakter\" },\n            helpText: {\n                en: \"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                de: \"W\u00e4hlen Sie Klima und Landschaft: Gr\u00fcn & gem\u00e4\u00dfigt f\u00fcr Gro\u00dfbritannien, Irland, Deutschland oder den Norden der USA; Alpin & Berge f\u00fcr die Schweiz, \u00d6sterreich oder die Rocky Mountains; Warm & trocken f\u00fcr den Nahen Osten, Nevada oder Arizona; \u00dcppig & tropisch f\u00fcr Florida, die Karibik oder den Indischen Ozean.\"\n            },\n            options: [\n                B(\"Green & Temperate\",\n                  \"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                  \"Gr\u00fcn & gem\u00e4\u00dfigt\",\n                  \"Verwenden Sie eine gr\u00fcne, gem\u00e4\u00dfigte Landschaft mit Rasenfl\u00e4chen, alten Laub- und Nadelb\u00e4umen, jahreszeitlicher Bepflanzung und weichem Tageslicht. Im Hintergrund k\u00f6nnen bewaldete H\u00fcgel oder ferne Berge erscheinen, mit Architektur und Materialien passend zum lokalen Klima.\"),\n                B(\"Alpine & Mountain\",\n                  \"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                  \"Alpin & Berge\",\n                  \"Verwenden Sie eine eindrucksvolle Alpen- oder Berglandschaft mit gr\u00fcnen T\u00e4lern, alten Nadelb\u00e4umen, felsigen H\u00e4ngen und hohen Berggipfeln im Hintergrund. Zeigen Sie je nach Jahreszeit gr\u00fcne oder leicht verschneite Gipfel, mit zur\u00fcckhaltender Architektur aus Holz und Stein, wie sie f\u00fcr die Schweizer oder \u00f6sterreichischen Alpen und nordamerikanische Bergregionen typisch ist.\"),\n                B(\"Warm & Arid\",\n                  \"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                  \"Warm & trocken\",\n                  \"Verwenden Sie eine warme, trockene Landschaft mit sandigem oder felsigem Gel\u00e4nde, Naturstein, trockenheitsresistenter Bepflanzung und schattigen Bereichen. Wo passend, mit fernen trockenen H\u00fcgeln oder Bergen sowie Architektur und Materialien f\u00fcr ein hei\u00dfes, trockenes Klima.\"),\n                B(\"Lush & Tropical\",\n                  \"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                  \"\u00dcppig & tropisch\",\n                  \"Verwenden Sie eine \u00fcppige tropische Landschaft mit dichter gr\u00fcner Vegetation, hohen Palmen und farbenfroher Bepflanzung. Mit schattigen Wegen und leichter, zeitgem\u00e4\u00dfer Architektur aus Materialien f\u00fcr ein warmes, feuchtes Klima, dazu je nach Lage bewaldete H\u00fcgel oder K\u00fcstenlandschaft.\")\n            ]\n        }\n    ];\n\n\n    \/* =========================\n       STATE\n    ========================= *\/\n\n    let environment = \"outdoor\";\n    let progressInterval = null;\n    let progressSeconds = 0;\n    const ESTIMATED_TIME = 60;\n\n    let accessValidated = false;\n    let environmentImages = [];\n    let exampleAudience = \"residential\";\n\n    let isEnhancing = false;\n    let isGenerating = false;\n\n    let previousPromptBeforeEnhance = null;\n    let selectedPresetExample = null;\n    let selectedOutdoorChoices = { siteSetting: null, landscapeCharacter: null };\n    let presetHeadingKey = \"presets.heading\";\n\n    let lastRunsData = null;\n\n    let progressState = { textKey: \"progress.preparing\", timeKey: \"progress.estimated\", seconds: ESTIMATED_TIME };\n\n\n    \/* =========================\n       ELEMENTS\n    ========================= *\/\n\n    const environmentButtons = document.querySelectorAll(\"#pc-environment button\");\n    const courtModelSelect = document.getElementById(\"pc-court-model\");\n    const courtCountSelect = document.getElementById(\"pc-court-count\");\n    const applicationSelect = document.getElementById(\"pc-application\");\n    const applicationHelp = document.getElementById(\"pc-application-help\");\n    const timeField = document.getElementById(\"pc-time-field\");\n    const timeSelect = document.getElementById(\"pc-time-of-day\");\n    const generateButton = document.getElementById(\"pc-generate\");\n    const generateButtonText = generateButton.querySelector(\".pc-button-text\");\n    const regenerateButton = document.getElementById(\"pc-regenerate\");\n    const errorBox = document.getElementById(\"pc-error\");\n    const accessInput = document.getElementById(\"pc-access-code\");\n    const validateAccessButton = document.getElementById(\"pc-validate-access\");\n    const accessStatus = document.getElementById(\"pc-access-status\");\n\n    const examplePromptsPanel = document.getElementById(\"pc-example-prompts\");\n    const presetToggleButton = document.getElementById(\"pc-preset-toggle\");\n    const exampleHeading = document.getElementById(\"pc-example-heading\");\n    const exampleAudienceToggle = document.getElementById(\"pc-example-audience-toggle\");\n    const exampleButtonsContainer = document.getElementById(\"pc-example-buttons\");\n    const backgroundStep = document.getElementById(\"pc-background-step\");\n    const backgroundButtonsContainer = document.getElementById(\"pc-background-buttons\");\n    const applyPresetButton = document.getElementById(\"pc-apply-preset\");\n\n    const promptTextarea = document.getElementById(\"pc-prompt\");\n    const enhancePromptButton = document.getElementById(\"pc-enhance-prompt\");\n    const undoEnhanceButton = document.getElementById(\"pc-undo-enhance\");\n\n    const environmentImagesInput = document.getElementById(\"pc-environment-images-file\");\n    const environmentImagesStatus = document.getElementById(\"pc-environment-images-status\");\n    const deleteEnvironmentImagesButton = document.getElementById(\"pc-delete-environment-images\");\n    const MAX_ENVIRONMENT_IMAGES = 5;\n\n    const referenceModeSelect = document.getElementById(\"pc-reference-mode\");\n    const referenceModeHelp = document.getElementById(\"pc-reference-mode-help\");\n    const environmentImagesPanel = document.getElementById(\"pc-environment-images-panel\");\n\n    const runsRemainingElement = document.getElementById(\"pc-runs-remaining\");\n    const progressTextElement = document.getElementById(\"pc-progress-text\");\n    const progressTimeElement = document.getElementById(\"pc-progress-time\");\n\n\n    \/* =========================\n       STATUS HELPER\n       Sets a status element's class and keeps its text\n       in sync with the active language.\n    ========================= *\/\n\n    function setStatus(el, baseClass, extraClass, render) {\n        el.className = baseClass + (extraClass ? \" \" + extraClass : \"\");\n        I.bind(el, render);\n    }\n\n\n    \/* =========================\n       LANGUAGE-BOUND ELEMENTS\n    ========================= *\/\n\n    I.bind(enhancePromptButton, function (el) {\n        el.textContent = isEnhancing ? t(\"btn.enhancing\") : t(\"btn.enhance\");\n    });\n\n    I.bind(generateButtonText, function (el) {\n        el.textContent = isGenerating ? t(\"gen.loading\") : t(\"gen.button\");\n    });\n\n    I.bind(validateAccessButton, function (el) {\n        el.textContent = validateAccessButton.disabled ? t(\"access.checking\") : t(\"access.unlock\");\n    });\n\n    I.bind(exampleHeading, function (el) {\n        el.textContent = t(presetHeadingKey);\n    });\n\n    I.bind(progressTextElement, function (el) {\n        el.textContent = t(progressState.textKey);\n    });\n\n    I.bind(progressTimeElement, function (el) {\n        el.textContent = progressState.timeKey ? t(progressState.timeKey, { s: progressState.seconds }) : \"\";\n    });\n\n    I.bind(runsRemainingElement, renderRunsRemaining);\n\n    setStatus(environmentImagesStatus, \"pc-layout-upload-status\", \"\", function (el) {\n        el.textContent = t(\"envimg.default\");\n    });\n\n\n    \/* =========================\n       COURT COUNT OPTIONS (1\u201312)\n    ========================= *\/\n\n    function renderCourtCountOptions() {\n\n        const current = courtCountSelect.value || \"2\";\n\n        courtCountSelect.innerHTML = \"\";\n\n        for (let n = 1; n <= 12; n++) {\n            const option = document.createElement(\"option\");\n            option.value = String(n);\n            option.textContent = t(n === 1 ? \"court.one\" : \"court.many\", { n: n });\n            courtCountSelect.appendChild(option);\n        }\n\n        courtCountSelect.value = current;\n    }\n\n\n    \/* =========================\n       PRESET PANEL TOGGLE\n    ========================= *\/\n\n    function openPresetPanel() {\n        examplePromptsPanel.style.display = \"block\";\n        presetToggleButton.classList.add(\"is-open\");\n        presetToggleButton.setAttribute(\"aria-expanded\", \"true\");\n    }\n\n    function closePresetPanel() {\n        examplePromptsPanel.style.display = \"none\";\n        presetToggleButton.classList.remove(\"is-open\");\n        presetToggleButton.setAttribute(\"aria-expanded\", \"false\");\n    }\n\n    presetToggleButton.addEventListener(\"click\", function () {\n        if (presetToggleButton.classList.contains(\"is-open\")) {\n            closePresetPanel();\n        } else {\n            openPresetPanel();\n        }\n    });\n\n\n    \/* =========================\n       ENHANCE PROMPT\n    ========================= *\/\n\n    async function enhancePrompt() {\n\n        const currentPrompt = promptTextarea.value.trim();\n\n        if (!currentPrompt) {\n            promptTextarea.focus();\n            return;\n        }\n\n        isEnhancing = true;\n        enhancePromptButton.disabled = true;\n        enhancePromptButton.textContent = t(\"btn.enhancing\");\n\n        try {\n\n            const response = await fetch(ENHANCE_PROMPT_ENDPOINT, {\n                method: \"POST\",\n                headers: { \"Content-Type\": \"application\/json\" },\n                body: JSON.stringify({\n                    user_prompt: currentPrompt,\n                    application: applicationSelect.value,\n                    environment: environment,\n                    audience: applicationSelect.value === \"private-house\" ? exampleAudience : \"\",\n                    court_count: parseInt(courtCountSelect.value, 10),\n                    language: I.lang\n                })\n            });\n\n            const data = await response.json();\n\n            if (!response.ok || !data.success || !data.enhanced_prompt) {\n                throw new Error(data.message || t(\"err.enhance\"));\n            }\n\n            \/* Only replace the text if the user has not changed it during the request. *\/\n            if (promptTextarea.value.trim() !== currentPrompt) {\n                return;\n            }\n\n            previousPromptBeforeEnhance = currentPrompt;\n            promptTextarea.value = data.enhanced_prompt;\n            undoEnhanceButton.style.display = \"inline-flex\";\n            promptTextarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n            promptTextarea.focus();\n\n        } catch (error) {\n\n            console.error(\"Prompt enhancement:\", error);\n            showError(error.message || t(\"err.enhance\"));\n\n        } finally {\n\n            isEnhancing = false;\n            enhancePromptButton.disabled = false;\n            enhancePromptButton.textContent = t(\"btn.enhance\");\n\n        }\n    }\n\n    enhancePromptButton.addEventListener(\"click\", enhancePrompt);\n\n    undoEnhanceButton.addEventListener(\"click\", function () {\n\n        if (previousPromptBeforeEnhance === null) {\n            return;\n        }\n\n        promptTextarea.value = previousPromptBeforeEnhance;\n        promptTextarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        previousPromptBeforeEnhance = null;\n        undoEnhanceButton.style.display = \"none\";\n        promptTextarea.focus();\n    });\n\n\n    \/* =========================\n       PROJECT REFERENCE MODE\n    ========================= *\/\n\n    function clearEnvironmentImages() {\n\n        environmentImages = [];\n        environmentImagesInput.value = \"\";\n        deleteEnvironmentImagesButton.style.display = \"none\";\n\n        setStatus(environmentImagesStatus, \"pc-layout-upload-status\", \"\", function (el) {\n            el.textContent = t(\"envimg.default\");\n        });\n    }\n\n    function updateReferenceModeHelp() {\n        referenceModeHelp.textContent = t(\"refhelp.\" + referenceModeSelect.value);\n    }\n\n    function applyReferenceMode(mode) {\n\n        const showEnvironment = mode === \"environment-photos\";\n\n        if (environmentImagesPanel) {\n            environmentImagesPanel.style.display = showEnvironment ? \"block\" : \"none\";\n        }\n\n        \/* Clear any upload for a mode that is no longer selected. *\/\n        if (!showEnvironment) {\n            clearEnvironmentImages();\n        }\n    }\n\n    referenceModeSelect.addEventListener(\"change\", function () {\n        updateReferenceModeHelp();\n        applyReferenceMode(referenceModeSelect.value);\n    });\n\n\n    \/* =========================\n       LOAD COURT MODELS\n    ========================= *\/\n\n    function loadCourtModels() {\n\n        courtModelSelect.innerHTML = \"\";\n\n        COURT_MODELS[environment].forEach(function (model) {\n            const option = document.createElement(\"option\");\n            option.value = model.value;\n            option.textContent = model.label;\n            courtModelSelect.appendChild(option);\n        });\n    }\n\n\n    \/* =========================\n       TIME OF DAY VISIBILITY\n    ========================= *\/\n\n    function updateTimeOfDayVisibility() {\n        timeField.style.display = environment === \"indoor\" ? \"none\" : \"block\";\n    }\n\n\n    \/* =========================\n       ENVIRONMENT SWITCH\n    ========================= *\/\n\n    environmentButtons.forEach(function (button) {\n\n        button.addEventListener(\"click\", function () {\n\n            environmentButtons.forEach(function (btn) {\n                btn.classList.remove(\"active\");\n            });\n\n            button.classList.add(\"active\");\n            environment = button.dataset.value;\n\n            loadCourtModels();\n            updateTimeOfDayVisibility();\n            renderExamplePrompts();\n        });\n    });\n\n\n    \/* =========================\n       APPLICATION HELP\n    ========================= *\/\n\n    function updateApplicationHelp() {\n        applicationHelp.textContent = t(\"apphelp.\" + applicationSelect.value);\n    }\n\n\n    \/* =========================\n       EXAMPLE PROMPTS\n    ========================= *\/\n\n    function setPresetHeading(key) {\n        presetHeadingKey = key;\n        exampleHeading.textContent = t(key);\n    }\n\n    function clearExampleSelection() {\n        exampleButtonsContainer.querySelectorAll(\".pc-example-prompt-button\").forEach(function (item) {\n            item.classList.remove(\"pc-example-selected\");\n        });\n    }\n\n    function renderExamplePrompts() {\n\n        if (!examplePromptsPanel) {\n            return;\n        }\n\n        const application = applicationSelect.value;\n        const isPrivateHouse = application === \"private-house\";\n\n        if (exampleAudienceToggle) {\n            exampleAudienceToggle.style.display = isPrivateHouse ? \"flex\" : \"none\";\n        }\n\n        let examples;\n\n        if (isPrivateHouse) {\n            examples = (\n                examplePrompts[application] &&\n                examplePrompts[application][environment] &&\n                examplePrompts[application][environment][exampleAudience]\n            ) || [];\n        } else {\n            examples = (\n                examplePrompts[application] &&\n                examplePrompts[application][environment]\n            ) || [];\n        }\n\n        setPresetHeading(\"presets.heading\");\n\n        exampleButtonsContainer.innerHTML = \"\";\n\n        selectedPresetExample = null;\n        selectedOutdoorChoices = { siteSetting: null, 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 = document.createElement(\"button\");\n            button.type = \"button\";\n            button.className = \"pc-example-prompt-button\";\n            button.textContent = I.loc(example).title;\n\n            button.addEventListener(\"click\", function () {\n\n                if (environment === \"outdoor\") {\n\n                    selectedPresetExample = example;\n                    selectedOutdoorChoices = { siteSetting: null, landscapeCharacter: null };\n\n                    clearExampleSelection();\n                    button.classList.add(\"pc-example-selected\");\n\n                    renderOutdoorBackgrounds();\n                    backgroundStep.style.display = \"block\";\n                    applyPresetButton.disabled = true;\n                    return;\n                }\n\n                const inserted = insertExamplePrompt(I.loc(example).text, example.courtCount);\n\n                if (inserted !== false) {\n\n                    clearExampleSelection();\n                    button.classList.add(\"pc-example-selected\");\n\n                    \/* Brief visual acknowledgement, then collapse. *\/\n                    setTimeout(closePresetPanel, 180);\n                }\n            });\n\n            exampleButtonsContainer.appendChild(button);\n        });\n    }\n\n\n    function renderOutdoorBackgrounds() {\n\n        if (!backgroundButtonsContainer) return;\n\n        backgroundButtonsContainer.innerHTML = \"\";\n\n        OUTDOOR_BACKGROUND_GROUPS.forEach(function (group) {\n\n            const groupLabel = I.loc(group.label);\n\n            const groupElement = document.createElement(\"div\");\n            groupElement.className = \"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 = groupLabel;\n\n            if (group.helpText) {\n\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(\"aria-label\", t(\"bg.infoAria\", { label: groupLabel }));\n\n                const tooltip = document.createElement(\"span\");\n                tooltip.className = \"pc-background-info-tooltip\";\n                tooltip.setAttribute(\"role\", \"tooltip\");\n                tooltip.textContent = I.loc(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\n                const button = document.createElement(\"button\");\n                button.type = \"button\";\n                button.className = \"pc-background-prompt-button\";\n                button.textContent = I.loc(background).title;\n\n                button.addEventListener(\"click\", function () {\n\n                    selectedOutdoorChoices[group.key] = background;\n\n                    groupButtons.querySelectorAll(\".pc-background-prompt-button\").forEach(function (item) {\n                        item.classList.remove(\"pc-background-selected\");\n                    });\n\n                    button.classList.add(\"pc-background-selected\");\n\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\n        applyPresetButton.addEventListener(\"click\", function () {\n\n            if (\n                !selectedPresetExample ||\n                !selectedOutdoorChoices.siteSetting ||\n                !selectedOutdoorChoices.landscapeCharacter\n            ) return;\n\n            const combinedPrompt =\n                I.loc(selectedPresetExample).text + \" \" +\n                I.loc(selectedOutdoorChoices.siteSetting).text + \" \" +\n                I.loc(selectedOutdoorChoices.landscapeCharacter).text;\n\n            const inserted = insertExamplePrompt(combinedPrompt, selectedPresetExample.courtCount);\n\n            if (inserted !== false) closePresetPanel();\n        });\n    }\n\n\n    \/*\n     * Inserts an example into the description textarea.\n     * Confirms first if the user has already typed something.\n     *\/\n    function insertExamplePrompt(text, courtCount) {\n\n        if (promptTextarea.value.trim() !== \"\") {\n            if (!window.confirm(t(\"confirm.replace\"))) {\n                return false;\n            }\n        }\n\n        promptTextarea.value = text;\n\n        \/* Keep Number of Courts in sync with the preset text. *\/\n        if (courtCount) {\n            courtCountSelect.value = String(courtCount);\n        }\n\n        promptTextarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        promptTextarea.focus();\n\n        setPresetHeading(\"presets.headingDone\");\n\n        return true;\n    }\n\n\n    \/* Residential \/ Corporate sub-choice \u2014 only for private-house. *\/\n\n    if (exampleAudienceToggle) {\n\n        exampleAudienceToggle.querySelectorAll(\".pc-audience-button\").forEach(function (button) {\n\n            button.addEventListener(\"click\", function () {\n\n                exampleAudienceToggle.querySelectorAll(\".pc-audience-button\").forEach(function (btn) {\n                    btn.classList.remove(\"active\");\n                });\n\n                button.classList.add(\"active\");\n                exampleAudience = button.dataset.audience;\n                renderExamplePrompts();\n            });\n        });\n    }\n\n    applicationSelect.addEventListener(\"change\", function () {\n        updateApplicationHelp();\n        renderExamplePrompts();\n    });\n\n\n    \/* =========================\n       ACCESS CODE VALIDATION\n    ========================= *\/\n\n    function lockGenerate() {\n\n        accessValidated = false;\n        generateButton.disabled = true;\n        generateButton.classList.remove(\"pc-access-active\");\n\n        if (regenerateButton) {\n            regenerateButton.disabled = true;\n        }\n    }\n\n    function setAccessStatus(extraClass, render) {\n        setStatus(accessStatus, \"pc-access-status\", extraClass, render);\n    }\n\n    async function validateAccessCode() {\n\n        const code = accessInput.value.trim();\n\n        lockGenerate();\n        setAccessStatus(\"\", function (el) { el.textContent = \"\"; });\n\n        if (!code) {\n            setAccessStatus(\"invalid\", function (el) { el.textContent = t(\"access.empty\"); });\n            return;\n        }\n\n        validateAccessButton.disabled = true;\n        validateAccessButton.textContent = t(\"access.checking\");\n\n        try {\n\n            const response = await fetch(ACCESS_ENDPOINT, {\n                method: \"POST\",\n                headers: { \"Content-Type\": \"application\/json\" },\n                body: JSON.stringify({ access_code: code, language: I.lang })\n            });\n\n            const data = await response.json();\n\n            \/* Ignore if the code was changed during the request. *\/\n            if (accessInput.value.trim() !== code) {\n                return;\n            }\n\n            \/* GALLERY-ONLY CODE ENTERED HERE BY MISTAKE *\/\n\n            if (response.ok && data.gallery_only === true) {\n\n                lockGenerate();\n\n                setAccessStatus(\"valid\", function (el) { el.innerHTML = t(\"access.galleryOnly\"); });\n\n                document.dispatchEvent(new CustomEvent(\"pcGalleryUnlocked\", { detail: { accessCode: code } }));\n\n                return;\n            }\n\n            \/* ACCESS ACCEPTED *\/\n\n            if (response.ok && data.valid === true) {\n\n                accessValidated = true;\n                generateButton.disabled = false;\n                generateButton.classList.add(\"pc-access-active\");\n\n                if (regenerateButton) {\n                    regenerateButton.disabled = false;\n                }\n\n                const projectRef = getProjectReference(code);\n\n                if (data.is_zoho_verified && !data.is_unlimited && !data.is_distributor) {\n\n                    if (projectRef) {\n                        setAccessStatus(\"valid\", function (el) {\n                            el.innerHTML = t(\"access.unlockedProject\", { ref: projectRef });\n                        });\n                    } else {\n                        setAccessStatus(\"valid\", function (el) { el.textContent = t(\"access.ready\"); });\n                    }\n\n                } else {\n                    setAccessStatus(\"valid\", function (el) { el.textContent = t(\"access.unlocked\"); });\n                }\n\n                \/* Hide access code + Unlock button *\/\n                const accessRow = document.querySelector(\".pc-access-row\");\n                if (accessRow) {\n                    accessRow.style.display = \"none\";\n                }\n\n                hideError();\n\n                document.dispatchEvent(new CustomEvent(\"pcDesignerUnlocked\", { detail: { accessCode: code } }));\n            }\n\n            \/* ACCESS DENIED *\/\n\n            else {\n\n                lockGenerate();\n\n                const serverMessage = data.message;\n\n                setAccessStatus(\"invalid\", function (el) {\n                    el.textContent = serverMessage || t(\"access.invalid\");\n                });\n            }\n\n        } catch (error) {\n\n            console.error(\"Access validation:\", error);\n\n            lockGenerate();\n            setAccessStatus(\"invalid\", function (el) { el.textContent = t(\"access.error\"); });\n\n        } finally {\n\n            validateAccessButton.disabled = false;\n            validateAccessButton.textContent = t(\"access.unlock\");\n        }\n    }\n\n    validateAccessButton.addEventListener(\"click\", validateAccessCode);\n\n    accessInput.addEventListener(\"keydown\", function (event) {\n        if (event.key === \"Enter\") {\n            event.preventDefault();\n            validateAccessCode();\n        }\n    });\n\n    \/* Any change to the code invalidates the previous validation. *\/\n    accessInput.addEventListener(\"input\", function () {\n        lockGenerate();\n        setAccessStatus(\"\", function (el) { el.textContent = \"\"; });\n    });\n\n\n    \/* =========================\n       RESET TIME \/ RUNS REMAINING\n    ========================= *\/\n\n    function formatResetTime(seconds) {\n\n        const totalMinutes = Math.max(0, Math.floor(seconds \/ 60));\n        const hours = Math.floor(totalMinutes \/ 60);\n        const minutes = totalMinutes % 60;\n\n        if (hours > 0) {\n            return t(\"time.hm\", { h: hours, m: minutes });\n        }\n\n        return t(\"time.m\", { m: minutes });\n    }\n\n    function renderRunsRemaining(el) {\n\n        if (!lastRunsData) {\n            el.textContent = \"\";\n            return;\n        }\n\n        if (lastRunsData.unlimited === true) {\n            el.textContent = t(\"runs.unlimited\");\n            return;\n        }\n\n        if (typeof lastRunsData.runs_remaining === \"undefined\") {\n            el.textContent = \"\";\n            return;\n        }\n\n        const remaining = Number(lastRunsData.runs_remaining);\n        const resetText = formatResetTime(Number(lastRunsData.reset_seconds || 0));\n\n        if (remaining === 0) {\n            el.textContent = t(\"runs.none\", { t: resetText });\n        } else if (remaining === 1) {\n            el.textContent = t(\"runs.one\", { t: resetText });\n        } else {\n            el.textContent = t(\"runs.many\", { n: remaining, t: resetText });\n        }\n    }\n\n\n    \/* =========================\n       ENVIRONMENT REFERENCE IMAGES\n    ========================= *\/\n\n    const ENVIRONMENT_IMAGE_MAX_DIMENSION = 1800;\n    const ENVIRONMENT_IMAGE_JPEG_QUALITY = 0.85;\n\n    function resizeImageFile(file, maxDimension, quality) {\n\n        return new Promise(function (resolve, reject) {\n\n            const objectUrl = URL.createObjectURL(file);\n            const img = new Image();\n\n            img.onload = function () {\n\n                URL.revokeObjectURL(objectUrl);\n\n                let targetWidth = img.naturalWidth;\n                let targetHeight = img.naturalHeight;\n                const largestSide = Math.max(targetWidth, targetHeight);\n\n                \/* Only scale DOWN, never up. *\/\n                if (largestSide > maxDimension) {\n                    const scale = maxDimension \/ largestSide;\n                    targetWidth = Math.round(targetWidth * scale);\n                    targetHeight = Math.round(targetHeight * scale);\n                }\n\n                const canvas = document.createElement(\"canvas\");\n                canvas.width = targetWidth;\n                canvas.height = targetHeight;\n\n                const context = canvas.getContext(\"2d\");\n\n                if (!context) {\n                    reject(new Error(\"Canvas is not supported in this browser.\"));\n                    return;\n                }\n\n                context.drawImage(img, 0, 0, targetWidth, targetHeight);\n\n                let dataUrl;\n\n                try {\n                    \/* Always re-encode as JPEG \u2014 this is the compression step. *\/\n                    dataUrl = canvas.toDataURL(\"image\/jpeg\", quality);\n                } catch (error) {\n                    reject(error);\n                    return;\n                }\n\n                resolve(dataUrl);\n            };\n\n            img.onerror = function () {\n                URL.revokeObjectURL(objectUrl);\n                reject(new Error(\"Could not read \" + file.name));\n            };\n\n            img.src = objectUrl;\n        });\n    }\n\n    environmentImagesInput.addEventListener(\"change\", async function (event) {\n\n        const files = Array.from(event.target.files || []);\n\n        if (!files.length) {\n            return;\n        }\n\n        const allowedTypes = [\"image\/jpeg\", \"image\/png\", \"image\/webp\"];\n\n        const invalidFile = files.find(function (file) {\n            return !allowedTypes.includes(file.type);\n        });\n\n        if (invalidFile) {\n            environmentImagesInput.value = \"\";\n            setStatus(environmentImagesStatus, \"pc-layout-upload-status\", \"error\", function (el) {\n                el.textContent = t(\"envimg.invalidType\");\n            });\n            return;\n        }\n\n        const limitedFiles = files.slice(0, MAX_ENVIRONMENT_IMAGES);\n        const wasTrimmed = files.length > MAX_ENVIRONMENT_IMAGES;\n\n        try {\n\n            environmentImages = await Promise.all(limitedFiles.map(function (file) {\n                return resizeImageFile(file, ENVIRONMENT_IMAGE_MAX_DIMENSION, ENVIRONMENT_IMAGE_JPEG_QUALITY);\n            }));\n\n            deleteEnvironmentImagesButton.style.display = \"block\";\n\n            const count = environmentImages.length;\n\n            setStatus(environmentImagesStatus, \"pc-layout-upload-status\", \"loaded\", function (el) {\n                el.textContent =\n                    (count === 1 ? t(\"envimg.loadedOne\") : t(\"envimg.loadedMany\", { n: count })) +\n                    (wasTrimmed ? t(\"envimg.trimmed\", { max: MAX_ENVIRONMENT_IMAGES }) : \"\");\n            });\n\n        } catch (error) {\n\n            console.error(\"Environment reference images:\", error);\n\n            environmentImages = [];\n            environmentImagesInput.value = \"\";\n\n            setStatus(environmentImagesStatus, \"pc-layout-upload-status\", \"error\", function (el) {\n                el.textContent = t(\"envimg.readError\");\n            });\n        }\n    });\n\n    deleteEnvironmentImagesButton.addEventListener(\"click\", clearEnvironmentImages);\n\n\n    \/* =========================\n       GENERATE\n    ========================= *\/\n\n    async function generateConcept() {\n\n        const courtModel = courtModelSelect.value;\n        const courtModelLabel = courtModelSelect.options[courtModelSelect.selectedIndex].text;\n        const courtCount = parseInt(courtCountSelect.value, 10);\n        const layout = document.getElementById(\"pc-layout\").value;\n        const camera = document.getElementById(\"pc-camera\").value;\n        const referenceMode = referenceModeSelect.value;\n\n        \/* Time of day only applies outdoors. *\/\n        const timeOfDay = environment === \"outdoor\" ? timeSelect.value : \"\";\n\n        const application = applicationSelect.value;\n        const userPrompt = promptTextarea.value.trim();\n\n        if (!accessValidated) {\n            showError(t(\"err.needAccess\"));\n            return;\n        }\n\n        if (referenceMode === \"environment-photos\" && environmentImages.length === 0) {\n            showError(t(\"err.needPhotos\"));\n            return;\n        }\n\n        hideError();\n        setLoading(true);\n        startProgress();\n\n        const requestData = {\n            environment: environment,\n            court_model: courtModel,\n            court_model_label: courtModelLabel,\n            court_count: courtCount,\n            layout: layout,\n            camera: camera,\n            reference_mode: referenceMode,\n            time_of_day: timeOfDay,\n            application: application,\n            audience: application === \"private-house\" ? exampleAudience : \"\",\n            user_prompt: userPrompt,\n            access_code: accessInput.value.trim(),\n            environment_images: environmentImages,\n            language: I.lang\n        };\n\n        try {\n\n            const response = await fetch(API_ENDPOINT, {\n                method: \"POST\",\n                headers: { \"Content-Type\": \"application\/json\" },\n                body: JSON.stringify(requestData)\n            });\n\n            let data;\n\n            try {\n                data = await response.json();\n            } catch (error) {\n                throw new Error(t(\"err.invalidResponse\"));\n            }\n\n            if (!response.ok) {\n                throw new Error(data.message || t(\"err.genFailed\"));\n            }\n\n            let imageSource;\n\n            if (data.image_url) {\n                imageSource = data.image_url;\n            } else if (data.image_base64) {\n                imageSource = \"data:\" + (data.image_mime || \"image\/png\") + \";base64,\" + data.image_base64;\n            } else {\n                throw new Error(t(\"err.noImage\"));\n            }\n\n            lastRunsData = {\n                unlimited: data.unlimited,\n                runs_remaining: data.runs_remaining,\n                reset_seconds: data.reset_seconds\n            };\n\n            renderRunsRemaining(runsRemainingElement);\n\n            showImage(imageSource);\n            finishProgress(true);\n\n        } catch (error) {\n\n            console.error(\"PADELCREATIONS AI:\", error);\n\n            finishProgress(false);\n            showError(error.message || t(\"err.generic\"));\n\n        } finally {\n\n            setLoading(false);\n        }\n    }\n\n\n    \/* =========================\n       DOWNLOAD FILE NAME\n    ========================= *\/\n\n    function createDownloadFilename() {\n\n        const now = new Date();\n        const pad = function (n) { return String(n).padStart(2, \"0\"); };\n\n        const timestamp =\n            now.getFullYear() + pad(now.getMonth() + 1) + pad(now.getDate()) +\n            \"-\" +\n            pad(now.getHours()) + pad(now.getMinutes()) + pad(now.getSeconds());\n\n        return timestamp + \" - \" + t(\"result.filename\") + \".png\";\n    }\n\n\n    \/* =========================\n       SHOW IMAGE\n    ========================= *\/\n\n    function showImage(imageSource) {\n\n        const placeholder = document.getElementById(\"pc-placeholder\");\n        const status = document.getElementById(\"pc-generation-status\");\n        const result = document.getElementById(\"pc-result\");\n        const image = document.getElementById(\"pc-result-image\");\n        const download = document.getElementById(\"pc-download\");\n        const actions = document.getElementById(\"pc-result-actions\");\n        const resultStory = document.getElementById(\"pc-result-story\");\n\n        image.src = imageSource;\n        download.href = imageSource;\n        download.download = createDownloadFilename();\n\n        placeholder.style.display = \"none\";\n        status.style.display = \"none\";\n        result.style.display = \"block\";\n        actions.style.display = \"flex\";\n\n        if (resultStory) {\n            resultStory.style.display = \"block\";\n        }\n    }\n\n\n    \/* =========================\n       LOADING STATE\n    ========================= *\/\n\n    function setLoading(loading) {\n\n        isGenerating = loading;\n        generateButtonText.textContent = loading ? t(\"gen.loading\") : t(\"gen.button\");\n\n        if (loading) {\n\n            generateButton.disabled = true;\n            generateButton.classList.add(\"loading\");\n\n            if (regenerateButton) {\n                regenerateButton.disabled = true;\n            }\n\n        } else {\n\n            generateButton.disabled = !accessValidated;\n            generateButton.classList.remove(\"loading\");\n            generateButton.classList.toggle(\"pc-access-active\", accessValidated);\n\n            if (regenerateButton) {\n                regenerateButton.disabled = !accessValidated;\n            }\n        }\n    }\n\n\n    \/* =========================\n       PROGRESS\n    ========================= *\/\n\n    function setProgress(textKey, timeKey, seconds) {\n\n        progressState = { textKey: textKey, timeKey: timeKey, seconds: seconds };\n\n        progressTextElement.textContent = t(textKey);\n        progressTimeElement.textContent = timeKey ? t(timeKey, { s: seconds }) : \"\";\n    }\n\n    function startProgress() {\n\n        const placeholder = document.getElementById(\"pc-placeholder\");\n        const result = document.getElementById(\"pc-result\");\n        const status = document.getElementById(\"pc-generation-status\");\n        const actions = document.getElementById(\"pc-result-actions\");\n        const bar = document.getElementById(\"pc-progress-bar\");\n        const resultStory = document.getElementById(\"pc-result-story\");\n        const statusLogo = document.getElementById(\"pc-status-logo\");\n\n        if (progressInterval) {\n            clearInterval(progressInterval);\n        }\n\n        progressSeconds = 0;\n\n        placeholder.style.display = \"none\";\n        result.style.display = \"none\";\n        actions.style.display = \"none\";\n\n        if (resultStory) {\n            resultStory.style.display = \"none\";\n        }\n\n        status.style.display = \"flex\";\n\n        if (statusLogo) {\n            statusLogo.innerHTML = \"\";\n            const loadingGif = document.createElement(\"img\");\n            loadingGif.src = \"https:\/\/www.padelcreations.com\/wp-content\/uploads\/Others\/Please-wait-v2.gif?t=\" + Date.now();\n            loadingGif.alt = t(\"progress.gifAlt\");\n            statusLogo.appendChild(loadingGif);\n        }\n\n        bar.style.width = \"4%\";\n\n        setProgress(\"progress.p1\", \"progress.estimated\", ESTIMATED_TIME);\n\n        progressInterval = setInterval(function () {\n\n            progressSeconds++;\n\n            const percentage = Math.min(92, 5 + (progressSeconds \/ ESTIMATED_TIME) * 87);\n            bar.style.width = percentage + \"%\";\n\n            const remaining = Math.max(0, ESTIMATED_TIME - progressSeconds);\n\n            let textKey;\n\n            if (progressSeconds < 10) textKey = \"progress.p1\";\n            else if (progressSeconds < 25) textKey = \"progress.p2\";\n            else if (progressSeconds < 45) textKey = \"progress.p3\";\n            else textKey = \"progress.p4\";\n\n            if (remaining > 0) {\n                setProgress(textKey, \"progress.estimated\", remaining);\n            } else {\n                setProgress(textKey, \"progress.almost\", 0);\n            }\n\n        }, 1000);\n    }\n\n    function finishProgress(success) {\n\n        const bar = document.getElementById(\"pc-progress-bar\");\n\n        if (progressInterval) {\n            clearInterval(progressInterval);\n            progressInterval = null;\n        }\n\n        if (success) {\n            bar.style.width = \"100%\";\n            setProgress(\"progress.ready\", \"\", 0);\n            progressTimeElement.textContent = \"100%\";\n        } else {\n            setProgress(\"progress.stopped\", \"\", 0);\n        }\n    }\n\n\n    \/* =========================\n       ERRORS\n    ========================= *\/\n\n    function showError(message) {\n        I.bind(errorBox, function (el) { el.textContent = message; });\n        errorBox.style.display = \"block\";\n    }\n\n    function hideError() {\n        I.bind(errorBox, function (el) { el.textContent = \"\"; });\n        errorBox.style.display = \"none\";\n    }\n\n\n    \/* =========================\n       LANGUAGE CHANGE\n    ========================= *\/\n\n    I.onChange(function () {\n        updateApplicationHelp();\n        updateReferenceModeHelp();\n        renderCourtCountOptions();\n        renderExamplePrompts();   \/* re-renders presets in the new language *\/\n\n        const download = document.getElementById(\"pc-download\");\n        if (download && download.getAttribute(\"href\") && download.getAttribute(\"href\") !== \"#\") {\n            download.download = createDownloadFilename();\n        }\n    });\n\n\n    \/* =========================\n       EVENTS\n    ========================= *\/\n\n    generateButton.addEventListener(\"click\", generateConcept);\n\n    if (regenerateButton) {\n        regenerateButton.addEventListener(\"click\", generateConcept);\n    }\n\n\n    \/* =========================\n       INITIALIZE\n    ========================= *\/\n\n    renderCourtCountOptions();\n    loadCourtModels();\n    updateApplicationHelp();\n    updateTimeOfDayVisibility();\n    updateReferenceModeHelp();\n    applyReferenceMode(referenceModeSelect.value);\n    renderExamplePrompts();\n\n})();\n\n\n\/* =====================================================\n   PADELCREATIONS INSPIRATION GALLERY\n\n   PUBLIC:   low-resolution teaser images, locked, no lightbox\/download\n   UNLOCKED: protected full gallery, lightbox, navigation, download\n===================================================== *\/\n\n(function () {\n\n    const I = window.pcI18n;\n    const t = I.t;\n\n    const PREVIEW_ENDPOINT = '\/wp-json\/padelcreations\/v1\/gallery-preview';\n    const FULL_ENDPOINT = '\/wp-json\/padelcreations\/v1\/gallery';\n    const ACCESS_ENDPOINT = '\/wp-json\/padelcreations\/v1\/validate-gallery-access';\n\n    const grid = document.getElementById('pc-gallery-grid');\n    const empty = document.getElementById('pc-gallery-empty');\n    const lockMessage = document.getElementById('pc-gallery-lock-message');\n    const lightbox = document.getElementById('pc-gallery-lightbox');\n    const lightboxImage = document.getElementById('pc-gallery-lightbox-image');\n    const download = document.getElementById('pc-gallery-download');\n    const close = document.getElementById('pc-gallery-close');\n    const prev = document.getElementById('pc-gallery-prev');\n    const next = document.getElementById('pc-gallery-next');\n    const applicationSelect = document.getElementById('pc-application');\n    const accessInput = document.getElementById('pc-access-code');\n    const galleryHeading = document.querySelector('.pc-gallery-heading h3');\n    const galleryAccessInput = document.getElementById('pc-gallery-access-code');\n    const galleryUnlockButton = document.getElementById('pc-gallery-unlock');\n    const galleryAccessStatus = document.getElementById('pc-gallery-access-status');\n    const galleryMoreWrap = document.getElementById('pc-gallery-more-wrap');\n    const galleryMoreButton = document.getElementById('pc-gallery-more');\n    const galleryLessButton = document.getElementById('pc-gallery-less');\n\n    if (\n        !grid || !empty || !lightbox || !lightboxImage || !download ||\n        !close || !prev || !next || !applicationSelect || !accessInput ||\n        !galleryAccessInput || !galleryUnlockButton || !galleryAccessStatus ||\n        !galleryMoreWrap || !galleryMoreButton || !galleryLessButton\n    ) {\n        return;\n    }\n\n\n    \/* =====================================================\n       APPLICATION MAPPING (metadata values \u2014 not translated)\n    ===================================================== *\/\n\n    const APPLICATION_METADATA = {\n        'tennis-club': ['tennis_club'],\n        'padel-standalone': ['padel_stand_alone_club'],\n        'leisure-sports': ['leisure___sports_facilities'],\n        'private-house': ['residential', 'corporate']\n    };\n\n\n    \/* =====================================================\n       STATE\n    ===================================================== *\/\n\n    let allImages = [];\n    let galleryUnlocked = false;\n    let currentGalleryImageUrl = '';\n    let currentFilteredImages = [];\n    let currentImageIndex = -1;\n    let downloadState = 'idle';\n\n    const GALLERY_INITIAL_LIMIT = 12;\n    const GALLERY_LOAD_MORE = 6;\n\n    let galleryVisibleLimit = GALLERY_INITIAL_LIMIT;\n\n\n    \/* =====================================================\n       LANGUAGE-BOUND ELEMENTS\n    ===================================================== *\/\n\n    function setEmpty(key) {\n        empty.style.display = 'block';\n        I.bind(empty, function (el) { el.textContent = t(key); });\n    }\n\n    I.bind(download, function (el) {\n        if (downloadState === 'busy') el.textContent = t('lightbox.downloading');\n        else if (downloadState === 'failed') el.textContent = t('lightbox.failed');\n        else el.innerHTML = t('lightbox.download');\n    });\n\n    function setGalleryAccessStatus(extraClass, render) {\n        galleryAccessStatus.className = 'pc-gallery-access-status' + (extraClass ? ' ' + extraClass : '');\n        I.bind(galleryAccessStatus, render);\n    }\n\n    setEmpty('gallery.loading');\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        try {\n\n            const response = await fetch(PREVIEW_ENDPOINT, { method: 'GET', cache: 'no-store' });\n            const data = await response.json();\n\n            if (!response.ok || !data.success || !Array.isArray(data.images)) {\n                throw new Error('Invalid gallery preview response');\n            }\n\n            \/* Never let a late preview response overwrite the unlocked gallery. *\/\n            if (galleryUnlocked) {\n                return;\n            }\n\n            allImages = data.images;\n            renderFilteredGallery();\n\n        } catch (error) {\n\n            if (galleryUnlocked) {\n                return;\n            }\n\n            console.error('PADELCREATIONS gallery preview:', error);\n\n            grid.innerHTML = '';\n            setEmpty('gallery.unavailable');\n        }\n    }\n\n\n    \/* =====================================================\n       PROTECTED FULL GALLERY\n    ===================================================== *\/\n\n    async function loadFullGallery(accessCode) {\n\n        accessCode = String(accessCode || '').trim();\n\n        if (!accessCode) {\n            return;\n        }\n\n        setEmpty('gallery.unlocking');\n\n        try {\n\n            const response = await fetch(FULL_ENDPOINT, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application\/json' },\n                body: JSON.stringify({ access_code: accessCode, language: I.lang })\n            });\n\n            const data = await response.json();\n\n            if (!response.ok || !data.success || !Array.isArray(data.images)) {\n                throw new Error(data.message || t('gallery.unlockError'));\n            }\n\n            \/* Only mark unlocked AFTER the protected endpoint accepted the code. *\/\n            galleryUnlocked = true;\n            allImages = data.images;\n\n            if (lockMessage) {\n                lockMessage.style.display = 'none';\n            }\n\n            renderFilteredGallery();\n\n        } catch (error) {\n\n            console.error('PADELCREATIONS protected gallery:', error);\n\n            \/* Fall back to the public teaser. *\/\n            galleryUnlocked = false;\n\n            if (lockMessage) {\n                lockMessage.style.display = 'flex';\n            }\n\n            await loadPreviewGallery();\n        }\n    }\n\n\n    \/* =====================================================\n       FILTER BY CURRENT APPLICATION\n    ===================================================== *\/\n\n    function getSelectedEnvironment() {\n        const active = document.querySelector('#pc-environment button.active');\n        return active ? active.dataset.value : 'outdoor';\n    }\n\n    function getSelectedAudience() {\n        const active = document.querySelector('#pc-example-audience-toggle .pc-audience-button.active');\n        return active ? active.dataset.audience : 'residential';\n    }\n\n    function getFilteredImages() {\n\n        const selectedApplication = applicationSelect.value;\n        const selectedEnvironment = getSelectedEnvironment();\n\n        let allowedApplicationValues = APPLICATION_METADATA[selectedApplication] || [];\n\n        if (selectedApplication === 'private-house') {\n            allowedApplicationValues = [getSelectedAudience()];\n        }\n\n        return allImages.filter(function (image) {\n\n            if (\n                !image.metadata ||\n                !Array.isArray(image.metadata.application) ||\n                !Array.isArray(image.metadata.environment)\n            ) {\n                return false;\n            }\n\n            const applicationMatches = image.metadata.application.some(function (value) {\n                return allowedApplicationValues.includes(value);\n            });\n\n            const environmentMatches = image.metadata.environment.includes(selectedEnvironment);\n\n            return applicationMatches && environmentMatches;\n        });\n    }\n\n\n    \/* =====================================================\n       RENDER FILTERED GALLERY\n    ===================================================== *\/\n\n    function updateGalleryHeading() {\n\n        if (!galleryHeading) return;\n\n        const selectedApplication = applicationSelect.value;\n\n        const appKey = selectedApplication === 'private-house'\n            ? 'gallery.app.' + getSelectedAudience()\n            : 'gallery.app.' + selectedApplication;\n\n        galleryHeading.textContent = t('gallery.heading', {\n            env: t('env.' + getSelectedEnvironment()),\n            app: t(appKey)\n        });\n    }\n\n    function renderFilteredGallery() {\n\n        const filteredImages = getFilteredImages();\n\n        currentFilteredImages = filteredImages;\n\n        const visibleImages = currentFilteredImages.slice(0, galleryVisibleLimit);\n\n        grid.innerHTML = '';\n\n        updateGalleryHeading();\n\n        if (filteredImages.length === 0) {\n            setEmpty('gallery.empty');\n            galleryMoreWrap.style.display = 'none';\n            return;\n        }\n\n        empty.style.display = 'none';\n\n        visibleImages.forEach(function (image, imageIndex) {\n\n            const card = document.createElement('div');\n            card.className = 'pc-gallery-card';\n\n            if (!galleryUnlocked) {\n                card.classList.add('pc-gallery-locked');\n            }\n\n            const img = document.createElement('img');\n\n            \/* Preview endpoint returns \"preview\"; protected endpoint returns \"thumbnail\". *\/\n            img.src = galleryUnlocked ? image.thumbnail : image.preview;\n            img.alt = t('gallery.imgAlt');\n            img.loading = 'lazy';\n            img.decoding = 'async';\n\n            card.appendChild(img);\n\n            if (!galleryUnlocked) {\n\n                \/* LOCKED: only the small information icon. *\/\n\n                const info = document.createElement('div');\n                info.className = 'pc-gallery-info';\n                info.setAttribute('aria-label', t('gallery.lockedAria'));\n\n                info.textContent = 'i';\n\n                const tooltip = document.createElement('span');\n                tooltip.className = 'pc-gallery-info-tooltip';\n                tooltip.textContent = t('gallery.locked');\n                info.appendChild(tooltip);\n\n                card.appendChild(info);\n\n            } else {\n\n                \/* UNLOCKED: View button + clickable card. *\/\n\n                const viewButton = document.createElement('button');\n                viewButton.type = 'button';\n                viewButton.className = 'pc-gallery-view';\n                viewButton.setAttribute('aria-label', t('gallery.viewAria'));\n                viewButton.setAttribute('title', t('gallery.view'));\n\n                viewButton.innerHTML =\n                    '<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\">' +\n                        '<path 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\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>' +\n                        '<circle cx=\"12\" cy=\"12\" r=\"2.7\" stroke-width=\"2\"\/>' +\n                    '<\/svg>';\n\n                viewButton.addEventListener('click', function (event) {\n                    event.stopPropagation();\n                    openLightbox(imageIndex);\n                });\n\n                card.appendChild(viewButton);\n\n                card.addEventListener('click', function () {\n                    openLightbox(imageIndex);\n                });\n            }\n\n            grid.appendChild(card);\n        });\n\n        if (currentFilteredImages.length > GALLERY_INITIAL_LIMIT) {\n\n            galleryMoreWrap.style.display = 'flex';\n\n            galleryMoreButton.style.display =\n                galleryVisibleLimit < currentFilteredImages.length ? 'inline-flex' : 'none';\n\n            galleryLessButton.style.display =\n                galleryVisibleLimit > GALLERY_INITIAL_LIMIT ? 'inline-flex' : 'none';\n\n        } else {\n\n            galleryMoreWrap.style.display = 'none';\n        }\n    }\n\n\n    \/* =====================================================\n       FILTER UPDATES\n    ===================================================== *\/\n\n    function resetAndRender() {\n        galleryVisibleLimit = GALLERY_INITIAL_LIMIT;\n        renderFilteredGallery();\n    }\n\n    applicationSelect.addEventListener('change', resetAndRender);\n\n    document.querySelectorAll('#pc-environment button').forEach(function (button) {\n        button.addEventListener('click', function () {\n            setTimeout(resetAndRender, 0);\n        });\n    });\n\n    document.querySelectorAll('#pc-example-audience-toggle .pc-audience-button').forEach(function (button) {\n        button.addEventListener('click', function () {\n            setTimeout(resetAndRender, 0);\n        });\n    });\n\n    galleryMoreButton.addEventListener('click', function () {\n        galleryVisibleLimit += GALLERY_LOAD_MORE;\n        renderFilteredGallery();\n    });\n\n    galleryLessButton.addEventListener('click', function () {\n\n        galleryVisibleLimit = GALLERY_INITIAL_LIMIT;\n        renderFilteredGallery();\n\n        const gallery = document.getElementById('pc-inspiration-gallery');\n\n        if (gallery) {\n            gallery.scrollIntoView({ behavior: 'smooth', block: 'start' });\n        }\n    });\n\n    \/* Language change: re-render headings, tooltips and labels. *\/\n    I.onChange(function () {\n        if (allImages.length) {\n            renderFilteredGallery();\n        } else {\n            updateGalleryHeading();\n        }\n    });\n\n\n    \/* =====================================================\n       UNLOCK EVENTS FROM THE DESIGNER\n    ===================================================== *\/\n\n    document.addEventListener('pcDesignerUnlocked', function (event) {\n        loadFullGallery(event.detail && event.detail.accessCode ? event.detail.accessCode : '');\n    });\n\n    document.addEventListener('pcGalleryUnlocked', function (event) {\n        loadFullGallery(event.detail.accessCode);\n    });\n\n\n    \/* =====================================================\n       GALLERY UNLOCK\n    ===================================================== *\/\n\n    async function unlockGallery() {\n\n        const code = galleryAccessInput.value.trim();\n\n        setGalleryAccessStatus('', function (el) { el.textContent = ''; });\n\n        if (!code) {\n            setGalleryAccessStatus('invalid', function (el) { el.textContent = t('access.empty'); });\n            return;\n        }\n\n        galleryUnlockButton.disabled = true;\n        galleryUnlockButton.textContent = '\u2026';\n\n        try {\n\n            const response = await fetch(ACCESS_ENDPOINT, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application\/json' },\n                body: JSON.stringify({ access_code: code, language: I.lang })\n            });\n\n            const data = await response.json();\n\n            if (!response.ok || data.valid !== true) {\n                throw new Error(data.message || t('access.invalid'));\n            }\n\n            setGalleryAccessStatus('valid', function (el) { el.textContent = t('gallery.unlocked'); });\n\n            await loadFullGallery(code);\n\n        } catch (error) {\n\n            const message = error.message;\n\n            setGalleryAccessStatus('invalid', function (el) {\n                el.textContent = message || t('gallery.unlockError');\n            });\n\n        } finally {\n\n            galleryUnlockButton.disabled = false;\n            galleryUnlockButton.textContent = '\u2192';\n        }\n    }\n\n    galleryUnlockButton.addEventListener('click', unlockGallery);\n\n    galleryAccessInput.addEventListener('keydown', function (event) {\n        if (event.key === 'Enter') {\n            event.preventDefault();\n            unlockGallery();\n        }\n    });\n\n\n    \/* =====================================================\n       LIGHTBOX\n    ===================================================== *\/\n\n    function openLightbox(index) {\n\n        if (!galleryUnlocked || !currentFilteredImages.length || index < 0) {\n            return;\n        }\n\n        currentImageIndex = index;\n\n        const image = currentFilteredImages[currentImageIndex];\n\n        if (!image || !image.url) {\n            return;\n        }\n\n        currentGalleryImageUrl = image.url;\n        lightboxImage.src = image.url;\n        lightbox.classList.add('is-open');\n        document.body.style.overflow = 'hidden';\n    }\n\n    function showNextImage() {\n        if (!galleryUnlocked || !currentFilteredImages.length) return;\n        currentImageIndex = (currentImageIndex + 1) % currentFilteredImages.length;\n        openLightbox(currentImageIndex);\n    }\n\n    function showPreviousImage() {\n        if (!galleryUnlocked || !currentFilteredImages.length) return;\n        currentImageIndex = (currentImageIndex - 1 + currentFilteredImages.length) % currentFilteredImages.length;\n        openLightbox(currentImageIndex);\n    }\n\n    next.addEventListener('click', function (event) {\n        event.stopPropagation();\n        showNextImage();\n    });\n\n    prev.addEventListener('click', function (event) {\n        event.stopPropagation();\n        showPreviousImage();\n    });\n\n    function closeLightbox() {\n        lightbox.classList.remove('is-open');\n        lightboxImage.src = '';\n        currentGalleryImageUrl = '';\n        document.body.style.overflow = '';\n    }\n\n    close.addEventListener('click', closeLightbox);\n\n    lightbox.addEventListener('click', function (event) {\n        if (event.target === lightbox) {\n            closeLightbox();\n        }\n    });\n\n    document.addEventListener('keydown', function (event) {\n\n        if (!lightbox.classList.contains('is-open')) {\n            return;\n        }\n\n        if (event.key === 'Escape') closeLightbox();\n        else if (event.key === 'ArrowRight') showNextImage();\n        else if (event.key === 'ArrowLeft') showPreviousImage();\n    });\n\n\n    \/* =====================================================\n       DOWNLOAD\n    ===================================================== *\/\n\n    function setDownloadState(state) {\n        downloadState = state;\n        if (state === 'busy') download.textContent = t('lightbox.downloading');\n        else if (state === 'failed') download.textContent = t('lightbox.failed');\n        else download.innerHTML = t('lightbox.download');\n    }\n\n    download.addEventListener('click', async function () {\n\n        if (!galleryUnlocked || !currentGalleryImageUrl) {\n            return;\n        }\n\n        try {\n\n            download.disabled = true;\n            setDownloadState('busy');\n\n            const response = await fetch(currentGalleryImageUrl, { mode: 'cors', cache: 'no-store' });\n\n            if (!response.ok) {\n                throw new Error('Image request failed.');\n            }\n\n            const blob = await response.blob();\n            const objectUrl = URL.createObjectURL(blob);\n            const link = document.createElement('a');\n\n            const now = new Date();\n            const pad = function (n) { return String(n).padStart(2, '0'); };\n\n            const timestamp =\n                now.getFullYear() + pad(now.getMonth() + 1) + pad(now.getDate()) +\n                '-' +\n                pad(now.getHours()) + pad(now.getMinutes()) + pad(now.getSeconds());\n\n            const dlKey = 'dl.' + applicationSelect.value;\n            const applicationName = t(dlKey) !== dlKey ? t(dlKey) : t('dl.default');\n\n            link.href = objectUrl;\n            link.download = timestamp + ' - ' + t('lightbox.filename', { app: applicationName }) + '.png';\n\n            document.body.appendChild(link);\n            link.click();\n            link.remove();\n\n            setTimeout(function () {\n                URL.revokeObjectURL(objectUrl);\n            }, 1000);\n\n            setDownloadState('idle');\n\n        } catch (error) {\n\n            console.error('PADELCREATIONS gallery download:', error);\n            setDownloadState('failed');\n\n        } finally {\n\n            setTimeout(function () {\n                download.disabled = false;\n                setDownloadState('idle');\n            }, 1600);\n        }\n    });\n\n\n    \/* =====================================================\n       START WITH PUBLIC PREVIEW\n    ===================================================== *\/\n\n    loadPreviewGallery();\n\n})();\n\n<\/script>\n\n<!-- \/PadelCreations Tools: space-designer --><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-59c9f5e elementor-widget elementor-widget-shortcode\" data-id=\"59c9f5e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- PadelCreations Tools: 3d-space-designer-faq-popup -->\n<!-- PadelCreations \u00b7 FAQ - 3D Space Designer (EN + DE, popup, language detected automatically) \u00b7 paste into an Elementor HTML widget -->\n<div class=\"pcfaq pcfaq--compact pcfaq--popup\" id=\"pcfaq-designer\">\n<style>\n.pcfaq{--navy:#0D2B55;--navy-d:#092546;--accent:#558833;--hl:#558833;--hl-soft:#EEF3E8;--blue:#1E7BF0;--ink:#1B2433;--muted:#5B6678;--line:#E3E8EF;--bg:#F5F7FA;--card:#fff;\n  font-family:inherit;color:var(--ink);max-width:960px;margin:0 auto;padding:0 16px;box-sizing:border-box;line-height:1.6}\n.pcfaq *,.pcfaq *::before,.pcfaq *::after{box-sizing:border-box}\n.pcfaq-hero{text-align:center;padding:48px 0 28px}\n.pcfaq-eyebrow{display:inline-block;font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:10px}\n.pcfaq-hero h2{font-size:clamp(28px,4vw,40px);line-height:1.15;margin:0 0 12px;color:var(--navy);font-weight:800}\n.pcfaq-hero p{margin:0 auto;max-width:620px;color:var(--muted);font-size:17px}\n.pcfaq-search{position:relative;max-width:620px;margin:26px auto 0}\n.pcfaq-search svg{position:absolute;left:18px;top:50%;transform:translateY(-50%);width:20px;height:20px;stroke:var(--muted);pointer-events:none}\n.pcfaq-search input{width:100%;height:56px;border:1.5px solid var(--line);border-radius:999px;padding:0 52px;font:inherit;font-size:16px;color:var(--ink);background:var(--card);box-shadow:0 6px 24px rgba(13,43,85,.07);outline:none;transition:border-color .2s,box-shadow .2s}\n.pcfaq-search input:focus{border-color:var(--navy);box-shadow:0 6px 24px rgba(13,43,85,.14)}\n.pcfaq-search input::-webkit-search-cancel-button{-webkit-appearance:none;display:none}\n.pcfaq-clear{position:absolute;right:12px;top:50%;transform:translateY(-50%);border:0;background:var(--bg);color:var(--muted);width:32px;height:32px;border-radius:50%;cursor:pointer;font-size:18px;line-height:1;display:none}\n.pcfaq-clear.show{display:block}\n.pcfaq-bar{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:22px 0 8px}\n.pcfaq-chip{border:1.5px solid var(--line);background:var(--card);color:var(--navy);font:inherit;font-size:14px;font-weight:600;padding:8px 14px;border-radius:999px;cursor:pointer;transition:all .15s}\n.pcfaq-chip span{display:inline-block;min-width:22px;margin-left:4px;padding:0 6px;border-radius:999px;background:var(--bg);color:var(--muted);font-size:12px}\n.pcfaq-chip:hover{border-color:var(--navy)}\n.pcfaq-chip.is-active{background:var(--navy);border-color:var(--navy);color:#fff}\n.pcfaq-chip.is-active span{background:rgba(255,255,255,.18);color:#fff}\n.pcfaq-tools{display:flex;justify-content:space-between;align-items:center;margin:14px 0 4px;font-size:14px;color:var(--muted)}\n.pcfaq-toggle{border:0;background:none;color:var(--navy);font:inherit;font-size:14px;font-weight:600;cursor:pointer;padding:6px 0;text-decoration:underline;text-underline-offset:3px}\n.pcfaq-group{margin-top:28px}\n.pcfaq-group[hidden]{display:none}\n.pcfaq-gt{font-size:13px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:0 0 10px;padding-left:4px}\n.pcfaq-item{background:var(--card);border:1px solid var(--line);border-radius:14px;margin-bottom:10px;transition:box-shadow .2s,border-color .2s}\n.pcfaq-item[hidden]{display:none}\n.pcfaq-item{scroll-margin-top:170px}\n.pcfaq-item.is-open{border-color:rgba(13,43,85,.35);box-shadow:0 8px 28px rgba(13,43,85,.08)}\n.pcfaq-q{margin:0;font-size:inherit}\n.pcfaq-q button{all:unset;box-sizing:border-box;display:flex;width:100%;align-items:center;gap:16px;padding:18px 20px;cursor:pointer;font-size:17px;font-weight:650;color:var(--navy);line-height:1.4}\n.pcfaq-q button:focus-visible{outline:3px solid var(--blue);outline-offset:-3px;border-radius:14px}\n.pcfaq-qt{flex:1}\n.pcfaq-ic{flex:none;width:30px;height:30px;border-radius:50%;background:var(--bg);position:relative;transition:background .2s,transform .25s}\n.pcfaq-ic::before,.pcfaq-ic::after{content:\"\";position:absolute;left:50%;top:50%;width:12px;height:2px;background:var(--navy);border-radius:2px;transform:translate(-50%,-50%);transition:transform .25s,background .2s}\n.pcfaq-ic::after{transform:translate(-50%,-50%) rotate(90deg)}\n.pcfaq-item.is-open .pcfaq-ic{background:var(--navy)}\n.pcfaq-item.is-open .pcfaq-ic::before,.pcfaq-item.is-open .pcfaq-ic::after{background:#fff}\n.pcfaq-item.is-open .pcfaq-ic::after{transform:translate(-50%,-50%) rotate(0)}\n.pcfaq-ai{padding:0 20px 20px;color:#344054;font-size:16px}\n.pcfaq-ai p{margin:0 0 12px}\n.pcfaq-ai ul,.pcfaq-ai ol{margin:0 0 12px;padding-left:22px}\n.pcfaq-ai li{margin-bottom:6px}\n.pcfaq-ai strong{color:var(--navy)}\n.pcfaq .pcfaq-ai a:not(.pcfaq-link){color:var(--hl)!important;font-weight:600;text-decoration:underline;text-underline-offset:3px}\n.pcfaq-link{display:inline-block;font-size:13px;color:var(--muted);text-decoration:none;border-bottom:1px dashed currentColor}\n.pcfaq-link:hover{color:var(--navy)}\n.pcfaq mark{background:#E3EDD8;color:inherit;padding:0 2px;border-radius:3px}\n.pcfaq-empty{display:none;text-align:center;padding:40px 16px;color:var(--muted)}\n.pcfaq-empty.show{display:block}\n.pcfaq-empty strong{display:block;color:var(--navy);font-size:18px;margin-bottom:6px}\n.pcfaq-cta{margin:44px 0 56px;background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);color:#fff;border-radius:20px;padding:36px 28px;display:flex;flex-wrap:wrap;gap:20px;align-items:center;justify-content:space-between}\n.pcfaq-cta h3{margin:0 0 6px;font-size:24px;color:#fff}\n.pcfaq-cta p{margin:0;color:rgba(255,255,255,.8);max-width:520px}\n.pcfaq-btn{display:inline-block;background:var(--accent);color:#fff;text-decoration:none;font-weight:700;padding:14px 26px;border-radius:999px;transition:transform .15s,box-shadow .15s;white-space:nowrap}\n.pcfaq-btn:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(85,136,51,.4);color:#fff}\n.pcfaq-toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,20px);background:var(--navy);color:#fff;padding:10px 18px;border-radius:999px;font-size:14px;opacity:0;pointer-events:none;transition:all .25s;z-index:9999}\n.pcfaq-toast.show{opacity:1;transform:translate(-50%,0)}\n\/* shield against theme\/Elementor button styles *\/\n.pcfaq .pcfaq-q button,.pcfaq .pcfaq-q button:hover,.pcfaq .pcfaq-q button:focus,.pcfaq .pcfaq-q button:active{background:transparent!important;color:var(--navy)!important;border:0!important;box-shadow:none!important;text-transform:none!important;letter-spacing:normal!important}\n.pcfaq .pcfaq-q button:hover .pcfaq-qt{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}\n.pcfaq .pcfaq-toggle,.pcfaq .pcfaq-toggle:hover,.pcfaq .pcfaq-toggle:focus{background:transparent!important;color:var(--navy)!important;border:0!important;box-shadow:none!important}\n.pcfaq .pcfaq-chip:hover,.pcfaq .pcfaq-chip:focus{background:var(--card)!important;color:var(--navy)!important}\n.pcfaq .pcfaq-chip.is-active,.pcfaq .pcfaq-chip.is-active:hover,.pcfaq .pcfaq-chip.is-active:focus{background:var(--navy)!important;color:#fff!important}\n.pcfaq .pcfaq-clear:hover,.pcfaq .pcfaq-clear:focus{background:var(--bg)!important;color:var(--muted)!important}\n\/* green highlight for hovered \/ open questions *\/\n.pcfaq .pcfaq-item{overflow:hidden}\n.pcfaq .pcfaq-q button:hover,.pcfaq .pcfaq-q button:focus{background:var(--hl-soft)!important;color:var(--navy)!important}\n.pcfaq .pcfaq-q button:hover .pcfaq-qt{text-decoration:none}\n.pcfaq .pcfaq-item.is-open .pcfaq-q button,.pcfaq .pcfaq-item.is-open .pcfaq-q button:hover,.pcfaq .pcfaq-item.is-open .pcfaq-q button:focus{background:var(--hl)!important;color:#fff!important}\n.pcfaq .pcfaq-item.is-open .pcfaq-ic{background:#fff}\n.pcfaq .pcfaq-item.is-open .pcfaq-ic::before,.pcfaq .pcfaq-item.is-open .pcfaq-ic::after{background:var(--hl)}\n.pcfaq .pcfaq-item.is-open{border-color:var(--hl)}\n.pcfaq .pcfaq-item.is-open .pcfaq-ai{padding-top:16px}\n.pcfaq a.pcfaq-btn,.pcfaq a.pcfaq-btn:link,.pcfaq a.pcfaq-btn:visited{color:#fff!important;background:var(--accent)!important;text-decoration:none!important}\n.pcfaq a.pcfaq-btn:hover,.pcfaq a.pcfaq-btn:focus{color:var(--accent)!important;background:#fff!important}\n.pcfaq--compact .pcfaq-hero{text-align:left;padding:32px 0 8px}\n.pcfaq--compact .pcfaq-hero h2{font-size:clamp(24px,3vw,30px);margin-bottom:8px}\n.pcfaq--compact .pcfaq-hero p{margin:0;font-size:16px;max-width:none}\n.pcfaq--compact .pcfaq-group{margin-top:16px}\n.pcfaq-cta--slim{margin:24px 0 40px;padding:20px 24px;border-radius:16px}\n.pcfaq-cta--slim p{color:#fff;font-weight:600;font-size:17px}\n@media (max-width:600px){.pcfaq-hero{padding-top:32px}.pcfaq-q button{padding:16px;font-size:16px}.pcfaq-ai{padding:0 16px 16px}.pcfaq-cta{padding:28px 20px}.pcfaq-bar{justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;padding-bottom:6px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px;scrollbar-width:none}.pcfaq-bar::-webkit-scrollbar{display:none}.pcfaq-chip{flex:none}}\n\/* ---- popup mode ---- *\/\n.pcfaq--popup{padding:0;max-width:none;margin:16px 0;text-align:center}\n.pcfaq .pcfaq-trigger,.pcfaq .pcfaq-trigger:hover,.pcfaq .pcfaq-trigger:focus{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:10px;cursor:pointer;padding:10px 18px 10px 10px;border:1.5px solid var(--hl)!important;border-radius:999px;background:#fff!important;color:var(--navy)!important;font:inherit;font-weight:600;font-size:15px;line-height:1.3;transition:background .15s,color .15s}\n.pcfaq .pcfaq-trigger:hover,.pcfaq .pcfaq-trigger:focus-visible{background:var(--hl-soft)!important}\n.pcfaq .pcfaq-trigger:focus-visible{outline:3px solid var(--blue);outline-offset:2px}\n.pcfaq-trigger-ic{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:var(--hl);color:#fff;font-weight:800;font-size:15px}\n.pcfaq-modal{position:fixed;inset:0;z-index:2147483000;max-width:none;margin:0;padding:0;display:flex;align-items:center;justify-content:center}\n.pcfaq-modal[hidden]{display:none}\n.pcfaq-backdrop{position:absolute;inset:0;background:rgba(9,37,70,.6);opacity:0;transition:opacity .2s}\n.pcfaq-dialog{position:relative;width:min(880px,calc(100% - 32px));max-height:min(86vh,900px);background:#fff;border-radius:20px;box-shadow:0 24px 80px rgba(9,37,70,.35);display:flex;flex-direction:column;opacity:0;transform:translateY(16px) scale(.98);transition:opacity .2s,transform .2s}\n.pcfaq-modal.is-in .pcfaq-backdrop{opacity:1}\n.pcfaq-modal.is-in .pcfaq-dialog{opacity:1;transform:none}\n.pcfaq-box{overflow-y:auto;overscroll-behavior:contain;padding:0 28px 8px;border-radius:20px}\n.pcfaq-box .pcfaq-hero{padding-top:28px;padding-right:48px}\n.pcfaq-box .pcfaq-cta{margin-bottom:24px}\n.pcfaq .pcfaq-x,.pcfaq .pcfaq-x:hover,.pcfaq .pcfaq-x:focus{all:unset;position:absolute;top:14px;right:14px;z-index:2;width:38px;height:38px;border-radius:50%;background:var(--bg)!important;color:var(--navy)!important;font-size:24px;line-height:38px;text-align:center;cursor:pointer}\n.pcfaq .pcfaq-x:hover{background:var(--hl-soft)!important}\n.pcfaq .pcfaq-x:focus-visible{outline:3px solid var(--blue)}\nhtml.pcfaq-lock,html.pcfaq-lock body{overflow:hidden!important}\n@media (max-width:600px){.pcfaq-modal{align-items:flex-end}.pcfaq-dialog{width:100%;max-height:92vh;border-radius:20px 20px 0 0}.pcfaq-box{padding:0 16px 8px}}\n@media (prefers-reduced-motion:reduce){.pcfaq *{transition:none!important}}\n\/* Hide nonmatching translations even before JavaScript runs. *\/\n.pcfaq-language{display:none!important}\n.pcfaq-language[hidden]{display:none!important}\n<\/style>\n<section class=\"pcfaq-language\" data-lang=\"en\" data-ltrig=\"Questions about the 3D Space Designer? Read the FAQ\" data-lclose=\"Close\">\n  <header class=\"pcfaq-hero\">\n    <span class=\"pcfaq-eyebrow\">3D Space Designer \u00b7 FAQ<\/span>\n    <h2>3D Space Designer<\/h2>\n    <p>Get inspired with AI-generated mood images of your future padel club.<\/p>\n  <\/header>\n\n  <div class=\"pcfaq-tools\">\n    <span class=\"pcfaq-count\" aria-live=\"polite\"><\/span>\n    <button type=\"button\" class=\"pcfaq-toggle\" data-state=\"closed\">Expand all<\/button>\n  <\/div>\n\n  <div class=\"pcfaq-list\">\n    <section class=\"pcfaq-group\" data-cat=\"designer\">\n      <div class=\"pcfaq-item\" id=\"faq-designer-what\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-designer-what-a\" id=\"faq-designer-what-q\"><span class=\"pcfaq-qt\">What is the 3D Space Designer?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-designer-what-a\" role=\"region\" aria-labelledby=\"faq-designer-what-q\" hidden><div class=\"pcfaq-ai\"><p>The 3D Space Designer is an inspiration tool. Using artificial intelligence, it creates photorealistic mood images of a padel club based on your description &ndash; indoor hall, outdoor complex, rooftop, surroundings, colours. You can also upload photos of your own space, so the tool recreates your specific environment. It helps you explore styles and ideas and share a first impression of your vision.<\/p><p>Please note: the 3D Space Designer does not create images from your 2D Planner layout. We tested this, but the results were not accurate enough to meet our standards, so we removed the option. To visualise your exact layout, use the <a href=\"#faq-3d-view\">3D view<\/a> of the 2D Planner &ndash; or let our team create a <a href=\"#faq-project-renders\">precise render of your project<\/a> for &euro;850, fully credited against your court order once your project goes ahead.<\/p><a class=\"pcfaq-link\" href=\"#faq-designer-what\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-gallery\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-gallery-a\" id=\"faq-gallery-q\"><span class=\"pcfaq-qt\">Can I see examples before creating my own?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-gallery-a\" role=\"region\" aria-labelledby=\"faq-gallery-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. The 3D Space Designer includes an <strong>inspiration gallery<\/strong> with concepts created with PADELCREATIONS courts. The gallery is filtered automatically by the starting point you choose:<\/p><ul><li>Tennis Club<\/li><li>Padel Stand-Alone Club<\/li><li>Leisure &amp; Sports Facilities<\/li><li>Residential &amp; Corporate<\/li><\/ul><p>Together with your choice of indoor or outdoor, you instantly see ideas that match your type of project &ndash; for example, outdoor padel courts next to the clay courts of a tennis club. Browse the gallery first to find a style you like, then create your own images.<\/p><a class=\"pcfaq-link\" href=\"#faq-gallery\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-own-space\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-own-space-a\" id=\"faq-own-space-q\"><span class=\"pcfaq-qt\">Can the Designer show my actual hall or plot?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-own-space-a\" role=\"region\" aria-labelledby=\"faq-own-space-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. Upload <strong>up to 5 photos<\/strong> of your space &ndash; for example the empty hall, the plot, the building facade or the surroundings &ndash; and the 3D Space Designer recreates your specific environment with padel courts in it. This gives you a much more realistic impression of how your club could look on site.<\/p><p>Please keep in mind that, depending on the photo &ndash; angle, distance, lens or lighting &ndash; the size and proportions of the courts in relation to your space are not always accurate. Just try different photos and see which ones give you the best result.<\/p><a class=\"pcfaq-link\" href=\"#faq-own-space\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-best-results\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-best-results-a\" id=\"faq-best-results-q\"><span class=\"pcfaq-qt\">How do I get the best results?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-best-results-a\" role=\"region\" aria-labelledby=\"faq-best-results-q\" hidden><div class=\"pcfaq-ai\"><ul><li><strong>Start with the gallery:<\/strong> choose your starting point and browse the inspiration images to find a style you like.<\/li><li><strong>Use good photos:<\/strong> well-lit, sharp images taken from different angles, showing the whole space where the courts will go.<\/li><li><strong>Describe precisely:<\/strong> number of courts, type of space (indoor hall, outdoor complex, rooftop), materials and colours, lighting, time of day and special features such as a lounge, bar or spectator area.<\/li><li><strong>Change one thing at a time:<\/strong> if you want a variant, adjust your description step by step instead of starting from scratch.<\/li><\/ul><a class=\"pcfaq-link\" href=\"#faq-best-results\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-designer-accuracy\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-designer-accuracy-a\" id=\"faq-designer-accuracy-q\"><span class=\"pcfaq-qt\">How accurate are the generated images?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-designer-accuracy-a\" role=\"region\" aria-labelledby=\"faq-designer-accuracy-q\" hidden><div class=\"pcfaq-ai\"><p>Think of them as inspiration, not as a true-to-scale representation. AI image generation does not reproduce dimensions exactly: court positions, proportions, structures or the number of elements may differ from reality. The images are great for conveying atmosphere, style and concept.<\/p><p>For an exact visualisation of your project, see <a href=\"#faq-project-renders\">project-specific renders<\/a> below.<\/p><a class=\"pcfaq-link\" href=\"#faq-designer-accuracy\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-why-limit\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-why-limit-a\" id=\"faq-why-limit-q\"><span class=\"pcfaq-qt\">Why can I only create 3 images per day?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-why-limit-a\" role=\"region\" aria-labelledby=\"faq-why-limit-q\" hidden><div class=\"pcfaq-ai\"><p>Every image is rendered with a high-end AI model. The fair-use limit of 3 AI generations per 24 hours &ndash; shared between the 3D Space Designer and the AI image button in the 2D Planner &ndash; keeps the tools fast and available for everyone. Tip: prepare your photos, captures and description carefully before generating &ndash; it makes every creation count.<\/p><a class=\"pcfaq-link\" href=\"#faq-why-limit\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-use-images\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-use-images-a\" id=\"faq-use-images-q\"><span class=\"pcfaq-qt\">Can I use the images for presentations or investors?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-use-images-a\" role=\"region\" aria-labelledby=\"faq-use-images-q\" hidden><div class=\"pcfaq-ai\"><p>Yes, as inspiration and mood images &ndash; for example in an early business plan, on social media or in first conversations with partners. Because they are not exact, they should not be presented as the final design, and they are not suitable for permits or construction. When you need images that show your exact layout, use the image captures from the <a href=\"#faq-3d-view\">3D view of the 2D Planner<\/a> &ndash; or ask us for a <a href=\"#faq-project-renders\">project-specific render<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-use-images\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-images-saved\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-images-saved-a\" id=\"faq-images-saved-q\"><span class=\"pcfaq-qt\">Are my images saved?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-images-saved-a\" role=\"region\" aria-labelledby=\"faq-images-saved-q\" hidden><div class=\"pcfaq-ai\"><p>Yes. Generated images are stored securely on our servers, so our team can refer to them when we work on your project. Download any image you want to keep on your own device.<\/p><a class=\"pcfaq-link\" href=\"#faq-images-saved\" data-copy>Copy link to this answer<\/a><\/div><\/div>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <div class=\"pcfaq-empty\"><strong>No matching questions<\/strong>Try another word &ndash; or simply ask us directly below.<\/div>\n  <aside class=\"pcfaq-cta pcfaq-cta--slim\">\n    <p>Still have a question about your project?<\/p>\n    <a class=\"pcfaq-btn\" href=\"https:\/\/www.padelcreations.com\/contact\/\">Contact our team<\/a>\n  <\/aside>\n  <div class=\"pcfaq-toast\" role=\"status\">Link copied<\/div>\n<\/section>\n<section class=\"pcfaq-language\" data-lang=\"de\" data-lq=\" Fragen\" data-lof=\" von \" data-lex=\"Alle erweitern\" data-lco=\"Alle schlie\u00dfen\" data-ltrig=\"Fragen zum 3D Space Designer? Zu den FAQ\" data-lclose=\"Schlie\u00dfen\">\n  <header class=\"pcfaq-hero\">\n    <span class=\"pcfaq-eyebrow\">3D Space Designer \u00b7 FAQ<\/span>\n    <h2>3D Space Designer<\/h2>\n    <p>Lassen Sie sich von KI-generierten Stimmungsbildern Ihres zuk\u00fcnftigen Padel-Clubs inspirieren.<\/p>\n  <\/header>\n\n  <div class=\"pcfaq-tools\">\n    <span class=\"pcfaq-count\" aria-live=\"polite\"><\/span>\n    <button type=\"button\" class=\"pcfaq-toggle\" data-state=\"closed\">Alle erweitern<\/button>\n  <\/div>\n\n  <div class=\"pcfaq-list\">\n    <section class=\"pcfaq-group\" data-cat=\"designer\">\n      <div class=\"pcfaq-item\" id=\"faq-designer-what\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-designer-what-a\" id=\"faq-designer-what-q\"><span class=\"pcfaq-qt\">Was ist der 3D Space Designer?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-designer-what-a\" role=\"region\" aria-labelledby=\"faq-designer-what-q\" hidden><div class=\"pcfaq-ai\"><p>Der 3D Space Designer ist ein Inspirationstool. Mithilfe k\u00fcnstlicher Intelligenz erstellt er fotorealistische Stimmungsbilder eines Padel-Clubs auf Basis Ihrer Beschreibung &ndash; Halle, Outdoor-Anlage, Dachterrasse, Umgebung, Farben. Sie k\u00f6nnen auch Fotos Ihres eigenen Raums hochladen, damit das Tool Ihre konkrete Umgebung nachbildet. So entdecken Sie Stile und Ideen und vermitteln einen ersten Eindruck Ihrer Vision.<\/p><p>Bitte beachten Sie: Der 3D Space Designer erstellt keine Bilder auf Basis Ihres 2D-Planer-Layouts. Wir haben das getestet, aber die Ergebnisse waren nicht genau genug f\u00fcr unsere Anspr\u00fcche, daher haben wir die Option entfernt. F\u00fcr Ihr exaktes Layout nutzen Sie die <a href=\"#faq-3d-view\">3D-Ansicht<\/a> des 2D-Planers &ndash; oder lassen Sie unser Team ein <a href=\"#faq-project-renders\">pr\u00e4zises Rendering Ihres Projekts<\/a> f\u00fcr 850&nbsp;&euro; erstellen, das bei Umsetzung Ihres Projekts vollst\u00e4ndig auf Ihren Auftrag angerechnet wird.<\/p><a class=\"pcfaq-link\" href=\"#faq-designer-what\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-gallery\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-gallery-a\" id=\"faq-gallery-q\"><span class=\"pcfaq-qt\">Kann ich Beispiele ansehen, bevor ich eigene Bilder erstelle?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-gallery-a\" role=\"region\" aria-labelledby=\"faq-gallery-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Der 3D Space Designer enth\u00e4lt eine <strong>Inspirationsgalerie<\/strong> mit Konzepten, die mit PADELCREATIONS-Pl\u00e4tzen erstellt wurden. Die Galerie wird automatisch nach dem gew\u00e4hlten Ausgangspunkt gefiltert:<\/p><ul><li>Tennis Club<\/li><li>Padel Stand-Alone Club<\/li><li>Leisure &amp; Sports Facilities<\/li><li>Residential &amp; Corporate<\/li><\/ul><p>Zusammen mit Ihrer Wahl von Indoor oder Outdoor sehen Sie sofort Ideen, die zu Ihrer Projektart passen &ndash; zum Beispiel Outdoor-Padelpl\u00e4tze neben den Sandpl\u00e4tzen eines Tennisclubs. St\u00f6bern Sie zuerst in der Galerie, um einen Stil zu finden, der Ihnen gef\u00e4llt, und erstellen Sie dann Ihre eigenen Bilder.<\/p><a class=\"pcfaq-link\" href=\"#faq-gallery\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-own-space\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-own-space-a\" id=\"faq-own-space-q\"><span class=\"pcfaq-qt\">Kann der Designer meine echte Halle oder mein Grundst\u00fcck zeigen?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-own-space-a\" role=\"region\" aria-labelledby=\"faq-own-space-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Laden Sie <strong>bis zu 5 Fotos<\/strong> Ihres Raums hoch &ndash; zum Beispiel die leere Halle, das Grundst\u00fcck, die Geb\u00e4udefassade oder die Umgebung &ndash; und der 3D Space Designer bildet Ihre konkrete Umgebung mit Padelpl\u00e4tzen nach. So erhalten Sie einen deutlich realistischeren Eindruck, wie Ihr Club vor Ort aussehen k\u00f6nnte.<\/p><p>Bitte beachten Sie, dass je nach Foto &ndash; Blickwinkel, Entfernung, Objektiv oder Licht &ndash; Gr\u00f6\u00dfe und Proportionen der Pl\u00e4tze im Verh\u00e4ltnis zu Ihrem Raum nicht immer genau sind. Probieren Sie einfach verschiedene Fotos aus und sehen Sie, welche das beste Ergebnis liefern.<\/p><a class=\"pcfaq-link\" href=\"#faq-own-space\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-best-results\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-best-results-a\" id=\"faq-best-results-q\"><span class=\"pcfaq-qt\">Wie erziele ich die besten Ergebnisse?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-best-results-a\" role=\"region\" aria-labelledby=\"faq-best-results-q\" hidden><div class=\"pcfaq-ai\"><ul><li><strong>Mit der Galerie beginnen:<\/strong> W\u00e4hlen Sie Ihren Ausgangspunkt und st\u00f6bern Sie in den Inspirationsbildern, um einen Stil zu finden, der Ihnen gef\u00e4llt.<\/li><li><strong>Gute Fotos verwenden:<\/strong> gut belichtete, scharfe Bilder aus verschiedenen Blickwinkeln, die den gesamten Bereich zeigen, in dem die Pl\u00e4tze entstehen sollen.<\/li><li><strong>Pr\u00e4zise beschreiben:<\/strong> Anzahl der Pl\u00e4tze, Art des Raums (Halle, Outdoor-Anlage, Dachterrasse), Materialien und Farben, Beleuchtung, Tageszeit und Besonderheiten wie Lounge, Bar oder Zuschauerbereich.<\/li><li><strong>Immer nur eine Sache \u00e4ndern:<\/strong> Wenn Sie eine Variante m\u00f6chten, passen Sie Ihre Beschreibung Schritt f\u00fcr Schritt an, statt neu zu beginnen.<\/li><\/ul><a class=\"pcfaq-link\" href=\"#faq-best-results\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-designer-accuracy\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-designer-accuracy-a\" id=\"faq-designer-accuracy-q\"><span class=\"pcfaq-qt\">Wie genau sind die erzeugten Bilder?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-designer-accuracy-a\" role=\"region\" aria-labelledby=\"faq-designer-accuracy-q\" hidden><div class=\"pcfaq-ai\"><p>Betrachten Sie sie als Inspiration, nicht als ma\u00dfstabsgetreue Darstellung. KI-Bildgenerierung gibt Ma\u00dfe nicht exakt wieder: Platzpositionen, Proportionen, Konstruktionen oder die Anzahl der Elemente k\u00f6nnen von der Realit\u00e4t abweichen. Die Bilder eignen sich hervorragend, um Atmosph\u00e4re, Stil und Konzept zu vermitteln.<\/p><p>F\u00fcr eine exakte Visualisierung Ihres Projekts siehe <a href=\"#faq-project-renders\">projektspezifische Renderings<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-designer-accuracy\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-why-limit\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-why-limit-a\" id=\"faq-why-limit-q\"><span class=\"pcfaq-qt\">Warum kann ich nur 3 Bilder pro Tag erstellen?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-why-limit-a\" role=\"region\" aria-labelledby=\"faq-why-limit-q\" hidden><div class=\"pcfaq-ai\"><p>Jedes Bild wird mit einem leistungsstarken KI-Modell erstellt. Das Fair-Use-Limit von 3 KI-Bildern pro 24 Stunden &ndash; gemeinsam f\u00fcr den 3D Space Designer und den KI-Bild-Button im 2D-Planer &ndash; h\u00e4lt die Tools schnell und f\u00fcr alle verf\u00fcgbar. Tipp: Bereiten Sie Fotos, Ansichten und Beschreibung sorgf\u00e4ltig vor &ndash; so z\u00e4hlt jedes Bild.<\/p><a class=\"pcfaq-link\" href=\"#faq-why-limit\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-use-images\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-use-images-a\" id=\"faq-use-images-q\"><span class=\"pcfaq-qt\">Kann ich die Bilder f\u00fcr Pr\u00e4sentationen oder Investoren verwenden?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-use-images-a\" role=\"region\" aria-labelledby=\"faq-use-images-q\" hidden><div class=\"pcfaq-ai\"><p>Ja, als Inspirations- und Stimmungsbilder &ndash; zum Beispiel in einem ersten Businessplan, in sozialen Medien oder in ersten Gespr\u00e4chen mit Partnern. Da sie nicht exakt sind, sollten sie nicht als endg\u00fcltiges Design pr\u00e4sentiert werden und eignen sich nicht f\u00fcr Genehmigungen oder den Bau. Wenn Sie Bilder Ihres exakten Layouts ben\u00f6tigen, nutzen Sie die Bildaufnahmen aus der <a href=\"#faq-3d-view\">3D-Ansicht des 2D-Planers<\/a> &ndash; oder fragen Sie uns nach einem <a href=\"#faq-project-renders\">projektspezifischen Rendering<\/a>.<\/p><a class=\"pcfaq-link\" href=\"#faq-use-images\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n      <div class=\"pcfaq-item\" id=\"faq-images-saved\" data-cat=\"designer\">\n        <h3 class=\"pcfaq-q\"><button type=\"button\" aria-expanded=\"false\" aria-controls=\"faq-images-saved-a\" id=\"faq-images-saved-q\"><span class=\"pcfaq-qt\">Werden meine Bilder gespeichert?<\/span><span class=\"pcfaq-ic\" aria-hidden=\"true\"><\/span><\/button><\/h3>\n        <div class=\"pcfaq-a\" id=\"faq-images-saved-a\" role=\"region\" aria-labelledby=\"faq-images-saved-q\" hidden><div class=\"pcfaq-ai\"><p>Ja. Die erzeugten Bilder werden sicher auf unseren Servern gespeichert, damit unser Team bei der Arbeit an Ihrem Projekt darauf zur\u00fcckgreifen kann. Laden Sie alle Bilder, die Sie behalten m\u00f6chten, auf Ihr eigenes Ger\u00e4t herunter.<\/p><a class=\"pcfaq-link\" href=\"#faq-images-saved\" data-copy>Link zu dieser Antwort kopieren<\/a><\/div><\/div>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <div class=\"pcfaq-empty\"><strong>Keine passenden Fragen<\/strong>Versuchen Sie ein anderes Wort &ndash; oder fragen Sie uns einfach direkt.<\/div>\n  <aside class=\"pcfaq-cta pcfaq-cta--slim\">\n    <p>Noch Fragen zu Ihrem Projekt?<\/p>\n    <a class=\"pcfaq-btn\" href=\"https:\/\/www.padelcreations.com\/de\/kontakt\/\">Unser Team kontaktieren<\/a>\n  <\/aside>\n  <div class=\"pcfaq-toast\" role=\"status\">Link kopiert<\/div>\n<\/section>\n<script>\n(function(){\n  var root=document.getElementById('pcfaq-designer'); if(!root) return;\n  var dl=(document.documentElement.lang||'').toLowerCase(), path=location.pathname.toLowerCase();\n  var lang=(dl.indexOf('de')===0||\/^\\\/de(\\\/|$)\/.test(path))?'de':'en';\n  var sections=root.querySelectorAll('.pcfaq-language');\n  sections.forEach(function(el){\n    var active=el.getAttribute('data-lang')===lang;\n    el.hidden=!active;\n    if(!active)el.setAttribute('inert','');else el.removeAttribute('inert');\n  });\n  var active=root.querySelector('.pcfaq-language[data-lang=\"'+lang+'\"]');\n  if(!active)return;\n  ['data-lq','data-lof','data-lex','data-lco','data-ltrig','data-lclose'].forEach(function(a){if(active.hasAttribute(a))root.setAttribute(a,active.getAttribute(a));});\n  root.setAttribute('lang',lang);\n  \/* Only the current language is moved into the popup. The original FAQ\n     remains in the HTML source, rather than in an inert template. *\/\n  root.querySelectorAll('.pcfaq-language').forEach(function(el){if(el!==active)el.remove();});\n  while(active.firstChild)root.insertBefore(active.firstChild,active);\n  active.remove();\n})();\n<\/script>\n<script>\n(function(){\n  var host=document.getElementById('pcfaq-designer'); if(!host||host.dataset.ready) return; host.dataset.ready='1';\n  var root=host, modal=null, box=null, lastFocus=null;\n  if(host.classList.contains('pcfaq--popup')){\n    \/* build trigger button + modal; the modal lives in <body> so fixed positioning is never broken by page builders *\/\n    var trig=document.createElement('button'); trig.type='button'; trig.className='pcfaq-trigger';\n    trig.innerHTML='<span class=\"pcfaq-trigger-ic\" aria-hidden=\"true\">?<\/span><span>'+(host.getAttribute('data-ltrig')||'FAQ')+'<\/span>';\n    modal=document.createElement('div'); modal.className='pcfaq pcfaq--compact pcfaq-modal'; modal.id='pcfaq-designer-modal';\n    modal.setAttribute('lang',host.getAttribute('lang')||'en'); modal.hidden=true;\n    ['data-lq','data-lof','data-lex','data-lco'].forEach(function(a){if(host.hasAttribute(a))modal.setAttribute(a,host.getAttribute(a));});\n    modal.innerHTML='<div class=\"pcfaq-backdrop\" data-close><\/div><div class=\"pcfaq-dialog\" role=\"dialog\" aria-modal=\"true\"><button type=\"button\" class=\"pcfaq-x\" data-close aria-label=\"'+(host.getAttribute('data-lclose')||'Close')+'\">&times;<\/button><div class=\"pcfaq-box\"><\/div><\/div>';\n    box=modal.querySelector('.pcfaq-box');\n    var st=host.querySelector('style'); if(st) modal.appendChild(st.cloneNode(true));\n    [].slice.call(host.childNodes).forEach(function(n){ if(n.nodeType===1&&(n.tagName==='STYLE'||n.tagName==='SCRIPT'&&n.type!=='application\/ld+json')) return; box.appendChild(n); });\n    var h2=box.querySelector('.pcfaq-hero h2'); if(h2){h2.id='pcfaq-designer-title'; modal.querySelector('.pcfaq-dialog').setAttribute('aria-labelledby',h2.id);}\n    host.appendChild(trig); document.body.appendChild(modal); root=modal;\n    \/* Build language-specific JSON-LD from the actual displayed FAQ. *\/\n    var entities=[].slice.call(root.querySelectorAll('.pcfaq-item')).map(function(item){\n      var q=item.querySelector('.pcfaq-qt'), a=item.querySelector('.pcfaq-ai');\n      if(!q||!a)return null;\n      var clone=a.cloneNode(true);\n      clone.querySelectorAll('a.pcfaq-link').forEach(function(link){link.remove();});\n      return {'@type':'Question',name:q.textContent.trim(),acceptedAnswer:{'@type':'Answer',text:clone.textContent.replace(\/\\s+\/g,' ').trim()}};\n    }).filter(Boolean);\n    var schema=document.createElement('script');schema.type='application\/ld+json';\n    schema.textContent=JSON.stringify({'@context':'https:\/\/schema.org','@type':'FAQPage',inLanguage:host.getAttribute('lang')||'en',mainEntity:entities});\n    host.appendChild(schema);\n    trig.addEventListener('click',function(){openModal();});\n    modal.addEventListener('click',function(e){ if(e.target.closest('[data-close]')) closeModal(); });\n    document.addEventListener('keydown',function(e){ if(e.key==='Escape'&&!modal.hidden) closeModal(); });\n  }\n  function openModal(){ if(!modal||!modal.hidden) return; lastFocus=document.activeElement; modal.hidden=false; document.documentElement.classList.add('pcfaq-lock'); setTimeout(function(){modal.classList.add('is-in'); modal.querySelector('.pcfaq-x').focus();},10); }\n  function closeModal(){ if(!modal||modal.hidden) return; modal.classList.remove('is-in'); document.documentElement.classList.remove('pcfaq-lock'); modal.hidden=true;\n    if(location.hash&&modal.querySelector(location.hash)&&history.replaceState) history.replaceState(null,'',location.pathname+location.search);\n    if(lastFocus&&lastFocus.focus) lastFocus.focus(); }\n  var items=[].slice.call(root.querySelectorAll('.pcfaq-item')),\n      groups=[].slice.call(root.querySelectorAll('.pcfaq-group')),\n      chips=[].slice.call(root.querySelectorAll('.pcfaq-chip')),\n      input=root.querySelector('.pcfaq-search input'), clear=root.querySelector('.pcfaq-clear'),\n      count=root.querySelector('.pcfaq-count'), empty=root.querySelector('.pcfaq-empty'),\n      toggle=root.querySelector('.pcfaq-toggle'), toast=root.querySelector('.pcfaq-toast'),\n      cat='all',\n      L={q:root.getAttribute('data-lq')||' questions',of:root.getAttribute('data-lof')||' of ',ex:root.getAttribute('data-lex')||'Expand all',co:root.getAttribute('data-lco')||'Collapse all'};\n  items.forEach(function(it){\n    var q=it.querySelector('.pcfaq-qt'), a=it.querySelector('.pcfaq-ai');\n    it._q=q.innerHTML; it._a=a.innerHTML;\n    it._t=(q.textContent+' '+a.textContent).toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g,'');\n  });\n  function setOpen(it,open){\n    it.classList.toggle('is-open',open);\n    it.querySelector('.pcfaq-q button').setAttribute('aria-expanded',open);\n    it.querySelector('.pcfaq-a').hidden=!open;\n  }\n  function esc(s){return s.replace(\/[.*+?^${}()|[\\]\\\\]\/g,'\\\\$&');}\n  function highlight(html,terms){\n    if(!terms.length) return html;\n    var re=new RegExp('('+terms.map(esc).join('|')+')','gi');\n    return html.replace(\/(<[^>]+>)|([^<]+)\/g,function(m,tag,txt){return tag?tag:txt.replace(re,'<mark>$1<\/mark>');});\n  }\n  function apply(){\n    var raw=input?input.value.trim():'', q=raw.toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g,''),\n        terms=q.split(\/\\s+\/).filter(function(t){return t.length>1;}), shown=0;\n    if(clear) clear.classList.toggle('show',!!raw);\n    items.forEach(function(it){\n      var okCat=cat==='all'||it.dataset.cat===cat,\n          okQ=!terms.length||terms.every(function(t){return it._t.indexOf(t)>-1;}),\n          vis=okCat&&okQ;\n      it.hidden=!vis; if(vis) shown++;\n      it.querySelector('.pcfaq-qt').innerHTML=highlight(it._q,terms);\n      it.querySelector('.pcfaq-ai').innerHTML=highlight(it._a,terms);\n      if(terms.length&&vis) setOpen(it,true);\n      if(!terms.length&&!it.dataset.keep) setOpen(it,false);\n    });\n    groups.forEach(function(g){g.hidden=!g.querySelector('.pcfaq-item:not([hidden])');});\n    empty.classList.toggle('show',shown===0);\n    count.textContent=shown===items.length?shown+L.q:shown+L.of+items.length+L.q;\n    syncToggle();\n  }\n  function syncToggle(){\n    var vis=items.filter(function(i){return !i.hidden;}), allOpen=vis.length&&vis.every(function(i){return i.classList.contains('is-open');});\n    toggle.textContent=allOpen?L.co:L.ex; toggle.dataset.state=allOpen?'open':'closed';\n  }\n  root.addEventListener('click',function(e){\n    var b=e.target.closest('.pcfaq-q button');\n    if(b){var it=b.closest('.pcfaq-item'),o=!it.classList.contains('is-open');setOpen(it,o);if(o)it.dataset.keep='1';else delete it.dataset.keep;syncToggle();\n      if(o&&history.replaceState) history.replaceState(null,'','#'+it.id); return;}\n    var c=e.target.closest('.pcfaq-chip');\n    if(c){cat=c.dataset.cat;chips.forEach(function(x){var a=x===c;x.classList.toggle('is-active',a);x.setAttribute('aria-pressed',a);});apply();return;}\n    var j=e.target.closest('.pcfaq-ai a[href^=\"#faq-\"]:not([data-copy])');\n    if(j){var t=root.querySelector(j.getAttribute('href'));\n      if(!t){var h=j.getAttribute('href');if(document.querySelector(h)){e.preventDefault();closeModal();if(location.hash===h){window.dispatchEvent(new HashChangeEvent('hashchange'));}else{location.hash=h;}}return;}\n      e.preventDefault();\n      if(t){if(history.replaceState)history.replaceState(null,'',j.getAttribute('href'));\n        if(t.hidden){cat='all';if(input)input.value='';chips.forEach(function(x){var a=x.dataset.cat==='all';x.classList.toggle('is-active',a);x.setAttribute('aria-pressed',a);});apply();}\n        setOpen(t,true);t.dataset.keep='1';syncToggle();goTo(t);} return;}\n    var l=e.target.closest('[data-copy]');\n    if(l){e.preventDefault();var url=location.href.split('#')[0]+l.getAttribute('href');\n      (navigator.clipboard?navigator.clipboard.writeText(url):Promise.reject()).then(function(){toast.classList.add('show');setTimeout(function(){toast.classList.remove('show');},1600);},function(){location.hash=l.getAttribute('href');});}\n  });\n  toggle.addEventListener('click',function(){var open=toggle.dataset.state!=='open';\n    items.forEach(function(it){if(!it.hidden){setOpen(it,open);if(open)it.dataset.keep='1';else delete it.dataset.keep;}});syncToggle();});\n  var timer;if(input){input.addEventListener('input',function(){clearTimeout(timer);timer=setTimeout(apply,120);});\n  clear.addEventListener('click',function(){input.value='';apply();input.focus();});}\n  function openHash(){var h=location.hash; if(!h||h.indexOf('#faq-')!==0) return;\n    var it=root.querySelector(h); if(!it||!it.classList.contains('pcfaq-item')) return;\n    openModal();\n    setOpen(it,true); it.dataset.keep='1'; syncToggle();\n    goTo(it);}\n  \/* height of any fixed\/sticky site header covering the top of the viewport *\/\n  function headerOffset(){\n    var max=0, w=window.innerWidth, xs=[w*0.1,w*0.3,w*0.5,w*0.7,w*0.9];\n    xs.forEach(function(x){\n      var el=document.elementFromPoint(x,2);\n      while(el&&el!==document.body&&el!==document.documentElement){\n        if(root.contains(el)) break;\n        var pos=getComputedStyle(el).position;\n        if(pos==='fixed'||pos==='sticky'){var r=el.getBoundingClientRect(); if(r.top<=2&&r.bottom>max&&r.bottom<window.innerHeight*0.5) max=r.bottom; break;}\n        el=el.parentElement;\n      }\n    });\n    return max;\n  }\n  function scrollToItem(it,smooth){\n    if(box){ var y0=it.getBoundingClientRect().top-box.getBoundingClientRect().top+box.scrollTop-16; box.scrollTo({top:Math.max(0,y0),behavior:smooth?'smooth':'auto'}); return; }\n    var y=it.getBoundingClientRect().top+window.pageYOffset-headerOffset()-20;\n    window.scrollTo({top:Math.max(0,y),behavior:smooth?'smooth':'auto'});\n  }\n  function goTo(it){\n    setTimeout(function(){scrollToItem(it,true);},150);\n    \/* re-check once sticky headers have settled (e.g. Elementor shrinking header) *\/\n    if(!box) setTimeout(function(){var o=headerOffset(), t=it.getBoundingClientRect().top; if(t<o+8||t>o+60) scrollToItem(it,true);},900);\n  }\n  apply(); openHash(); window.addEventListener('hashchange',openHash);\n})();\n<\/script>\n<\/div>\n<!-- \/PadelCreations Tools: 3d-space-designer-faq-popup --><\/div>\n\t\t\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","protected":false},"excerpt":{"rendered":"<p>PadelCreations \u00b7 Padel Vision 3D-Padel-Platz-Design-Tool Erkunden Sie, wie Ihr zuk\u00fcnftiges Padel-Projekt aussehen k\u00f6nnte, bevor es gebaut wird. W\u00e4hlen Sie die Umgebung, das Platzmodell und die Anzahl der Pl\u00e4tze, beschreiben Sie dann Ihre Vision oder laden Sie Fotos Ihres Standorts hoch, um ein personalisiertes visuelles Konzept zu erstellen. TESTEN SIE UNSER 3D-RAUMDESIGNER-TOOL\u2193 PadelCreations \u00b7 Padel Vision [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1812","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.8 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Padel-Platz-Design in 3D \u2013 KI-Raumdesigner | PadelCreations<\/title>\n<meta name=\"description\" content=\"Visualisieren Sie Ihr Padel-Platz-Design in 3D: W\u00e4hlen Sie die Umgebung, das Platzmodell und das Layout und sehen Sie, wie Ihr Projekt lebendig wird.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"3D-Raumdesigner\" \/>\n<meta property=\"og:description\" content=\"Visualisieren Sie Ihr Padel-Platz-Design in 3D: W\u00e4hlen Sie die Umgebung, das Platzmodell und das Layout und sehen Sie, wie Ihr Projekt lebendig wird.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/\" \/>\n<meta property=\"og:site_name\" content=\"Padelcreations | Padel Court Construction &amp; Installation Worldwide\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-10T21:10:01+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"1\u00a0Minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/3d-padel-space-designer\\\/\",\"url\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/3d-padel-space-designer\\\/\",\"name\":\"Padel-Platz-Design in 3D \u2013 KI-Raumdesigner | PadelCreations\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/#website\"},\"datePublished\":\"2026-10-22T17:11:46+00:00\",\"dateModified\":\"2026-11-10T21:10:01+00:00\",\"description\":\"Visualisieren Sie Ihr Padel-Platz-Design in 3D: W\u00e4hlen Sie die Umgebung, das Platzmodell und das Layout und sehen Sie, wie Ihr Projekt lebendig wird.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/3d-padel-space-designer\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/3d-padel-space-designer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/3d-padel-space-designer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"3D-Raumdesigner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/\",\"name\":\"Padelcreations | Padel Court Construction & Installation Worldwide\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/#organization\",\"name\":\"Padelcreations | Padel Court Construction & Installation Worldwide\",\"url\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/web2027.padelcreations.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/logo-white.png\",\"contentUrl\":\"https:\\\/\\\/web2027.padelcreations.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/logo-white.png\",\"width\":2236,\"height\":828,\"caption\":\"Padelcreations | Padel Court Construction & Installation Worldwide\"},\"image\":{\"@id\":\"https:\\\/\\\/www.padelcreations.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Padel-Platz-Design in 3D \u2013 KI-Raumdesigner | PadelCreations","description":"Visualisieren Sie Ihr Padel-Platz-Design in 3D: W\u00e4hlen Sie die Umgebung, das Platzmodell und das Layout und sehen Sie, wie Ihr Projekt lebendig wird.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/","og_locale":"de_DE","og_type":"article","og_title":"3D-Raumdesigner","og_description":"Visualisieren Sie Ihr Padel-Platz-Design in 3D: W\u00e4hlen Sie die Umgebung, das Platzmodell und das Layout und sehen Sie, wie Ihr Projekt lebendig wird.","og_url":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/","og_site_name":"Padelcreations | Padel Court Construction & Installation Worldwide","article_modified_time":"2026-11-10T21:10:01+00:00","twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"1\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/","url":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/","name":"Padel-Platz-Design in 3D \u2013 KI-Raumdesigner | PadelCreations","isPartOf":{"@id":"https:\/\/www.padelcreations.com\/de\/#website"},"datePublished":"2026-10-22T17:11:46+00:00","dateModified":"2026-11-10T21:10:01+00:00","description":"Visualisieren Sie Ihr Padel-Platz-Design in 3D: W\u00e4hlen Sie die Umgebung, das Platzmodell und das Layout und sehen Sie, wie Ihr Projekt lebendig wird.","breadcrumb":{"@id":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.padelcreations.com\/de\/3d-padel-space-designer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/www.padelcreations.com\/de\/"},{"@type":"ListItem","position":2,"name":"3D-Raumdesigner"}]},{"@type":"WebSite","@id":"https:\/\/www.padelcreations.com\/de\/#website","url":"https:\/\/www.padelcreations.com\/de\/","name":"Padelcreations | Padel Court Construction & Installation Worldwide","description":"","publisher":{"@id":"https:\/\/www.padelcreations.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.padelcreations.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.padelcreations.com\/de\/#organization","name":"Padelcreations | Padel Court Construction & Installation Worldwide","url":"https:\/\/www.padelcreations.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.padelcreations.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/web2027.padelcreations.com\/wp-content\/uploads\/2026\/09\/logo-white.png","contentUrl":"https:\/\/web2027.padelcreations.com\/wp-content\/uploads\/2026\/09\/logo-white.png","width":2236,"height":828,"caption":"Padelcreations | Padel Court Construction & Installation Worldwide"},"image":{"@id":"https:\/\/www.padelcreations.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/1812","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/comments?post=1812"}],"version-history":[{"count":7,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/1812\/revisions"}],"predecessor-version":[{"id":2900,"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/pages\/1812\/revisions\/2900"}],"wp:attachment":[{"href":"https:\/\/www.padelcreations.com\/de\/wp-json\/wp\/v2\/media?parent=1812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}