In this article, we’ll introduce Float UI, a set of pre-made templates that leverage the power of Tailwind CSS to help developers create professional websites quickly. We’ll also walk through a tutorial for putting it to use.
Introducing Float UI, your savior. As the website states, Float UI is “a collection of modern UI components and website templates, built on top of React/Next.js with Tailwind CSS. The components are beautifully designed, expertly crafted, and allow you to build beautiful websites.”
It’s free, open source, and has pretty much everything a modern website needs – from fully-fledged components to useful parts like modals, navbars, and tabs.
Float UI integrates natively with React and Next.js, so many developers are already familiar with it. Since it uses Tailwind CSS, it provides a fast way to build websites with ready-made components while remaining highly customizable; you can modify whatever you want in the code since it’s just Tailwind CSS at its core.
And since it’s open source, it is license-free, meaning any organization of any size can use it for free.
Float UI provides developers with ready-made templates written in Tailwind CSS. To use it, you need a React/Next.js app with Tailwind CSS installed. After that, you can simply grab any component you like, tweak it to your liking, and use it.
One important point to emphasize is that Float UI components are fully responsive, which removes a significant burden from developers’ shoulders.
On the left side of the Float UI page, components are categorized into two main sections: Marketing UI and Application UI.
The Marketing UI section consists of landing pages and business-style components like Hero sections, FAQs, and Testimonials, while Application UI focuses more on usability elements such as cards, pagination, modals, and menus. It’s entirely possible to build a fully functional web app using Float UI.
Of course, you’ll need to write your own logic, but the UI is taken care of.
They also provide fully-built templates, which are free at the time of writing. These templates are well-made, can be previewed as they are already deployed on Vercel, and can significantly speed up the development process.
We will build a fully functional business page for a hypothetical coffee brewery called SmartBrew. For this, I ask you to imagine the following scenario:
You’re a freelance developer or an agency owner. One of your clients (SmartBrew) has asked you to build their website. It’s urgent—they need it today, and they want you to come up with a good business page. You don’t have enough time to code everything from scratch, but you also can’t use any other template builder.
The client insists on using Tailwind CSS and React because their internal developer, Greg, only works with Tailwind. Greg is on holiday, so the client has turned to you to develop their page. You want to retain this client, so you must be fast and efficient. You need to build a good business page today. You’re already behind schedule. What do you do?
You decide to choose the second option.
To build the app, we will do the following:
You can check out the preview of what we’re going to build before we dive in.
Let’s start by creating our React app using the npm create vite@latest
command and selecting the appropriate options. For this tutorial, we’ll use JavaScript, not TypeScript, so choose accordingly.
Next, follow this guide to install Tailwind CSS:
After completing the installation, delete everything inside the index.css
file and add the following:
import "tailwindcss";
We will also delete everything in the App.css
file. Since we are using Float UI, we won’t be utilizing CSS files at all.
When developing React applications, it is best to use separate components for different sections of the web app instead of placing everything in a single file. We will create a components
folder to organize our components. Our folder structure will look like this:
- main.jsx - App.jsx - components - Hero.jsx - Features.jsx - CTA.jsx - Testimonials.jsx - FAQ.jsx - Contact.jsx - Footer.jsx
Each file inside the components
folder will correspond to a specific section, and we will import them into our App.jsx
file as follows:
import Hero from "./components/Hero.jsx"; import Features from "./components/Features.jsx"; import CTA from "./components/CTA.jsx"; import Testimonials from "./components/Testimonials.jsx"; import FAQ from "./components/FAQ.jsx"; import Contact from "./components/Contact.jsx"; import Footer from "./components/Footer.jsx"; function App() { return ( <> <Hero /> <Features /> <CTA /> <Testimonials /> <FAQ /> <Contact /> <Footer /> </> ); } export default App;
If you’re following along with this tutorial, I recommend commenting out the imports for now and adding them as we go. At this stage, the app won’t compile since the files don’t exist yet.
Now that we understand the app’s structure, we can proceed with confidence. We’ll start by creating the Hero section, which serves as the first impression for users.
Since we’re short on time and using Float UI, we don’t need to write the entire section from scratch. Instead, we’ll visit the components page on the Float UI website. This section falls under the Marketing UI category.
We’ll select the Hero template called Secondary Hero Section:
Now, if we click on the Code section on the top right, we will have the template ready:
We will make some modifications to the template. Since our client is in the coffee business, brownish tones will be more suitable. Additionally, we’ll adjust the text and add an image.
Pro tip: It’s 2025, and I highly recommend integrating AI into your development workflow—for example, to generate royalty-free images or logos. The logo and image used here were created with AI.
Now we’ll generate our hero section:
Simple and beautiful, isn’t it?
import React from "react"; import { useState } from "react"; const Hero = () => { const [state, setState] = useState(false); // Updated navigation items for SmartBrew const navigation = [ { title: "Menu", path: "javascript:void(0)" }, { title: "Locations", path: "javascript:void(0)" }, { title: "Rewards", path: "javascript:void(0)" }, { title: "Baristas", path: "javascript:void(0)" }, { title: "About Us", path: "javascript:void(0)" }, ]; return ( <> <header> <nav className="relative items-center pt-5 px-4 mx-auto max-w-screen-xl sm:px-8 sm:flex sm:space-x-6"> <div className="flex justify-between"> <a href="javascript:void(0)"> {/* Inline SmartBrew SVG logo */} <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 100" width={120} height={50} > {/* Coffee Cup */} <path d="M65 20 H115 V70 Q115 85 100 85 H80 Q65 85 65 70 Z" fill="#8B4513" /> {/* Cup Handle */} <path d="M115 30 Q130 30 130 45 Q130 60 115 60" fill="none" stroke="#8B4513" strokeWidth="6" /> {/* Steam */} <path d="M80 15 Q85 5 90 15 Q95 5 100 15" fill="none" stroke="#8B4513" strokeWidth="3" strokeLinecap="round" /> {/* S */} <path d="M140 35 Q150 30 160 35 Q170 40 160 50 Q150 60 160 65 Q170 70 180 65" fill="none" stroke="#8B4513" strokeWidth="6" strokeLinecap="round" /> {/* Text */} <text x="120" y="95" fontFamily="Arial" fontSize="14" fontWeight="bold" fill="#8B4513" textAnchor="middle" > SMARTBREW </text> </svg> </a> <button className="text-gray-500 outline-none sm:hidden" onClick={() => setState(!state)} > {state ? ( <svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" > <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" /> </svg> ) : ( <svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" > <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" /> </svg> )} </button> </div> <ul className={`bg-white shadow-md rounded-md p-4 flex-1 mt-12 absolute z-20 top-8 right-4 w-64 border sm:shadow-none sm:block sm:border-0 sm:mt-0 sm:static sm:w-auto ${ state ? "" : "hidden" }`} > <div className="order-1 justify-end items-center space-y-5 sm:flex sm:space-x-6 sm:space-y-0"> {navigation.map((item, idx) => ( <li className="text-gray-500 hover:text-amber-800" key={idx}> <a href={item.path}>{item.title}</a> </li> ))} </div> </ul> </nav> </header> {/* Changed blue section to amber-800 (coffee brown) */} <section className="mt-24 mx-auto max-w-screen-xl pb-4 px-4 items-center lg:flex md:px-8"> <div className="space-y-4 flex-1 sm:text-center lg:text-left"> <h1 className="text-gray-800 font-bold text-4xl xl:text-5xl"> Mobile Ordering Made <span className="text-amber-800"> Simple</span> </h1> <p className="text-gray-500 max-w-xl leading-relaxed sm:mx-auto lg:ml-0"> Enjoy your favorite coffee without the wait. Our new app lets you order ahead and skip the line, saving you valuable time during your busy day. </p> <div> <p className="text-gray-800 py-3"> Download our app and get your first coffee free </p> <form className="items-center space-y-3 sm:justify-center sm:space-x-3 sm:space-y-0 sm:flex lg:justify-start"> <input type="text" placeholder="Enter your email" className="text-gray-500 border outline-none p-3 rounded-md w-full sm:w-72" /> <button className="outline-none bg-amber-800 text-white text-center px-4 py-3 rounded-md shadow w-full ring-offset-2 ring-amber-800 focus:ring-2 sm:w-auto"> Download Now </button> </form> </div> </div> <div className="flex-1 text-center mt-4 lg:mt-0 lg:ml-3"> {/* Coffee roastery SVG illustration */} <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500" className="w-full mx-auto sm:w-10/12 lg:w-full" > {/* Background */} <rect width="800" height="500" fill="#f9f3e5" /> {/* Wooden floor */} <rect y="400" width="800" height="100" fill="#8b5a2b" /> <rect y="410" width="800" height="10" fill="#74461f" /> <rect y="440" width="800" height="10" fill="#74461f" /> <rect y="470" width="800" height="10" fill="#74461f" /> {/* Wall elements */} <rect x="0" y="100" width="800" height="300" fill="#e6d5b8" /> <rect x="50" y="150" width="200" height="150" fill="#d4b995" /> <rect x="550" y="150" width="200" height="150" fill="#d4b995" /> {/* Large coffee roaster */} <ellipse cx="400" cy="380" rx="120" ry="30" fill="#555" /> <rect x="340" y="200" width="120" height="180" rx="10" fill="#8B4513" /> <rect x="330" y="190" width="140" height="20" rx="5" fill="#6b3811" /> <rect x="370" y="160" width="60" height="30" fill="#6b3811" /> <rect x="390" y="130" width="20" height="30" fill="#6b3811" /> <ellipse cx="400" cy="130" rx="20" ry="10" fill="#555" /> {/* Roaster door and details */} <ellipse cx="400" cy="250" rx="40" ry="40" fill="#333" /> <ellipse cx="400" cy="250" rx="35" ry="35" fill="#222" /> <ellipse cx="400" cy="250" rx="20" ry="20" fill="#111" /> {/* Temperature gauge */} <circle cx="420" cy="320" r="15" fill="#ddd" stroke="#333" strokeWidth="3" /> <line x1="420" y1="320" x2="430" y2="315" stroke="#f00" strokeWidth="2" /> {/* Coffee beans in baskets */} <ellipse cx="200" cy="400" rx="70" ry="20" fill="#6b3811" /> <ellipse cx="200" cy="390" rx="65" ry="15" fill="#8B4513" /> <ellipse cx="600" cy="400" rx="70" ry="20" fill="#6b3811" /> <ellipse cx="600" cy="390" rx="65" ry="15" fill="#8B4513" /> {/* Scattered coffee beans */} <circle cx="150" cy="380" r="5" fill="#5e2c04" /> <circle cx="170" cy="385" r="5" fill="#5e2c04" /> <circle cx="190" cy="375" r="5" fill="#5e2c04" /> <circle cx="210" cy="385" r="5" fill="#5e2c04" /> <circle cx="230" cy="380" r="5" fill="#5e2c04" /> <circle cx="550" cy="380" r="5" fill="#5e2c04" /> <circle cx="570" cy="385" r="5" fill="#5e2c04" /> <circle cx="590" cy="375" r="5" fill="#5e2c04" /> <circle cx="610" cy="385" r="5" fill="#5e2c04" /> <circle cx="630" cy="380" r="5" fill="#5e2c04" /> {/* Steam from roaster */} <path d="M390 130 Q380 110 390 100 Q400 90 410 100 Q420 110 410 130" fill="#f9f3e5" fillOpacity="0.7" /> {/* Barista silhouette */} <ellipse cx="520" cy="300" rx="30" ry="80" fill="#333" /> <circle cx="520" cy="210" r="20" fill="#333" /> {/* Burlap sacks of coffee */} <path d="M80 350 L130 350 L120 400 L90 400 Z" fill="#b89162" /> <path d="M85 355 L125 355 L117 395 L93 395 Z" fill="#aa8657" /> <text x="105" y="380" fontFamily="Arial" fontSize="12" textAnchor="middle" fill="#5e2c04" > COFFEE </text> <path d="M700 350 L750 350 L740 400 L710 400 Z" fill="#b89162" /> <path d="M705 355 L745 355 L737 395 L713 395 Z" fill="#aa8657" /> <text x="725" y="380" fontFamily="Arial" fontSize="12" textAnchor="middle" fill="#5e2c04" > COFFEE </text> {/* Ambient lighting effect */} <ellipse cx="400" cy="250" rx="300" ry="150" fill="#f9b572" fillOpacity="0.1" /> </svg> </div> </section> </> ); }; export default Hero;
I’ve hosted it on GitHub because it looks rather lengthy.
While it looks like a lot of code, we didn’t write much at all! We used the template given by Float UI, changed the color, added the images, and tweaked the text. It didn’t take more than a couple minutes to build. Now, that is some serious speed.
You’ll need to know Tailwind classes. At least that was the case in the past; now, you can just use AI to get help.
Pro tip: I’d suggest that you do not ask the AI to give you the whole code or component, as it will not give you what you have in mind in most cases, and you’ll spend more time debugging.
I typically ask the AI the smallest, laser-focused questions, like, “what is the class that changes the color in Tailwind CSS?” or, “how can I add margin in Tailwind CSS?”. These divided questions will give you what you want, make you faster, and stop you from losing so much time in debugging.
Now, if you import this Hero section to App.jsx (assuming you already have, and commented out the non-existing ones), npm run dev
command will present you with this simple yet elegant Hero section.
Now that we understand how we will be working, we can continue adding the other sections. This process will make us so fast that a whole landing page like this won’t take us more than an hour or so.
For the features section, we go to the Feature Sections part of the Float UI and choose Feature Sections with cards shown here:
We will again make some small changes, and it will look like this:
You see, only the colors and text have been changed. It is also responsive by default, how cool is this?:
import React from "react"; const Features = () => { const features = [ { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z" /> </svg> ), title: "Fast Ordering", desc: "Place your order in seconds with our intuitive app interface. Customize your drink exactly how you like it.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z" /> </svg> ), title: "Loyalty Rewards", desc: "Earn points with every purchase and redeem them for free drinks, pastries, and exclusive SmartBrew merchandise.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" /> </svg> ), title: "Customized Favorites", desc: "Save your favorite drinks and easily reorder them with just one tap on your next visit.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z" /> </svg> ), title: "Mobile Payment", desc: "Securely store payment methods and check out faster than ever before.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3" /> </svg> ), title: "Store Locator", desc: "Find the nearest SmartBrew location and check current wait times before you arrive.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09z" /> </svg> ), title: "Order History", desc: "Easily reorder your favorite drinks from your purchase history with just one tap.", }, ]; return ( <section className="py-14"> <div className="max-w-screen-xl mx-auto px-4 text-gray-600 md:px-8"> <div className="relative max-w-2xl mx-auto sm:text-center"> <div className="relative z-10"> <h3 className="text-gray-800 text-3xl font-semibold sm:text-4xl"> Skip the line and order ahead with our new mobile app </h3> <p className="mt-3"> Perfect for busy mornings or your afternoon coffee break. </p> </div> <div className="absolute inset-0 max-w-xs mx-auto h-44 blur-[118px]" style={{ background: "linear-gradient(152.92deg, rgba(192, 132, 252, 0.2) 4.54%, rgba(232, 121, 249, 0.26) 34.2%, rgba(192, 132, 252, 0.1) 77.55%)", }} ></div> </div> <div className="relative mt-12"> <ul className="grid gap-8 sm:grid-cols-2 lg:grid-cols-3"> {features.map((item, idx) => ( <li key={idx} className="bg-white space-y-3 p-4 border rounded-lg" > <div className="text-amber-800 pb-3">{item.icon}</div> <h4 className="text-lg text-gray-800 font-semibold"> {item.title} </h4> <p>{item.desc}</p> </li> ))} </ul> </div> </div> </section> ); }; export default Features;
Like the Hero section, we import this section to our App.jsx
and use it.
Every good landing page needs to have a CTA section which beckons the user. We will follow our previous steps and choose a template from the CTA Sections part of the Float UI website. I chose CTA with Blue background and made some small changes to it.
The original:
Our version:
The code can be found here:
import React from "react"; const CTA = () => { return ( <div> {" "} <section className="py-28 relative bg-amber-600"> <div className="relative z-10 max-w-screen-xl mx-auto px-4 md:text-center md:px-8"> <div className="max-w-xl md:mx-auto"> <p className="text-white text-3xl font-semibold sm:text-4xl"> Brewing a Better Coffee Experience{" "} </p> <p className="text-amber-100 mt-3"> We've combined our passion for quality coffee with modern technology to create a seamless experience for our valued customers. </p> </div> <div className="mt-4"> <a href="javascript:void(0)" className="inline-block py-2 px-4 text-gray-800 font-medium bg-white duration-150 hover:bg-gray-100 active:bg-gray-200 rounded-full" > Get started </a> </div> </div> <div className="absolute top-0 w-full h-full" style={{ background: "linear-gradient(268.24deg, rgba(59, 130, 246, 0.76) 50%, rgba(59, 130, 246, 0.545528) 80.61%, rgba(55, 48, 163, 0) 117.35%)", }} ></div> </section> </div> ); }; export default CTA;
You see, we only change the color and the text. Everything is ready-made.
Now that we’ve understood how we’re working, I will keep it short from now on.
Here’s the code for the Testimonials section:
import React from "react"; const Testimonials = () => { return ( <div> <section className="py-14"> <div className="max-w-screen-xl mx-auto px-4 md:px-8"> <div className="max-w-3xl mx-auto"> <figure> <blockquote> <p className="text-gray-800 text-xl text-center font-semibold sm:text-2xl"> "SmartBrew has completely changed my morning routine. I order on my way to work and my perfectly crafted latte is waiting when I arrive. No more standing in line!" </p> </blockquote> <div className="flex justify-center items-center gap-x-4 mt-6"> <img src="https://api.uifaces.co/our-content/donated/xZ4wg2Xj.jpg" className="w-16 h-16 rounded-full" /> <div> <span className="block text-gray-800 font-semibold"> Martin escobar </span> <span className="block text-gray-600 text-sm mt-0.5"> Daily Customer{" "} </span> </div> </div> </figure> </div> </div> </section> </div> ); }; export default Testimonials;
Here’s the code for FAQ section:
import React from "react"; const FAQ = () => { const faqsList = [ { q: "How do I download the SmartBrew app?", a: "The SmartBrew app is available for free download on both the Apple App Store and Google Play Store. Simply search 'SmartBrew' and look for our logo.", }, { q: "Can I customize my drink orders?", a: "Absolutely! Our app offers all the same customization options available in-store. Adjust milk type, espresso shots, flavors, and more with easy tap controls.", }, { q: "How does the loyalty program work?", a: "You earn 1 point for every dollar spent through the app. Once you reach 50 points, you'll receive a free drink of your choice. Additional rewards unlock at higher point levels.", }, { q: "Is mobile ordering available at all SmartBrew locations?", a: "Yes, mobile ordering is available at all SmartBrew locations. The app will show you nearby cafes and their current wait times.", }, { q: "How far in advance can I place an order?", a: "You can place orders up to 24 hours in advance. Perfect for scheduling your morning coffee pickup or organizing a coffee run for your office.", }, { q: "What payment methods are accepted in the app?", a: "We accept all major credit and debit cards, SmartBrew gift cards, Apple Pay, and Google Pay for secure, contactless payment.", }, ]; return ( <section className="leading-relaxed max-w-screen-xl mt-12 mx-auto px-4 md:px-8"> <div className="space-y-3 text-center"> <h1 className="text-3xl text-gray-800 font-semibold"> Frequently Asked Questions </h1> <p className="text-gray-600 max-w-lg mx-auto text-lg"> Everything you need to know about our new mobile ordering app. </p> </div> <div className="mt-14 gap-4 sm:grid sm:grid-cols-2 lg:grid-cols-3"> {faqsList.map((item, idx) => ( <div className="space-y-3 mt-5" key={idx}> <h4 className="text-xl text-gray-700 font-medium">{item.q}</h4> <p className="text-gray-500">{item.a}</p> </div> ))} </div> </section> ); }; export default FAQ;
import React from "react"; const Contact = () => { const contactMethods = [ { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" /> </svg> ), title: "Join our community", desc: "Stay updated on seasonal specials and coffee events near you.", link: { name: "Join our Discord", href: "javascript:void(0)", }, }, { icon: ( <svg className="w-6 h-6" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" > <g clip-path="url(#clip0_17_80)"> <path d="M15.1003 43.5C33.2091 43.5 43.1166 28.4935 43.1166 15.4838C43.1166 15.0619 43.1072 14.6307 43.0884 14.2088C45.0158 12.815 46.679 11.0886 48 9.11066C46.205 9.90926 44.2993 10.4308 42.3478 10.6575C44.4026 9.42588 45.9411 7.491 46.6781 5.21159C44.7451 6.35718 42.6312 7.16528 40.4269 7.60128C38.9417 6.02318 36.978 4.97829 34.8394 4.62816C32.7008 4.27803 30.5064 4.64216 28.5955 5.66425C26.6846 6.68635 25.1636 8.30947 24.2677 10.2827C23.3718 12.2559 23.1509 14.4693 23.6391 16.5807C19.725 16.3842 15.8959 15.3675 12.4 13.5963C8.90405 11.825 5.81939 9.33893 3.34594 6.29909C2.0888 8.46655 1.70411 11.0314 2.27006 13.4722C2.83601 15.9131 4.31013 18.047 6.39281 19.44C4.82926 19.3904 3.29995 18.9694 1.93125 18.2119V18.3338C1.92985 20.6084 2.7162 22.8132 4.15662 24.5736C5.59704 26.334 7.60265 27.5412 9.8325 27.99C8.38411 28.3863 6.86396 28.4441 5.38969 28.1588C6.01891 30.1149 7.24315 31.8258 8.89154 33.0527C10.5399 34.2796 12.5302 34.9613 14.5847 35.0025C11.0968 37.7423 6.78835 39.2283 2.35313 39.2213C1.56657 39.2201 0.780798 39.1719 0 39.0769C4.50571 41.9676 9.74706 43.5028 15.1003 43.5Z" fill="currentColor" /> </g> <defs> <clipPath id="clip0_17_80"> <rect width="48" height="48" fill="white" /> </clipPath> </defs> </svg> ), title: "Follow us on Twitter", desc: "Share your SmartBrew experience and connect with other coffee lovers.", link: { name: "Send us DMs", href: "javascript:void(0)", }, }, ]; return ( <section className="py-14"> <div className="max-w-screen-xl mx-auto px-4 text-gray-600 gap-12 md:px-8 lg:flex"> <div className="max-w-md"> <h3 className="text-gray-800 text-3xl font-semibold sm:text-4xl"> Let's connect </h3> <p className="mt-3"> We love hearing from our customers! Reach out with questions, feedback, or just to say hello. </p> </div> <div> <ul className="mt-12 gap-y-6 gap-x-12 items-center md:flex lg:gap-x-0 lg:mt-0"> {contactMethods.map((item, idx) => ( <li key={idx} className="space-y-3 border-t py-6 md:max-w-sm md:py-0 md:border-t-0 lg:border-l lg:px-12 lg:max-w-none" > <div className="w-12 h-12 rounded-full border flex items-center justify-center text-gray-700"> {item.icon} </div> <h4 className="text-gray-800 text-lg font-medium xl:text-xl"> {item.title} </h4> <p>{item.desc}</p> <a href={item.link.href} className="flex items-center gap-1 text-sm text-amber-800 duration-150 hover:text-indigo-400 font-medium" > {item.link.name} <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" className="w-5 h-5" > <path fillRule="evenodd" d="M5 10a.75.75 0 01.75-.75h6.638L10.23 7.29a.75.75 0 111.04-1.08l3.5 3.25a.75.75 0 010 1.08l-3.5 3.25a.75.75 0 11-1.04-1.08l2.158-1.96H5.75A.75.75 0 015 10z" clipRule="evenodd" /> </svg> </a> </li> ))} </ul> </div> </div> </section> ); }; export default Contact; const features = [ { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z" /> </svg> ), title: "Fast Ordering", desc: "Place your order in seconds with our intuitive app interface. Customize your drink exactly how you like it.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z" /> </svg> ), title: "Loyalty Rewards", desc: "Earn points with every purchase and redeem them for free drinks, pastries, and exclusive SmartBrew merchandise.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" /> </svg> ), title: "Customized Favorites", desc: "Save your favorite drinks and easily reorder them with just one tap on your next visit.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z" /> </svg> ), title: "Mobile Payment", desc: "Securely store payment methods and check out faster than ever before.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3" /> </svg> ), title: "Store Locator", desc: "Find the nearest SmartBrew location and check current wait times before you arrive.", }, { icon: ( <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6" > <path strokeLinecap="round" strokeLinejoin="round" d="M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09z" /> </svg> ), title: "Order History", desc: "Easily reorder your favorite drinks from your purchase history with just one tap.", }, ]; return ( <section className="py-14"> <div className="max-w-screen-xl mx-auto px-4 text-gray-600 md:px-8"> <div className="relative max-w-2xl mx-auto sm:text-center"> <div className="relative z-10"> <h3 className="text-gray-800 text-3xl font-semibold sm:text-4xl"> Skip the line and order ahead with our new mobile app </h3> <p className="mt-3"> Perfect for busy mornings or your afternoon coffee break. </p> </div> <div className="absolute inset-0 max-w-xs mx-auto h-44 blur-[118px]" style={{ background: "linear-gradient(152.92deg, rgba(192, 132, 252, 0.2) 4.54%, rgba(232, 121, 249, 0.26) 34.2%, rgba(192, 132, 252, 0.1) 77.55%)", }} ></div> </div> <div className="relative mt-12"> <ul className="grid gap-8 sm:grid-cols-2 lg:grid-cols-3"> {features.map((item, idx) => ( <li key={idx} className="bg-white space-y-3 p-4 border rounded-lg" > <div className="text-amber-800 pb-3">{item.icon}</div> <h4 className="text-lg text-gray-800 font-semibold"> {item.title} </h4> <p>{item.desc}</p> </li> ))} </ul> </div> </div> </section> ); }; export default Features;
import React from "react"; const Footer = () => { const footerNavs = [ { label: "Resources", items: [ { href: "javascript:void()", name: "contact", }, { href: "javascript:void()", name: "Support", }, { href: "javascript:void()", name: "Documentation", }, { href: "javascript:void()", name: "Pricing", }, ], }, { label: "About", items: [ { href: "javascript:void()", name: "Terms", }, { href: "javascript:void()", name: "License", }, { href: "javascript:void()", name: "Privacy", }, { href: "javascript:void()", name: "About US", }, ], }, { label: "Explore", items: [ { href: "javascript:void()", name: "Showcase", }, { href: "javascript:void()", name: "Roadmap", }, { href: "javascript:void()", name: "Languages", }, { href: "javascript:void()", name: "Blog", }, ], }, { label: "Company", items: [ { href: "javascript:void()", name: "Partners", }, { href: "javascript:void()", name: "Team", }, { href: "javascript:void()", name: "Careers", }, ], }, ]; return ( <footer className="pt-10"> <div className="max-w-screen-xl mx-auto px-4 md:px-8"> <div className="justify-between items-center gap-12 md:flex"> <div className="flex-1 max-w-lg"> <h3 className="text-2xl font-bold"> Get our beautiful newsletter straight to your inbox. </h3> </div> <div className="flex-1 mt-6 md:mt-0"> <form onSubmit={(e) => e.preventDefault()} className="flex items-center gap-x-3 md:justify-end" > <div className="relative"> <svg className="w-6 h-6 text-gray-400 absolute left-3 inset-y-0 my-auto" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" > <path strokeLinecap="round" strokeLinejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75" /> </svg> <input type="email" required placeholder="Enter your email" className="w-full pl-12 pr-3 py-2 text-gray-500 bg-white outline-none border focus:border-amber-600 shadow-sm rounded-lg" /> </div> <button className="block w-auto py-3 px-4 font-medium text-sm text-center text-white bg-amber-600 hover:bg-amber-500 active:bg-amber-700 active:shadow-none rounded-lg shadow"> Subscribe </button> </form> </div> </div> <div className="flex-1 mt-16 space-y-6 justify-between sm:flex md:space-y-0"> {footerNavs.map((item, idx) => ( <ul className="space-y-4 text-gray-600" key={idx}> <h4 className="text-gray-800 font-semibold sm:pb-2"> {item.label} </h4> {item.items.map((el, idx) => ( <li key={idx}> <a href={el.href} className="hover:text-gray-800 duration-150" > {el.name} </a> </li> ))} </ul> ))} </div> <div className="mt-10 py-10 border-t items-center justify-between sm:flex"> <p className="text-gray-600"> © 2025 SmartBrew. All rights reserved. </p> <div className="flex items-center gap-x-6 text-gray-400 mt-6"> <a href="javascript:void()"> <svg className="w-6 h-6 hover:text-gray-500 duration-150" fill="none" viewBox="0 0 48 48" > <g clip-path="url(#a)"> <path fill="currentColor" d="M48 24C48 10.745 37.255 0 24 0S0 10.745 0 24c0 11.979 8.776 21.908 20.25 23.708v-16.77h-6.094V24h6.094v-5.288c0-6.014 3.583-9.337 9.065-9.337 2.625 0 5.372.469 5.372.469v5.906h-3.026c-2.981 0-3.911 1.85-3.911 3.75V24h6.656l-1.064 6.938H27.75v16.77C39.224 45.908 48 35.978 48 24z" /> </g> <defs> <clipPath id="a"> <path fill="#fff" d="M0 0h48v48H0z" /> </clipPath> </defs> </svg> </a> <a href="javascript:void()"> <svg className="w-6 h-6 hover:text-gray-500 duration-150" fill="none" viewBox="0 0 48 48" > <g clip-path="url(#clip0_17_80)"> <path fill="currentColor" d="M15.1 43.5c18.11 0 28.017-15.006 28.017-28.016 0-.422-.01-.853-.029-1.275A19.998 19.998 0 0048 9.11c-1.795.798-3.7 1.32-5.652 1.546a9.9 9.9 0 004.33-5.445 19.794 19.794 0 01-6.251 2.39 9.86 9.86 0 00-16.788 8.979A27.97 27.97 0 013.346 6.299 9.859 9.859 0 006.393 19.44a9.86 9.86 0 01-4.462-1.228v.122a9.844 9.844 0 007.901 9.656 9.788 9.788 0 01-4.442.169 9.867 9.867 0 009.195 6.843A19.75 19.75 0 010 39.078 27.937 27.937 0 0015.1 43.5z" /> </g> <defs> <clipPath id="clip0_17_80"> <path fill="#fff" d="M0 0h48v48H0z" /> </clipPath> </defs> </svg> </a> <a href="javascript:void()"> <svg className="w-6 h-6 hover:text-gray-500 duration-150" fill="none" viewBox="0 0 48 48" > <g fill="currentColor" clip-path="url(#clip0_910_44)"> <path fill-rule="evenodd" d="M24 1A24.086 24.086 0 008.454 6.693 23.834 23.834 0 00.319 21.044a23.754 23.754 0 003.153 16.172 23.98 23.98 0 0012.938 10.29c1.192.221 1.641-.518 1.641-1.146 0-.628-.024-2.45-.032-4.442-6.676 1.443-8.087-2.817-8.087-2.817-1.089-2.766-2.663-3.493-2.663-3.493-2.178-1.478.163-1.45.163-1.45 2.413.17 3.68 2.461 3.68 2.461 2.138 3.648 5.616 2.593 6.983 1.976.215-1.545.838-2.596 1.526-3.193-5.333-.6-10.937-2.647-10.937-11.791a9.213 9.213 0 012.472-6.406c-.246-.6-1.069-3.026.234-6.322 0 0 2.015-.64 6.602 2.446a22.904 22.904 0 0112.017 0c4.583-3.086 6.594-2.446 6.594-2.446 1.307 3.288.484 5.714.238 6.322a9.194 9.194 0 012.476 6.414c0 9.163-5.615 11.183-10.957 11.772.859.742 1.626 2.193 1.626 4.421 0 3.193-.028 5.762-.028 6.548 0 .636.433 1.38 1.65 1.146a23.98 23.98 0 0012.938-10.291 23.754 23.754 0 003.151-16.175A23.834 23.834 0 0039.56 6.69 24.086 24.086 0 0024.009 1H24z" clip-rule="evenodd" /> <path d="M9.089 35.264c-.052.119-.243.154-.398.071-.155-.083-.27-.237-.214-.36.056-.122.242-.154.397-.07.155.082.274.24.215.359zM10.063 36.343a.4.4 0 01-.493-.11c-.155-.167-.187-.396-.068-.499.12-.102.334-.055.489.11.155.167.19.396.072.499zM11.008 37.714c-.147.103-.397 0-.536-.206a.395.395 0 010-.569c.147-.098.397 0 .537.202.139.202.143.47 0 .573zM12.292 39.042c-.131.146-.397.106-.616-.091-.219-.198-.27-.467-.139-.609.131-.142.397-.102.624.091.226.194.27.466.131.609zM14.092 39.816c-.06.186-.33.269-.6.19-.27-.08-.449-.3-.397-.49.051-.19.326-.277.6-.19.274.087.449.297.397.49zM16.056 39.95c0 .194-.223.36-.509.364-.286.004-.52-.154-.52-.348 0-.193.222-.36.508-.363.286-.004.52.15.52.347zM17.884 39.646c.036.194-.163.395-.45.443-.285.047-.536-.067-.572-.257-.035-.19.171-.395.45-.447.278-.05.536.068.572.261z" /> </g> <defs> <clipPath id="clip0_910_44"> <path fill="#fff" d="M0 0h48v48H0z" /> </clipPath> </defs> </svg> </a> <a href="javascript:void()"> <svg className="w-6 h-6 hover:text-gray-500 duration-150" fill="currentColor" viewBox="0 0 48 48" > <g clip-path="url(#clip0_17_63)"> <path d="M24 4.322c6.413 0 7.172.028 9.694.14 2.343.104 3.61.497 4.453.825 1.116.432 1.922.957 2.756 1.791.844.844 1.36 1.64 1.79 2.756.329.844.723 2.12.826 4.454.112 2.53.14 3.29.14 9.693 0 6.413-.028 7.172-.14 9.694-.103 2.344-.497 3.61-.825 4.453-.431 1.116-.957 1.922-1.79 2.756-.845.844-1.642 1.36-2.757 1.791-.844.328-2.119.722-4.453.825-2.532.112-3.29.14-9.694.14-6.413 0-7.172-.028-9.694-.14-2.343-.103-3.61-.497-4.453-.825-1.115-.431-1.922-.956-2.756-1.79-.844-.844-1.36-1.641-1.79-2.757-.329-.844-.723-2.119-.826-4.453-.112-2.531-.14-3.29-.14-9.694 0-6.412.028-7.172.14-9.694.103-2.343.497-3.609.825-4.453.431-1.115.957-1.921 1.79-2.756.845-.844 1.642-1.36 2.757-1.79.844-.329 2.119-.722 4.453-.825 2.522-.113 3.281-.141 9.694-.141zM24 0c-6.516 0-7.331.028-9.89.14-2.55.113-4.304.526-5.822 1.116-1.585.619-2.926 1.435-4.257 2.775-1.34 1.332-2.156 2.672-2.775 4.247C.666 9.806.253 11.55.141 14.1.028 16.669 0 17.484 0 24s.028 7.331.14 9.89c.113 2.55.526 4.304 1.116 5.822.619 1.585 1.435 2.925 2.775 4.257a11.732 11.732 0 004.247 2.765c1.528.591 3.272 1.003 5.822 1.116 2.56.112 3.375.14 9.89.14 6.516 0 7.332-.028 9.891-.14 2.55-.113 4.303-.525 5.822-1.116a11.732 11.732 0 004.247-2.765 11.732 11.732 0 002.766-4.247c.59-1.528 1.003-3.272 1.115-5.822.113-2.56.14-3.375.14-9.89 0-6.516-.027-7.332-.14-9.891-.112-2.55-.525-4.303-1.115-5.822-.591-1.594-1.407-2.935-2.747-4.266a11.732 11.732 0 00-4.247-2.765C38.194.675 36.45.262 33.9.15 31.331.028 30.516 0 24 0z" /> <path d="M24 11.672c-6.806 0-12.328 5.522-12.328 12.328 0 6.806 5.522 12.328 12.328 12.328 6.806 0 12.328-5.522 12.328-12.328 0-6.806-5.522-12.328-12.328-12.328zm0 20.325a7.998 7.998 0 010-15.994 7.998 7.998 0 010 15.994zM39.694 11.184a2.879 2.879 0 11-2.878-2.878 2.885 2.885 0 012.878 2.878z" /> </g> <defs> <clipPath id="clip0_17_63"> <path d="M0 0h48v48H0z" /> </clipPath> </defs> </svg> </a> </div> </div> </div> </footer> ); }; export default Footer;
Let’s look at the pros and cons of using Float UI in your workflow.
In today’s fast-paced development landscape, meeting tight deadlines while delivering professional, responsive websites is no longer a daunting task, thanks to tools like Float UI.
By leveraging pre-built, customizable components powered by Tailwind CSS, developers can rapidly assemble polished interfaces without compromising quality or maintainability. As demonstrated in building SmartBrew’s business page, Float UI streamlines the process: from Hero sections to FAQs, each component integrates seamlessly into a React project, saving hours of manual coding.
The result? A fully functional, mobile-friendly website tailored to client specifications — completed in a fraction of the time it would take to build from scratch. While Float UI does require familiarity with Tailwind CSS, its open-source nature and flexibility make it an invaluable asset for developers tackling urgent projects or agencies aiming to scale efficiently.
By combining Float UI’s template library with strategic customization, developers can focus on unique branding and user experience rather than reinventing the wheel.
The final deployed app (viewable here) stands as a testament to how modern tools empower teams to deliver exceptional results under pressure.
Whether you’re a freelancer, part of an agency, or an in-house developer, Float UI proves that speed and quality can coexist—no caffeine-fueled coding marathons required.
As web frontends get increasingly complex, resource-greedy features demand more and more from the browser. If you’re interested in monitoring and tracking client-side CPU usage, memory usage, and more for all of your users in production, try LogRocket.
LogRocket is like a DVR for web and mobile apps, recording everything that happens in your web app, mobile app, or website. Instead of guessing why problems happen, you can aggregate and report on key frontend performance metrics, replay user sessions along with application state, log network requests, and automatically surface all errors.
Modernize how you debug web and mobile apps — start monitoring for free.
Hey there, want to help make our blog better?
Join LogRocket’s Content Advisory Board. You’ll help inform the type of content we create and get access to exclusive meetups, social accreditation, and swag.
Sign up nowLearn how to use React-Toastify in 2025, from setup to styling and advanced use cases like API notifications, async toasts, and React-Toastify 11 updates.
Discover open source tools for cross-browser CSS testing like Playwright and BrowserStack to catch rendering errors, inconsistent styling, and more.
With the introduction of React Suspense, handling asynchronous operations like data fetching has become more efficient and declarative.
Build a TypeScript ETL pipeline that extracts, transforms, and loads data using Prisma, node-cron, and modern async/await practices.