syncfusion-react-inputs — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-react-inputs (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Syncfusion React UploaderComponent provides a rich file upload control with async upload, drag-and-drop, chunk upload with pause/resume/cancel, validation, templates, form integration, and accessibility support.
🛑 Agentic use: Do not execute multiple steps autonomously. Confirm with the user before each action (install, run, file creation).
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-inputs 🛑 STOP — Do not install packages autonomously. Ask the user to run: `npm install @syncfusion/ej2-react-inputs`. Verify with `npm audit`UploaderComponent usage in JSX/TSX#### Asynchronous Upload 📄 Read: references/async-upload.md
asyncSettings with saveUrl and removeUrlmultiple)autoUpload)sequentialUpload)files property)uploading/removing events#### Chunk Upload 📄 Read: references/chunk-upload.md
asyncSettings.chunkSizeretryCount, retryAfterDelay)pause, resume methods)cancel method)chunkSuccess and chunkFailure events#### Validation 📄 Read: references/validation.md
allowedExtensions)minFileSize, maxFileSize)selected event#### File Sources 📄 Read: references/file-source.md
directoryUpload)dropArea)#### Templates and Customization 📄 Read: references/template-customization.md
template propertyshowFileList: falsebuttons property)#### Advanced How-To Scenarios 📄 Read: references/advanced-how-to.md
upload method, getFilesData)#### API Reference 📄 Read: references/api.md
allowedExtensions, asyncSettings, autoUpload, buttons, cssClass, directoryUpload, dropArea, dropEffect, enabled, files, htmlAttributes, locale, maxFileSize, minFileSize, multiple, sequentialUpload, showFileList, template, and more)upload, remove, cancel, pause, resume, retry, clearAll, getFilesData, bytesToSize, createFileList, sortFileList)uploading, success, failure, selected, removing, change, progress, chunkSuccess, chunkFailure, chunkUploading, actionComplete, beforeRemove, beforeUpload, canceling, clearing, fileListRendering, pausing, resuming, created)import { UploaderComponent } from '@syncfusion/ej2-react-inputs';
import '@syncfusion/ej2-base/styles/material.css';
import '@syncfusion/ej2-buttons/styles/material.css';
import '@syncfusion/ej2-inputs/styles/material.css';
import '@syncfusion/ej2-popups/styles/material.css';
import '@syncfusion/ej2-react-inputs/styles/material.css';
function App() {
// ⚠️ Replace with your own server-side endpoints.
// Never use third-party demo URLs in production — files will be sent to that external server.
const asyncSettings = {
saveUrl: '/api/upload/save',
removeUrl: '/api/upload/remove'
};
const onSuccess = (args: any) => {
console.log('Upload operation:', args.operation, 'File:', args.file.name);
};
const onFailure = (args: any) => {
console.error('Upload failed:', args.file.name);
};
return (
<UploaderComponent
asyncSettings={asyncSettings}
autoUpload={false}
success={onSuccess}
failure={onFailure}
/>
);
}#### Auto Upload with Validation
<UploaderComponent
asyncSettings={{ saveUrl: '/api/upload/save', removeUrl: '/api/upload/remove' }}
allowedExtensions=".pdf,.doc,.docx"
maxFileSize={5000000}
multiple={true}
/>#### Manual Upload with Custom Buttons
<UploaderComponent
asyncSettings={{ saveUrl: '/api/upload/save', removeUrl: '/api/upload/remove' }}
autoUpload={false}
buttons={{ browse: 'Choose File', clear: 'Clear All', upload: 'Upload All' }}
/>#### Chunk Upload for Large Files
<UploaderComponent
asyncSettings={{
saveUrl: '/api/upload/save',
removeUrl: '/api/upload/remove',
chunkSize: 500000 // 500 KB chunks
}}
/>| Need | Property/Event |
|---|---|
| Server URLs | asyncSettings.saveUrl + asyncSettings.removeUrl |
| Auto vs manual upload | autoUpload (default: true) |
| Large file upload | asyncSettings.chunkSize |
| Restrict file types | allowedExtensions |
| Limit file size | maxFileSize / minFileSize |
| Preload files from server | files prop |
| Upload one at a time | sequentialUpload: true |
| Entire folder upload | directoryUpload: true |
| Custom drop target | dropArea |
| Custom file list UI | template or showFileList: false |
| Add auth headers | uploading event → args.currentRequest.setRequestHeader() |
| Send extra form data | uploading event → args.customFormData |
The Syncfusion React NumericTextBoxComponent is a specialized input control for numeric data entry with support for number formatting (currency, percentage, scientific notation), min/max range validation, spin buttons, decimal precision control, internationalization, RTL languages, and full WCAG 2.2 accessibility compliance.
🛑 Agentic use: Do not execute multiple steps autonomously. Confirm with the user before each action (install, run, file creation).
When the user needs help with NumericTextBox, guide them to the appropriate reference:
#### Getting Started 📄 Read: references/getting-started.md
#### Formats & Validation 📄 Read: references/formats-and-validation.md
#### Spin Buttons & Step Control 📄 Read: references/spin-buttons-and-step.md
#### Adornments & Styling 📄 Read: references/adornments-and-styling.md
#### Precision & Decimals 📄 Read: references/precision-decimals.md
#### Two-Way Binding & Forms 📄 Read: references/two-way-binding-forms.md
#### Globalization & Accessibility 📄 Read: references/globalization-accessibility.md
#### API Reference 📄 Read: references/api.md
Here's a minimal working example to get started:
import React, { useState } from 'react';
import { NumericTextBoxComponent } from '@syncfusion/ej2-react-inputs';
import '@syncfusion/ej2-base/styles/material3.css';
import '@syncfusion/ej2-buttons/styles/material3.css';
import '@syncfusion/ej2-inputs/styles/material3.css';
export default function App() {
const [value, setValue] = useState(10);
return (
<div style={{ padding: '20px' }}>
<h3>Enter a Number</h3>
<NumericTextBoxComponent
value={value}
onChange={(e) => setValue(e.value)}
min={0}
max={100}
step={1}
/>
<p>Current Value: {value}</p>
</div>
);
}Key points:
NumericTextBoxComponent from @syncfusion/ej2-react-inputsvalue prop for the current numeric valueonChange event to update React statemin, max, step for validation and controls#### 1. Currency Input
<NumericTextBoxComponent
value={99.99}
format="c2"
min={0}
placeholder="Enter amount"
/>#### 2. Percentage Input
<NumericTextBoxComponent
value={50}
format="p"
min={0}
max={100}
/>#### 3. Integer-Only Input
<NumericTextBoxComponent
value={10}
decimals={0}
step={1}
min={0}
/>#### 4. Bounded Range with Validation
<NumericTextBoxComponent
value={25}
min={0}
max={100}
strictMode={true}
placeholder="0-100"
/>#### 5. Form Field with Label
<div>
<label>Product Quantity:</label>
<NumericTextBoxComponent
value={qty}
onChange={(e) => setQty(e.value)}
min={1}
step={1}
prefix="Units: "
/>
</div>| Property | Type | Purpose | |
|---|---|---|---|
value | number | Current numeric value | |
min | number | Minimum allowed value | |
max | number | Maximum allowed value | |
step | number | Increment/decrement step (default: 1) | |
decimals | number | Number of decimal places when focused | |
format | string | Number format (n2, c2, p2, e2, etc.) | |
currency | string | ISO 4217 currency code (e.g., 'USD', 'EUR') | |
placeholder | string | Placeholder text when empty | |
floatLabelType | FloatLabelType | Float label behavior ('Never', 'Always', 'Auto') | |
readonly | boolean | Prevent user input | |
enabled | boolean | Enable or disable the control (default: true) | |
strictMode | boolean | Enforce min/max validation (default: true) | |
validateDecimalOnType | boolean | Restrict decimal length during typing | |
showSpinButton | boolean | Show/hide spinner arrows (default: true) | |
showClearButton | boolean | Show/hide clear icon | |
allowMouseWheel | boolean | Enable mouse wheel increment/decrement (default: true) | |
cssClass | string | Additional CSS classes for custom styling | |
width | number \ | string | Width of the component |
1. Shopping Cart - Quantity Input
2. Price Calculator - Currency Field
3. Rating or Score - 0-100 Range
4. Discount Percentage
5. Measurement Input
6. Financial Form
@syncfusion/ej2-react-inputs, @syncfusion/ej2-base, and @syncfusion/ej2-buttons must be present in your project's package.json. Confirm they are already installed and that your lockfile (e.g., package-lock.json or yarn.lock) pins their versions for supply-chain integrity. When adding them, use an explicit version range such as @syncfusion/ej2-react-inputs@^27.x.x to avoid unpinned dependency risks.For detailed implementation guidance, navigate to the appropriate reference file above.
The TextBox component is a lightweight input control that captures user text input with support for floating labels, validation states, icons, and advanced features. This skill guides you through implementing, configuring, and customizing the TextBox component in React applications.
🛑 Agentic use: Do not execute multiple steps autonomously. Confirm with the user before each action (install, run, file creation).
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-inputs package 🛑 STOP — Do not install packages autonomously. Ask the user to run: `npm install @syncfusion/ej2-react-inputs`. Pin a specific version (e.g., `@syncfusion/[email protected]`) and verify with `npm audit`#### Features and Groups 📄 Read: references/features-and-groups.md
addIcon() method (prepend/append)showClearButton propertye-corner CSS classenabled={false}#### Styling and Sizing 📄 Read: references/styling-and-sizing.md
e-small), Large (e-bigger)cssClass propertye-corner CSS class#### Multiline TextBox 📄 Read: references/multiline-textbox.md
multiline={true}htmlAttributes={{ maxlength: '...' }}#### Validation and States 📄 Read: references/validation-and-states.md
cssClasse-error, e-warning, e-success)enabled={false} (not disabled)readonly={true}input event#### Advanced Features 📄 Read: references/advanced-features.md
prependTemplate and appendTemplate propertiesuseState, useEffect, useRef, useReducer integration#### Accessibility and Migration 📄 Read: references/accessibility-and-migration.md
enableRtl property#### API Reference 📄 Read: references/api.md
placeholder, floatLabelType, value, type, cssClass, multiline, showClearButton, enabled, readonly, enableRtl, enablePersistence, autocomplete, htmlAttributes, locale, width, prependTemplate, appendTemplateaddIcon, addAttributes, removeAttributes, focusIn, focusOut, destroy, getPersistDatacreated, destroyed, change, input, focus, blur#### Basic TextBox with Floating Label
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import './App.css';
export default function App() {
return (
<TextBoxComponent
placeholder="Enter your name"
floatLabelType="Auto"
/>
);
}#### TextBox with Icon
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import { useRef } from 'react';
export default function App() {
const textboxRef = useRef(null);
const handleCreate = () => {
if (textboxRef.current) {
textboxRef.current.addIcon('append', 'e-icons e-input-popup-date');
}
};
return (
<TextBoxComponent
placeholder="Enter date"
floatLabelType="Auto"
ref={textboxRef}
created={handleCreate}
/>
);
}#### TextBox with Clear Button
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
export default function App() {
return (
<TextBoxComponent
placeholder="Enter your email"
floatLabelType="Auto"
showClearButton={true}
/>
);
}#### Multiline TextBox
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
export default function App() {
return (
<TextBoxComponent
multiline={true}
placeholder="Enter your address"
floatLabelType="Auto"
/>
);
}#### Form with Validation States
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import { useState } from 'react';
export default function ValidationForm() {
const [cssClass, setCssClass] = useState('');
return (
<div>
<TextBoxComponent
placeholder="Enter username"
cssClass={cssClass}
floatLabelType="Auto"
input={(e: any) => {
if (!e.value) setCssClass('');
else if (e.value.length < 3) setCssClass('e-error');
else if (e.value.length < 6) setCssClass('e-warning');
else setCssClass('e-success');
}}
/>
</div>
);
}#### Password TextBox with Toggle
import * as React from 'react';
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import { useRef, useState } from 'react';
export default function PasswordInput() {
const textboxRef = useRef<TextBoxComponent>(null);
const [isVisible, setIsVisible] = useState(false);
const toggleVisibility = () => {
if (textboxRef.current) {
const newVisibility = !isVisible;
textboxRef.current.type = newVisibility ? 'text' : 'password';
setIsVisible(newVisibility);
}
};
function appendTemplate(): JSX.Element {
return (
<>
<span className="e-input-separator"></span>
<span
className={`e-icons ${isVisible ? 'e-eye-slash' : 'e-eye'}`}
onClick={toggleVisibility}
style={{ cursor: 'pointer' }}
></span>
</>
);
}
return (
<TextBoxComponent
ref={textboxRef}
type="password"
placeholder="Enter password"
floatLabelType="Auto"
appendTemplate={appendTemplate}
/>
);
}#### Email Input with Unit Label
import * as React from 'react';
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
export default function EmailInput() {
function prependTemplate(): JSX.Element {
return (
<>
<span className="e-icons e-user"></span>
<span className="e-input-separator"></span>
</>
);
}
function appendTemplate(): JSX.Element {
return (
<>
<span className="e-input-separator"></span>
<span>.com</span>
</>
);
}
return (
<TextBoxComponent
type="email"
placeholder="Enter email"
floatLabelType="Auto"
prependTemplate={prependTemplate}
appendTemplate={appendTemplate}
/>
);
}#### Rounded Corner TextBox
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
export default function RoundedCornerTextBox() {
return (
<TextBoxComponent
placeholder="Enter Date"
cssClass="e-corner"
/>
);
}#### Disabled TextBox
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
export default function DisabledTextBox() {
return (
<TextBoxComponent
placeholder="Enter Name"
enabled={false}
/>
);
}#### RTL TextBox
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
export default function RTLTextBox() {
return (
<TextBoxComponent
placeholder="أدخل اسمك"
floatLabelType="Auto"
enableRtl={true}
/>
);
}#### Auto-sizing Multiline TextBox
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import { useRef } from 'react';
export default function AutoSizeTextbox() {
const textboxRef = useRef(null);
const handleInput = () => {
if (textboxRef.current) {
const elem = textboxRef.current.respectiveElement;
elem.style.height = 'auto';
elem.style.height = elem.scrollHeight + 'px';
}
};
const handleCreate = () => {
if (textboxRef.current) {
textboxRef.current.addAttributes({ rows: 1 });
}
handleInput();
};
return (
<TextBoxComponent
multiline={true}
placeholder="Enter your message"
floatLabelType="Auto"
ref={textboxRef}
created={handleCreate}
input={handleInput}
/>
);
}| Property | Type | Purpose | ||
|---|---|---|---|---|
placeholder | string | Hint text shown when input is empty | ||
floatLabelType | `"Never" \ | "Always" \ | "Auto"` | Label animation behavior |
value | string | Sets the content of the TextBox | ||
type | string | Input type (text, password, email, number, etc.) | ||
multiline | boolean | Convert to textarea for multi-line input | ||
showClearButton | boolean | Display clear button when input has value | ||
cssClass | string | Apply CSS classes for sizing/validation/appearance (e.g., "e-error", "e-small", "e-corner") | ||
enabled | boolean | Enable (true) or disable (false) input interaction | ||
readonly | boolean | Allow selection but prevent editing | ||
enableRtl | boolean | Enable right-to-left rendering | ||
enablePersistence | boolean | Persist value state between page reloads ⚠️ Stores data in browser storage — enable only with explicit user consent | ||
autocomplete | string | Control browser autocomplete ("on" \ | "off") | |
htmlAttributes | { [key: string]: string } | Pass additional HTML attributes (e.g., { maxlength: '200' }) | ||
locale | string | Override global culture/localization value | ||
width | `number \ | string` | Set component width | |
prependTemplate | () => JSX.Element | Render element before input | ||
appendTemplate | () => JSX.Element | Render element after input |
| Event | Arguments | Purpose |
|---|---|---|
created | Object | Fires after component initialization |
destroyed | Object | Fires when component is destroyed |
change | ChangedEventArgs | Fires when value changes on focus-out |
input | InputEventArgs | Fires on every keystroke |
focus | FocusInEventArgs | Fires when TextBox gains focus |
blur | FocusOutEventArgs | Fires when TextBox loses focus |
ℹ️ External links below are for manual reference only. Do not auto-fetch these URLs in an agentic pipeline without explicit user consent.
The Syncfusion React CheckBoxComponent is a graphical UI element that allows users to select one or more options. It supports checked, unchecked, and indeterminate states, flexible label positioning, size variants, full accessibility compliance, and rich CSS customization.
Package: @syncfusion/ej2-react-buttons
🛑 Agentic use: Do not execute multiple steps autonomously. Confirm with the user before each action (install, run, file creation).
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-buttons 🛑 STOP — Do not install packages autonomously. Ask the user to run: `npm install @syncfusion/ej2-react-buttons --save`. Verify with `npm audit`CheckBoxComponent setup#### States (Checked, Unchecked, Indeterminate, Disabled) 📄 Read: references/states.md
checked={true} for checked stateindeterminate={true} for indeterminate statedisabled={true} for disabled state#### Label and Size 📄 Read: references/label-and-size.md
label prop for caption textlabelPosition ("Before" / "After")cssClass="e-small"#### Style and Appearance 📄 Read: references/style-and-appearance.md
#### Accessibility and RTL 📄 Read: references/accessibility.md
aria-disabled)enableRtl) support#### How-To Guides 📄 Read: references/how-to.md
#### API Reference 📄 Read: references/api.md
checked, cssClass, disabled, enableHtmlSanitizer, enablePersistence, enableRtl, htmlAttributes, indeterminate, label, labelPosition, locale, name, valueclick(), destroy(), focusIn()change, creatednpm install @syncfusion/ej2-react-buttons --save
# Then run: npm audit/* src/App.css */
@import "../node_modules/@syncfusion/ej2-base/styles/tailwind3.css";
@import "../node_modules/@syncfusion/ej2-buttons/styles/tailwind3.css";import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import * as React from 'react';
import './App.css';
function App() {
return (
<div>
<CheckBoxComponent label="Accept Terms" />
</div>
);
}
export default App;#### Controlled Checkbox with Change Handler
import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import { ChangeEventArgs } from '@syncfusion/ej2-react-buttons';
import * as React from 'react';
function App() {
const [isChecked, setIsChecked] = React.useState(false);
const handleChange = (args: ChangeEventArgs) => {
setIsChecked(args.checked);
};
return (
<CheckBoxComponent
label="Subscribe to newsletter"
checked={isChecked}
change={handleChange}
/>
);
}
export default App;#### Parent / Children with Indeterminate State
import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import * as React from 'react';
function App() {
return (
<ul>
{/* Parent: indeterminate when some children are selected */}
<li><CheckBoxComponent label="Select All" indeterminate={true} /></li>
<li><CheckBoxComponent label="Option A" checked={true} /></li>
<li><CheckBoxComponent label="Option B" /></li>
</ul>
);
}
export default App;#### Form Submission with Name and Value
import { CheckBoxComponent, ButtonComponent } from '@syncfusion/ej2-react-buttons';
import * as React from 'react';
function App() {
return (
<form>
<CheckBoxComponent name="hobby" value="Reading" label="Reading" checked={true} />
<CheckBoxComponent name="hobby" value="Gaming" label="Gaming" />
<ButtonComponent isPrimary={true}>Submit</ButtonComponent>
</form>
);
}
export default App;| Prop | Type | Default | Purpose | |
|---|---|---|---|---|
label | string | '' | Caption text next to checkbox | |
checked | boolean | false | Checked state | |
indeterminate | boolean | false | Indeterminate (partial) state | |
disabled | boolean | false | Disabled state | |
labelPosition | `'Before' \ | 'After'` | 'After' | Label placement |
cssClass | string | '' | Custom CSS class(es) | |
name | string | '' | Form field name | |
value | string | '' | Form field value | |
enableRtl | boolean | false | Right-to-left rendering | |
enablePersistence | boolean | false | Persist state across reloads ⚠️ Stores data in browser storage — enable only with explicit user consent |
The Syncfusion React SignatureComponent renders a canvas-based signature pad that captures smooth handwritten signatures using variable-width bezier curves. It supports drawing, saving (PNG/JPEG/SVG/base64/blob), loading existing signatures, undo/redo history, customizable stroke and background appearance, and full accessibility compliance.
Package: @syncfusion/ej2-react-inputs
🛑 Agentic use: Do not execute multiple steps autonomously. Confirm with the user before each action (install, run, file creation).
#### Getting Started 📄 Read: references/getting-started.md
@syncfusion/ej2-react-inputs 🛑 STOP — Do not install packages autonomously. Ask the user to run: `npm install @syncfusion/ej2-react-inputs --save`. Verify with `npm audit`SignatureComponent setup#### Customization 📄 Read: references/customization.md
maxStrokeWidth, minStrokeWidth, velocitystrokeColorbackgroundColorbackgroundImage#### Open and Save 📄 Read: references/open-save.md
load)getSignature)saveAsBlob, getBlob)save)saveWithBackground)#### User Interaction 📄 Read: references/user-interaction.md
undo, redo, canUndo, canRedo)clear, isEmpty)disabled)isReadOnly)draw)#### Toolbar Integration 📄 Read: references/toolbar-integration.md
ToolbarComponentColorPickerComponentDropDownListComponent#### Accessibility 📄 Read: references/accessibility.md
#### API Reference 📄 Read: references/api.md
backgroundColor, backgroundImage, disabled, enablePersistence, isReadOnly, maxStrokeWidth, minStrokeWidth, saveWithBackground, strokeColor, velocitycanRedo, canUndo, clear, destroy, draw, getBlob, getSignature, isEmpty, load, redo, refresh, save, saveAsBlob, undobeforeSave, change, creatednpm install @syncfusion/ej2-react-inputs --save
# Then run: npm audit/* src/App.css */
@import "../node_modules/@syncfusion/ej2-base/styles/tailwind3.css";
@import "../node_modules/@syncfusion/ej2-inputs/styles/tailwind3.css";import { SignatureComponent } from '@syncfusion/ej2-react-inputs';
import * as React from 'react';
import './App.css';
function App() {
return (
<div>
<SignatureComponent id="signature" />
</div>
);
}
export default App;#### Signature with Undo/Redo/Clear Controls
import { SignatureComponent, SignatureChangeEventArgs } from '@syncfusion/ej2-react-inputs';
import { ButtonComponent } from '@syncfusion/ej2-react-buttons';
import * as React from 'react';
import { useRef } from 'react';
function App() {
const sigRef = React.useRef<SignatureComponent>(null);
const [canUndo, setCanUndo] = React.useState(false);
const [canRedo, setCanRedo] = React.useState(false);
const [isEmpty, setIsEmpty] = React.useState(true);
function handleChange(args: SignatureChangeEventArgs) {
if (sigRef.current) {
setCanUndo(sigRef.current.canUndo());
setCanRedo(sigRef.current.canRedo());
setIsEmpty(sigRef.current.isEmpty());
}
}
return (
<div>
<ButtonComponent disabled={!canUndo} onClick={() => sigRef.current?.undo()}>Undo</ButtonComponent>
<ButtonComponent disabled={!canRedo} onClick={() => sigRef.current?.redo()}>Redo</ButtonComponent>
<ButtonComponent disabled={isEmpty} onClick={() => sigRef.current?.clear()}>Clear</ButtonComponent>
<SignatureComponent id="signature" ref={sigRef} change={handleChange} />
</div>
);
}
export default App;#### Save Signature as PNG
import { SignatureComponent } from '@syncfusion/ej2-react-inputs';
import { ButtonComponent } from '@syncfusion/ej2-react-buttons';
import * as React from 'react';
function App() {
const sigRef = React.useRef<SignatureComponent>(null);
function saveSignature() {
sigRef.current?.save('Png', 'MySignature');
}
return (
<div>
<SignatureComponent id="signature" ref={sigRef} />
<ButtonComponent onClick={saveSignature}>Save as PNG</ButtonComponent>
</div>
);
}
export default App;| Prop | Type | Default | Purpose |
|---|---|---|---|
strokeColor | string | '#000000' | Pen/stroke color (hex, rgb, or name) |
backgroundColor | string | '' | Canvas background color |
backgroundImage | string | '' | Canvas background image URL |
maxStrokeWidth | number | 2 | Maximum stroke thickness |
minStrokeWidth | number | 0.5 | Minimum stroke thickness |
velocity | number | 0.7 | Controls stroke width variation |
disabled | boolean | false | Disables the component |
isReadOnly | boolean | false | Prevents drawing, allows focus |
saveWithBackground | boolean | true | Include background when saving |
enablePersistence | boolean | false | Persist state across page reloads ⚠️ Stores signature data (biometric input) in browser storage — enable only with explicit user consent and applicable privacy disclosures |
A focused input component for collecting one-time passwords, PINs, and verification codes. Renders a configurable number of individual character input fields with full keyboard navigation, accessibility support, and visual styling modes.
import { OtpInputComponent } from '@syncfusion/ej2-react-inputs';
import * as React from 'react';
import './App.css';
function App() {
return (
<div id="container">
<OtpInputComponent id="otpinput" />
</div>
);
}
export default App;CSS (src/App.css):
@import "../node_modules/@syncfusion/ej2-base/styles/tailwind3.css";
@import "../node_modules/@syncfusion/ej2-inputs/styles/tailwind3.css";Install:
npm install @syncfusion/ej2-react-inputs --save#### 6-digit OTP with verification callback
import { OtpInputComponent, OtpChangedEventArgs } from '@syncfusion/ej2-react-inputs';
import * as React from 'react';
function App() {
const handleValueChanged = (args: OtpChangedEventArgs) => {
console.log('Complete OTP:', args.value);
// Call your API verification here
};
return (
<OtpInputComponent
id="otpinput"
length={6}
autoFocus={true}
valueChanged={handleValueChanged}
/>
);
}#### Password-masked OTP with error state
import { OtpInputComponent } from '@syncfusion/ej2-react-inputs';
import * as React from 'react';
function App() {
return (
<OtpInputComponent
id="otpinput"
type="password"
length={6}
cssClass="e-error"
placeholder="*"
/>
);
}#### Alphanumeric OTP with separator
import { OtpInputComponent } from '@syncfusion/ej2-react-inputs';
import * as React from 'react';
function App() {
return (
<OtpInputComponent
id="otpinput"
type="text"
length={6}
separator="-"
textTransform="uppercase"
stylingMode="filled"
/>
);
}| Property | Type | Default | Purpose | ||
|---|---|---|---|---|---|
length | number | 4 | Number of OTP input fields | ||
value | `string \ | number` | '' | Current OTP value | |
type | `'number' \ | 'text' \ | 'password'` | 'number' | Input character type |
stylingMode | `'outlined' \ | 'filled' \ | 'underlined'` | 'outlined' | Visual style variant |
placeholder | string | '' | Hint character(s) per field | ||
separator | string | '' | Character between fields | ||
cssClass | string | '' | Custom/predefined CSS class (e-success, e-warning, e-error) | ||
disabled | boolean | false | Disables user input | ||
autoFocus | boolean | false | Auto-focuses on render | ||
enableRtl | boolean | false | Right-to-left layout | ||
textTransform | `'none' \ | 'uppercase' \ | 'lowercase'` | 'none' | Case transformation |
ariaLabels | string[] | [] | Per-field ARIA labels | ||
htmlAttributes | { [key: string]: string } | {} | Extra HTML attributes |
#### Installation, Setup & Basic Usage 📄 Read: references/getting-started.md
#### Input Types, Styling & Visual Configuration 📄 Read: references/configuration.md
e-success, e-warning, e-error)#### Events & Interaction Handling 📄 Read: references/events.md
created event (post-render init)focus and blur events with OtpFocusEventArgsinput event for real-time tracking with OtpInputEventArgsvalueChanged event for OTP submission with OtpChangedEventArgsfocusIn() / focusOut() methods#### Accessibility 📄 Read: references/accessibility.md
ariaLabels configurationhtmlAttributes for custom accessibility metadata#### Full API Reference 📄 Read: references/api.md
destroy(), focusIn(), focusOut()OtpInputType, OtpInputStyle, TextTransformOtpFocusEventArgs, OtpInputEventArgs, OtpChangedEventArgsWhich type to use?
type="number" (default)type="text"type="password"Which event to use?
valueChangedinputfocus / blurWhich styling mode?
outlined (default)filledunderlinedVisual feedback after verification?
cssClass="e-success"cssClass="e-error"cssClass="e-warning"The TextArea component enables efficient collection of multiline text input in forms and applications. It provides essential features for user feedback, comments, descriptions, and any scenario requiring extended text input.
#### Getting Started 📄 Read: references/getting-started.md
#### Core Features & Content 📄 Read: references/value-and-content.md
#### Floating Labels & Placeholders 📄 Read: references/floating-label.md
#### Adornments (Custom Elements) 📄 Read: references/adornments.md
#### Form Integration 📄 Read: references/form-support.md
#### Content Constraints 📄 Read: references/max-length.md
#### Sizing & Dimensions 📄 Read: references/rows-columns-sizing.md
#### Resize Behavior 📄 Read: references/resize.md
#### Styling & Appearance 📄 Read: references/styling-appearance.md
#### Events & User Interaction 📄 Read: references/events.md
#### Methods & Programmatic Control 📄 Read: references/methods.md
#### Complete API Reference 📄 Read: references/api.md
import { TextAreaComponent } from '@syncfusion/ej2-react-inputs';
import * as React from 'react';
import './App.css';
function App() {
const [textValue, setTextValue] = React.useState('');
const handleChange = (args) => {
console.log('TextArea value changed:', args.value);
};
return (
<div className='wrap'>
<TextAreaComponent
id='default'
placeholder='Enter your comments'
value={textValue}
change={handleChange}
floatLabelType='Auto'
rows={5}
cols={40}
/>
</div>
);
}
export default App;#### Pattern 1: Form with Validation
<TextAreaComponent
name='comments'
placeholder='Your feedback'
floatLabelType='Auto'
required={true}
maxLength={500}
showClearButton={true}
/>#### Pattern 2: Controlled Component with State
const [value, setValue] = React.useState('');
<TextAreaComponent
value={value}
input={(args) => setValue(args.value)}
/>#### Pattern 3: Styled with Custom CSS
<TextAreaComponent
placeholder='Enter text'
cssClass='e-outline e-small'
floatLabelType='Auto'
/>#### Pattern 4: Disabled & Read-Only States
<TextAreaComponent placeholder='Disabled' enabled={false} />
<TextAreaComponent placeholder='Read-only' readonly={true} />#### Pattern 5: With Adornments
<TextAreaComponent
placeholder='Message'
prependTemplate={() => <span className='icon'>📝</span>}
appendTemplate={() => <button>Send</button>}
/>| Prop | Purpose | Common Values |
|---|---|---|
value | Set/get textarea content | string |
placeholder | Hint text | string |
rows | Visible height in lines | 3-10 |
cols | Visible width in characters | 30-80 |
floatLabelType | Floating behavior | 'Auto', 'Always', 'Never' |
maxLength | Character limit | number |
resizeMode | User resizing | 'Both', 'Vertical', 'Horizontal', 'None' |
enabled | Enable/disable input | boolean |
readonly | Read-only mode | boolean |
cssClass | Custom styling | 'e-outline', 'e-small', 'e-filled' |
showClearButton | Display clear button | boolean |
A comprehensive guide for implementing the Syncfusion Essential JS 2 SliderComponent in React applications. Supports single-value (Default), min-range fill (MinRange), and dual-handle range selection (Range) with tooltips, ticks, limits, color ranges, custom values, formatting, accessibility, events, and more.
Package: @syncfusion/ej2-react-inputs
#### Getting Started 📄 Read: references/getting-started.md
#### Types and Orientation 📄 Read: references/types-and-orientation.md
#### Tooltips and Ticks 📄 Read: references/tooltips-and-ticks.md
#### Formatting and Limits 📄 Read: references/formatting-and-limits.md
#### Styling and Customization 📄 Read: references/styling.md
#### Accessibility 📄 Read: references/accessibility.md
role="slider", aria-valuemin, aria-valuemax, aria-valuenow, aria-orientation)aria-live regions#### Color Range 📄 Read: references/color-range.md
colorRange property and ColorRangeDataModel interfaceRange type (dual handles)colorRange with limits, ticks, and tooltip#### Events and Methods 📄 Read: references/events-and-methods.md
change event — continuous value updates while draggingchanged event — final committed value on drag releasecreated event — post-render initializationrenderingTicks — customize tick label text per tickrenderedTicks — post-process tick DOM after all ticks rendertooltipChange — customize tooltip display textreposition() method — when and how to calldestroy() method — cleanup and removalref patterns for programmatic control#### API Reference 📄 Read: references/api-reference.md
SliderComponent properties: value, type, min, max, step, orientation, ticks, tooltip, limits, colorRange, customValues, showButtons, enableAnimation, enabled, readonly, cssClass, width, enableRtl, enablePersistence, enableHtmlSanitizer, localereposition(), destroy()change, changed, created, renderingTicks, renderedTicks, tooltipChangeTicksDataModel — placement ('Before'/'After'/'Both'/'None'), largeStep, smallStep, showSmallTicks, formatTooltipDataModel — isVisible, placement, showOn ('Always'/'Focus'/'Click'), format, cssClassLimitDataModel — enabled, minStart, minEnd, maxStart, maxEnd, startHandleFixed, endHandleFixedColorRangeDataModel — color, start, endSliderChangeEventArgs — value, previousValue, action, isInteracted, textSliderTickEventArgs — value, text, tickElementSliderTickRenderedEventArgs — ticksWrapper, tickElementsSliderTooltipEventArgs — value, textSliderType ('Default' | 'MinRange' | 'Range')SliderOrientation ('Horizontal' | 'Vertical')#### Basic Single Value Slider
import React from 'react';
import { SliderComponent } from '@syncfusion/ej2-react-inputs';
import '@syncfusion/ej2-react-inputs/styles/material.css';
function App() {
return (
<div>
<SliderComponent
id="slider"
value={30}
min={0}
max={100}
/>
</div>
);
}
export default App;#### Range Slider (Two Handles)
import React from 'react';
import { SliderComponent } from '@syncfusion/ej2-react-inputs';
import '@syncfusion/ej2-react-inputs/styles/material.css';
function App() {
const [range, setRange] = React.useState([30, 70]);
return (
<div>
<SliderComponent
id="range-slider"
type="Range"
value={range}
change={(e) => setRange(e.value)}
min={0}
max={100}
/>
</div>
);
}
export default App;#### Price Range Selector
import React from 'react';
import { SliderComponent } from '@syncfusion/ej2-react-inputs';
import '@syncfusion/ej2-react-inputs/styles/material.css';
function PriceRangeSelector() {
const [priceRange, setPriceRange] = React.useState([100, 500]);
const tooltip = {
placement: 'Before',
isVisible: true,
format: 'C2' // Currency format
};
return (
<div>
<h3>Price Range: ${priceRange[0]} - ${priceRange[1]}</h3>
<SliderComponent
id="price-slider"
type="Range"
value={priceRange}
change={(e) => setPriceRange(e.value)}
min={0}
max={1000}
step={10}
tooltip={tooltip}
/>
</div>
);
}
export default PriceRangeSelector;#### Pattern 1: Single Value with Ticks Use Default type for simple numeric selection with visual scale.
<SliderComponent
id="default-slider"
value={40}
min={0}
max={100}
step={5}
ticks={{
placement: 'After',
largeStep: 20,
smallStep: 5,
showSmallTicks: true
}}
/>#### Pattern 2: Range with Fixed Limits Use Range type with limits to restrict handle movement to specific areas.
<SliderComponent
id="limited-range"
type="Range"
value={[25, 75]}
limits={{
enabled: true,
minStart: 10,
minEnd: 40,
maxStart: 60,
maxEnd: 90
}}
tooltip={{ isVisible: true }}
/>#### Pattern 3: Formatted Values (Currency) Display values as currency using format API.
<SliderComponent
id="currency-slider"
type="Range"
value={[1000, 5000]}
min={0}
max={10000}
step={100}
tooltip={{
isVisible: true,
format: 'C0' // Currency without decimals
}}
ticks={{
placement: 'After',
largeStep: 2000,
format: 'C0'
}}
/>#### Pattern 4: Vertical Orientation Display slider vertically for space-constrained layouts.
<div style={{ height: '300px', width: '100px' }}>
<SliderComponent
id="vertical-slider"
value={50}
orientation="Vertical"
tooltip={{ isVisible: true }}
/>
</div>#### Pattern 5: With Increment/Decrement Buttons Add buttons to manually adjust slider values.
<SliderComponent
id="button-slider"
type="Range"
value={[30, 70]}
showButtons={true}
tooltip={{ isVisible: true }}
/>#### Pattern 6: Color Range (Zones) Paint distinct color sections on the slider track using colorRange.
import { ColorRangeDataModel } from '@syncfusion/ej2-react-inputs';
const colorRange: ColorRangeDataModel[] = [
{ color: '#ff4040', start: 0, end: 33 }, // Low zone — red
{ color: '#ffb300', start: 34, end: 66 }, // Mid zone — amber
{ color: '#00c853', start: 67, end: 100 } // High zone — green
];
<SliderComponent
id="color-slider"
type="MinRange"
value={50}
colorRange={colorRange}
tooltip={{ isVisible: true, showOn: 'Always' }}
/>#### Pattern 7: Custom Value Scale Use non-numeric labels as slider values with customValues.
<SliderComponent
id="size-slider"
customValues={['XS', 'S', 'M', 'L', 'XL', 'XXL']}
value="M"
tooltip={{ isVisible: true }}
/>#### Pattern 8: Read-Only Display Show a locked slider for informational display.
<SliderComponent
id="status-slider"
type="MinRange"
value={65}
min={0}
max={100}
readonly={true}
tooltip={{ isVisible: true, showOn: 'Always' }}
ticks={{ placement: 'After', largeStep: 20 }}
/>| Property | Type | Default | Purpose | ||
|---|---|---|---|---|---|
value | `number \ | number[]` | null | Single value or [start, end] array for Range type | |
type | `'Default' \ | 'MinRange' \ | 'Range'` | 'Default' | Slider mode |
min | number | 0 | Minimum selectable value | ||
max | number | 100 | Maximum selectable value | ||
step | number | 1 | Value increment/decrement per step | ||
orientation | `'Horizontal' \ | 'Vertical'` | 'Horizontal' | Slider direction | |
tooltip | TooltipDataModel | { isVisible: false } | Tooltip configuration | ||
ticks | TicksDataModel | { placement: 'before' } | Tick marks configuration | ||
limits | LimitDataModel | { enabled: false } | Thumb movement restrictions | ||
colorRange | ColorRangeDataModel[] | [] | Color zones on the track | ||
customValues | `string[] \ | number[]` | null | Custom value scale (ignores min/max/step) | |
showButtons | boolean | false | Show +/- increment/decrement buttons | ||
enabled | boolean | true | Enable or disable the slider | ||
readonly | boolean | false | Read-only display mode | ||
enableRtl | boolean | false | Right-to-left layout | ||
width | `number \ | string` | null | Slider element width | |
cssClass | string | '' | Custom CSS classes on root element |
| Type | Handles | Fill Behavior | Use Case |
|---|---|---|---|
| Default | 1 | No fill | Simple numeric selection |
| MinRange | 1 | Fill from min | Visual progress/level indicator |
| Range | 2 | Fill between handles | Min/max range selection |
#### Budget Range Selector Select min and max budget with step increments and currency formatting. → Use type="Range", step={50}, format 'C0', tooltip enabled
#### Time Range Picker Select time window (hours, minutes, days). → Use type="Range", custom formatting via renderingTicks event
#### Volume/Brightness Control Single handle adjustment with immediate feedback. → Use type="Default", no ticks, always-visible tooltip
#### Score/Rating Range MinRange mode with shadow showing current level. → Use type="MinRange", min={0}, max={10}, step-based
#### Product Filter Multiple product categories with price ranges. → Use type="Range", limits for each category, event handlers
| Event | Trigger | Usage |
|---|---|---|
created | Component created and rendered | One-time setup operations |
change | Value changing while dragging | Real-time feedback (continuous) |
changed | Drag complete (thumb released) | Capture final committed value |
tooltipChange | Tooltip about to render | Custom tooltip text formatting |
renderingTicks | Each tick being rendered | Custom tick label text |
renderedTicks | All ticks rendered | Post-process tick DOM elements |
⚠️ Note: The official event for continuous updates while dragging ischange, notchanging. The event fired after drag completes ischanged. Do NOT useonChangeprop (that is a React native input prop). Usechangeandchangeddirectly.
Component not displaying? → Check CSS imports and theme in getting-started.md
Values not updating? → Use change (continuous) or changed (on release) events — NOT onChange
Formatting not working? → See format API examples in formatting-and-limits.md
Accessibility issues? → Refer to accessibility.md for ARIA and keyboard support
Vertical slider not rendering? → Wrap in a container with explicit height (e.g., style={{ height: '300px' }})
Range type with single value? → Always pass value={[start, end]} array for type="Range"
Color zones not showing? → Check colorRange array has valid start/end/color properties
Default, MinRange, or Range)⚠️ Critical: Only use APIs explicitly listed in references/api-reference.md. Do not referenceonChange(usechange/changed),toggle(),open(),close(), or any undocument
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.