Veldform / Docs · WordPress plugin
Customization
Veldform is built to be styled. All plugin CSS lives in a CSS layer (@layer veldform), which means any rule you write in your theme wins, no specificity wars, no !important.
- Design tokens
- theme.json
- Classes
- Template overriding
- Markup filters
- Disabling the plugin CSS
- Email template
Design tokens
The quickest way to restyle your forms is overriding the design tokens. They are scoped to .vf-form:
| Token | Default | Controls |
|---|---|---|
--vf-color-accent |
#2271b1 |
Buttons, focus rings, active step |
--vf-color-error |
#d63638 |
Validation messages, required asterisk |
--vf-color-border |
#8c8f94 |
Input and fieldset borders |
--vf-color-text |
currentColor |
Form text |
--vf-space |
1rem |
Vertical rhythm and grid gap |
--vf-field-radius |
4px |
Input and button corner radius |
--vf-control-pad |
0.5rem 0.6rem |
Input padding |
--vf-max-width |
40rem |
Form max width |
For example:
.vf-form {
--vf-color-accent: var(--wp--preset--color--primary);
--vf-field-radius: 0;
}
theme.json
If you're building a block theme, you can set the tokens from theme.json under settings.custom.veldform. The keys map to the token names without the --vf- prefix:
{
"settings": {
"custom": {
"veldform": {
"accent": "#0a4b78",
"radius": "0px",
"max-width": "48rem"
}
}
}
}
Classes
The rendered markup uses one shallow class per element, and the class names are a stable API, safe to target from your theme. The main ones:
.vf-form, the form element.vf-row, a row (12-column grid).vf-fieldand.vf-field--{type}, a field wrapper, e.g..vf-field--email.vf-label,.vf-required,.vf-help,.vf-field-error.vf-input,.vf-textarea,.vf-select,.vf-file.vf-group/.vf-legend, radio and checkbox fieldsets.vf-submit,.vf-prev,.vf-next, buttons.vf-errors, the error summary,.vf-success, the confirmation.vf-steps, the progress indicator on multi-step forms
Every field wrapper also carries data-vf-field="f_yourfield", so you can target one specific field:
.vf-form [data-vf-field="f_message"] .vf-textarea {
min-height: 200px;
}
Template overriding
If CSS isn't enough, your theme can take over the markup of any field type. Veldform looks for templates in your (child) theme:
your-theme/
└── veldform/
└── fields/
├── text.php <- overrides the text control
├── select.php <- overrides selects
└── default.php <- fallback for every other type
The override replaces the control element only, the wrapper, label, help text and error message still come from the plugin, so accessibility keeps working. Inside the template you have $field (the field settings), $value and $ctx. Make sure you keep using $ctx['id'] and $ctx['name']:
<input type="text"
id="<?php echo esc_attr( $ctx['id'] ); ?>"
name="<?php echo esc_attr( $ctx['name'] ); ?>"
class="my-input"
value="<?php echo esc_attr( $value ); ?>"
<?php echo $ctx['required'] ? 'required' : ''; ?> />
Markup filters
For surgical changes without copying a template, there are three filters: veldform/render/control (the bare control), veldform/render/field (the complete field block) and veldform/form/wrapper (the whole form). See Action and filter hooks.
Disabling the plugin CSS
Want to style everything yourself, from scratch? Stop the stylesheet from loading:
add_filter( 'veldform/render/styles', '__return_false' );
The filter also receives the form ID, so you can disable it for specific forms only.
Email template
Notification emails are wrapped in a minimal HTML template (logo, body, footer). You can:
- Turn it off globally under
Veldform->Settings - Override it from your theme with
your-theme/veldform/email.php(receives$content,$logo,$footerand$context) - Adjust parts of it with the
veldform/email/logo,veldform/email/footerandveldform/email/htmlfilters