feat: VivesPOS landing on Winter CMS 1.2 — theme + plugin + Dockerfile
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run

- Base: wintercms/winter branch 1.2 (full framework)
- Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS
- Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication
- Partials: hero (offline-first), features, modes (offline/nube toggle),
  screenshots, pricing (3 planes), comparison, FAQ, CTA
- Plugin VivesPOS.Site with ContactForm
- Dockerfile: PHP 8.2 Apache, port 80, healthcheck
- Added winter/wn-pages, blog, sitemap, seo plugins
- Active theme set to vivespos
This commit is contained in:
2026-08-21 19:29:00 -06:00
commit 1f72193a64
3266 changed files with 531480 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
description = "Site footer — links, branding, WhatsApp"
==
<footer class="bg-dark text-light pt-5 pb-4">
<div class="container">
<div class="row g-4">
<div class="col-lg-4">
<div class="d-flex align-items-center gap-2 mb-3">
<span style="background:var(--vp-brand);color:#fff;width:32px;height:32px;border-radius:.4rem;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:1rem;">V</span>
<span class="fw-bold fs-5">VivesPOS</span>
</div>
<p class="text-secondary small">Punto de venta offline-first para Mexico. Vende sin internet. Tus datos siempre tuyos. Diseniado para teclado y scanner de codigo de barras.</p>
<p class="text-secondary small mb-0">Hecho en Mexico. <span class="text-brand">VivesCloud</span>.</p>
</div>
<div class="col-6 col-lg-2">
<h5 class="h6 fw-bold mb-3">Producto</h5>
<ul class="list-unstyled footer-links small">
<li class="mb-2"><a href="#features">Caracteristicas</a></li>
<li class="mb-2"><a href="#modos">Offline vs Nube</a></li>
<li class="mb-2"><a href="#precios">Precios</a></li>
<li class="mb-2"><a href="#comparativa">Comparativa</a></li>
</ul>
</div>
<div class="col-6 col-lg-2">
<h5 class="h6 fw-bold mb-3">Recursos</h5>
<ul class="list-unstyled footer-links small">
<li class="mb-2"><a href="#faq">Preguntas frecuentes</a></li>
<li class="mb-2"><a href="#requisitos">Requisitos del sistema</a></li>
<li class="mb-2"><a href="#instalacion">Instalacion</a></li>
<li class="mb-2"><a href="{{ '/blog'|page }}">Blog</a></li>
</ul>
</div>
<div class="col-lg-3">
<h5 class="h6 fw-bold mb-3">Contacto</h5>
<p class="small text-secondary mb-2">WhatsApp: <a href="https://wa.me/523317025248" class="text-light" target="_blank" rel="noopener">+52 33 1702 5248</a></p>
<p class="small text-secondary mb-2">Soporte: L-V 9:00-18:00 CST</p>
<a href="https://wa.me/523317025248?text=Hola%2C%20quiero%20mas%20info%20de%20VivesPOS" class="btn btn-brand-cta btn-sm" target="_blank" rel="noopener">
<i class="bi-whatsapp me-1"></i>Agendar demo
</a>
</div>
</div>
<hr class="border-secondary my-4">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2">
<p class="text-secondary small mb-0">&copy; 2026 VivesPOS. Todos los derechos reservados.</p>
<p class="text-secondary small mb-0">Windows &middot; Linux &middot; Offline-first &middot; ESC/POS</p>
</div>
</div>
</footer>

View File

@@ -0,0 +1,30 @@
description = "Site header — navigation"
==
<nav class="navbar navbar-expand-lg bg-white border-bottom sticky-top" style="border-color:#e2e8f0;">
<div class="container">
<a class="navbar-brand fw-bold d-flex align-items-center gap-2" href="{{ '/'|page }}" style="color:var(--vp-brand);">
<span style="background:var(--vp-brand);color:#fff;width:32px;height:32px;border-radius:.4rem;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:1rem;">V</span>
VivesPOS
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navMain">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navMain">
<ul class="navbar-nav ms-auto align-items-lg-center gap-lg-2">
<li class="nav-item"><a class="nav-link" href="{{ '/'|page }}">Inicio</a></li>
<li class="nav-item"><a class="nav-link" href="#features">Caracteristicas</a></li>
<li class="nav-item"><a class="nav-link" href="#modos">Offline vs Nube</a></li>
<li class="nav-item"><a class="nav-link" href="#screens">Galeria</a></li>
<li class="nav-item"><a class="nav-link" href="#precios">Precios</a></li>
<li class="nav-item"><a class="nav-link" href="#comparativa">Comparativa</a></li>
<li class="nav-item"><a class="nav-link" href="#faq">FAQ</a></li>
<li class="nav-item"><a class="nav-link" href="{{ '/blog'|page }}">Blog</a></li>
<li class="nav-item ms-lg-2">
<a href="https://wa.me/523317025248?text=Hola%2C%20quiero%20mas%20info%20de%20VivesPOS" class="btn btn-brand-cta btn-sm px-3" target="_blank" rel="noopener">
<i class="bi-whatsapp me-1"></i>Contactar
</a>
</li>
</ul>
</div>
</div>
</nav>

View File

@@ -0,0 +1,75 @@
description = "JSON-LD SoftwareApplication structured data"
==
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "VivesPOS",
"applicationCategory": "BusinessApplication",
"applicationSubCategory": "Point of Sale",
"operatingSystem": "Windows, Linux",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "MXN"
},
"description": "Punto de venta offline-first para Mexico. Vende sin internet, tus datos siempre tuyos. Optimizado para teclado y scanner de codigo de barras.",
"inLanguage": "es-MX",
"author": {
"@type": "Organization",
"name": "VivesCloud",
"url": "https://www.vivescloud.com"
},
"featureList": [
"Offline-first: vende sin internet",
"Teclado y scanner de codigo de barras",
"Corte X y Corte Z",
"Impresion ESC/POS (USB, red, PDF)",
"Multi-metodo de pago: efectivo, tarjeta, mixto",
"Control de stock con alertas de minimo",
"Usuarios y roles: Administrador, Supervisor, Cajero",
"Clientes con datos SAT",
"Sincronizacion con la nube opcional",
"Backups manuales",
"Audit log"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "120"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "VivesPOS funciona sin internet?",
"acceptedAnswer": { "@type": "Answer", "text": "Si. VivesPOS es offline-first. Vende, cobra, imprime y controla stock sin conexion. La sincronizacion con la nube es opcional y ocurre en segundo plano cuando hay conexion." }
},
{
"@type": "Question",
"name": "En que sistemas operativos funciona?",
"acceptedAnswer": { "@type": "Answer", "text": "Windows 10/11 y Linux (AppImage o DEB). Requiere 4GB RAM minimo." }
},
{
"@type": "Question",
"name": "Necesito pagar una suscripcion mensual?",
"acceptedAnswer": { "@type": "Answer", "text": "No. VivesPOS no requiere suscripcion obligatoria. Puedes usarlo gratis o contratar soporte premium opcional." }
},
{
"@type": "Question",
"name": "Mis datos estan seguros?",
"acceptedAnswer": { "@type": "Answer", "text": "Tus datos 100% tuyos. Se guardan localmente en SQLite con backups manuales. Nunca se envian a servidores externos sin tu consentimiento." }
},
{
"@type": "Question",
"name": "Que impresoras soporta?",
"acceptedAnswer": { "@type": "Answer", "text": "Impresoras ESC/POS via USB, red, o sistema. Fallback a PDF si no hay impresora fisica." }
}
]
}
</script>

View File

@@ -0,0 +1,52 @@
description = "GTM + GA4 diferido post-load (PageSpeed optimizado)"
==
<script>
(function () {
var loaded = false;
function loadTracking() {
if (loaded) return;
loaded = true;
// Google Tag Manager
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-P9B758T');
// GA4
var g = document.createElement('script');
g.async = true;
g.src = 'https://www.googletagmanager.com/gtag/js?id=G-V6SX1D3XVE';
document.head.appendChild(g);
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
window.gtag = gtag;
gtag('js', new Date());
gtag('config', 'G-V6SX1D3XVE');
}
function schedule() {
if ('requestIdleCallback' in window) {
requestIdleCallback(function () { loadTracking(); }, { timeout: 3500 });
} else {
setTimeout(loadTracking, 2500);
}
}
['pointerdown', 'keydown', 'scroll', 'touchstart'].forEach(function (ev) {
window.addEventListener(ev, function () { loadTracking(); }, { once: true, passive: true });
});
if (document.readyState === 'complete') {
schedule();
} else {
window.addEventListener('load', schedule);
}
})();
</script>

View File

@@ -0,0 +1,7 @@
description = "WhatsApp floating button"
==
<a href="https://wa.me/523317025248?text=Hola%2C%20quiero%20mas%20info%20de%20VivesPOS" class="whatsapp-float" target="_blank" rel="noopener" aria-label="WhatsApp">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M.057 24l1.687-6.163a11.867 11.867 0 01-1.588-5.945C.16 5.335 5.495 0 12.05 0a11.817 11.817 0 018.413 3.488 11.824 11.824 0 013.48 8.414c-.003 6.557-5.338 11.892-11.893 11.892a11.9 11.9 0 01-5.688-1.448L.057 24zm6.597-3.807c1.676.995 3.276 1.591 5.392 1.592 5.448 0 9.886-4.434 9.889-9.885.002-5.462-4.415-9.89-9.881-9.892-5.452 0-9.887 4.434-9.889 9.884a9.86 9.86 0 001.51 5.26l-.999 3.648 3.978-1.607zm11.387-5.464c-.074-.124-.272-.198-.57-.347-.297-.149-1.758-.868-2.031-.967-.272-.099-.47-.149-.669.149-.198.297-.768.967-.941 1.165-.173.198-.347.223-.644.074-.297-.149-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.445.13-.594.131-.148.297-.347.446-.521.151-.172.2-.296.3-.495.099-.198.05-.372-.025-.521-.075-.148-.669-1.611-.916-2.206-.242-.579-.487-.501-.669-.51l-.57-.01c-.198 0-.52.074-.792.372s-1.04 1.016-1.04 2.479 1.065 2.876 1.213 3.074c.149.198 2.095 3.2 5.076 4.487.709.306 1.263.489 1.694.626.712.226 1.36.194 1.872.118.571-.085 1.758-.719 2.006-1.413.248-.695.248-1.29.173-1.414z"/>
</svg>
</a>