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,9 @@
<?= $this->makePartial('toolbar') ?>
<div class="layout-row" id="asset-list-container" data-alias="<?= $this->alias ?>">
<div class="layout-cell">
<div class="layout-relative">
<?= $this->makePartial('files', ['data'=>$data]) ?>
</div>
</div>
</div>
<input type="hidden" name="theme" value="<?= e($this->theme->getDirName()) ?>">

View File

@@ -0,0 +1,7 @@
<div class="layout-absolute">
<div class="control-scrollbar" data-control="scrollbar">
<div class="control-assetlist" data-control="assetlist" id="<?= $this->getId('asset-list') ?>">
<?= $this->makePartial('items', ['items'=>$data]) ?>
</div>
</div>
</div>

View File

@@ -0,0 +1,69 @@
<?php
$searchMode = $this->isSearchMode();
if (($upPath = $this->getUpPath()) !== null && !$searchMode):
?>
<p class="parent">
<a href="<?= $upPath ?>" data-path="<?= $upPath ?>" class="link"><?= $this->getCurrentRelativePath() ?></a>
</p>
<?php endif ?>
<div class="list-container animate">
<?php if ($items): ?>
<ul class="list">
<?php foreach ($items as $item):
$dataId = 'asset-'.$this->theme->getDirName().'-'.ltrim($item->path, '/');
?>
<li
class="<?= $item->type ?>"
<?php if ($item->editable): ?>
data-editable
<?php endif ?>
data-item-path="<?= e(ltrim($item->path, '/')) ?>"
data-item-theme="<?= e($this->theme->getDirName()) ?>"
data-item-type="asset" data-id="<?= e($dataId) ?>"
>
<a class="link" target="_blank" data-path="<?= $item->path ?>" href="<?= $this->getThemeFileUrl($item->path) ?>">
<?= e($item->name) ?>
<?php if ($searchMode): ?>
<span class="description">
<?= e(dirname($item->path)) ?>
</span>
<?php endif ?>
</a>
<div class="controls">
<a
href="javascript:;"
class="control icon btn-primary wn-icon-terminal"
title="<?= e(trans('cms::lang.asset.rename')) ?>"
data-control="popup"
data-request-data="renamePath: '<?= e($item->path) ?>'"
data-handler="<?= $this->getEventHandler('onLoadRenamePopup') ?>"
><?= e(trans('cms::lang.asset.rename')) ?></a>
</div>
<input type="hidden" name="file[<?= e($item->path) ?>]" value="0"/>
<div class="checkbox custom-checkbox nolabel">
<?php $cbId = 'cb'.md5($item->path) ?>
<input
id="<?= $cbId ?>"
type="checkbox"
name="file[<?= e($item->path) ?>]"
<?= $this->isItemSelected($item->path) ? 'checked' : null ?>
data-request="<?= $this->getEventHandler('onSelect') ?>"
value="1">
<label for="<?= $cbId ?>"><?= e(trans('cms::lang.asset.select')) ?></label>
</div>
</li>
<?php endforeach ?>
</ul>
<?php else: ?>
<p class="no-data"><?= e(trans($this->noRecordsMessage)) ?></p>
<?php endif ?>
</div>
<?php if (!isset($nested)): ?>
<input type="hidden" name="theme" value="<?= e($this->theme->getDirName()) ?>">
<?php endif ?>

View File

@@ -0,0 +1,41 @@
<?= Form::open([
'data-request'=>$this->getEventHandler('onMove'),
'data-request-success'=>"\$(this).trigger('close.oc.popup')",
'data-stripe-load-indicator'=>1,
'id'=>'asset-move-popup-form'
]) ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans('cms::lang.asset.move_popup_title')) ?></h4>
</div>
<div class="modal-body">
<div class="form-group">
<label><?= e(trans('cms::lang.asset.move_destination')) ?></label>
<select
class="form-control custom-select"
name="dest"
data-placeholder="<?= e(trans('backend::lang.media.move_please_select')) ?>">
<option></option>
<?php foreach ($directories as $path => $directory): ?>
<option value="<?= e($path) ?>"><?= e($directory) ?></option>
<?php endforeach ?>
</select>
</div>
<input type="hidden" name="theme" value="<?= e($this->theme->getDirName()) ?>">
<input type="hidden" name="selectedList" value="<?= e($selectedList) ?>">
</div>
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.media.move_button')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.form.cancel')) ?>
</button>
</div>
<?= Form::close() ?>

View File

@@ -0,0 +1,43 @@
<?= Form::open([
'data-request'=>$this->getEventHandler('onNewDirectory'),
'data-request-success'=>"\$(this).trigger('close.oc.popup')",
'data-stripe-load-indicator'=>1,
'id'=>'asset-new-dir-popup-form'
]) ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans('cms::lang.asset.directory_popup_title')) ?></h4>
</div>
<div class="modal-body">
<div class="form-group">
<label><?= e(trans('cms::lang.asset.directory_name')) ?></label>
<input
type="text"
name="name"
value=""
class="form-control"
autocomplete="off" />
</div>
<input type="hidden" name="theme" value="<?= e($this->theme->getDirName()) ?>">
</div>
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary">
<?= e(trans('backend::lang.form.create')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.form.cancel')) ?>
</button>
</div>
<script>
setTimeout(
function(){ $('#asset-new-dir-popup-form input.form-control').focus() },
310
)
</script>
<?= Form::close() ?>

View File

@@ -0,0 +1,43 @@
<?= Form::ajax($this->getEventHandler('onApplyName'), [
'success' => "\$el.trigger('close.oc.popup');",
'data-stripe-load-indicator' => 1,
'id' => 'asset-rename-popup-form'
]) ?>
<div class="modal-header">
<button type="button" class="close" data-dismiss="popup">&times;</button>
<h4 class="modal-title"><?= e(trans('backend::lang.media.rename_popup_title')) ?></h4>
</div>
<div class="modal-body">
<div class="form-group">
<label><?= e(trans('backend::lang.media.rename_new_name')) ?></label>
<input
type="text"
name="name"
value="<?= e($name) ?>"
class="form-control"
autocomplete="off" />
</div>
<input type="hidden" name="originalPath" value="<?= e($originalPath) ?>" />
<input type="hidden" name="theme" value="<?= e($this->theme->getDirName()) ?>" />
</div>
<div class="modal-footer">
<button
type="submit"
class="btn btn-primary">
<?= 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>
<script>
setTimeout(
function(){ $('#asset-rename-popup-form input.form-control').focus() },
310
)
</script>
<?= Form::close() ?>

View File

@@ -0,0 +1,78 @@
<div class="layout-row min-size">
<div class="control-toolbar toolbar-padded">
<!-- Control Panel -->
<div class="toolbar-item" data-calculate-width>
<div class="btn-group">
<div class="dropdown last">
<button type="button" class="btn btn-default wn-icon-plus"
data-control="create-asset"
data-toggle="dropdown"
><?= e(trans('cms::lang.sidebar.add')) ?></button>
<ul class="dropdown-menu offset-left" role="menu" data-dropdown-title="<?= e(trans('cms::lang.asset.drop_down_add_title')) ?>">
<li role="presentation"><a role="menuitem" tabindex="-1" href="javascript:;" data-control="create-template" class="wn-icon-file-text-o"><?= e(trans('cms::lang.asset.create_file')) ?></a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="javascript:;" data-control="upload-assets" class="wn-icon-upload"><?= e(trans('cms::lang.asset.upload_files')) ?></a></li>
<li role="presentation" class="divider"></li>
<li role="presentation"><a
role="menuitem"
tabindex="-1"
href="javascript:;"
class="wn-icon-folder-o"
data-control="popup"
data-handler="<?= $this->getEventHandler('onLoadNewDirPopup') ?>"
><?= e(trans('cms::lang.asset.create_directory')) ?></a></li>
</ul>
</div>
<div class="dropdown hide"
id="<?= $this->getId('tools-button') ?>"
data-trigger-action="show"
data-trigger="<?= '#'.$this->getId('asset-list') ?> input[type=checkbox]"
data-trigger-condition="checked">
<button type="button" class="btn btn-default empty wn-icon-wrench last"
data-toggle="dropdown"
data-control="asset-tools"
></button>
<ul class="dropdown-menu" role="menu" data-dropdown-title="<?= e(trans('cms::lang.asset.drop_down_operation_title')) ?>">
<li role="presentation"><a
role="menuitem"
tabindex="-1"
href="javascript:;"
data-control="delete-asset"
data-confirmation="<?= e(trans($this->deleteConfirmation)) ?>"
class="wn-icon-trash-o"
><?= e(trans('cms::lang.asset.delete')) ?></a></li>
<li role="presentation"><a
role="menuitem"
tabindex="-1"
href="javascript:;"
class="wn-icon-angle-double-right"
data-control="popup"
data-handler="<?= $this->getEventHandler('onLoadMovePopup') ?>"
><?= e(trans('cms::lang.asset.move')) ?></a></li>
</ul>
</div>
</div>
</div>
<!-- Asset Search -->
<div class="relative toolbar-item loading-indicator-container size-input-text">
<input
type="text"
name="search"
value="<?= e($this->getSearchTerm()) ?>"
class="form-control icon search" autocomplete="off"
placeholder="<?= e(trans('cms::lang.sidebar.search')) ?>"
data-track-input
data-load-indicator
data-load-indicator-opaque
data-request-success="$('<?= '#'.$this->getId('tools-button') ?>').trigger('oc.triggerOn.update')"
data-request="<?= $this->getEventHandler('onSearch') ?>"
/>
</div>
</div>
</div>