Building a CRUD playground in Next.js allows you to experiment with content creation and management interactively. In this guide, we'll integrate TipTap as a WYSIWYG editor, PrismJS for code snippets, FontAwesome for toolbar icons, and Tailwind Typography for styling.
Setting Up the Next.js Project
npx create-next-app@latest my-crud-playground
cd my-crud-playgroundInstall dependencies:
npm install @tiptap/react @tiptap/starter-kit @tiptap/extension-code-block @tiptap/extension-highlight @tiptap/extension-link prismjs @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons tailwindcss @tailwindcss/typographyConfiguring Tailwind using typography plugins for the content styling
module.exports = {
content: ["./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}"],
theme: {
extend: {},
},
plugins: [require("@tailwindcss/typography")],
};Implementing TipTap as a WYSIWYG Editor
Create a component Editor.js:
import { useEditor, EditorContent } from "@tiptap/react";
import StarterKit from "@tiptap/starter-kit";
import CodeBlock from "@tiptap/extension-code-block";
import Highlight from "@tiptap/extension-highlight";
import Link from "@tiptap/extension-link";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faBold, faItalic, faCode } from "@fortawesome/free-solid-svg-icons";
export default function Editor() {
const editor = useEditor({
extensions: [StarterKit, CodeBlock, Highlight, Link],
content: "<p>Hello World!</p>",
});
return (
<div className="prose mx-auto">
<div className="toolbar flex gap-2 border-b p-2">
<button onClick={() => editor.chain().focus().toggleBold().run()}>
<FontAwesomeIcon icon={faBold} />
</button>
<button onClick={() => editor.chain().focus().toggleItalic().run()}>
<FontAwesomeIcon icon={faItalic} />
</button>
<button onClick={() => editor.chain().focus().toggleCode().run()}>
<FontAwesomeIcon icon={faCode} />
</button>
</div>
<EditorContent editor={editor} />
</div>
);
}Note: This is a simple usage of TipTap, as its a modular lib, you can modify it as you wish.
/my-crud-playground
│── /src
│ ├── /app
│ ├── page.js
│ ├── /components
│ │ ├── TipTapEditor.js
│ │ ├── PrismLoader.js
│ ├── globals.css
│── /public
│── /node_modules
│── .gitignore
│── package.json
│── tailwind.config.js
│── next.config.js
│── README.mdUsing PrismJS for Code Highlighting
"use client";
import { useEffect } from "react";
import Prism from "prismjs";
import "prismjs/components/prism-javascript";
export default function PrismLoader() {
useEffect(() => {
Prism.highlightAll();
}, []);
return <div className="hidden"></div>;
}Include PrismLoader in your post container:
import PrismLoader from "./PrismLoader";
export default function PostContainer({ content }) {
return (
<div>
<PrismLoader />
<div className="prose" dangerouslySetInnerHTML={{ __html: content }}></div>
</div>
);
}Conclusion
This setup gives you a CRUD playground with Next.js, a modular WYSIWYG editor (TipTap with FontAwesome icons), syntax highlighting (PrismJS), and beautiful typography (Tailwind). You can extend it by adding a database (e.g., Firebase, Supabase) for persistent data storage. For my “learning” project, i use AppBackend as its database.
Happy coding!