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,5 @@
//
// Example control
//
.example-control {}

View File

@@ -0,0 +1,50 @@
//
// Callouts
// --------------------------------------------------
.callout {
margin-bottom: @line-height-computed;
padding: @callout-padding;
border-left: 3px solid @callout-border;
code, .highlight {
}
h4 {
margin-top: 0;
margin-bottom: 5px;
}
p:last-child {
margin-bottom: 0;
}
}
.callout-danger {
background-color: @callout-danger-bg;
border-color: @callout-danger-border;
h4 {
color: @callout-danger-text;
}
}
.callout-warning {
background-color: @callout-warning-bg;
border-color: @callout-warning-border;
h4 {
color: @callout-warning-text;
}
}
.callout-info {
background-color: @callout-info-bg;
border-color: @callout-info-border;
h4 {
color: @callout-info-text;
}
}
.callout-success {
background-color: @callout-success-bg;
border-color: @callout-success-border;
h4 {
color: @callout-success-text;
}
}

View File

@@ -0,0 +1,89 @@
.navbar-header .navbar-brand {
padding-left: 55px;
background-image: url('../images/winter.png');
background-size: auto 60%;
background-repeat: no-repeat;
background-position: 7px 50%;
transition: color 0.2s ease 0.05s;
color: #ccc;
&:hover {
color: #fff;
}
}
.navbar-nav li.separator {
width: 1px;
background: rgba(255, 255, 255, 0.3);
height: 30px;
margin: 20px 10px 0 10px;
}
.navbar-autohide {
transition: transform .5s;
}
.navbar-autohide.is-hidden {
transform: translateY(-(@navbar-height + 2px));
}
.navbar-collapse:not(.in):not(.collapsing) .navbar-nav li {
> a {
transition: color 0.2s ease 0.05s;
}
> a:after {
position: absolute;
height: 4px;
bottom: -1px;
content: '';
border-radius: 4px;
z-index: 5;
width: 0;
left: 50%;
transition: all 0.2s ease 0.05s;
}
&.active > a:after {
width: 100% !important;
left: 0 !important;
}
&:hover > a:after {
width: 100%;
left: 0;
}
&.active > a {
background: transparent;
}
}
.navbar-inverse .navbar-collapse:not(.in):not(.collapsing) .navbar-nav li {
&.active > a:after,
> a:hover:after {
background: @navbar-inverse-stripe-color-active;
}
&.active > a:hover:after {
background: @navbar-inverse-stripe-color-active;
}
> a:hover:after {
background: @navbar-inverse-stripe-color-hover;
}
}
.navbar-default .navbar-collapse:not(.in):not(.collapsing) .navbar-nav li {
&.active > a:after,
> a:hover:after {
background: @navbar-default-stripe-color-active;
}
&.active > a:hover:after {
background: @navbar-default-stripe-color-active;
}
> a:hover:after {
background: @navbar-default-stripe-color-hover;
}
}

View File

@@ -0,0 +1,138 @@
//
// Typography
// --------------------------------------------------
.t-ww { word-wrap: break-word; word-break: break-word; }
//
// Borders
// --------------------------------------------------
.border-none { border: 0; }
//
// Positioning
// --------------------------------------------------
.pos-r { position: relative !important; }
.pos-a { position: absolute !important; }
.pos-f { position: fixed !important; }
//
// Width
// --------------------------------------------------
.w-sm { width: 25% !important; }
.w-md { width: 50% !important; }
.w-lg { width: 75% !important; }
.w-full { width: 100% !important; }
.w-50 { width: 50px !important; }
.w-100 { width: 100px !important; }
.w-120 { width: 120px !important; }
.w-130 { width: 130px !important; }
.w-140 { width: 140px !important; }
.w-150 { width: 150px !important; }
.w-200 { width: 200px !important; }
.w-300 { width: 300px !important; }
.w-350 { width: 350px !important; }
//
// Margins
// --------------------------------------------------
.m-a-0 { margin: 0 !important; }
.m-t-0 { margin-top: 0 !important; }
.m-r-0 { margin-right: 0 !important; }
.m-b-0 { margin-bottom: 0 !important; }
.m-l-0 { margin-left: 0 !important; }
.m-a { margin: @spacer !important; }
.m-t { margin-top: @spacer-y !important; }
.m-r { margin-right: @spacer-x !important; }
.m-b { margin-bottom: @spacer-y !important; }
.m-l { margin-left: @spacer-x !important; }
.m-x { margin-right: @spacer-x !important; margin-left: @spacer-x !important; }
.m-y { margin-top: @spacer-y !important; margin-bottom: @spacer-y !important; }
.m-x-auto { margin-right: auto !important; margin-left: auto !important; }
.m-a-xs { margin: (@spacer-y / 4) !important; }
.m-t-xs { margin-top: (@spacer-y / 4) !important; }
.m-r-xs { margin-right: (@spacer-y / 4) !important; }
.m-b-xs { margin-bottom: (@spacer-y / 4) !important; }
.m-l-xs { margin-left: (@spacer-y / 4) !important; }
.m-x-xs { margin-right: (@spacer-x / 4) !important; margin-left: (@spacer-x / 4) !important; }
.m-y-xs { margin-top: (@spacer-y / 4) !important; margin-bottom: (@spacer-y / 4) !important; }
.m-a-sm { margin: (@spacer-y / 2) !important; }
.m-t-sm { margin-top: (@spacer-y / 2) !important; }
.m-r-sm { margin-right: (@spacer-y / 2) !important; }
.m-b-sm { margin-bottom: (@spacer-y / 2) !important; }
.m-l-sm { margin-left: (@spacer-y / 2) !important; }
.m-x-sm { margin-right: (@spacer-x / 2) !important; margin-left: (@spacer-x / 2) !important; }
.m-y-sm { margin-top: (@spacer-y / 2) !important; margin-bottom: (@spacer-y / 2) !important; }
.m-a-md { margin: (@spacer-y * 1.5) !important; }
.m-t-md { margin-top: (@spacer-y * 1.5) !important; }
.m-r-md { margin-right: (@spacer-y * 1.5) !important; }
.m-b-md { margin-bottom: (@spacer-y * 1.5) !important; }
.m-l-md { margin-left: (@spacer-y * 1.5) !important; }
.m-x-md { margin-right: (@spacer-x * 1.5) !important; margin-left: (@spacer-x * 1.5) !important; }
.m-y-md { margin-top: (@spacer-y * 1.5) !important; margin-bottom: (@spacer-y * 1.5) !important; }
.m-a-lg { margin: (@spacer-y * 3) !important; }
.m-t-lg { margin-top: (@spacer-y * 3) !important; }
.m-r-lg { margin-right: (@spacer-y * 3) !important; }
.m-b-lg { margin-bottom: (@spacer-y * 3) !important; }
.m-l-lg { margin-left: (@spacer-y * 3) !important; }
.m-x-lg { margin-right: (@spacer-x * 3) !important; margin-left: (@spacer-x * 3) !important; }
.m-y-lg { margin-top: (@spacer-y * 3) !important; margin-bottom: (@spacer-y * 3) !important; }
//
// Padding
// --------------------------------------------------
.p-a-0 { padding: 0 !important; }
.p-t-0 { padding-top: 0 !important; }
.p-r-0 { padding-right: 0 !important; }
.p-b-0 { padding-bottom: 0 !important; }
.p-l-0 { padding-left: 0 !important; }
.p-a { padding: @spacer !important; }
.p-t { padding-top: @spacer-y !important; }
.p-r { padding-right: @spacer-x !important; }
.p-b { padding-bottom: @spacer-y !important; }
.p-l { padding-left: @spacer-x !important; }
.p-x { padding-right: @spacer-x !important; padding-left: @spacer-x !important; }
.p-y { padding-top: @spacer-y !important; padding-bottom: @spacer-y !important; }
.p-a-xs { padding: (@spacer-y / 4) !important; }
.p-t-xs { padding-top: (@spacer-y / 4) !important; }
.p-r-xs { padding-right: (@spacer-y / 4) !important; }
.p-b-xs { padding-bottom: (@spacer-y / 4) !important; }
.p-l-xs { padding-left: (@spacer-y / 4) !important; }
.p-x-xs { padding-right: (@spacer-x / 4) !important; padding-left: (@spacer-x / 4) !important; }
.p-y-xs { padding-top: (@spacer-y / 4) !important; padding-bottom: (@spacer-y / 4) !important; }
.p-a-sm { padding: (@spacer-y / 2) !important; }
.p-t-sm { padding-top: (@spacer-y / 2) !important; }
.p-r-sm { padding-right: (@spacer-y / 2) !important; }
.p-b-sm { padding-bottom: (@spacer-y / 2) !important; }
.p-l-sm { padding-left: (@spacer-y / 2) !important; }
.p-x-sm { padding-right: (@spacer-x / 2) !important; padding-left: (@spacer-x / 2) !important; }
.p-y-sm { padding-top: (@spacer-y / 2) !important; padding-bottom: (@spacer-y / 2) !important; }
.p-a-md { padding: (@spacer-y * 1.5) !important; }
.p-t-md { padding-top: (@spacer-y * 1.5) !important; }
.p-r-md { padding-right: (@spacer-y * 1.5) !important; }
.p-b-md { padding-bottom: (@spacer-y * 1.5) !important; }
.p-l-md { padding-left: (@spacer-y * 1.5) !important; }
.p-x-md { padding-right: (@spacer-x * 1.5) !important; padding-left: (@spacer-x * 1.5) !important; }
.p-y-md { padding-top: (@spacer-y * 1.5) !important; padding-bottom: (@spacer-y * 1.5) !important; }
.p-a-lg { padding: (@spacer-y * 3) !important; }
.p-t-lg { padding-top: (@spacer-y * 3) !important; }
.p-r-lg { padding-right: (@spacer-y * 3) !important; }
.p-b-lg { padding-bottom: (@spacer-y * 3) !important; }
.p-l-lg { padding-left: (@spacer-y * 3) !important; }
.p-x-lg { padding-right: (@spacer-x * 3) !important; padding-left: (@spacer-x * 3) !important; }
.p-y-lg { padding-top: (@spacer-y * 3) !important; padding-bottom: (@spacer-y * 3) !important; }

View File

@@ -0,0 +1,10 @@
//
// Layouts
//
// Styles specific to different page layouts.
//
// Used by the fixed navbar
body {
padding-top: 70px;
}

View File

@@ -0,0 +1,5 @@
//
// AJAX
//
// Styles specific to the AJAX page
//

View File

@@ -0,0 +1,5 @@
//
// Plugins
//
// Styles specific to the plugins page
//

View File

@@ -0,0 +1,46 @@
//
// Boot theme
//
@import "theme/boot";
//
// Fonts
//
@import "theme/fonts";
//
// Controls
//
// These are interactive controls used in the site.
//
@import "controls/example";
//
// Elements
//
// These are reusable elements used in the site.
//
@import "elements/callouts";
@import "elements/utilities";
@import "elements/navbar";
//
// Layouts
//
// Include these here, or directly on the layouts
//
@import "layouts/default";
//
// Pages
//
// Include these here, or directly on the pages
//
@import "pages/ajax";
@import "pages/plugins";

View File

@@ -0,0 +1,12 @@
//
// Boot file
//
// Includes non-output LESS files such as mixins and variables
//
@import "../../vendor/bootstrap/less/variables.less";
@import "../../vendor/bootstrap/less/mixins.less";
@import "../../vendor/font-awesome/less/variables.less";
@import "../../vendor/font-awesome/less/mixins.less";
@import "mixins.less";
@import "variables.less";

View File

@@ -0,0 +1,59 @@
//
// Fonts file
//
// Allocated area for font definitions used by this application
//
@font-face {
font-family: 'lato';
src: url('../fonts/lato-black-webfont.eot');
src: url('../fonts/lato-black-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/lato-black-webfont.svg#latoblack') format('svg'),
url('../fonts/lato-black-webfont.woff') format('woff'),
url('../fonts/lato-black-webfont.ttf') format('truetype');
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'lato';
src: url('../fonts/lato-italic-webfont.eot');
src: url('../fonts/lato-italic-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/lato-italic-webfont.svg#latoitalic') format('svg'),
url('../fonts/lato-italic-webfont.woff') format('woff'),
url('../fonts/lato-italic-webfont.ttf') format('truetype');
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: 'lato';
src: url('../fonts/lato-regular-webfont.eot');
src: url('../fonts/lato-regular-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/lato-regular-webfont.svg#latoregular') format('svg'),
url('../fonts/lato-regular-webfont.woff') format('woff'),
url('../fonts/lato-regular-webfont.ttf') format('truetype');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'lato';
src: url('../fonts/lato-light-webfont.eot');
src: url('../fonts/lato-light-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/lato-light-webfont.svg#latolight') format('svg'),
url('../fonts/lato-light-webfont.woff') format('woff'),
url('../fonts/lato-light-webfont.ttf') format('truetype');
font-weight: 300;
font-style: normal;
}
//
// Chrome exhibits strange behavior when custom fonts are used
// on select inputs. This fixes the garbled text.
//
@media screen and (-webkit-min-device-pixel-ratio:0) {
select {
font-family: sans-serif;
}
}

View File

@@ -0,0 +1,5 @@
//
// Mixins file
//
// Space for any custom mixins used by this application
//

View File

@@ -0,0 +1,67 @@
//
// Variables file
//
// Space for any custom variables used by this application
//
// Icons
// --------------------------------------------------
@FontAwesomePath: "../vendor/font-awesome/font";
// Brands
// --------------------------------------------------
@brand-primary: #3097d1;
@brand-info: #8eb4cb;
@brand-success: #4eb76e;
@brand-warning: #cbb956;
@brand-danger: #bf5329;
// Typography
// --------------------------------------------------
@font-family-sans-serif: "lato", sans-serif;
@line-height-base: 1.6;
@font-size-base: 16px;
@text-color: #586667;
@headings-color: #1f3f50;
@jumbotron-heading-color: @headings-color;
// Spacing
// --------------------------------------------------
@spacer: 20px;
@spacer-y: @spacer;
@spacer-x: @spacer;
// Navbar
// --------------------------------------------------
@navbar-height: 70px;
@navbar-margin-bottom: 0;
@navbar-inverse-bg: #000;
@navbar-inverse-link-color: rgba(255,255,255,0.6);
@navbar-inverse-stripe-color-active: #000;
@navbar-inverse-stripe-color-hover: #e67e22;
@navbar-default-stripe-color-active: #64ae5b;
@navbar-default-stripe-color-hover: #93dc8a;
// Callouts
// --------------------------------------------------
@callout-padding: 20px;
@callout-border-radius: @border-radius-base;
@callout-border: @gray-lighter;
@callout-info-bg: #f4f8fa;
@callout-info-text: @state-info-text;
@callout-info-border: @state-info-border;
@callout-warning-bg: #faf8f0;
@callout-warning-text: @state-warning-text;
@callout-warning-border: @state-warning-border;
@callout-danger-bg: #fdf7f7;
@callout-danger-text: @state-danger-text;
@callout-danger-border: @state-danger-border;
@callout-success-bg: #f9fdf7;
@callout-success-text: @state-success-text;
@callout-success-border: @state-success-border;

View File

@@ -0,0 +1,66 @@
//
// Vendor file
//
// Includes all vendor LESS files that contain usable output
//
@import "theme/boot";
//
// Bootstrap
//
// Reset
@import "../vendor/bootstrap/less/normalize";
@import "../vendor/bootstrap/less/print";
// Core CSS
@import "../vendor/bootstrap/less/scaffolding";
@import "../vendor/bootstrap/less/type";
@import "../vendor/bootstrap/less/code";
@import "../vendor/bootstrap/less/grid";
@import "../vendor/bootstrap/less/tables";
@import "../vendor/bootstrap/less/forms";
@import "../vendor/bootstrap/less/buttons";
// Components
@import "../vendor/bootstrap/less/component-animations";
@import "../vendor/bootstrap/less/dropdowns";
@import "../vendor/bootstrap/less/button-groups";
@import "../vendor/bootstrap/less/input-groups";
@import "../vendor/bootstrap/less/navs";
@import "../vendor/bootstrap/less/navbar";
@import "../vendor/bootstrap/less/breadcrumbs";
@import "../vendor/bootstrap/less/pagination";
@import "../vendor/bootstrap/less/pager";
@import "../vendor/bootstrap/less/labels";
@import "../vendor/bootstrap/less/badges";
@import "../vendor/bootstrap/less/jumbotron";
@import "../vendor/bootstrap/less/thumbnails";
@import "../vendor/bootstrap/less/alerts";
@import "../vendor/bootstrap/less/progress-bars";
@import "../vendor/bootstrap/less/media";
@import "../vendor/bootstrap/less/list-group";
@import "../vendor/bootstrap/less/panels";
@import "../vendor/bootstrap/less/wells";
@import "../vendor/bootstrap/less/close";
// Components w/ JavaScript
@import "../vendor/bootstrap/less/modals";
@import "../vendor/bootstrap/less/tooltip";
@import "../vendor/bootstrap/less/popovers";
@import "../vendor/bootstrap/less/carousel";
// Utility classes
@import "../vendor/bootstrap/less/utilities";
@import "../vendor/bootstrap/less/responsive-utilities";
//
// Font Awesome
//
@import "../vendor/font-awesome/less/path";
@import "../vendor/font-awesome/less/core";
@import "../vendor/font-awesome/less/bootstrap";
@import "../vendor/font-awesome/less/extras";
@import "../vendor/font-awesome/less/icons";