Form OS — Capabilities
@jayoncode/form-intelligent is a headless form workflow engine — an operating system for forms. You pick the features you need; the engine centralizes validation, formatting, conditional logic, business rules, autosave, drafts, submission, and integrations while you keep full control of UI.
Previous: Core concepts · Next: Validation
One sentence
Form Intelligent manages everything that happens before, during, and after form submission — not just validation.
Status legend
| Badge | Meaning |
|---|---|
| SHIPPED | Available today |
| PARTIAL | Foundation shipped; polish or integration pending |
| PLANNED | On the roadmap |
Core lifecycle
1. Form state management — SHIPPED
One instance owns values, errors, loading, dirty, and touched state.
const form = createForm({ initialValues: { email: "" } });
form.state.values;
form.state.errors;
form.state.isSubmitting;
form.state.isDirty;2. Validation engine — SHIPPED
Declarative schema — no manual if (!email.includes("@")).
createForm({
schema: { email: { required: true, type: "email" } },
});3. Custom validation — SHIPPED
Encode business rules in the schema or validator list.
username: {
validate(value) {
return value !== "admin" || "Username already taken";
},
}4. Async validation — SHIPPED
Debounced onChange checks, per-field form.state.fieldMeta[path].isValidating for "Checking…" UI.
username: {
async validate(value) {
const exists = await api.exists(value);
return !exists || "Username already exists";
},
}Input transformation
5. Formatting engine — SHIPPED
Presets: philippine-phone, credit-card, plus custom format / parse hooks.
Conditional logic and rules
6. Conditional logic — SHIPPED
Show, hide, require, and enable fields based on other values — no scattered useEffect.
import { createForm, when } from "@jayoncode/form-intelligent";
createForm({
initialValues: { customerType: "Personal", companyName: "" },
rules: [when("customerType").equals("Business").show("companyName")],
});Wrap fields for DOM hide/show:
<div data-form-intelligent-field="companyName">
<label>Company Name</label>
<input name="companyName" />
</div>7. Enable / disable — SHIPPED
when("country").equals("Philippines").enable("province");8. Required / optional — SHIPPED
when("customerType").equals("Business").require("taxNumber");9. Field dependency — SHIPPED
when("country").changes(loadProvinces).populate("province");10. Calculations — SHIPPED
form.calculate("total", ({ values }) => values.price * values.quantity);Calculations guide → · Playground →
25. Business rule engine — SHIPPED
form
.when("loanAmount")
.greaterThan(500_000)
.then((ctx) => {
ctx.show("managerApproval");
ctx.require("managerApproval");
ctx.disableSubmit();
});Workflow
11. Wizard — SHIPPED
Multi-step forms with per-step validation.
12. Progress — SHIPPED
form.state.workflow.progress — percentage and step navigation built in.
13. Autosave — SHIPPED
workflow: { autosave: { enabled: true, debounceMs: 5000, onSave } }14. Draft recovery — SHIPPED
form.saveDraft(), restore on reload, optional promptOnRestore + onRestorePrompt.
15. Offline queue — SHIPPED
workflow.offlineQueue — queue while offline, form.flushOfflineQueue() on reconnect.
Submission and change tracking
16. Submission engine — SHIPPED
Validate → loading → disable button → API → success/error → re-enable.
17. Dirty tracking — SHIPPED
form.isDirty() for leave-page guards.
18. Undo / redo — SHIPPED
form.undo() / form.redo() with value history stack.
19. Changed fields — SHIPPED
form.changedFields() returns paths that differ from initial values.
Integrations
20. Browser session — SHIPPED
form.use(createBrowserLifecyclePlugin()) — saves draft when tab is hidden.
21. Keyboard shortcuts — SHIPPED
workflow.keyboard or createKeyboardPlugin() — Ctrl+S save, Ctrl+Enter submit.
Integrations guide → · Playground →
22. Analytics — SHIPPED
form.getAnalytics() — errors by field, field views, drop-off field.
23. Plugin system — SHIPPED
form.use(plugin) alias for registerPlugin().
24. React adapter — SHIPPED
import { useForm } from "@jayoncode/form-intelligent-react";
const form = useForm({ schema: { email: "email" } });How it fits together
USER TYPES → State Updates → Validation / Formatting / Rules
→ Update State → Re-render → Submit → Submission EngineNext steps
| Goal | Guide |
|---|---|
| Get started | Tutorial |
| Conditional fields | Rules |
| Derived values | Calculations |
| Snapshots / undo | State |
| Session / keyboard | Integrations |
| Engineering roadmap | 002-form-os-capabilities |
