
Security News
Feross on TBPN: How North Korea Hijacked Axios
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.
@neuralsea/react-wizard
Advanced tools
A production-grade, fully customisable wizard/stepper component for React 19+ and TypeScript 5+. Designed for complex workflows with built-in support for VS Code extensions, theming, validation, and accessibility.
npm install @neuralsea/react-wizard
# or
yarn add @neuralsea/react-wizard
# or
pnpm add @neuralsea/react-wizard
import { Wizard } from '@neuralsea/react-wizard';
import type { StepComponentProps, WizardStep } from '@neuralsea/react-wizard';
import '@neuralsea/react-wizard/styles';
type WizardData = {
name?: string;
newsletter?: boolean;
};
const PersonalInfoStep: React.FC<StepComponentProps<WizardData>> = ({
data,
updateData,
}) => (
<div>
<h2>Personal information</h2>
<input
type="text"
value={data.name || ''}
onChange={(e) => void updateData({ name: e.target.value })}
placeholder="Your name"
/>
</div>
);
const PreferencesStep: React.FC<StepComponentProps<WizardData>> = ({
data,
updateData,
}) => (
<div>
<h2>Preferences</h2>
<label>
<input
type="checkbox"
checked={data.newsletter || false}
onChange={(e) => void updateData({ newsletter: e.target.checked })}
/>
Subscribe to newsletter
</label>
</div>
);
const steps: WizardStep[] = [
{
id: 'personal',
title: 'Personal info',
description: 'Tell us about yourself',
component: PersonalInfoStep,
validate: async () => true,
},
{
id: 'preferences',
title: 'Preferences',
component: PreferencesStep,
},
];
export function App() {
return (
<Wizard
steps={steps}
onComplete={(data) => {
console.log('Wizard completed with data:', data);
}}
/>
);
}
Each step is defined by WizardStep:
interface WizardStep {
id: string;
title: string;
description?: string;
component: ComponentType<StepComponentProps>;
validate?: () =>
| boolean
| { valid: boolean; error?: string }
| Promise<boolean | { valid: boolean; error?: string }>;
canSkip?: boolean;
icon?: ComponentType<{ size?: number }>;
optional?: boolean;
}
Step components receive these props:
interface StepComponentProps<TData = any> {
data: TData;
updateData: (updates: Partial<TData>) => void | Promise<void>;
goToStep: (stepId: string) => void;
goNext?: () => Promise<void>;
goPrevious?: () => void;
}
<Wizard
steps={steps}
theme={{
primary: '#3b82f6',
primaryHover: '#2563eb',
success: '#10b981',
error: '#ef4444',
radius: '0.5rem',
}}
/>
For VS Code extensions:
import { vscodeTheme } from '@neuralsea/react-wizard';
<Wizard steps={steps} theme={vscodeTheme} />;
Take full control of layout:
import {
Wizard,
StepIndicator,
StepContent,
Navigation,
} from '@neuralsea/react-wizard';
export function CustomWizard() {
return (
<Wizard steps={steps}>
<div className="custom-layout">
<aside>
<StepIndicator />
</aside>
<main>
<StepContent />
<Navigation />
</main>
</div>
</Wizard>
);
}
Access wizard context in nested components:
import { useWizard } from '@neuralsea/react-wizard';
type WizardData = { name: string };
export function CustomComponent() {
const { steps, currentStepIndex, data, goNext, isLastStep } =
useWizard<WizardData>();
return (
<div>
<p>
Step {currentStepIndex + 1} of {steps.length}
</p>
<p>Name: {data.name}</p>
<button onClick={() => void goNext()} disabled={isLastStep}>
Next
</button>
</div>
);
}
Wrap step components with wizard capabilities:
import { withWizardStep, withValidation } from '@neuralsea/react-wizard';
import type { StepComponentProps, ValidationResult } from '@neuralsea/react-wizard';
interface MyData {
email: string;
}
const MyStep: React.FC<StepComponentProps<MyData>> = ({ data, updateData }) => (
<input value={data.email} onChange={(e) => void updateData({ email: e.target.value })} />
);
const validate = (data: MyData): ValidationResult =>
data.email.includes('@') ? { valid: true } : { valid: false, error: 'Invalid email' };
export default withValidation(withWizardStep<MyData>(MyStep), validate);
Validation supports booleans or structured error messages:
const steps: WizardStep[] = [
{
id: 'email',
title: 'Email',
component: EmailStep,
validate: () => {
if (!data.email) return { valid: false, error: 'Email is required' };
if (!data.email.includes('@')) return { valid: false, error: 'Invalid email format' };
return { valid: true };
},
},
];
<Wizard
steps={steps}
persistData
storageKey="my-wizard-data"
onComplete={(data) => {
localStorage.removeItem('my-wizard-data');
}}
/>;
Enabled by default:
Disable keyboard navigation:
<Wizard steps={steps} keyboardNavigation={false} />
The wizard supports:
MIT. See LICENSE.
FAQs
Customizable wizard control for React 19+ with TypeScript 5+
We found that @neuralsea/react-wizard demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.

Security News
OpenSSF has issued a high-severity advisory warning open source developers of an active Slack-based campaign using impersonation to deliver malware.

Research
/Security News
Malicious packages published to npm, PyPI, Go Modules, crates.io, and Packagist impersonate developer tooling to fetch staged malware, steal credentials and wallets, and enable remote access.