feat: sitio hostingdelsur.net v2 con Astro 5, Tailwind v4, soporte light/dark, i18n es/en, Keystatic CMS, reCAPTCHA v3
- Arista Pro Alternate Regular self-hosted (font corporativa) - Toggle theme con CSS variables y @custom-variant dark - 6 servicios en 3 categorías (Hosting & Correo / Diseño & Contenido / Infraestructura) - 3 planes destacados (Básico USD 59, Institucional USD 129, E-commerce USD 219) - Datacenters en 4 países (Canadá, USA, Alemania, Uruguay) sin ciudades en el sitio - Sede operativa en Maldonado, Uruguay - i18n es/en con contenido duplicado en Keystatic - Endpoint PHP para form de contacto con PHPMailer + reCAPTCHA v3 + honeypot + rate limit - WorldMap con animación SVG de los 4 países - 29 páginas generadas, 0 JS por default - Sitemap auto + robots.txt - JSON-LD Organization + ProfessionalService con areaServed
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import { defineConfig, collection, fields, singleton } from '@keystatic/core';
|
||||
|
||||
export default defineConfig({
|
||||
storage: {
|
||||
kind: 'local',
|
||||
},
|
||||
collections: {
|
||||
services: collection({
|
||||
label: 'Servicios',
|
||||
slugField: 'slug',
|
||||
path: 'src/content/services/*',
|
||||
schema: {
|
||||
slug: fields.text({
|
||||
label: 'Slug (URL)',
|
||||
validation: { length: { min: 1, max: 80 } },
|
||||
}),
|
||||
category: fields.select({
|
||||
label: 'Categoría',
|
||||
options: [
|
||||
{ label: 'Hosting & Correo', value: 'hosting' },
|
||||
{ label: 'Diseño & Contenido', value: 'diseno' },
|
||||
{ label: 'Infraestructura', value: 'infraestructura' },
|
||||
],
|
||||
defaultValue: 'hosting',
|
||||
}),
|
||||
icon: fields.text({
|
||||
label: 'Ícono (MailIcon, WordpressIcon, CodeIcon, ShopIcon, TranslateIcon, ServerIcon)',
|
||||
}),
|
||||
order: fields.number({
|
||||
label: 'Orden',
|
||||
defaultValue: 0,
|
||||
}),
|
||||
name_es: fields.text({ label: 'Nombre (ES)' }),
|
||||
name_en: fields.text({ label: 'Nombre (EN)' }),
|
||||
shortDescription_es: fields.text({ label: 'Descripción corta (ES)', multiline: true }),
|
||||
shortDescription_en: fields.text({ label: 'Descripción corta (EN)', multiline: true }),
|
||||
body_es: fields.mdx({ label: 'Descripción completa (ES)' }),
|
||||
body_en: fields.mdx({ label: 'Descripción completa (EN)' }),
|
||||
features_es: fields.array(fields.text({ label: 'Feature' }), {
|
||||
label: 'Features (ES)',
|
||||
itemLabel: (props) => props.value,
|
||||
}),
|
||||
features_en: fields.array(fields.text({ label: 'Feature' }), {
|
||||
label: 'Features (EN)',
|
||||
itemLabel: (props) => props.value,
|
||||
}),
|
||||
},
|
||||
}),
|
||||
|
||||
tutorials: collection({
|
||||
label: 'Instructivos',
|
||||
slugField: 'slug',
|
||||
path: 'src/content/tutorials/*',
|
||||
schema: {
|
||||
slug: fields.text({
|
||||
label: 'Slug (URL)',
|
||||
validation: { length: { min: 1, max: 80 } },
|
||||
}),
|
||||
category: fields.select({
|
||||
label: 'Categoría',
|
||||
options: [
|
||||
{ label: 'Correo', value: 'correo' },
|
||||
{ label: 'WordPress', value: 'wordpress' },
|
||||
{ label: 'Dominios', value: 'dominios' },
|
||||
{ label: 'cPanel', value: 'cpanel' },
|
||||
{ label: 'SSL', value: 'ssl' },
|
||||
{ label: 'Backups', value: 'backups' },
|
||||
],
|
||||
}),
|
||||
updatedAt: fields.date({
|
||||
label: 'Última actualización',
|
||||
}),
|
||||
title_es: fields.text({ label: 'Título (ES)' }),
|
||||
title_en: fields.text({ label: 'Título (EN)' }),
|
||||
summary_es: fields.text({ label: 'Resumen (ES)', multiline: true }),
|
||||
summary_en: fields.text({ label: 'Resumen (EN)', multiline: true }),
|
||||
content_es: fields.mdx({ label: 'Contenido (ES)' }),
|
||||
content_en: fields.mdx({ label: 'Contenido (EN)' }),
|
||||
},
|
||||
}),
|
||||
},
|
||||
singletons: {
|
||||
siteSettings: singleton({
|
||||
label: 'Configuración del sitio',
|
||||
path: 'src/content/settings/site',
|
||||
schema: {
|
||||
contactEmail: fields.text({ label: 'Email de contacto' }),
|
||||
whatsappNumber: fields.text({ label: 'WhatsApp (con código país, sin +)' }),
|
||||
whatsappDefaultMessage_es: fields.text({ label: 'Mensaje inicial WhatsApp (ES)' }),
|
||||
whatsappDefaultMessage_en: fields.text({ label: 'Mensaje inicial WhatsApp (EN)' }),
|
||||
addressLine: fields.text({ label: 'Dirección (línea corta)' }),
|
||||
socialLinkedin: fields.url({ label: 'LinkedIn URL' }),
|
||||
socialGithub: fields.url({ label: 'GitHub URL' }),
|
||||
},
|
||||
}),
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user