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,234 @@
//
// Coded variables
//
// @logo-image
// @brand-primary
// @brand-secondary
// @brand-accent
//
.br-p { color: @brand-primary; }
.br-s { color: @brand-secondary; }
.br-a { color: @brand-accent; }
.br-p-s10 { color: saturate(@brand-primary, 10%); }
.br-s-s10 { color: saturate(@brand-secondary, 10%); }
.br-a-s10 { color: saturate(@brand-accent, 10%); }
.br-p-s20 { color: saturate(@brand-primary, 20%); }
.br-s-s20 { color: saturate(@brand-secondary, 20%); }
.br-a-s20 { color: saturate(@brand-accent, 20%); }
.bg-p { background-color: @brand-primary; }
.bg-s { background-color: @brand-secondary; }
.bg-a { background-color: @brand-accent; }
.bg-p-s10 { background-color: saturate(@brand-primary, 10%); }
.bg-s-s10 { background-color: saturate(@brand-secondary, 10%); }
.bg-a-s10 { background-color: saturate(@brand-accent, 10%); }
.bg-p-s20 { background-color: saturate(@brand-primary, 20%); }
.bg-s-s20 { background-color: saturate(@brand-secondary, 20%); }
.bg-a-s20 { background-color: saturate(@brand-accent, 20%); }
@custom-dark-accent: mix(black, desaturate(@brand-accent, 35%), 20%);
@custom-dark-secondary: mix(black, saturate(@brand-secondary, 20%), 25%);
@custom-dark-primary: mix(black, saturate(@brand-primary, 5%), 15%);
//
// Sidenav Tree
//
.sidenav-tree ul.top-level > li {
> div.group:before {
border-top-color: @brand-primary;
}
> ul li.active {
border-color: @brand-secondary;
}
}
//
// Side panel
//
#layout-side-panel {
.sidepanel-content-header {
background: @custom-dark-secondary;
&::after {
border-top-color: @custom-dark-secondary;
}
}
}
//
// Asset List
//
.control-assetlist ul li.active a:after,
.control-assetlist ul li.active a.link:after {
background: @brand-secondary;
}
//
// Pages List
//
.control-treeview ol > li.active > div::after {
background: @brand-secondary;
}
//
// Outside Layout
//
body.outer {
background: @custom-dark-primary;
}
//
// Logos
//
.wn-logo-transparent when not (@logo-image = '') {
background-image: url('@{logo-image}') !important;
}
.wn-logo when not (@logo-image = '') {
background-image: url('@{logo-image}');
}
.oc-logo-transparent when not (@logo-image = '') {
background-image: url('@{logo-image}') !important;
}
.oc-logo when not (@logo-image = '') {
background-image: url('@{logo-image}');
}
//
// List
//
table.table.data {
tbody {
tr.active td {
&:first-child {
border-left: 3px solid @brand-secondary;
}
}
}
}
//
// Fancy Layout
//
.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .form-tabless-fields {
background: @brand-secondary;
.loading-indicator-container .loading-indicator {
background: @brand-secondary;
}
}
body.fancy-layout .master-tabs.control-tabs,
.master-tabs.control-tabs.fancy-layout {
> div > div.tabs-container > ul.nav-tabs > li.active a > span.title {
&, &:before, &:after {
background: @brand-secondary;
}
}
> div > div.tabs-container > ul.nav-tabs > li a > span.title {
&, &:before, &:after {
background-color: mix(black, saturate(@brand-secondary, 20%), 31%);
}
}
> div > div.tabs-container {
background: @custom-dark-secondary;
}
}
.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.primary-tabs,
*:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.fancy-layout.primary-tabs {
&.master-area > div > ul.nav-tabs {
background: @brand-secondary;
}
}
.fancy-layout *:not(.nested-form):not(.modal-body) > .form-widget > .layout-row > .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed {
> div > ul.nav-tabs {
background: @brand-secondary;
}
}
.control-filelist ul li.active > a:after {
background: @brand-secondary;
}
//
// Component List
//
div.control-componentlist {
&.droppable {
background-color: lighten(@brand-secondary, 20%);
}
}
//
// Stripe Indicator
//
.stripe-loading-indicator {
.stripe, .stripe-loaded {
background: @brand-accent;
}
}
//
// Balloon Selector
//
.control-balloon-selector {
ul {
li.active {
background: @brand-secondary !important;
}
}
}
//
// Media
//
.nav.selector-group li.active {
border-left-color: @brand-secondary;
}
//
// Fancy breadcrumb
//
body.breadcrumb-fancy .control-breadcrumb,
.control-breadcrumb.breadcrumb-fancy {
background-color: mix(black, saturate(@brand-secondary, 20%), 16%);
li {
background-color: mix(black, saturate(@brand-secondary, 20%), 31%);
&:last-child {
background-color: mix(black, saturate(@brand-secondary, 20%), 16%);
&::before {
border-left-color: mix(black, saturate(@brand-secondary, 20%), 16%);
}
}
&::after {
border-left-color: mix(black, saturate(@brand-secondary, 20%), 31%);
}
&:not(:last-child)::before {
border-left-color: @brand-secondary;
}
}
}

View File

@@ -0,0 +1,112 @@
# ===================================
# Field Definitions
# ===================================
# Light palette: [#1abc9c, #6cc551, #b1dbef, #2da7c7, #b281c5, #103141, #f8e095, #de8754, #b33f32, #95a5a6]
# Dark palette: [#16a085, #52a838, #88c9e7, #227f96, #7b4e8e, #081821, #dcb22d, #d66829, #ab2a1c, #7f8c8d]
tabs:
fields:
logo:
label: backend::lang.branding.logo
type: fileupload
commentAbove: backend::lang.branding.logo_description
mode: image
imageHeight: 170
tab: backend::lang.branding.brand
span: right
fileTypes: jpg,jpeg,bmp,png,webp,gif,svg
app_name:
label: backend::lang.branding.app_name
commentAbove: backend::lang.branding.app_name_description
tab: backend::lang.branding.brand
span: left
app_tagline:
label: backend::lang.branding.app_tagline
commentAbove: backend::lang.branding.app_tagline_description
tab: backend::lang.branding.brand
span: left
favicon:
label: backend::lang.branding.favicon
type: fileupload
commentAbove: backend::lang.branding.favicon_description
mode: image
imageHeight: 32
tab: backend::lang.branding.brand
span: right
fileTypes: jpg,jpeg,bmp,png,webp,gif,svg,ico
_branding_colors:
label: backend::lang.branding.branding_colors
comment: backend::lang.branding.branding_colors_comment
type: section
tab: backend::lang.branding.colors
primary_color:
label: backend::lang.branding.primary_color
type: colorpicker
span: storm
cssClass: row col-lg-4
tab: backend::lang.branding.colors
availableColors: ['#16a085', '#52a838', '#88c9e7', '#2da7c7', '#7b4e8e', '#081821', '#dcb22d', '#d66829', '#ab2a1c', '#7f8c8d']
secondary_color:
label: backend::lang.branding.secondary_color
type: colorpicker
span: storm
cssClass: row col-lg-4
tab: backend::lang.branding.colors
availableColors: ['#16a085', '#52a838', '#88c9e7', '#2da7c7', '#7b4e8e', '#081821', '#dcb22d', '#d66829', '#ab2a1c', '#7f8c8d']
accent_color:
label: backend::lang.branding.accent_color
type: colorpicker
span: storm
cssClass: row col-lg-4
tab: backend::lang.branding.colors
availableColors: ['#16a085', '#6cc551', '#88c9e7', '#2da7c7', '#7b4e8e', '#081821', '#dcb22d', '#d66829', '#ab2a1c', '#7f8c8d']
_default_colors:
label: backend::lang.branding.default_colors
comment: backend::lang.branding.default_colors_comment
type: section
span: storm
cssClass: row col-lg-12
tab: backend::lang.branding.colors
default_colors:
label: false
type: repeater
tab: backend::lang.branding.colors
prompt: backend::lang.branding.add_default_color
titleFrom: color
form:
fields:
color:
label: false
type: colorpicker
availableColors: []
allowCustom: true
allowAlpha: true
formats: all
span: full
menu_mode:
label: backend::lang.branding.menu_mode
tab: backend::lang.branding.navigation
type: radio
options:
inline: backend::lang.branding.menu_mode_inline
inline_no_icons: backend::lang.branding.menu_mode_inline_no_icons
tile: backend::lang.branding.menu_mode_tile
collapse: backend::lang.branding.menu_mode_collapsed
custom_css:
label: backend::lang.branding.custom_stylesheet
type: codeeditor
tab: backend::lang.branding.styles
size: giant
language: less