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,175 @@
// Vars
@image-margin: 5px;
@table-border: 1px solid #DDD;
@blockquote-level1-color: #5E35B1;
@blockquote-level2-color: #00BCD4;
@blockquote-level3-color: #43A047;
@editor-text: #000;
.image-style() {
img {
position: relative;
max-width: 100%;
&.fr-dib {
margin: @image-margin auto;
display: block;
float: none;
vertical-align: top;
&.fr-fil {
margin-left: 0;
}
&.fr-fir {
margin-right: 0;
}
}
&.fr-dii {
display: inline-block;
float: none;
vertical-align: bottom;
margin-left: @image-margin;
margin-right: @image-margin;
max-width: calc(100% - (2 * @image-margin));
&.fr-fil {
float: left;
margin: @image-margin @image-margin @image-margin 0;
max-width: calc(100% - @image-margin);
}
&.fr-fir {
float: right;
margin: @image-margin 0 @image-margin @image-margin;
max-width: calc(100% - @image-margin);
}
}
}
}
.video-style() {
.fr-video {
text-align: center;
position: relative;
> * {
.box-sizing(content-box);
max-width: 100%;
border: none;
}
&.fr-dvb {
display: block;
clear: both;
&.fr-fvl {
text-align: left;
}
&.fr-fvr {
text-align: right;
}
}
&.fr-dvi {
display: inline-block;
&.fr-fvl {
float: left;
}
&.fr-fvr {
float: right;
}
}
}
}
.fr-view {
strong {
font-weight: 700;
}
table {
border: none;
border-collapse: collapse;
empty-cells: show;
max-width: 100%;
td, th {
border: @table-border;
&:empty {
height: 20px;
}
}
th {
background: mix(white, @editor-text, 90%);;
}
}
hr {
clear: both;
.user-select(none);
page-break-after: always;
}
.fr-file {
position: relative;
&::after {
position: relative;
content: "\1F4CE";
font-weight: normal;
}
}
pre {
white-space: pre-wrap;
word-wrap: break-word;
}
blockquote {
border-left: solid 2px @blockquote-level1-color;
margin-left: 0;
padding-left: 5px;
color: @blockquote-level1-color;
blockquote {
border-color: @blockquote-level2-color;
color: @blockquote-level2-color;
blockquote {
border-color: @blockquote-level3-color;
color: @blockquote-level3-color;
}
}
}
span.fr-emoticon {
font-weight: normal;
font-family: "Apple Color Emoji","Segoe UI Emoji","NotoColorEmoji","Segoe UI Symbol","Android Emoji","EmojiSymbols";
display: inline;
line-height: 0;
&.fr-emoticon-img {
background-repeat: no-repeat !important;
font-size: inherit;
height: 1em;
width: 1em;
min-height: 20px;
min-width: 20px;
display: inline-block;
margin: -.1em .1em .1em;
line-height: 1;
vertical-align: middle;
}
}
.image-style();
.video-style();
}

View File

@@ -0,0 +1,183 @@
//
// Mods to Froala Editor
//
// Give soft priority to all styles
body {
//
// Wrapper
//
.fr-box.fr-basic.fr-top .fr-wrapper,
.fr-box.fr-basic.fr-bottom .fr-wrapper {
.box-shadow(none);
}
//
// Code mode
//
.fr-box {
.ace_editor {
display: none;
}
.ace_editor {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: 0;
}
&.fr-code-view .ace_editor {
display: block;
}
}
//
// Full screen
//
.fr-command.fr-btn[data-cmd=fullscreen] {
float: right;
}
.fr-box.fr-fullscreen {
z-index: @zindex-fullscreen !important;
}
//
// Toolbar
//
.fr-toolbar {
border-top-color: transparent;
background: #f2f2f2;
}
.fr-popup.fr-desktop,
.fr-toolbar.fr-inline.fr-desktop {
.fr-arrow {
top: -@arrow-size;
}
&.fr-above {
.fr-arrow {
bottom: -@arrow-size;
}
}
}
// Command button.
.fr-toolbar, .fr-popup {
.fr-command.fr-btn {
// Dropdown is visible.
&.fr-dropdown.fr-active {
color: @btn-active-text;
}
}
}
.fr-toolbar.fr-bottom,
.fr-toolbar.fr-top {
border-bottom: 2px solid @color-list-border;
.box-shadow(none);
}
//
// Popup Buttons
//
.fr-popup .fr-action-buttons {
button.fr-command {
.button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
.button-variant(@btn-default-color; @btn-default-bg; @btn-default-border; @btn-primary-bg; @btn-primary-bg);
margin-top: 6px;
font-size: @font-size-base - 1;
text-align: left;
height: auto;
outline: none !important;
.box-shadow(~"inset 0 -2px 0 rgba(0,0,0,.15)");
&[disabled] {
color: rgba(255,255,255,.6);
}
&.active,
&:active {
.box-shadow(inset 0 1px 0 rgba(0,0,0,.3));
}
}
}
//
// Popup Toolbar
//
.fr-popup .fr-buttons {
border-bottom: 2px solid @color-list-border;
.box-shadow(none);
}
//
// Dropdown
//
.fr-command.fr-btn + .fr-dropdown-menu {
.fr-dropdown-wrapper .fr-dropdown-content ul.fr-dropdown-list li {
font-size: @font-size-base;
a {
color: #666666;
}
}
}
//
// Inputs
//
.fr-popup .fr-input-line {
input[type="text"], textarea {
-webkit-appearance: none;
border: 1px solid @input-border;
background-color: @input-bg;
color: @input-color;
margin-bottom: 0;
.box-shadow(@input-box-shadow);
.input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
.transition(margin @transition-timing);
&:focus {
border: 1px solid @input-border;
}
&.fr-not-empty {
margin-top: 12px;
}
}
textarea {
height: auto;
}
input + label, textarea + label {
background: transparent!important;
}
input.fr-not-empty:focus + label, textarea.fr-not-empty:focus + label {
color: @color-label;
}
}
.fr-popup .fr-checkbox {
span {
border-color: @input-border;
}
}
}

View File

@@ -0,0 +1,287 @@
@import "../../../../assets/less/core/boot.less";
@richeditor-toolbar-size: 30px;
@richeditor-zindex: 600;
@richeditor-gutter: 20px;
@color-richeditor-toolbar: #dddddd;
@color-richeditor-toolbar-btn-color: #404040;
@color-richeditor-toolbar-btn-bg-hover: #999999;
@color-richeditor-toolbar-btn-bg-active: #404040;
@color-richeditor-toolbar-btn-color-hover: #ffffff;
@import "../vendor/froala_drm/less/froala.less";
// Buttons
@import "../vendor/froala_drm/less/plugins/fullscreen.less";
@import "../vendor/froala_drm/less/plugins/code_view.less";
@import "../vendor/froala_drm/less/plugins/file.less";
@import "../vendor/froala_drm/less/plugins/image.less";
@import "../vendor/froala_drm/less/plugins/table.less";
@import "../vendor/froala_drm/less/plugins/video.less";
@import "../vendor/froala_drm/less/plugins/colors.less";
@import "../vendor/froala_drm/less/plugins/emoticons.less";
// Functional
@import "../vendor/froala_drm/less/plugins/line_breaker.less";
@import "../vendor/froala_drm/less/plugins/draggable.less";
// More testing needed
//import "../vendor/froala_drm/less/plugins/quick_insert.less";
// Base styles
@import "_base_styles.less";
.fr-view {
@import "../../../../models/editorsetting/default_styles.less";
}
// Modifications
@import "_froala.less";
@font-family: @font-family-sans-serif;
@border-radius: @input-border-radius;
@tooltip-bg: @brand-primary; // Taken from toolbar.variables.less
@tooltip-font-size: @font-size-small;
@arrow-size: 7px;
@ui-bg: #f9f9f9;
@ui-border-color: @input-border-color;
@ui-border-top: 1px solid @ui-border-color;
@editor-padding: 20px;
@btn-hover-bg: #ddd;
@btn-text: fade(@btn-secondary-color, 80%);
@btn-font-size: 14;
@btn-active-text: #000;
@input-label-color: @color-label;
//
// Make the focus ring and textarea fill the whole rich editor container
//
.fr-element {
height: 100%;
}
//
// Rich Editor
//
.field-flush .field-richeditor {
&, &.editor-focus {
border: none;
}
}
.richeditor-set-height(@size) {
.fr-wrapper {
height: @size;
.fr-view {
min-height: @size;
}
}
.height-indicator {
height: @size;
display: none;
}
}
.field-richeditor {
border: 1px solid @input-border;
.box-shadow(@input-box-shadow);
.border-radius(@input-border-radius);
.transition(@input-transition);
// Prevents an ugly flash during the time the editor loads
> textarea {
display: none;
}
&.editor-focus {
border-color: @color-form-field-border-focus;
}
&.size-tiny { .richeditor-set-height(@size-tiny); }
&.size-small { .richeditor-set-height(@size-small); }
&.size-large { .richeditor-set-height(@size-large); }
&.size-huge { .richeditor-set-height(@size-huge); }
&.size-giant { .richeditor-set-height(@size-giant); }
&.stretch {
&.size-tiny { min-height: @size-tiny; }
&.size-small { min-height: @size-small; }
&.size-large { min-height: @size-large; }
&.size-huge { min-height: @size-huge; }
&.size-giant { min-height: @size-giant; }
}
}
.fr-tooltip {
z-index: 9997 !important;
}
.fr-popup {
z-index: 9995 !important;
}
.fr-toolbar {
z-index: 11 !important;
}
.fr-separator.fr-hs {
width: 100%;
}
//
// Stretch
//
.field-richeditor.stretch {
.fr-box:not(.fr-fullscreen) {
display: block;
position: relative;
height: 100% !important;
width: 100% !important;
.border-radius(0) !important;
overflow: visible;
.fr-toolbar {
.border-radius(0) !important;
border-top-color: white;
}
.fr-wrapper {
width: 100% !important;
left: 0;
top: 0;
bottom: 0;
position: absolute;
height: auto !important;
.fr-view {
min-height: 0;
}
}
.fr-view, textarea {
height: 100%;
}
.fr-placeholder {
top: 20px;
left: 20px;
}
}
}
//
// Placeholders and snippets
//
.control-richeditor {
.richeditor-snippet() {
display: inline-block;
width: 100%;
margin: 0 0 15px 0;
padding: 10px 10px 10px 36px;
border: 2px dotted #bdc3c7;
background: white;
position: relative;
cursor: pointer;
color: #6c7071;
font: 15px @font-family-base;
font-weight: 500;
line-height: 150%;
.border-radius(3px);
&:focus, &.inspector-open {
border-color: #2581b8;
border-style: solid;
outline: none;
}
}
figure[data-ui-block] {
.richeditor-snippet();
}
figure[data-video], figure[data-audio] {
padding-left: 13px;
&:after {
content: attr(data-label);
}
&:before {
position: static;
margin-right: 8px;
}
}
figure[data-video] {
&:before {
.icon(@video-camera);
}
}
figure[data-audio] {
&:before {
.icon(@volume-up);
}
}
}
//
// Quick Insert
//
.fr-quick-insert {
a.fr-floating-btn {
color: @btn-text;
text-decoration: none;
}
}
//
// Additions to disabled state
//
.fr-box.fr-basic {
// Toolbar
.fr-toolbar.fr-disabled {
.fr-command {
cursor: not-allowed;
&:hover, &:focus {
color: #bdbdbd;
-webkit-box-shadow: none;
box-shadow: none;
&::after {
border-top-color: #bdbdbd!important;
}
}
&.fr-btn-hover {
color: #bdbdbd; background: transparent;
&::after {
border-top-color:#bdbdbd !important
}
}
&.fr-btn.fr-options {
&:hover, &:focus {
border-left:solid 1px transparent;
}
&.fr-btn-hover {
border-left:solid 1px transparent;
}
}
}
}
// Content
.fr-element.fr-disabled {
cursor: not-allowed;
}
}