search results:

    • Standard
    • React
    Pricing Learn Community
    • + D
    • Light
    • Dark
    • System
    logo TW Elements
    • Getting started
      • Quick start
      • Tutorials
      • Design system
      • Local installation
      • Optimization
      • Dark mode
      • Theming
      • Changelog
      • Migrating to v2
      • Internationalization guide
      • Class customization
      • Icons Integration
    • CommercialNew
      • Pricing
      • License
      • Installation
      • Git & repository
      • Premium Support
    • Integrations
      • Angular
      • ASP.NET
      • Django
      • Express
      • Laravel
      • Next
      • Nuxt
      • Qwik
      • React
      • Remix
      • Solid
      • Svelte
      • SvelteKit
      • Vue
    • Content & styles
      • Animations
      • Animations Extended
      • Colors
      • Dividers
      • Figures
      • Headings
      • Hover effects
      • Icons
      • Images
      • Mask
      • Shadows
      • Typography
    • Navigation
      • Breadcrumbs
      • Footer
      • Headers
      • Mega menu
      • Navbar
      • Offcanvas
      • Pagination
      • Pills
      • Scrollspy
      • Sidenav
      • Tabs
    • Components
      • Accordion
      • Alerts
      • Avatar
      • Badges
      • Button group
      • Buttons
      • Cards
      • Carousel
      • Chips
      • Collapse
      • Dropdown
      • Gallery
      • Jumbotron
      • Lightbox
      • Link
      • List group
      • Modal
      • Notifications
      • Paragraphs
      • Placeholders
      • Popconfirm
      • Popover
      • Progress
      • Rating
      • Scroll back to top button
      • Social buttons
      • Spinners
      • Stepper
      • Testimonials
      • Timeline
      • Toast
      • Tooltip
      • Video
      • Video carousel
    • Forms
      • Autocomplete
      • Checkbox
      • Datepicker
      • Datetimepicker
      • File input
      • Form templates
      • Input Group
      • Inputs
      • Login form
      • Multi range slider
      • Radio
      • Range
      • Registration form
      • Search
      • Select
      • Switch
      • Textarea
      • Timepicker
      • Validation
    • Data
      • Charts
      • Charts advanced
      • Datatables
      • Tables
    • Methods
      • Clipboard
      • Infinite scroll
      • Lazy loading
      • Loading management
      • Ripple
      • Scrollbar
      • Smooth scroll
      • Sticky
      • Touch
    • Design Blocks
      • Admin Charts
      • Admin Complex
      • Admin Forms
      • Admin Maps
      • Admin Navigation
      • Admin tables
      • Banners
      • Contact
      • Content
      • CTA
      • FAQ
      • Features
      • Headers
      • Hero / Intro sections
      • Logo clouds
      • Mega menu
      • News
      • Newsletter
      • Pricing
      • Projects
      • Stats
      • Stats admin
      • Team
      • Testimonials
    • Tools
      • Button generator
      • Card generator
      • Flexbox generator
      • Footer generator
      • Form builder
      • Grid generator
      • Icon generator
      • Instagram Filters generator
      • Logo generator
      • Table generator
      • Typography generator
    • Coming Soon
      • Angular
      • Builder
      • Templates
      • Vue
    • Resources
      • Playground
      • YouTube Channel
      • Private FB Group
      • Newsletter
      • UI Design course New
      • UI / UX tips

    TW Elements Next integration

    This article shows you how to integrate Next application with TW Elements. Free download, open source license.


    Prerequisites

    Before starting the project make sure to install the following utilities:

    • Node LTS (18.x.x or higher recommended)
    • Code editor. We recommend VSCode

    Creating a new Next application

    Let's create a fresh Next application so that we can go through all the steps together.

    Step 1

    Create new project.

    Note: Options used while creating the app: Typescript - Yes, ESLint - Yes, `src/` directory - Yes, App Router - both examples included in this tutorial.

    If you encounter the Request is not defined error, consider updating your Node.js version to at least v18.0.0 or higher. Alternatively, you can use Next.js v13.0.0 or a more recent version to address this issue.

    • Terminal
            
                
        npx create-next-app@latest
        cd my-project
        
            
        

    Step 2

    Run the development server.

    • Terminal
            
                
        npm run dev
        
            
        

    Installing and configuring Tailwind CSS and TW Elements

    Step 1

    Install Tailwind CSS.

    • Terminal
            
                
        npm install -D tailwindcss postcss autoprefixer
        npx tailwindcss init -p
        
            
        

    File structure

    If you have created a new next app, depending on the chosen options, your file structure could look like this:

          
            // with App Router
            my-project/
            ├── node_modules/
            ├── public/
            ├── src/        
            │   ├── pages/ - needs to be created
            │   ├── app/
            │   │   ├── favicon.ico
            │   │   ├── globals.css
            │   │   ├── layout.tsx
            │   │   └── page.tsx
            │   ├── index.css
            │   ├── ...
            │   └── index.js
            ├── package-lock.json
            ├── package.json
            ├── postcss.config.js
            ├── next.config.js
            ├── tsconfig.config.js
            ├── ...
            └── tailwind.config.js
    
            // without App Router
            my-project/
            ├── node_modules/
            ├── public/
            ├── src/        
            │   ├── pages/
            │   ├──── app/
            │   │     ├── _app.tsx
            │   │     ├── _document.tsx
            │   │     └── index.tsx
            │   └── styles/
            │         └── globals.css
            ├── package-lock.json
            ├── package.json
            ├── postcss.config.js
            ├── next.config.js
            ├── tsconfig.config.js
            ├── ...
            └── tailwind.config.js
          
        

    Step 2

    Add the paths to all of your template files in your tailwind.config.js file.

    • tailwind.config.js
            
                
        /** @type {import('tailwindcss').Config} */
        module.exports = {
          content: [
            "./app/**/*.{js,ts,jsx,tsx}",
            "./pages/**/*.{js,ts,jsx,tsx}",
            "./components/**/*.{js,ts,jsx,tsx}",
            "./node_modules/tw-elements/js/**/*.js",
    
            // Or if using `src` directory:
            "./src/**/*.{js,ts,jsx,tsx}",
            "./node_modules/tw-elements/js/**/*.js"
          ],
          theme: {
            extend: {},
          },
          darkMode: "class",
          plugins: [require("tw-elements/plugin.cjs")]
        }
        
            
        

    Step 3

    Add the @tailwind directives for each of Tailwind's layers to your globals.css. Additionally, delete the default font styles in layout.tsx file.

    • ./src/app/globals.css ./src/styles/globals.css
            
                
        @import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");
        @tailwind base;
        
        @layer base {
          html {
            @apply text-surface;
            @apply bg-white;
          }
          html.dark {
            @apply text-neutral-50;
            @apply bg-body-dark;
          }
        }
        
        @tailwind components;
        @tailwind utilities;
        
        p {
          @apply leading-[1.6];
        }      
        
            
        

    Step 4

    Install TW Elements.

    • Terminal
            
                
        npm install tw-elements
        
            
        

    Step 5

    Create standalone file with name of your component (for example MyComponent.tsx in src/pages directory - create one if it doesn't exist) and add dynamic import TWE components which are you intend to use. Also include necessary function initTWE. Initialize initTWE in a lifecycle method. Since tw-elements needs to be used client side don't forget to add "use client" at the beginning of the file.

    • ./src/pages/MyComponent.tsx
            
                
        "use client";
        import { useEffect } from "react";
        
        const MyComponent = () => {
          useEffect(() => {
            const init = async () => {
              const { Tooltip, initTWE } = await import("tw-elements");
              initTWE({ Tooltip });
            };
            init();
          }, []);
        
          return (
            <div className="mt-16 flex justify-center">
              <p className="text-lg">
                Hover the link to see the
                <a
                  href="#"
                  className="text-primary ps-1 transition duration-150 ease-in-out hover:text-primary-600 focus:text-primary-600 active:text-primary-700 dark:text-primary-400 dark:hover:text-primary-500 dark:focus:text-primary-500 dark:active:text-primary-600"
                  data-twe-toggle="tooltip"
                  title="Hi! I'm tooltip"
                >
                  tooltip
                </a>
              </p>
            </div>
          );
        };
        
        export default MyComponent;    
        
            
        

    Step 6

    Import the newly created component wrapping it into dynamic import with ssr object set to false. You can do it either in ./src/app/page.tsx or ./src/pages/index.tsx.

    • ./src/app/page.tsx ./src/pages/index.tsx
            
                
        import dynamic from "next/dynamic";
    
        const DynamicComponent = dynamic(() => import("../pages/MyComponent"), {
          ssr: false,
        });
        
        const Home = () => {
          return (
            <>
              <DynamicComponent />
            </>
          );
        };
        
        export default Home;    
        
            
        

    Step 7

    This step enables the reloading of Tailwind CSS styles. Start the app and see if everything's fine. Awesome! You're all set to dive into using TW Elements for your Next project. Have fun!

    • Terminal
            
                
        npm run dev
        
            
        

    Initializing via JS

    By default all components have autoinit which means they are initialized by data attributes. But if you want to make init by JavaScript - there is also possibility to do that.

    Step 1

    Import components which are you intend to use and initialize components in lifecycle hook.

    • ./src/pages/MyComponent.tsx
            
                
        "use client";
        import { useEffect } from "react";
        
        const MyComponent = () => {
          useEffect(() => {
            const init = async () => {
              const { Tooltip } = await import("tw-elements");
        
              const myTooltip = new Tooltip(document.getElementById("my-tooltip"));
            };
            init();
          }, []);
        
          return (
            <div className="mt-16 flex justify-center">
              <p className="text-lg">
                Hover the link to see the
                <a
                  id="my-tooltip"
                  href="#"
                  className="text-primary ps-1 transition duration-150 ease-in-out hover:text-primary-600 focus:text-primary-600 active:text-primary-700 dark:text-primary-400 dark:hover:text-primary-500 dark:focus:text-primary-500 dark:active:text-primary-600"
                  title="Hi! I'm tooltip"
                >
                  tooltip
                </a>
              </p>
            </div>
          );
        };
        
        export default MyComponent;      
        
            
        

    Troubleshooting

    Problem overview:

    Users might face difficulties with improper functioning of components in some frameworks for TW Elements. This is due to the fact that some of them aren't initializing properly.

    Suggested solution:

    Consider importing tw-elements package dynamically. By doing it, you can enhance the initialization process, potentially resolving any issues related to component functionality. Additionally, ensure that the initTWE() method is called in the correct sequence and with the appropriate parameters, facilitating a smoother experience with TWE components.

    Note: It should also solve errors like document is not defined or (Name of TWE Component) is not imported from "tw-elements". For the second issue, attempting to import components in ES format could be an alternative solution.

    ES import:

    • with next.config.js configuration
    • without next.config.js configuration
            
                
              // next.config.js
              module.exports = {
                webpack: (config, { isServer }) => {
                  // For packages that provide different entry points, specify the one you want to use.
                  config.resolve.alias = {
                    ...config.resolve.alias,
                    "tw-elements":
                      "tw-elements/dist/js/tw-elements.es.min.js",
                  };
                  return config;
                },
              };
    
              // component.tsx
              useEffect(() => {
                import { Tooltip, initTWE } from "tw-elements";
                
                initTWE({ Tooltip };)
              }, []);
              
            
        
            
                
              useEffect(() => {
                import { Tooltip, initTWE } from "tw-elements/dist/js/tw-elements.es.min.js";
                
                initTWE({ Tooltip };)
              }, []);
              
            
        

    ES Dynamic import:

    • Code
            
                
              useEffect(() => {
                const init = async () => {
                  const { Tooltip, initTWE } = await import("tw-elements");
                  initTWE({ Tooltip });
                };
                init();
              }, []);
              
            
        

    Source TW Elements Team

    Problem overview:

    Users may encounter initialization issues with TWE components when navigating through applications with routing mechanisms. The default behavior of the initTWE method includes checking if components are already initialized, which can lead to complications when components are unmounted and then remounted during routing.

    Suggested solution:

    Consider using using autoReinits option in initTWE method. By default it's value is set to false. By changing the value to true, the initTWE method won't check if components were already initialized.

    • Code
            
                
                initTWE({ Tooltip }, { allowReinits: true });
              
            
        

    Source TW Elements Team


    Related resources

    Tutorials:

    introduction key concepts quick start vite mdb go and deploy create website about versions installation setup overview create landing page javascript tailwind css intellisense deploy repository

    Integrations :

    angular django express laravel nuxt react remix solid svelte svelte vue

    Design System (Figma):

    • Prerequisites
    • Creating a new Next application
    • Installing and configuring Tailwind CSS and TW Elements
    • Initializing via JS
    • Troubleshooting
    • Related resources
    Get useful tips & free resources directly to your inbox along with exclusive subscriber-only content.
    Join our mailing list now
    © 2024 Copyright: MDBootstrap.com

    Access restricted

    To view this section you must have an active PRO account

    Log in to your account or purchase an TWE subscription if you don't have one.

    Buy TWE PRO