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 @@
<div class="list-widget list-scrollable-container <?= $cssClasses ?>" id="<?= $this->getId() ?>">
<?= $this->makePartial('list') ?>
</div>

View File

@@ -0,0 +1,42 @@
<div class="control-list list-scrollable" data-control="listwidget"
<?php if ($sortable): ?>
data-sortable="true"
data-reorder-handler="<?= e($reorderHandler) ?>"
<?php endif ?>
>
<table class="table data" data-control="rowlink">
<thead>
<?php if ($showTotals): ?>
<?= $this->makePartial('list_totals') ?>
<?php endif; ?>
<?= $this->makePartial('list_head_row') ?>
</thead>
<tbody>
<?php if (count($records)): ?>
<?= $this->makePartial('list_body_rows') ?>
<?php else: ?>
<tr class="no-data">
<td colspan="<?= $columnTotal ?>" class="nolink">
<p class="no-data"><?= $noRecordsMessage ?></p>
</td>
</tr>
<?php endif ?>
</tbody>
<?php if ($showTotals): ?>
<tfoot>
<?= $this->makePartial('list_totals') ?>
</tfoot>
<?php endif; ?>
</table>
<?php if ($showPagination): ?>
<div class="list-footer">
<div class="list-pagination">
<?php if ($showPageNumbers): ?>
<?= $this->makePartial('list_pagination') ?>
<?php else: ?>
<?= $this->makePartial('list_pagination_simple') ?>
<?php endif ?>
</div>
</div>
<?php endif ?>
</div>

View File

@@ -0,0 +1,11 @@
<td class="list-checkbox nolink">
<div class="checkbox custom-checkbox nolabel">
<input
type="checkbox"
name="checked[]"
id="<?= $this->getId('checkbox-' . $record->getKey()) ?>"
value="<?= $record->getKey() ?>"
autocomplete="off"/>
<label for="<?= $this->getId('checkbox-' . $record->getKey()) ?>"><?= e(trans('backend::lang.list.check')) ?></label>
</div>
</td>

View File

@@ -0,0 +1,47 @@
<?php
$expanded = $showTree ? $this->isTreeNodeExpanded($record) : null;
$childRecords = $showTree ? $record->getChildren() : null;
$treeLevelClass = $showTree ? 'list-tree-level-'.$treeLevel : '';
?>
<tr class="<?= $treeLevelClass ?> <?= $this->getRowClass($record) ?>"
data-record-id="<?= e($record->getKey()) ?>"
>
<?php if ($showCheckboxes): ?>
<?= $this->makePartial('list_body_checkbox', ['record' => $record]) ?>
<?php endif ?>
<?php if ($showTree): ?>
<?= $this->makePartial('list_body_tree', [
'record' => $record,
'expanded' => $expanded,
'childCount' => $record->getChildCount()
]) ?>
<?php endif ?>
<?php if (!empty($sortable)): ?>
<td class="list-cell-sort-handle nolink">
<span class="list-sort-handle" title="<?= e(trans('backend::lang.list.sort_drag_title')) ?>"><i class="icon-bars"></i></span>
</td>
<?php endif ?>
<?php $index = $url = 0; foreach ($columns as $key => $column): ?>
<?php $index++; ?>
<td class="list-cell-index-<?= $index ?> list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->clickable ? '' : 'nolink' ?> <?= $column->getAlignClass() ?> <?= $column->cssClass ?>">
<?php if ($column->clickable && !$url && ($url = $this->getRecordUrl($record))): ?>
<a <?= $this->getRecordOnClick($record) ?> href="<?= $url ?>">
<?= $this->getColumnValue($record, $column) ?>
</a>
<?php else: ?>
<?= $this->getColumnValue($record, $column) ?>
<?php endif ?>
</td>
<?php endforeach ?>
<?php if ($showSetup): ?>
<td class="list-setup">&nbsp;</td>
<?php endif ?>
</tr>
<?php if ($showTree && $expanded): ?>
<?= $this->makePartial('list_body_rows', ['records' => $childRecords, 'treeLevel' => $treeLevel+1]) ?>
<?php endif ?>

View File

@@ -0,0 +1,3 @@
<?php foreach ($records as $record): ?>
<?= $this->makePartial('list_body_row', ['record' => $record, 'treeLevel' => $treeLevel]) ?>
<?php endforeach ?>

View File

@@ -0,0 +1,16 @@
<td class="list-tree nolink">
<a
href="javascript:;"
class="list-expand-collapse"
data-request="<?= $this->getEventHandler('onToggleTreeNode') ?>"
data-stripe-load-indicator
data-request-data="node_id: '<?= $record->getKey() ?>', status: <?= $expanded ? 1 : 0 ?>">
<?php if (!$childCount): ?>
<i class="icon-square-o"></i>
<?php elseif ($expanded): ?>
<i class="icon-minus-square-o"></i>
<?php else: ?>
<i class="icon-plus-square-o"></i>
<?php endif ?>
</a>
</td>

View File

@@ -0,0 +1,58 @@
<tr>
<?php if ($showCheckboxes && count($records)): ?>
<th class="list-checkbox">
<div class="checkbox custom-checkbox nolabel">
<input type="checkbox" id="<?= $this->getId('checkboxAll') ?>" />
<label for="<?= $this->getId('checkboxAll') ?>"></label>
</div>
</th>
<?php endif ?>
<?php if ($showTree): ?>
<th class="list-tree">
<span></span>
</th>
<?php endif ?>
<?php if (!empty($sortable)): ?>
<th class="list-sort-handle-column"><span></span></th>
<?php endif ?>
<?php foreach ($columns as $key => $column): ?>
<?php if ($showSorting && $column->sortable): ?>
<th
<?php if ($column->width): ?>
style="width: <?= $column->width ?>"
<?php endif ?>
class="sortable <?= $this->sortColumn==$column->columnName?'sort-'.$this->sortDirection.' active':'' ?> list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->getAlignClass() ?> <?= $column->headCssClass ?>"
>
<a
href="javascript:;"
data-request="<?= $this->getEventHandler('onSort') ?>"
data-stripe-load-indicator
data-request-data="sortColumn: '<?= $column->columnName ?>', page: <?= $pageCurrent ?>">
<?= $this->getHeaderValue($column) ?>
</a>
</th>
<?php else: ?>
<th
<?php if ($column->width): ?>
style="width: <?= $column->width ?>"
<?php endif ?>
class="list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->getAlignClass() ?> <?= $column->headCssClass ?>"
>
<span><?= $this->getHeaderValue($column) ?></span>
</th>
<?php endif ?>
<?php endforeach ?>
<?php if ($showSetup): ?>
<th class="list-setup">
<a href="javascript:;"
id="<?= $this->getId('setupButton') ?>"
title="<?= e(trans('backend::lang.list.setup_title')) ?>"
data-control="popup"
data-handler="<?= $this->getEventHandler('onLoadSetup') ?>"></a>
</th>
<?php endif ?>
</tr>

View File

@@ -0,0 +1,74 @@
<div class="loading-indicator-container size-small pull-right">
<div class="control-pagination loading-indicator-container">
<span class="page-iteration">
<?= e(trans('backend::lang.list.pagination', ['from' => $pageFrom, 'to' => $pageTo, 'total' => $recordTotal])) ?>
</span>
<?php if ($pageLast > 1): ?>
<?php if ($pageCurrent > 1): ?>
<a
href="javascript:;"
class="page-first"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-request-data="page: 1"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.first_page')) ?>"></a>
<?php else: ?>
<span
class="page-first"
title="<?= e(trans('backend::lang.list.first_page')) ?>"></span>
<?php endif ?>
<?php if ($pageCurrent > 1): ?>
<a
href="javascript:;"
class="page-back"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-request-data="page: <?= $pageCurrent-1 ?>"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></a>
<?php else: ?>
<span
class="page-back"
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></span>
<?php endif ?>
<input
type="number"
name="page"
value="<?= $pageCurrent ?>"
min="1"
step="1"
max="<?= $pageLast ?>"
class="form-control input-sm"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-track-input
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
autocomplete="off"
style="width: auto; padding-left: 5px; padding-right: 0; display: inline; text-align: center;" />
<?php if ($pageLast > $pageCurrent): ?>
<a
href="javascript:;"
class="page-next"
data-request-data="page: <?= $pageCurrent+1 ?>"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.next_page')) ?>"></a>
<?php else: ?>
<span
class="page-next"
title="<?= e(trans('backend::lang.list.next_page')) ?>"></span>
<?php endif ?>
<?php if ($pageLast > $pageCurrent): ?>
<a
href="javascript:;"
class="page-last"
data-request-data="page: <?= $pageLast ?>"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.last_page')) ?>"></a>
<?php else: ?>
<span
class="page-last"
title="<?= e(trans('backend::lang.list.last_page')) ?>"></span>
<?php endif ?>
<?php endif ?>
</div>
</div>

View File

@@ -0,0 +1,50 @@
<div class="loading-indicator-container size-small pull-right">
<div class="control-pagination">
<?php if ($pageCurrent > 1): ?>
<a
href="javascript:;"
class="page-first"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-request-data="page: 1"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.first_page')) ?>"></a>
<?php else: ?>
<span
class="page-first"
title="<?= e(trans('backend::lang.list.first_page')) ?>"></span>
<?php endif ?>
<?php if ($pageCurrent > 1): ?>
<a
href="javascript:;"
class="page-back"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-request-data="page: <?= $pageCurrent-1 ?>"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></a>
<?php else: ?>
<span
class="page-back"
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></span>
<?php endif ?>
<select
disabled
name="page"
class="form-control input-sm custom-select select-no-search"
autocomplete="off">
<option value="<?= $pageCurrent ?>" selected><?= $pageCurrent ?></option>
</select>
<?php if ($hasMorePages): ?>
<a
href="javascript:;"
class="page-next"
data-request-data="page: <?= $pageCurrent+1 ?>"
data-request="<?= $this->getEventHandler('onPaginate') ?>"
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
title="<?= e(trans('backend::lang.list.next_page')) ?>"></a>
<?php else: ?>
<span
class="page-next"
title="<?= e(trans('backend::lang.list.next_page')) ?>"></span>
<?php endif ?>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<tr class="table-totals">
<?php if ($showCheckboxes): ?>
<td></td>
<?php endif ?>
<?php if ($showTree): ?>
<td class="list-tree">
<span></span>
</td>
<?php endif ?>
<?php foreach ($columns as $column): ?>
<td>
<?php if ($column->type == 'number' && $column->summable): ?>
<?php $item = $sums[$column->columnName]; ?>
<span>
<?= $item['format'] ? sprintf($item['format'], $item['sum']) : number_format($item['sum'], 0, '.', ',') ?>
<?php if (!is_null($item['total'])): ?>
(<?= $item['format'] ? sprintf($item['format'], $item['total']) : number_format($item['total'], 0, '.', ',') ?>)
<?php endif; ?>
</span>
<?php endif ?>
</td>
<?php endforeach ?>
<?php if ($showSetup): ?>
<td></td>
<?php endif; ?>
</tr>

View File

@@ -0,0 +1,74 @@
<?= Form::open(['data-request-parent' => '#' . $this->getId('setupButton')]) ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans('backend::lang.list.setup_title')) ?></h4>
</div>
<div class="modal-body">
<p class="help-block before-field"><?= e(trans('backend::lang.list.setup_help')) ?></p>
<div class="control-simplelist with-checkboxes is-sortable" data-control="simplelist">
<ul>
<?php foreach ($columns as $key => $column): ?>
<li>
<div class="checkbox custom-checkbox">
<input
type="hidden"
name="column_order[]"
value="<?= e($column->columnName) ?>" />
<input
id="<?= $this->getId('setupCheckbox-'.$column->columnName) ?>"
name="visible_columns[]"
value="<?= e($column->columnName) ?>"
<?= $column->invisible ? '' : 'checked="checked"' ?>
type="checkbox" />
<label
class="choice"
for="<?= $this->getId('setupCheckbox-'.$column->columnName) ?>">
<?= e(trans($column->label)) ?>
</label>
</div>
</li>
<?php endforeach ?>
</ul>
</div>
<?php if ($this->showPagination): ?>
<div class="form-group">
<label><?= e(trans('backend::lang.list.records_per_page')) ?></label>
<p class="help-block before-field">
<?= e(trans('backend::lang.list.records_per_page_help')) ?>
</p>
<select class="form-control custom-select select-no-search" name="records_per_page">
<?php foreach ($perPageOptions as $optionValue): ?>
<option value="<?= $optionValue ?>" <?= $optionValue == $recordsPerPage ? 'selected="selected"' : '' ?>><?= $optionValue ?></option>
<?php endforeach ?>
</select>
</div>
<?php endif ?>
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-link pull-left"
data-request="<?= $this->getEventHandler('onResetSetup') ?>"
data-dismiss="popup"
data-stripe-load-indicator>
<?= e(trans('backend::lang.form.reset_default')) ?>
</button>
<button
type="button"
class="btn btn-primary"
data-request="<?= $this->getEventHandler('onApplySetup') ?>"
data-dismiss="popup"
data-stripe-load-indicator>
<?= e(trans('backend::lang.form.apply')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.form.cancel')) ?>
</button>
</div>
<?= Form::close() ?>