Customizing Theme Panel
Learn how to customize the Theme panel.
Disabling Config Fields
The following options can be used to disable theme config fields:
// builder.config.js
import { defineConfig } from '@vueform/builder'
export default defineConfig({
'theme': {
'props': {
'theme': {
'theme': true
},
'tools': {
'tools': true
},
'colors': {
'primary': true,
'primary-darker': true,
'color-on-primary': true,
'danger': true,
'danger-lighter': true,
'success': true,
'success-lighter': true,
'gray-50': true,
'gray-100': true,
'gray-200': true,
'gray-300': true,
'gray-400': true,
'gray-500': true,
'gray-600': true,
'gray-700': true,
'gray-800': true,
'gray-900': true,
'dark-50': true,
'dark-100': true,
'dark-200': true,
'dark-300': true,
'dark-400': true,
'dark-500': true,
'dark-600': true,
'dark-700': true,
'dark-800': true,
'dark-900': true
},
'fonts': {
'font-size': true,
'line-height': true,
'letter-spacing': true,
'font-size-small': true,
'line-height-small': true,
'letter-spacing-small': true,
'font-size-h1': true,
'font-size-h1-mobile': true,
'font-size-h2': true,
'font-size-h2-mobile': true,
'font-size-h3': true,
'font-size-h3-mobile': true,
'font-size-h4': true,
'font-size-h4-mobile': true,
'line-height-headings': true,
'letter-spacing-headings': true,
'font-size-blockquote': true,
'line-height-blockquote': true,
'letter-spacing-blockquote': true
},
'spaces': {
'gutter': true,
'link-color': true,
'link-decoration': true,
'color-muted': true,
'color-passive': true,
'bg-passive': true,
'border-color-passive': true,
'bg-selected': true,
'radius-small': true,
'shadow-handles': true,
'shadow-handles-hover': true,
'shadow-handles-focus': true
},
'inputs': {
'min-height-input': true,
'ring-width': true,
'ring-color': true,
'py-input': true,
'px-input': true,
'border-width-input': true,
'radius-input': true,
'radius-large': true,
'border-color-input': true,
'color-input': true,
'bg-icon': true,
'color-floating': true,
'bg-input': true,
'shadow-input': true,
'hover': true,
'color-input-hover': true,
'bg-input-hover': true,
'border-color-input-hover': true,
'shadow-input-hover': true,
'focus': true,
'color-input-focus': true,
'color-floating-focus': true,
'bg-input-focus': true,
'border-color-input-focus': true,
'shadow-input-focus': true,
'danger': true,
'color-input-danger': true,
'color-floating-danger': true,
'bg-input-danger': true,
'border-color-input-danger': true,
'success': true,
'color-input-success': true,
'color-floating-success': true,
'bg-input-success': true,
'border-color-input-success': true,
'disabled': true,
'color-disabled': true,
'bg-disabled': true,
'floating-top': true,
'space-addon': true,
'bg-addon': true,
'color-addon': true
},
'select': {
'dropdown': true,
'border-width-dropdown': true,
'shadow-dropdown': true
},
'tags': {
'py-tag': true,
'px-tag': true,
'space-tags': true,
'border-width-tag': true,
'radius-tag': true,
'color-tag': true,
'bg-tag': true,
'border-color-tag': true
},
'signature': {
'border-color-signature-hr': true
},
'datepicker': {
'color-date-head': true,
'bg-date-head': true
},
'checkboxes': {
'checkbox-size': true,
'space-checkbox': true,
'radio': true,
'border-width-radio': true,
'checkbox': true,
'border-width-checkbox': true,
'radius-checkbox': true,
'tabs': true,
'py-group-tabs': true,
'px-group-tabs': true,
'blocks': true,
'py-group-blocks': true,
'px-group-blocks': true,
'colors': true,
'bg-checkbox': true,
'border-color-checkbox': true,
'hover': true,
'bg-checkbox-hover': true,
'border-color-checkbox-hover': true,
'focus': true,
'bg-checkbox-focus': true,
'border-color-checkbox-focus': true,
'danger': true,
'bg-checkbox-danger': true,
'border-color-checkbox-danger': true,
'success': true,
'bg-checkbox-success': true,
'border-color-checkbox-success': true,
'checked': true,
'border-color-checked': true
},
'matrix': {
'border-color-table': true,
'border-width-table': true,
'bg-table-header': true,
'color-table-header': true
},
'slider': {
'slider-height': true,
'slider-height-vertical': true,
'radius-slider': true,
'handle': true,
'slider-handle-size': true,
'bg-slider-handle': true,
'tooltip': true,
'py-slider-tooltip': true,
'px-slider-tooltip': true,
'slider-tooltip-distance': true,
'slider-tooltip-arrow-size': true,
'border-color-slider-tooltip': true
},
'toggle': {
'toggle-width': true,
'toggle-height': true,
'border-width-toggle': true,
'handle': true,
'bg-toggle-handle': true
},
'images': {
'image': true,
'radius-image': true,
'gallery': true,
'gallery-size': true,
'radius-gallery': true
},
'buttons': {
'py-btn': true,
'px-btn': true,
'small-buttons': true,
'py-btn-small': true,
'px-btn-small': true,
'border-color-btn': true,
'border-width-btn': true,
'radius-btn': true,
'color-btn': true,
'bg-btn': true,
'shadow-btn': true,
'secondary': true,
'color-btn-secondary': true,
'bg-btn-secondary': true,
'border-color-btn-secondary': true,
'danger': true,
'color-btn-danger': true,
'bg-btn-danger': true,
'border-color-btn-danger': true
},
'static': {
'spacing': true,
'space-static-tag-1': true,
'space-static-tag-2': true,
'space-static-tag-3': true,
'divider': true,
'py-hr': true,
'border-color-hr': true,
'quote': true,
'py-blockquote': true,
'px-blockquote': true,
'border-width-blockquote': true,
'border-color-blockquote': true
}
}
},
})
Available Themes
The available themes can be configured with the themes
property in builder.config.js
:
// builder.config.js
import { defineConfig } from '@vueform/builder'
export default defineConfig({
themes: [
{
label: 'official_themes',
themes: [
{
label: 'Vueform',
default: true,
vars: {
primary: '#07bf9b',
'primary-darker': '#06ac8b',
'color-on-primary': '#ffffff',
danger: '#ef4444',
'danger-lighter': '#fee2e2',
success: '#10b981',
'success-lighter': '#d1fae5',
'gray-50': '#f9fafb',
'gray-100': '#f3f4f6',
'gray-200': '#e5e7eb',
'gray-300': '#d1d5db',
'gray-400': '#9ca3af',
'gray-500': '#6b7280',
'gray-600': '#4b5563',
'gray-700': '#374151',
'gray-800': '#1f2937',
'gray-900': '#111827',
'dark-50': '#EFEFEF',
'dark-100': '#DCDCDC',
'dark-200': '#BDBDBD',
'dark-300': '#A0A0A0',
'dark-400': '#848484',
'dark-500': '#737373',
'dark-600': '#393939',
'dark-700': '#323232',
'dark-800': '#262626',
'dark-900': '#191919',
'ring-width': '2px',
'ring-color': '#07bf9b66',
'link-color': 'var(--vf-primary)',
'link-decoration': 'inherit',
'font-size': '1rem',
'font-size-sm': '0.875rem',
'font-size-lg': '1rem',
'font-size-small': '0.875rem',
'font-size-small-sm': '0.8125rem',
'font-size-small-lg': '0.875rem',
'font-size-h1': '2.125rem',
'font-size-h1-sm': '2.125rem',
'font-size-h1-lg': '2.125rem',
'font-size-h2': '1.875rem',
'font-size-h2-sm': '1.875rem',
'font-size-h2-lg': '1.875rem',
'font-size-h3': '1.5rem',
'font-size-h3-sm': '1.5rem',
'font-size-h3-lg': '1.5rem',
'font-size-h4': '1.25rem',
'font-size-h4-sm': '1.25rem',
'font-size-h4-lg': '1.25rem',
'font-size-h1-mobile': '1.5rem',
'font-size-h1-mobile-sm': '1.5rem',
'font-size-h1-mobile-lg': '1.5rem',
'font-size-h2-mobile': '1.25rem',
'font-size-h2-mobile-sm': '1.25rem',
'font-size-h2-mobile-lg': '1.25rem',
'font-size-h3-mobile': '1.125rem',
'font-size-h3-mobile-sm': '1.125rem',
'font-size-h3-mobile-lg': '1.125rem',
'font-size-h4-mobile': '1rem',
'font-size-h4-mobile-sm': '1rem',
'font-size-h4-mobile-lg': '1rem',
'font-size-blockquote': '1rem',
'font-size-blockquote-sm': '0.875rem',
'font-size-blockquote-lg': '1rem',
'line-height': '1.5rem',
'line-height-sm': '1.25rem',
'line-height-lg': '1.5rem',
'line-height-small': '1.25rem',
'line-height-small-sm': '1.125rem',
'line-height-small-lg': '1.25rem',
'line-height-headings': '1.2',
'line-height-headings-sm': '1.2',
'line-height-headings-lg': '1.2',
'line-height-blockquote': '1.5rem',
'line-height-blockquote-sm': '1.25rem',
'line-height-blockquote-lg': '1.5rem',
'letter-spacing': '0px',
'letter-spacing-sm': '0px',
'letter-spacing-lg': '0px',
'letter-spacing-small': '0px',
'letter-spacing-small-sm': '0px',
'letter-spacing-small-lg': '0px',
'letter-spacing-headings': '0px',
'letter-spacing-headings-sm': '0px',
'letter-spacing-headings-lg': '0px',
'letter-spacing-blockquote': '0px',
'letter-spacing-blockquote-sm': '0px',
'letter-spacing-blockquote-lg': '0px',
gutter: '1rem',
'gutter-sm': '0.5rem',
'gutter-lg': '1rem',
'min-height-input': '2.375rem',
'min-height-input-sm': '2.125rem',
'min-height-input-lg': '2.875rem',
'py-input': '0.375rem',
'py-input-sm': '0.375rem',
'py-input-lg': '0.625rem',
'px-input': '0.75rem',
'px-input-sm': '0.5rem',
'px-input-lg': '0.875rem',
'py-btn': '0.375rem',
'py-btn-sm': '0.375rem',
'py-btn-lg': '0.625rem',
'px-btn': '0.875rem',
'px-btn-sm': '0.75rem',
'px-btn-lg': '1.25rem',
'py-btn-small': '0.25rem',
'py-btn-small-sm': '0.25rem',
'py-btn-small-lg': '0.375rem',
'px-btn-small': '0.625rem',
'px-btn-small-sm': '0.625rem',
'px-btn-small-lg': '0.75rem',
'py-group-tabs': '0.375rem',
'py-group-tabs-sm': '0.375rem',
'py-group-tabs-lg': '0.625rem',
'px-group-tabs': '0.75rem',
'px-group-tabs-sm': '0.5rem',
'px-group-tabs-lg': '0.875rem',
'py-group-blocks': '0.75rem',
'py-group-blocks-sm': '0.625rem',
'py-group-blocks-lg': '0.875rem',
'px-group-blocks': '1rem',
'px-group-blocks-sm': '1rem',
'px-group-blocks-lg': '1rem',
'py-tag': '0px',
'py-tag-sm': '0px',
'py-tag-lg': '0px',
'px-tag': '0.4375rem',
'px-tag-sm': '0.4375rem',
'px-tag-lg': '0.4375rem',
'py-slider-tooltip': '0.125rem',
'py-slider-tooltip-sm': '0.0625rem',
'py-slider-tooltip-lg': '0.1875rem',
'px-slider-tooltip': '0.375rem',
'px-slider-tooltip-sm': '0.3125rem',
'px-slider-tooltip-lg': '0.5rem',
'py-blockquote': '0.25rem',
'py-blockquote-sm': '0.25rem',
'py-blockquote-lg': '0.25rem',
'px-blockquote': '0.75rem',
'px-blockquote-sm': '0.75rem',
'px-blockquote-lg': '0.75rem',
'py-hr': '0.25rem',
'space-addon': '0px',
'space-addon-sm': '0px',
'space-addon-lg': '0px',
'space-checkbox': '0.375rem',
'space-checkbox-sm': '0.375rem',
'space-checkbox-lg': '0.375rem',
'space-tags': '0.1875rem',
'space-tags-sm': '0.1875rem',
'space-tags-lg': '0.1875rem',
'space-static-tag-1': '1rem',
'space-static-tag-2': '2rem',
'space-static-tag-3': '3rem',
'floating-top': '0rem',
'floating-top-sm': '0rem',
'floating-top-lg': '0.6875rem',
'bg-input': '#ffffff',
'bg-input-hover': '#ffffff',
'bg-input-focus': '#ffffff',
'bg-input-danger': '#ffffff',
'bg-input-success': '#ffffff',
'bg-checkbox': '#ffffff',
'bg-checkbox-hover': '#ffffff',
'bg-checkbox-focus': '#ffffff',
'bg-checkbox-danger': '#ffffff',
'bg-checkbox-success': '#ffffff',
'bg-disabled': 'var(--vf-gray-200)',
'bg-selected': '#1118270d',
'bg-passive': 'var(--vf-gray-300)',
'bg-icon': 'var(--vf-gray-500)',
'bg-danger': 'var(--vf-danger-lighter)',
'bg-success': 'var(--vf-success-lighter)',
'bg-tag': 'var(--vf-primary)',
'bg-slider-handle': 'var(--vf-primary)',
'bg-toggle-handle': '#ffffff',
'bg-date-head': 'var(--vf-gray-100)',
'bg-addon': '#ffffff00',
'bg-btn': 'var(--vf-primary)',
'bg-btn-danger': 'var(--vf-danger)',
'bg-btn-secondary': 'var(--vf-gray-200)',
'bg-table-header': 'var(--vf-gray-100)',
'color-input': 'var(--vf-gray-800)',
'color-input-hover': 'var(--vf-gray-800)',
'color-input-focus': 'var(--vf-gray-800)',
'color-input-danger': 'var(--vf-gray-800)',
'color-input-success': 'var(--vf-gray-800)',
'color-disabled': 'var(--vf-gray-400)',
'color-placeholder': 'var(--vf-gray-300)',
'color-passive': 'var(--vf-gray-700)',
'color-muted': 'var(--vf-gray-500)',
'color-floating': 'var(--vf-gray-500)',
'color-floating-focus': 'var(--vf-gray-500)',
'color-floating-success': 'var(--vf-gray-500)',
'color-floating-danger': 'var(--vf-gray-500)',
'color-danger': 'var(--vf-danger)',
'color-success': 'var(--vf-success)',
'color-tag': 'var(--vf-color-on-primary)',
'color-addon': 'var(--vf-gray-800)',
'color-date-head': 'var(--vf-gray-700)',
'color-btn': 'var(--vf-color-on-primary)',
'color-btn-danger': '#ffffff',
'color-btn-secondary': 'var(--vf-gray-700)',
'color-table-header': 'var(--vf-gray-800)',
'border-color-input': 'var(--vf-gray-300)',
'border-color-input-hover': 'var(--vf-gray-300)',
'border-color-input-focus': 'var(--vf-primary)',
'border-color-input-danger': 'var(--vf-gray-300)',
'border-color-input-success': 'var(--vf-gray-300)',
'border-color-checkbox': 'var(--vf-gray-300)',
'border-color-checkbox-focus': 'var(--vf-primary)',
'border-color-checkbox-hover': 'var(--vf-gray-300)',
'border-color-checkbox-danger': 'var(--vf-gray-300)',
'border-color-checkbox-success': 'var(--vf-gray-300)',
'border-color-checked': 'var(--vf-primary)',
'border-color-passive': 'var(--vf-gray-300)',
'border-color-slider-tooltip': 'var(--vf-primary)',
'border-color-tag': 'var(--vf-primary)',
'border-color-btn': 'var(--vf-primary)',
'border-color-btn-danger': 'var(--vf-danger)',
'border-color-btn-secondary': 'var(--vf-gray-200)',
'border-color-blockquote': 'var(--vf-gray-300)',
'border-color-hr': 'var(--vf-gray-300)',
'border-color-signature-hr': 'var(--vf-gray-300)',
'border-color-table': 'var(--vf-gray-300)',
'border-width-input-t': '1px',
'border-width-input-r': '1px',
'border-width-input-b': '1px',
'border-width-input-l': '1px',
'border-width-radio-t': '1px',
'border-width-radio-r': '1px',
'border-width-radio-b': '1px',
'border-width-radio-l': '1px',
'border-width-checkbox-t': '1px',
'border-width-checkbox-r': '1px',
'border-width-checkbox-b': '1px',
'border-width-checkbox-l': '1px',
'border-width-dropdown': '1px',
'border-width-btn': '1px',
'border-width-toggle': '0.125rem',
'border-width-tag': '1px',
'border-width-blockquote': '3px',
'border-width-table': '1px',
'shadow-input': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-input-hover': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-input-focus': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-handles': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-handles-hover': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-handles-focus': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-btn': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-dropdown': '0px 0px 0px 0px rgba(0,0,0,0)',
'radius-input': '0.25rem',
'radius-input-sm': '0.25rem',
'radius-input-lg': '0.25rem',
'radius-btn': '0.25rem',
'radius-btn-sm': '0.25rem',
'radius-btn-lg': '0.25rem',
'radius-small': '0.25rem',
'radius-small-sm': '0.25rem',
'radius-small-lg': '0.25rem',
'radius-large': '0.25rem',
'radius-large-sm': '0.25rem',
'radius-large-lg': '0.25rem',
'radius-tag': '0.25rem',
'radius-tag-sm': '0.25rem',
'radius-tag-lg': '0.25rem',
'radius-checkbox': '0.25rem',
'radius-checkbox-sm': '0.25rem',
'radius-checkbox-lg': '0.25rem',
'radius-slider': '0.25rem',
'radius-slider-sm': '0.25rem',
'radius-slider-lg': '0.25rem',
'radius-image': '0.25rem',
'radius-image-sm': '0.25rem',
'radius-image-lg': '0.25rem',
'radius-gallery': '0.25rem',
'radius-gallery-sm': '0.25rem',
'radius-gallery-lg': '0.25rem',
'checkbox-size': '1rem',
'checkbox-size-sm': '0.875rem',
'checkbox-size-lg': '1rem',
'gallery-size': '6rem',
'gallery-size-sm': '5rem',
'gallery-size-lg': '7rem',
'toggle-width': '3rem',
'toggle-width-sm': '2.75rem',
'toggle-width-lg': '3rem',
'toggle-height': '1.25rem',
'toggle-height-sm': '1rem',
'toggle-height-lg': '1.25rem',
'slider-height': '0.375rem',
'slider-height-sm': '0.3125rem',
'slider-height-lg': '0.5rem',
'slider-height-vertical': '20rem',
'slider-height-vertical-sm': '20rem',
'slider-height-vertical-lg': '20rem',
'slider-handle-size': '1rem',
'slider-handle-size-sm': '0.875rem',
'slider-handle-size-lg': '1.25rem',
'slider-tooltip-distance': '0.5rem',
'slider-tooltip-distance-sm': '0.375rem',
'slider-tooltip-distance-lg': '0.5rem',
'slider-tooltip-arrow-size': '0.3125rem',
'slider-tooltip-arrow-size-sm': '0.3125rem',
'slider-tooltip-arrow-size-lg': '0.3125rem',
},
},
{
label: 'Bootstrap',
vars: {
primary: '#007bff',
'primary-darker': '#0056b3',
'color-on-primary': '#ffffff',
danger: '#dc3545',
'danger-lighter': '#f9dcdf',
success: '#28a745',
'success-lighter': '#c4f1ce',
'gray-50': '#f9fafb',
'gray-100': '#f8f9fa',
'gray-200': '#e9ecef',
'gray-300': '#dee2e6',
'gray-400': '#ced4da',
'gray-500': '#adb5bd',
'gray-600': '#6c757d',
'gray-700': '#495057',
'gray-800': '#343a40',
'gray-900': '#212529',
'dark-50': '#f9fafb',
'dark-100': '#f8f9fa',
'dark-200': '#e9ecef',
'dark-300': '#dee2e6',
'dark-400': '#ced4da',
'dark-500': '#adb5bd',
'dark-600': '#6c757d',
'dark-700': '#495057',
'dark-800': '#343a40',
'dark-900': '#212529',
'ring-width': '0.2rem',
'ring-color': '#007bff66',
'link-color': '#007bff',
'link-decoration': 'underline',
'font-size': '1rem',
'font-size-sm': '0.875rem',
'font-size-lg': '1.25rem',
'font-size-small': '0.8rem',
'font-size-small-sm': '0.7rem',
'font-size-small-lg': '1rem',
'font-size-h1': '2.5rem',
'font-size-h1-sm': '2.5rem',
'font-size-h1-lg': '2.5rem',
'font-size-h2': '2rem',
'font-size-h2-sm': '2rem',
'font-size-h2-lg': '2rem',
'font-size-h3': '1.75rem',
'font-size-h3-sm': '1.75rem',
'font-size-h3-lg': '1.75rem',
'font-size-h4': '1.5rem',
'font-size-h4-sm': '1.5rem',
'font-size-h4-lg': '1.5rem',
'font-size-h1-mobile': '2.5rem',
'font-size-h1-mobile-sm': '2.5rem',
'font-size-h1-mobile-lg': '2.5rem',
'font-size-h2-mobile': '2rem',
'font-size-h2-mobile-sm': '2rem',
'font-size-h2-mobile-lg': '2rem',
'font-size-h3-mobile': '1.75rem',
'font-size-h3-mobile-sm': '1.75rem',
'font-size-h3-mobile-lg': '1.75rem',
'font-size-h4-mobile': '1.5rem',
'font-size-h4-mobile-sm': '1.5rem',
'font-size-h4-mobile-lg': '1.5rem',
'font-size-blockquote': '1.25rem',
'font-size-blockquote-sm': '1.25rem',
'font-size-blockquote-lg': '1.25rem',
'line-height': '1.5rem',
'line-height-sm': '1.5rem',
'line-height-lg': '1.5rem',
'line-height-small': '1.5rem',
'line-height-small-sm': '1.5rem',
'line-height-small-lg': '1.5rem',
'line-height-headings': '1.2rem',
'line-height-headings-sm': '1.2rem',
'line-height-headings-lg': '1.2rem',
'line-height-blockquote': '1.5',
'line-height-blockquote-sm': '1.25',
'line-height-blockquote-lg': '2',
'letter-spacing': '0px',
'letter-spacing-sm': '0px',
'letter-spacing-lg': '0px',
'letter-spacing-small': '0px',
'letter-spacing-small-sm': '0px',
'letter-spacing-small-lg': '0px',
'letter-spacing-headings': '0px',
'letter-spacing-headings-sm': '0px',
'letter-spacing-headings-lg': '0px',
'letter-spacing-blockquote': '0px',
'letter-spacing-blockquote-sm': '0px',
'letter-spacing-blockquote-lg': '0px',
gutter: '15px',
'gutter-sm': '7.5px',
'gutter-lg': '15px',
'min-height-input': '2.375rem',
'min-height-input-sm': '2.125rem',
'min-height-input-lg': '2.625rem',
'py-input': '0.375rem',
'py-input-sm': '0.25rem',
'py-input-lg': '0.5rem',
'px-input': '0.75rem',
'px-input-sm': '0.5rem',
'px-input-lg': '1rem',
'py-btn': '0.375rem',
'py-btn-sm': '0.25rem',
'py-btn-lg': '0.5rem',
'px-btn': '0.75rem',
'px-btn-sm': '0.5rem',
'px-btn-lg': '1rem',
'py-btn-small': '0.28125rem',
'py-btn-small-sm': '0.1875rem',
'py-btn-small-lg': '0.375rem',
'px-btn-small': '0.5625rem',
'px-btn-small-sm': '0.375rem',
'px-btn-small-lg': '0.75rem',
'py-group-tabs': '0.375rem',
'py-group-tabs-sm': '0.25rem',
'py-group-tabs-lg': '0.5rem',
'px-group-tabs': '0.75rem',
'px-group-tabs-sm': '0.5rem',
'px-group-tabs-lg': '1rem',
'py-group-blocks': '0.75rem',
'py-group-blocks-sm': '0.625rem',
'py-group-blocks-lg': '0.875rem',
'px-group-blocks': '1rem',
'px-group-blocks-sm': '1rem',
'px-group-blocks-lg': '1rem',
'py-tag': '0px',
'py-tag-sm': '0px',
'py-tag-lg': '0px',
'px-tag': '0.4375rem',
'px-tag-sm': '0.4375rem',
'px-tag-lg': '0.4375rem',
'py-slider-tooltip': '0.125rem',
'py-slider-tooltip-sm': '0.0625rem',
'py-slider-tooltip-lg': '0.1875rem',
'px-slider-tooltip': '0.375rem',
'px-slider-tooltip-sm': '0.3125rem',
'px-slider-tooltip-lg': '0.5rem',
'py-blockquote': '0.5rem',
'py-blockquote-sm': '0.5rem',
'py-blockquote-lg': '0.5rem',
'px-blockquote': '1rem',
'px-blockquote-sm': '1rem',
'px-blockquote-lg': '1rem',
'py-hr': '0.25rem',
'space-addon': '0.75rem',
'space-addon-sm': '0.75rem',
'space-addon-lg': '0.75rem',
'space-checkbox': '0.25rem',
'space-checkbox-sm': '0.25rem',
'space-checkbox-lg': '0.25rem',
'space-tags': '0.1875rem',
'space-tags-sm': '0.1875rem',
'space-tags-lg': '0.1875rem',
'space-static-tag-1': '1rem',
'space-static-tag-2': '2rem',
'space-static-tag-3': '3rem',
'floating-top': '0rem',
'floating-top-sm': '0rem',
'floating-top-lg': '0.6875rem',
'bg-input': '#ffffff',
'bg-input-focus': '#ffffff',
'bg-input-hover': '#ffffff',
'bg-input-danger': '#ffffff',
'bg-input-success': '#ffffff',
'bg-checkbox': '#ffffff',
'bg-checkbox-hover': '#ffffff',
'bg-checkbox-focus': '#ffffff',
'bg-checkbox-danger': '#ffffff',
'bg-checkbox-success': '#ffffff',
'bg-disabled': '#e9ecef',
'bg-selected': '#1118270d',
'bg-passive': 'var(--vf-gray-300)',
'bg-icon': 'var(--vf-gray-500)',
'bg-danger': 'var(--vf-danger-lighter)',
'bg-success': 'var(--vf-success-lighter)',
'bg-tag': 'var(--vf-primary)',
'bg-slider-handle': 'var(--vf-primary)',
'bg-toggle-handle': '#ffffff',
'bg-date-head': 'var(--vf-gray-100)',
'bg-addon': '#e9ecef',
'bg-btn': 'var(--vf-primary)',
'bg-btn-danger': 'var(--vf-danger)',
'bg-btn-secondary': 'var(--vf-gray-200)',
'bg-table-header': 'var(--vf-gray-100)',
'color-input': 'var(--vf-gray-700)',
'color-input-focus': 'var(--vf-gray-700)',
'color-input-hover': 'var(--vf-gray-700)',
'color-input-danger': 'var(--vf-gray-700)',
'color-input-success': 'var(--vf-gray-700)',
'color-disabled': 'var(--vf-gray-700)',
'color-placeholder': 'var(--vf-gray-600)',
'color-passive': 'var(--vf-gray-700)',
'color-muted': 'var(--vf-gray-600)',
'color-floating': 'var(--vf-gray-600)',
'color-floating-success': 'var(--vf-gray-600)',
'color-floating-danger': 'var(--vf-gray-600)',
'color-floating-focus': 'var(--vf-gray-600)',
'color-danger': 'var(--vf-danger)',
'color-success': 'var(--vf-success)',
'color-tag': 'var(--vf-color-on-primary)',
'color-addon': 'var(--vf-gray-700)',
'color-date-head': 'var(--vf-gray-700)',
'color-btn': 'var(--vf-color-on-primary)',
'color-btn-danger': '#ffffff',
'color-btn-secondary': 'var(--vf-gray-700)',
'color-table-header': 'var(--vf-gray-700)',
'border-color-input': 'var(--vf-gray-400)',
'border-color-input-focus': '#80bdff',
'border-color-input-hover': 'var(--vf-gray-400)',
'border-color-input-danger': 'var(--vf-gray-400)',
'border-color-input-success': 'var(--vf-gray-400)',
'border-color-checkbox': 'var(--vf-gray-400)',
'border-color-checkbox-focus': '#80bdff',
'border-color-checkbox-hover': 'var(--vf-gray-400)',
'border-color-checkbox-danger': 'var(--vf-gray-400)',
'border-color-checkbox-success': 'var(--vf-gray-400)',
'border-color-checked': 'var(--vf-primary)',
'border-color-passive': 'var(--vf-gray-300)',
'border-color-slider-tooltip': 'var(--vf-primary)',
'border-color-tag': 'var(--vf-primary)',
'border-color-btn': 'var(--vf-primary)',
'border-color-btn-danger': 'var(--vf-danger)',
'border-color-btn-secondary': 'var(--vf-gray-200)',
'border-color-blockquote': 'var(--vf-gray-400)',
'border-color-hr': 'var(--vf-gray-600)',
'border-color-signature-hr': 'var(--vf-gray-600)',
'border-color-table': 'var(--vf-gray-400)',
'border-width-input-t': '1px',
'border-width-input-r': '1px',
'border-width-input-b': '1px',
'border-width-input-l': '1px',
'border-width-radio-t': '1px',
'border-width-radio-r': '1px',
'border-width-radio-b': '1px',
'border-width-radio-l': '1px',
'border-width-checkbox-t': '1px',
'border-width-checkbox-r': '1px',
'border-width-checkbox-b': '1px',
'border-width-checkbox-l': '1px',
'border-width-dropdown': '1px',
'border-width-btn': '1px',
'border-width-toggle': '0.125rem',
'border-width-tag': '1px',
'border-width-table': '1px',
'shadow-input': 'inset 0 1px 1px rgba(0, 0, 0, 0.075)',
'shadow-input-hover': 'inset 0 1px 1px rgba(0, 0, 0, 0.075)',
'shadow-input-focus': '0 0 0 0.2rem rgba(0, 123, 255, 0.25)',
'shadow-handles': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-handles-hover': 'inset 0 1px 1px rgba(0, 0, 0, 0.075)',
'shadow-handles-focus': '0 0 0 0.2rem rgba(0, 123, 255, 0.25)',
'shadow-btn': 'inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075)',
'shadow-dropdown': '0px 0px 0px 0px rgba(0,0,0,0)',
'radius-input': '0.25rem',
'radius-input-sm': '0.2rem',
'radius-input-lg': '0.3rem',
'radius-btn': '0.25rem',
'radius-btn-sm': '0.2rem',
'radius-btn-lg': '0.3rem',
'radius-small': '0.25rem',
'radius-small-sm': '0.2rem',
'radius-small-lg': '0.25rem',
'radius-large': '0.25rem',
'radius-large-sm': '0.2rem',
'radius-large-lg': '0.25rem',
'radius-tag': '0.25rem',
'radius-tag-sm': '0.2rem',
'radius-tag-lg': '0.25rem',
'radius-checkbox': '0.25rem',
'radius-checkbox-sm': '0.2rem',
'radius-checkbox-lg': '0.25rem',
'radius-slider': '0.25rem',
'radius-slider-sm': '0.2rem',
'radius-slider-lg': '0.25rem',
'radius-image': '0.25rem',
'radius-image-sm': '0.2rem',
'radius-image-lg': '0.25rem',
'radius-gallery': '0.25rem',
'radius-gallery-sm': '0.2rem',
'radius-gallery-lg': '0.25rem',
'checkbox-size': '1rem',
'checkbox-size-sm': '0.875rem',
'checkbox-size-lg': '1rem',
'gallery-size': '6rem',
'gallery-size-sm': '5rem',
'gallery-size-lg': '7rem',
'toggle-width': '3rem',
'toggle-width-sm': '2.75rem',
'toggle-width-lg': '3rem',
'toggle-height': '1.25rem',
'toggle-height-sm': '1.125rem',
'toggle-height-lg': '1.25rem',
'slider-height': '0.375rem',
'slider-height-sm': '0.3125rem',
'slider-height-lg': '0.5rem',
'slider-height-vertical': '20rem',
'slider-height-vertical-sm': '20rem',
'slider-height-vertical-lg': '20rem',
'slider-handle-size': '1rem',
'slider-handle-size-sm': '0.875rem',
'slider-handle-size-lg': '1.25rem',
'slider-tooltip-distance': '0.5rem',
'slider-tooltip-distance-sm': '0.375rem',
'slider-tooltip-distance-lg': '0.5rem',
'slider-tooltip-arrow-size': '0.3125rem',
'slider-tooltip-arrow-size-sm': '0.3125rem',
'slider-tooltip-arrow-size-lg': '0.3125rem',
},
},
{
label: 'Material',
vars: {
primary: '#6200ee',
'primary-darker': '#5000cc',
'color-on-primary': '#ffffff',
danger: '#b00020',
'danger-lighter': '#f9e5e8',
success: '#4caf50',
'success-lighter': '#e8f5e9',
'ring-width': '0px',
'ring-color': '#673ab766',
'link-color': 'var(--vf-primary)',
'link-decoration': 'inherit',
'gray-50': '#fafafa',
'gray-100': '#f5f5f5',
'gray-200': '#eeeeee',
'gray-300': '#e0e0e0',
'gray-400': '#bdbdbd',
'gray-500': '#9e9e9e',
'gray-600': '#757575',
'gray-700': '#616161',
'gray-800': '#424242',
'gray-900': '#212121',
'dark-50': '#fafafa',
'dark-100': '#f5f5f5',
'dark-200': '#eeeeee',
'dark-300': '#e0e0e0',
'dark-400': '#bdbdbd',
'dark-500': '#9e9e9e',
'dark-600': '#757575',
'dark-700': '#616161',
'dark-800': '#424242',
'dark-900': '#212121',
'font-size': '1rem',
'font-size-sm': '0.875rem',
'font-size-lg': '1rem',
'font-size-small': '0.875rem',
'font-size-small-sm': '0.75rem',
'font-size-small-lg': '0.875rem',
'font-size-h1': '2.125rem',
'font-size-h1-sm': '2.125rem',
'font-size-h1-lg': '2.125rem',
'font-size-h2': '1.875rem',
'font-size-h2-sm': '1.875rem',
'font-size-h2-lg': '1.875rem',
'font-size-h3': '1.5rem',
'font-size-h3-sm': '1.5rem',
'font-size-h3-lg': '1.5rem',
'font-size-h4': '1.25rem',
'font-size-h4-sm': '1.25rem',
'font-size-h4-lg': '1.25rem',
'font-size-h1-mobile': '1.5rem',
'font-size-h1-mobile-sm': '1.5rem',
'font-size-h1-mobile-lg': '1.5rem',
'font-size-h2-mobile': '1.25rem',
'font-size-h2-mobile-sm': '1.25rem',
'font-size-h2-mobile-lg': '1.25rem',
'font-size-h3-mobile': '1.125rem',
'font-size-h3-mobile-sm': '1.125rem',
'font-size-h3-mobile-lg': '1.125rem',
'font-size-h4-mobile': '1rem',
'font-size-h4-mobile-sm': '1rem',
'font-size-h4-mobile-lg': '1rem',
'font-size-blockquote': '1rem',
'font-size-blockquote-sm': '0.875rem',
'font-size-blockquote-lg': '1rem',
'line-height': '1.5rem',
'line-height-sm': '1.25rem',
'line-height-lg': '1.5rem',
'line-height-small': '1.25rem',
'line-height-small-sm': '1.125rem',
'line-height-small-lg': '1.25rem',
'line-height-headings': '1.2rem',
'line-height-headings-sm': '1.2rem',
'line-height-headings-lg': '1.2rem',
'line-height-blockquote': '1.5rem',
'line-height-blockquote-sm': '1.25rem',
'line-height-blockquote-lg': '1.5rem',
'letter-spacing': '0px',
'letter-spacing-sm': '0px',
'letter-spacing-lg': '0px',
'letter-spacing-small': '0px',
'letter-spacing-small-sm': '0px',
'letter-spacing-small-lg': '0px',
'letter-spacing-headings': '0px',
'letter-spacing-headings-sm': '0px',
'letter-spacing-headings-lg': '0px',
'letter-spacing-blockquote': '0px',
'letter-spacing-blockquote-sm': '0px',
'letter-spacing-blockquote-lg': '0px',
gutter: '1rem',
'gutter-sm': '0.5rem',
'gutter-lg': '1rem',
'min-height-input': '3rem',
'min-height-input-sm': '2.125rem',
'min-height-input-lg': '3.5rem',
'py-input': '0.75rem',
'py-input-sm': '0.375rem',
'py-input-lg': '1rem',
'px-input': '1rem',
'px-input-sm': '0.625rem',
'px-input-lg': '1rem',
'py-btn': '0.375rem',
'py-btn-sm': '0.5rem',
'py-btn-lg': '0.5rem',
'px-btn': '1rem',
'px-btn-sm': '1rem',
'px-btn-lg': '1rem',
'py-btn-small': '0.28125rem',
'py-btn-small-sm': '0.375rem',
'py-btn-small-lg': '0.375rem',
'px-btn-small': '0.75rem',
'px-btn-small-sm': '0.75rem',
'px-btn-small-lg': '0.75rem',
'py-group-tabs': '0.75rem',
'py-group-tabs-sm': '0.375rem',
'py-group-tabs-lg': '1rem',
'px-group-tabs': '1rem',
'px-group-tabs-sm': '0.625rem',
'px-group-tabs-lg': '1rem',
'py-group-blocks': '1rem',
'py-group-blocks-sm': '0.75rem',
'py-group-blocks-lg': '1.25rem',
'px-group-blocks': '1.25rem',
'px-group-blocks-sm': '1rem',
'px-group-blocks-lg': '1.5rem',
'py-tag': '0.1875rem',
'py-tag-sm': '0.125rem',
'py-tag-lg': '0.1875rem',
'px-tag': '0.675rem',
'px-tag-sm': '0.5rem',
'px-tag-lg': '0.75rem',
'py-slider-tooltip': '0.25rem',
'py-slider-tooltip-sm': '0.1875rem',
'py-slider-tooltip-lg': '0.3125rem',
'px-slider-tooltip': '0.5rem',
'px-slider-tooltip-sm': '0.375rem',
'px-slider-tooltip-lg': '0.625rem',
'py-blockquote': '0.25rem',
'py-blockquote-sm': '0.25rem',
'py-blockquote-lg': '0.25rem',
'px-blockquote': '0.75rem',
'px-blockquote-sm': '0.75rem',
'px-blockquote-lg': '0.75rem',
'py-hr': '0.25rem',
'space-addon': '0px',
'space-addon-sm': '0px',
'space-addon-lg': '0px',
'space-checkbox': '0.5rem',
'space-checkbox-sm': '0.5rem',
'space-checkbox-lg': '0.625rem',
'space-tags': '0.1875rem',
'space-tags-sm': '0.1875rem',
'space-tags-lg': '0.1875rem',
'space-static-tag-1': '1rem',
'space-static-tag-2': '2rem',
'space-static-tag-3': '3rem',
'floating-top': '0.75rem',
'floating-top-sm': '0rem',
'floating-top-lg': '0.875rem',
'bg-input': 'var(--vf-gray-100)',
'bg-input-hover': '#ececec',
'bg-input-focus': '#dcdcdc',
'bg-input-danger': 'var(--vf-gray-100)',
'bg-input-success': 'var(--vf-gray-100)',
'bg-checkbox': 'var(--vf-gray-100)',
'bg-checkbox-hover': '#ececec',
'bg-checkbox-focus': '#dcdcdc',
'bg-checkbox-danger': 'var(--vf-gray-100)',
'bg-checkbox-success': 'var(--vf-gray-100)',
'bg-disabled': 'var(--vf-gray-50)',
'bg-selected': '#1118270d',
'bg-passive': 'var(--vf-gray-300)',
'bg-icon': 'var(--vf-gray-700)',
'bg-danger': 'var(--vf-danger-lighter)',
'bg-success': 'var(--vf-success-lighter)',
'bg-tag': 'var(--vf-primary)',
'bg-slider-handle': 'var(--vf-primary)',
'bg-toggle-handle': '#ffffff',
'bg-date-head': 'var(--vf-gray-100)',
'bg-addon': 'transparent',
'bg-btn': 'var(--vf-primary)',
'bg-btn-danger': 'var(--vf-danger)',
'bg-btn-secondary': 'var(--vf-gray-200)',
'bg-table-header': 'var(--vf-gray-300)',
'color-input': 'var(--vf-gray-900)',
'color-input-focus': 'var(--vf-gray-900)',
'color-input-hover': 'var(--vf-gray-900)',
'color-input-danger': 'var(--vf-gray-900)',
'color-input-success': 'var(--vf-gray-900)',
'color-disabled': '#afafaf',
'color-placeholder': '#00000099',
'color-passive': 'var(--vf-gray-700)',
'color-muted': '#00000099',
'color-floating': '#00000099',
'color-floating-focus': 'var(--vf-primary)',
'color-floating-success': 'var(--vf-success)',
'color-floating-danger': 'var(--vf-danger)',
'color-danger': 'var(--vf-danger)',
'color-success': 'var(--vf-success)',
'color-tag': 'var(--vf-color-on-primary)',
'color-addon': 'inherit',
'color-date-head': 'var(--vf-gray-700)',
'color-btn': 'var(--vf-color-on-primary)',
'color-btn-danger': '#ffffff',
'color-btn-secondary': 'var(--vf-gray-700)',
'color-table-header': 'var(--vf-gray-900)',
'border-color-input': 'var(--vf-gray-600)',
'border-color-input-focus': 'var(--vf-primary)',
'border-color-input-hover': 'var(--vf-gray-600)',
'border-color-input-danger': 'var(--vf-danger)',
'border-color-input-success': 'var(--vf-gray-600)',
'border-color-checkbox': 'var(--vf-gray-600)',
'border-color-checkbox-focus': 'var(--vf-primary)',
'border-color-checkbox-hover': 'var(--vf-gray-600)',
'border-color-checkbox-danger': 'var(--vf-danger)',
'border-color-checkbox-success': 'var(--vf-gray-600)',
'border-color-checked': 'var(--vf-primary)',
'border-color-passive': 'var(--vf-gray-300)',
'border-color-slider-tooltip': 'var(--vf-primary)',
'border-color-tag': 'var(--vf-primary)',
'border-color-btn': 'var(--vf-primary)',
'border-color-btn-danger': 'var(--vf-danger)',
'border-color-btn-secondary': 'var(--vf-gray-200)',
'border-color-blockquote': 'var(--vf-gray-300)',
'border-color-hr': 'var(--vf-gray-400)',
'border-color-signature-hr': 'var(--vf-gray-400)',
'border-color-table': 'var(--vf-gray-300)',
'border-width-input-t': '0px',
'border-width-input-r': '0px',
'border-width-input-b': '1px',
'border-width-input-l': '0px',
'border-width-radio-t': '2px',
'border-width-radio-r': '2px',
'border-width-radio-b': '2px',
'border-width-radio-l': '2px',
'border-width-checkbox-t': '2px',
'border-width-checkbox-r': '2px',
'border-width-checkbox-b': '2px',
'border-width-checkbox-l': '2px',
'border-width-dropdown': '0px',
'border-width-toggle': '0.25rem',
'border-width-btn': '1px',
'border-width-tag': '1px',
'border-width-blockquote': '3px',
'border-width-table': '1px',
'shadow-input': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-input-hover': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-input-focus': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-handles': '0px 0px 0px 0px rgba(0,0,0,0)',
'shadow-handles-hover': '0px 0px 0px 9px rgba(0,0,0,0.15)',
'shadow-handles-focus': '0px 0px 0px 9px rgba(0,0,0,0.15)',
'shadow-btn': '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',
'shadow-dropdown': '0 4px 6px 0 rgb(32 33 36 / 28%)',
'radius-input': '0.25rem 0.25rem 0rem 0rem',
'radius-input-sm': '0.25rem 0.25rem 0rem 0rem',
'radius-input-lg': '0.25rem 0.25rem 0rem 0rem',
'radius-btn': '0.25rem',
'radius-btn-sm': '0.25rem',
'radius-btn-lg': '0.25rem',
'radius-small': '0.125rem',
'radius-small-sm': '0.125rem',
'radius-small-lg': '0.125rem',
'radius-large': '0.5rem 0.5rem 0rem 0rem',
'radius-large-sm': '0.5rem 0.5rem 0rem 0rem',
'radius-large-lg': '0.5rem 0.5rem 0rem 0rem',
'radius-tag': '999px',
'radius-tag-sm': '999px',
'radius-tag-lg': '999px',
'radius-checkbox': '0.25rem',
'radius-checkbox-sm': '0.25rem',
'radius-checkbox-lg': '0.25rem',
'radius-slider': '1rem',
'radius-slider-sm': '1rem',
'radius-slider-lg': '1rem',
'radius-image': '0.25rem 0.25rem 0rem 0rem',
'radius-image-sm': '0.25rem 0.25rem 0rem 0rem',
'radius-image-lg': '0.25rem 0.25rem 0rem 0rem',
'radius-gallery': '0.25rem 0.25rem 0rem 0rem',
'radius-gallery-sm': '0.25rem 0.25rem 0rem 0rem',
'radius-gallery-lg': '0.25rem 0.25rem 0rem 0rem',
'checkbox-size': '1rem',
'checkbox-size-sm': '0.9375rem',
'checkbox-size-lg': '1.125rem',
'gallery-size': '6rem',
'gallery-size-sm': '5rem',
'gallery-size-lg': '7rem',
'toggle-width': '3rem',
'toggle-width-sm': '2.75rem',
'toggle-width-lg': '3rem',
'toggle-height': '1rem',
'toggle-height-sm': '1.125rem',
'toggle-height-lg': '1.25rem',
'slider-height': '0.375rem',
'slider-height-sm': '0.3125rem',
'slider-height-lg': '0.4375rem',
'slider-height-vertical': '20rem',
'slider-height-vertical-sm': '20rem',
'slider-height-vertical-lg': '20rem',
'slider-handle-size': '1.25rem',
'slider-handle-size-sm': '1.25rem',
'slider-handle-size-lg': '1.4375rem',
'slider-tooltip-distance': '0.625rem',
'slider-tooltip-distance-sm': '0.625rem',
'slider-tooltip-distance-lg': '0.625rem',
'slider-tooltip-arrow-size': '0.375rem',
'slider-tooltip-arrow-size-sm': '0.375rem',
'slider-tooltip-arrow-size-lg': '0.375rem',
},
},
],
},
]
})
This will add the 3 default themes under the Official themes group. The label
of the group can be a tag that comes from builder locale, however, the theme label
must be uniform.
The default themes are also available as the themes
export of @vueform/builder
:
// builder.config.js
import { defineConfig, themes } from '@vueform/builder'
export default defineConfig({
// This sets the default themes, so esentially does nothing
themes,
})
Customizing Config Fields
The sections
and separators
export of @vueform/builder
have a theme
property that—just like in the case of different element types—contains the config panel sections
and separators
of the Theme panel.
We can override them via the theme
property in builder.config.js
:
// builder.config.js
import { defineConfig, sections, separators } from '@vueform/builder'
// Nothing will change in this case
export default defineConfig({
theme: {
sections: sections.theme,
separators: separators.theme,
}
})
The sections
are structured the same way as for element types. The same is true for separators
.
Theme Field's Structure
Each field in Vueform Builder's theme panel is assigned to a CSS variable provided by Vueform.
For example, this is how the Primary color (stored in the --vf-primary
CSS variable) is available for editing:
import { ThemeColorField } from '@vueform/builder'
const theme = {
sections: {
// ...
colors: {
name: 'colors',
label: 'section_colors',
fields: {
'primary': { type: ThemeColorField, name: 'primary', label: 'colors_primary_label', },
'primary-darker': { /* ... */ },
'color-on-primary': { /* ... */ },
}
// ...
},
///...
},
// ...
}
The type
defines the config field to be used, the name
is the property name of the theme variable, and the label
is a localized tag that is present in builder locale.
When the theme panel's Primary field is edited, its value is stored in the Builder Object's theme
property under the primary
key, which can later be used to set the --vf-primary
CSS variable as described in the Rendering chapter.
We can use this knowledge to add, remove, or replace fields in the Theme panel.
Before proceeding, it's recommended to read through the Custom Config Panels chapter to learn about how config panels work in general and how to add, remove, or replace configuration fields.
Overriding Theme Fields
Let's say we don't want the primary
color field to be a freely picked color, but we'd rather have users choose from 2 options: Red and Blue.
We can create a new field that picks from Red and Blue and override the related theme field via theme.sections
in builder.config.js
:
// builder.config.js
import {
defineConfig,
sections,
BaseThemeField
} from '@vueform/builder'
// Creating the color selector field
const ThemePrimaryField = class extends BaseThemeField {
name = 'ThemePrimaryField'
get schema () {
return {
[this.fieldName]: {
type: 'select',
label: this.options.label,
info: this.options.info,
items: ['Red', 'Blue']
}
}
}
}
// Overriding the field type for primary color
sections.theme.colors.fields.primary.type = ThemePrimaryField
export default defineConfig({
theme: {
sections,
}
})
Theme fields need to be extended from the BaseThemeField
export of @vueform/builder
and they usually start with the Theme
field name prefix.
Note that now the Primary color selector can only have either Blue or Red values, so we need to change the default theme's primary
value to either Red or Blue. Otherwise, it would try to load #07bf9b
, which isn't an available value:
// builder.config.js
import {
defineConfig,
sections,
BaseThemeField,
themes
} from '@vueform/builder'
themes[0].themes[0].vars.primary = 'Blue'
const ThemePrimaryField = class extends BaseThemeField {
name = 'ThemePrimaryField'
get schema () {
return {
[this.fieldName]: {
type: 'select',
label: this.options.label,
info: this.options.info,
items: ['Red', 'Blue']
}
}
}
}
sections.theme.colors.fields.primary.type = ThemePrimaryField
export default defineConfig({
themes,
theme: {
sections,
}
})
Adding New Theme Fields
We can add config fields to the Theme panel by extending the sections
and separators
.
For example, let's add a new font-family
field to the beginning of the fonts
section:
// builder.config.js
import { defineConfig, sections, separators, BaseThemeField } from '@vueform/builder'
// Creating the font-family field
const ThemeFontFamilyField = class extends BaseThemeField {
name = 'ThemeFontFamilyField'
get schema() {
return {
'font-family': {
type: 'select',
columns: { label: 6 },
search: true,
canClear: false,
canDeselect: false,
label: 'Font family',
items: ['Roboto', 'Open Sans', 'Montserrat'],
default: 'Roboto',
},
};
}
}
// Adding the font-family field to the `fonts` section
sections.theme.fonts.fields = {
'font-family': {
type: ThemeFontFamilyField,
name: 'font-family',
label: 'Font family' // This could also be a localized tag
},
...sections.theme.fonts.fields
}
// Adding a new separator under the `font-family`
separators.theme.fonts = [
['font-family'],
...separators.theme.fonts,
]
export default defineConfig({
theme: {
sections: sections.theme,
separators: separators.theme,
}
})
The next step is to ensure our new font-family
variable is used for our form preview:
<!-- Root component where the <VueformBuilder> is used (eg. App.vue) -->
<template>
<VueformBuilder ref="builder$" />
</template>
<script setup>
import { computed, ref } from 'vue'
const builder$ = ref(null)
const fontFamily = computed(() => {
return builder$.value?.builder.theme['font-family'] || 'Roboto';
})
</script>
<style lang="scss">
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400&display=swap');
.vfb-preview-form {
font-family: v-bind('fontFamily');
}
</style>
Finally, we need to ensure the --vf-font-family
is used to define the font-family
for our rendered forms:
// In any CSS definition
form {
font-family: var(--vf-font-family, 'Arial');
}
Now, when you load the theme variables into the renderer, the --vf-font-family
will also have a value, which in turn fills in the variable for the font-family
of any <form>
.
Available Theme Fields
The following theme-related fields are exported from @vueform/builder
that you can reuse to create custom fields:
Field | Used by (example) | Description |
---|---|---|
ThemeBorderField | Input / Border width | Pixel input that can be broken down to Top, Right, Bottom, and Left, or set as 'All equal'. The related variable must have 4 versions ending with -t , -r , -b , and -l . |
ThemeColorField | Colors / Primary | Color picker. |
ThemeColorSelectorField | Input / Border color | A select input that lists all available colors and allows for a custom value. |
ThemeRadiusField | Input / Radius | Pixel input with size selector that can be broken down to Top-left, Top-right, Bottom-right, and Bottom-left, or set as 'All equal'. |
ThemeSelectField | General / Link decoration | Select input. Select options can be provided by adding items to the field definition object. |
ThemeShadowField | General / Handle shadow | Text input with 0px 0px 0px 0px rgba(0,0,0,0) placeholder. |
ThemeSingleSizeField | General / Ring width | Pixel input without size selector. |
ThemeSizeField | Fonts / Font size | Pixel input with size selector. |
ThemeThemeField | Theme | The theme loader field. |
ThemeToolsField | Theme | The size selector tabs. |