ninjaformkit v0.0.7
Ninja Form Kit
Elevate your form development with Ninja Form Kit, a powerful TypeScript library that seamlessly integrates with your theme. This robust toolkit unifies UI generation and form validation into a single configuration object, streamlining your workflow. Leverage type-safe components to create polished, responsive forms with minimal effort. From basic inputs to complex layouts, Ninja Form Kit empowers developers to build professional, user-friendly forms while maintaining code consistency across projects. Simplify your form creation process and enhance productivity with our comprehensive, TypeScript-first solution.
Table of Contents
Installation
To install Ninja Form Kit, use npm or yarn:
npm install ninjaformkit
# or
yarn add ninjaformkit
Quick Start
To configure your form, define a formConfig object in your +page.server.ts
file. This object allows you to specify form properties such as method, action, fields, and validation rules. For optimal type safety, ensure your formConfig adheres to the FormConfig interface. Important: Define formConfig
outside the load function to guarantee accessibility within actions.
Define the config in loader
import { type FormConfig } from 'ninjaformkit'
const formConfig = {
method: 'post',
fields: {
email: {
type: 'text',
variant: 'email',
placeholder: 'Enter your email...',
label: 'Email',
validate: {
required: true,
isEmail: true
}
},
message: {
type: 'textarea',
placeholder: 'Enter your message...',
label: 'Message',
validate: {
required: true,
minLength: 10,
maxLength: 500
}
},
submit: {
type: 'submit',
label: 'Submit'
}
}
} satisfies FormConfig;
export const load: PageServerLoad = async () => {
return { formConfig };
};
Use the Form in your template/component
<script lang="ts">
import { Form } from 'ninjaformkit'
export let data;
</script>
<Form config={data.formConfig} />
Validate the form with actions
import { validate } from 'ninjaformkit'
export const actions = {
default: async ({ request }) => {
const { errors, hasErrors, values } = await validate(request, formConfig);
if (hasErrors) {
// Errors will appears under each input that validation fails
return fail(400, { errors });
}
// Process the type safe form values
await sendEmail({
email: values.email, // string
message: values.message // string
});
return redirect(301, '/');
}
} satisfies Actions;
Form Config Options
The formConfig
object allows you to configure various aspects of your form. Below is a table explaining each option:
Option | Type | Description |
---|---|---|
action | string | The URL to which the form data will be submitted. Optional. |
encType | 'application/x-www-form-urlencoded' \| 'multipart/form-data' \| 'text/plain' | The encoding type for the form. Optional. |
method | 'get' \| 'post' | The HTTP method to use when submitting the form. Required. |
fields | Record<string, FormField> | An object where each key is a field name and the value is a FormField object. Required. |
runLoader | boolean | Denotes weather to run sveltekits invalidateAll hook. Optional |
FormField Options
Each field in the fields
object is a FormField
with the following options:
Option | Type | Description |
---|---|---|
type | 'text' \| 'textarea' \| 'submit' \| 'checkbox' \| 'radio' \| 'toggle' \| 'select' \| 'file' | The type of the form field. Required. |
label | string | The label for the form field. Required. |
defaultValue | string \| number \| null | The default value for the form field. Optional. |
defaultChecked | boolean | The default checked state for checkbox, radio, or toggle fields. Optional. |
width | 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 11 \| 12 | The width of the form field, used for fieldset grid layout. Optional. Defaults to 12. |
variant | 'password' \| 'email' \| 'text' \| 'color' \| 'number' | The variant of the form field, specifying a more specific type. Works with the "text" input type. Defaults to "text". Optional. |
placeholder | string | The placeholder text for the form field. Optional. |
multiple | boolean | Whether the field allows multiple values (e.g., for file and select inputs). Optional. |
break | boolean | Weather to break into a new row in grid. Optional. |
icon | string | An icon to display with the form field. This relies on @iconify library (e.g. material-symbols:verified-user ) Optional. |
options | { value: string \| number; label: string; }[] | An array of options for select and radio fields. Each option has a value and a label . Optional. Note Select and Radio inputs will throw an error if these values are not set. |
disabled | boolean | Whether the form field is disabled. Optional. |
before | string | Content to display before the form field. Optional. |
after | string | Content to display after the form field. Optional. |
validate | object | Validation rules for the form field. Optional. |
Validation
Ninja Form Kit currently has 19 validate options.
Validation Options
The validate
object allows you to specify validation rules for the form field. Below is a table explaining each option:
Option | Type | Description |
---|---|---|
required | boolean | Whether the field is required. |
minLength | number | The minimum length of the field value. |
maxLength | number | The maximum length of the field value. |
min | number | The minimum value for numeric fields. |
max | number | The maximum value for numeric fields. |
isEmail | boolean | Whether the field value should be a valid email address. |
isUrl | boolean | Whether the field value should be a valid URL. |
isNumber | boolean | Whether the field value should be a valid number. |
isFloat | boolean | Whether the field value should be a valid float. |
isAlpha | boolean | Whether the field value should contain only alphabetic characters. |
isAlphanumeric | boolean | Whether the field value should contain only alphanumeric characters. |
isDate | boolean | Whether the field value should be a valid date. |
isTime | boolean | Whether the field value should be a valid time. |
isDateTime | boolean | Whether the field value should be a valid date-time. |
mimeTypes | Array<string> | An array of acceptable MIME types for file inputs. |
maxSize | number | The maximum file size for file inputs, in bytes. |
matches | string | A regex pattern that the field value should match. |
badPasswordCheck | boolean | Whether to check the field value against a list of common bad passwords. Utilises pwned passwords API. |
Theming
Ninja Form Kit offers a wide array of customizable CSS variables. Simply import the CSS file into your +layout.svelte
and tailor the variables to perfectly match your theme.
:root {
--nfk-font: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--nfk-default: #005f8b; // Button, radio and toggle colours
--nfk-default-hover: #0a5171; // Button, radio and toggle colours hover
--nfk-text: #000000; // text colour for labels
--nkf-input-bg: #f3f4f6; // Back ground colour for form inputs
--nkf-input-bg-file-hover: #f3f4f6; // Hover state for file input
--nfk-button-text: #ffffff; // Text colout for buttons and radio
--nkf-placeholder: #a0aec0; // Placeholder text colour
--nfk-border: #e2e8f0; // Input border
--nkf-error: #e53e3e; // Error color for border and error text
--nkf-required: #e84949; // Required asterix on inouts with validation rules
--nfk-outline: #0073aa; // Outline for inout focused
--nfk-gap-x: 14px; // Gap between inputs row
--nfk-gap-y: 14px; // Gap between inputs colun
}
@media (prefers-color-scheme: dark) {
:root {
--nfk-default: #005f8b;
--nfk-text: #FFFFFF;
--nkf-input-bg: #35383c;
--nkf-input-bg-file-hover: #595c61;
--nfk-button-text: #ffffff;
--nkf-placeholder: #dfe3e7;
--nfk-border: #e2e8f0;
--nkf-error: #e53e3e;
--nkf-required: #e84949;
--nfk-outline: #0073aa;
--nkf-btn-text: #ffffff;
}
}
More examples
Register Form
const formConfig = {
method: 'post',
fields: {
username: {
type: 'text',
label: 'Username',
placeholder: 'Enter your username...',
width: 5,
validate: {
required: true,
minLength: 3,
maxLength: 20
}
},
email: {
type: 'text',
variant: 'email',
label: 'Email',
placeholder: 'Enter your email...',
width: 7,
validate: {
required: true,
isEmail: true
}
},
referer: {
type: 'select',
label: 'Referer',
placeholder: 'Select an option...',
width: 4,
options: [
{ label: 'Google', value: 'google' },
{ label: 'Friend', value: 'friend' },
{ label: 'Other', value: 'other' }
],
break: true,
validate: {
required: true
}
},
accountType: {
type: 'radio',
label: 'Account Type',
width: 8,
options: [
{ label: 'Personal', value: 'personal' },
{ label: 'Business', value: 'business' }
],
validate: {
required: true
}
},
password: {
type: 'text',
variant: 'password',
label: 'Password',
placeholder: 'Enter your password...',
width: 6,
validate: {
required: true,
minLength: 8,
badPasswordCheck: true
}
},
confirmPassword: {
type: 'text',
variant: 'password',
label: 'Confirm Password',
placeholder: 'Confirm your password...',
width: 6,
validate: {
required: true,
matches: 'password'
}
},
newsletter: {
type: 'checkbox',
label: 'Subscribe to newsletter',
defaultChecked: true
},
submit: {
type: 'submit',
label: 'Submit'
}
}
} satisfies FormConfig;
Login Form
const formConfig = {
method: 'post',
fields: {
email: {
type: 'text',
variant: 'email',
placeholder: 'Enter your email...',
label: 'Email',
validate: {
required: true,
isEmail: true
},
after: `<a href="/reset-password" class="text-sm mt-3 text-right">Forgot Password</a>`
},
password: {
type: 'text',
variant: 'password',
placeholder: 'Enter your password...',
label: 'Password',
validate: {
required: true
}
},
rememberMe: {
type: 'checkbox',
label: 'Remember me'
},
submit: {
type: 'submit',
label: 'Submit'
}
}
} satisfies FormConfig;
License
This project is licensed under the MIT License. See the LICENSE file for details.