Days
Hours
Minutes
Seconds
x

New Froala Editor v4.5.1 is here – Learn More

Skip to content

Set Up a Custom Visual HTML Text Editor in 5 Easy Steps with No Code Tool

Visual HTML Text Editor

As a user of WYSIWYG and text editors, you may have found the process of customizing and setting up your preferred editor to be a daunting task, especially if you lack coding skills. However, with the Froala Editor’s Customizer tool, you can easily create a custom text editor without writing a single line of code.

In this blog post, we’ll guide you through the step-by-step process of setting up a custom text editor using the Froala Customizer. By the end, you’ll have a fully tailored editor that meets your specific needs, saving you valuable development time and allowing you to focus on creating great content.

Why Choose Froala?

Froala is a powerful WYSIWYG editor that offers a wide range of features and customization options. Whether you’re looking to create a simple text editor or a feature-rich content management system, Froala has the tools to help you get the job done.

One of the standout features of Froala is its Customizer tool, which allows you to easily configure the editor to your liking without any coding knowledge. This makes Froala an ideal choice for users who want to create a custom text editor but don’t have the time or resources to build it from scratch.

Setup Visual HTML Text Editor with no code tool

Access the Froala Customizer

To get started, head over to the Froala Customizer. This user-friendly interface will allow you to customize every aspect of the Froala Editor, from the toolbar buttons to the interface language.

no code tool

Step 1: Select Your Editor Preset

To set up your custom text editor, first choose an editor preset from the five available options, each has a brief description. Read here for more details on the differences between modes.

After selecting a preset, a demo will be shown. Take a moment to review the options and see how it looks. Click “Next” once you’ve found your preferred option.

Step1

Step 2: Customize Features

Froala Text Editor offers a wide range of options, from basic formatting tools to advanced features like image and video insertion. These features are delivered through plugins to create a powerful modular architecture.

In this step, you’ll find a comprehensive list of all the Froala plugins. Expanding each plugin will reveal its related options and a description of each feature. The “General” tab contains settings that aren’t tied to a specific plugin.

In this step, Froala’s Customizer also allows you to configure advanced features, such as file upload options, language settings, and more. Depending on your needs, you can enable or disable these features to create a tailored editing experience. This allows you to customize the editor’s functionality and appearance without any coding knowledge.

For example, expand the “General” tab and select the “height” option. A text field will appear where you can enter a value, like “300”. Just like that, you’ve customized the editor’s height.

As you make changes, you’ll see all your selected options listed under “Selected options.” This makes it easy to review your customizations before moving on.

Step 2

Once you’re satisfied, click “Next” to continue setting up your custom text editor.

Step 3: Customize Toolbar

Once you’ve selected the features you want to include, you can customize the toolbar layout. Drag and drop the buttons to arrange them in the order you prefer. You can also add, remove, or group buttons as needed to create a streamlined and intuitive interface for your users.

Step 3

Step 4: Customize The Editor Interface Language

The final step in setting up your custom text editor is to select the language for the editor interface. Froala supports over 35 languages, so you can choose the one that best fits your users’ needs. Simply select the desired language from the dropdown menu, and the editor’s buttons, tooltips, and other interface elements will be displayed in that language.

Step 4

For Right-To-Left languages, the editor toolbar buttons will automatically adjust to display from right to left.

Step 5: Download Your Custom Code

By reaching this step, you have completed all the customization steps. Fill the displayed form and click “Download” to download the custom Froala Editor code. Extract the downloaded folder, you will find the HTML, CSS, and JavaScript code for your custom text editor in the index.html file. This code can then be integrated into your website or application, allowing your users to take advantage of the tailored text editor you’ve created.

Step 5

The Froala Customizer makes it easy to iterate on your design, so you can continue refining the editor as your needs evolve. With this no-code tool, you can quickly and easily build a custom text editor that perfectly fits your project requirements.

Conclusion

By using the Froala Customizer, you can create a custom text editor that perfectly fits your needs, all without writing a single line of code. This powerful tool allows you to easily configure the editor’s toolbar, appearance, and advanced features, saving you valuable time and resources.

This no-code tool makes the Froala setup process incredibly easy, as the generated code is ready-to-use and requires minimal setup. This means you can have your custom text editor up and running in no time, without the need for extensive development work.

Whether you’re a content creator, a web developer, or simply someone who wants a more personalized editing experience, the Froala Customizer is an excellent choice. Give it a try today and see how it can streamline your text editing workflow.

 

Visual HTML Editor Tip: Take Images to the Next Level with AI Enhancements

We see AI everywhere these days, but what makes it so valuable in practical applications? For one, removing the dreaded “red eye” effect from photos. Another example is automatically generating some relevant tags for an image after uploading it. These features are just a glimpse into how AI can take images to the next level. In this blog post, we’ll explore how you can easily incorporate AI enhancements like red eye removal and auto image tagging into your visual HTML editor using Froala v4.4, Filestack, and React 18. Let’s dive in!

Key Takeaways

  • Images and applications greatly benefit from AI enhancements
  • Red eye removal fixes the “red eye” effect from photos taken in low-light conditions
  • Auto image tagging gathers descriptive tags that correspond to an image’s general features
  • Froala makes implementing both red eye removal and auto image tagging much easier
  • Explore more AI features like OCR and image sentiment detection with Froala and Filestack

What Are AI Enhancements?

AI enhancements refer to tools or processes that use machine learning and computer vision to analyze and improve images or other data. These features streamline processes that would normally take plenty of effort and time. This may sound daunting, but thankfully ready-made AI tools exist today. This means that now’s a great time to start incorporating these into your applications (if you haven’t already). Some examples include:

  • Red eye removal: Deals with fixing the “red eye” effect caused by low-light photography (e.g., using flash in a dark setting). By removing such unwanted effects, you can delight your users by making their pictures look a lot cleaner.
  • Auto image tagging: Analyzes an image and generates descriptive tags that highlight its key features. This greatly helps marketers, advertisers, eCommerce platforms, and more.
  • Image SFW checking: Scans an image and determines whether it’s safe for work (SFW) or not. Perfect for community applications, social media platforms, or other user content-heavy applications.
  • Image sentiment analysis: Detects emotions from images (e.g., happy, sad, frustrated, confused). This is a flexible tool for a wide range of users.

Filestack already has some APIs that help with implementing most of these enhancements. Moreover, Froala also natively comes with Filestack, making the implementation process even easier when using a WYSIWYG editor. Let’s see how we can do that in the next section.

How to Include AI Enhancements in Your Visual HTML Editor

Set up Your Visual HTML Editor

First, create a React app, and then navigate to your project’s directory. Afterwards, run the following command to install the latest version of Froala:

npm install react-froala-wysiwyg

Froala v4.4 comes with some cool updates, including support for React 18 and Angular 19. This time, we’ll use the former. Now that you have Froala in your project, create a new folder called “components” under the “srcdirectory. Under this new folder, create a new file called “FroalaComponent.jsx” and add the following code:

import React, { useEffect, useState } from 'react';
import 'froala-editor/css/froala_style.min.css';
import 'froala-editor/css/froala_editor.pkgd.min.css';
import FroalaEditorComponent from 'react-froala-wysiwyg';
import 'froala-editor/js/plugins.pkgd.min.js';

function FroalaComponent() {
    const [tags, setTags] = useState([]);
    const config = {
        filestackOptions: {
            uploadToFilestackOnly: true,
            filestackAPI: 'YourFilestackAPIKey',
            pickerOptions: {
              accept: ["image/*"],
              fromSources: ["local_file_system"],
            },
        },
        events: {
            'filestack.uploadedToFilestack': function (response) {
                if(response && response.filesUploaded[0].handle){
                    const fileHandle = response.filesUploaded[0].handle;
                    // this is where we'll handle the red eye removal and image tagging AI enhancements
                    performEnhancements(fileHandle, this);
                }
                else{
                    console.error("Image upload failed, no URL found in response", response);
                }
            }
        },
        heightMin: 500,
        width: 1000
    };

    useEffect(() => {
        // import Filestack scripts
        const filestackScript1 = document.createElement('script');
        filestackScript1.src = 'https://static.filestackapi.com/filestack-js/3.32.0/filestack.min.js';
        filestackScript1.async = true;
        document.body.appendChild(filestackScript1);

        const filestackScript2 = document.createElement('script');
        filestackScript2.src = 'https://static.filestackapi.com/filestack-drag-and-drop-js/1.1.1/filestack-drag-and-drop.min.js';
        filestackScript2.async = true;
        document.body.appendChild(filestackScript2);

        const filestackScript3 = document.createElement('script');
        filestackScript3.src = 'https://static.filestackapi.com/transforms-ui/2.x.x/transforms.umd.min.js';
        filestackScript3.async = true;
        document.body.appendChild(filestackScript3);

        const filestackStylesheet = document.createElement('link');
        filestackStylesheet.rel = 'stylesheet';
        filestackStylesheet.href = 'https://static.filestackapi.com/transforms-ui/2.x.x/transforms.css';
        document.head.appendChild(filestackStylesheet);

        return () => {
            document.body.removeChild(filestackScript1);
            document.body.removeChild(filestackScript2);
            document.body.removeChild(filestackScript3);
            document.head.removeChild(filestackStylesheet);
        };
    }, []);

    return (
        <div>
            <div className="editor">
                <FroalaEditorComponent tag='textarea' config={config} />
            </div>
            <div id="image-tagging-results">
                <h3>Image Tagging Analysis:</h3>
                <ul>
                    {tags.map(([key, value], index) => (
                        <li key={index}>
                            {key}: {value}
                        </li>
                    ))}
                </ul>
            </div>
        </div>
    );
}

export default FroalaComponent;

The code above deals with the editor setup, including the necessary Froala options, Filestack options and scripts, and events. On a successful upload, we’ll call the “performEnhancements” function, which takes both the uploaded file’s handle and the editor instance as parameters. But we’ll talk about this more later on. For now, note that the FroalaComponent includes both the editor and a space where we’ll load the image tags. When you’re done with the editor setup, go to the “App.js” file and replace the default code with:

import './App.css';
import FroalaComponent from './components/FroalaComponent';

function App() {
  return (
    <div className="App">

      <FroalaComponent />
    </div>
  );
}

export default App;

This calls the FroalaComponent in your application. By now, you should see the editor when you run the application. And while you’re free to play around with its features, we’re not quite done yet. It’s time to add some AI enhancements into our React application.

Add Red Eye Removal

Remember the “performEnhancements” function in FroalaComponent? Let’s create it now:

async function performEnhancements(fileHandle, editorInstance) {
        const redEyeURL = `https://cdn.filestackcontent.com/redeye/${fileHandle}`;

        try {
            editorInstance.html.insert(
                `<img src="${redEyeResultURL}" alt="Enhanced Image" style="display: block; margin: 20px auto; width: 302px; height: 190.23px;" />`
            );
        }
        catch(error) {
            console.error("Error during enhancements:", error);
        }
    }

Red eye removal requires just the Filestack API (“redeye”) and your file handle. To start off, create the URL by appending these requirements to the Filestack CDN. We’ll call that “redEyeURL.” Next, we can insert the URL directly into the editor to display it. If you need to store this URL or use it elsewhere, you can declare it as a constant or variable. That’s it for red eye removal. Let’s move on to how you can generate image tags automatically.

Handle Auto Image Tagging

In the same file (and “performEnhancements” function), add the following code:

const policy = "YourFilestackPolicy";
const signature = "YourFilestackSignature";
const autoTagURL = `https://cdn.filestackcontent.com/security=p:${policy},s:${signature}/tags/${fileHandle}`;

const autoTagResult = await fetch(autoTagURL);
const tagData = await autoTagResult.json();
const tags = tagData?.tags?.auto;
if(tags) {
     setTags(Object.entries(tags));
}
else {
     console.error("No tags found in response.");
}

You can get both the policy and signature by generating them under the “Security” tab of the Filestack dashboard. You’ll need these for the auto image tagging feature. This time, instead of appending just the API keyword, add the security keywords, followed by the “tags” part and the file handle. Next, fetch a result from the auto tagging URL and convert it into JSON format. You’ll end up with an object of tags. Extract the data (key-value pairs, e.g., “face: 98, human: 99”) and set the tags into our displayable constant. All that’s left now is to run the application.

Upload an Image Using the Visual HTML Editor

In your CLI, run “npm start” to view the application. Click on the Filestack upload icon, which brings up the Filestack uploader UI. Choose an image that contains some form of red eye effect and upload it:

The uploaded image of a person with a red eye effect

After clicking the upload button, you should see the new, enhanced image together with the results of the image tagging process.

The result of both the red eye removal and image tagging AI enhancement APIs from Filestack. After uploading the image using the visual HTML editor, the red eye effect was successfully removed and that the generated tags are accurate.

From the result of the image tagging analysis, the uploaded image contains a portrait of an adult woman’s face. All the tags seem correct and accurate. Furthermore, the red eye effect from the original photo has disappeared, cleanly, I might add. And all it took to implement both AI enhancement features were a few lines of code.

Wrapping up: Enhance Your Visual HTML Editor with AI Today

Adding AI enhancements like red eye removal and automatic image tagging to your visual HTML editor isn’t just cool—it’s practical and efficient. With tools like Froala and Filestack, you can easily implement these advanced features to significantly improve the user experience in your application. And why stop there? Dive into other powerful AI features like OCR, image sentiment analysis, and SFW detection to take your app to new heights. It is, after all, a great time to include AI in our applications.

Integrating Froala as a Functional Component in React 18

Froala as a functional component

As a React developer, you’re always on the lookout for the latest tools and technologies to enhance your development workflow. In this blog post, we’ll explore how you can seamlessly integrate a powerful rich text editor, Froala Editor, into your React 18 applications.

Froala 4.4 and React 18 Support

Froala, a leading provider of content editing solutions, has recently released version 4.4 which now fully supports React 18. This means that you can easily incorporate the Froala Editor v4.4 into your React 18 projects, taking advantage of the latest features and improvements in the React ecosystem.

Benefits of Updating to Froala 4.4

By updating your application to use the Froala React SDK, you’ll be able to:

  • Leverage the latest features and enhancements in the Froala Editor
  • Ensure compatibility with the latest version of React (18)
  • Improve the overall performance and user experience of your application.

Integrating Froala as a Functional Component

To get started with integrating Froala as a functional component in your React 18 application, follow these steps:

  1. Install the Froala 4.4 React SDK:
npm install react-froala-wysiwyg --save
  1. Create a functional component that uses the Froala Editor. Create a new directory in the src directory called components and create a file called MyEditorComponent.jsx in that directory.
  2. Open MyEditorComponent.jsx and import the Froala Editor component and the necessary CSS files.
import React from "react";

// Require Editor CSS files.

import "froala-editor/css/froala_style.min.css";

import "froala-editor/css/froala_editor.pkgd.min.css";

import FroalaEditorComponent from "react-froala-wysiwyg";

// Import all Froala Editor plugins;

// import 'froala-editor/js/plugins.pkgd.min.js';

// Import a single Froala Editor plugin.

// import 'froala-editor/js/plugins/align.min.js';

// Import a language file.

// import 'froala-editor/js/languages/de.js';

// Import a third-party plugin.

// import 'froala-editor/js/third_party/image_tui.min.js';

// import 'froala-editor/js/third_party/embedly.min.js';

// import 'froala-editor/js/third_party/spell_checker.min.js';

// Include font-awesome css if required.

// install using "npm install font-awesome --save"

// import 'font-awesome/css/font-awesome.css';

// import 'froala-editor/js/third_party/font_awesome.min.js';
  1. Render the Froala SDK component
// Render Froala Editor component.

function MyEditorComponent() {

  return (

    <div class="editor">

      <h3> Froala's React WYSIWYG Editor</h3>

      <FroalaEditorComponent tag="textarea" />

    </div>

  );

}

export default MyEditorComponent;
  1. Add to other components. For example, to add in `src/App.js`
import "./styles.css";

import MyEditorComponent from "./components/MyEditorComponent";

export default function App() {

  return (

    <div className="App">

      <h1>Hello CodeSandbox</h1>

      <h2>Start editing to see some magic happen!</h2>

      <MyEditorComponent />

    </div>

  );

}

By following these steps, you can easily integrate the Froala Editor as a functional component in your React 18 application, allowing your users to create and edit rich content with ease.

Froala Editor Customization In React

To further customize the Froala Editor in your React 18 application, you can leverage the various configuration options and event handlers provided by the Froala API.

Add a config attribute to the FroalaEditorComponent utilizing the Froala options, events, and methods to customize the editor to your needs.

function MyEditorComponent() {

  let config = {

    documentReady: true,

    heightMin: 300,

    events: {

      contentChanged: function (e, editor) {

        console.log("test");

      },

    },

  };

  return (

    <div class="editor">

      <h3> Froala's React WYSIWYG Editor</h3>

      <FroalaEditorComponent tag="textarea" config={config} />

    </div>

  );

}

This allows you to tailor the editor’s appearance, functionality, and behavior to match the specific needs of your project.

Additionally, you can integrate third-party plugins and language files to extend the editor’s capabilities, ensuring a seamless and feature-rich content editing experience for your users.

By taking advantage of these customization options, you can create a truly unique and engaging rich text editing solution within your React 18 application.

Why Should I Use Froala With React in 2025?

Using Froala with React in 2025 offers several key advantages. Firstly, the tight integration between the Froala Editor and the React ecosystem ensures seamless compatibility with the latest React features and best practices. This allows you to leverage the full power of React 18 and beyond, delivering a highly responsive and performant content editing experience.

Additionally, Froala’s robust plugin ecosystem and extensive customization options enable you to tailor the editor to your specific requirements, ensuring a unique and engaging user interface for your application.

Froala Editor V4 integrates with Filestack to provide a seamless cloud storage solution for images, videos, and other file types.

By embracing Froala and React in 2025, you can future-proof your content management solutions and provide your users with a cutting-edge rich text editing experience.

How Easy Is It To Upload Images In Froala with React?

Froala makes it easy to upload images in your React application. They offer two convenient options:

  1. Built-in Image Upload: Froala’s built-in image upload functionality seamlessly integrates with your React app. All you need to do is configure the Froala Editor’s image upload options, and your users can upload images directly from their devices or external sources. The only additional step is setting up a server to store the uploaded images.
  2. Filestack Integration: Froala also integrates with Filestack, a powerful upload and cloud storage solution. This integration gives you advanced file handling capabilities, allowing you to securely store and manage your application’s media assets. The Filestack integration streamlines the image upload experience within your React-powered app. Plus, you can apply image transformations directly within the Froala Editor, before or after uploading the images.

The Filestack integration requires minimal configuration – you’ll just need to create a Filestack account to get an API key.

Both options make it easy to incorporate rich image functionality into your React application, enhancing the content creation experience for your users.

Why is Froala significantly cheaper than TinyMCE?

Froala’s transparent pricing model provides a fixed annual fee for using the editor and all its features. Unlike TinyMCE, Froala does not impose limits on the number of editor loads or charge extra for additional features. Consequently, Froala is significantly cheaper than TinyMCE in many use cases.

This cost-effectiveness, combined with Froala’s robust customization capabilities and seamless integration with React, makes it an attractive choice for developers seeking a high-quality WYSIWYG editor for their React 18 applications.

How to Migrate from TinyMCE to Froala in React?

Migrating from TinyMCE to Froala in a React application is a straightforward process. The key steps involve removing the TinyMCE SDK, installing the Froala SDK, importing the necessary components, and configuring the editor to match your existing setup.

By following this comprehensive migration from TinyMCE to Froala in React guide, you can seamlessly transition your content editing experience, preserving your users’ familiarity while benefiting from Froala’s features, customization options, and cost-effective pricing model.

Conclusion

Integrating the Froala Editor as a functional component in your React 18 application is a powerful way to enhance your content creation and management capabilities. By leveraging the latest version of Froala and taking advantage of its seamless compatibility with React 18, you can deliver a cutting-edge rich text editing experience to your users.

The step-by-step guide provided in this article walks you through the process of setting up the Froala Editor as a reusable component, allowing you to easily customize it to match the unique needs of your project. With Froala’s robust plugin ecosystem, extensive configuration options, and tight integration with cloud storage solutions like Filestack, you can create a truly unique and engaging content editing workflow within your React 18 application.

If you’re a React developer looking to elevate your content management capabilities, we encourage you to try integrating Froala Editor into your next project. Froala is an excellent choice that will help you deliver a superior user experience for your application’s content creators.

If you have any questions or need further assistance, don’t hesitate to reach out to the Froala team or explore the comprehensive documentation.

Building a Responsive Website with a Bootstrap Editor: A Step-by-Step Guide

Developers often ask what is Bootstrap and why it has become a cornerstone in modern web projects. In simple terms, Bootstrap is a front-end framework that helps you create mobile-friendly, professional websites quickly.
As the Developer Product Marketing Manager (PMM) at Froala, I have seen how powerful tools like a bootstrap editor can simplify design tasks. Moreover, our users frequently integrate Froala Editor with Bootstrap for a cohesive workflow.
In this article, I will walk you through how to make responsive website using Bootstrap by showcasing a dog adoption agency website example. You will also learn how to embed Filestack for image transformations and add a Froala-powered comment section.

Below, we will explore several bootstrap responsive website examples in one project. We will cover essential steps—such as creating a sticky navigation bar, building a hero section, adding a carousel, and displaying adoptable dogs in a grid. In addition, we will discuss bootstrap uses, highlight bootstrap coding snippets, and demonstrate use of bootstrap in HTML. Let us dive in.

1. Why Bootstrap Matters

First, you might wonder, “What is bootstrap in web development?” Bootstrap is a collection of HTML, CSS, and JavaScript files designed to streamline the process of creating adaptive, visually consistent websites.

It provides a responsive grid system, pre-built components, and utility classes for styling. Because bootstrap is used for reducing repetitive tasks, developers can focus on functionality rather than spending hours on layout from scratch. Therefore, if you want to learn how to make HTML page responsive, the Bootstrap framework is an ideal starting point.

Furthermore, a bootstrap editor takes things to the next level by providing a drag-and-drop interface for building pages. This approach helps you visualize design changes instantly. However, you can still edit the code directly if you prefer a more hands-on method.

2. Project Overview

Let us build a dog adoption agency website as an all-in-one bootstrap responsive website example. We will include:

  1. Sticky Navigation Bar for easy access to different sections.
  2. Hero Section to introduce the site’s main message.
  3. Carousel to showcase images with Filestack placeholders.
  4. Adoptable Dogs Grid demonstrating bootstrap coding for cards and columns.
  5. Pricing Section for donation tiers.
  6. Filestack Mini-Section to handle uploads and transformations.
  7. Froala Editor snippet to power a “Leave a Comment” form or any rich-text editing scenario.

This structure will illustrate how to make responsive website using Bootstrap in a practical way. Additionally, we will embed Froala, a bootstrap editor for WYSIWYG so that you can see exactly what bootstrap is used for when combined with an advanced WYSIWYG editor.

3. Initial Setup

Below is the basic HTML skeleton you can use. Notice that we have included Bootstrap, Filestack, and Froala scripts. These files enable you to leverage the use of bootstrap in HTML, work with Filestack for images, and embed Froala for content editing:

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Dog Adoption Agency</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
    <!-- Froala Editor CSS -->
    <link href='https://cdn.jsdelivr.net/npm/[email protected]/css/froala_editor.pkgd.min.css' rel='stylesheet'
        type='text/css' /> <!-- Filestack JS and CSS (Picker, Drag-and-Drop, Transforms) -->
    <script src="https://static.filestackapi.com/filestack-js/3.32.0/filestack.min.js"> </script>
    <script
        src="https://static.filestackapi.com/filestack-drag-and-drop-js/1.1.1/filestack-drag-and-drop.min.js"> </script>
    <script src="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.umd.min.js"> </script>
    <link rel="stylesheet" href="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.css" />
    <!-- Froala Editor JS -->
    <script type='text/javascript'
        src='https://cdn.jsdelivr.net/npm/[email protected]/js/froala_editor.pkgd.min.js'> </script>
</head>

<body> <!-- Content goes here --> <!-- Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"> </script>
</body>

</html>

 

This starter code establishes a foundation for you to insert various bootstrap coding snippets. You are now ready to create a dynamic page layout.

4. Sticky Navigation Bar

A sticky navigation bar ensures easy site navigation. It remains in view as visitors scroll, making it more convenient to jump between sections. Here is an example:

<nav class="navbar navbar-expand-lg navbar-dark bg-dark sticky-top">
    <div class="container-fluid"> <a class="navbar-brand" href="#">DogAdopt</a> <button class="navbar-toggler"
            type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav"
            aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button>
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav ms-auto">
                <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">Home</a> </li>
                <li class="nav-item"> <a class="nav-link" href="#adopt">Adoptable Dogs</a> </li>
                <li class="nav-item"> <a class="nav-link" href="#pricing">Pricing</a> </li>
                <li class="nav-item"> <a class="nav-link" href="#comment">Comment</a> </li>
            </ul>
        </div>
    </div>
</nav>

Notice how sticky-top keeps the nav pinned at the top of your screen. Additionally, .navbar-expand-lg makes the navbar responsive for different device sizes.

A detailed explanation of each bootstrap class:

  • navbar
    A Bootstrap class that applies general navbar styling, including proper padding and font sizing.
  • navbar-expand-lg
    Makes the navbar expandable (collapsible into a “hamburger” icon) on screens smaller than the lg breakpoint (≥992px). At lg and above, the navbar is fully displayed horizontally.
  • navbar-dark
    Applies dark color styles to the navbar text and toggler icon. Typically used with a darker background.
  • bg-dark
    Gives the navbar (or any element) a dark background color defined by Bootstrap.
  • sticky-top
    Makes the navbar stick to the top of the page when scrolling.
  • container-fluid
    Creates a full-width container that spans the entire viewport width, with some left and right padding.
  • navbar-brand
    Used specifically for branding (like a logo or name) inside a navbar. It gets specific padding and font-size styling.
  • navbar-toggler
    A button class that styles the toggler (the “hamburger” icon) for collapsing the navbar on smaller devices.
  • navbar-toggler-icon
    Inserts the default icon (the three horizontal bars) for the collapsible menu button.
  • collapse navbar-collapse
    Groups elements (such as the nav links) that will collapse behind the toggler button at small screen sizes.
  • navbar-nav
    Wraps the list of navigation links (i.e., <ul>). Ensures proper padding, alignment, and alignment with the navbar format.
  • nav-item
    Applies specific spacing and styling to individual list items in the navbar.
  • nav-link
    Styles each link in the navbar for spacing, color, hover states, etc.
  • ms-auto
    Utility class that adds margin-start: auto; (left margin in LTR layouts), pushing the list to the right side.
  • active
    Applies an active state styling to the link, often a different color or highlight to show the current section.

5. Hero Section

When visitors arrive, they should immediately see your primary message. Use a hero section to emphasize what your site is about:

<section class="bg-light text-dark py-5">
    <div class="container text-center">
        <h1 class="display-4">Save a Life, Adopt a Dog</h1>
        <p class="lead">Join our community and provide a loving home to these adorable companions.</p> <a href="#adopt"
            class="btn btn-primary btn-lg">Find Your Companion</a>
    </div>
</section>

 

This layout effectively explains your organization’s purpose. Furthermore, the call-to-action button invites users to explore the adoptable dogs.

A detailed explanation of each Bootstrap class:

  • bg-light
    Gives a light (grayish) background color.
  • text-dark
    Sets the text color to dark (usually black or dark gray) to contrast with a light background.
  • py-5
    Utility class that adds vertical padding (p stands for padding, y stands for top and bottom). The 5 is a spacing scale from Bootstrap (larger numbers = more spacing).
  • container
    A fixed-width container that responsively adjusts to breakpoints. Adds horizontal auto margins and left/right padding.
  • text-center
    Centers the text (and inline elements) within this container.
  • display-4
    A large, hero-style font size (part of Bootstrap’s display heading classes).
  • lead
    Slightly increases font size and spacing to make text look more prominent, typically used for introductory paragraphs.
  • btn btn-primary btn-lg
    • btn: Base button styling.
    • btn-primary: Applies the primary color scheme (by default, a shade of blue).
    • btn-lg: Makes the button larger than the default size.

6. Carousel with Filestack Placeholders

Carousels let you highlight multiple images or announcements. By combining Bootstrap’s carousel with Filestack image placeholders, you can dynamically resize or transform images. Replace <YOUR_FILE_HANDLE_#> with actual Filestack handles:

<div id="dogCarousel" class="carousel carousel-dark slide" data-bs-ride="carousel">
    <div class="carousel-indicators"> <button type="button" data-bs-target="#dogCarousel" data-bs-slide-to="0"
            class="active" aria-current="true"></button> <button type="button" data-bs-target="#dogCarousel"
            data-bs-slide-to="1"></button> <button type="button" data-bs-target="#dogCarousel"
            data-bs-slide-to="2"></button> </div>
    <div class="carousel-inner">
        <div class="carousel-item active"> <img
                src="https://cdn.filestackcontent.com/resize=width:1200,height:500/hmzhYgUSZiIA0Ju2ocMo0"
                class="d-block w-20" alt="Friendly Dog 1"> </div>
        <div class="carousel-item"> <img
                src="https://cdn.filestackcontent.com/resize=width:1200,height:500/xsFLOcdRYKQOz4oQpmgg"
                class="d-block w-20" alt="Friendly Dog 2"> </div>
        <div class="carousel-item"> <img
                src="https://cdn.filestackcontent.com/resize=width:1200,height:500/e0DUJOjTjWmUQm0FxL7e"
                class="d-block w-20" alt="Friendly Dog 3"> </div>
    </div> <button class="carousel-control-prev" type="button" data-bs-target="#dogCarousel" data-bs-slide="prev"> <span
            class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="visually-hidden">Previous</span>
    </button> <button class="carousel-control-next" type="button" data-bs-target="#dogCarousel" data-bs-slide="next">
        <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="visually-hidden">Next</span>
    </button>
</div>

Therefore, this carousel will help you showcase events, success stories, or different adoptable dogs(or depending on your site). By adjusting Filestack parameters, you can customize image dimensions for various screen sizes.

Here’s what each Bootstrap class does:

  • carousel
    Base class for creating a carousel component in Bootstrap.
  • carousel-dark
    Applies a darker style to the carousel controls (like prev/next arrows and indicators).
  • slide
    Enables sliding animation between items.
  • data-bs-ride="carousel"
    An attribute that activates the carousel to start cycling automatically.
  • carousel-indicators
    Container for the small clickable indicators at the bottom of the carousel (the dots).
  • carousel-inner
    Wraps the carousel items (slides) inside. Only one slide should have the .active class at a time.
  • carousel-item
    Each individual slide in the carousel. Contains your content (images, text, etc.).
  • active
    Marks the currently visible slide in the carousel.
  • d-block
    A utility class that applies display: block; to the element—in this case, ensuring the image acts as a block-level element.
  • w-20
    Not part of the default Bootstrap spacing scale (which typically goes up to w-100 for 100% width). However, if present, it typically sets the element width to 20%. (This might be a custom or extended utility class. If it’s purely custom, it won’t be recognized as an official Bootstrap class but is often used in a similar pattern.)
  • carousel-control-prev / carousel-control-next
    Classes for the previous/next arrow buttons, styling them for the carousel layout.
  • carousel-control-prev-icon / carousel-control-next-icon
    Classes for the default icons used for the carousel controls.

Here’s what it looks like on mobile

7. Add a File Uploader (Optional)

You may want your users to upload new dog photos. Filestack allows dynamic uploads, which are perfect for content that changes frequently. Here is a mini-section to handle this process:

<section class="py-4 text-center">
    <div class="container">
        <h3>Manage Your Dog Photos with Filestack</h3>
        <p>Upload and transform images directly, then embed them on your site.</p> <button class="btn btn-secondary"
            onclick="openFilestackPicker()">Upload a New Dog Image</button>
    </div>
</section>
<script> // Replace 'YOUR_API_KEY' with your Filestack key
    const client = filestack.init('YOUR_API_KEY'); function openFilestackPicker() {
        client.picker({
            onUploadDone: (res) => {
                console.log('Uploaded file handle:', res.filesUploaded[0].handle); // Use this handle to update images in your cards or carousel 
            }
        }).open();
    } </script>

 

Additionally, Filestack handles transformations, security, and content delivery for uploaded images. This means your team can focus on the content rather than complicated upload workflows.

Bootstrap class explanations:

  • py-4
    Adds padding on the top and bottom (vertical) with a spacing scale of 4.
  • text-center
    Centers text and inline elements horizontally.
  • container
    A fixed-width, responsive container.
  • btn btn-secondary
    • btn: Base button styling.
    • btn-secondary: Applies the secondary color scheme (a grayish style by default).

8. Adoptable Dogs Section

Next, a grid layout can highlight the dogs that need homes. Bootstrap’s grid system aligns each card responsively:

<section id="adopt" class="py-5">
    <div class="container">
        <h2 class="mb-4 text-center">Meet Our Adorable Dogs</h2>
        <div class="row">
            <div class="col-md-6 col-lg-4 mb-4">
                <div class="card"> <img
                        src="https://cdn.filestackcontent.com/resize=width:1200,height:500/hmzhYgUSZiIA0Ju2ocMo"
                        class="card-img-top" alt="Buddy">
                    <div class="card-body">
                        <h5 class="card-title">Buddy</h5>
                        <p class="card-text">A playful pup who loves belly rubs and afternoon walks.</p> <a href="#"
                            class="btn btn-primary">Adopt Buddy</a>
                    </div>
                </div>
            </div>
            <div class="col-md-6 col-lg-4 mb-4">
                <div class="card"> <img
                        src="https://cdn.filestackcontent.com/resize=width:1200,height:500/xsFLOcdRYKQOz4oQpmgg"
                        class="card-img-top" alt="Lucy">
                    <div class="card-body">
                        <h5 class="card-title">Lucy</h5>
                        <p class="card-text">A gentle soul who gets along with children and other pets.</p> <a href="#"
                            class="btn btn-primary">Adopt Lucy</a>
                    </div>
                </div>
            </div>
            <div class="col-md-6 col-lg-4 mb-4">
                <div class="card"> <img
                        src="https://cdn.filestackcontent.com/resize=width:1200,height:500/e0DUJOjTjWmUQm0FxL7e"
                        class="card-img-top" alt="Max">
                    <div class="card-body">
                        <h5 class="card-title">Max</h5>
                        <p class="card-text">A loyal companion who enjoys fetch and lazy afternoons.</p> <a href="#"
                            class="btn btn-primary">Adopt Max</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

Here, .col-md-6 col-lg-4 ensures the cards rearrange automatically based on screen size, which helps illustrate how to make HTML page responsive with minimal CSS.

Grid layout classes explanation:

  • py-5
    Vertical padding class (top and bottom), size 5.
  • container
    Standard responsive container.
  • mb-4
    mb stands for margin-bottom. Adds a bottom margin of scale 4.
  • text-center
    Centers the text horizontally.
  • row
    Bootstrap’s row container that uses the flexbox grid system. Each direct child with a .col-... class becomes a column.
  • col-md-6 col-lg-4
    • col-md-6: On medium screens (≥768px), the column takes up half the container width.
    • col-lg-4: On large screens (≥992px), the column takes up one-third of the container width.
  • card
    A Bootstrap card component that groups content in a bordered box with some padding and a shadow by default.
  • card-img-top
    Styles an image to be placed at the top of the card with a specific border radius on corners.
  • card-body
    A wrapper class that adds card-specific padding around the content.
  • card-title
    Applies specific margin and font-size styles suitable for a card header/title.
  • card-text
    Styles the text within the card body (paragraph formatting, margins, etc.).
  • btn btn-primary
    Another button example using Bootstrap’s primary color scheme.

9. Pricing Section

Sometimes, adoption centers offer suggested donation tiers or membership perks. A pricing table can make these options more transparent:

 

<section id="pricing" class="bg-light py-5">
    <div class="container text-center">
        <h2 class="mb-4">Adoption Packages</h2>
        <div class="row">
            <div class="col-md-4 mb-4">
                <div class="card h-100">
                    <div class="card-body">
                        <h5 class="card-title">Basic</h5>
                        <p class="card-text">$50 Donation</p>
                        <ul class="list-unstyled">
                            <li>Initial Checkup</li>
                            <li>Vaccinations</li>
                        </ul> <a href="#" class="btn btn-primary">Adopt Now</a>
                    </div>
                </div>
            </div>
            <div class="col-md-4 mb-4">
                <div class="card h-100">
                    <div class="card-body">
                        <h5 class="card-title">Standard</h5>
                        <p class="card-text">$100 Donation</p>
                        <ul class="list-unstyled">
                            <li>All Basic Perks</li>
                            <li>Pet Insurance (6 months)</li>
                        </ul> <a href="#" class="btn btn-success">Adopt Now</a>
                    </div>
                </div>
            </div>
            <div class="col-md-4 mb-4">
                <div class="card h-100">
                    <div class="card-body">
                        <h5 class="card-title">Premium</h5>
                        <p class="card-text">$150 Donation</p>
                        <ul class="list-unstyled">
                            <li>All Standard Perks</li>
                            <li>Lifetime Vet Support</li>
                        </ul> <a href="#" class="btn btn-warning">Adopt Now</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

 

By integrating consistent bootstrap coding for each card, your layout stays clean. On smaller devices, each tier transitions to a vertical stack.

Bootstrap classes explanation:

  • bg-light
    Gives a light gray background.
  • py-5
    Adds top and bottom padding with spacing scale 5.
  • container
    Responsive container.
  • text-center
    Centers text in this container.
  • mb-4
    Margin-bottom of spacing scale 4.
  • row
    Bootstrap’s grid row.
  • col-md-4
    Each pricing column takes one-third of the width on medium screens and up (≥768px).
  • h-100
    Forces the card to have a height of 100% of its parent, ensuring uniform column/card heights.
  • card
    Bootstrap card component.
  • card-body
    Section within a card that applies standard padding.
  • card-title
    Styling for card titles.
  • card-text
    Styling for card text.
  • list-unstyled
    Removes default list styles (bullets, left padding) from the <ul>.
  • btn btn-primary / btn btn-success / btn btn-warning
    Different button color schemes from Bootstrap’s default color palette.

10. Adding a Bootstrap Editor WYSIWYG Froala (Optional)

As someone that builds lots of websites. I often emphasize the importance of content editing. Our WYSIWYG solution integrates with Filestack, meaning users can insert and transform images directly. If you want a “Leave a Comment” form, try the snippet below:

<section id="comment" class="py-5">
    <div class="container">
        <h2 class="mb-4 text-center">Leave a Comment</h2>
        <div id="editor"></div>
    </div>
</section>
<script> var editor = new FroalaEditor('#editor', {
        imageEditButtons: ['imageReplace', 'imageAlign', 'imageCaption', 'filestackIcon', 'imageTUI'], filestackOptions: {
            uploadToFilestackOnly: false, filestackAPI: '***', // Replace with your Filestack API key 

            pickerOptions: { fromSources: ['local_file_system', 'imagesearch', 'url', 'googledrive', 'facebook'], accept: [".pdf", "image/jpeg", "image/png", "image/webp", "video/*", "audio/*"], transformations: { crop: true, rotate: true } }
        },
    }); </script>

 

Additionally, if you need more details, check out Froala’s official integration tutorials. A synergy of Froala Editor, Filestack, and Bootstrap reduces manual work and accelerates the development process.

  • py-5
    Adds top and bottom padding (size 5).
  • container
    Responsive container.
  • mb-4
    Margin-bottom with spacing scale 4.
  • text-center
    Centers text horizontally.

11.  Putting it all together

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Dog Adoption Agency</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
    <!-- Froala Editor CSS -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/css/froala_editor.pkgd.min.css" rel="stylesheet"
        type="text/css" /> <!-- Filestack JS (Picker, Drag-and-Drop, Transforms) -->
    <script src="https://static.filestackapi.com/filestack-js/3.32.0/filestack.min.js"> </script>
    <script
        src="https://static.filestackapi.com/filestack-drag-and-drop-js/1.1.1/filestack-drag-and-drop.min.js"> </script>
    <script src="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.umd.min.js"> </script>
    <link rel="stylesheet" href="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.css" />
    <!-- Froala Editor JS -->
    <script type="text/javascript"
        src="https://cdn.jsdelivr.net/npm/[email protected]/js/froala_editor.pkgd.min.js"> </script>
</head>

<style>
    .carousel-inner img {
        margin: auto;

    }
</style>

<body> <!-- Sticky Navbar -->
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark sticky-top">
        <div class="container-fluid"> <a class="navbar-brand" href="#">DogAdopt</a> <button class="navbar-toggler"
                type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav"
                aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav ms-auto">
                    <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">Home</a> </li>
                    <li class="nav-item"> <a class="nav-link" href="#adopt">Adoptable Dogs</a> </li>
                    <li class="nav-item"> <a class="nav-link" href="#pricing">Pricing</a> </li>
                    <li class="nav-item"> <a class="nav-link" href="#comment">Comment</a> </li>
                </ul>
            </div>
        </div>
    </nav> <!-- Hero Section -->
    <section class="bg-light text-dark py-5">
        <div class="container text-center">
            <h1 class="display-4">Save a Life, Adopt a Dog</h1>
            <p class="lead">Join our community and give a loving home to these adorable companions.</p> <a href="#adopt"
                class="btn btn-primary btn-lg">Find Your Companion</a>
        </div>
    </section> <!-- Carousel (Filestack Image Placeholders) -->
    <div id="dogCarousel" class="carousel carousel-dark slide" data-bs-ride="carousel">
        <div class="carousel-indicators"> <button type="button" data-bs-target="#dogCarousel" data-bs-slide-to="0"
                class="active" aria-current="true"></button> <button type="button" data-bs-target="#dogCarousel"
                data-bs-slide-to="1"></button> <button type="button" data-bs-target="#dogCarousel"
                data-bs-slide-to="2"></button> </div>
        <div class="carousel-inner">
            <div class="carousel-item active"> <img
                    src="https://cdn.filestackcontent.com/resize=width:1200,height:500/hmzhYgUSZiIA0Ju2ocMo"
                    class="d-block w-20" alt="Friendly Dog 1"> </div>
            <div class="carousel-item"> <img
                    src="https://cdn.filestackcontent.com/resize=width:1200,height:500/xsFLOcdRYKQOz4oQpmgg"
                    class="d-block w-20" alt="Friendly Dog 2"> </div>
            <div class="carousel-item"> <img
                    src="https://cdn.filestackcontent.com/resize=width:1200,height:500/e0DUJOjTjWmUQm0FxL7e"
                    class="d-block w-20" alt="Friendly Dog 3"> </div>
        </div> <button class="carousel-control-prev" type="button" data-bs-target="#dogCarousel" data-bs-slide="prev">
            <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span
                class="visually-hidden">Previous</span> </button> <button class="carousel-control-next" type="button"
            data-bs-target="#dogCarousel" data-bs-slide="next"> <span class="carousel-control-next-icon"
                aria-hidden="true"></span> <span class="visually-hidden">Next</span> </button>
    </div> <!-- Filestack Mini-Section -->
    <section class="py-4 text-center">
        <div class="container">
            <h3>Upload a picture of your own dog</h3>
            <p>Upload and transform images directly, then embed them on your site.</p> <button class="btn btn-secondary"
                onclick="openFilestackPicker()">Upload a New Dog Image</button>
        </div>
    </section>
    <script> // Replace 'YOUR_API_KEY' with your actual Filestack API key. 
        const client = filestack.init('YOUR_API_KEY'); function openFilestackPicker() { client.picker({ onUploadDone: (res) => { console.log('Uploaded file handle:', res.filesUploaded[0].handle); } }).open(); } </script>
    <!-- Adoptable Dogs Section -->
    <section id="adopt" class="py-5">
        <div class="container">
            <h2 class="mb-4 text-center">Meet Our Adorable Dogs</h2>
            <div class="row">
                <div class="col-md-6 col-lg-4 mb-4">
                    <div class="card"> <img
                            src="https://cdn.filestackcontent.com/resize=width:1200,height:500/hmzhYgUSZiIA0Ju2ocMo"
                            class="card-img-top" alt="Buddy">
                        <div class="card-body">
                            <h5 class="card-title">Buddy</h5>
                            <p class="card-text">A playful pup who loves belly rubs and afternoon walks.</p> <a href="#"
                                class="btn btn-primary">Adopt Buddy</a>
                        </div>
                    </div>
                </div>
                <div class="col-md-6 col-lg-4 mb-4">
                    <div class="card"> <img
                            src="https://cdn.filestackcontent.com/resize=width:1200,height:500/xsFLOcdRYKQOz4oQpmgg"
                            class="card-img-top" alt="Lucy">
                        <div class="card-body">
                            <h5 class="card-title">Lucy</h5>
                            <p class="card-text">A gentle soul who gets along with children and other pets.</p> <a
                                href="#" class="btn btn-primary">Adopt Lucy</a>
                        </div>
                    </div>
                </div>
                <div class="col-md-6 col-lg-4 mb-4">
                    <div class="card"> <img
                            src="https://cdn.filestackcontent.com/resize=width:1200,height:500/e0DUJOjTjWmUQm0FxL7e"
                            class="card-img-top" alt="Max">
                        <div class="card-body">
                            <h5 class="card-title">Max</h5>
                            <p class="card-text">A loyal companion who enjoys fetch and lazy afternoons.</p> <a href="#"
                                class="btn btn-primary">Adopt Max</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section> <!-- Pricing Section -->
    <section id="pricing" class="bg-light py-5">
        <div class="container text-center">
            <h2 class="mb-4">Adoption Packages</h2>
            <div class="row">
                <div class="col-md-4 mb-4">
                    <div class="card h-100">
                        <div class="card-body">
                            <h5 class="card-title">Basic</h5>
                            <p class="card-text">$50 Donation</p>
                            <ul class="list-unstyled">
                                <li>Initial Checkup</li>
                                <li>Vaccinations</li>
                            </ul> <a href="#" class="btn btn-primary">Adopt Now</a>
                        </div>
                    </div>
                </div>
                <div class="col-md-4 mb-4">
                    <div class="card h-100">
                        <div class="card-body">
                            <h5 class="card-title">Standard</h5>
                            <p class="card-text">$100 Donation</p>
                            <ul class="list-unstyled">
                                <li>All Basic Perks</li>
                                <li>Pet Insurance (6 months)</li>
                            </ul> <a href="#" class="btn btn-success">Adopt Now</a>
                        </div>
                    </div>
                </div>
                <div class="col-md-4 mb-4">
                    <div class="card h-100">
                        <div class="card-body">
                            <h5 class="card-title">Premium</h5>
                            <p class="card-text">$150 Donation</p>
                            <ul class="list-unstyled">
                                <li>All Standard Perks</li>
                                <li>Lifetime Vet Support</li>
                            </ul> <a href="#" class="btn btn-warning">Adopt Now</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section> <!-- Comment Section with Froala Editor -->
    <section id="comment" class="py-5">
        <div class="container">
            <h2 class="mb-4 text-center">Leave a Comment</h2>
            <div id="editor"></div>
        </div>
    </section>
    <script>
        // Initialize Froala Editor with Filestack integration 
        var editor = new FroalaEditor('#editor', {
            imageEditButtons: ['imageReplace', 'imageAlign', 'imageCaption', 'filestackIcon', 'imageTUI'], filestackOptions: {
                uploadToFilestackOnly: false, // Replace with your Filestack API key 
                filestackAPI: '***', pickerOptions: { fromSources: ['local_file_system', 'imagesearch', 'url', 'googledrive', 'facebook'], accept: [".pdf", "image/jpeg", "image/png", "image/webp", "video/*", "audio/*"], transformations: { crop: true, rotate: true } }
            },
        }); </script>
    <!-- Footer -->
    <footer class="text-center bg-dark text-white py-3">
        <p>© 2025 DogAdopt. All rights reserved.</p>
    </footer> <!-- Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"> </script>
</body>

</html>

See it in action and what it looks like on mobile:

12. Wrapping Up Your Bootstrap Project

Finally, here is a quick summary:

  1. Bootstrap provides structure, components, and a responsive grid system.
  2. Filestack simplifies image handling, uploads, and transformations.
  3. Froala Editor brings powerful, in-browser content editing to your pages.
  4. A bootstrap editor can further speed your workflow if you prefer drag-and-drop layout design.

By uniting these tools, you can deliver a professional, mobile-ready site in significantly less time. In fact, many developers come back to me saying they never realized how to make responsive website using Bootstrap could be so straightforward. They also discover that pairing a bootstrap editor WYSIWYG like Froala with Filestack offers unique benefits for managing rich media.

This dog adoption agency example demonstrates bootstrap responsive website examples and how they address diverse needs—from content editing to dynamic photo galleries. If you want to master what is Bootstrap in web development, start by creating your own project. Then, incorporate advanced solutions like Filestack and Froala to handle media and text in a modern, efficient way.

Happy coding—and welcome to a smoother, faster, and more enjoyable development experience!

Generate Tags from Images with Angular 19 and Froala HTML Editor Software

An old adage states that “a picture is worth a thousand words.” Even now, at the advent of new technology and AI, it still holds true. What’s even more interesting is that today, technology can actually help us describe an image through words. This process is called image tagging. It involves using AI and machine learning to recognize patterns in an image and generate human-readable tags that define the image. Despite its complex inner workings, however, image tagging has become a lot easier to implement because of ready-to-use tools. In this tutorial, we’ll explore image tagging for Angular 19 using the latest version of our WYSIWYG editor, Froala v4.4.

Key Takeaways

  • Image tagging is a useful tool for getting the general features of an image
  • You can use image tagging for organizing images, optimizing targeted ads, adding tags to online products, and more
  • Froala has built-in image tagging due to its native integration with Filestack
  • As of v4.4, Froala now supports Angular 19
  • Use image tagging synchronously or through Filestack Workflows

Some Real-world Applications for Image Tagging

Image tagging has become more prominent nowadays. You can go to your favorite online store, social media platform, or travel app, and you’ll see some form of it. You can even encounter it at work. Here are a few ways that people use image tagging in their applications:

  • Digital Asset Management: When organizing a business’ digital assets, they can use image tagging to sort photos not just by metadata but also according to image features. For example, businesses can automatically put together logos, screen designs, and advertising photos by getting and processing tags from images.
  • Product Classification: Image tagging proves valuable for eCommerce applications by efficiently sorting product images by their respective categories. For instance, when an online store uploads an image of a laptop, it will receive tags like “electronics,” “laptop,” and “technology.” This practice consequently improves product recommendations for users.
  • Advertising and Marketing: Images are of great assistance to marketers. With image tagging, they can automatically detect what a user’s interests are, such as “ramen” or “skiing.” This helps them make their advertisements more relevant to users.
  • Travel and Tourism: Notice how travel applications always seem to recommend places that are similar to the ones you book? Chances are they’re using tags for that, and with image tagging, this practice can improve. Based on the images that your favorite destination or establishment uploads, the app can recommend destinations with similar tags.

Now that we have some ideas on where to apply image tagging, how about we show you how you can actually implement it?

Implementing Image Tagging in Angular 19 Using Froala HTML Editor Software

To implement image tagging, all you’ll need are your favorite tech stack, a file handling tool, and a solid HTML editor software. In this case, we’ll be using Angular 19 and Froala Editor v4.4. This latest version of Froala supports Angular 19, allowing for more speed, simplification, security, and compatibility. Moreover, it also natively includes Filestack, an advanced file uploader and transformation tool with image tagging features. With these tools, image tagging turns into a significantly easier task.

Project Setup

To get started, open your CLI and navigate to your preferred directory. Create a new Angular app by running:

ng new filestack-integration

In this case, I used “filestack-integration” as the project name. After creating the project, navigate to its root directory and install Froala’s Angular SDK. This allows you to integrate Froala into your Angular application. Let’s run the following command:

npm install angular-froala-wysiwyg --save

Now, open your project using your preferred code editor. Go to the “angular.json” file and replace the “styles” and “scripts” options with:

"styles": [
     "src/styles.css",
     "node_modules/froala-editor/css/froala_editor.pkgd.min.css",
     "node_modules/froala-editor/css/froala_style.min.css"
],
"scripts": [
     "node_modules/froala-editor/js/froala_editor.pkgd.min.js"
]

This loads the necessary stylesheets and JS for Froala Editor. Next, let’s create the editor itself.

Creating the WYSIWYG Editor

In your CLI, type and run:

ng generate component editor

This generates a new component called EditorComponent, which is where we’ll configure the editor and create the necessary functions for image tagging. After creating this component, open your “editor.component.ts” file and replace the code with this:

import { Component } from '@angular/core';
import { FroalaEditorModule, FroalaViewModule } from 'angular-froala-wysiwyg';
import 'froala-editor/js/plugins.pkgd.min.js';

@Component({
  selector: 'app-editor',
  standalone: true,
  imports: [FroalaEditorModule, FroalaViewModule],
  templateUrl: './editor.component.html',
  styleUrl: './editor.component.css'
})
export class EditorComponent {

}

The next step involves opening “index.html” and including the required Filestack files for uploading and transforming (and, in our case, tagging) images:

<link rel="stylesheet" href="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.css" />

<script src="https://static.filestackapi.com/filestack-js/3.32.0/filestack.min.js"></script>

<script src="https://static.filestackapi.com/filestack-drag-and-drop-js/1.1.1/filestack-drag-and-drop.min.js"></script>

<script src="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.umd.min.js"></script>

Now, let’s go back to our “editor.component.ts” file and configure the necessary editor options and events.

export class EditorComponent{
  private froalaEditor: any;
  public editorContent = "Filestack is a simple file uploader & powerful APIs to upload, transform & deliver any file into your app.";
  public options: Object = {
    heightMin: 300,
    filestackOptions: {
      uploadToFilestackOnly: true,
      filestackAPI: "YourFilestackAPIKey", // replace this with your actual key
      pickerOptions: {
        accept: ['image/*'], // accept only images of any type from the local file system
        fromSources: ['local_file_system']
      }
    },
    events: {
      'filestack.uploadedToFilestack': (event: any) => {
        const fileHandle = event.filesUploaded[0].handle; // get the handle of the uploaded file after every successful upload
        this.performImageTagging(fileHandle); // let's type this in for now; we'll get to the actual function later
        console.log("Callback is triggered for upload event",)
      },
      'filestack.filestackPickerOpened': () => {
        console.log("Callback is triggered for open picker event",)
      },
      'filestack.filestackPickerClosed': () => {
        console.log("Callback is triggered for close picker event",)
      },
      'filestack.uploadFailedToFilestack': () => {
        console.log("Callback is triggered for upload failure",)
      },
    },
  };
}

When configuring your Froala Editor, remember to include your Filestack API key (which you can obtain by creating a free Filestack account). You can also change the picker options to whatever you like, but for this demo, which only requires images, we’ll go with just images. Next, we’ll start scanning images after they’re uploaded, so call your function (in this case, “performImageTagging“) from the “filestack.uploadedToFilestack” event. This function will take the file handle as the parameter. Once you’re done with this, open “editor.component.html” and include the following code:

<div [froalaEditor]="options" [(froalaModel)]="editorContent"></div>
<div id="image-tagging-results"></div> <!-- This will hold the image tags -->

This creates the elements for both the editor and the container for the tags. The next step is to display Froala on the main page of the application. To do so, open “app.component.ts” and import EditorComponent:

import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterOutlet } from '@angular/router';
import { EditorComponent } from './editor/editor.component';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [CommonModule, RouterOutlet, EditorComponent],
  templateUrl: './app.component.html',
  styleUrl: './app.component.css'
})
export class AppComponent {
  title = 'filestack-integration';
}

And on your “app.component.html” file, replace the initial code with:

<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
<!-- * * * * * * * * * * * The content below * * * * * * * * * * * -->
<!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * -->
<!-- * * * * * * * * * * and can be replaced.  * * * * * * * * * * -->
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
<!-- * * * * * * * * * Delete the template below * * * * * * * * * -->
<!-- * * * * * * * to get started with your project! * * * * * * * -->
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->

<style>
  :host {
    --bright-blue: oklch(51.01% 0.274 263.83);
    --electric-violet: oklch(53.18% 0.28 296.97);
    --french-violet: oklch(47.66% 0.246 305.88);
    --vivid-pink: oklch(69.02% 0.277 332.77);
    --hot-red: oklch(61.42% 0.238 15.34);
    --orange-red: oklch(63.32% 0.24 31.68);

    --gray-900: oklch(19.37% 0.006 300.98);
    --gray-700: oklch(36.98% 0.014 302.71);
    --gray-400: oklch(70.9% 0.015 304.04);

    --red-to-pink-to-purple-vertical-gradient: linear-gradient(180deg,
        var(--orange-red) 0%,
        var(--vivid-pink) 50%,
        var(--electric-violet) 100%);

    --red-to-pink-to-purple-horizontal-gradient: linear-gradient(90deg,
        var(--orange-red) 0%,
        var(--vivid-pink) 50%,
        var(--electric-violet) 100%);

    --pill-accent: var(--bright-blue);

    font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
      Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
      "Segoe UI Symbol";
    box-sizing: border-box;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }

  h1 {
    font-size: 3.125rem;
    color: var(--gray-900);
    font-weight: 500;
    line-height: 100%;
    letter-spacing: -0.125rem;
    margin: 0;
    font-family: "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
      Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
      "Segoe UI Symbol";
  }

  p {
    margin: 0;
    color: var(--gray-700);
  }

  main {
    width: 100%;
    min-height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 1rem;
    box-sizing: inherit;
    position: relative;
  }


  .content {
    display: flex;
    justify-content: space-around;
    width: 100%;
    max-width: 700px;
    margin-bottom: 3rem;
  }

  .content p {
    margin-top: 1.5rem;
  }


  @media screen and (max-width: 650px) {
    .content {
      flex-direction: column;
      width: max-content;
    }

  }
</style>

<main class="main">
  <div class="content">
    <div class="">

      <app-editor></app-editor>
    </div>

  </div>
</main>

<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
<!-- * * * * * * * * * * * The content above * * * * * * * * * * * * -->
<!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * * -->
<!-- * * * * * * * * * * and can be replaced.  * * * * * * * * * * * -->
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
<!-- * * * * * * * * * * End of Placeholder  * * * * * * * * * * * * -->
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->


<router-outlet></router-outlet>

Now, you have a custom component that includes both Froala Editor and Filestack. You can already use this for robust file transformations and rich text editing, but we still need image tagging, right? Don’t worry, it won’t be long before you have it in your application as well.

Adding Image Tagging Features to the WYSIWYG Editor

Go back to your “editor.component.ts” file and add the following functions to your EditorComponent:

// Perform image tagging after file upload
  async performImageTagging(fileHandle: string) {
    const policy = 'YourFilestackPolicy'; 
    const signature = 'YourFilestackSignature'; 
    const imageTaggingURL = `https://cdn.filestackcontent.com/security=p:${policy},s:${signature}/tags/${fileHandle}`;

    try {
      const result = await this.scanImage(imageTaggingURL);
      const tags = result?.tags?.auto;
  
      if (tags) {
        // Loop through the keys and values of tags dynamically
        let tagsList = '';
        for (const [key, value] of Object.entries(tags)) {
          // Create a displayable list item for each tag
          tagsList += `<li>${key}: ${value}</li>`;
        }
        
        console.log("Image tagging result:", result);
        const resultElement = document.getElementById('image-tagging-results');
        if (resultElement) {
          resultElement.innerHTML = `<p>Image Tagging Analysis:</p><ul>${tagsList}</ul>`;
        }
        else {
          console.error("Element for displaying tags not found.");
        }
      }
      else {
        console.error("Empty tags.");
      }
    }
    catch (error) {
        console.error("Error during image tagging:", error);
    }
  }

  // Function to call the Filestack Image Tagging API
  async scanImage(url: string) {
    const response = await fetch(url);
    if (!response.ok) {
      throw new Error("Failed to fetch image tagging results.");
    }
    const data = await response.json();
    return data;
}

These two functions deal with calling Filestack’s image tagging API and then looping through the results to create a displayable list of tags. This starts when the successful upload event calls the function “performImageTagging” (yes, the one from earlier). First, you’ll create a URL that includes the Filestack CDN, your generated Filestack policy and signature, the API keyword “/tags/” and the file handle. Afterwards, we’ll call the function “scanImage” to fetch a result from the generated URL. Once we get a result, we’ll create a list of tags using the generated key-value pair from the image tagging API and display it. And that’s it for the coding part. Now, let’s test out our application!

Running the Application

Type “ng serve” into your CLI and hit the enter key to run the application, which you can view at “http://localhost:4200” in your browser. You should see the Froala Editor and the sample text inside. Try uploading an image using the Filestack upload icon on the toolbar. In this case, I uploaded an image of steak.

Uploading a picture of a steak for image tagging using Froala WYSIWYG editor

After picking an image, click the upload button, and you’ll see it added to the editor. More importantly, you’ll see that the container for the tags now has some values.

After uploading the image of the steak using Filestack, it now appears on the WYSIWYG editor. Additionally, Filestack's image tagging feature has generated some tags that correctly define the elements of the steak photo. According to Filestack’s image tagging API, the steak image is very certain that it detects food, beef, and meat. Additionally, it also generated keywords related to the knife in the image. Now, let’s try uploading an image of a snowy ski slope.

A picture of a wintery ski slope is uploaded using the WYSIWYG editor

After uploading the image, the API generated some very relevant tags, such as nature, outdoors, person (since people are in the image), piste (which is exactly what the image is), and plant (because of the trees). It generated few other words, but in your implementation, you could limit the tags to just the top three or five keywords for better precision.

The results of performing image tagging on the ski image

And there we have it: a reliable image tagging solution using Angular 19 and Froala 4.4. From here, you can do various other modifications, including combining it with other Filestack processes, such as NSFW checking, image sentiment analysis, image enhancement, and more. Additionally, consider using Filestack Workflows to further simplify the implementation and task chaining process. We may be done with this example, but there are various other things we can do with the tools that we have.

Conclusion

In this tutorial, we discussed image tagging, its applications in the real world, and how you can implement it with ease. As image tagging will continue its status as an important feature in the future, the need for the knowledge to implement it will keep increasing. Thankfully, with tools like Angular, Froala WYSIWYG editor, and Filestack, implementing image tagging has become much easier. It is, of course, technology’s job to make us more efficient, and it is ours to create things that will contribute to people in some way.

Get your Filestack API here for free.

Watch the image tagging demo in action.

How to add Froala HTML Editor Software in Django in 2025

add HTML editor software in Django

Django is a powerful Python web framework that helps developers build web applications quickly and efficiently. Froala 4.4 release adds support to the popular Python framework, Django 5.

Integrating Froala HTML Editor Software into a Django project allows users to create and edit rich text content within the application. By combining the flexibility of Froala and the rapid development capabilities of Django, you can create dynamic, user-friendly web applications that meet the evolving needs of your audience.

In this step-by-step guide, you’ll learn how to integrate the Froala HTML Editor Software into a Django form, allowing your users to create and edit rich text content within your application. Whether you’re building a blog, a content management system, or any other web application, this integration will enhance the user experience and unlock new possibilities for your project.

Integrate Froala into Django

Prerequisites

Being a Python web framework, Django requires Python. We’re assuming:

  • You are familiar with Python and have it installed on your computer. If not, please install python and come again.
  • You have Django installed already.

Versions Used in This Tutorial

  • Froala Editor V4.4
  • Python V3.13.1
  • Django V5.1.5

Step 1: Getting started

From the command line, cd into a directory where you’d like to store your code and create a new directory named froaladjangotutorial.

mkdir froaladjangotutorial
 Then, run the following command to bootstrap a new Django project:
django-admin startproject myapp froaladjangotutorial

This will create a project called myapp inside the froaladjangotutorial directory.

Step 2: Creating a Demo app

To create your app, jump into the created directory:

cd froaladjangotutorial

Type the following command:

py manage.py startapp demos

That’ll create a directory demos which will contain our demo code.

Step 3: Install Froala

To begin, you’ll need to install the Froala Django package. You can do this using pip.

pip install django-froala-editor

Install Froala Django SDK

After successfully installed, open myapp/settings.py and add froala_editor into the INSTALLED_APPS array.

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'froala_editor'
]

Then open the myapp/urls.py file and include the Froala Editor URLs.

from django.contrib import admin
from django.urls import include,path

urlpatterns = [
    path("demos/", include("demos.urls")),
    # Froala Editor URLs
    path('froala_editor/', include('froala_editor.urls')),
    path('admin/', admin.site.urls),
]

Step 4: Create a form with a Froala

Create a new file demos/forms.py and add the following code:

from django import forms
from froala_editor.widgets import FroalaEditor

class FroalaForm(forms.Form):
    content = forms.CharField(widget=FroalaEditor)
 In the above code, we've created a Django form with a FroalaEditor widget. 

Step 5: Configure Froala

You can also customize the editor’s appearance and behavior by passing various options to the FroalaEditor widget.

For example, to initialize the Froala Editor with an inline toolbar, you can use the following code:

from django import forms
from froala_editor.widgets import FroalaEditor

class FroalaForm(forms.Form):
    content = forms.CharField(widget=FroalaEditor(options={
      'toolbarInline': True,
    }))

This will create a Froala Editor instance with an inline toolbar, allowing users to format the content as needed. You can further customize the editor by modifying the options passed to the FroalaEditor widget.

Step 6: Create a template to render the form

You’ll need to configure the Froala Editor in your Django templates. In the demos app, create a new file called froala_form.html in the /templates directory. In this file, you’ll add the necessary HTML and Django template tags to integrate the Froala Editor.

 

<!DOCTYPE html>
<html>

<head>
    <title>Froala Editor</title>
    {{ form.media }}


</head>

<body>
    <h1>Froala Editor</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>

</body>

</html>

Make sure to update your settings.py to include the templates directory in the TEMPLATES setting:

import os

# ...existing code...

ROOT_URLCONF = 'mysite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'demos', 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Step 7: Update the view to render the template

Update your demos/views.py file to render the form in the template:

from django.shortcuts import render
from .forms import FroalaForm

def index(request):
    if request.method == 'POST':
        form = FroalaForm(request.POST)
        if form.is_valid():
            # Process the form data
            pass
    else:
        form = FroalaForm()
    
    return render(request, 'froala_form.html', {'form': form})

Step 8: Map The URLs

Define a URLconf for the demos app by creating a file demos/urls.py with the following content:

from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

The next step is to configure the global URLconf in the myapp project to include the URLconf defined in demos.urls.

To do this, add an import for django.urls.include in myapp/urls.py and insert an include() in the urlpatterns list, so you have:

from django.contrib import admin
from django.urls import include,path

urlpatterns = [
    path("demos/", include("demos.urls")),
    path('admin/', admin.site.urls),
]

Step 9: Test the demo app

Verify the demo app is working with the following command:

python manage.py runserver

You can now access the demo app by visiting `http://127.0.0.1:8000/demos/` in your web browser. This will display the form you created, including the Froala Editor.

Froala into Django

With the Froala Editor integrated into your Django application, users can now create and edit rich text.

Conclusion

Integrating the Froala WYSIWYG Editor into your Django application is a powerful way to enable rich text editing for your users. By following the steps outlined in this article, you can quickly add a feature-rich text editor to your Django forms.

The Froala Editor provides a wide range of customization options, allowing you to tailor the editor to your specific needs. Whether you want an inline toolbar, custom buttons, or advanced formatting options, the Froala Editor has you covered.

Now that you know how to add the Froala Editor to your Django project, why not give it a try? Start by creating a new Django project and follow the steps in this guide. Before long, you’ll have a dynamic, user-friendly text editing experience integrated into your web application.

Our 4.4 Update: Why The React and Angular Updates Are a Big Deal

As the Product Marketing Manager here at Froala, I’ve had the privilege of working closely with our engineers and product leads to bring you the latest version of our WYSIWYG Editor—Froala 4.4. One of the things I’m most excited about is how we’ve aligned our React and Angular SDKs with the newest versions of these frameworks. I know it might not seem glamorous at first, but let me show you why these updates truly matter for our html editor software.

React SDK: Our Journey with React 18

1. Smoother User Experiences

One of the biggest highlights of React 18 is Concurrent Rendering. Picture a busy highway that magically widens during rush hour, allowing more cars to move quickly. That’s sort of how Concurrent Rendering feels. It helps your apps stay responsive by splitting up work, so your interface doesn’t freeze or stutter—even when you’re handling heavy operations, like text editing with Froala.

2. Performance Gains with Automatic Batching

React 18’s Automatic Batching feature combines multiple state updates into a single render pass. If you’ve ever struggled with too many re-renders bogging down your app, this update is a game-changer. Combine that with Froala’s own optimizations, and you’ll see faster load times and smoother text editing for your end users.

3. Better Data Fetching with Suspense

We also love how React 18 enhances Suspense for data fetching. Think of Suspense as your safety net for loading states. It makes it easier to show a “loading” view while your app fetches data behind the scenes. When you pair Suspense with the Froala Editor, you can handle big blocks of content more elegantly without awkward screen flickers.

4. Marking Non-Urgent Updates

Finally, the startTransition API allows you to mark certain state updates as non-urgent. In other words, if you’re typing an article in Froala while your app quietly syncs data, the user-facing experience stays smooth. The important edits still happen instantly, and the less critical stuff runs in the background.

Angular SDK: Embracing Angular 19

1. Speed You Can Feel

Angular 19 delivers performance enhancements that make everything from component rendering to change detection more efficient. Because Froala is tightly integrated with Angular, these improvements trickle down to our editor. Tables load quicker, images embed faster, and your overall editing process feels snappier.

2. Modern Features, Less Hassle

Each Angular release adds new features and updated APIs that can simplify your code. With Angular 19, you’ll find it easier to manage dependencies, create reusable components, and tap into powerful directives. And when Froala is part of your project, you won’t have to worry about missing out on these fresh capabilities.

3. Built-In Security Patches

Security always matters, especially when users are creating and sharing content. Angular 19 includes fixes that protect against known vulnerabilities. By aligning Froala’s codebase with Angular 19, we help ensure that your app remains on solid ground—and that you have one less thing to stress about.

4. Fewer Version Conflicts

Keeping up with the latest Angular release means fewer headaches when adding or updating third-party libraries. Because our new Froala SDK is built with Angular 19 in mind, you’ll spend less time wrestling with compatibility and more time building amazing experiences for your users.

From Our Team’s Perspective: Why These Upgrades Matter

A Smoother Development Cycle

At Froala, we’re constantly talking to developers who want their tools to “just work.” With our React and Angular updates, we’ve aimed to reduce friction in your workflows. The cleaner your integration process, the faster you can spin up features or fix bugs—everyone wins.

Future-Proofing Your Projects

We know that once you’re locked into an older framework version, upgrading can feel overwhelming. We want to help you avoid that situation. By providing up-to-date SDKs, we’re ensuring you can adopt the latest React and Angular releases without worrying that Froala will break your app.

Better End-User Experience

When developers use frameworks efficiently, end users benefit. Faster load times, smoother text editing, and fewer page refreshes keep your audience engaged. We’ve seen these improvements firsthand while testing our own demos, and we’re confident you’ll notice them too.

Tips for a Successful Upgrade

  1. Check Your Dependencies: Make sure other libraries and tools in your project are also compatible with React 18 or Angular 19.
  2. Use Our Documentation: We keep our installation guides up to date to help you integrate Froala quickly and avoid common pitfalls.
  3. Test in a Safe Environment: Before rolling out changes to production, run a pilot or test environment. That way, you can catch any issues early.
  4. Explore New Features: Don’t just upgrade and call it a day. Take advantage of new APIs and performance tweaks—it’s worth the effort!

Closing Thoughts

Behind every new release, there’s a lot of collaboration and passion from our Froala team. We push ourselves to deliver features that not only keep pace with the latest frameworks but also solve real developer challenges. These React and Angular updates in Froala 4.4 are a testament to our commitment to giving you powerful, modern, and secure tools for content creation.

If you’ve been waiting for a sign to update your editor, this is it. We believe the improvements you’ll see in performance, security, and user experience make upgrading well worth your time. So go ahead—dive into React 18 or Angular 19 with Froala 4.4, and let us know how it transforms your workflow. We’re here to support you every step of the way!

Modern Web Development with React: A Full Guide

Imagine building web applications with the same elegance and efficiency as assembling a Lego masterpiece. That’s the power of React JS, where reusable components snap together to create dynamic and interactive user interfaces.

React JS has undeniably changed the web development landscape. But mastering its intricacies can be a journey fraught with challenges.

  • State management headaches: Keeping your application’s data organized and predictable can feel like juggling chainsaws. 
  • Styling struggles: Creating a visually appealing and responsive UI can be a time-consuming battle with CSS. 
  • API integration woes: Connecting your frontend to a backend API can feel like navigating a maze blindfolded.
  • The dreaded blank screen of death: Debugging cryptic error messages can leave you feeling lost and frustrated. 

Our new e-book, Froala React JS Full Tutorial, is your guide to conquering these challenges and building React applications with confidence and finesse.

A Journey In Depth

This e-book is not your typical introductory guide. We go beyond the fundamentals, delving into the nuances of React JS to provide you with a deep understanding of its capabilities.

Here’s a glimpse of what you’ll discover:

  • Taming State Management: Master the art of managing your application’s data flow with ease. We’ll explore different techniques, including hooks and context APIs, to help you build predictable and maintainable React applications. 
  • Styling with Tailwind CSS: Say goodbye to CSS struggles! We’ll show you how to leverage the power of Tailwind CSS, a utility-first framework that makes styling a breeze. Create elegant and responsive UIs with minimal effort.
  • Effortless API Integration: Connect your React frontend to any backend API seamlessly. We’ll guide you through the process of making API requests, handling responses, and managing data flow between your frontend and backend.
  • Debugging Like a Pro: Don’t let errors derail your development process. We’ll equip you with the knowledge and tools to debug React applications effectively, identify the root cause of errors, and implement robust error handling.  
  • And much more! From building dynamic forms to creating interactive charts with Chart.js, this ebook covers a wide range of topics to help you become a proficient React developer.

A Valuable Resource for Web Developers

The Froala React JS Full Tutorial is a valuable resource for any web developer looking to master React JS and build sophisticated web applications. We believe this ebook will empower you to create dynamic, interactive, and user-friendly web experiences.

We invite you to download the e-book today and embark on your React JS journey. We are confident that you will find it an invaluable asset in your web development endeavors.

We hope you enjoy this comprehensive guide to React JS and find it helpful in your web development journey. If you have any questions or feedback, please don’t hesitate to reach out to us.

Froala 4.4: Empowering Developers with New Advancements

Froala Release

We’re thrilled to announce the release of Froala WYSIWYG Editor version 4.4, a milestone that demonstrates our commitment to delivering cutting-edge solutions for developers and Froala customers alike.

This release is packed with a host of exciting updates, enhancements, and bug fixes that are sure to elevate your content creation and management experience.

Froala SDKs now support the latest versions of popular frameworks:

  • React SDK supports React 18.
  • Angular SDK supports Angular 19.
  • Django plugin works with Django 5.
  • WordPress plugin integrates with WordPress 6.

In addition to these framework updates, this release includes several bug fixes, with a particular focus on improving the content pasting experience. Furthermore, we’ve enhanced the integration with the Dompurify library, which helps sanitize HTML and strengthen security.

Let’s dive in and explore the key highlights.

Froala 4.4 release

SDK Updates: Embracing the Future

Froala SDKs help developers seamlessly integrate the Froala WYSIWYG Editor into their applications. With this release, we’ve ensured our SDKs work with the latest versions of popular frameworks. This empowers developers to leverage cutting-edge technologies and deliver exceptional user experiences.

React SDK

The React SDK now supports React 18, ensuring seamless integration with the recent advancements in the React ecosystem. This allows developers to benefit from new React 18 features such as:

  • Concurrent Rendering: React 18’s concurrent rendering allows for smoother and more responsive user interfaces by enabling non-blocking rendering.
  • Automatic Batching: This feature reduces the number of re-renders, improving performance and efficiency.
  • Suspense for Data Fetching: Enhanced support for Suspense allows for better handling of asynchronous data fetching, making your application more robust.
  • startTransition API: This API helps in marking updates as non-urgent, ensuring smoother transitions and better user experience.

As a developer, updating to the latest Froala React SDK is beneficial if you want to leverage the new features and improvements in React 18. This can enhance the performance and user experience of your application, making it more efficient and responsive.

To update your Froala React SDK, run the following command:

npm update froala-editor    

If new to Froala, follow the React SDK documentation to get started.

Angular SDK

The Angular SDK has been updated to work with Angular 19, providing developers with the tools to leverage the latest features and improvements in the Angular framework.

As a developer, updating to the latest SDK is generally recommended to take advantage of:

  • Improved Performance: Angular 19 includes performance enhancements that can make your applications run faster and more efficiently.
  • New Features: You’ll have access to the latest features and APIs introduced in Angular 19, which can help streamline development and improve functionality.
  • Better Compatibility: Ensures compatibility with other libraries and tools that are also updated to work with Angular 19.
  • Security Updates: Newer versions often include security patches that protect your application from vulnerabilities.

To update your Froala Angular SDK, run the following command:

npm update froala-editor --save

If new to Froala, follow the Angular SDK documentation to get started.

Django Framework Plugin

The Froala Django framework plugin has been updated to work seamlessly with the latest version of the popular Python web framework, Django 5.0. This update empowers developers building web applications with Django to integrate the Froala WYSIWYG Editor into their projects easily.

Django 5.0 introduces several new features and improvements, including:

  • Enhanced URL handling.
  • Improved database support.
  • Enhanced security features.

By updating the Froala Django plugin to work with Django 5.0, we’re enabling our developers to take advantage of these new features and improvements. This allows you to build more robust, secure, and feature-rich web applications with the Froala WYSIWYG Editor seamlessly integrated into your Django-powered projects.

To update your Froala Django plugin to the latest version, follow these steps:

  1. Open your project’s requirements.txt file (or equivalent dependency management file).
  2. Locate the line that specifies the Froala Django plugin version and update it to the latest version:
    froala-editor-django==4.4
    
  3. Save the requirements.txt file and run the following command in your terminal to update the dependencies:
    pip install -r requirements.txt
    

After completing these steps, your Froala Django plugin will be updated to the latest version, allowing you to leverage the new features and improvements introduced in Django 5.0. This will help you build even more powerful and efficient web applications with the Froala WYSIWYG Editor seamlessly integrated into your Django-based projects.

If you’re new to using the Froala Django plugin, be sure to check out the Froala Django documentation to get started.

WordPress Plugin

The Froala WordPress plugin has been updated to work seamlessly with the latest version of WordPress, WordPress 6, ensuring a smooth and reliable integration for our WordPress-based customers.

This update is especially important for Froala users who leverage the WordPress platform to power their websites and blogs. The Froala WordPress plugin empowers WordPress administrators to seamlessly integrate the Froala WYSIWYG Editor into their content creation workflows. With this plugin, admins can create posts and pages using the robust editing capabilities of the Froala Editor.

Beyond the admin experience, the Froala WordPress plugin also enables front-end integration. This allows your website’s users to leverage the Froala Editor when adding comments or submitting other user-generated content.

The plugin comes with a dedicated configuration page in the WordPress admin dashboard, making it easy for administrators to customize the editor’s settings to match their specific needs.

To update the Froala WordPress plugin to the latest version:

  1. Backup Your WordPress Site: Before making any changes, it’s always a good idea to create a full backup of your WordPress site. This will allow you to restore your site in case any issues arise during the update process.
  2. Download the Latest Plugin Version: Visit the Froala WordPress plugin GitHub repository and download the latest version of the plugin. You can either clone the repository or download the ZIP file containing the plugin files.
  3. Replace the Plugin Files: Log in to your WordPress admin dashboard and navigate to the “Plugins” section. Locate the existing Froala WYSIWYG Editor plugin and deactivate it. Then, delete the plugin folder from the wp-content/plugins/ directory of your WordPress installation.
  4. Install the Updated Plugin: Upload the new plugin files you downloaded in Step 2 to the wp-content/plugins/ directory, either by extracting the ZIP file or cloning the repository directly into the plugins folder.
  5. Activate the Updated Plugin: Once the new plugin files are in place, go back to the “Plugins” section in your WordPress admin dashboard and activate the Froala WYSIWYG Editor plugin.

If you encounter any issues during the update process or have questions about the new Froala WordPress plugin features, please don’t hesitate to reach out to our support team. We’re here to ensure seamless integration and help you make the most of the Froala WYSIWYG Editor within your WordPress-powered projects.

Improved Content Pasting: Enhancing the User Experience

Froala is renowned for its powerful pasting capabilities. However, in this release, we’ve made significant improvements to the content pasting functionality. We’ve addressed various issues and edge cases to ensure a smoother and more reliable pasting process.

One key improvement is the retention of the id property for table of contents (TOC) items when pasting content from Microsoft Word. This allows users to seamlessly scroll down to a specific section identified by the TOC item, preserving the intended navigation structure.

Additionally, Froala now supports the mso-list attribute from Office HTML. This helps maintain the proper hierarchy of complex multi-level lists after pasting them, ensuring the lists remain in order.

These improvements enhance the overall user experience, making it easier for users to paste content into the Froala Editor without losing formatting or structure.

Bug Fixes and Improvements

In this release, we’ve addressed various issues reported by our users to enhance the overall performance and stability of the Froala Editor. These improvements include:

  • Enhanced table header handling: We’ve ensured proper table structure and resolved issues where rows might not correctly align within the <thead> section. This improves the merging of table header cells.
  • Consistent underline color: We’ve made the underline color match the text color.
  • Restored full-page content: We’ve fixed the issue where the editor did not return the full-page content when the fontFamilyDefaultSelection option was used.
  • Cleaned text formatting: We’ve resolved the issue where the text format was not properly cleaned when setting the enter option to FroalaEditor.ENTER_BR.
  • Preserved cursor position: We’ve fixed the issue where the cursor position was lost when content was wrapped with html.wrap inside tables.
  • Improved link handling: We’ve resolved an issue where all formatting was removed when inserting a link containing special characters. The fix is to URL-encode the link, ensuring special characters are stored correctly.

Additionally, we’ve enhanced the integration with the DOMPurify library, a powerful HTML sanitization tool, to further strengthen the security and reliability of the Froala Editor. DOMPurify now respects the configurable options htmlAllowedAttrs, htmlAllowedTags, htmlAllowedEmptyTags, and not just the contenteditable property.

You can find the release notes on our website.

Embracing the Future of Content Creation

The Froala WYSIWYG Editor 4.4 release represents a significant step forward in our mission to empower developers and content creators with the tools they need to thrive in the ever-evolving digital landscape. By aligning our SDK updates with the latest versions of popular frameworks like React, Angular, and Django, we’re ensuring that our users can leverage the most cutting-edge technologies and seamlessly integrate Froala into their workflows.

Moreover, the bug fixes and security enhancements included in this release underscore our dedication to providing a reliable and secure content editing experience. By addressing the XSS vulnerability and improving the DOMPurify integration, we’re safeguarding our users’ content and protecting their digital assets from potential threats.

Unlocking New Possibilities

As we move forward, we remain committed to pushing the boundaries of what’s possible in the world of content creation and management.

Whether you’re a seasoned Froala user or new to our platform, we encourage you to explore the latest features and enhancements. Upgrade your Froala WYSIWYG Editor to version 4.4 and unlock a world of new possibilities for your content creation and management needs.

If you have any questions or feedback, our dedicated support team is always here to assist you. We value your input and look forward to continuing our collaboration as we shape the future of content creation together.

Try The Latest Froala Editor

Explore a variety of examples that demonstrate the functionality of the Froala HTML Editor.

Change Log

Please visit the release notes for a complete list of changes.

Get Started

Following our get started guide, you can download and start using Froala in less than five minutes.

Change Log

Please visit the release notes for a complete list of changes.

Technical Questions

If you have a technical question, you can check whether we have already answered it in our help center. If not, contact our Support team.

Top Rich Text Editor Trends Developers Should Watch in 2025

As we head into 2025, many developers find that rich text editors (RTEs) are no longer just small features tucked into larger products. Instead, these editors have become important parts of content management systems, CRMs, productivity platforms, and e-learning solutions. A few years ago, basic text formatting was enough. Now, developers want more customization, better performance, stronger scalability, and even advanced features like AI-driven help. Recent data from CKEditor’s “2024 State of Collaborative Editing” and TinyMCE’s “2024 RTE Survey” shows these new priorities very clearly.

Key Takeaways

  • Developers prioritize customization, seeking full control to tailor rich text editors to their needs.
  • Performance is the top concern, with lightweight editors like Froala providing faster load times and smoother experiences.
  • Scalability is essential for handling growing user bases and integrating with cloud infrastructures.
  • Demand for AI-powered features is increasing, moving beyond basic formatting to include predictive text and grammar checks.
  • Rich text editors are now core infrastructure components in modern applications, crucial for content creation and collaboration.

Trend No. 1: More Control and Customization

To start, many developers now need rich text editors that fit their unique needs. According to TinyMCE’s 2024 RTE Survey, 52% of developers want full control over their editor’s experience. This number is important because it shows that most developers do not want a “one-size-fits-all” editor. Instead, they want to shape the editor to match their application’s look, feel, and workflow.

Some ways developers achieve this include:

  • Adding or removing toolbar buttons to match the project’s brand and style.
  • Using flexible APIs to create custom plugins or special formatting features.
  • Including revision histories or other custom workflows that feel natural for their teams.

By having this level of control, developers can make sure their editors feel like a true part of their product, not just a separate tool.

Trend No. 2: Faster Performance Matters Most

Next, performance has become a top priority. In TinyMCE’s 2024 RTE Survey, 79% of respondents said performance is the most critical factor. Today’s users have high standards. If an editor loads slowly or feels sluggish, they might lose focus or trust.

By paying attention to performance, developers can offer a better user experience. They can make sure that, as soon as a user opens the editor, it feels responsive and stable.

Trend No. 3: Scaling for Bigger Workloads

As we move forward, many products must handle larger and more spread-out user bases. According to the TinyMCE 2024 RTE Survey, 43% of developers prioritize scalability. This makes sense because many apps now serve global teams and large groups of users, sometimes all at once. Editors must handle:

  • Many users editing documents at the same time.
  • Real-time changes appearing smoothly for everyone.
  • Growing workloads as the product becomes more popular.

By choosing an RTE that can scale without breaking, developers can trust that their editor won’t slow down or fail as more users rely on it. In the end, scalability means fewer headaches when traffic increases or when a project grows in complexity.

Trend No. 4: Going Beyond

Everyone expects basic formatting features like bold, italics, and headings. In fact, TinyMCE’s 2024 RTE Survey shows that 88% of developers consider these core features a given. But basic formatting alone will not set an editor apart anymore.

Today, developers are looking for ways to enhance the writing process. Some are interested in AI-driven tools, such as:

  • Predictive text suggestions that help users write faster.
  • Grammar and spelling checks that improve the quality of content.
  • Intelligent formatting that adjusts style automatically.

With these new features, the editor becomes more than just a text box. It starts to feel like a smart assistant, guiding users and helping them produce better results. This aligns with a finding in Cloudinary’s 2023 State of Visual Media Report: “68% of developers believe that AI’s main benefit is enabling productivity and efficiency.”

For instance, Froala integrates with Gemini and other popular generative AI tools to improve readability, SEO, and content quality. Making such features accessible in a rich text editor’s toolbar helps users produce top-notch content in significantly less time. Because of this, the most advanced RTEs have gone beyond basic formatting, making them a core part of modern applications.

Trend No. 5: RTEs as Core Infrastructure

In the past, some teams saw RTEs as extras, but that is no longer the case. CKEditor’s “2024 State of Collaborative Editing” report found that 71% of respondents consider RTEs critical to their platforms. This shows a big change.

Developers now treat these editors as key building blocks. For example:

  • In a CMS, a well-designed RTE lets marketing teams update content without needing a developer for every small change.
  • In a productivity suite, the RTE supports collaboration by letting multiple people edit the same document at once, track changes, and comment.
  • In an e-learning platform, the RTE can help teachers build lessons, quizzes, and discussions that include rich media and advanced formatting.

Because these scenarios depend on a reliable editor, choosing the right one is a big decision.

Trend No. 6: Real-World Integration

When we think about these trends, it is easy to see them in real products. Many developers remember times when a slow editor frustrated writers or when a lack of custom features forced the team to find odd workarounds. On the other hand, a good, flexible editor can make everyone’s job easier.

For example, a CMS might use a customizable editor that matches a company’s brand and makes sure that authors can create content without needing a technical person. A collaboration tool might rely on an RTE that loads fast enough to keep everyone’s ideas flowing smoothly. An e-learning platform might use an RTE that handles tables, images, videos, and special formatting to keep students engaged.

Trend No. 7: Why a Lean and Flexible Tool Helps

Some tools already fit these new needs without shouting about it. For example, an editor like Froala stays light and easy to load while still offering ways to add custom features. Furthermore, it scales nicely and works well with popular languages and frameworks.

According to the 2024 Stack Overflow Development Survey, JavaScript continues to dominate as the most popular programming language. With 62.3% of developers using JS, 39.8% desiring it, and 58.3% admiring it in 2024, it’s here to stay. This highlights the importance of using rich text editors that integrate into diverse technologies, especially widely used ones. Such versatility allows developers to quickly adapt to new requirements, such as changes in tech stacks, promoting scalability.

A lean tool like Froala can help developers meet their goals without slowing them down. Even if it is not the only choice, it represents the kind of editor that developers now look for—something that does not get in the way but instead supports growth and new ideas.

In Conclusion

The data from these surveys is hard to ignore. More than half of developers want deep customization. Nearly four-fifths put performance first. Almost half focus on scalability. Also, a large majority expect at least some baseline formatting, and many want even more advanced features, including AI-driven help.

These changes show that choosing the right RTE is more important than ever. Today’s developers need an editor that fits into their workflow, loads quickly, scales easily, and offers a path to smarter features. By paying attention to these factors, teams can pick an editor that feels like part of the product’s core, not just another add-on.

References
CKEditor. “The 2024 State of Collaborative Editing.” CKSource, a Tiugo Technologies Company.
https://ckeditor.com/insights/collaboration-survey-report-2024/

TinyMCE. “The 2024 RTE Survey.” Tiny Technologies.
https://www.tiny.cloud/blog/announcing-the-2024-state-of-rich-text-editors-report

2024 Stack Overflow Developer Survey.
https://survey.stackoverflow.co/2024/

Cloudinary. “2023 State of Visual Media Report.”
https://cloudinary.com/state-of-visual-media-report

Text Editor Market Insights Report. “Global Text Editor Market Overview and Trends.” Verified Market Reports.
https://www.verifiedmarketreports.com/product/text-editor-market/

Froala Official Site. “Why Froala? Key Features and Benefits.”
https://www.froala.com

A Step-by-Step Guide To Export Froala WYSIWYG Editor To PDF

PDF export

As a tech-savvy user or entry-level developer, you’re always on the lookout for tools that can streamline your workflow and enhance your productivity. Today, we’re excited to introduce you to the Froala WYSIWYG Editor and its powerful PDF export feature.

Froala is a feature-rich, user-friendly text editor that allows you to create and format content with ease. Whether you’re writing blog posts, drafting technical documentation, or designing marketing materials, Froala’s intuitive interface and robust functionality make it a valuable asset in your content creation arsenal.

In this blog post, we’ll dive deep into the PDF export feature of the Froala WYSIWYG Editor, guiding you step-by-step on how to set it up and leverage it to your advantage.

Key Takeaways:

  1. The Froala WYSIWYG Editor provides a powerful PDF export feature that allows you to easily convert your content into professional-looking PDF documents.
  2. The PDF export feature relies on the “html2pdf.js” library, which must be included in your project for the feature to work.
  3. You can customize the PDF export by configuring options like page size, orientation, and margins using the “html2pdf” option provided by the Froala Editor.
  4. Strategically using CSS page break properties can help you control where the page breaks occur in the exported PDF document.

Downloading and Setting Up Froala WYSIWYG Editor

To get started, you’ll need to download the Froala WYSIWYG Editor. You can visit the pricing page and choose the plan that best suits your needs. Whether you’re a solo developer or part of a larger team, Froala offers a range of licensing options to accommodate your requirements. If you want to test the editor first, you can also take advantage of the free trial option.

Once you’ve downloaded and installed the Froala WYSIWYG Editor, it’s time to set it up. The process is straightforward and can be completed in a few simple steps:

  1. Include the necessary CSS and JavaScript files in your HTML document.
  2. Initialize the Froala Editor by adding the appropriate HTML element and JavaScript code.
  3. Customize the editor’s appearance and functionality by configuring the available options.

Here’s an example of how you can set up the Froala WYSIWYG Editor:

<!DOCTYPE html>
<html>

<head>
    <title>Froala WYSIWYG Editor</title>
    <!-- Include Froala CSS -->
    <link href="{{editor__download__folder}}/css/froala_editor.pkgd.min.css" rel="stylesheet"
        type="text/css" />
</head>

<body>
    <!-- HTML element where the editor will be initialized -->
    <div id="editor">
        <p>This is the initial content of the editor.</p>
    </div>


    <!-- Include Froala Editor JS files -->
    <script type="text/javascript" src="{{editor__download__folder}}/js/froala_editor.pkgd.min.js"></script>

    <script>
        // Initialize the Froala Editor
        new FroalaEditor('#editor');
    </script>
</body>

</html>

This example demonstrates the basic setup for the Froala WYSIWYG Editor. You can further customize the editor by adding additional configurations to suit your specific needs.

Exploring the PDF Export Feature

Now that you have the Froala WYSIWYG Editor set up, let’s dive into the PDF export feature. This powerful functionality allows you to seamlessly convert your content into a professional-looking PDF document, making it easy to share, print, or archive your work.

Since we are using the packaged version of Froala “froala_editor.pkgd.min.js“, this feature is included by default.

If you’re using the basic version of Froala (froala_editor.min.js), you’ll need to include the Froala PDF export plugin in your project.

<script type="text/javascript" src="{{editor__download__folder}}/js/froala_editor.min.js"></script>
<script type="text/javascript" src="{{editor__download__folder}}/js/plugins/print.min.js"></script>

Make sure to include the “print” plugin in the list of enabled plugins:

new FroalaEditor('#editor', { 
       pluginsEnabled: ['print'],
});
 With the plugin in place, you can now add the PDF export button to your Froala Editor toolbar. Here's an example of how to do that:
new FroalaEditor('#editor', { 
       pluginsEnabled: ['print'],
       toolbarButtons: ['getPDF'],
});

This configuration will add an “Export PDF” button to your Froala Editor toolbar. However, users will still be unable to export the content as PDF documents. That’s because the PDF export feature depends on the html2pdf.jsopen-source library. You’ll need to include this library in your project as well. The “html2pdf.js” script must be included before the Froala scripts.

    <!-- Include js2htm library -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.9.3/html2pdf.bundle.min.js"
        integrity="sha512-YcsIPGdhPK4P/uRW6/sruonlYj+Q7UHWeKfTAkBW+g83NKM+jMJFJ4iAPfSnVp7BKD4dKMHmVSvICUbE/V1sSw=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <!-- Include Froala Editor JS files -->
    <script type="text/javascript" src="{{editor__download__folder}}/js/froala_editor.min.js"></script>
    <script type="text/javascript" src="{{editor__download__folder}}/js/plugins/print.min.js"></script>

Note that, as mentioned on html2pdf.js site, there have been some issues reported with the latest version of html2pdf.js (v0.10), so it’s recommended to use version 0.9.3 for now.

Exporting Content as PDF

Now that you have the PDF export feature set up, let’s walk through the process of exporting your content as a PDF document.

  1. Add Content to the Froala Editor: Start by adding your desired content to the Froala WYSIWYG Editor. This could be a blog post, a technical guide, or any other type of content you want to export as a PDF.
  2. Click the PDF Export Button: Once you’ve finished editing your content, locate the “PDF Export” button in the Froala Editor toolbar and click it.

That’s it! You’ve successfully exported your Froala WYSIWYG Editor content as a PDF document. This feature is particularly useful when you need to share your work with others, print it, or archive it for future reference.

Export Editor Content to PDF Programmatically

The Froala Editor’s Print plugin provides a toPDF() method that allows you to export the editor’s content to a PDF document programmatically. This can be useful when you want to trigger the PDF export after a specific event, such as when the editor initializes.

Here’s an example of how to export the content to PDF right after the editor is initialized:

        // Initialize the Froala Editor
        new FroalaEditor('#editor', {
            pluginsEnabled: ['print'],
            toolbarButtons: ['getPDF'],
        }, function () {
            this.print.toPDF();


        });

The toPDF() method uses the default Froala PDF export options.

Customizing the PDF Export

If you want to customize the exported PDF, such as setting the orientation to portrait instead of landscape, you can use the html2pdf option provided by the Froala Editor.

The html2pdf option returns a function that gives you access to the html2pdf.js Worker object. With this object, you can trigger any html2pdf methods. Read more about how to use it in the html2pdf documentation.

You can use this object to configure the PDF settings and then export the editor’s content following this format editor.opts.html2pdf().set(configration).from(editor.el).save();.

Here’s an example:

        // Initialize the Froala Editor
        new FroalaEditor('#editor', {
            pluginsEnabled: ['print'],
            toolbarButtons: ['getPDF'],
        }, function () {

            let editor = this;

            editor.opts.html2pdf().set({
                margin: [10, 20],
                html2canvas: { useCORS: !0 },
                filename: 'new name.pdf',
                jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
            }).from(editor.el).save();
        });

In this example, we’re setting the following PDF options:

  • margin: Specifies the PDF margins in points.
  • html2canvas.useCORS: Enables CORS (Cross-Origin Resource Sharing) for the HTML2Canvas library, which is used to capture the editor’s content.
  • filename: Sets the name of the exported PDF file.
  • jsPDF: Configures the PDF document settings, such as the unit, page format, and orientation.

After setting the options, we use the from(editor.el) method to specify the editor element as the content to be converted to PDF, and then call the save() method to generate and download the PDF file.

Remember, setting the configuration incorrectly could result in an empty or incorrectly formatted PDF file, so be cautious when customizing the PDF export.

Adding Page Breaks

The html2pdf.js library automatically adds page breaks based on your CSS styles. You can use the break-before, break-after, and break-inside CSS properties to control where the page breaks should occur.

For example, you can add a page break before a specific element by applying the break-before: always style to it. This ensures that the element starts on a new page when you export the content to PDF.

Additionally, you can add the html2pdf__page-break class to any element, and html2pdf.js will insert a page break after that element. This is a legacy feature, but it can still be useful in some cases.

To summarize, make sure to add the appropriate CSS page break styles to your content. When you export the Froala Editor’s content to PDF, html2pdf.js will automatically insert the page breaks based on your CSS rules, resulting in a well-formatted PDF document.

Conclusion

In this blog post, we’ve explored the powerful PDF export feature of the Froala WYSIWYG Editor. By following the step-by-step guide, you now know how to download and set up the Froala Editor, as well as how to leverage the PDF export functionality to streamline your content creation and sharing workflows.

Whether you’re a tech-savvy user or an entry-level developer, the Froala WYSIWYG Editor and its PDF export feature can be a valuable asset in your content creation toolkit. By mastering these tools, your users will be able to create professional-looking documents, enhance your productivity, and deliver high-quality content to their audience.

So, what are you waiting for? Download Froala, try out the PDF export feature, and start creating amazing content today!

How to Make Your Visual HTML WYSIWYG Editor Smarter with Image Sentiment Analysis

Every image has a story to tell, which means that emotion matters in each image upload. For example, let’s say that some moviegoers will have to choose between two horror films. It’s highly likely for them to choose the film with a poster that exhibits more fear and uneasiness. This is where image sentiment analysis comes in. It unlocks emotional context within visuals to help creators and decision-makers optimize their content for maximum impact. When combined with a visual HTML WYSIWYG editor, it allows end users to easily upload images and receive feedback about the emotions in their images instantly. In this tutorial, I’ll show you how to add image sentiment analysis features in your HTML WYSWIG editor to determine emotion in images.

Key Takeaways

  • Image sentiment is an advanced feature that suits portrait-centric applications
  • Easily implement image sentiment analysis with an intelligent visual editor
  • Scan images from uploads or external sources
  • Chain image sentiment analysis together with other Filestack tasks
  • Some use cases for image sentiment detection include marketing, entertainment, social media, and more

What is Image Sentiment?

Image sentiment is a process that uses machine learning and algorithms like neural networks and deep learning to evaluate an image’s conveyed emotions. For instance, when a user uploads a photo of a person, image sentiment detection can determine whether the person is happy, calm, angry, and so on. This process is useful across different fields, such as marketing, user studies, content creation, entertainment, and more. In all these examples, image sentiment analysis can enhance engagement strategies, helping organizations convey their message better and give their audience what they need. Now that we know a bit about image sentiment, let’s explore how we can implement it in a WYSIWYG editor.

How to Analyze Image Sentiment Using a Visual HTML WYSIWYG Editor

To start off, we’ll need to create and initialize our Froala editor. Afterwards, we’ll use Filestack’s Image Sentiment API to evaluate any uploaded images. In our setup, Filestack is natively integrated into Froala Editor (v4.3.0 and up). Once we get both the editor and image sentiment detector running, we’ll display the results of the API call in our editor.

Initialize the Visual HTML WYSIWYG Editor

In your HTML file, add the code:

<head>
     <!-- Add your other CSS here -->

     <!-- Froala and Filestack stylesheets -->
     <link href="https://cdn.jsdelivr.net/npm/froala-editor@latest/css/froala_editor.pkgd.min.css" rel="stylesheet" type="text/css" />
     <link rel="stylesheet" href="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.css" />
</head>
<body>
     <!-- Your other elements go here -->
     <div id="froala-editor"></div>
     <!-- Your other elements go here -->

     <!-- Froala and Filestack JS -->
     <script src="https://static.filestackapi.com/filestack-js/3.32.0/filestack.min.js"></script>
     <script src="https://static.filestackapi.com/filestack-drag-and-drop-js/1.1.1/filestack-drag-and-drop.min.js"></script>
     <script src="https://static.filestackapi.com/transforms-ui/2.x.x/transforms.umd.min.js"></script>
     <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/froala-editor@latest/js/froala_editor.pkgd.min.js"></script>

     <!-- Your other JS files go here -->
     <script src="js/index.js"></script>
</body>

The HTML, along with your other elements, styles, and JS, should contain the Froala and Filestack dependencies. Furthermore, this is where you’ll create the element in which you’ll initialize the editor. When you’re done, navigate to your JS file or script and include the following:

new FroalaEditor('#froala-editor',{
    filestackOptions: {
        filestackAPI: 'YourFilestackAPIKey',
        uploadToFilestackOnly: true,
        pickerOptions: {
            accept: ['image/*'],
            fromSources: ['local_file_system']
        }
    },
    toolbarButtons: {
        'moreRich': {
            'buttons': ['openFilePickerImageOnly', 'insertLink', 'insertTable', 'emoticons', 'specialCharacters', 'insertHR'],
            'buttonsVisible': 3
        },

        'moreText': {
            'buttons': ['bold', 'italic', 'underline', 'fontFamily', 'fontSize', 'textColor', 'backgroundColor', 'clearFormatting']
        },

        'moreParagraph': {
            'buttons': ['alignLeft', 'alignCenter', 'formatOLSimple', 'alignRight', 'alignJustify', 'formatOL', 'formatUL', 'paragraphFormat', 'paragraphStyle', 'lineHeight', 'outdent', 'indent', 'quote']
        },
        'moreMisc': {
            'buttons': ['undo', 'redo', 'fullscreen', 'selectAll', 'html', 'help'],
            'align': 'right',
            'buttonsVisible': 2
        }
    },
    events: {
        'filestack.uploadedToFilestack': function (response) {
            // when a file is uploaded, begin the image sentiment detection process
            performAnalysis(response.filesUploaded[0].handle, this);
        },
        'filestack.uploadFailedToFilestack': function (response) {
            console.log(response);
        },
    },
    heightMin: 500,
    heightMax: 1000
});

This script initializes Froala Editor into the element that we created earlier. We also declare some Froala options along with some Filestack options. In the Filestack options, we specify that we want to upload images of any type from the local file system to Filestack. On the other hand, in our Froala options, we also specify our buttons, editor size, and two callback functions. The first event deals with a successful image upload, while the other deals with possible upload failure. Whenever the user successfully uploads an image, we’re calling a function called “performAnalysis,” which takes the uploaded image’s file handle and the editor instance as its parameters. This function is where we’ll use Filestack’s image sentiment features to evaluate the emotions.

Call the Image Sentiment Analysis API

In your JS file, append the code below:

async function performAnalysis(fileHandle, editorInstance) {
    // use the generated policy and signature from your Filestack dashboard
    const policy = 'YourGeneratedPolicy';
    const signature = 'YourGeneratedSignature';
    const imageSentimentURL = `https://cdn.filestackcontent.com/security=p:${policy},s:${signature}/image_sentiment/${fileHandle}`;

    // fetch results from the Image Sentiment API, then insert the result into the editor
    try {
        const result = await scanImage(imageSentimentURL);
        // format the emotions (for display)
        const emotions = formatEmotions(result.emotions);
        editorInstance.html.insert(`<p>Image Sentiment Analysis:</p><ul>${emotions}</ul>`);
        console.log("Image sentiment result inserted into the editor:", result);
    } catch (error) {
        console.error("Error during sentiment analysis:", error);
    }
}

// function that makes the API call
async function scanImage(url) {
    const response = await fetch(url);
    if (!response.ok) {
        throw new Error("Failed to fetch image sentiment results.");
    }

    const data = await response.json();
    return data;
}

Notice how we have two functions, performAnalysis and scanImage. The first one is responsible for generating the URL that we’ll be using for the API call. Once it does that, it then passes the constructed URL to the second asynchronous function, which calls the API call and returns the result back to the first function. Afterwards, we insert the result of the fetch call back into the editor. But to do that, we need another function for turning the raw results into an easy-to-read list.

Format and Display the Results in the Editor

In the same script, add the following function:

// function for formatting the JSON object of emotions into an HTML list
function formatEmotions(emotions) {
    if (!emotions.hasOwnProperty('HAPPY')) return '<li>No sentiment detected.</li>';

    return Object.entries(emotions)
        .map(([emotion, value]) => `<li>${emotion}: ${(value).toFixed(2)}%</li>`)
        .join('');
}

This function first checks if the JSON result (emotions) has empty values. If it doesn’t, it returns that no sentiment was detected in the image. Otherwise, it returns a list that contains the keys (emotions) and values (in percentage and rounded up to two decimal points). After this, you now have a working image sentiment analysis feature in your application. But we’re not quite done yet. Let’s run the application and check the results. Here I uploaded an image of a person who appears to be confused.

The visual HTML WYSIWYG editor with an uploaded image of a man scratching his head. In the WYSIWYG editor, it was determined by Filestack's image sentiment detector that the primary emotion of the person in the image is "confused" (99.27%).

After uploading the image, Filestack determined that the person in the image displays 99.27% confusion, which checks out. After checking the console, here’s what I saw:

The browser console showing the result of the Image Sentiment API call from Filestack. Here, it shows that the image displays 99.27% confusion.

This is the unformatted version of the result. Now, let’s try uploading a picture of a person smiling:

A photo of a person smiling is uploaded into the visual HTML WYSIWYG editor for image sentiment analysis. This resulted in a "HAPPY: 100%" evaluation.

Filestack’s Image Sentiment Detection feature correctly determined that the overall sentiment of the image is 100% happy. But what if the image has no person at all? Let’s try uploading a picture of a landscape:

A photo containing a mountain. Here, there was no emotion detected because the image doesn't contain any person.

Here, we can see that the image has no sentiment or emotions since it doesn’t contain a portrait of anybody. Now, you’re free to experiment with Filestack’s image sentiment features. Note that you can also do other things with it. For instance, you can use it in your Filestack Workflows with other tasks, use it on images with external URLs, and use it with storage aliases.

Wrapping up: Enhance Your Visual HTML WYSIWYG Editor with Image Sentiment Features

By integrating image sentiment analysis into your visual HTML WYSIWYG editor, you add a layer of intelligence and user engagement to your content-centric apps. This feature not only streamlines workflows for developers but also provides meaningful insights into visually conveyed emotions and helps you connect more with your users. So, take advantage of this powerful combination to create smarter tools that cater to a wide variety of creative needs.

Get your Filestack API here for free.