Plugin Library
The QuikForms Plugin Library provides a collection of ready-to-use plugins that extend your forms with advanced functionality. Each plugin is built on the QuikForms Plugin Framework and demonstrates different aspects of the architecture including JavaScript lifecycle hooks, custom field types, Apex validators, submission handlers, and callout handlers.
The table below summarizes which framework features each plugin uses:
| Plugin | JS Hooks | Custom Field Type | Apex Validator | Apex Submission Handler | Apex Callout Handler | Error Behavior |
|---|---|---|---|---|---|---|
| Input Masking | Yes | — | — | — | — | — |
| Range Slider | — | Yes | — | — | — | — |
| Smart Validation | Yes | — | Yes | — | — | Fatal |
| Submission Enrichment | — | — | — | Yes | — | Warn |
| External Verification | Yes | — | — | — | Yes | Skippable |
| Progress Indicator | Yes | — | — | — | — | — |
| Confirmation Step | Yes | — | — | — | — | — |
classes/, staticresources/, and customMetadata/ directories into your Salesforce project's src/ directory. Then deploy using sf project deploy start. Refer to the Plugin Framework Overview for details on how plugins are registered and configured.
Input Masking
Input Masking Plugin
Applies format masks to text fields as users type. Supports phone numbers, SSN, EIN, credit cards, postal codes, dates, and fully custom patterns. Formatting is stripped before data is sent to Salesforce, ensuring clean storage while providing a polished user experience.
Download PluginFeatures
- Real-time formatting — Characters are masked as the user types, providing instant visual feedback
- Invalid character prevention — Prevents entry of characters that do not match the mask position (e.g., letters in a phone number slot)
- Paste handling — Pasted values are stripped of formatting and re-applied through the mask engine
- Completeness validation — On submit, verifies that every mask position has been filled
- Clean data storage — Formatting characters are stripped before the value is sent to Salesforce
- Predefined masks — Ships with 12 common masks for US phone, SSN, EIN, credit card, postal codes, dates, currency, and percentage
- Custom patterns — Define your own mask patterns using
#,A,*placeholders and literal characters
Predefined Masks
The following predefined masks are available out of the box. Use the Name value in your configuration to reference them.
| Name | Pattern | Example Output |
|---|---|---|
us-phone |
(###) ###-#### |
(555) 123-4567 |
ssn |
###-##-#### |
123-45-6789 |
ein |
##-####### |
12-3456789 |
credit-card |
#### #### #### #### |
4111 1111 1111 1111 |
us-zip |
##### |
90210 |
us-zip-plus4 |
#####-#### |
90210-1234 |
ca-postal |
A#A #A# |
K1A 0B1 |
date |
##/##/#### |
12/31/2025 |
date-iso |
####-##-## |
2025-12-31 |
time |
##:## |
14:30 |
currency-us |
$#,###.## |
$1,234.56 |
percentage |
###.##% |
99.50% |
Custom Mask Syntax
You can define your own masks using these placeholder characters:
| Character | Matches |
|---|---|
# |
Any digit (0–9) |
A |
Any letter (a–z, A–Z) |
* |
Any alphanumeric character |
| Any other character | Literal — auto-inserted as the user types |
Configuration
Configure input masking through the Plugin_Configuration__c JSON field on each FormField record, or use data-mask attributes directly on the field element.
JSON Configuration (Plugin_Configuration__c)
{
"inputMasking": {
"fields": {
"Phone__c": {
"mask": "us-phone",
"placeholder": "(___) ___-____"
},
"SSN__c": {
"mask": "ssn",
"placeholder": "___-__-____"
},
"LicensePlate__c": {
"mask": "AAA-####",
"placeholder": "___-____"
}
}
}
}
Data Attribute Usage
Alternatively, configure masks directly on fields using data-mask attributes. The plugin reads these at form load time.
<!-- Predefined mask --> <input type="text" data-mask="us-phone" data-mask-placeholder="(___) ___-____" /> <!-- Custom mask --> <input type="text" data-mask="AA-####-**" data-mask-placeholder="__-____-__" />
Public API
The Input Masking plugin exposes a public API on the QuikFormsInputMasking global object for programmatic access:
// Apply a mask to a raw value
QuikFormsInputMasking.applyMask('5551234567', 'us-phone');
// Returns: "(555) 123-4567"
// Strip mask formatting from a value
QuikFormsInputMasking.stripMask('(555) 123-4567', 'us-phone');
// Returns: "5551234567"
// Check if a masked value is complete (all positions filled)
QuikFormsInputMasking.isMaskComplete('(555) 123-____', 'us-phone');
// Returns: false
// Resolve a mask name to its pattern string
QuikFormsInputMasking.resolveMask('ssn');
// Returns: "###-##-####"
// Programmatically attach a mask to an input element
var input = document.getElementById('my-field');
QuikFormsInputMasking.attachMask(input, 'us-phone');
// Remove a mask from an input element
QuikFormsInputMasking.detachMask(input);
Lifecycle Hooks
The Input Masking plugin registers the following hooks with the QuikForms plugin framework:
| Hook | What It Does |
|---|---|
onFormLoad |
Reads the plugin configuration, attaches input/keydown/paste listeners to configured fields, and sets placeholder text |
onFieldChange |
Re-applies the mask when a field value is changed programmatically (e.g., by another plugin or dependency rule) |
onFieldBlur |
Finalizes formatting and trims any trailing literal characters left by partial input |
onValidate |
Checks that all mask positions are filled; returns stripped (unformatted) values for submission |
Execution_Order__c to a lower number so masks are applied before validation runs. This ensures the validator receives clean, unformatted values.
Range Slider
Range Slider Plugin
Renders an interactive range slider with a floating value bubble, configurable bounds, optional tick marks, and full theme integration. Registers as a custom field type so it appears in the QuikForms field type picker and stores its value as a standard number.
Download PluginFeatures
- Configurable bounds — Set min, max, step, and unit label for any numeric range
- Floating value bubble — A tooltip follows the slider thumb, showing the current value and unit
- Optional tick marks — Display reference marks at configurable intervals along the track
- Color-fill track — The filled portion of the track uses
--qf-highlight-colorfrom your form's theme - Touch-friendly — Full touch support with appropriate ARIA attributes for screen readers
- Theme integration — Inherits QuikForms CSS variables for colors, border radius, and font sizing
Configuration
Configure the Range Slider through the Plugin_Configuration__c JSON field on the FormField record. The following properties are available:
| Property | Type | Default | Description |
|---|---|---|---|
min |
number | 0 | Minimum slider value |
max |
number | 100 | Maximum slider value |
step |
number | 1 | Step increment between values |
unit |
string | "" |
Unit label displayed in the value bubble (e.g., "%", "pts", "$") |
defaultValue |
number | 50 | Initial value when the form loads |
showTicks |
boolean | false | Whether to display tick marks along the track |
tickInterval |
number | 10 | Interval between tick marks (only applies when showTicks is true) |
Examples
NPS Score (0–10)
{
"min": 0,
"max": 10,
"step": 1,
"unit": "pts",
"defaultValue": 5,
"showTicks": true,
"tickInterval": 1
}
Budget Selector ($0–$100,000)
{
"min": 0,
"max": 100000,
"step": 5000,
"unit": "$",
"defaultValue": 25000,
"showTicks": true,
"tickInterval": 25000
}
Priority Level (1–5)
{
"min": 1,
"max": 5,
"step": 1,
"unit": "",
"defaultValue": 3,
"showTicks": true,
"tickInterval": 1
}
Satisfaction Percentage (0–100%)
{
"min": 0,
"max": 100,
"step": 5,
"unit": "%",
"defaultValue": 50,
"showTicks": true,
"tickInterval": 25
}
range-slider. After deploying the plugin, it will appear in the QuikForms field type picker under the plugin category. Set a field's Plugin_Field_Type__c to range-slider to use it.
Smart Validation
Smart Validation Plugin
Hybrid validation engine combining real-time client-side UX with server-side enforcement. Provides email typo detection, phone validation, character counters, cross-field rules, and custom regex enforcement through the Apex IQuikFormsFieldValidator interface.
Download PluginFeatures
- Email typo detection — Catches common domain misspellings (e.g.,
gmial.com→ "Did you mean gmail.com?") with clickable correction - Phone validation — Validates that phone numbers contain at least 10 digits after stripping formatting
- Character counters — Displays live character counts on text areas with color-coded warnings as limits approach
- Inline error display — Validation errors appear directly beneath the field with smooth slide-in animations
- Cross-field rules — Enforce relationships between fields: matching values, date ordering, and conditional requirements
- Server-side regex enforcement — The Apex validator applies custom regex patterns that cannot be bypassed by the client
Cross-Field Rules
Cross-field rules enforce relationships between multiple form fields. Configure them in the crossFieldRules array:
{
"smartValidation": {
"crossFieldRules": [
{
"type": "match",
"fields": ["Email__c", "ConfirmEmail__c"],
"message": "Email addresses must match"
},
{
"type": "dateAfter",
"fields": ["StartDate__c", "EndDate__c"],
"message": "End date must be after start date"
},
{
"type": "requiredIf",
"field": "CompanyName__c",
"condition": {
"field": "AccountType__c",
"operator": "equals",
"value": "Business"
},
"message": "Company name is required for business accounts"
}
]
}
}
Rule Types
| Type | Description |
|---|---|
match |
All fields listed in the fields array must have the same value. Commonly used for email or password confirmation. |
dateAfter |
The second field's date value must be after the first field's date value. Both fields must be date or datetime type. |
requiredIf |
The target field becomes required when the condition evaluates to true. Supports equals, notEquals, contains, and isNotEmpty operators. |
Character Limits
Configure character limit warnings for text area fields:
{
"smartValidation": {
"characterLimits": {
"Description__c": {
"max": 500,
"warnAt": 400,
"showCounter": true
},
"Notes__c": {
"max": 1000,
"warnAt": 800,
"showCounter": true
}
}
}
}
The counter text changes color based on proximity to the limit: default color up to the warnAt threshold, amber between warnAt and max, and red when the limit is exceeded.
Server-Side Validation
The Apex component of Smart Validation implements IQuikFormsFieldValidator with SYNC_ONLY validation mode. This means all regex rules are enforced server-side during form submission and cannot be bypassed by disabling JavaScript.
Custom Regex Rules
Define custom regex patterns in the Apex plugin configuration:
{
"serverValidation": {
"regexRules": [
{
"field": "ZipCode__c",
"pattern": "^\\d{5}(-\\d{4})?$",
"message": "Please enter a valid US zip code (e.g., 90210 or 90210-1234)"
},
{
"field": "EmployeeId__c",
"pattern": "^EMP-\\d{6}$",
"message": "Employee ID must be in the format EMP-000000"
},
{
"field": "Website__c",
"pattern": "^https?://[\\w.-]+\\.[a-zA-Z]{2,}(/.*)?$",
"message": "Please enter a valid URL starting with http:// or https://"
}
]
}
}
Error_Behavior__c is set to Fatal, which means validation failures will prevent the form from being submitted until all errors are resolved.
Lifecycle Hooks
| Hook | What It Does |
|---|---|
onFormLoad |
Parses configuration, attaches character counters, and initializes the cross-field rule engine |
onFieldChange |
Runs real-time validation: email typo detection, phone digit counting, character limit checks, and cross-field rule evaluation |
onFieldBlur |
Performs final field-level validation and displays inline error messages |
onValidate |
Runs all rules and returns a consolidated error list; the Apex validator then enforces server-side regex patterns |
Submission Enrichment
Submission Enrichment Plugin
Auto-populates fields before record creation and performs post-submission actions. Stamps metadata (timestamp, user agent, IP, referrer), applies case transformations to text fields, and optionally creates follow-up Tasks linked to the submitted record.
Download PluginFeatures
- Metadata stamping — Automatically populates fields with the submission timestamp, browser user agent string, submitter IP address, and HTTP referrer URL
- Case transformations — Converts field values to uppercase, lowercase, or titlecase before record insertion
- Follow-up Task creation — Creates a Salesforce Task linked to the newly created record with configurable subject, description, and due date
- Pre-submission enrichment — All metadata stamping and case transforms run in the
onBeforeSubmitphase, ensuring data is clean before the record is created - Post-submission actions — Task creation runs in
onAfterSubmitso it has access to the new record ID for theWhatIdrelationship
Configuration
| Key | Type | Description |
|---|---|---|
timestampField |
String | API name of the field to stamp with the submission date/time (ISO 8601 format) |
userAgentField |
String | API name of the field to populate with the browser's user agent string |
ipAddressField |
String | API name of the field to populate with the submitter's IP address |
referrerField |
String | API name of the field to populate with the HTTP referrer URL |
caseTransformFields |
Map<String, String> | Object mapping field API names to transform types: "uppercase", "lowercase", or "titlecase" |
createFollowUpTask |
Boolean | Whether to create a follow-up Task after successful submission |
taskSubject |
String | Subject line for the follow-up Task |
taskDaysUntilDue |
Integer | Number of days from submission until the Task is due |
Full Configuration Example
{
"submissionEnrichment": {
"timestampField": "Submitted_At__c",
"userAgentField": "Browser_Info__c",
"ipAddressField": "Submitter_IP__c",
"referrerField": "Referrer_URL__c",
"caseTransformFields": {
"FirstName": "titlecase",
"LastName": "titlecase",
"Company": "titlecase",
"State__c": "uppercase"
},
"createFollowUpTask": true,
"taskSubject": "Review new form submission",
"taskDaysUntilDue": 3
}
}
Metadata Stamping Only
{
"submissionEnrichment": {
"timestampField": "Submitted_At__c",
"userAgentField": "Browser_Info__c",
"ipAddressField": "Submitter_IP__c",
"referrerField": "Referrer_URL__c"
}
}
Case Transforms Only
{
"submissionEnrichment": {
"caseTransformFields": {
"FirstName": "titlecase",
"LastName": "titlecase",
"Email": "lowercase",
"State__c": "uppercase"
}
}
}
Task Creation Only
{
"submissionEnrichment": {
"createFollowUpTask": true,
"taskSubject": "Follow up on lead submission",
"taskDaysUntilDue": 5
}
}
Warn error behavior. If the plugin encounters an error (e.g., a field API name does not exist), the submission still proceeds but a warning is logged to the QuikForms Exception Dashboard. This ensures that enrichment failures do not block legitimate form submissions.
Lifecycle Hooks
| Hook | What It Does |
|---|---|
onBeforeSubmit |
Stamps metadata fields (timestamp, user agent, IP, referrer) and applies case transformations to field values before the record is created |
onAfterSubmit |
Creates the follow-up Task with WhatId set to the new record ID, using the configured subject and due date |
External Verification
External Verification Plugin
Verifies form field values against external APIs in real time. On field blur, the JavaScript hook triggers an Apex callout that checks the value against an external service (email verification, phone lookup, domain validation, etc.) and displays the result inline.
Download PluginHow It Works
External Verification follows a three-step flow:
- JavaScript trigger (onFieldBlur) — When a configured field loses focus, the JS hook collects the field value and verification type, then calls
QuikFormsPlugins.callServer()to invoke the Apex handler. - Apex callout (executeCallout) — The Apex class makes an HTTP request to the configured external API endpoint (or Named Credential), passing the field value. It parses the response and returns a structured result.
- JavaScript display — The JS hook receives the callout response and displays a verification badge next to the field: a green checkmark for verified, a yellow warning for uncertain, or a red cross for invalid.
Configuration
| Key | Type | Required | Description |
|---|---|---|---|
endpoint |
String | Yes* | Base URL for the verification API. Required unless namedCredential is provided. |
namedCredential |
String | No | Salesforce Named Credential to use instead of a raw endpoint. Overrides endpoint when provided. |
timeoutMs |
Integer | No | HTTP request timeout in milliseconds. Default: 5000. |
verificationTypes |
Object | No | Map of verification type names to API path suffixes. Allows different endpoints per field type. |
fields |
Array | Yes | Array of field configuration objects specifying which fields to verify and what type of verification to apply. |
Full Configuration Example
{
"externalVerification": {
"endpoint": "https://api.verifyservice.com/v1",
"timeoutMs": 3000,
"verificationTypes": {
"email": "/verify/email",
"phone": "/verify/phone",
"domain": "/verify/domain"
},
"fields": [
{
"fieldName": "Email__c",
"verificationType": "email",
"debounceMs": 500
},
{
"fieldName": "Phone__c",
"verificationType": "phone",
"debounceMs": 300
},
{
"fieldName": "Website__c",
"verificationType": "domain",
"debounceMs": 500
}
]
}
}
Using Named Credentials
For production deployments, use a Named Credential instead of a raw endpoint URL. This approach stores authentication tokens securely and allows Salesforce to manage credential rotation.
{
"externalVerification": {
"namedCredential": "callout:VerifyServiceCredential",
"timeoutMs": 5000,
"fields": [
{
"fieldName": "Email__c",
"verificationType": "email",
"path": "/verify/email"
}
]
}
}
callout:YourNamedCredential prefix. The Apex handler will resolve this to the full endpoint URL configured in your Named Credential. Ensure the Guest User profile has access to the External Credential principal.
API Contract
The External Verification plugin expects the external API to return responses in the following format:
Request (sent by Apex)
{
"value": "[email protected]",
"type": "email",
"metadata": {
"formId": "a0B5f00000ABC123",
"fieldName": "Email__c"
}
}
Response (expected from API)
{
"status": "verified",
"confidence": 0.98,
"details": {
"deliverable": true,
"disposable": false,
"freeProvider": true
},
"message": "Email address is valid and deliverable"
}
The status field determines the badge displayed to the user:
| Status Value | Badge | Behavior |
|---|---|---|
"verified" |
Green checkmark | Field is accepted |
"uncertain" |
Yellow warning | Field is accepted with a warning message |
"invalid" |
Red cross | Field is flagged; user may continue (Skippable behavior) |
Skippable error behavior. If the external API is unreachable, times out, or returns an error, the verification is silently skipped and the form submission proceeds. This prevents third-party service outages from blocking legitimate form submissions. Errors are logged to the QuikForms Exception Dashboard for review.
Lifecycle Hooks
| Hook | What It Does |
|---|---|
onFormLoad |
Reads the field configuration and registers debounced blur handlers on each configured field |
onFieldBlur |
Triggers the verification callout for the field, displays a loading spinner, and renders the result badge when the response arrives |
onValidate |
Collects verification results for all configured fields and includes them in the submission payload as metadata |
Progress Indicator
Progress Indicator Plugin
Displays a visual progress indicator showing how many required fields have been completed. Supports bar, dots, and fraction display modes with optional sticky positioning and a celebration animation when the form reaches 100% completion.
Download PluginFeatures
- Three display modes — Choose between a progress bar, completion dots, or a numeric fraction to match your form's design
- Required field tracking — Automatically counts only visible, required fields; skips hidden or optional fields
- Dependency awareness — Respects QuikForms dependency visibility rules; fields hidden by dependency logic are excluded from the count
- Animated transitions — Smooth CSS transitions when the progress value changes
- Optional sticky positioning — Pin the indicator to the top of the form so it remains visible as the user scrolls
- Completion celebration — Optional confetti-style animation when all required fields are filled
Display Modes
Bar Mode
Renders a horizontal progress bar that fills left-to-right as fields are completed:
3 of 8 required fields completed [============-----------------] 37%
Dots Mode
Shows one dot per required field. Filled dots indicate completed fields:
Progress: 3 / 8 [*] [*] [*] [ ] [ ] [ ] [ ] [ ]
Fraction Mode
Displays a simple numeric fraction with no graphical element:
3 / 8 completed
Configuration
| Option | Type | Default | Description |
|---|---|---|---|
mode |
string | "bar" |
Display mode: "bar", "dots", or "fraction" |
sticky |
boolean | false |
Pin the indicator to the top of the form container |
showLabel |
boolean | true |
Show the text label (e.g., "3 of 8 required fields completed") |
celebrateOnComplete |
boolean | false |
Play a short celebration animation when all required fields are filled |
position |
string | "top" |
Placement of the indicator: "top" (above the form) or "bottom" (below the form) |
Configuration Example
{
"progressIndicator": {
"mode": "bar",
"sticky": true,
"showLabel": true,
"celebrateOnComplete": true,
"position": "top"
}
}
CSS Variables
The Progress Indicator inherits the following QuikForms CSS variables for theme consistency:
/* Progress bar fill color */ --qf-highlight-color: #2563eb; /* Progress bar track background */ --qf-input-bg: rgba(30, 35, 55, 0.4); /* Text color for labels */ --qf-text-color: #e2e8f0; /* Border radius for bar corners */ --qf-border-radius: 8px; /* Font size for labels */ --qf-font-size: 0.875rem;
Lifecycle Hooks
| Hook | What It Does |
|---|---|
onFormLoad |
Scans the form for visible required fields, injects the progress indicator element, and calculates the initial completion percentage |
onFieldChange |
Recalculates the completion count and updates the progress display with an animated transition |
onFieldBlur |
Re-evaluates field visibility (in case a dependency rule changed which fields are visible) and updates the total required count |
Confirmation Step
Confirmation Step Plugin
Intercepts form submission to display a read-only review modal before data is sent to Salesforce. Users see a formatted summary of all their entries, confirm the information is correct, then proceed with submission or go back to make changes.
Download PluginFeatures
- Read-only summary — Displays all visible field values in a clean, read-only format organized by form sections
- Smart field filtering — Skips hidden fields, empty optional fields, and internal-only fields automatically
- Rich formatting — Formats checkboxes as Yes/No, renders masked field values in their display format, lists multi-select values as comma-separated text, and shows file upload names
- Accessible modal — Implements a focus trap to keep keyboard navigation within the modal, supports Escape key to close, and includes proper ARIA attributes (
role="dialog",aria-modal="true",aria-labelledby) - Theme integration — Inherits QuikForms CSS variables for a consistent look with the rest of the form
- Edit navigation — Each section in the summary includes an "Edit" link that closes the modal and scrolls the user back to the relevant form section
Two-Phase Flow
The Confirmation Step plugin transforms the submission process into a two-phase flow:
Phase 1: Review
- User clicks the Submit button
- The
onValidatehook intercepts the submission and runs all other plugin validations first - If validation passes, the plugin builds a summary of all field values and displays it in a modal overlay
- The user reviews their entries. Each section has an "Edit" link to return to the form
- Two buttons are displayed: Go Back (closes modal, returns to form) and Confirm & Submit
Phase 2: Submit
- User clicks "Confirm & Submit"
- The plugin sets an internal flag to bypass the confirmation on the next submission cycle
- The form submission proceeds normally through the remaining plugin hooks and Apex handlers
- The modal is closed and the form shows the standard success message
Configuration Example
{
"confirmationStep": {
"title": "Review Your Submission",
"subtitle": "Please review the information below before submitting.",
"confirmButtonText": "Confirm & Submit",
"cancelButtonText": "Go Back",
"showEditLinks": true,
"excludeFields": ["Internal_Notes__c", "Hidden_Tracking__c"]
}
}
CSS Variables
The Confirmation Step modal inherits QuikForms CSS variables:
/* Modal overlay background */ --qf-modal-overlay: rgba(0, 0, 0, 0.6); /* Modal content background */ --qf-card-bg: rgba(30, 35, 55, 0.95); /* Modal border */ --qf-border-color: rgba(255, 255, 255, 0.1); /* Section header color */ --qf-highlight-color: #2563eb; /* Text colors */ --qf-text-color: #e2e8f0; --qf-text-muted: #94a3b8; /* Button styles */ --qf-btn-primary-bg: linear-gradient(135deg, #1e5ba8, #2563eb); --qf-btn-secondary-bg: rgba(255, 255, 255, 0.1);
Lifecycle Hooks
| Hook | What It Does |
|---|---|
onFormLoad |
Pre-builds the modal DOM structure and attaches keyboard event listeners for the Escape key and focus trap |
onValidate |
Intercepts submission after all other validations pass; collects field values, builds the summary view, and displays the confirmation modal. Returns { abort: true } to pause submission until the user confirms. |
Execution_Order__c to a high number (e.g., 99) so it runs after all other validation plugins. This ensures the user sees a confirmation modal only after all field-level and cross-field validations have passed.