Compare commits

..

4 Commits

Author SHA1 Message Date
David Ascanio fe2a956a29 Merge branch 'main' of https://gitea.carpa.com/LGCC/cdrdpyj
# Conflicts:
#	src/pages/api/lib/email.ts
2026-08-02 14:07:29 -03:00
David Ascanio 5dc873580e email contacto cloudflare 2026-08-02 14:01:42 -03:00
David Ascanio 9aa0105fca emails cloudflare 2026-08-02 13:57:48 -03:00
David Ascanio 34230624ce Fix responsive text wrapping in values section titles
Replace break-all (which sliced words at arbitrary characters) with
word-aware wrapping, add missing min-w-0 that let one grid column
overflow, and tune the title font-size breakpoints so headings never
fracture mid-word in the tight column widths between lg and 2xl.
2026-08-02 13:45:42 -03:00
4 changed files with 28 additions and 77 deletions

View File

@ -9,17 +9,17 @@ const { props } = Astro.props;
<div class="container mx-auto">
<div class="grid md:grid-cols-2 min-w-0">
<div class="bg-[#EBE5D0] p-6 md:p-12 lg:p-24 grid lg:grid-cols-2 min-w-0">
<div class="flex flex-col justify-between min-h-full break-all">
<h2 class="text-5xl font-secondary text-tertiary font-bold">{tl("values.justice.title")}</h2>
<div class="flex flex-col justify-between min-h-full min-w-0">
<h2 class="text-3xl lg:text-2xl xl:text-3xl 2xl:text-5xl font-secondary text-tertiary font-bold wrap-break-word">{tl("values.justice.title")}</h2>
<p class="text-lg text-tertiary break-words">{tl("values.justice.text")}</p>
</div>
<div class="flex items-end justify-end min-h-full">
<Icon name="icon_justice_1" class="text-6xl md:text-9xl text-tertiary" />
<div class="flex items-end justify-end min-h-full min-w-0 max-w-full">
<Icon name="icon_justice_1" class="text-6xl md:text-9xl text-tertiary max-w-full h-auto" />
</div>
</div>
<div class="bg-tertiary p-6 md:p-12 lg:p-24 grid lg:grid-cols-2 min-w-0">
<div class="flex flex-col justify-between min-h-full min-w-0 max-w-full">
<h2 class="text-5xl font-secondary font-bold text-[#CBA16A] break-all">{tl("values.integrity.title")}</h2>
<h2 class="text-3xl lg:text-2xl xl:text-3xl 2xl:text-5xl font-secondary font-bold text-[#CBA16A] wrap-break-word">{tl("values.integrity.title")}</h2>
<p class="text-[#CBA16A] text-lg break-words">{tl("values.integrity.text")}</p>
</div>
<div class="flex items-end justify-end min-h-full min-w-0 max-w-full">
@ -28,17 +28,17 @@ const { props } = Astro.props;
</div>
</div>
<div class="grid lg:grid-cols-3">
<div class="bg-tertiary p-12 xl:p-20 2xl:p-24 flex justify-between flex-col min-h-full lg:aspect-square">
<h2 class="text-3xl xl:text-5xl font-secondary font-bold text-white">{tl("values.service.title")}</h2>
<p class="text-xl text-[#EBE5D0]">{tl("values.service.text")}</p>
<div class="bg-tertiary p-12 xl:p-20 2xl:p-24 flex justify-between flex-col min-h-full lg:aspect-square min-w-0">
<h2 class="text-3xl 2xl:text-5xl font-secondary font-bold text-white wrap-break-word">{tl("values.service.title")}</h2>
<p class="text-xl text-[#EBE5D0] wrap-break-word">{tl("values.service.text")}</p>
</div>
<div class="bg-[#BEA48D] p-12 xl:p-20 2xl:p-24 flex justify-between flex-col min-h-full lg:aspect-square">
<h2 class="text-3xl xl:text-5xl font-secondary font-bold text-tertiary">{tl("values.excellence.title")}</h2>
<p class="text-xl text-tertiary">{tl("values.excellence.text")}</p>
<div class="bg-[#BEA48D] p-12 xl:p-20 2xl:p-24 flex justify-between flex-col min-h-full lg:aspect-square min-w-0">
<h2 class="text-3xl 2xl:text-5xl font-secondary font-bold text-tertiary wrap-break-word">{tl("values.excellence.title")}</h2>
<p class="text-xl text-tertiary wrap-break-word">{tl("values.excellence.text")}</p>
</div>
<div class="bg-[#22523F] p-12 xl:p-20 2xl:p-24 flex justify-between flex-col min-h-full lg:aspect-square">
<h2 class="text-3xl xl:text-5xl font-secondary font-bold text-white">{tl("values.dialogue.title")}</h2>
<p class="text-white text-xl">{tl("values.dialogue.text")}</p>
<div class="bg-[#22523F] p-12 xl:p-20 2xl:p-24 flex justify-between flex-col min-h-full lg:aspect-square min-w-0">
<h2 class="text-3xl 2xl:text-5xl font-secondary font-bold text-white wrap-break-word">{tl("values.dialogue.title")}</h2>
<p class="text-white text-xl wrap-break-word">{tl("values.dialogue.text")}</p>
</div>
</div>
</div>

View File

@ -1,5 +1,6 @@
import type { APIRoute } from "astro";
import { prisma } from "../lib/prisma";
import { sendEmailCf } from "../lib/email";
export const prerender = false;
@ -64,32 +65,11 @@ export const POST: APIRoute = async ({ request }) => {
},
});
}
const emailApiKey = import.meta.env.EMAIL_API_KEY;
const emailResponse = await fetch("https://flows2.carpa.com/webhook/email/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": emailApiKey!,
},
body: JSON.stringify({
type: "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO",
data: {
nombre,
email,
mensaje,
senderName : "Centro del Reino de Paz y Justicia",
},
}),
});
if (!emailResponse.ok) {
console.error("Error enviando correo");
return new Response(
JSON.stringify({ error: "Error en servicio de correo" }),
{ status: 500 }
await sendEmailCf(
{ nombre, email, mensaje },
"joseperez@centrodelreinodepazyjusticia.com",
"CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO",
);
}
return new Response(null, {
status: 302,

View File

@ -1,5 +1,6 @@
import type { APIRoute } from "astro";
import { appendToSheet, emailExists } from "../lib/googleSheets";
import { sendEmailCf } from "../lib/email";
export const prerender = false;
export const POST: APIRoute = async ({ request }) => {
@ -29,17 +30,6 @@ export const POST: APIRoute = async ({ request }) => {
})
}
const dataSend = {
nombres,
apellidos,
pais,
lugar,
direccion,
telefono,
email
};
const emailApiKey = import.meta.env.EMAIL_API_KEY;
const valuesForSheets = [
nombres,
apellidos,
@ -51,31 +41,12 @@ export const POST: APIRoute = async ({ request }) => {
new Date().toLocaleString()
];
// 🔹 Enviar a tu backend real
const [emailResponse] = await Promise.all([
fetch("http://155.138.215.11:3050/email/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": emailApiKey!,
},
body: JSON.stringify({
type: "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION",
data: dataSend,
}),
}),
appendToSheet(valuesForSheets) // Guardar en Google Sheets
// 🔹 Enviar correo (Cloudflare) y guardar en Google Sheets
await Promise.all([
sendEmailCf({ nombres, apellidos }, email, "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION"),
appendToSheet(valuesForSheets)
]);
if (!emailResponse.ok) {
return new Response(null, {
status: 302,
headers: {
Location: "/",
},
});
}
// 🔹 Redirección elegante después de enviar
return new Response(null, {
status: 302,

View File

@ -39,11 +39,11 @@ export async function sendEmail(data: object, to: string, type: TypeEmailData) {
const TEMPLATE_URLS: Record<TypeEmailData, { subject: string; url: string }> = {
CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION: {
subject: "Confirmación de inscripción al voluntariado",
url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_postulacion_user.html",
url: "https://assets.centrodelreinodepazyjusticia.com/centro_del_reino_paz_y_justicia_postulacion_user.html",
},
CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO: {
subject: "Notificación de contacto institucional",
url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_info.html",
url: "https://assets.centrodelreinodepazyjusticia.com/centro_del_reino_paz_y_justicia_info.html",
},
};
@ -95,7 +95,7 @@ export async function sendEmailCf(data: Record<string, string>, to: string, type
text,
});
if (!response.delivered) {
if (response.permanent_bounces.includes(to)) {
console.error("Cloudflare email not delivered", response);
throw new Error("El correo no fue entregado");
}