{
    "componentChunkName": "component---src-pages-blog-markdown-remark-fields-slug-js",
    "path": "/blog/react-bootstrap-forms",
    "result": {"data":{"markdownRemark":{"html":"<p>Forms are the most common surface where a React application meets the user. Login, signup, checkout, settings, contact. Each has the same underlying requirements: consistent styling, responsive layout, clean validation, accessible error messaging, and code that stays maintainable as the field list grows.</p>\n<p>React Bootstrap solves a large share of that work out of the box. The library wraps Bootstrap’s CSS framework in React components that handle styling, layout, and accessibility wiring so application code can focus on data and behavior. This guide walks through building a form from installation to submission, with validation, styling, and a real SuperTokens authentication integration covered along the way.</p>\n<h2 id=\"what-are-react-bootstrap-forms\" style=\"position:relative;\"><a href=\"#what-are-react-bootstrap-forms\" aria-label=\"what are react bootstrap forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Are React Bootstrap Forms?</h2>\n<p>React Bootstrap is a React component library that ships Bootstrap-styled components with idiomatic React APIs. With plain Bootstrap, you write raw class names by hand, <code class=\"language-text\">form-group mb-3</code>, <code class=\"language-text\">form-control</code>, and so on. React Bootstrap replaces that with purpose-built components like <code class=\"language-text\">&lt;Form.Group></code> and <code class=\"language-text\">&lt;Form.Control></code> that produce the same markup underneath.</p>\n<p>The result is form code that feels native to React while staying fully compatible with Bootstrap’s styling and documentation.</p>\n<h3 id=\"core-form-components\" style=\"position:relative;\"><a href=\"#core-form-components\" aria-label=\"core form components permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Core Form Components</h3>\n<p>React Bootstrap forms are built from a small set of composable components:</p>\n<ul>\n<li><code class=\"language-text\">&lt;Form></code> is the root element, accepting <code class=\"language-text\">validated</code> and <code class=\"language-text\">onSubmit</code> props.</li>\n<li><code class=\"language-text\">&lt;Form.Group></code> wraps a single field. Its <code class=\"language-text\">controlId</code> prop wires the label to the input for accessibility.</li>\n<li><code class=\"language-text\">&lt;Form.Label></code> renders an accessible label for the field.</li>\n<li><code class=\"language-text\">&lt;Form.Control></code> is the actual input element. Use the <code class=\"language-text\">type</code> prop for variants like <code class=\"language-text\">email</code> or <code class=\"language-text\">password</code>, or swap the underlying element with <code class=\"language-text\">as=\"textarea\"</code> or <code class=\"language-text\">as=\"select\"</code>.</li>\n<li><code class=\"language-text\">&lt;Form.Control.Feedback></code> shows validation messages, controlled by <code class=\"language-text\">type=\"valid\"</code> or <code class=\"language-text\">type=\"invalid\"</code>.</li>\n<li><code class=\"language-text\">&lt;Form.Check></code> renders checkboxes and radio buttons.</li>\n<li><code class=\"language-text\">&lt;Form.Text></code> renders helper text beneath a field.</li>\n</ul>\n<p>These components map one-to-one onto Bootstrap’s form documentation, so anything described there translates directly into React Bootstrap code.</p>\n<h2 id=\"why-choose-react-bootstrap-for-form-uis\" style=\"position:relative;\"><a href=\"#why-choose-react-bootstrap-for-form-uis\" aria-label=\"why choose react bootstrap for form uis permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Choose React Bootstrap for Form UIs?</h2>\n<ul>\n<li><strong>Prebuilt, consistent styling:</strong> Bootstrap’s design system covers spacing, typography, color, and component states. Using <code class=\"language-text\">React Bootstrap</code> inherits all of that without writing CSS, so forms in a settings page look like forms in a signup flow.</li>\n<li><strong>Responsive layout utilities:</strong> Bootstrap’s 12-column grid is exposed through <code class=\"language-text\">&lt;Row></code> and <code class=\"language-text\">&lt;Col></code>, plus spacing, flex, and display utility classes. A two-column desktop layout collapsing to a single column on mobile takes one prop, not a media query.</li>\n<li><strong>Accessibility by default:</strong> Setting <code class=\"language-text\">controlId</code> on <code class=\"language-text\">&lt;Form.Group></code> automatically associates the label with the input via matching <code class=\"language-text\">id</code> and <code class=\"language-text\">htmlFor</code> attributes. This is one of the most commonly missed pieces in hand-rolled forms.</li>\n</ul>\n<p>The tradeoff is opinionation: forms built with React Bootstrap look like Bootstrap forms. For products with a strong custom design system, a headless library like React Hook Form paired with Tailwind is usually a better fit. For everything else, the speed and consistency wins outweigh the visual constraints.</p>\n<h2 id=\"how-to-install-and-configure-react-bootstrap\" style=\"position:relative;\"><a href=\"#how-to-install-and-configure-react-bootstrap\" aria-label=\"how to install and configure react bootstrap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Install and Configure React Bootstrap</h2>\n<p>The library requires two packages: <code class=\"language-text\">react-bootstrap</code> for the components and <code class=\"language-text\">bootstrap</code> for the underlying CSS.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"63320940787131400000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npm install react-bootstrap bootstrap\n# or\nyarn add react-bootstrap bootstrap`, `63320940787131400000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> react-bootstrap bootstrap\n<span class=\"token comment\"># or</span>\n<span class=\"token function\">yarn</span> <span class=\"token function\">add</span> react-bootstrap bootstrap</code></pre></div>\n<p>Then import the Bootstrap stylesheet once at the application entry point, typically <code class=\"language-text\">main.jsx</code> or <code class=\"language-text\">App.js</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"72191708717276045000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import 'bootstrap/dist/css/bootstrap.min.css';`, `72191708717276045000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token string\">'bootstrap/dist/css/bootstrap.min.css'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This import order matters. The Bootstrap CSS should load before any custom stylesheets so application-specific overrides take precedence. Components are imported individually rather than from a top-level barrel, which keeps the bundle lean:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"29042605336300655000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import Form from 'react-bootstrap/Form';\nimport Button from 'react-bootstrap/Button';`, `29042605336300655000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"how-to-create-a-basic-form-with-react-bootstrap\" style=\"position:relative;\"><a href=\"#how-to-create-a-basic-form-with-react-bootstrap\" aria-label=\"how to create a basic form with react bootstrap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Create a Basic Form with React Bootstrap</h2>\n<p>The smallest useful form has a label, an input, and a submit button:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"5191493027974215000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useState } from 'react';\nimport Form from 'react-bootstrap/Form';\nimport Button from 'react-bootstrap/Button';\n\nexport default function ContactForm() {\n  const [submitted, setSubmitted] = useState(null);\n\n  const handleSubmit = (e) => {\n    e.preventDefault();\n    const formData = new FormData(e.currentTarget);\n    setSubmitted({\n      email: formData.get('email'),\n      message: formData.get('message'),\n    });\n  };\n\n  return (\n    <Form onSubmit={handleSubmit}>\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;contactEmail&quot;>\n        <Form.Label>Email address</Form.Label>\n        <Form.Control type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;name@example.com&quot; />\n        <Form.Text className=&quot;text-muted&quot;>\n          Used only to reply to your message.\n        </Form.Text>\n      </Form.Group>\n\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;contactMessage&quot;>\n        <Form.Label>Message</Form.Label>\n        <Form.Control as=&quot;textarea&quot; name=&quot;message&quot; rows={4} />\n      </Form.Group>\n\n      <Form.Check\n        type=&quot;checkbox&quot;\n        id=&quot;acceptTerms&quot;\n        label=&quot;Accept the terms of service&quot;\n        className=&quot;mb-3&quot;\n      />\n\n      <Button variant=&quot;primary&quot; type=&quot;submit&quot;>Send</Button>\n    </Form>\n  );\n}`, `5191493027974215000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ContactForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>submitted<span class=\"token punctuation\">,</span> setSubmitted<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> formData <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FormData</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>currentTarget<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setSubmitted</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> formData<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'email'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">message</span><span class=\"token operator\">:</span> formData<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'message'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>contactEmail<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Email address</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>name@example.com<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Text</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text-muted<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          Used only to reply to your message.\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Text</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>contactMessage<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Message</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">as</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>textarea<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>message<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rows</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">4</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Check</span></span>\n        <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>checkbox<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>acceptTerms<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Accept the terms of service<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token attr-name\">variant</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>primary<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Send</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Button</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/5fa57012c24d6f616ce6978d14d19d08/a878e/React-Bootstrap-Basic-Form.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.734177215189874%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAArUlEQVQoz6WRXQ6CMBCEe3EP5R28AwgHwASkFra1/2O6RsKDL4VJ5nG/zM6IpmnR9T3aewetDYpyzjgqQaRBWmMlYmCBnbFQasU0zQghbulqHVNic0IpJYbhgXGcQETw3lfBilwMeAf/BT5nCW0MUkoMizEiVyb9iV92zvO7Z7vbOvy3VC1kfyNWbTHLF5ZlgVIK1trD4zDwco249aXQAOcDd3lGQpqy0rmX9wk/PgUVoKeds1YAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"React-Bootstrap-Basic-Form\"\n        title=\"React-Bootstrap-Basic-Form\"\n        src=\"/static/5fa57012c24d6f616ce6978d14d19d08/f058b/React-Bootstrap-Basic-Form.png\"\n        srcset=\"/static/5fa57012c24d6f616ce6978d14d19d08/c26ae/React-Bootstrap-Basic-Form.png 158w,\n/static/5fa57012c24d6f616ce6978d14d19d08/6bdcf/React-Bootstrap-Basic-Form.png 315w,\n/static/5fa57012c24d6f616ce6978d14d19d08/f058b/React-Bootstrap-Basic-Form.png 630w,\n/static/5fa57012c24d6f616ce6978d14d19d08/40601/React-Bootstrap-Basic-Form.png 945w,\n/static/5fa57012c24d6f616ce6978d14d19d08/78612/React-Bootstrap-Basic-Form.png 1260w,\n/static/5fa57012c24d6f616ce6978d14d19d08/a878e/React-Bootstrap-Basic-Form.png 2048w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>The <code class=\"language-text\">controlId</code> on each <code class=\"language-text\">&lt;Form.Group></code> wires the label to the input via matching <code class=\"language-text\">id</code> and <code class=\"language-text\">htmlFor</code>. The <code class=\"language-text\">className=\"mb-3\"</code> adds Bootstrap’s standard bottom margin between fields. The <code class=\"language-text\">as=\"textarea\"</code> prop changes the underlying element while keeping the Bootstrap styling, and <code class=\"language-text\">as=\"select\"</code> works the same way for dropdowns.</p>\n<h2 id=\"how-to-handle-form-state-and-submission\" style=\"position:relative;\"><a href=\"#how-to-handle-form-state-and-submission\" aria-label=\"how to handle form state and submission permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Handle Form State and Submission</h2>\n<p>React Bootstrap stays out of the way on state management. The recommended pattern uses <code class=\"language-text\">useState</code> with a single state object holding all fields, plus one <code class=\"language-text\">handleChange</code> that updates by <code class=\"language-text\">name</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"43606497752398710000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useState } from 'react';\nimport Form from 'react-bootstrap/Form';\nimport Button from 'react-bootstrap/Button';\n\nexport default function SignupForm() {\n  const [formData, setFormData] = useState({ email: '', password: '' });\n\n  const handleChange = (e) => {\n    const { name, value } = e.target;\n    setFormData((prev) => ({ ...prev, [name]: value }));\n  };\n\n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    console.log('Submitting:', formData);\n  };\n\n  return (\n    <Form onSubmit={handleSubmit}>\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;signupEmail&quot;>\n        <Form.Label>Email</Form.Label>\n        <Form.Control\n          type=&quot;email&quot;\n          name=&quot;email&quot;\n          value={formData.email}\n          onChange={handleChange}\n          required\n        />\n      </Form.Group>\n\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;signupPassword&quot;>\n        <Form.Label>Password</Form.Label>\n        <Form.Control\n          type=&quot;password&quot;\n          name=&quot;password&quot;\n          value={formData.password}\n          onChange={handleChange}\n          required\n        />\n      </Form.Group>\n\n      <Button type=&quot;submit&quot;>Create account</Button>\n    </Form>\n  );\n}`, `43606497752398710000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">SignupForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>formData<span class=\"token punctuation\">,</span> setFormData<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleChange</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> value <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setFormData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">prev</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>prev<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>name<span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Submitting:'</span><span class=\"token punctuation\">,</span> formData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>signupEmail<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Email</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>formData<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleChange<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">required</span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>signupPassword<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Password</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>password<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>password<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>formData<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleChange<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">required</span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Create account</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Button</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e852a172bb191b5a818be45d07f53882/a878e/React-Bootstrap-State-Form.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.10126582278481%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA9ElEQVQoz6WRTU/DMAyG+//PSJw58iuQQJQT0H3wISEO44TEto6RtE1i50FJx4SEthWw9B5iOY/92kU1GnP/8MjNbcVkesd4MmWxXJIixshvozDW0jQt6w+D9yFD/qPC2mZL/ytEVQmqCZAm7HBeEP1ZJJLyuhdGhKCC9a63LG0N9I8vaIJ9j5zbNd0WvLF8eg3H55Gr53SAmKEpXmYzyvKSUVXlSYeupDgpA0dnwsWTZqAXzV2NscwXC+rVCkk5jdn+bm2A0RmiW4N6Wic4F+hcwIdURFbnJOcOKTUt5rXh9e0d2/p8nCEf9wL7pTLA0mEly59dMQ9+2PtOMQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"React-Bootstrap-State-Form\"\n        title=\"React-Bootstrap-State-Form\"\n        src=\"/static/e852a172bb191b5a818be45d07f53882/f058b/React-Bootstrap-State-Form.png\"\n        srcset=\"/static/e852a172bb191b5a818be45d07f53882/c26ae/React-Bootstrap-State-Form.png 158w,\n/static/e852a172bb191b5a818be45d07f53882/6bdcf/React-Bootstrap-State-Form.png 315w,\n/static/e852a172bb191b5a818be45d07f53882/f058b/React-Bootstrap-State-Form.png 630w,\n/static/e852a172bb191b5a818be45d07f53882/40601/React-Bootstrap-State-Form.png 945w,\n/static/e852a172bb191b5a818be45d07f53882/78612/React-Bootstrap-State-Form.png 1260w,\n/static/e852a172bb191b5a818be45d07f53882/a878e/React-Bootstrap-State-Form.png 2048w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Key conventions: every input has a <code class=\"language-text\">name</code> matching a key in <code class=\"language-text\">formData</code>, <code class=\"language-text\">handleChange</code> reads <code class=\"language-text\">e.target.name</code> to update the right field, and <code class=\"language-text\">handleSubmit</code> always starts with <code class=\"language-text\">e.preventDefault()</code> to stop the browser’s default navigation behavior.</p>\n<h2 id=\"how-to-add-validation-to-react-bootstrap-forms\" style=\"position:relative;\"><a href=\"#how-to-add-validation-to-react-bootstrap-forms\" aria-label=\"how to add validation to react bootstrap forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Add Validation to React Bootstrap Forms</h2>\n<p><code class=\"language-text\">React Bootstrap</code> supports two layers of validation: native HTML5 attributes (<code class=\"language-text\">required</code>, <code class=\"language-text\">minLength</code>, <code class=\"language-text\">maxLength</code>, <code class=\"language-text\">pattern</code>) and the <code class=\"language-text\">validated</code> prop on <code class=\"language-text\">&lt;Form></code>, which controls when Bootstrap applies its valid/invalid styling. The standard pattern uses a <code class=\"language-text\">validated</code> state flag that flips after the first submit attempt:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"41874504548001430000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useState } from 'react';\nimport Form from 'react-bootstrap/Form';\nimport Button from 'react-bootstrap/Button';\n\nexport default function ValidatedForm() {\n  const [validated, setValidated] = useState(false);\n\n  const handleSubmit = (e) => {\n    const form = e.currentTarget;\n    e.preventDefault();\n\n    if (form.checkValidity() === false) {\n      e.stopPropagation();\n      setValidated(true);\n      return;\n    }\n\n    setValidated(true);\n    // proceed with submission\n  };\n\n  return (\n    <Form noValidate validated={validated} onSubmit={handleSubmit}>\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;userEmail&quot;>\n        <Form.Label>Email</Form.Label>\n        <Form.Control\n          type=&quot;email&quot;\n          required\n          pattern=&quot;[^@\\s]+@[^@\\s]+\\.[^@\\s]+&quot;\n        />\n        <Form.Control.Feedback type=&quot;invalid&quot;>\n          Please enter a valid email address.\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;userPassword&quot;>\n        <Form.Label>Password</Form.Label>\n        <Form.Control type=&quot;password&quot; required minLength={8} />\n        <Form.Control.Feedback type=&quot;invalid&quot;>\n          Password must be at least 8 characters.\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      <Button type=&quot;submit&quot;>Submit</Button>\n    </Form>\n  );\n}`, `41874504548001430000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ValidatedForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>validated<span class=\"token punctuation\">,</span> setValidated<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> form <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>currentTarget<span class=\"token punctuation\">;</span>\n    e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>form<span class=\"token punctuation\">.</span><span class=\"token function\">checkValidity</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      e<span class=\"token punctuation\">.</span><span class=\"token function\">stopPropagation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token function\">setValidated</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">setValidated</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// proceed with submission</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form</span></span> <span class=\"token attr-name\">noValidate</span> <span class=\"token attr-name\">validated</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>validated<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>userEmail<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Email</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">required</span>\n          <span class=\"token attr-name\">pattern</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>[^@\\s]+@[^@\\s]+\\.[^@\\s]+<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control.Feedback</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>invalid<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          Please enter a valid email address.\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Control.Feedback</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>userPassword<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Password</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>password<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">required</span> <span class=\"token attr-name\">minLength</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">8</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control.Feedback</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>invalid<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          Password must be at least 8 characters.\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Control.Feedback</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Submit</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Button</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/5b2311a3205479105e3863dcf2ca2db5/a878e/React-Bootstrap-Validated-Form.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 48.10126582278481%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwElEQVQoz62RsQ7CMAxE+/8zX8FfICEYaHckYGFioU2bgNLYzqG4La1ALC2WTjpneD7H2SEvsN3tcTpfkCrGiCWVEbEaFoGIKHCJMmvdYkgKQtIFy54+IBDPhiFGBGY8QtsB4StAPCRiXroJWFdebYDiqucAS1z+h+uccbzF/jA6qJ/67cdEnU+HHNUDxVs426A0DqWxqIyFaR7qy09fO+3vVYOqdmgDw7f0lgLTYxsIYSri337oiSAyppQhIf5cL9KZFDATC7lKAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"React-Bootstrap-Validated-Form\"\n        title=\"React-Bootstrap-Validated-Form\"\n        src=\"/static/5b2311a3205479105e3863dcf2ca2db5/f058b/React-Bootstrap-Validated-Form.png\"\n        srcset=\"/static/5b2311a3205479105e3863dcf2ca2db5/c26ae/React-Bootstrap-Validated-Form.png 158w,\n/static/5b2311a3205479105e3863dcf2ca2db5/6bdcf/React-Bootstrap-Validated-Form.png 315w,\n/static/5b2311a3205479105e3863dcf2ca2db5/f058b/React-Bootstrap-Validated-Form.png 630w,\n/static/5b2311a3205479105e3863dcf2ca2db5/40601/React-Bootstrap-Validated-Form.png 945w,\n/static/5b2311a3205479105e3863dcf2ca2db5/78612/React-Bootstrap-Validated-Form.png 1260w,\n/static/5b2311a3205479105e3863dcf2ca2db5/a878e/React-Bootstrap-Validated-Form.png 2048w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>The <code class=\"language-text\">noValidate</code> attribute disables the browser’s native validation popups, leaving Bootstrap’s styling in charge. <code class=\"language-text\">&lt;Form.Control.Feedback type=\"invalid\"></code> only renders when <code class=\"language-text\">validated</code> is true and the input fails its constraints. For complex validation (cross-field rules, async checks), pair <code class=\"language-text\">React Bootstrap</code> with a library like <code class=\"language-text\">Yup</code>, <code class=\"language-text\">Zod</code>, or <code class=\"language-text\">React Hook Form</code>. The validation library handles the rules, and <code class=\"language-text\">React Bootstrap</code> handles the display.</p>\n<h2 id=\"how-to-style-forms-and-layout\" style=\"position:relative;\"><a href=\"#how-to-style-forms-and-layout\" aria-label=\"how to style forms and layout permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Style Forms and Layout</h2>\n<p>Multi-column layouts come from <code class=\"language-text\">&lt;Row></code> and <code class=\"language-text\">&lt;Col></code> working with <code class=\"language-text\">&lt;Form.Group></code>. The <code class=\"language-text\">as={Col}</code> prop tells <code class=\"language-text\">&lt;Form.Group></code> to render as a column:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"7952309436352456000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import Form from 'react-bootstrap/Form';\nimport Row from 'react-bootstrap/Row';\nimport Col from 'react-bootstrap/Col';\nimport Button from 'react-bootstrap/Button';\n\nexport default function AddressForm() {\n  return (\n    <Form>\n      <Row className=&quot;mb-3&quot;>\n        <Form.Group as={Col} md=&quot;6&quot; controlId=&quot;firstName&quot;>\n          <Form.Label>First name</Form.Label>\n          <Form.Control type=&quot;text&quot; defaultValue=&quot;Jane&quot; />\n        </Form.Group>\n        <Form.Group as={Col} md=&quot;6&quot; controlId=&quot;lastName&quot;>\n          <Form.Label>Last name</Form.Label>\n          <Form.Control type=&quot;text&quot; defaultValue=&quot;Doe&quot; />\n        </Form.Group>\n      </Row>\n\n      <Row className=&quot;mb-3&quot;>\n        <Form.Group as={Col} md=&quot;12&quot; controlId=&quot;address&quot;>\n          <Form.Label>Street address</Form.Label>\n          <Form.Control type=&quot;text&quot; placeholder=&quot;1234 Main St&quot; />\n        </Form.Group>\n      </Row>\n\n      <Row className=&quot;mb-3&quot;>\n        <Form.Group as={Col} md=&quot;6&quot; controlId=&quot;city&quot;>\n          <Form.Label>City</Form.Label>\n          <Form.Control type=&quot;text&quot; />\n        </Form.Group>\n        <Form.Group as={Col} md=&quot;3&quot; controlId=&quot;state&quot;>\n          <Form.Label>State</Form.Label>\n          <Form.Select>\n            <option>CA</option>\n            <option>NY</option>\n            <option>TX</option>\n            <option>WA</option>\n          </Form.Select>\n        </Form.Group>\n        <Form.Group as={Col} md=&quot;3&quot; controlId=&quot;zip&quot;>\n          <Form.Label>ZIP</Form.Label>\n          <Form.Control type=&quot;text&quot; />\n        </Form.Group>\n      </Row>\n\n      <Button type=&quot;submit&quot;>Save address</Button>\n    </Form>\n  );\n}`, `7952309436352456000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Row <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Row'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Col <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Col'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">AddressForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Row</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">as</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Col<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">md</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>6<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>firstName<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">First name</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">defaultValue</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Jane<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">as</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Col<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">md</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>6<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>lastName<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Last name</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">defaultValue</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Doe<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Row</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Row</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">as</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Col<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">md</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>12<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>address<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Street address</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1234 Main St<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Row</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Row</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">as</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Col<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">md</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>6<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>city<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">City</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">as</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Col<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">md</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>state<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">State</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Select</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">CA</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">NY</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">TX</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">WA</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>option</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Select</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">as</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Col<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">md</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>zip<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">ZIP</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Row</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Save address</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Button</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">md=\"6\"</code> means each field takes six out of twelve columns on medium screens and up. On smaller screens, columns stack automatically. Bootstrap’s spacing utility classes control padding and margins inline: <code class=\"language-text\">mb-3</code> adds bottom margin, <code class=\"language-text\">px-2</code> adds horizontal padding, <code class=\"language-text\">mt-4</code> adds top margin. The numbers go from 0 to 5, and the prefixes <code class=\"language-text\">mb-</code>, <code class=\"language-text\">mt-</code>, <code class=\"language-text\">mx-</code>, <code class=\"language-text\">my-</code>, <code class=\"language-text\">px-</code>, and <code class=\"language-text\">py-</code> cover most form layout needs.</p>\n<h2 id=\"how-to-ensure-accessibility-in-your-forms\" style=\"position:relative;\"><a href=\"#how-to-ensure-accessibility-in-your-forms\" aria-label=\"how to ensure accessibility in your forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Ensure Accessibility in Your Forms</h2>\n<p>React Bootstrap handles the most important accessibility wiring automatically when forms are structured correctly. Two rules cover the rest:</p>\n<p><strong>Always set <code class=\"language-text\">controlId</code> on <code class=\"language-text\">&lt;Form.Group></code>.</strong> This generates the matching <code class=\"language-text\">id</code> on the input and <code class=\"language-text\">htmlFor</code> on the label. Without it, the label and input have no programmatic connection, and screen readers will not announce the label when the input receives focus.</p>\n<p><strong>Announce errors to assistive technology.</strong> Bootstrap’s invalid styling is visual. To make validation errors equally visible to screen reader users, add <code class=\"language-text\">aria-invalid</code> to the input when it’s in an error state, and <code class=\"language-text\">role=\"alert\"</code> on the feedback element:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"73544618635659730000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useState } from 'react';\nimport Form from 'react-bootstrap/Form';\nimport Button from 'react-bootstrap/Button';\n\nexport default function AccessibleForm() {\n  const [email, setEmail] = useState('');\n  const [emailError, setEmailError] = useState('');\n\n  const handleBlur = () => {\n    if (!email) {\n      setEmailError('Email is required.');\n    } else if (!/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+\\$/.test(email)) {\n      setEmailError('That email address does not look valid.');\n    } else {\n      setEmailError('');\n    }\n  };\n\n  return (\n    <Form onSubmit={(e) => { e.preventDefault(); handleBlur(); }}>\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;accessibleEmail&quot;>\n        <Form.Label>Email address</Form.Label>\n        <Form.Control\n          type=&quot;email&quot;\n          value={email}\n          onChange={(e) => setEmail(e.target.value)}\n          onBlur={handleBlur}\n          isInvalid={emailError !== ''}\n          aria-invalid={emailError !== ''}\n          aria-describedby=&quot;emailError&quot;\n        />\n        <Form.Control.Feedback type=&quot;invalid&quot; role=&quot;alert&quot; id=&quot;emailError&quot;>\n          {emailError}\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      <Button type=&quot;submit&quot;>Submit</Button>\n    </Form>\n  );\n}`, `73544618635659730000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">AccessibleForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>email<span class=\"token punctuation\">,</span> setEmail<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>emailError<span class=\"token punctuation\">,</span> setEmailError<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleBlur</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>email<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setEmailError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Email is required.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setEmailError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'That email address does not look valid.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setEmailError</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token function\">handleBlur</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>accessibleEmail<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Email address</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>email<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setEmail</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onBlur</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleBlur<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">isInvalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>emailError <span class=\"token operator\">!==</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">aria-invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>emailError <span class=\"token operator\">!==</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">aria-describedby</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>emailError<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control.Feedback</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>invalid<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>alert<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>emailError<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>emailError<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Control.Feedback</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Submit</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Button</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Beyond those: ensure visible focus indicators are not removed by CSS resets, color is not the only signal of an error, and the form is fully usable with keyboard alone.</p>\n<h2 id=\"how-supertokens-enhances-react-bootstrap-form-based-authentication\" style=\"position:relative;\"><a href=\"#how-supertokens-enhances-react-bootstrap-form-based-authentication\" aria-label=\"how supertokens enhances react bootstrap form based authentication permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How SuperTokens Enhances React Bootstrap Form-Based Authentication</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9e2ba8940c8f1123465e76174989af40/d0c2f/Supertokens.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 47.46835443037975%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABqElEQVQoz02PbW/aMBSFMy0kvo6d2InjkDgJBEJJeX8tpGzVoIxO2mhFK6H9LH7yBJGqPTrf7nmke7RR5n8r5Pdxp+x3eqHXj8Q0U+MsnOTJXRK24jAQnu8L3xdSSiGE53lFUVwul81mow1iPlRsrthK8bVy18qdKa/sNleDYpGn4+Iuz3Pf9wHwJwCg6zoAaJ3AHtbtpWKl4quQz+p81lBP8+nDbLaZjlaLxXA8aWYZIQT+w7qhxS7pSrsv7YGgA+G0GZnk7fPp/eP942m7/3N8fTm87LbbKKzr+leEACFU+QghzaVW5JCUWS1mtV163G1/7/fPP3avb6fz+e/pdHo7Hn8+734dDo9liTE2b1BKGGOahcGxsCA4oDi0rbaK+t1u7763XC4f16vyYb6YjsbDXt5qSF+gG7VaTcowa91rAIABCCAHg4OBAhIuD4MgjaMsVa0kakQyFJzbxDSMSjYMw+NuohpXGd0GQBUAauiSs0YcN5NrsjRhGByzVtUQArOmUz+V2UD7XF9hXo/G9RFicZtyhzJqWcgE0zCrBoCpf6HJKBge/gGUPjjwL5U6kAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Supertokens\"\n        title=\"Supertokens\"\n        src=\"/static/9e2ba8940c8f1123465e76174989af40/f058b/Supertokens.png\"\n        srcset=\"/static/9e2ba8940c8f1123465e76174989af40/c26ae/Supertokens.png 158w,\n/static/9e2ba8940c8f1123465e76174989af40/6bdcf/Supertokens.png 315w,\n/static/9e2ba8940c8f1123465e76174989af40/f058b/Supertokens.png 630w,\n/static/9e2ba8940c8f1123465e76174989af40/40601/Supertokens.png 945w,\n/static/9e2ba8940c8f1123465e76174989af40/78612/Supertokens.png 1260w,\n/static/9e2ba8940c8f1123465e76174989af40/d0c2f/Supertokens.png 1362w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Authentication forms are where the styling and validation work pays off most, because login and signup are usually the highest-traffic forms in any application. <a href=\"https://supertokens.com\" target=\"_blank\" rel=\"nofollow\">SuperTokens</a> is an open-source authentication solution that handles credentials, sessions, and security primitives, with a clean integration path for React Bootstrap.</p>\n<p>The integration uses <code class=\"language-text\">supertokens-web-js</code> on the frontend, which exposes a <code class=\"language-text\">signIn</code> function the form calls on submit. SuperTokens handles the credential check, password hashing on the backend, session creation, and secure cookie management. The application code only deals with the UI.</p>\n<p>First, initialize SuperTokens once at app startup, typically in <code class=\"language-text\">main.jsx</code> right before rendering:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"55559315073808890000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import SuperTokens from 'supertokens-web-js';\nimport Session from 'supertokens-web-js/recipe/session';\nimport EmailPassword from 'supertokens-web-js/recipe/emailpassword';\n\nSuperTokens.init({\n  appInfo: {\n    appName: 'Your App',\n    apiDomain: 'http://localhost:3001',\n    apiBasePath: '/auth',\n  },\n  recipeList: [\n    Session.init(),\n    EmailPassword.init(),\n  ],\n});`, `55559315073808890000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> SuperTokens <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-web-js'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Session <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-web-js/recipe/session'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> EmailPassword <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-web-js/recipe/emailpassword'</span><span class=\"token punctuation\">;</span>\n\nSuperTokens<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">appInfo</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">appName</span><span class=\"token operator\">:</span> <span class=\"token string\">'Your App'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">apiDomain</span><span class=\"token operator\">:</span> <span class=\"token string\">'http://localhost:3001'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">apiBasePath</span><span class=\"token operator\">:</span> <span class=\"token string\">'/auth'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">recipeList</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    Session<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    EmailPassword<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Then build the login form using React Bootstrap and call <code class=\"language-text\">signIn</code> from the submit handler:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"99357221096544830000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useState } from 'react';\nimport Form from 'react-bootstrap/Form';\nimport Button from 'react-bootstrap/Button';\nimport { signIn } from 'supertokens-web-js/recipe/emailpassword';\n\nexport default function LoginForm() {\n  const [credentials, setCredentials] = useState({ email: '', password: '' });\n  const [error, setError] = useState('');\n  const [fieldErrors, setFieldErrors] = useState({});\n  const [loading, setLoading] = useState(false);\n\n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    setError('');\n    setFieldErrors({});\n    setLoading(true);\n\n    try {\n      const response = await signIn({\n        formFields: [\n          { id: 'email', value: credentials.email },\n          { id: 'password', value: credentials.password },\n        ],\n      });\n\n      if (response.status === 'FIELD_ERROR') {\n        // SuperTokens validators failed on the backend\n        const errors = {};\n        response.formFields.forEach((f) => {\n          errors[f.id] = f.error;\n        });\n        setFieldErrors(errors);\n      } else if (response.status === 'WRONG_CREDENTIALS_ERROR') {\n        setError('Email or password is incorrect.');\n      } else if (response.status === 'SIGN_IN_NOT_ALLOWED') {\n        setError(response.reason);\n      } else if (response.status === 'OK') {\n        // Session cookie now set automatically by SuperTokens.\n        window.location.href = '/dashboard';\n      }\n    } catch (err) {\n      setError('Something went wrong. Please try again.');\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <Form onSubmit={handleSubmit}>\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;loginEmail&quot;>\n        <Form.Label>Email</Form.Label>\n        <Form.Control\n          type=&quot;email&quot;\n          value={credentials.email}\n          onChange={(e) => setCredentials({ ...credentials, email: e.target.value })}\n          isInvalid={!!fieldErrors.email}\n          required\n        />\n        <Form.Control.Feedback type=&quot;invalid&quot; role=&quot;alert&quot;>\n          {fieldErrors.email}\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      <Form.Group className=&quot;mb-3&quot; controlId=&quot;loginPassword&quot;>\n        <Form.Label>Password</Form.Label>\n        <Form.Control\n          type=&quot;password&quot;\n          value={credentials.password}\n          onChange={(e) => setCredentials({ ...credentials, password: e.target.value })}\n          isInvalid={!!fieldErrors.password}\n          required\n        />\n        <Form.Control.Feedback type=&quot;invalid&quot; role=&quot;alert&quot;>\n          {fieldErrors.password}\n        </Form.Control.Feedback>\n      </Form.Group>\n\n      {error && (\n        <div className=&quot;alert alert-danger&quot; role=&quot;alert&quot;>\n          {error}\n        </div>\n      )}\n\n      <Button type=&quot;submit&quot; disabled={loading}>\n        {loading ? 'Signing in...' : 'Sign in'}\n      </Button>\n    </Form>\n  );\n}`, `99357221096544830000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Form <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Form'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Button <span class=\"token keyword\">from</span> <span class=\"token string\">'react-bootstrap/Button'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> signIn <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-web-js/recipe/emailpassword'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">LoginForm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>credentials<span class=\"token punctuation\">,</span> setCredentials<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>error<span class=\"token punctuation\">,</span> setError<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>fieldErrors<span class=\"token punctuation\">,</span> setFieldErrors<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>loading<span class=\"token punctuation\">,</span> setLoading<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setError</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setFieldErrors</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setLoading</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">signIn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">formFields</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n          <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token string\">'email'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> credentials<span class=\"token punctuation\">.</span>email <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n          <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token string\">'password'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> credentials<span class=\"token punctuation\">.</span>password <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'FIELD_ERROR'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// SuperTokens validators failed on the backend</span>\n        <span class=\"token keyword\">const</span> errors <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        response<span class=\"token punctuation\">.</span>formFields<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">f</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          errors<span class=\"token punctuation\">[</span>f<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> f<span class=\"token punctuation\">.</span>error<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">setFieldErrors</span><span class=\"token punctuation\">(</span>errors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'WRONG_CREDENTIALS_ERROR'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Email or password is incorrect.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'SIGN_IN_NOT_ALLOWED'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setError</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>reason<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'OK'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Session cookie now set automatically by SuperTokens.</span>\n        window<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">.</span>href <span class=\"token operator\">=</span> <span class=\"token string\">'/dashboard'</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Something went wrong. Please try again.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setLoading</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>loginEmail<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Email</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>credentials<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setCredentials</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>credentials<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">isInvalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>fieldErrors<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">required</span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control.Feedback</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>invalid<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>alert<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>fieldErrors<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Control.Feedback</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>loginPassword<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Password</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>password<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>credentials<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setCredentials</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>credentials<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">isInvalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>fieldErrors<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">required</span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control.Feedback</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>invalid<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>alert<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>fieldErrors<span class=\"token punctuation\">.</span>password<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Control.Feedback</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token punctuation\">{</span>error <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>alert alert-danger<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>alert<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>error<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">disabled</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>loading<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token punctuation\">{</span>loading <span class=\"token operator\">?</span> <span class=\"token string\">'Signing in...'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'Sign in'</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Button</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/24edb21c9ecca4b1ca83b17b52f281bd/a878e/SuperTokens-Login-Form.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABUUlEQVQ4y83RTUsCQRwG8P0OQWCilESHCDz0LbqFNz9Ft6CgSyD0dWxfXFdJjSLRbTN309W01N0MjM7uy+wTzoqiaYR0aODHzOzMPPNnlgmEthAIR6ZCEWyEFwtubmNtPYiDWAwnFwkcnZ3iOHGOw3gce9F9RHZ2wXBCGryQBieItOdTaXC8iCTLI8kK313ySEkZZHMFSFd5ZHJ5iFKWnmO5FBjHcWBZNojnwbZtDIcWPM/Dqo0pywoeqyqqqoZWqw1V1WAYBgghcF0XZCFC12e4/n6GwMN8PaO57To/shx7xugbrVDSimDvC+CVa7ByHsXOE8q9OmRTh2w2IBu6PzamlLcmKu+tCaX/jNqg6wfetVXcNB6onFbCbbOC0osGuVMfq9G+/FqbqJhNND560Mfqgy7an30/cNXHH/24eTRw0cJvLLtk5cClFeKP2/8P/AKpFrUBitymwgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"SuperTokens-Login-Form\"\n        title=\"SuperTokens-Login-Form\"\n        src=\"/static/24edb21c9ecca4b1ca83b17b52f281bd/f058b/SuperTokens-Login-Form.png\"\n        srcset=\"/static/24edb21c9ecca4b1ca83b17b52f281bd/c26ae/SuperTokens-Login-Form.png 158w,\n/static/24edb21c9ecca4b1ca83b17b52f281bd/6bdcf/SuperTokens-Login-Form.png 315w,\n/static/24edb21c9ecca4b1ca83b17b52f281bd/f058b/SuperTokens-Login-Form.png 630w,\n/static/24edb21c9ecca4b1ca83b17b52f281bd/40601/SuperTokens-Login-Form.png 945w,\n/static/24edb21c9ecca4b1ca83b17b52f281bd/78612/SuperTokens-Login-Form.png 1260w,\n/static/24edb21c9ecca4b1ca83b17b52f281bd/a878e/SuperTokens-Login-Form.png 2048w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/4027d3987ad58d1b14c5ede6247471cf/a878e/SuperTokens-Login-Error.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.291139240506325%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZklEQVQ4y7XSSUsCYRgH8PkKHaKkwqJDBB36GtGt5Vt0Cwq6RNFXqXRMknJJrUPUaC7pLJpbMxMu6aS2WadZ/jFOC+h0CKYXfrzL8/DnObzE0IgdhvFvw6PmbGMTGBi0YW5hEWs7W1jZWMfq9ibml5YxPTML++QUCCfphtPlhoP8sedw/Wp3n8ThkRf+8Cm8JyH4QmF4jn1wuT1wkAcgYPEiYvEEUjQDmmHB8wJyuTxkWYaqqlAUxZRe6/VVM51QUVXIivIniqoYE4a4KAL0JWJ3WaRrRVxXCqDvS+AkAVyjh2RGBNPgUWxVjMAAQ8GXPMdZJoYgE4E/dYEgTSFRzoGVhG4zI/Hdna7f9tHf0/US8s2yEUgJLK7ELKIih6iYQUTguiieRUTkPu8sYuUbJGsFU/FqDhlJNAKrTw+oPTd/pdd19dc2Gm+PaHT61TtttN5fjEArv4ymaSBUTeserGD5hP8S+AGgjaVuYXYQvQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"SuperTokens-Login-Error\"\n        title=\"SuperTokens-Login-Error\"\n        src=\"/static/4027d3987ad58d1b14c5ede6247471cf/f058b/SuperTokens-Login-Error.png\"\n        srcset=\"/static/4027d3987ad58d1b14c5ede6247471cf/c26ae/SuperTokens-Login-Error.png 158w,\n/static/4027d3987ad58d1b14c5ede6247471cf/6bdcf/SuperTokens-Login-Error.png 315w,\n/static/4027d3987ad58d1b14c5ede6247471cf/f058b/SuperTokens-Login-Error.png 630w,\n/static/4027d3987ad58d1b14c5ede6247471cf/40601/SuperTokens-Login-Error.png 945w,\n/static/4027d3987ad58d1b14c5ede6247471cf/78612/SuperTokens-Login-Error.png 1260w,\n/static/4027d3987ad58d1b14c5ede6247471cf/a878e/SuperTokens-Login-Error.png 2048w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>The signup flow uses the same pattern with the <code class=\"language-text\">signUp</code> function. SuperTokens enforces its default password policy on the backend (minimum 8 characters, must contain a number), and returns <code class=\"language-text\">FIELD_ERROR</code> with a specific error string when the policy fails:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"28725710227527414000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { signUp } from 'supertokens-web-js/recipe/emailpassword';\n\nconst response = await signUp({\n  formFields: [\n    { id: 'email', value: email },\n    { id: 'password', value: password },\n  ],\n});\n\nif (response.status === 'OK') {\n  // Account created AND signed in in one call\n} else if (response.status === 'FIELD_ERROR') {\n  // Validation failed. response.formFields has per-field errors\n}`, `28725710227527414000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> signUp <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-web-js/recipe/emailpassword'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">signUp</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">formFields</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token string\">'email'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> email <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token string\">'password'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> password <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'OK'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Account created AND signed in in one call</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'FIELD_ERROR'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Validation failed. response.formFields has per-field errors</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e42f70fdf4a17bf6a3e5492f3aba9e97/32b38/SuperTokens-Sign-Up.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABpklEQVQ4y63T3WoTQRTA8X0IQUVFX6H4HN4LXvsQXvoEvoOvUNvG1FSTiyqhKGlJq7Zpm01jZXeb/epmd+frLzOREAXR2A78mDPDzHDOgfFu3rnPolt3Hyzlxu17PHn8iOfPnrLycAXv1VqDufUGq2sbrC7u/YU922pt0em0WW808bjm4fX6fd7v7LDd7bJ3cMCn3i5BGKKNQUiJlGqB/AOFUoq6FniirKiKwkFrtBRg9H9lp5TG8wvBQVryNa/cPMhqBqmNpxymJSdpxUlac5TN9j6nU/aT4mdcurW9N64U0j74McrYOP1OaxTR9APe+iFtP+K1H9AZT9geTegMI9rjCZt+yKYf0BwGtM4i580o5N15wmGpXelenOVIbbBFWgqQv8WOYX5m8aybjWVmGeZ5ThiEJHGMkhKj9VIwhkoIKilmPbxIMuL80jXVXIEdLkOTpogwREQTR17EqEmyFHfHts728Nu+j/9hj2S3T9zrk/W/II6H1IMh9fE/OjpFnp3PHnyxhXnZvVK1c0pp400rRVnPfoL45Vcsr64lXlFU0rq8Jj8A0mVHxFAej2cAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"SuperTokens-Sign-Up\"\n        title=\"SuperTokens-Sign-Up\"\n        src=\"/static/e42f70fdf4a17bf6a3e5492f3aba9e97/f058b/SuperTokens-Sign-Up.png\"\n        srcset=\"/static/e42f70fdf4a17bf6a3e5492f3aba9e97/c26ae/SuperTokens-Sign-Up.png 158w,\n/static/e42f70fdf4a17bf6a3e5492f3aba9e97/6bdcf/SuperTokens-Sign-Up.png 315w,\n/static/e42f70fdf4a17bf6a3e5492f3aba9e97/f058b/SuperTokens-Sign-Up.png 630w,\n/static/e42f70fdf4a17bf6a3e5492f3aba9e97/40601/SuperTokens-Sign-Up.png 945w,\n/static/e42f70fdf4a17bf6a3e5492f3aba9e97/78612/SuperTokens-Sign-Up.png 1260w,\n/static/e42f70fdf4a17bf6a3e5492f3aba9e97/32b38/SuperTokens-Sign-Up.png 1471w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Underneath this integration, SuperTokens provides the security primitives that hand-rolled authentication tends to get wrong: HTTP-only session cookies (tokens never exposed to JavaScript, so they cannot be exfiltrated through XSS), built-in CSRF protection applied automatically to authenticated requests, and automatic session refresh through the SDK’s fetch interceptor.</p>\n<h2 id=\"what-are-best-practices-for-building-react-bootstrap-forms\" style=\"position:relative;\"><a href=\"#what-are-best-practices-for-building-react-bootstrap-forms\" aria-label=\"what are best practices for building react bootstrap forms permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Are Best Practices for Building React Bootstrap Forms?</h2>\n<p>A few patterns consistently produce form code that stays maintainable as the application grows.</p>\n<p><strong>Create reusable field components.</strong> The label-control-feedback trio repeats on every field. Encapsulating it into a single <code class=\"language-text\">&lt;FormField></code> component cuts the boilerplate and centralizes accessibility wiring:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"12550778311934052000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`function FormField({ id, label, type = 'text', error, ...props }) {\n  return (\n    <Form.Group className=&quot;mb-3&quot; controlId={id}>\n      <Form.Label>{label}</Form.Label>\n      <Form.Control\n        type={type}\n        isInvalid={!!error}\n        aria-invalid={!!error}\n        {...props}\n      />\n      {error && (\n        <Form.Control.Feedback type=&quot;invalid&quot; role=&quot;alert&quot;>\n          {error}\n        </Form.Control.Feedback>\n      )}\n    </Form.Group>\n  );\n}`, `12550778311934052000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">FormField</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> id<span class=\"token punctuation\">,</span> label<span class=\"token punctuation\">,</span> type <span class=\"token operator\">=</span> <span class=\"token string\">'text'</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>props <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Group</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>mb-3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">controlId</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>id<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>label<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Label</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control</span></span>\n        <span class=\"token attr-name\">type</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>type<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">isInvalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>error<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">aria-invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span>error<span class=\"token punctuation\">}</span></span>\n        <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>props<span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>error <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Form.Control.Feedback</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>invalid<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>alert<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>error<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Control.Feedback</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Form.Group</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Any form is now a sequence of <code class=\"language-text\">&lt;FormField></code> instances, and any improvement to accessibility or styling happens in one place.</p>\n<p><strong>Centralize validation logic.</strong> Inline validation works for two-field forms. Beyond that, schema-based validation with Yup or Zod is worth the small extra dependency. The same schema can run on the client for UX and on the server for security.</p>\n<p><strong>Manage focus on error.</strong> When validation fails, the first invalid field should receive focus. Without this, keyboard users have to tab back to find the problem.</p>\n<h2 id=\"troubleshooting-common-react-bootstrap-form-issues\" style=\"position:relative;\"><a href=\"#troubleshooting-common-react-bootstrap-form-issues\" aria-label=\"troubleshooting common react bootstrap form issues permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Troubleshooting Common React Bootstrap Form Issues</h2>\n<ul>\n<li><strong>Validation feedback not showing.</strong> The most common cause is that <code class=\"language-text\">validated</code> is not being set on <code class=\"language-text\">&lt;Form></code> after the submit attempt. Verify that <code class=\"language-text\">setValidated(true)</code> is being called in the submit handler. The second most common cause is missing <code class=\"language-text\">noValidate</code> on <code class=\"language-text\">&lt;Form></code>, which lets the browser’s native validation UI fire instead of Bootstrap’s.</li>\n<li><strong>Styling conflicts.</strong> Custom CSS that imports before <code class=\"language-text\">bootstrap.min.css</code> gets overridden, which usually shows up as components looking unstyled. Ensure the Bootstrap import comes first in the entry file.</li>\n<li><strong>Labels and inputs not linked.</strong> If clicking the label does not focus the input, <code class=\"language-text\">controlId</code> is missing or set on the wrong element. The <code class=\"language-text\">controlId</code> prop must go on <code class=\"language-text\">&lt;Form.Group></code>, not on <code class=\"language-text\">&lt;Form.Control></code>.</li>\n<li><strong>Controlled input warning.</strong> A “changing an uncontrolled input to controlled” warning means a field’s initial state was <code class=\"language-text\">undefined</code>. Initialize every field in <code class=\"language-text\">useState</code> to an empty string.</li>\n<li><strong>SuperTokens session not persisting.</strong> If the navbar or session check doesn’t update after a successful login, the cookie isn’t reaching subsequent requests. Make sure CORS is configured with <code class=\"language-text\">credentials: true</code> on the backend, and that <code class=\"language-text\">fetch</code> calls from the frontend include <code class=\"language-text\">credentials: 'include'</code>. The browser’s Network tab is the fastest way to confirm the cookie is being set on the login response.</li>\n</ul>\n<h2 id=\"final-thoughts\" style=\"position:relative;\"><a href=\"#final-thoughts\" aria-label=\"final thoughts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Final Thoughts</h2>\n<p>React Bootstrap pairs well with form-heavy applications because it gets the boring decisions out of the way. Spacing, accessibility wiring, responsive layout, and validation styling all come prebuilt, leaving application code to focus on data and submission logic. The components are unopinionated about state management, so any approach from raw <code class=\"language-text\">useState</code> to React Hook Form fits cleanly.</p>\n<p>Pairing React Bootstrap forms with SuperTokens for authentication closes the loop on the highest-traffic, highest-risk forms in any application. The form itself stays under the team’s control, and the cryptographic primitives, session management, and CSRF protection are handled by an audited SDK rather than rebuilt from scratch.</p>","frontmatter":{"date":"May 26, 2026","title":"Create Responsive, Accessible Forms with React Bootstrap","cover":"react-bootstrap-forms.png","author":"Mostafa Ibrahim","description":"A step-by-step guide to building, validating, and styling forms in React using the react-bootstrap library."},"fields":{"slug":"/react-bootstrap-forms/"}},"site":{"siteMetadata":{"title":"SuperTokens Blog"}}},"pageContext":{"id":"950ec8c2-3a36-540a-bf39-679d46fd8c2e","fields__slug":"/react-bootstrap-forms/","__params":{"fields__slug":"react-bootstrap-forms"}}},
    "staticQueryHashes": []}