React Material Tailwind - Beginners’ Guide and Free Sample
Hello Coders!
This article aims to help developers to accommodate Material Tailwind, a popular UI library for React
actively supported by Creative-Tim. Those interested in this topic will learn how to set up the library, and how to build a simple landing page, plus signIN, and signOUT pages. The sources of this coding experiment can be found on GitHub, under the MIT license, and can be used or incorporated in commercial projects or eLearning activities. Thank you!
✨ What is Material Tailwind
Material Tailwind is a free and open-source UI library inspired by Material Design that provides a unique experience for developers working with React and Tailwind CSS. It is a highly customizable component library that provides a great user experience, thus enabling you to build stunning and responsive web applications.
This open-source library tries to combine a popular design concept with the trendies CSS Framework nowadays. Before starting to write the code, let’s say highlight the key points of the Material Tailwind tool.
✅ Free and open-source
Material Tailwind is a free and open-source UI components library; this means that the code is readily available for everyone to modify and improve. Whether you are a developer or a user, you can contribute to the code or the library’s documentation.
✅ Easy to use
Material Tailwind is easy to use and integrate into React and HTML projects. You don’t have to spend much time learning how to use its web components. If you are familiar with Tailwind CSS, working with Material Tailwind will be a breeze.
✅ Fully customizable
The components provided by Material Tailwind are fully customizable, giving developers total control over the layout of their applications. Material Tailwind is a flexible UI library that enables you to design any UI layout according to your requirement.
✅ Excellent documentation
Material Tailwind has excellent documentation, making it easy for new and existing users to set up and learn about its components quickly. The documentation explains how each UI component works with detailed code samples.
✨ How to Set UP
Material Tailwind works perfectly with HTML and React projects. In this section, I will guide you through setting up Material Tailwind using React.
Create your React app by running the code below.
1 2 3 |
<span class="nv">$ </span>npx create-react-app my-project <span class="nv">$ </span><span class="nb">cd </span>my-project |
Install Tailwind CSS and its peer dependencies via npm, and run the commands below to generate both tailwind.config.js
and postcss.config.js
.
1 2 |
<span class="nv">$ </span>npm <span class="nb">install</span> <span class="nt">-D</span> tailwindcss postcss autoprefixer <span class="nv">$ </span>npx tailwindcss init <span class="nt">-p</span> |
Install Material Tailwind to your React app.
1 |
<span class="nv">$ </span>npm i material-tailwind/react |
Wrap your Tailwind CSS configurations with the withMT()
function within the tailwind.config.js
file.
1 2 |
<span class="kd">const</span> <span class="nx">withMT</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">@material-tailwind/react/utils/withMT</span><span class="dl">"</span><span class="p">);</span> <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">withMT</span><span class="p">({</span> <span class="na">content</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">./src/**/*.{js,jsx,ts,tsx}</span><span class="dl">"</span><span class="p">],</span> <span class="na">theme</span><span class="p">:</span> <span class="p">{</span> <span class="na">extend</span><span class="p">:</span> <span class="p">{},</span> <span class="p">},</span> <span class="na">plugins</span><span class="p">:</span> <span class="p">[],</span> <span class="p">});</span> |
Add the following Tailwind CSS directives to your ./src/index.css file
.
1 2 3 4 |
<span class="p">@</span><span class="nd">tailwind</span> <span class="nx">base</span><span class="p">;</span> <span class="p">@</span><span class="nd">tailwind</span> <span class="nx">components</span><span class="p">;</span> <span class="p">@</span><span class="nd">tailwind</span> <span class="nx">utilities</span><span class="p">;</span> |
Wrap the entire application with ThemeProvider
from Material Tailwind. ThemeProvider
enables us to use the default styles provided by Material Tailwind.
1 2 3 4 5 6 7 |
<span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">ReactDOM</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-dom/client</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">App</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./App</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="dl">"</span><span class="s2">./index.css</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">ThemeProvider</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@material-tailwind/react</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">root</span> <span class="o">=</span> <span class="nx">ReactDOM</span><span class="p">.</span><span class="nx">createRoot</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">root</span><span class="dl">"</span><span class="p">));</span> <span class="nx">root</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span> <span class="o"><</span><span class="nx">React</span><span class="p">.</span><span class="nx">StrictMode</span><span class="o">></span> <span class="o"><</span><span class="nx">ThemeProvider</span><span class="o">></span> <span class="o"><</span><span class="nx">App</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/ThemeProvider</span><span class="err">> </span> <span class="o"><</span><span class="sr">/React.StrictMode</span><span class="err">> </span><span class="p">);</span> |
Congratulations!🥂 You’ve successfully added Material Tailwind to your React application. In the remaining sections, I will guide you through creating a landing page and an authentication page with Material Tailwind.
✨ Code a Landing Page
In this section, you’ll learn how to build a landing page with Material Tailwind.
Install React Router – a JavaScript library that enables us to navigate between pages in a React application.
1 2 |
<span class="nv">$ </span>npm <span class="nb">install </span>react-router-dom |
Create a pages folder within the src
folder containing the components for the Login
, Home
, and Register
routes.
1 2 3 4 |
<span class="nb">mkdir </span>pages <span class="nb">cd </span>pages <span class="nb">touch </span>Home.js Login.js Register.js |
Copy the code below into the App.js
file. The code snippet below uses React Router v6 for navigating between the web pages.
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">BrowserRouter</span><span class="p">,</span> <span class="nx">Routes</span><span class="p">,</span> <span class="nx">Route</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-router-dom</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Home</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./pages/Home</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Login</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./pages/Login</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Register</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./pages/Register</span><span class="dl">"</span><span class="p">;</span> <span class="kd">function</span> <span class="nx">App</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><</span><span class="nx">BrowserRouter</span><span class="o">></span> <span class="o"><</span><span class="nx">Routes</span><span class="o">></span> <span class="o"><</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="dl">'</span><span class="s1">/</span><span class="dl">'</span> <span class="nx">element</span><span class="o">=</span><span class="p">{</span><span class="o"><</span><span class="nx">Home</span> <span class="o">/></span><span class="p">}</span> <span class="sr">/</span><span class="err">> </span> <span class="o"><</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="dl">'</span><span class="s1">/login</span><span class="dl">'</span> <span class="nx">element</span><span class="o">=</span><span class="p">{</span><span class="o"><</span><span class="nx">Login</span> <span class="o">/></span><span class="p">}</span> <span class="sr">/</span><span class="err">> </span> <span class="o"><</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="dl">'</span><span class="s1">/register</span><span class="dl">'</span> <span class="nx">element</span><span class="o">=</span><span class="p">{</span><span class="o"><</span><span class="nx">Register</span> <span class="o">/></span><span class="p">}</span> <span class="sr">/</span><span class="err">> </span> <span class="o"><</span><span class="sr">/Routes</span><span class="err">> </span> <span class="o"><</span><span class="sr">/BrowserRouter</span><span class="err">> </span> <span class="p">);</span> <span class="p">}</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">App</span><span class="p">;</span> |
Update the Home.js
file to contain the code below.
1 2 3 4 5 6 7 8 9 10 11 |
<span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Nav</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/Nav</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Hero</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/Hero</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">FirstSection</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/FirstSection</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">SecondSection</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/SecondSection</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Footer</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/Footer</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Testimonial</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/Testimonial</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Faq</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../components/Faq</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">Home</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><</span><span class="nx">div</span><span class="o">></span> <span class="o"><</span><span class="nx">Nav</span> <span class="o">/></span> <span class="o"><</span><span class="nx">Hero</span> <span class="o">/></span> <span class="o"><</span><span class="nx">FirstSection</span> <span class="o">/></span> <span class="o"><</span><span class="nx">SecondSection</span> <span class="o">/></span> <span class="o"><</span><span class="nx">Testimonial</span> <span class="o">/></span> <span class="o"><</span><span class="nx">Faq</span> <span class="o">/></span> <span class="o"><</span><span class="nx">Footer</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="p">);</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">Home</span><span class="p">;</span> |
From the code snippet above, Home is divided into seven sub-components. Next, create a components folder containing the sub-components.
1 2 3 4 |
<span class="nb">mkdir </span>components <span class="nb">cd </span>components <span class="nb">touch </span>Nav.js Hero.js FirstSection.js SecondSection.js Testimonial.js Faq.js Footer.js |
✅ Coding the NAV Component
Copy the code below into the Nav.js
file.
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="k">import</span> <span class="p">{</span> <span class="nx">Typography</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@material-tailwind/react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">Link</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-router-dom</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">Nav</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><></span> <span class="o"><</span><span class="nx">nav</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">h-[10vh] flex flex-row ...(truncated)</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">flex flex-row items-center</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-bold text-lg font-poppins text-purple-600</span><span class="dl">'</span><span class="o">></span> <span class="nx">Meetup</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">flex flex-row items-center space-x-2</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Link</span> <span class="nx">to</span><span class="o">=</span><span class="dl">'</span><span class="s1">/login</span><span class="dl">'</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins text-white ...(truncated)</span><span class="dl">'</span> <span class="o">></span> <span class="nx">Login</span> <span class="o"><</span><span class="sr">/Link</span><span class="err">> </span> <span class="o"><</span><span class="nx">Link</span> <span class="nx">to</span><span class="o">=</span><span class="dl">'</span><span class="s1">/register</span><span class="dl">'</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins text-gray-600 ...(truncated)</span><span class="dl">'</span> <span class="o">></span> <span class="nx">Register</span> <span class="o"><</span><span class="sr">/Link</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/nav</span><span class="err">> </span> <span class="o"><</span><span class="sr">/</span><span class="err">> </span> <span class="p">);</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">Nav</span><span class="p">;</span> |
From the code snippet above, Typography
is the component provided by Material Tailwind for displaying texts on web pages. The font size of the text can be increased or reduced using Tailwind CSS.
✅ Coding the HERO Component
Copy the code below into the Hero.js
file.
1 2 3 4 5 6 7 8 9 10 |
<span class="k">import</span> <span class="p">{</span> <span class="nx">Button</span><span class="p">,</span> <span class="nx">Typography</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@material-tailwind/react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">hero</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../images/meetup.jpg</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">Hero</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">w-full lg:p-8 px-4 flex ...(truncated)</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg:w-[60%] w-full lg:px-6 lg:pr-14</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">text-3xl ...(truncated)</span><span class="dl">'</span><span class="o">></span> <span class="nx">Create</span> <span class="nx">a</span> <span class="nx">great</span> <span class="nx">circle</span> <span class="k">of</span> <span class="nx">friends</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins mb-6</span><span class="dl">'</span><span class="o">></span> <span class="nx">Lorem</span> <span class="nx">ipsum</span> <span class="nx">dolor</span> <span class="nx">sit</span> <span class="nx">amet</span><span class="p">,</span> <span class="nx">consectetur</span> <span class="nx">adipiscing</span> <span class="nx">elit</span><span class="p">.</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">Button</span> <span class="nx">size</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg</span><span class="dl">'</span> <span class="nx">color</span><span class="o">=</span><span class="dl">'</span><span class="s1">purple</span><span class="dl">'</span><span class="o">></span> <span class="nx">Get</span> <span class="nx">Connected</span> <span class="o"><</span><span class="sr">/Button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg:w-[40%] w-full lg:block hidden </span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=</span><span class="p">{</span><span class="nx">hero</span><span class="p">}</span> <span class="nx">alt</span><span class="o">=</span><span class="dl">'</span><span class="s1">Hero</span><span class="dl">'</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="p">);</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">Hero</span><span class="p">;</span> |
Material Tailwind also provides a Button component that accepts various props; you can find them here.
✅ Coding the Info Component
Copy the code below into the FirstSection.js
file.
1 2 3 4 5 6 7 8 9 10 11 |
<span class="k">import</span> <span class="p">{</span> <span class="nx">Typography</span><span class="p">,</span> <span class="nx">Button</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@material-tailwind/react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">connect</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../images/connect.jpg</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">FirstSection</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">w-full lg:p-8 p-4 flex items-center justify-between</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg:w-[40%] w-full lg:block hidden </span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=</span><span class="p">{</span><span class="nx">connect</span><span class="p">}</span> <span class="nx">alt</span><span class="o">=</span><span class="dl">'</span><span class="s1">Hero</span><span class="dl">'</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg:w-[60%] w-full lg:px-6 lg:pl-10</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">text-3xl ...(truncated)</span><span class="dl">'</span><span class="o">></span> <span class="nx">Create</span> <span class="nx">a</span> <span class="nx">great</span> <span class="nx">circle</span> <span class="k">of</span> <span class="nx">friends</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins mb-6</span><span class="dl">'</span><span class="o">></span> <span class="nx">Lorem</span> <span class="nx">ipsum</span> <span class="nx">dolor</span> <span class="nx">sit</span> <span class="nx">amet</span><span class="p">,</span> <span class="nx">Duis</span> <span class="nx">aute</span> <span class="nx">irure</span> <span class="nx">dolor</span> <span class="k">in</span> <span class="nx">reprehenderit</span> <span class="k">in</span> <span class="nx">voluptate</span> <span class="nx">velit</span> <span class="nx">esse</span> <span class="nx">cillum</span> <span class="nx">dolore</span><span class="p">.</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">Button</span> <span class="nx">size</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg</span><span class="dl">'</span> <span class="nx">color</span><span class="o">=</span><span class="dl">'</span><span class="s1">purple</span><span class="dl">'</span><span class="o">></span> <span class="nx">learn</span> <span class="nx">more</span> <span class="o"><</span><span class="sr">/Button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="p">);</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">FirstSection</span><span class="p">;</span> |
Here is the result:
In the same way, other components with different topologies are coded:
✅ Features Component
✅ Testimonial Component
✅ FAQs Component
✅ Coding the Footer Component
Copy the code below into the Footer.js
file.
1 2 3 4 5 6 7 8 9 10 11 |
<span class="k">import</span> <span class="p">{</span> <span class="nx">Button</span><span class="p">,</span> <span class="nx">Typography</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@material-tailwind/react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Icons</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">../icons</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">Footer</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><</span><span class="nx">footer</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">w-full footer py-12 pt-24 px-8</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">flex flex-col justify-between items-center border-b-[1px] md:px-12 pb-8 border-b-purple-200 mb-8</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins text-2xl font-semibold text-white mb-8</span><span class="dl">'</span><span class="o">></span> <span class="nx">Do</span> <span class="nx">you</span> <span class="nx">want</span> <span class="nx">to</span> <span class="nx">know</span> <span class="nx">more</span> <span class="nx">or</span> <span class="nx">just</span> <span class="nx">have</span> <span class="nx">any</span> <span class="nx">questions</span><span class="p">?</span> <span class="nx">write</span> <span class="nx">to</span> <span class="nx">us</span><span class="p">.</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">Button</span> <span class="nx">size</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg</span><span class="dl">'</span> <span class="nx">color</span><span class="o">=</span><span class="dl">'</span><span class="s1">red</span><span class="dl">'</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">text-white</span><span class="dl">'</span><span class="o">></span> <span class="nx">Contact</span> <span class="nx">Us</span> <span class="o"><</span><span class="sr">/Button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">w-full flex items-center flex-col justify-center</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins text-lg font-semibold text-purple-100</span><span class="dl">'</span><span class="o">></span> <span class="nx">Meetup</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">Icons</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="sr">/footer</span><span class="err">> </span> <span class="p">);</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">Footer</span><span class="p">;</span> |
✨ Code the Authentication Pages
The pages are pretty simple with a classic layout the centered elements.
✅ Coding the SignIN Page
The Login component should be updated to accept a username and password from a user.
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="k">import</span> <span class="p">{</span> <span class="nx">Button</span><span class="p">,</span> <span class="nx">Input</span><span class="p">,</span> <span class="nx">Typography</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@material-tailwind/react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">Link</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-router-dom</span><span class="dl">"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">Login</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o"><</span><span class="nx">form</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">w-full min-h-[100vh] flex flex-col items-center justify-center space-y-5 md:px-auto px-6</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">text-2xl font-bold font-poppins mb-4</span><span class="dl">'</span><span class="o">></span> <span class="nx">Login</span> <span class="o"><</span><span class="sr">/Typography</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">md:w-[70%] w-full</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">label</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins</span><span class="dl">'</span><span class="o">></span><span class="nx">Username</span><span class="o"><</span><span class="sr">/label</span><span class="err">> </span> <span class="o"><</span><span class="nx">Input</span> <span class="nx">label</span><span class="o">=</span><span class="dl">'</span><span class="s1">Username</span><span class="dl">'</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins</span><span class="dl">'</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">md:w-[70%] w-full</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">label</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins</span><span class="dl">'</span><span class="o">></span><span class="nx">Password</span><span class="o"><</span><span class="sr">/label</span><span class="err">> </span> <span class="o"><</span><span class="nx">Input</span> <span class="nx">label</span><span class="o">=</span><span class="dl">'</span><span class="s1">Password</span><span class="dl">'</span> <span class="nx">type</span><span class="o">=</span><span class="dl">'</span><span class="s1">password</span><span class="dl">'</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins</span><span class="dl">'</span> <span class="o">/></span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">md:w-[70%] w-full flex items-center justify-center</span><span class="dl">'</span><span class="o">></span> <span class="o"><</span><span class="nx">Button</span> <span class="nx">size</span><span class="o">=</span><span class="dl">'</span><span class="s1">lg</span><span class="dl">'</span> <span class="nx">color</span><span class="o">=</span><span class="dl">'</span><span class="s1">purple</span><span class="dl">'</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">w-[50%]</span><span class="dl">'</span><span class="o">></span> <span class="nx">Sign</span> <span class="nx">In</span> <span class="o"><</span><span class="sr">/Button</span><span class="err">> </span> <span class="o"><</span><span class="sr">/div</span><span class="err">> </span> <span class="o"><</span><span class="nx">Typography</span> <span class="nx">className</span><span class="o">=</span><span class="dl">'</span><span class="s1">font-poppins</span><span class="dl">'</span><span class="o">></span> <span class="nx">Don</span><span class="dl">'</span><span class="s1">t have an account?{" "} <Link to=</span><span class="dl">'</span><span class="o">/</span><span class="nx">register</span><span class="dl">'</span><span class="s1"> className=</span><span class="dl">'</span><span class="na">hover</span><span class="p">:</span><span class="nx">text</span><span class="o">-</span><span class="nx">purple</span><span class="o">-</span><span class="mi">400</span><span class="dl">'</span><span class="s1">> Create one </Link> </Typography> </form> ); }; export default Login; </span> |
Material Tailwind provides an Input component that allows you to accept users’ data via forms. The Input component supports different props for various types of data.
The registration page is quite similar to the signIN and the code can be found on GitHub.
Congratulations! You’ve completed the project for this article.
✨ Conclusion
So far, you’ve learned the following:
- ✅ What Material Tailwind is,
- ✅ Why you should use Material Tailwind,
- ✅ How to set up Material Tailwind in a React application
- ✅ How to build a landing page with Material Tailwind, and
- ✅ How to build a login and register route with Material Tailwind.
Material Tailwind provides a faster way of building stunning and user-friendly web applications. It is free and open-source, so you are welcome to engage with the community as a developer or contributor.
This tutorial explains a few UI components provided by Material Tailwind. You can also explore the documentation and the GitHub repository for other features that it offers.
Thanks for reading!
For more resources and support, please access:
- 🚀 Free support provided by AppSeed (email & Discord)
- 👉 More free apps crafted in Flask, Django, and React
Source: https://dev.to/sm0ke/react-material-tailwind-beginners-guide-and-free-sample-5eh7
