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,8 @@
<a
data-control="popup"
data-size="huge"
data-handler="onRelationButtonAdd"
href="javascript:;"
class="btn btn-sm btn-secondary wn-icon-plus">
<?= e(trans($text, ['name' => trans($relationLabel)])) ?>
</a>

View File

@@ -0,0 +1,8 @@
<a
data-control="popup"
data-size="huge"
data-handler="onRelationButtonCreate"
href="javascript:;"
class="btn btn-sm btn-secondary wn-icon-file">
<?= e(trans($text, ['name' => trans($relationLabel)])) ?>
</a>

View File

@@ -0,0 +1,26 @@
<?php if ($relationViewMode == 'single'): ?>
<button
class="btn btn-sm btn-secondary wn-icon-trash-o"
data-request="onRelationButtonDelete"
data-request-confirm="<?= e(trans('backend::lang.relation.delete_confirm')) ?>"
data-request-success="$.wn.relationBehavior.changed('<?= e($relationField) ?>', 'deleted')"
data-stripe-load-indicator>
<?= e(trans($text)) ?>
</button>
<?php else: ?>
<button
class="btn btn-sm btn-secondary wn-icon-trash-o"
onclick="$(this).data('request-data', {
checked: $('#<?= $this->relationGetId('view') ?> .control-list').listWidget('getChecked')
})"
disabled="disabled"
data-request="onRelationButtonDelete"
data-request-confirm="<?= e(trans('backend::lang.relation.delete_confirm')) ?>"
data-request-success="$.wn.relationBehavior.changed('<?= e($relationField) ?>', 'deleted')"
data-trigger-action="enable"
data-trigger="#<?= $this->relationGetId('view') ?> .control-list input[type=checkbox]"
data-trigger-condition="checked"
data-stripe-load-indicator>
<?= e(trans($text)) ?>
</button>
<?php endif ?>

View File

@@ -0,0 +1,8 @@
<a
data-control="popup"
data-size="huge"
data-handler="onRelationButtonLink"
href="javascript:;"
class="btn btn-sm btn-secondary wn-icon-link">
<?= e(trans($text, ['name' => trans($relationLabel)])) ?>
</a>

View File

@@ -0,0 +1,6 @@
<button
class="btn btn-sm btn-secondary wn-icon-arrows-rotate"
data-request="onRelationButtonRefresh"
data-stripe-load-indicator>
<?= e(trans($text)) ?>
</button>

View File

@@ -0,0 +1,24 @@
<?php if ($relationViewMode == 'single'): ?>
<button
class="btn btn-sm btn-secondary wn-icon-minus"
data-request="onRelationButtonRemove"
data-request-success="$.wn.relationBehavior.changed('<?= e($relationField) ?>', 'removed')"
data-stripe-load-indicator>
<?= e(trans($text)) ?>
</button>
<?php else: ?>
<button
class="btn btn-sm btn-secondary wn-icon-minus"
onclick="$(this).data('request-data', {
checked: $('#<?= $this->relationGetId('view') ?> .control-list').listWidget('getChecked')
})"
disabled="disabled"
data-request="onRelationButtonRemove"
data-request-success="$.wn.relationBehavior.changed('<?= e($relationField) ?>', 'removed')"
data-trigger-action="enable"
data-trigger="#<?= $this->relationGetId('view') ?> .control-list input[type=checkbox]"
data-trigger-condition="checked"
data-stripe-load-indicator>
<?= e(trans($text)) ?>
</button>
<?php endif ?>

View File

@@ -0,0 +1,9 @@
<a
href="javascript:;"
class="btn btn-sm btn-secondary wn-icon-unlink"
data-request="onRelationButtonUnlink"
data-request-success="$.wn.relationBehavior.changed('<?= e($relationField) ?>', 'removed')"
data-request-confirm="<?= e(trans('backend::lang.relation.unlink_confirm')) ?>"
data-stripe-load-indicator>
<?= e(trans($text)) ?>
</a>

View File

@@ -0,0 +1,9 @@
<a
data-control="popup"
data-size="huge"
data-handler="onRelationButtonUpdate"
data-request-data="manage_id: '<?= $relationManageId ?>'"
href="javascript:;"
class="btn btn-sm btn-secondary wn-icon-pencil">
<?= e(trans($text, ['name' => trans($relationLabel)])) ?>
</a>

View File

@@ -0,0 +1,18 @@
<div
id="<?= $this->relationGetId() ?>"
data-request-data="_relation_field: '<?= $relationField ?>', _relation_extra_config: '<?= e(base64_encode(json_encode($relationExtraConfig))) ?>'"
class="relation-behavior relation-view-<?= $relationViewMode ?>">
<?php if ($toolbar = $this->relationRenderToolbar()): ?>
<!-- Relation Toolbar -->
<div id="<?= $this->relationGetId('toolbar') ?>" class="relation-toolbar">
<?= $toolbar ?>
</div>
<?php endif ?>
<!-- Relation View -->
<div id="<?= $this->relationGetId('view') ?>" class="relation-manager">
<?= $this->relationRenderView() ?>
</div>
</div>

View File

@@ -0,0 +1,71 @@
<div id="<?= $relationManageWidget->getId('managePopup') ?>">
<?php if ($relationManageId): ?>
<?= Form::ajax('onRelationManageUpdate', [
'data-popup-load-indicator' => true,
'sessionKey' => $newSessionKey,
'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'updated')",
]) ?>
<!-- Passable fields -->
<input type="hidden" name="manage_id" value="<?= $relationManageId ?>" />
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_mode" value="form" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title">
<?= e(trans($relationManageTitle, ['name' => trans($relationLabel)])) ?>
</h4>
</div>
<div class="modal-body">
<?= $relationManageWidget->render(['preview' => $this->readOnly]) ?>
</div>
<div class="modal-footer">
<?= $this->relationMakePartial('manage_form_footer_update') ?>
</div>
<?= Form::close() ?>
<?php else: ?>
<?= Form::ajax('onRelationManageCreate', [
'data-popup-load-indicator' => true,
'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'created')",
'sessionKey' => $newSessionKey
]) ?>
<!-- Passable fields -->
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />
<input type="hidden" name="_relation_mode" value="form" />
<input type="hidden" name="_relation_session_key" value="<?= $relationSessionKey ?>" />
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title">
<?= e(trans($relationManageTitle, ['name' => trans($relationLabel)])) ?>
</h4>
</div>
<div class="modal-body">
<?= $relationManageWidget->render() ?>
</div>
<div class="modal-footer">
<?= $this->relationMakePartial('manage_form_footer_create') ?>
</div>
<?= Form::close() ?>
<?php endif ?>
</div>
<script>
$.wn.relationBehavior.bindToPopups('#<?= $relationManageWidget->getId("managePopup") ?>', {
_relation_field: '<?= $relationField ?>',
_relation_mode: 'form'
})
</script>

View File

@@ -0,0 +1,11 @@
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.create')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>

View File

@@ -0,0 +1,20 @@
<?php if ($this->readOnly): ?>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.close')) ?>
</button>
<?php else: ?>
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.update')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>
<?php endif ?>

View File

@@ -0,0 +1,24 @@
<div id="relationManagePopup" data-request-data="_relation_field: '<?= $relationField ?>', _relation_mode: 'list'">
<?= Form::open() ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans($relationManageTitle, [
'name' => trans($relationLabel)
])) ?></h4>
</div>
<div class="list-flush">
<?php if ($relationSearchWidget): ?>
<?= $relationSearchWidget->render() ?>
<?php endif ?>
<?php if ($relationManageFilterWidget): ?>
<?= $relationManageFilterWidget->render() ?>
<?php endif ?>
<?= $relationManageWidget->render() ?>
</div>
<div class="modal-footer">
<?= $this->relationMakePartial('manage_list_footer') ?>
</div>
<?= Form::close() ?>
</div>

View File

@@ -0,0 +1,17 @@
<?php if ($relationManageWidget->showCheckboxes): ?>
<button
type="button"
class="btn btn-primary"
data-request="onRelationManageAdd"
data-dismiss="popup"
data-request-success="$.wn.relationBehavior.changed('<?= e($relationField) ?>', 'added')"
data-stripe-load-indicator>
<?= e(trans('backend::lang.relation.add_selected')) ?>
</button>
<?php endif ?>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>

View File

@@ -0,0 +1,32 @@
<div id="relationManagePivotPopup" data-request-data="_relation_field: '<?= $relationField ?>'">
<?= Form::open() ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans($relationManageTitle, ['name'=>trans($relationLabel)])) ?></h4>
</div>
<?php if (!$relationSearchWidget): ?>
<div class="modal-body">
<p><?= e(trans('backend::lang.relation.help')) ?></p>
</div>
<?php endif ?>
<div class="list-flush">
<?php if ($relationSearchWidget): ?>
<?= $relationSearchWidget->render() ?>
<?php endif ?>
<?php if ($relationManageFilterWidget): ?>
<?= $relationManageFilterWidget->render() ?>
<?php endif ?>
<?= $relationManageWidget->render() ?>
</div>
<div class="modal-footer">
<?= $this->relationMakePartial('manage_pivot_footer') ?>
</div>
<?= Form::close() ?>
</div>
<script>
setTimeout(
function(){ $('#relationManagePivotPopup input.form-control:first').focus() },
310
)
</script>

View File

@@ -0,0 +1,18 @@
<?php if ($relationManageWidget->showCheckboxes): ?>
<button
type="button"
class="btn btn-primary"
data-control="popup"
data-handler="onRelationManageAddPivot"
data-size="huge"
data-dismiss="popup"
data-stripe-load-indicator>
<?= e(trans('backend::lang.relation.add_selected')) ?>
</button>
<?php endif ?>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>

View File

@@ -0,0 +1,53 @@
<?php if ($relationManageId): ?>
<?= Form::ajax('onRelationManagePivotUpdate', [
'data' => ['_relation_field' => $relationField, 'manage_id' => $relationManageId],
'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'updated')",
'data-popup-load-indicator' => true
]) ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans('backend::lang.relation.related_data', ['name'=>trans($relationLabel)])) ?></h4>
</div>
<div class="modal-body">
<?= $relationPivotWidget->render(['preview' => $this->readOnly]) ?>
</div>
<div class="modal-footer">
<?= $this->relationMakePartial('pivot_form_footer') ?>
</div>
<?= Form::close() ?>
<?php else: ?>
<?= Form::ajax('onRelationManagePivotCreate', [
'data' => ['_relation_field' => $relationField, 'foreign_id' => $foreignId],
'data-request-success' => "$.wn.relationBehavior.changed('" . e($relationField) . "', 'created')",
'data-popup-load-indicator' => true
]) ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans('backend::lang.relation.related_data', ['name'=>trans($relationLabel)])) ?></h4>
</div>
<div class="modal-body">
<?= $relationPivotWidget->render() ?>
</div>
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.add')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>
</div>
<?= Form::close() ?>
<?php endif ?>

View File

@@ -0,0 +1,20 @@
<?php if ($this->readOnly): ?>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.close')) ?>
</button>
<?php else: ?>
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.relation.update')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.relation.cancel')) ?>
</button>
<?php endif ?>

View File

@@ -0,0 +1,18 @@
<div data-control="toolbar">
<?php foreach ($relationToolbarButtons as $type => $text): ?>
<?php if ($type === 'update'): ?>
<?= $this->relationMakePartial('button_update', [
'relationManageId' => $relationViewModel->getKey(),
'text' => $text
]) ?>
<?php else: ?>
<?= $this->relationMakePartial('button_' . $type, [
'text' => $text
]) ?>
<?php endif ?>
<?php endforeach ?>
</div>

View File

@@ -0,0 +1,5 @@
<?php if ($relationViewFilterWidget): ?>
<?= $relationViewFilterWidget->render() ?>
<?php endif ?>
<?= $relationViewWidget->render() ?>