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,3 @@
/**
* Css here
*/

View File

@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -0,0 +1 @@
console.log('hello world!');

View File

@@ -0,0 +1,8 @@
import { createApp } from "vue";
// import Example from "./components/Example.vue";
//
// const app = createApp({
// components: {Example}
// });
//
// app.mount("#example");

View File

@@ -0,0 +1,4 @@
const mix = require('laravel-mix');
mix.setPublicPath(__dirname);
mix.js('assets/src/js/{{packageName}}.js', 'assets/dist/js/{{packageName}}.js');

View File

@@ -0,0 +1,7 @@
import React from "react";
const App = () => {
return <h1>Hello from React in Winter CMS!</h1>;
};
export default App;

View File

@@ -0,0 +1 @@
import('./{{packageName}}.jsx');

View File

@@ -0,0 +1,5 @@
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./components/App.jsx";
ReactDOM.createRoot(document.getElementById("root")).render(<App />);

View File

@@ -0,0 +1,5 @@
export default {
plugins: {
tailwindcss: {},
},
};

View File

@@ -0,0 +1,15 @@
import defaultTheme from 'tailwindcss/defaultTheme';
import forms from '@tailwindcss/forms';
/** @type {import('tailwindcss').Config} */
export default {
content: [
'./assets/src/js/**/*.{js,jsx}',
'./blocks/**/*.block',
'./components/**/*.{htm,php}',
'./controllers/**/*.{htm,php}',
'./formwidgets/**/*.{htm,php}',
'./widgets/**/*.{htm,php}',
],
plugins: [forms],
};

View File

@@ -0,0 +1,15 @@
import defaultTheme from 'tailwindcss/defaultTheme';
import forms from '@tailwindcss/forms';
/** @type {import('tailwindcss').Config} */
export default {
content: [
'./assets/src/js/**/*.{js,jsx}',
'./blocks/**/*.block',
'./layouts/**/*.htm',
'./pages/**/*.htm',
'./partials/**/*.htm',
'./content/**/*.htm',
],
plugins: [forms],
};

View File

@@ -0,0 +1,30 @@
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
const defaultOutDir = 'assets/dist';
export default defineConfig({
base: `${process.env.VITE_BASE}/${defaultOutDir}`,
build: {
outDir: defaultOutDir,
assetsDir: '',
},
plugins: [
laravel({
publicDirectory: defaultOutDir,
input: [
'assets/src/css/{{packageName}}.css',
'assets/src/js/{{packageName}}.js',
],
refresh: {
paths: [
'./**/*.htm',
'./**/*.block',
'assets/src/**/*.css',
'assets/src/**/*.js',
'assets/src/**/*.jsx',
]
},
}),
],
});

View File

@@ -0,0 +1,87 @@
const basePath = '%base%';
const { assertSupportedNodeVersion } = require(basePath + '/node_modules/laravel-mix/src/Engine');
module.exports = async () => {
assertSupportedNodeVersion();
const mix = require(basePath + '/node_modules/laravel-mix/src/Mix').primary;
mix.listen('init', function (_mix) {
// Setup Winter path aliases
_mix._api.alias({
'$': '%pluginsPath%',
'~': '%appPath%',
});
// disable notifications if not in watch
%notificationInject%
// define options
_mix._api.options({
processCssUrls: false,
clearConsole: false,
cssNano: {
discardComments: {removeAll: true},
}
});
// enable source maps for dev builds
if (!_mix._api.inProduction()) {
_mix._api.webpackConfig({
devtool: 'inline-source-map'
});
_mix._api.sourceMaps();
}
// Disable default manifest, allow for custom manifest
if (_mix.config.manifest === 'mix-manifest.json') {
mix.manifest.refresh = _ => void 0;
} else {
if (_mix.config.manifest === true) {
_mix.config.manifest = 'mix-manifest.json';
}
}
});
// override default mix output
mix.listen("loading-plugins", function (plugins) {
plugins.forEach(function (plugin, index) {
switch (plugin.constructor.name) {
case "BuildOutputPlugin":
plugins[index].apply = function (compiler) {
compiler.hooks.done.tap('BuildOutputPlugin', stats => {
if (stats.hasErrors()) {
return false;
}
if (this.options.clearConsole) {
this.clearConsole();
}
let data = stats.toJson({
assets: true,
builtAt: true,
hash: true,
performance: true,
relatedAssets: this.options.showRelated
});
if (data.assets.length && !%silent%) {
console.log(this.statsTable(data));
}
});
};
break;
case "WebpackBarPlugin":
if (%silent% || %noProgress%) {
plugins[index].apply = _ => void 0;
}
break;
}
});
});
require('%mixConfigPath%');
await mix.installDependencies();
await mix.init();
return mix.build();
};

View File

@@ -0,0 +1,4 @@
const mix = require('laravel-mix');
mix.setPublicPath(__dirname + '/assets');
// Your mix configuration below