{"id":1488,"date":"2026-01-20T21:56:46","date_gmt":"2026-01-21T03:56:46","guid":{"rendered":"https:\/\/safespace.net\/?page_id=1488"},"modified":"2026-02-24T18:09:08","modified_gmt":"2026-02-25T00:09:08","slug":"donaciones-apoyar-2","status":"publish","type":"page","link":"https:\/\/safespace.net\/?page_id=1488","title":{"rendered":"Support &#8211; Frequency"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1488\" class=\"elementor elementor-1488\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-687c21e elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"687c21e\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-faa8a9a\" data-id=\"faa8a9a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-88c8d28 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-heading\" data-id=\"88c8d28\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Select an amount and frequency to support Safe Space<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-effa381 elementor-widget elementor-widget-html\" data-id=\"effa381\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"donation-tabs-container\">\n    <!-- Tab Headers -->\n    <div class=\"tab-headers\">\n        <button class=\"tab-btn active\" data-tab=\"una-vez\">One time<\/button>\n        <button class=\"tab-btn\" data-tab=\"mensualmente\">Monthly<\/button>\n    <\/div>\n\n    <!-- Donation Cards (ahora clickeables) -->\n    <div class=\"donation-cards\">\n        <div class=\"donation-card\" id=\"card-una-vez\" data-tab=\"una-vez\">\n            <h3>ONE TIME<\/h3>\n            <p class=\"subtitle\">One-time contribution<\/p>\n            <button id=\"open-donation-modal\" class=\"donate-btn\">SUPPORT<\/button>\n        <\/div>\n\n        <div class=\"donation-card\" id=\"card-mensualmente\" data-tab=\"mensualmente\">\n            <h3>MONTHLY<\/h3>\n            <p class=\"subtitle\">Monthly contribution<\/p>\n            <button class=\"donate-btn\">SUPPORT<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Modal para mostrar errores -->\n<div id=\"error-modal\" class=\"donation-modal\" style=\"display:none;\">\n    <div class=\"modal-content\">\n        <div>\n            <span class=\"close-error-modal\">&times;<\/span>\n        <\/div>\n        <div style=\"text-align: center; padding: 20px;\">\n            <h3 style=\"color: #e74c3c;\">Error<\/h3>\n            <p id=\"error-message\" style=\"margin: 20px 0; font-size: 16px;\"><\/p>\n            <button id=\"close-error-btn\" style=\"padding: 10px 30px; cursor: pointer;\">\n                Cerrar\n            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n<!-- Modal con input de monto -->\n<div id=\"donation-modal\" class=\"donation-modal\">\n    <div class=\"modal-content\">\n        <div>\n            <span class=\"close-modal\">&times;<\/span>\n        <\/div>\n\n        <div id=\"modal-content-amounts\">\n            <h2>How much would you like to contribute?<\/h2>\n\n\n            <div class=\"donation-form\">\n                <label for=\"email-input\">\n                    Email\n                    <input class=\"emailOnceInput\" type=\"email\" id=\"email-input\" required \/>\n                <\/label>\n                <div id=\"email-input-errors\" style=\"color: red; font-size: 14px; margin-top: 5px;\"><\/div>\n                <label for=\"donation-amount\">\n                    <strong>Enter the amount<\/strong> (minimum $100 MXN):\n                <\/label>\n\n                <div class=\"amount-input-wrapper\">\n                    <span class=\"currency-symbol\">$<\/span>\n                    <input type=\"number\" id=\"donation-amount\" min=\"100\" step=\"10\" value=\"100\" placeholder=\"100\"\n                        autocomplete=\"off\">\n                    <span class=\"currency-code\">MXN<\/span>\n                <\/div>\n\n                <!-- Botones de sugerencias r\u00e1pidas (opcional) -->\n                <div class=\"quick-amounts\">\n                    <button class=\"quick-amount-btn\" data-amount=\"100\">$100<\/button>\n                    <button class=\"quick-amount-btn\" data-amount=\"300\">$300<\/button>\n                    <button class=\"quick-amount-btn\" data-amount=\"500\">$500<\/button>\n                    <button class=\"quick-amount-btn\" data-amount=\"1000\">$1,000<\/button>\n                    <button class=\"quick-amount-btn\" data-amount=\"3000\">$3,000<\/button>\n                <\/div>\n\n                <button id=\"btn-donate-now\" class=\"donate-btn\">\n                    <div id=\"loading-overlay\" style=\"display:none;\">\n                        <div class=\"spinner\"><\/div>\n                    <\/div>\n                    <span id=\"text-btn-donate-now\">CONTINUE TO PAYMENT<\/span>\n                <\/button>\n\n\n\n                <p style=\"font-size: 13px; color: #999; margin-top: 15px; text-align: center;\">\n                    \ud83d\udd12 Secure payment processed by Stripe\n                <\/p>\n            <\/div>\n        <\/div>\n\n        <form id=\"payment-form-unique\" style=\"display:none;\">\n            <label>\n                Email\n                <input type=\"email\" id=\"email-form-unique\" \/>\n            <\/label>\n            <div id=\"email-errors-form-unique\"><\/div>\n            <p>Payment<\/p>\n            <div id=\"payment-element-form-unique\">\n                <!--Stripe.js injects the Payment Element-->\n            <\/div>\n            <button id=\"submit-form-unique\">\n                <div id=\"spinner-form-unique\" style=\"display:none;\">\n                    <div class=\"spinner\"><\/div>\n                <\/div>\n                <span id=\"button-text-form-unique\">SUPPORT<\/span>\n            <\/button>\n            <div id=\"payment-message-form-unique\" style=\"display:none;\"><\/div>\n        <\/form>\n    <\/div>\n<\/div>\n\n\n\n\n\n\n\n\n\n\n<script>\n    (function () {\n        \/\/ Publishable Key de Stripe \n        \n        const stripePublishableKey = 'pk_live_51SzmHWGYFDQ5RTXQumb8cAgfaVzg6xNlt4NVotuA5NGgkaVHNDQLDcrUTRjIneFt5Rx1CM5pqGiDzlPRdt6vL2sV00dxuDrysz';\n        const stripe = Stripe(stripePublishableKey);\n\n        \/\/ Elementos del DOM\n\n        let checkout;\n        let actions;\n        let currentSessionId = null;\n        let userEmail = null;\n\n        const openBtn = document.getElementById('open-donation-modal');\n\n        \/\/ Modales \n        const errorModal = document.getElementById('error-modal');\n        const modal = document.getElementById('donation-modal');\n\n        \/\/ Botones de cierre\n        const closeBtn = document.querySelector('.close-modal');\n        const closeErrorModal = document.querySelector('.close-error-modal');\n        const closeErrorBtn = document.getElementById('close-error-btn');\n\n        const emailInputField = document.getElementById('email-input');\n        const emailInputErrors = document.getElementById('email-input-errors');\n\n        \n        const donateBtn = document.getElementById('btn-donate-now');\n        const amountInput = document.getElementById('donation-amount');\n        const loadingOverlay = document.getElementById('loading-overlay');\n\n        const textBtnDonateNow = document.getElementById('text-btn-donate-now');\n        const modalContentAmounts = document.getElementById('modal-content-amounts');\n        const paymetFormUnique = document.getElementById('payment-form-unique');\n        const emailInput = document.getElementById(\"email-form-unique\");\n        const emailErrors = document.getElementById(\"email-errors-form-unique\");\n\n        \/\/ Funci\u00f3n para mostrar modal de error\n        function showErrorModal(message) {\n            document.getElementById('error-message').textContent = message;\n            errorModal.style.display = 'block';\n        }\n\n        \/\/ Cerrar modal de error\n        closeErrorModal.addEventListener('click', function () {\n            errorModal.style.display = 'none';\n        });\n\n        closeErrorBtn.addEventListener('click', function () {\n            errorModal.style.display = 'none';\n        });\n\n        \/\/ Abrir modal\n        openBtn.addEventListener('click', function () {\n            modal.style.display = 'block';\n            \/\/ Focus en el input\n            setTimeout(() => emailInputField.focus(), 300);\n        });\n\n        \/\/ Cerrar modal\n        closeBtn.addEventListener('click', function () {\n            if (loadingOverlay.style.display != 'flex') {\n                modal.style.display = 'none';\n                modalContentAmounts.style.display = 'inherit';\n                paymetFormUnique.style.display = 'none'\n            }\n        });\n\n        \/\/ Cerrar al hacer clic fuera del modal\n        window.addEventListener('click', function (e) {\n            if (e.target === modal && loadingOverlay.style.display != 'flex' && paymetFormUnique.style.display != 'inherit') {\n                modal.style.display = 'none';\n                modalContentAmounts.style.display = 'inherit';\n                paymetFormUnique.style.display = 'none'\n            }\n        });\n\n        \/\/ Cerrar con tecla ESC\n        document.addEventListener('keydown', function (e) {\n            if (e.key === 'Escape' && modal.style.display === 'block' && loadingOverlay.style.display != 'flex' && paymetFormUnique.style.display != 'inherit') {\n                \n                modal.style.display = 'none';\n\n                modalContentAmounts.style.display = 'inherit';\n                paymetFormUnique.style.display = 'none'\n            }\n        });\n\n        \/\/ Botones de montos r\u00e1pidos\n        document.querySelectorAll('.quick-amount-btn').forEach(btn => {\n            btn.addEventListener('click', function () {\n                const amount = this.dataset.amount;\n                amountInput.value = amount;\n                amountInput.focus();\n            });\n        });\n\n        \/\/ Procesar donaci\u00f3n\n        donateBtn.addEventListener('click', function () {\n\n            const amount = amountInput.value;\n\n            \/\/ Validaciones\n            if (!amount || amount === '') {\n                amountInput.focus();\n                return;\n            }\n\n            if (amount < 100) {\n                amountInput.focus();\n                return;\n            }\n\n            const email = emailInputField.value.trim();\n            \n            \/\/ Validaci\u00f3n b\u00e1sica de email\n            const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n            if (!emailRegex.test(email)) {\n                emailInputErrors.textContent = 'Please enter a valid email';\n                return;\n            }\n            \n            \/\/ Limpiar errores\n            emailInputErrors.textContent = '';\n            \n            \/\/ Guardar email\n            userEmail = email;\n            \n            \/\/ Continuar con el proceso\n            initialize(amount);\n\n            \n        });\n\n        async function initialize(amount){\n            \/\/ Cerrar modal y mostrar loading\n            textBtnDonateNow.style.display = 'none'\n            loadingOverlay.style.display = 'flex';\n\n            \/\/ Crear sesi\u00f3n de Stripe\n            const formData = new FormData();\n            formData.append('action', 'create_checkout_session');\n            formData.append('type', 'one-time');\n            formData.append('amount', amount);\n            formData.append('price_id', '');\n            formData.append('email', userEmail);\n            formData.append('language', getUrlParameter('lang') || 'en');\n            formData.append('nonce', '<?php echo wp_create_nonce(\"stripe_checkout\"); ?>');\n\n            const promise = fetch('\/wp-admin\/admin-ajax.php?action=create_checkout_session', {\n                method: 'POST',\n                body: formData\n            })\n                .then(response => {\n                    return response.text().then(text => {\n                        try {\n                            return JSON.parse(text);\n                        } catch (e) {\n                            throw new Error('El servidor no devolvi\u00f3 JSON v\u00e1lido');\n                        }\n                    });\n                })\n                .then(data => {\n                    if (data.success) {\n\n                        paymetFormUnique.addEventListener('submit', handleSubmit);\n\n                        textBtnDonateNow.style.display = 'flex'\n                        loadingOverlay.style.display = 'none';\n\n                        modalContentAmounts.style.display = 'none';\n                        paymetFormUnique.style.display = 'inherit'\n                        \n                        currentSessionId = data.data.id;\n\n                        emailInput.readOnly = true;\n                        emailInput.value = userEmail;\n                        emailInput.style.backgroundColor = '#f5f5f5';\n                        \n                        \n                        if(data.data.msgExistUserWP){\n                            emailErrors.textContent = data.data.msgExistUserWP;   \n                        }else{\n                            emailErrors.textContent = '';\n                        }\n\n                        return data.data.clientSecret;\n\n\n\n                    } else {\n                        textBtnDonateNow.style.display = 'flex'\n                        loadingOverlay.style.display = 'none';\n                        showErrorModal(data.data.message || 'Error al procesar la solicitud');\n                    }\n                })\n\n                const appearance = {\n                    theme: 'stripe',\n                };\n                checkout = stripe.initCheckout({\n                    clientSecret: promise,\n                    elementsOptions: { appearance },\n                });\n\n                checkout.on('change', (session) => {\n                    \n                });\n\n                const loadActionsResult = await checkout.loadActions();\n\n                if (loadActionsResult.type === 'success') {\n                    actions = loadActionsResult.actions;\n                    const session = loadActionsResult.actions.getSession();\n                    document.querySelector(\"#button-text-form-unique\").textContent = `SUPPORT WITH ${session.total.total.amount\n                        }`;\n                }\n\n                const paymentElement = checkout.createPaymentElement();\n                paymentElement.mount(\"#payment-element-form-unique\");\n\n                async function handleSubmit(e) {\n                    e.preventDefault();\n                    setLoading(true);\n\n                    const { error } = await actions.confirm();\n\n                    if (error) {\n                        showMessage(error.message);\n                        setLoading(false);\n                    }\n                }\n                \n\n                function showMessage(messageText) {\n                    const messageContainer = document.querySelector(\"#payment-message-form-unique\");\n\n                    messageContainer.style.display = 'flex';\n                    messageContainer.textContent = messageText;\n\n                    setTimeout(function () {\n                        messageContainer.style.display = 'none';\n                        messageContainer.textContent = \"\";\n                    }, 4000);\n                }\n\n                \n                function setLoading(isLoading) {\n                    if (isLoading) {\n                        \n                        document.querySelector(\"#submit-form-unique\").disabled = true;\n                        document.querySelector(\"#spinner-form-unique\").style.display = 'flex';\n                        document.querySelector(\"#button-text-form-unique\").style.display = 'none';\n                    } else {\n                        document.querySelector(\"#submit-form-unique\").disabled = false;\n                        document.querySelector(\"#spinner-form-unique\").style.display = 'none';\n                        document.querySelector(\"#button-text-form-unique\").style.display = 'inherit';\n                    }\n                }\n        }\n    })();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c2336a9 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"c2336a9\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">Any contribution adds up and becomes presence, care, and community. If this is not the moment for you to contribute, Safe Space will always remain open to you.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8cdf835 elementor-widget elementor-widget-heading\" data-id=\"8cdf835\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">YOUR CONTRIBUTION WILL ALLOW US TO:<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-8034d39 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8034d39\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-610ac8e\" data-id=\"610ac8e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-002227a elementor-widget elementor-widget-image\" data-id=\"002227a\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"98\" height=\"136\" src=\"https:\/\/safespace.net\/wp-content\/uploads\/2026\/01\/IMG_6147-1.png\" class=\"attachment-large size-large wp-image-1386\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4641ef1 elementor-widget elementor-widget-text-editor\" data-id=\"4641ef1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">Sustain our operations<\/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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-736739b\" data-id=\"736739b\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f38b56d elementor-widget elementor-widget-image\" data-id=\"f38b56d\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"88\" height=\"121\" src=\"https:\/\/safespace.net\/wp-content\/uploads\/2026\/01\/IMG_6148-1.png\" class=\"attachment-large size-large wp-image-1387\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f5785da elementor-widget elementor-widget-text-editor\" data-id=\"f5785da\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">Open a second space in Mexico City<\/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<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-08365ba\" data-id=\"08365ba\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e14d76d elementor-widget elementor-widget-image\" data-id=\"e14d76d\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"91\" height=\"126\" src=\"https:\/\/safespace.net\/wp-content\/uploads\/2026\/01\/IMG_6151-1.png\" class=\"attachment-large size-large wp-image-1388\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d4dc2c8 elementor-widget elementor-widget-text-editor\" data-id=\"d4dc2c8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">Expand free access to meditation and care practices<\/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<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Select an amount and frequency to support Safe Space One time Monthly ONE TIME One-time contribution SUPPORT MONTHLY Monthly contribution SUPPORT &times; Error Cerrar &times; How much would you like to contribute? Email Enter the amount (minimum $100 MXN): $ MXN $100 $300 $500 $1,000 $3,000 CONTINUE TO PAYMENT \ud83d\udd12 Secure payment processed by Stripe [&hellip;]<\/p>\n","protected":false},"author":12843,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-1488","page","type-page","status-publish","hentry"],"lang":"en","translations":{"en":1488,"es":1382},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/safespace.net\/index.php?rest_route=\/wp\/v2\/pages\/1488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/safespace.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/safespace.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/safespace.net\/index.php?rest_route=\/wp\/v2\/users\/12843"}],"replies":[{"embeddable":true,"href":"https:\/\/safespace.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1488"}],"version-history":[{"count":59,"href":"https:\/\/safespace.net\/index.php?rest_route=\/wp\/v2\/pages\/1488\/revisions"}],"predecessor-version":[{"id":2574,"href":"https:\/\/safespace.net\/index.php?rest_route=\/wp\/v2\/pages\/1488\/revisions\/2574"}],"wp:attachment":[{"href":"https:\/\/safespace.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}