v1.0

Plugin Library

Extend QuikForms with ready-to-use plugins. Each plugin is packaged for easy installation and covers different aspects of the plugin framework including JavaScript hooks, custom field types, Apex validators, submission handlers, and callout handlers.

Ctrl+K

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
Installation: Each plugin is packaged as a zip file. Extract the contents and copy the 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

JS Hooks

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 Plugin

Features

  • 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
Tip: When using Input Masking alongside Smart Validation, set the Input Masking plugin's 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

JS Field Type

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 Plugin

Features

  • 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-color from 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
}
Field Type Registration: The Range Slider registers as a custom field type named 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

JS Apex Hooks Validator

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 Plugin

Features

  • 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: Fatal — When the Smart Validation plugin detects a validation error (client-side or server-side), it blocks form submission. The 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

Apex Submission Handler

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 Plugin

Features

  • 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 onBeforeSubmit phase, ensuring data is clean before the record is created
  • Post-submission actions — Task creation runs in onAfterSubmit so it has access to the new record ID for the WhatId relationship

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
  }
}
Error Behavior: Warn — The Submission Enrichment plugin uses 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

JS Apex Hooks Callout

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 Plugin

How It Works

External Verification follows a three-step flow:

  1. 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.
  2. 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.
  3. 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"
      }
    ]
  }
}
Named Credential Pattern: Use the 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)
Error Behavior: Skippable — The External Verification plugin uses 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

JS Hooks

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 Plugin

Features

  • 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
Tip: For multi-page forms, the Progress Indicator automatically adjusts its count when navigating between pages. It only tracks required fields on the currently visible page, so the progress reflects what the user can see and interact with.

Confirmation Step

Confirmation Step Plugin

JS Hooks

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 Plugin

Features

  • 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

  1. User clicks the Submit button
  2. The onValidate hook intercepts the submission and runs all other plugin validations first
  3. If validation passes, the plugin builds a summary of all field values and displays it in a modal overlay
  4. The user reviews their entries. Each section has an "Edit" link to return to the form
  5. Two buttons are displayed: Go Back (closes modal, returns to form) and Confirm & Submit

Phase 2: Submit

  1. User clicks "Confirm & Submit"
  2. The plugin sets an internal flag to bypass the confirmation on the next submission cycle
  3. The form submission proceeds normally through the remaining plugin hooks and Apex handlers
  4. 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: Set the Confirmation Step plugin's 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.