<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: milad shiriyan</title>
    <description>The latest articles on Forem by milad shiriyan (@miladxsar23).</description>
    <link>https://forem.com/miladxsar23</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1214624%2Fc633cc33-15cc-4abc-85c5-bf665c20a597.jpeg</url>
      <title>Forem: milad shiriyan</title>
      <link>https://forem.com/miladxsar23</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/miladxsar23"/>
    <language>en</language>
    <item>
      <title>Stop Leaking Your Component’s Secrets: Introducing the KIP Pattern in React</title>
      <dc:creator>milad shiriyan</dc:creator>
      <pubDate>Mon, 04 May 2026 14:51:45 +0000</pubDate>
      <link>https://forem.com/miladxsar23/stop-leaking-your-components-secrets-introducing-the-kip-pattern-in-react-57ac</link>
      <guid>https://forem.com/miladxsar23/stop-leaking-your-components-secrets-introducing-the-kip-pattern-in-react-57ac</guid>
      <description>&lt;h2&gt;
  
  
  How treating React components as strict micro-domains can cure the "God File" anti-pattern forever.
&lt;/h2&gt;

&lt;p&gt;We’ve all been there. You start building a simple React component. First, it’s just UI. Then, you add some state. Next comes a custom interface. Oh, and a helper function to format dates. Fast forward three weeks, and your innocent &lt;code&gt;UserProfile.tsx&lt;/code&gt; has mutated into a 1,000-line "God File." &lt;/p&gt;

&lt;p&gt;To fix this, you split the file. You create &lt;code&gt;useUserProfile.ts&lt;/code&gt; and &lt;code&gt;userProfileUtils.ts&lt;/code&gt;. But suddenly, these internal files are sitting in shared folders, polluting the global namespace, and worse—other developers start importing your specific utils into completely unrelated parts of the app!&lt;/p&gt;

&lt;p&gt;Your component's internal secrets are leaking. &lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;KIP (Keep It Private)&lt;/strong&gt; Pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the KIP Pattern?
&lt;/h3&gt;

&lt;p&gt;KIP is an architectural pattern for React that enforces &lt;strong&gt;Strict Encapsulation&lt;/strong&gt; at the component level. It treats every component—no matter how small or large—as an independent micro-domain.&lt;/p&gt;

&lt;p&gt;In KIP, the logic, types, utilities, and sub-components (slots) belonging to a component live inside that component's folder, explicitly marked as &lt;strong&gt;private&lt;/strong&gt;. The outside world can only interact with the component through a single gateway.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Golden Rules of KIP
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;_&lt;/code&gt; Prefix Means STRICTLY PRIVATE:&lt;/strong&gt; &lt;br&gt;
Any file starting with an underscore (&lt;code&gt;_&lt;/code&gt;) is an internal implementation detail of that specific component (e.g., &lt;code&gt;_hook.ts&lt;/code&gt;, &lt;code&gt;_type.ts&lt;/code&gt;, &lt;code&gt;_util.ts&lt;/code&gt;, &lt;code&gt;_component.tsx&lt;/code&gt;). It declares: &lt;em&gt;"I am private. Do not import me directly from outside this folder."&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;index.ts&lt;/code&gt; is The Gate:&lt;/strong&gt; &lt;br&gt;
The &lt;code&gt;index.ts&lt;/code&gt; file acts as the ultimate Gatekeeper (API Boundary). It imports what is necessary from the private &lt;code&gt;_&lt;/code&gt; files and selectively exports them to the rest of the application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Progressive Scaling: From Button to Dashboard
&lt;/h4&gt;

&lt;p&gt;The true beauty of KIP is that it is not just for massive, complex components. It offers &lt;strong&gt;Progressive Scaling&lt;/strong&gt;. You only create the private scopes required to maintain clean code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 1: The Simple Component (e.g., Button)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📂 Button/
 ├── 📄 _type.ts       
 ├── 📄 _component.tsx 
 └── 📄 index.ts       
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Level 2: The Medium Component (e.g., LoginForm)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📂 LoginForm/
 ├── 📄 _hook.ts       
 ├── 📄 _util.ts       
 ├── 📄 _type.ts       
 ├── 📄 _component.tsx 
 └── 📄 index.ts       
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Level 3: The Complex Component (e.g., DataGrid)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📂 DataGrid/
 ├── 📄 _hook.ts       
 ├── 📄 _util.ts       
 ├── 📄 _type.ts       
 ├── 📄 _store.ts      
 ├── 📄 _slots.tsx     
 ├── 📄 _component.tsx 
 └── 📄 index.ts       
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  How KIP Solves the React Scaling Crisis:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;True Separation of Concerns (SoC):&lt;/strong&gt; No more 1000-line files. Your logic is cleanly separated into specialized micro-files, making debugging incredibly focused.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The &lt;code&gt;index.ts&lt;/code&gt; API Boundary:&lt;/strong&gt; Your component acts like a strict NPM package. &lt;code&gt;index.ts&lt;/code&gt; ONLY exports what the rest of the application needs to know. The dirty work remains hidden.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Zero Global Namespace Pollution:&lt;/strong&gt; That weird utility function that formats a specific table date? It stays in &lt;code&gt;_util.ts&lt;/code&gt;. Your global &lt;code&gt;src/utils&lt;/code&gt; folder is now strictly reserved for truly global helpers.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Instant Scalability:&lt;/strong&gt; When a component grows, it doesn’t rot. It simply utilizes its private ecosystem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop treating components as just files. Treat them as domains. Keep It Private.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Want to see it in action? Check out the official boilerplate on GitHub: [&lt;a href="https://github.com/Miladxsar23/kip-pattern" rel="noopener noreferrer"&gt;https://github.com/Miladxsar23/kip-pattern&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>designpatterns</category>
      <category>architecture</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>Build Multi-Step Forms in React Without the Headache – Introducing SmartStepper</title>
      <dc:creator>milad shiriyan</dc:creator>
      <pubDate>Mon, 30 Jun 2025 14:08:25 +0000</pubDate>
      <link>https://forem.com/miladxsar23/build-multi-step-forms-in-react-without-the-headache-introducing-smartstepper-c5j</link>
      <guid>https://forem.com/miladxsar23/build-multi-step-forms-in-react-without-the-headache-introducing-smartstepper-c5j</guid>
      <description>&lt;h1&gt;
  
  
  Build Multi-Step Forms in React Without the Headache – Introducing SmartStepper
&lt;/h1&gt;

&lt;p&gt;Forms are essential to most apps – onboarding, checkouts, surveys, you name it. But when it comes to &lt;strong&gt;multi-step forms&lt;/strong&gt;, things can quickly become messy:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step navigation logic scattered across components
&lt;/li&gt;
&lt;li&gt;Validation rules mixed with UI code
&lt;/li&gt;
&lt;li&gt;Tedious state management
&lt;/li&gt;
&lt;li&gt;Hard to reuse or scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's exactly why I built &lt;strong&gt;&lt;a href="https://github.com/Miladxsar23/smartstepper" rel="noopener noreferrer"&gt;SmartStepper&lt;/a&gt;&lt;/strong&gt; — a &lt;strong&gt;config-based React utility&lt;/strong&gt; for building smart, clean, multi-step forms.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why SmartStepper?
&lt;/h2&gt;

&lt;p&gt;SmartStepper takes a different approach. Instead of imperative navigation and state juggling, you define your form flow declaratively in one place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Steps and how they connect (&lt;code&gt;next&lt;/code&gt;, &lt;code&gt;previous&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Validation rules per step&lt;/li&gt;
&lt;li&gt;Optional view logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All inside a &lt;strong&gt;single config object&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Example
&lt;/h2&gt;

&lt;p&gt;Here’s a simple 3-step form config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SmartStepperConfig&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;confirm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;orchesration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;confirm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;validations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Full Name is required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email is required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="na"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;views&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserInfoStep&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;AddressStep&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ConfirmStep&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FieldValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Final submission&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Form submitted successfully!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;npm: &lt;a href="https://www.npmjs.com/package/smartstepper" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/smartstepper&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
