@kevinkosterr/vue3-form-generator
Version:
A schema-based form generator component for Vue 3, based on the original [`vue-form-generator`](https://github.com/vue-generators/vue-form-generator) library.
401 lines (397 loc) • 12 kB
CSS
.vue-form-generator {
/** Select field */
/** End of select field */
}
.vue-form-generator .vfg-select {
display: inline-flex;
cursor: pointer;
position: relative;
user-select: none;
border: 1px solid #cdcdcd;
color: #202020;
border-radius: 5px;
width: 100%;
min-height: 30px;
background: #f4f4f4;
}
.vue-form-generator .vfg-select .vfg-select-label {
display: flex;
align-items: center;
justify-content: space-between;
flex: 1 0 70%;
align-content: center;
padding: 0.3rem 0.4rem;
}
.vue-form-generator .vfg-select .vfg-select-label.text-muted {
color: #5c5c5c;
}
.vue-form-generator .vfg-select .vfg-select-list-container {
position: absolute;
padding: 0.3rem;
top: calc(35px + 0.2rem);
left: 0;
right: 0;
background: #f4f4f4;
border-radius: 3px;
max-height: 250px;
overflow-y: auto;
z-index: 999;
}
.vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list {
border-radius: inherit;
}
.vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option {
display: flex;
align-content: center;
justify-content: space-between;
padding: 0.3rem 0.4rem;
margin-bottom: 0.1rem;
}
.vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option:first-child, .vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option:first-child:hover, .vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option:last-child, .vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option:last-child:hover {
border-radius: 3px;
}
.vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option.selected, .vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option:hover {
background: #d3d3d3;
}
.vue-form-generator .vfg-select .vfg-select-list-container .vfg-select-list .vfg-select-option:hover {
cursor: pointer;
}
.field-color-wrapper {
display: flex;
flex-direction: row-reverse;
align-items: stretch;
justify-content: start;
}
.field-color-wrapper .field-color-input {
max-width: 100px;
}
/** Styles from https://github.com/vue-generators/vue-form-generator */
.vue-form-generator * {
box-sizing: border-box;
}
.vue-form-generator .field-checkbox input {
margin-left: 12px;
}
.vue-form-generator .field-submit {
color: #fff ;
background-color: #337ab7 ;
border-color: #2e6da4 ;
}
.vue-form-generator .field-switch {
position: relative;
display: block;
width: 120px;
height: 30px;
padding: 0;
margin: 0 10px 10px 0;
border-radius: 15px;
cursor: pointer;
font-size: 10px;
text-transform: uppercase;
background: #eceeef;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.12), inset 0 0 2px rgba(0, 0, 0, 0.15);
/* Transition
========================== */
}
.vue-form-generator .field-switch:has(input[checked]) {
background: #e1b42b;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15), inset 0 0 3px rgba(0, 0, 0, 0.2);
}
.vue-form-generator .field-switch input {
position: absolute;
top: 0;
left: 0;
opacity: 0;
}
.vue-form-generator .field-switch:before, .vue-form-generator .field-switch:after {
position: absolute;
top: 50%;
margin-top: -0.5em;
line-height: 1;
-webkit-transition: inherit;
-moz-transition: inherit;
-o-transition: inherit;
transition: inherit;
}
.vue-form-generator .field-switch:before {
content: attr(data-off);
right: 11px;
color: #aaaaaa;
text-shadow: 0 1px rgba(255, 255, 255, 0.5);
}
.vue-form-generator .field-switch:after {
content: attr(data-on);
left: 11px;
color: #ffffff;
text-shadow: 0 1px rgba(0, 0, 0, 0.2);
opacity: 0;
}
.vue-form-generator .field-switch input:checked ~ label:before {
opacity: 0;
}
.vue-form-generator .field-switch input:checked ~ label:after {
opacity: 1;
}
.vue-form-generator .field-switch .slider {
position: absolute;
top: 1px;
left: 1px;
width: 28px;
height: 28px;
background: linear-gradient(to bottom, #ffffff 40%, #f0f0f0);
background-image: -webkit-linear-gradient(top, #ffffff 40%, #f0f0f0);
border-radius: 100%;
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
}
.vue-form-generator .field-switch .slider:before {
content: "";
position: absolute;
top: 50%;
left: 50%;
margin: -6px 0 0 -6px;
width: 12px;
height: 12px;
background: linear-gradient(to bottom, #eeeeee, #ffffff);
background-image: -webkit-linear-gradient(top, #eeeeee, #ffffff);
border-radius: 6px;
box-shadow: inset 0 1px rgba(0, 0, 0, 0.02);
}
.vue-form-generator .field-switch input:checked ~ .slider {
left: 91px;
left: calc(100% - (30px - 1px));
box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.2);
}
.vue-form-generator .field-switch label,
.vue-form-generator .field-switch .slider {
transition: all 0.3s ease;
}
.vue-form-generator .field-radio input {
margin-right: 5px;
}
.vue-form-generator .field-radio label {
display: block;
}
.vue-form-generator .field-input .wrapper {
width: 100%;
}
.vue-form-generator .field-input input[type=radio] {
width: 100%;
}
.vue-form-generator .field-input input[type=color] {
width: 60px;
}
.vue-form-generator .field-input input[type=range] {
padding: 0;
}
.vue-form-generator .field-input .helper {
margin: auto 0.5em;
}
.vue-form-generator .field-checklist .listbox,
.vue-form-generator .field-checklist .dropList {
height: auto;
max-height: 150px;
overflow: auto;
}
.vue-form-generator .field-checklist .listbox .list-row label,
.vue-form-generator .field-checklist .dropList .list-row label {
font-weight: initial;
}
.vue-form-generator .field-checklist .listbox .list-row input,
.vue-form-generator .field-checklist .dropList .list-row input {
margin-right: 0.3em;
}
.vue-form-generator .field-checklist .combobox {
height: initial;
overflow: hidden;
}
.vue-form-generator .field-checklist .combobox .mainRow {
cursor: pointer;
position: relative;
padding-right: 10px;
}
.vue-form-generator .field-checklist .combobox .mainRow .arrow {
position: absolute;
right: -9px;
top: 3px;
width: 16px;
height: 16px;
transform: rotate(0deg);
transition: transform 0.5s;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAGdJREFUOI3tzjsOwjAURNGDUqSgTxU5K2AVrJtswjUsgHSR0qdxAZZFPrS+3ZvRzBsqf9MUtBtazJk+oMe0VTriiZCFX8nbpENMgfARjsn74vKj5IFruhfc8d6zIF9S/Hyk5HS4spMVeFcOjszaOwMAAAAASUVORK5CYII=");
background-repeat: no-repeat;
}
.vue-form-generator .field-checklist .combobox .mainRow.expanded .arrow {
transform: rotate(-180deg);
}
.vue-form-generator .field-checklist .combobox .dropList {
transition: height 0.5s;
}
.vue-form-generator .form-group:not([class*=" col-"]) {
width: 100%;
}
.vue-form-generator .form-group {
display: inline-block;
vertical-align: top;
margin-bottom: 1rem;
}
.vue-form-generator .form-group label {
font-weight: 400;
}
.vue-form-generator .form-group label > :first-child {
display: inline-block;
}
.vue-form-generator .form-group.featured > label {
font-weight: bold;
}
.vue-form-generator .form-group:has(input[required]) > label:after {
content: "*";
font-weight: normal;
color: red;
padding-left: 0.2em;
font-size: 1em;
}
.vue-form-generator .form-group.disabled > label {
color: #666;
font-style: italic;
}
.vue-form-generator .form-group .errors input:not([type=checkbox]),
.vue-form-generator .form-group .errors textarea,
.vue-form-generator .form-group .errors select {
border: 1px solid #ea0000;
background-color: rgba(234, 0, 0, 0.15);
}
.vue-form-generator .form-group .errors .error {
color: #ea0000;
font-size: 0.8em;
}
.vue-form-generator .form-group .errors .error span {
display: block;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiklEQVR4Xt2TMQoCQQxF3xdhu72MpZU3GU/meBFLOztPYrVWsQmEWSaMsIXgK8P8RyYkMjO2sAN+K9gTIAmDAlzoUzE7p4IFytvDCQWJKSStYB2efcAvqZFM0BcstMx5naSDYFzfLhh/4SmRM+6Agw/xIX0tKEDFufeDNRUc4XqLRz3qabVIf3BMHwl6Ktexn3nmAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
padding-left: 17px;
padding-top: 0px;
margin-top: 0.2em;
font-weight: 600;
}
.vue-form-generator .form-control {
display: block;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.vue-form-generator .form-control:not([class*=" col-"]) {
width: 100%;
}
.vue-form-generator span.help {
margin-left: 0.3em;
position: relative;
/* This bridges the gap so you can mouse into the tooltip without it disappearing */
}
.vue-form-generator span.help .icon {
display: inline-block;
width: 16px;
height: 14px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA+UlEQVQ4ja3TS0oDQRAG4C8+lq7ceICICoLGK7iXuNBbeAMJuPVOIm7cqmDiIncIggg+cMZFaqCnZyYKWtB0df31V1VXdfNH6S2wD9CP8xT3KH8T9BiTcE7XBMOfyBcogvCFO9ziLWwFRosyV+QxthNsA9dJkEYlvazsQdi3sBv6Ol6TBLX+HWT3fcQZ3vGM5fBLk+ynAU41m1biCXvhs4OPBDuBpa6GxF0P8YAj3GA1d1qJfdoS4DOIcIm1DK9x8iaWeDF/SP3QU6zRROpjLDFLsFlibx1jJaMkSIGrWKntvItcyTBKzCcybsvc9ZmYz3kz9Ooz/b98A8yvW13B3ch6AAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-position: center center;
}
.vue-form-generator span.help .helpText {
background-color: #444;
bottom: 30px;
color: #fff;
display: block;
left: 0px;
opacity: 0;
padding: 20px;
pointer-events: none;
position: absolute;
text-align: justify;
width: 300px;
transition: all 0.25s ease-out;
box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5);
border-radius: 6px;
}
.vue-form-generator span.help .helpText a {
font-weight: bold;
text-decoration: underline;
}
.vue-form-generator span.help .helpText:before {
bottom: -20px;
content: " ";
display: block;
height: 20px;
left: 0;
position: absolute;
width: 100%;
}
.vue-form-generator span.help:hover .helpText {
opacity: 1;
pointer-events: auto;
transform: translateY(0px);
}
.vue-form-generator .field-wrap {
display: flex;
}
.vue-form-generator .field-wrap .buttons {
white-space: nowrap;
margin-left: 4px;
}
.vue-form-generator .field-wrap button,
.vue-form-generator .field-wrap input[type=submit],
.vue-form-generator .field-wrap input[type=reset] {
display: inline-block;
padding: 6px 12px;
margin: 0px;
font-size: 14px;
font-weight: normal;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
touch-action: manipulation;
cursor: pointer;
user-select: none;
color: #333;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
}
.vue-form-generator .field-wrap button:not(:last-child),
.vue-form-generator .field-wrap input[type=submit]:not(:last-child),
.vue-form-generator .field-wrap input[type=reset]:not(:last-child) {
margin-right: 4px;
}
.vue-form-generator .field-wrap button:hover,
.vue-form-generator .field-wrap input[type=submit]:hover,
.vue-form-generator .field-wrap input[type=reset]:hover {
color: #333;
background-color: #e6e6e6;
border-color: #adadad;
}
.vue-form-generator .field-wrap button:active,
.vue-form-generator .field-wrap input[type=submit]:active,
.vue-form-generator .field-wrap input[type=reset]:active {
color: #333;
background-color: #d4d4d4;
border-color: #8c8c8c;
outline: 0;
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
.vue-form-generator .field-wrap button:disabled,
.vue-form-generator .field-wrap input[type=submit]:disabled,
.vue-form-generator .field-wrap input[type=reset]:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.vue-form-generator .hint {
font-style: italic;
font-size: 0.8em;
}
/*# sourceMappingURL=legacy.css.map */