npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

editium

v1.1.0

Published

A powerful and feature-rich React rich text editor component built with Slate.js, featuring comprehensive formatting options, tables, images, find & replace, and more

Downloads

148

Readme

Editium

npm version License: MIT Bundle Size TypeScript

Production-ready rich text editor for React and Vanilla JavaScript

Modern • Lightweight • Customizable • Zero Dependencies (Vanilla)

Quick StartDocumentationExamplesAPI Reference


Overview

Editium is a flexible rich text editor that works seamlessly in both React and Vanilla JavaScript environments. Built for developers who need a reliable, feature-rich editor without the complexity.

Why Editium?

  • Dual-Mode Support: Same powerful features in React (Slate.js) and Vanilla JS (pure JavaScript)
  • Production Ready: Battle-tested with comprehensive formatting tools and advanced features
  • Developer Experience: Get from npm install to working editor in under 60 seconds
  • Export Flexibility: HTML, JSON, and plain text output formats
  • Fully Customizable: Configure exactly what you need, hide what you don't

Quick Start

React

npm install editium
import { Editium } from 'editium';

function App() {
  return <Editium placeholder="Start typing..." toolbar="all" />;
}

See live demo →

Vanilla JavaScript

Single file - no build step required:

<!DOCTYPE html>
<html>
<head>
  <script src="https://unpkg.com/editium/vanilla/editium.bundle.js"></script>
</head>
<body>
  <div id="editor"></div>
  
  <script>
    const editor = new Editium({
      container: document.getElementById('editor'),
      placeholder: 'Start typing...',
      toolbar: 'all'
    });
  </script>
</body>
</html>

See live demo →


Key Features

Rich Text Editing

  • Comprehensive formatting: bold, italic, underline, strikethrough, code
  • 8 heading levels, blockquotes, and code blocks
  • Text and background colors
  • Superscript and subscript

Advanced Capabilities

  • Full table support with dynamic rows/columns
  • Resizable images with custom upload handlers
  • Bulleted and numbered lists with nesting
  • Find and replace with match highlighting
  • Text alignment (left, center, right, justify)

Developer Experience

  • TypeScript support with full type definitions
  • HTML and JSON export formats
  • Customizable toolbar (show only what you need)
  • Keyboard shortcuts for efficient editing
  • Read-only mode for content display
  • Word and character counting
  • Fullscreen editing mode

Framework Flexibility

  • React: Component-based with hooks support
  • Vanilla JS: Zero dependencies, works anywhere
  • Same API and features across both versions

Installation

npm install editium

Peer dependencies (React only):

npm install react react-dom

CDN (Vanilla JS):

<script src="https://unpkg.com/editium/vanilla/editium.bundle.js"></script>

Documentation

React Usage

Basic Example

import { Editium } from 'editium';

function App() {
  return <Editium toolbar="all" placeholder="Start typing..." />;
}

With Content Management

import React, { useState } from 'react';
import { Editium } from 'editium';

function Editor() {
  const [content, setContent] = useState({ html: '', json: [] });

  return (
    <Editium
      toolbar="all"
      onChange={(html, json) => setContent({ html, json })}
      showWordCount={true}
    />
  );
}

Custom Toolbar

<Editium 
  toolbar={[
    'bold', 'italic', 'underline',
    'separator',
    'heading-one', 'heading-two',
    'separator',
    'bulleted-list', 'numbered-list',
    'link', 'image'
  ]}
/>

→ Full React Documentation

Vanilla JavaScript Usage

CDN (Recommended)

<script src="https://unpkg.com/editium/vanilla/editium.bundle.js"></script>

<div id="editor"></div>

<script>
  const editor = new Editium({
    container: document.getElementById('editor'),
    toolbar: 'all',
    placeholder: 'Start typing...'
  });
  
  // Get content
  const html = editor.getHTML();
  const json = editor.getJSON();
</script>

NPM

import 'editium/vanilla/editium.css';
import Editium from 'editium/vanilla/editium.js';

const editor = new Editium({
  container: document.getElementById('editor'),
  toolbar: 'all'
});

→ Full Vanilla JS Documentation


API Reference

React Props

| Prop | Type | Default | Description | |------|------|---------|-------------| | toolbar | ToolbarItem[] \| 'all' | Basic items | Toolbar configuration | | placeholder | string | 'Start typing...' | Placeholder text | | onChange | (html, json) => void | - | Content change callback | | initialValue | string \| CustomElement[] | - | Initial content | | readOnly | boolean | false | Read-only mode | | showWordCount | boolean | false | Show word/character count | | height | string \| number | '200px' | Editor height | | onImageUpload | (file: File) => Promise<string> | - | Custom image upload |

Vanilla JS Options

| Option | Type | Default | Description | |--------|------|---------|-------------| | container | HTMLElement | required | DOM element for editor | | toolbar | string \| array | 'all' | Toolbar configuration | | placeholder | string | '' | Placeholder text | | onChange | function | - | Content change callback | | readOnly | boolean | false | Read-only mode | | showWordCount | boolean | false | Show word/character count | | height | string \| number | '200px' | Editor height | | onImageUpload | function | - | Custom image upload |

Vanilla JS Methods

editor.getHTML()        // Returns HTML string
editor.getText()        // Returns plain text
editor.getJSON()        // Returns JSON structure
editor.setContent(html) // Set editor content
editor.clear()          // Clear editor
editor.focus()          // Focus editor
editor.destroy()        // Cleanup editor

Toolbar Items

Available items: bold, italic, underline, strikethrough, code, superscript, subscript, heading-one through heading-eight, paragraph, blockquote, code-block, bulleted-list, numbered-list, indent, outdent, left, center, right, justify, text-color, bg-color, link, image, table, horizontal-rule, undo, redo, find-replace, fullscreen, view-output, separator


Examples

Custom Image Upload

React:

const handleImageUpload = async (file: File) => {
  const formData = new FormData();
  formData.append('image', file);
  
  const response = await fetch('/api/upload', { 
    method: 'POST', 
    body: formData 
  });
  
  const { url } = await response.json();
  return url;
};

<Editium onImageUpload={handleImageUpload} />

Vanilla JS:

const editor = new Editium({
  container: document.getElementById('editor'),
  onImageUpload: async (file) => {
    const formData = new FormData();
    formData.append('image', file);
    const response = await fetch('/api/upload', { 
      method: 'POST', 
      body: formData 
    });
    const { url } = await response.json();
    return url;
  }
});

Saving Content

React:

function EditorWithSave() {
  const [content, setContent] = useState({ html: '', json: [] });

  const handleSave = async () => {
    await fetch('/api/save', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(content)
    });
  };

  return (
    <>
      <Editium onChange={(html, json) => setContent({ html, json })} />
      <button onClick={handleSave}>Save</button>
    </>
  );
}

Vanilla JS:

const editor = new Editium({
  container: document.getElementById('editor'),
  onChange: (content) => {
    localStorage.setItem('content', JSON.stringify({
      html: content.html,
      json: content.json
    }));
  }
});

Height Configuration

// React
<Editium height={400} minHeight={200} maxHeight={600} />

// Vanilla JS
new Editium({
  container: document.getElementById('editor'),
  height: '400px',
  minHeight: '200px',
  maxHeight: '600px'
});

Keyboard Shortcuts

| Shortcut | Action | |----------|--------| | Ctrl/Cmd + B | Bold | | Ctrl/Cmd + I | Italic | | Ctrl/Cmd + U | Underline | | Ctrl/Cmd + Z | Undo | | Ctrl/Cmd + Y | Redo | | Ctrl/Cmd + K | Insert link | | F11 | Fullscreen | | Tab | Indent list | | Shift + Tab | Outdent list |


Browser Support

  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)

Community & Support

Get Help

  • GitHub Issues - Bug reports and feature requests
  • GitHub Discussions - Questions and community support
  • Security: See SECURITY.md for responsible disclosure and contact instructions

Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Code of Conduct

This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code.


License

MIT License - See LICENSE file for details.

Copyright © 2025 Nabarup Dev


Acknowledgments

  • Built with Slate.js for the React version
  • Inspired by modern rich text editors: TipTap, ProseMirror, and Quill

Made with ❤️ by Nabarup Dev

Star us on GitHub if you find this project useful!

NPMGitHubIssues