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

11
.devcontainer/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
},
]
}

72
.devcontainer/README.md Normal file
View File

@@ -0,0 +1,72 @@
# Welcome to the Winter development environment
<p align="center">
<img src="https://github.com/wintercms/winter/raw/develop/.github/assets/Github%20Banner.png?raw=true" alt="Winter CMS Logo" width="100%" style="max-width: 600px" />
</p>
This development environment container sets up a fully-functional installation of Winter CMS, built on [FrankenPHP](https://frankenphp.dev/) with PHP 8.4. It makes it simple to start working with Winter CMS in VSCode, PHPStorm and online code-editing suites such as GitHub Codespaces.
This image is based on the official [Winter CMS Docker image](https://github.com/wintercms/docker) and inherits all its features. For detailed configuration options, see the [Docker image README](https://github.com/wintercms/docker/blob/main/README.md).
If you opted to use the `bootstrap-winter` feature, which is enabled by default, Winter CMS will be automatically configured and an administrator account will be generated with the credentials **admin / admin** for you to quickly sign in. It is recommended once you have done so that you change this password immediately.
The following plugins and themes will be installed automatically with this feature:
- Workshop theme (https://github.com/wintercms/wn-workshop-theme)
- Pages plugin (https://github.com/wintercms/wn-pages-plugin)
- Blog plugin (https://github.com/wintercms/wn-blog-plugin)
- Test plugin (https://github.com/wintercms/wn-test-plugin)
## Using this environment
When this environment is built, FrankenPHP is automatically started, with the root folder of the Winter project being used. A preview of the website will be opened immediately - if you do not see this, you can open the **Ports** tab in VSCode to view the URL generated for viewing the project.
XDebug is enabled by default, and allows you to quickly use step debugging. It will be available in the **Debug** tab of VSCode or similar screen in other IDEs.
By default, when using the `bootstrap-winter` feature, changes to certain folders and locations will be ignored by Git to keep the change list clean. This includes the `plugins` and `themes` folders, the `config/app.php` file and the `composer.json` file in the root folder. If you wish to use this environment for your own projects, it is recommended that you do not use this feature. Please see the **Using in your own projects** section below for using this environment outside of Winter development.
## Environment platform
The following software is installed in this environment.
- FrankenPHP (Caddy)
- PHP 8.4 with the following extensions:
- `intl`
- `gd`
- `xdebug`
- Composer
- NodeJS 24 (including `npm`)
- Git
## Using in your own projects
You may use this development environment for your own projects, making it a great starting point to hit the ground running with Winter. It is recommended that you *disable* the `bootstrap-winter` feature when using this environment for your own projects.
You may disable this feature by modifying the `.devcontainer/devcontainer.json` file before running the container and commenting out the feature:
```json5
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {},
"ghcr.io/devcontainers/features/github-cli:1": {},
// Comment the following feature if you wish to bootstrap and configure Winter manually (ie. you wish to use this for your own project)
"./local-features/bootstrap-winter": "latest"
},
```
If this feature is disabled, you must bootstrap your project manually. This includes:
- Downloading the Composer dependencies.
- Generating the configuration for the project, either as an `.env` file or in the `config` folder.
- Finally, Running the database migrations.
You may view the `.devcontainer/local-features/bootstrap-winter/bootstrap.sh` file to see how we bootstrap Winter, and run these commands manually. You will only need to do this once per project container.
If you wish to mount your own volumes, use your own databases or any other complex usages, please review the [Winter Docker image documentation](https://github.com/wintercms/docker/blob/main/README.md#persisting-data) or the [FrankenPHP environment variables](https://frankenphp.dev/docs/config/#environment-variables) for configuration options.
## Troubleshooting
### Preview website missing styles / assets on Codespaces
By default, ports that are forwarded in Codespaces are private by default. While we have tried to fix this automatically in the Winter bootstrap process by making the port public through the GitHub CLI, it unfortunately is not consistently applied.
If you find that your preview website is missing assets or styling, open the **Ports** tab by opening the Action Palette in Codespaces (`F1`) and using the **View: Toggle Ports** action. Right click on the **Preview Winter installation** port, right click on it and choose **Port Visiblity -> Public**. This should resolve the issue.

View File

@@ -0,0 +1,60 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/debian
{
"name": "Winter on PHP 8.4",
"image": "ghcr.io/wintercms/winter:latest",
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
"configureZshAsDefaultShell": true,
"username": "winter",
"upgradePackages": false
},
"ghcr.io/devcontainers/features/github-cli:1": {},
// Comment the following feature if you wish to bootstrap and configure Winter manually (ie. you wish to use this for your own project)
"./local-features/bootstrap-winter": "latest"
},
"workspaceMount": "source=${localWorkspaceFolder},target=/winter,type=bind",
"workspaceFolder": "/winter",
"containerEnv": {
"APP_DEBUG": "true",
"XDEBUG_MODE": "debug",
"ROUTES_CACHE": "false",
"ASSET_CACHE": "false",
"DB_CONNECTION": "sqlite",
"DB_DATABASE": "${containerWorkspaceFolder}/storage/database.sqlite"
},
"forwardPorts": [8000],
"portsAttributes": {
"8000": {
"label": "Preview Winter installation",
"onAutoForward": "openPreview"
},
"9003": {
"label": "Xdebug",
"onAutoForward": "notify"
}
},
"customizations": {
"vscode": {
"settings": {
"php.validate.executablePath": "/usr/local/bin/php",
"phpcs.executablePath": "${containerWorkspaceFolder}/vendor/bin/phpcs"
},
"extensions": [
"xdebug.php-debug",
"bmewburn.vscode-intelephense-client",
"shevaua.phpcs",
"swordev.phpstan",
"wintercms.winter-cms"
]
},
"codespaces": {
"openFiles": [
".devcontainer/README.md"
]
}
},
"postAttachCommand": "nohup ${containerWorkspaceFolder}/.devcontainer/run-frankenphp.sh > /dev/null 2>&1",
"remoteUser": "winter"
}

View File

@@ -0,0 +1,51 @@
#!/usr/bin/env bash
set -e
if [ ! -d "${PWD}/vendor" ] && [ ! -f "${PWD}/composer.lock" ]; then
echo "### Updating Composer dependencies"
php ${PWD}/.devcontainer/local-features/bootstrap-winter/update-composer.php
composer update --no-interaction --no-scripts --no-audit
fi
if [ ! -f "${PWD}/.env" ]; then
echo "### Generating .env file"
php artisan winter:env -q
php artisan key:generate -q
fi
if [ "${DB_CONNECTION}" = "sqlite" ] && [ "${DB_DATABASE}" = "${PWD}/storage/database.sqlite" ] && [ ! -f "${PWD}/storage/database.sqlite" ]; then
SETUP_ADMIN=true
echo "### Creating SQLite database"
touch storage/database.sqlite
fi
echo "### Run migrations"
php artisan migrate
echo "### Set theme"
php artisan theme:use workshop
if [ "${SETUP_ADMIN}" = true ]; then
echo "### Setup admin"
php artisan winter:passwd admin admin
fi
echo "### Ignoring files in Git"
echo "plugins/*" >> "${PWD}/.git/info/exclude"
echo "themes/*" >> "${PWD}/.git/info/exclude"
echo "composer.json" >> "${PWD}/.git/info/exclude"
git update-index --assume-unchanged composer.json
git restore config
cp ${PWD}/.devcontainer/.vscode/launch.json ${PWD}/.vscode/launch.json
echo "### Mirror site to public directory"
php artisan winter:mirror public
if [ "${CODESPACES}" = "true" ]; then
echo "### Configure for Codespaces"
php ${PWD}/.devcontainer/local-features/bootstrap-winter/codespaces.php
git update-index --assume-unchanged config/app.php
gh codespace ports visibility 8000:public -c $CODESPACE_NAME
fi

View File

@@ -0,0 +1,25 @@
<?php
$root = dirname(__DIR__, 3);
require_once $root . '/vendor/autoload.php';
use Winter\LaravelConfigWriter\ArrayFile;
use Winter\LaravelConfigWriter\EnvFile;
$config = ArrayFile::open($root . '/config/app.php');
$config->set('trustedHosts', [
'localhost',
'^(.+\.)?app.github.dev',
]);
$config->set('trustedProxies', '*');
$config->write();
$env = EnvFile::open($root . '/.env');
$env->set('APP_URL', 'https://' . $_ENV['CODESPACE_NAME'] . '.app.github.dev');
$env->set('LINK_POLICY', 'force');
$env->write();

View File

@@ -0,0 +1,6 @@
{
"id": "bootstrap-winter",
"name": "Bootstrap Winter",
"description": "Bootstrap and configure Winter CMS automatically for development on Winter itself",
"postCreateCommand": "sh ./.devcontainer/local-features/bootstrap-winter/bootstrap.sh"
}

View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -e
# Install Xdebug extension
install-php-extensions xdebug
echo "Done"

View File

@@ -0,0 +1,27 @@
<?php
$composerPath = dirname(__DIR__, 3) . '/composer.json';
$composer = json_decode(file_get_contents($composerPath), true);
$packages = [
'winter/wn-test-plugin' => 'dev-main',
'winter/wn-blog-plugin' => 'dev-main',
'winter/wn-blog-plugin' => 'dev-main',
'winter/wn-workshop-theme' => 'dev-main',
];
// Install Winter packages
foreach ($packages as $package => $version) {
if (!in_array($package, array_keys($composer['require']))) {
$composer['require'][$package] = $version;
}
}
// Change Merge plugin config
$composer['extra']['merge-plugin']['include'] = [
'plugins/*/*/composer.json',
];
file_put_contents(
$composerPath,
json_encode($composer, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)
);

26
.devcontainer/run-frankenphp.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -e
USER_ID=$(id -u)
GROUP_ID=$(id -g)
# Ensure the Caddy config and data directories are owned by the current user
sudo chown -R $USER_ID:$GROUP_ID /config/caddy
sudo chown -R $USER_ID:$GROUP_ID /data
sudo touch /var/log/frankenphp.log
sudo chown $USER_ID:$GROUP_ID /var/log/frankenphp.log
# If debugging is enabled, disable Opcache so changes are reflected immediately
if [ "${APP_DEBUG}" = "true" ] || [ "${APP_DEBUG}" = "1" ]; then
sudo sed -i 's/opcache.enable = On/opcache.enable = Off/' /usr/local/etc/php/conf.d/winter.ini
fi
# Run server in background
if [ "${CODESPACES}" = "true" ]; then
# Ensure environment variables are set correctly for Codespaces
SERVER_NAME="http://:8000" APP_URL="https://${CODESPACE_NAME}-8000.app.github.dev" /usr/local/bin/frankenphp run -c /etc/frankenphp/Caddyfile -a caddyfile > /var/log/frankenphp.log 2>&1 &
else
/usr/local/bin/frankenphp run -c /etc/frankenphp/Caddyfile -a caddyfile > /var/log/frankenphp.log 2>&1 &
fi