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,103 @@
<?php
namespace System\Console\Asset\Mix;
use System\Console\Asset\AssetCompile;
use Winter\Storm\Support\Facades\File;
use Winter\Storm\Support\Str;
class MixCompile extends AssetCompile
{
/**
* @var string|null The default command name for lazy loading.
*/
protected static $defaultName = 'mix:compile';
/**
* @var string The name and signature of this command.
*/
protected $signature = 'mix:compile
{webpackArgs?* : Arguments to pass through to the Webpack CLI}
{--f|production : Runs compilation in "production" mode}
{--s|silent : Enables silent mode, no output will be shown.}
{--d|disable-tty : Disable tty mode}
{--e|stop-on-error : Exit once an error is encountered}
{--m|manifest= : Defines package.json to use for compile}
{--p|package=* : Defines one or more packages to compile}
{--no-progress : Do not show mix progress}';
/**
* @var string The console command description.
*/
protected $description = 'Mix and compile assets';
/**
* @var array List of commands that this command replaces (aliases)
*/
protected $replaces = [
'mix:build'
];
/**
* Name of config file i.e. mix.webpack.js, vite.config.js
*/
protected string $configFile = 'mix.webpack.js';
/**
* Call the AssetCompile::compileHandle with the mix type
*/
public function handle(): int
{
return $this->compileHandle('mix');
}
/**
* Create the command array to create a Process object with
*/
protected function createCommand(string $configPath): array
{
$basePath = base_path();
$command = $this->argument('webpackArgs') ?? [];
array_unshift(
$command,
$basePath . sprintf('%1$snode_modules%1$s.bin%1$swebpack', DIRECTORY_SEPARATOR),
'build',
$this->option('silent') ? '--stats=none' : '--progress',
'--config=' . $this->getJsConfigPath($configPath)
);
return $command;
}
/**
* Create the temporary mix.webpack.js config file to run webpack with
*/
protected function beforeExecution(string $configPath): void
{
$basePath = base_path();
$fixture = File::get(__DIR__ . '/../fixtures/mix.webpack.js.fixture');
$config = Str::swap([
'%base%' => addslashes($basePath),
'%notificationInject%' => 'mix._api.disableNotifications();',
'%mixConfigPath%' => addslashes($configPath),
'%pluginsPath%' => addslashes(plugins_path()),
'%appPath%' => addslashes(base_path()),
'%silent%' => (int) $this->option('silent'),
'%noProgress%' => (int) $this->option('no-progress')
], $fixture);
File::put($this->getJsConfigPath($configPath), $config);
}
/**
* Remove the temporary mix.webpack.js file
*/
protected function afterExecution(string $configPath): void
{
$webpackConfigPath = $this->getJsConfigPath($configPath);
if (File::exists($webpackConfigPath) && File::isFile($webpackConfigPath)) {
File::delete($webpackConfigPath);
}
}
}

View File

@@ -0,0 +1,37 @@
<?php namespace System\Console\Asset\Mix;
use System\Console\Asset\AssetCreate;
class MixCreate extends AssetCreate
{
/**
* @var string|null The default command name for lazy loading.
*/
protected static $defaultName = 'mix:create';
/**
* @var string The name and signature of this command.
*/
protected $signature = 'mix:create
{packageName : The package name to add configuration for}
{--no-stubs : Disable stub file generation}
{--s|silent : Enables silent mode, no output will be shown.}
{--f|force : Force file overwrites}';
/**
* @var array List of commands that this command replaces (aliases)
*/
protected $replaces = [
'mix:config',
];
/**
* The type of compilable to configure
*/
protected string $assetType = 'mix';
/**
* The name of the config file
*/
protected string $configFile = 'winter.mix.js';
}

View File

@@ -0,0 +1,44 @@
<?php namespace System\Console\Asset\Mix;
use System\Console\Asset\AssetInstall;
class MixInstall extends AssetInstall
{
/**
* @var string|null The default command name for lazy loading.
*/
protected static $defaultName = 'mix:install';
/**
* @var string The name and signature of this command.
*/
protected $signature = 'mix:install
{assetPackage?* : The asset package name to install.}
{--no-install : Tells Winter not to run npm install after config update.}
{--npm= : Defines a custom path to the "npm" binary.}
{--d|disable-tty : Disable tty mode.}
{--s|silent : Enables silent mode, no output will be shown.}
{--p|package-json= : Defines a custom path to "package.json" file. Must be above the workspace path.}';
/**
* @var string The console command description.
*/
protected $description = 'Install Node.js dependencies required for mixed assets';
/**
* The asset compiler being used
*/
protected string $assetType = 'mix';
/**
* The asset config file
*/
protected string $configFile = 'winter.mix.js';
/**
* The required packages for this compiler
*/
protected array $requiredDependencies = [
'laravel-mix' => '^6.0.41',
];
}

View File

@@ -0,0 +1,29 @@
<?php
namespace System\Console\Asset\Mix;
use System\Console\Asset\AssetList;
class MixList extends AssetList
{
/**
* @var string|null The default command name for lazy loading.
*/
protected static $defaultName = 'mix:list';
/**
* @var string The name and signature of this command.
*/
protected $signature = 'mix:list
{--json : Output as JSON}';
/**
* @var string The console command description.
*/
protected $description = 'List all registered Mix packages in this project.';
/**
* The asset compiler being used
*/
protected string $assetType = 'mix';
}

View File

@@ -0,0 +1,66 @@
<?php
namespace System\Console\Asset\Mix;
class MixWatch extends MixCompile
{
/**
* @var string|null The default command name for lazy loading.
*/
protected static $defaultName = 'mix:watch';
/**
* @var string The name and signature of this command.
*/
protected $signature = 'mix:watch
{package : Defines the package to watch for changes}
{webpackArgs?* : Arguments to pass through to the Webpack CLI}
{--f|production : Runs compilation in "production" mode}
{--m|manifest= : Defines package.json to use for compile}
{--s|silent : Enables silent mode, no output will be shown.}
{--d|disable-tty : Disable tty mode}
{--no-progress : Do not show mix progress}';
/**
* @var string The console command description.
*/
protected $description = 'Mix and compile assets on-the-fly as changes are made.';
/**
* @var array List of commands that this command replaces (aliases)
*/
protected $replaces = [
'mix:dev'
];
/**
* Call the AssetCompile::watchHandle with the mix type
*/
public function handle(): int
{
return $this->watchHandle('mix');
}
/**
* Create the command array to create a Process object with
*/
protected function createCommand(string $configPath): array
{
$command = parent::createCommand($configPath);
// @TODO: Detect Homestead running on Windows to switch to watch-poll-options instead, see https://laravel-mix.com/docs/6.0/cli#polling
$command[] = '--watch';
return $command;
}
/**
* Handle the cleanup of this command if a termination signal is received
*/
public function handleCleanup(): void
{
$this->newLine();
$this->info('Cleaning up: ' . $this->getPackagePath($this->watchingFilePath));
$this->afterExecution(base_path($this->watchingFilePath));
}
}