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,33 @@
/*
* Application
*/
(function($) {
"use strict";
jQuery(document).ready(function($) {
/*-------------------------------
WINTER CMS FLASH MESSAGE HANDLING
---------------------------------*/
$(document).on('ajaxSetup', function(event, context) {
// Enable AJAX handling of Flash messages on all AJAX requests
context.options.flash = true;
// Enable the StripeLoadIndicator on all AJAX requests
context.options.loading = $.oc.stripeLoadIndicator;
// Handle Flash Messages
context.options.handleFlashMessage = function(message, type) {
$.oc.flashMsg({ text: message, class: type });
};
// Handle Error Messages
context.options.handleErrorMessage = function(message) {
$.oc.flashMsg({ text: message, class: 'error' });
};
});
});
}(jQuery));
if (typeof(gtag) !== 'function') {
gtag = function() { console.log('GoogleAnalytics not present.'); }
}

View File

@@ -0,0 +1,5 @@
.content {
margin: 2em auto;
max-width: 1080px;
text-align: center;
}

View File

@@ -0,0 +1,7 @@
description = "Default layout"
==
{% partial "site/header" %}
{% page %}
{% partial "site/footer" %}

View File

@@ -0,0 +1,8 @@
title = "Page not found (404)"
url = "/404"
layout = "default"
==
<div class="content">
<h1>Page not found</h1>
<p>We're sorry, but the page you requested cannot be found.</p>
</div>

View File

@@ -0,0 +1,8 @@
title = "Error page (500)"
url = "/error"
layout = "default"
==
<div class="content">
<h1>Error</h1>
<p>We're sorry, but something went wrong and the page cannot be displayed.</p>
</div>

View File

@@ -0,0 +1,7 @@
title = "Home"
url = "/"
layout = "default"
==
<div class="content">
<h1>Home Page</h1>
</div>

View File

@@ -0,0 +1,11 @@
{% if this.theme.googleanalytics_id is not empty %}
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ this.theme.googleanalytics_id }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ this.theme.googleanalytics_id }}');
</script>
{% endif %}

View File

@@ -0,0 +1,4 @@
<link rel="stylesheet" href="{{ ['assets/less/theme.less'] | theme }}">
{% styles %}
{% placeholder head %}

View File

@@ -0,0 +1,17 @@
<!-- Scripts -->
<script src="{{ [
'@jquery',
'@framework',
'@framework.extras',
'assets/js/app.js',
] | theme }}"></script>
{% scripts %}
{% flash %}
<p data-control="flash-message" data-interval="7" class="flashmessage {{ type }}">
{{ message }}
</p>
{% endflash %}
</body>
</html>

View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% placeholder page_title default %}{{ this.page.title }}{% endplaceholder %}</title>
{% partial "meta/styles" %}
{% partial "meta/seo" %}
<meta name="generator" content="Winter CMS">
</head>
{% set pageId = this.page.id %}
{% set pageTitle = this.page.title %}
{% if pageId is empty %}
{% set pageId = page.id %}
{% endif %}
{% if pageTitle is empty %}
{% set pageTitle = page.title %}
{% endif %}
<body class="page-{{ pageId }} layout-{{ this.layout.id }}">

View File

@@ -0,0 +1,9 @@
name: "{{code}}"
description: "No description provided yet..."
author: "Winter CMS Scaffold"
homepage: "https://example.com"
code: "{{code}}"
form:
fields:
googleanalytics_id:
label: 'Google Analytics ID'

View File

@@ -0,0 +1 @@
1.0.1: 'Initial version'

View File

@@ -0,0 +1,2 @@
node_modules/
dist/

View File

@@ -0,0 +1,9 @@
# {{code}} Winter CMS Theme
This theme uses [Vite](https://wintercms.com/docs/develop/docs/console/asset-compilation-vite) for asset compilation. It also uses [Tailwind CSS](https://tailwindcss.com/).
## Getting Started
1. Run [`artisan vite:install`](https://wintercms.com/docs/console/asset-compilation#mix-install) and agree when asked to modify the `package.json` file for your project in order to register & install this theme's dependencies.
2. Run [`artisan vite:compile -p theme-{{code}} --production`](https://wintercms.com/docs/develop/docs/console/asset-compilation-vite#compile-a-vite-packages) to compile the asset files for this theme.
3. Optionally, run [`artisan vite:watch theme-{{code}}`](https://wintercms.com/docs/develop/docs/console/asset-compilation-vite#watch-a-vite-package) while actively working on the theme to have the assets automatically recompiled in the background for you every time you make a change.

View File

@@ -0,0 +1,9 @@
<?php
return [
'options' => [
'googleanalytics_id' => 'Google Analytics ID',
'color_primary' => 'Primary Color',
'color_secondary' => 'secondary Color',
],
];

View File

@@ -0,0 +1,8 @@
description = "Default layout"
default = true
==
{% partial "site/header" %}
{% page %}
{% partial "site/footer" %}

View File

@@ -0,0 +1,8 @@
title = "Page not found (404)"
url = "/404"
layout = "default"
==
<div>
<h1>Page not found</h1>
<p>We're sorry, but the page you requested cannot be found.</p>
</div>

View File

@@ -0,0 +1,8 @@
title = "Error page (500)"
url = "/error"
layout = "default"
==
<div>
<h1>Error</h1>
<p>We're sorry, but something went wrong and the page cannot be displayed.</p>
</div>

View File

@@ -0,0 +1,7 @@
title = "Home"
url = "/"
layout = "default"
==
<div class="container mx-auto">
<h1><span class="text-primary">Home</span> <span class="text-secondary">Page</span></h1>
</div>

View File

@@ -0,0 +1,11 @@
{% if this.theme.googleanalytics_id is not empty %}
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ this.theme.googleanalytics_id }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ this.theme.googleanalytics_id }}');
</script>
{% endif %}

View File

@@ -0,0 +1,12 @@
==
{{ vite(['assets/src/css/theme-{{code}}.css'], 'theme-{{code}}') }}
<style>
:root {
--primary: {{ this.theme.color_primary }};
--secondary: {{ this.theme.color_secondary }};
}
</style>
{% styles %}
{% placeholder head %}

View File

@@ -0,0 +1,21 @@
<!-- Scripts -->
{# jQuery AJAX Framework #}
<script src="{{ [
'@jquery',
'@framework',
'@framework.extras',
] | theme }}"></script>
{# Vite extracted assets #}
{{ vite(['assets/src/js/theme-{{code}}.js'], 'theme-{{code}}') }}
{% scripts %}
{% flash %}
<p data-control="flash-message" data-interval="7" class="flashmessage {{ type }}">
{{ message }}
</p>
{% endflash %}
</body>
</html>

View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% placeholder page_title default %}{{ this.page.title }}{% endplaceholder %}</title>
{% partial "meta/styles" %}
{% partial "meta/seo" %}
<meta name="generator" content="Winter CMS">
</head>
{% set pageId = this.page.id %}
{% set pageTitle = this.page.title %}
{% if pageId is empty %}
{% set pageId = page.id %}
{% endif %}
{% if pageTitle is empty %}
{% set pageTitle = page.title %}
{% endif %}
<body class="page-{{ pageId }} layout-{{ this.layout.id }}">

View File

@@ -0,0 +1,21 @@
name: "{{code}}"
description: "No description provided yet..."
author: "Winter CMS Scaffold"
homepage: "https://example.com"
code: "{{code}}"
form:
fields:
googleanalytics_id:
label: themes.{{code}}::lang.options.googleanalytics_id
type: text
span: full
color_primary:
label: themes.{{code}}::lang.options.color_primary
type: colorpicker
span: left
default: "#103141"
color_secondary:
label: themes.{{code}}::lang.options.color_secondary
type: colorpicker
span: right
default: "#2DA7C7"

View File

@@ -0,0 +1 @@
1.0.0: 'Initial version'