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,28 @@
<?php
/** @var array{previous: mixed, next: mixed, current: int, total: int} $navigation */
$previousUrl = $navigation['previous'] !== null
? $this->actionUrl($navigationContext, $navigation['previous'])
: null;
$nextUrl = $navigation['next'] !== null
? $this->actionUrl($navigationContext, $navigation['next'])
: null;
$chevronUp = '<svg viewBox="0 0 16 16" width="13" height="13" aria-hidden="true"><path d="M4 10l4-4 4 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>';
$chevronDown = '<svg viewBox="0 0 16 16" width="13" height="13" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>';
?>
<div class="form-record-nav" role="navigation" aria-label="<?= e(trans('backend::lang.form.record_navigation')) ?>">
<span class="form-record-nav-position">
<?= e($navigation['current']) ?>&nbsp;/&nbsp;<?= e($navigation['total']) ?>
</span>
<span class="form-record-nav-group">
<?php if ($previousUrl): ?>
<a href="<?= e($previousUrl) ?>" class="form-record-nav-btn" title="<?= e(trans('backend::lang.form.previous_record')) ?>" data-hotkey="ctrl+up, cmd+up"><?= $chevronUp ?></a>
<?php else: ?>
<span class="form-record-nav-btn is-disabled" aria-disabled="true"><?= $chevronUp ?></span>
<?php endif ?>
<?php if ($nextUrl): ?>
<a href="<?= e($nextUrl) ?>" class="form-record-nav-btn" title="<?= e(trans('backend::lang.form.next_record')) ?>" data-hotkey="ctrl+down, cmd+down"><?= $chevronDown ?></a>
<?php else: ?>
<span class="form-record-nav-btn is-disabled" aria-disabled="true"><?= $chevronDown ?></span>
<?php endif ?>
</span>
</div>

View File

@@ -0,0 +1,81 @@
<?php
$modelName = $formConfig->name ?? '';
?>
<?php if ($formContext === 'create'): ?>
<div class="loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-request-data="new:1"
data-browser-validate
data-hotkey="ctrl+shift+s, cmd+shift+s"
data-load-indicator="<?= e(trans('backend::lang.form.creating_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-primary wn-icon-plus">
<?= e(trans('backend::lang.form.create_and_new')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.creating_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-primary wn-icon-save">
<?= e(trans('backend::lang.form.create')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.creating_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-default wn-icon-check">
<?= e(trans('backend::lang.form.create_and_close')); ?>
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url($formConfig->defaultRedirect) ?>"><?= e(trans('backend::lang.form.cancel')); ?></a>
</span>
</div>
<?php elseif ($formContext === 'update'): ?>
<div class="loading-indicator-container">
<button
type="button"
data-request="onSave"
data-browser-validate
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
data-request-data="redirect:0"
data-hotkey="ctrl+s, cmd+s"
class="btn btn-primary wn-icon-save"
>
<?= e(trans('backend::lang.form.save')); ?>
</button>
<button
type="button"
data-request="onSave"
data-browser-validate
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
class="btn btn-default wn-icon-check"
>
<?= e(trans('backend::lang.form.save_and_close')); ?>
</button>
<button
type="button"
data-request="onDelete"
data-load-indicator="<?= e(trans('backend::lang.form.deleting_name', ['name' => trans($modelName)])); ?>"
data-request-before-update="$el.trigger('unchange.oc.changeMonitor')"
data-request-confirm="<?= e(trans('backend::lang.form.confirm_delete')); ?>"
class="wn-icon-trash-o btn-icon danger pull-right"
>
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url($formConfig->defaultRedirect) ?>"><?= e(trans('backend::lang.form.cancel')); ?></a>
</span>
</div>
<?php endif ?>