A React framework for building text editors.

Related tags

Editors draft-js
Overview

draftjs-logo

Draft.js

Build Status npm version

Live Demo


Draft.js is a JavaScript rich text editor framework, built for React and backed by an immutable model.

  • Extensible and Customizable: We provide the building blocks to enable the creation of a broad variety of rich text composition experiences, from basic text styles to embedded media.
  • Declarative Rich Text: Draft.js fits seamlessly into React applications, abstracting away the details of rendering, selection, and input behavior with a familiar declarative API.
  • Immutable Editor State: The Draft.js model is built with immutable-js, offering an API with functional state updates and aggressively leveraging data persistence for scalable memory usage.

Learn how to use Draft.js in your own project.

Draft.js is used in production on Facebook, including status and comment inputs, Notes, and messenger.com.

API Notice

Before getting started, please be aware that we recently changed the API of Entity storage in Draft.

Previously, the old API was set to be removed in v0.11.0. Since, the plans have changed— v0.11.0 still supports the old API and v0.12.0 will remove it. Refer to the docs for more information and information on how to migrate.

Getting Started

npm install --save draft-js react react-dom

or

yarn add draft-js react react-dom

Draft.js depends on React and React DOM which must also be installed.

Using Draft.js

import React from 'react';
import ReactDOM from 'react-dom';
import {Editor, EditorState} from 'draft-js';

function MyEditor() {

  
  constructor(props) {
    super(props);
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
    this.setEditor = (editor) => {
      this.editor = editor;
    };
    this.focusEditor = () => {
      if (this.editor) {
        this.editor.focus();
      }
    };
  }

  componentDidMount() {
    this.focusEditor();
  }

  render() {
    return (
      <div style={styles.editor} onClick={this.focusEditor}>
        <Editor
          ref={this.setEditor}
          editorState={this.state.editorState}
          onChange={this.onChange}
        />
      </div>
    );
  }
}

const styles = {
  editor: {
    border: '1px solid gray',
    minHeight: '6em'
  }
};

ReactDOM.render(
  <MyEditor />,
  document.getElementById('container')
);

Since the release of React 16.8, you can use Hooks as a way to work with EditorState without using a class.

import React from "react";
import { Editor, EditorState } from "draft-js";
import "draft-js/dist/Draft.css";

export default function MyEditor() {
  const [editorState, setEditorState] = React.useState(() =>
    EditorState.createEmpty()
  );

  const editor = React.useRef(null);
  function focusEditor() {
    editor.current.focus();
  }

  return (
    <div
      style={{ border: "1px solid black", minHeight: "6em", cursor: "text" }}
      onClick={focusEditor}
    >
      <Editor
        ref={editor}
        editorState={editorState}
        onChange={setEditorState}
        placeholder="Write something!"
      />
    </div>
  );
}

Note that the editor itself is only as tall as its contents. In order to give users a visual cue, we recommend setting a border and a minimum height via the .DraftEditor-root CSS selector, or using a wrapper div like in the above example.

Because Draft.js supports unicode, you must have the following meta tag in the <head> </head> block of your HTML file:

<meta charset="utf-8" />

Further examples of how Draft.js can be used are provided in the /examples directory of this repo.

Building Draft.js

Draft.js is built with Yarn v1. Using other package managers mgiht work, but is not officially supported.

To clone and build, run:

git clone https://github.com/facebook/draft-js.git
cd draft-js
yarn install
yarn run build

Examples

To run the examples in the /examples directory, first build Draft.js locally as described above. Then, open the example HTML files in your browser.

Browser Support

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
iOS Safari
iOS Safari
Chrome for Android
Chrome for Android
IE11, Edge [1, 2] last 2 versions last 2 versions last 2 versions not fully supported [3] not fully supported [3]

[1] May need a shim or a polyfill for some syntax used in Draft.js (docs).

[2] IME inputs have known issues in these browsers, especially Korean (docs).

[3] There are known issues with mobile browsers, especially on Android (docs).

Resources and Ecosystem

Check out this curated list of articles and open-sourced projects/utilities: Awesome Draft-JS.

Discussion and Support

Join our Slack team!

Contribute

We welcome pull requests. Learn how to contribute.

License

Draft.js is MIT licensed.

Examples provided in this repository and in the documentation are separately licensed.

Comments
  • Conflict with Grammarly chrome extension

    Conflict with Grammarly chrome extension

    Do you want to request a feature or report a bug? Bug

    What is the current behavior? When using the Grammarly extension which has 10K reviews in the google app store (with 4.5 stars), text that you type occasionally stops.

    If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem. Using the draft.js sample site, you can see the behavior in this video: http://screencast.com/t/8xhRQz9sZt

    It seems to be related to when grammarly detects an issue.

    What is the expected behavior? Not to erase text.

    Which versions of Draft.js, and which browser / OS are affected by this issue? Did this work in previous versions of Draft.js? Current version in Chrome on OS X 10.11.4

    opened by danjstern 102
  • Fixing major Android editing issues

    Fixing major Android editing issues

    This PR is a new attempt to address https://github.com/facebook/draft-js/issues/1895

    On https://github.com/facebook/draft-js/pull/2031 I was trying to make compositions work using the data provided by that event, and even though that works well for most operational system, that doesn't work well for Android, where you can make composition updates in multiple places on the same composition transaction.

    This PR is an improvement over that PR, in that it uses a DOM mutation observer during the compositionStart -> compositionEnd interval to detect the changes the user made, and then re-apply those to the ContentState on compositionEnd.

    This approach is the one used by Prosemirror (see https://github.com/ProseMirror/prosemirror-view/blob/master/src/domobserver.js), which is the only Rich Text Editor I've tried that works well on Android. Like previously mentioned, it allows multiple mutations on multiple places in the same composition transaction, which was impossible with the previous approach, and would cause DOM<->state inconsistencies in multiple use cases.

    The intent of this PR is not to fix every single Android bug, but to have a consistent editing experience on Android without introducing bugs (ideally).

    TODO, known issues:

    • [x] Removing empty line breaks with doesn’t remove blocks.
    • [x] Mutations on the same block (different leaf nodes) are not being properly applied.
    • [x] Selection is not properly updated during composition events
    • [ ] Keep inlineStyleOverride working with a consistent behavior

    TODO, others:

    • [x] Test on Android Pie v9 API 28
    • [x] Test on Android Oreo v8.1 API 27
    • [x] Test on Android Oreo v8.0 API 26
    • [x] Test on iPhone 12.1 (with Japanese Kana keyboard)
    • [x] Test composition events on Chrome Desktop v73
    • [x] Test composition on IE11 (I didn't know how to test composition events though)
    • [x] Unit tests

    Help test this PR

    There are 3 ways to try out this PR.

    Codesandbox: https://3ymzzlj9n5.codesandbox.io/ (uses draft-js-android-fix-beta.3)

    Use the published draft-js-android-fix package: yarn install draft-js-android-fix

    Note that this package might not be up-to-date, it's hard for me to guarantee I'll always remember to update the package, but I'll do my best.

    The other way is guaranteed to be up-to-date, but has a longer setup:

    • run git clone https://github.com/facebook/draft-js.git
    • run git remote add fabiomcosta https://github.com/fabiomcosta/draft-js.git
    • run git fetch fabiomcosta
    • run git checkout -b attempt_android_fix_with_dom_diff fabiomcosta/attempt_android_fix_with_dom_diff
    • run yarn install (or use npm)
    • run open examples/draft-0-10-0/rich/rich.html, or any other example you'd like to test

    Test Plan

    On Android (Pie v9 API 28, Oreo v8.1 API 27, Oreo v8.0 API 26)

    Type "d[space]" Renders the letter "d" followed by a space.

    Type "da[space]" Renders the expected highlighted autocomplete option, "day" in this case.

    Type "day[space][backspace][backspace][backspace][backspace]" Properly removes the text without re-adding the previous text.

    Type "d[space][enter][backspace][enter]" Should render "d[space][enter]".

    Known issues, that might not be fixed on this PR

    • Pressing ENTER during a composition doesn’t commit it. Ex: type "hel[enter]", and notice that nothing happens when you click enter, but the expected behavior is to commit that composition and add a line break.
    • Removing the last work from a block that has been auto-completed, will incorrectly remove it from the content state. Ex: type "aa" it should render something like "and and ". Now press backspace. At this point the content state is incorrectly set as "and ", but it should be "and and".
    • [minor] Arrow keys won't work during composition

    Acknowledgments

    Based on ideas from: https://github.com/facebook/draft-js/pull/1672/ https://github.com/facebook/draft-js/pull/1774/ https://github.com/ianstormtaylor/slate/pull/2565/ http://prosemirror.net/

    Useful links

    Latest draft-js 0.10.5 sandbox (useful to compare with previous behavior): https://ko4zmx633v.codesandbox.io/ Plain contenteditable sandbox: https://q77yqk1nww.codesandbox.io/

    CLA Signed android Merged 
    opened by fabiomcosta 47
  • Tree block structure

    Tree block structure

    This PR implements support for a tree structure that can be used to render tables, blockquote, list, etc. For context on this topic, see discussion in #143.

    The main goal is also to not break compatibility with people already using Draft, and keep “flatness” as the basic use case.

    Implementation

    To represent a tree and keep compatibility with the flat model, we decide to not change the data structure, but instead to leverage keys in the ContentState.blockMap.

    Basically, children of the block a will be blocks in the blockMap with keys a/b, a/c; and a/b/d is a child of a/b.

    Demo

    A demo is available at samypesse.github.io/test-draft-js/ (similar to the tree example).

    Compatibility

    Nesting is disabled by default to keep “flatness” as the basic use case. It should be enabled for the right block types in the blockRenderMap, and Draft will provides a NestedUtils module to help use nested blocks and provide the right editing UX.

    enhancement CLA Signed big picture 
    opened by SamyPesse 47
  • Editor scrolls to bottom when pressing enter in the middle of a big paragraph

    Editor scrolls to bottom when pressing enter in the middle of a big paragraph

    When you have a big paragraph and you press enter in the middle, instead of keeping the focus in the middle of the page, the editor scrolls all the way to the bottom.

    Steps to reproduce:

    1. Go to https://facebook.github.io/draft-js/
    2. Copy paste in a large continuous paragraph without any newlines in between.
    3. Scroll to the middle of the big paragraph and press enter.
    4. The editor will have scrolled to the bottom

    This doesn't seem to happen consistently all the time, but I've seen it come up enough times on big paragraphs.

    opened by jainp 45
  • Refs must have owner

    Refs must have owner

    Hi,

    I just wanted to try Draft.js and tried to drop the example in my application and I've got the https://fb.me/react-refs-must-have-owner issue.

    I simplified a little bit my code, but looks something like this:

    // ModalComposer.jsx
    import React from 'react'
    import { Editor, EditorState } from 'draft-js'
    
    const ModalComposer = React.createClass({
      getInitialState () {
        return {
          editorState: EditorState.createEmpty()
        }
      },
    
      onChange (editorState) {
        this.setState({editorState})
      },
    
      render () {
        const { editorState } = this.state
    
        return (
          <div>
            <Editor
              editorState={editorState}
              onChange={this.onChange}
            />
          </div>
        )
      }
    })
    
    export default ModalComposer
    
    // Modal.jsx
    import { connect } from 'react-redux'
    import ModalComposer from './ModalComposer.jsx'
    import * as modalActions from '../../ducks/modals'
    import React from 'react'
    
    const Modal = React.createClass({
      propTypes: {
        dispatch: React.PropTypes.func.isRequired
      },
    
      onClickClose () {
        this.props.dispatch(modalActions.pop())
      },
    
      render () {
        return (
          <div>
            <button onClick={this.onClickClose}></button>
            <ModalComposer />
          </div>
        )
      }
    })
    
    export default connect()(Modal)
    

    I get the following:

    invariant.js:39 Uncaught Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's render method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner

    When I comment out the component ModalComposer (which is basically the draft-js one) I don't get this warning, so its not related to npm and dependencies.

    Thanks in advance!

    question meta needs more info 
    opened by masylum 44
  • What is the best approach for adding a checklist block to Draft?

    What is the best approach for adding a checklist block to Draft?

    I want to extend Draft to accept a checklist/todo block. The block will have a checkbox at the left edge and can be toggled on/off to represent a complete/pending state respectively. The checkbox cannot be moved around the editor (you can’t copy/paste it into the middle of a text block).

    I feel like there are a few approaches I can take, so I was wondering if I could get an opinion.

    1. Create a custom block type by extending DraftEditorBlock. I would need to override render() and tuck the checkbox into the component before the children are rendered.
      • One issue with this approach is that Draft does not publicly expose this component. Not a dealbreaker, but I’m assuming there was some thought behind excluding DraftEditorBlock.
    2. Wrap the internal block text in an Entity that injects the checkbox.
      • I tried out this approach using the link example. One side-effect is that you can’t delete all text within the block and have the Entity remain. These concerns were raised in #129, e.g. using a zero-width character.
    3. A better alternative?

    Thanks again for continuously improving Draft.

    question 
    opened by gscottolson 38
  • block level metadata

    block level metadata

    This commit add support for block level metadata.

    It is the same feature as https://github.com/facebook/draft-js/pull/157

    This PR does not rely on entity, but just add a data field to ContentBlock.

    hense block metadata are store in contentState and are supported by undo/redo.

    Why not using entities?

    • Entity are not made for block. what does type and mutability would map to?
    • Entity are planned to be integrated into contentState anyway (see #185)
    CLA Signed PR imported 
    opened by cgestes 37
  • Support rendering Draft.js into iframes (nested browsing contexts)

    Support rendering Draft.js into iframes (nested browsing contexts)

    Summary

    Removes Draft’s dependency on the global window and document objects and makes it work across nested browsing contexts (iframes) by using the document and window relative to the browsing context in which Draft is being used. React itself makes similar assumptions about being able to use the global window and document objects, as documented in facebook/react#427, so this PR depends on facebook/react#9184. All together, these changes make it possible to render Draft.js inside an iframe, which in turn makes it possible to have a UX where the page includes multiple visible selections, like in this demo. In that demo, I used built versions of React and Draft.js which include all the changes necessary to make it work across nested browsing contexts.

    Fixes #527

    Test Plan

    All of the unit tests are passing. For manual testing, I’ve focused on verifying the behavior of the editor when dealing with selections. That includes:

    • Select a portion of text and start typing to replace it
    • Select a portion of text and hit delete to remove it
    • Select a portion of text and paste in content to replace it
    • Select a portion of text and copy it, then paste it somewhere
    • Select a portion of text and cut it, then paste it somewhere

    I then:

    • Repeated the steps above with a collapsed selection (for the insertion step)
    • Repeated the steps above with a selection that spans multiple blocks

    Finally, I manually tested all of those behaviors with:

    • A regular editor implementation where the editor is inside the same browsing context as the rest of the React app
    • An implementation where the editor is rendered into an iframe within the parent browsing context where React is running, like with the codepen demo I linked to above

    In order to make it easy to try and test these behaviors, I created installable branches of fbjs and React that include the lib/ files to make it installable and usable via npm as well as the built files to be usable directly in the browser.

    Try it out via npm

    In your package.json, use:

        "draft-js": "Brandcast/draft-js#f9affa3",
        "fbjs": "Brandcast/fbjs-built#97b8e54",
        "react": "Brandcast/react#9a81d1a",
    

    Try it out in the browser

    Include:

        <script src="https://rawgit.com/Brandcast/react/nested-browsing-contexts-2-built/build/react.js"></script>
        <script src="https://rawgit.com/Brandcast/react/nested-browsing-contexts-2-built/build/react-dom.js"></script>
        <script src="https://cdn.jsdelivr.net/immutable.js/latest/immutable.min.js"></script>
        <script src="https://cdn.jsdelivr.net/es6.shim/0.35.1/es6-shim.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.js"></script>
        <script src="https://rawgit.com/Brandcast/draft-js/iframe-compatibility-built/dist/Draft.js"></script>
    

    Rendering into an iframe

    To know more about rendering into an iframe, see this explanation from @ryanseddon. Also, he turned his work into the React Frame Component, which makes it trivial to try out. And to understand use cases and the utility of enabling this functionality, the major benefits are:

    1. Enabling multiple visible selections (see the demo I mentioned above).
    2. Proper CSS encapsulation (e.g. render a preview of something with custom CSS without worrying about loading those styles into the app window).
    CLA Signed 
    opened by acusti 30
  • The convertFromHTML() method currently strips inline style attribute from HTML string.

    The convertFromHTML() method currently strips inline style attribute from HTML string.

    Do you want to request a feature or report a bug? Report a bug.

    What is the current behavior? The convertFromHTML() method strips inline style attribute from HTML strings.

    When importing this HTML string (via convertFromHTML()): "<p>This is some <span style="color: #f0ad4e">colorful</span> text.</p>"

    The line is converted to this: "<p>This is some colorful text.</p>"

    What is the expected behavior? Keep inline style attribute when using convertFromHTML()

    Which versions of Draft.js, and which browser / OS are affected by this issue? Did this work in previous versions of Draft.js? Draft JS v0.8.1 running in Chrome

    opened by ademars94 29
  • selection.extend is called on selection without ranges

    selection.extend is called on selection without ranges

    Summary

    In our application we have multiple draft-js instances. When users try to drag entities from one editor to the other, the selection state is temporarily lost and we end up with the following error:

    Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.

    We were able to recreate the issue and the following PR fixes the issue by verifying that the selection has ranges.

    Test Plan

    This particular file does not appear to have any active spec files, but I did confirm that the solution works for both when there is a selection and when there is not an active selection.

    CLA Signed 
    opened by sarmstrong 28
  • Add support for preventing native character insertion

    Add support for preventing native character insertion

    @hellendag this intends to address the issue we discussed in https://github.com/facebook/draft-js/issues/427 and https://github.com/facebook/draft-js/issues/448.

    The intended use is something like this:

    onChange(editorState) {
      const contentState = editorState.getCurrentContent();
      const blockMap = contentState.getBlockMap();
      const newBlockMap = blockMap.map((contentBlock) => {
        // perform some updates here
        return contentBlock;
      });
      const newContentState = contentState.set('blockMap', newBlockMap);
      const newEditorState = EditorState.push(editorState, newContentState, 'insert-fragment');
      this.setState({
        editorState: EditorState.preventNativeInsertion(newEditorState, true),
      });
    }
    

    Please review and let me know if you have any feedback.

    Thanks!

    CLA Signed 
    opened by paulyoung 28
  • InvalidStateError: 'extend' requires a Range to be added to the Selection

    InvalidStateError: 'extend' requires a Range to be added to the Selection

    Do you want to request a feature or report a bug? Most probably a bug.

    Current behavior: We are facing an issue while trying to focus on a selection. It is happening in some browsers and in some cases. But we are able to reproduce the issue on "safari" version 16.1.

    DraftJS version: 0.10.5

    While it failed to focus, componentDidUpdate is continuously called and ends up with "Maximum update depth exceeded."

    While we remove the focus it is working fine. Screenshot 2022-12-12 at 11 23 24 PM

    opened by jeyashree-n 1
  • wrong return value of getInlineStyleForCollapsedSelection and getInlineStyleForNonCollapsedSelection

    wrong return value of getInlineStyleForCollapsedSelection and getInlineStyleForNonCollapsedSelection

    Do you want to request a feature or report a bug?

    bug.

    What is the current behavior?

    选中区域行内样式

    If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem. You can use this jsfiddle to get started: https://jsfiddle.net/gmertk/e61z7nfa/.

    https://draftjs.org/

    1. first line ends with bold.
    2. second line starts with italic.
    3. move to the start of second line, press enter. press up to move the cursor to the newly created line.
    4. input words. you can see it inherited the first line's bold.

    What is the expected behavior?

    image

    When startOffset is 0, and startBlock.getLength() is 0, getInlineStyleForCollapsedSelection and getInlineStyleForNonCollapsedSelection should return empty OrderedSet() rather than lookUpwardForInlineStyle;

    Which versions of Draft.js, and which browser / OS are affected by this issue? Did this work in previous versions of Draft.js?

    opened by psybor 0
  • when input some IME punctuation, the editor crashs

    when input some IME punctuation, the editor crashs

    Do you want to request a feature or report a bug?

    bug

    What is the current behavior?

    draft-js输入法

    If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem. You can use this jsfiddle to get started: https://jsfiddle.net/gmertk/e61z7nfa/.

    1. input "。。"
    2. press enter to swich to line two.
    3. input "。。"
    4. press ctrl + z to perform an undo.
    5. crash.

    What is the expected behavior?

    not crash

    Which versions of Draft.js, and which browser / OS are affected by this issue? Did this work in previous versions of Draft.js?

    draft-js: 0.11.7. os: windows 10. broswer: latest chrome.

    opened by psybor 0
  • pre select inline style, then input in composition mode, the selected inlinestyle not work

    pre select inline style, then input in composition mode, the selected inlinestyle not work

    Do you want to request a feature or report a bug?

    IME mode bug

    What is the current behavior?

    just see the draftjs.org example draft-js输入法

    with some investigation,I console the editorState.toJS(), find out below: after I select a inlinestyle, I begin IME input and console.log the editorState.toJS() at the first press of keyboard, the onChange fires twice. here is the two editorState.toJS() you can see the pre selected inline style (inlineStyleOverride) is gone during the first keyboard press. image

    What is the expected behavior?

    support IME input

    Which versions of Draft.js, and which browser / OS are affected by this issue? Did this work in previous versions of Draft.js?

    draft-js: draftjs.org example OS: window 10

    opened by psybor 0
  • how to stop the style i add in replaceText?

    how to stop the style i add in replaceText?

    `(text: string, anchorOffset: number, focusOffset: number) => {
        const contentState = editorState.getCurrentContent()
        const selection = editorState.getSelection()
        const newSelection = selection.merge({
            anchorOffset: anchorOffset,
            focusOffset: focusOffset
        })
     
        let nextEditorState = EditorState.createEmpty()
        let nextContentState
       
        nextContentState = Modifier.replaceText(contentState, newSelection, text, OrderedSet.of('Blue'))
        nextEditorState = EditorState.push(editorState, nextContentState, 'insert-characters')
    
        setEditorState(nextEditorState);`
    

    i want to use replaceText to replace partial text with blue font(i define a style called 'Blue').I only want blue text from 'anchorOffset' to 'focusOffset', But when i continue to enter the text, the text is always blue, not black. I do not know how to stop 'Blue' style.

    opened by chenjiashrimp 0
  • URGENT :: How to update words arrays in handleStrategy of decorator?

    URGENT :: How to update words arrays in handleStrategy of decorator?

    My list of words keep getting updated with time. I need to highlight those words dynamically. I used EditorState.set for updating the whole decorator (inside componentDidUpdate). It's working but only after I am focusing on that bullet.

    opened by guptasg1997 0
Owner
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
Facebook
Collection of tools for building rich text editors.

psst we have great documentation at https://bangle.dev What is bangle.dev ? bangle.dev is a collection of components for building powerful editing exp

null 553 Dec 29, 2022
A JS library for building WYSIWYG editors for HTML content.

For information on the ContentTools 2.x roadmap please view the: Roadmap repo ContentTools A JS library for building WYSIWYG editors for HTML content.

getme 3.9k Jan 8, 2023
A toolkit for building WYSIWYG editors with Mobiledoc

Mobiledoc Kit Mobiledoc Kit is a framework-agnostic library for building WYSIWYG editors supporting rich content via cards. Libraries This repository

Bustle 1.5k Jan 3, 2023
An Open, Extensible Framework for building Web3D Engine, Editor

Meta3D (Meta3D is under development, not product ready) Meta3D is an Open, Extensible Framework for building Web3D Engine, Editor. read Meta3D介绍 for m

Wonder Technology 54 Dec 29, 2022
Verbum is a fully flexible text editor based on lexical framework.

Verbum Verbum - Flexible Text Editor for React Verbum is a fully flexible rich text editor based on lexical-playground and lexical framework. ⚠️ As th

Ozan Yurtsever 560 Dec 29, 2022
The world's #1 JavaScript library for rich text editing. Available for React, Vue and Angular

TinyMCE TinyMCE is the world's most advanced open source core rich text editor. Trusted by millions of developers, and used by some of the world's lar

Tiny 12.4k Jan 4, 2023
Simple rich text editor (contentEditable) for jQuery UI

Hallo - contentEditable for jQuery UI Hallo is a very simple in-place rich text editor for web pages. It uses jQuery UI and the HTML5 contentEditable

Henri Bergius 2.4k Dec 17, 2022
A modern, simple and elegant WYSIWYG rich text editor.

jQuery-Notebook A simple, clean and elegant WYSIWYG rich text editor for web aplications Note: Check out the fully functional demo and examples here.

Raphael Cruzeiro 1.7k Dec 12, 2022
Medium.com WYSIWYG editor clone. Uses contenteditable API to implement a rich text solution.

If you would be interested in helping to maintain one of the most successful WYSIWYG text editors on github, let us know! (See issue #1503) MediumEdit

yabwe 15.7k Jan 4, 2023
Tiny bootstrap-compatible WISWYG rich text editor

bootstrap-wysiwyg Important information for Github requests/issues Please do not submit issues/comments to this repo. Instead, submit it to https://gi

MindMup 5.6k Jan 3, 2023
HTML5 rich text editor. Try the demo integration at

Squire Squire is an HTML5 rich text editor, which provides powerful cross-browser normalisation in a flexible lightweight package (only 16.5KB of JS a

Neil Jenkins 4.4k Dec 28, 2022
A rich text editor for everyday writing

Trix A Rich Text Editor for Everyday Writing Compose beautifully formatted text in your web application. Trix is a WYSIWYG editor for writing messages

Basecamp 17.3k Jan 3, 2023
Open source rich text editor based on HTML5 and the progressive-enhancement approach. Uses a sophisticated security concept and aims to generate fully valid HTML5 markup by preventing unmaintainable tag soups and inline styles.

This project isn’t maintained anymore Please check out this fork. wysihtml5 0.3.0 wysihtml5 is an open source rich text editor based on HTML5 technolo

Christopher Blum 6.5k Jan 7, 2023
Popline is an HTML5 Rich-Text-Editor Toolbar

popline Popline is a non-intrusive WYSIWYG editor that shows up only after selecting a piece of text on the page, inspired by popclip. Usage Load jQue

kenshin 1k Nov 4, 2022
Open source rich text editor based on HTML5 and the progressive-enhancement approach. Uses a sophisticated security concept and aims to generate fully valid HTML5 markup by preventing unmaintainable tag soups and inline styles.

This project isn’t maintained anymore Please check out this fork. wysihtml5 0.3.0 wysihtml5 is an open source rich text editor based on HTML5 technolo

Christopher Blum 6.5k Dec 30, 2022
A powerful WYSIWYG rich text web editor by pure javascript

KothingEditor A powerful WYSIWYG rich text web editor by pure javascript Demo : kothing.github.io/editor The KothingEditor is a lightweight, flexible,

Kothing 34 Dec 25, 2022
Adds Syntax Highlighting & Hint for TiddlyWiki5 tiddlers (text/vnd.tiddlywiki) to the CodeMirror.

CodeMirror-Mode-TiddlyWiki5 Adds Syntax Highlighting for TiddlyWiki5 tiddlers (text/vnd.tiddlywiki) to the CodeMirror, along with some other useful ed

Ke Wang 18 Dec 30, 2022
Typewriter is a simple, FOSS, Web-based text editor that aims to provide a simple and intuitive environment for you to write in.

Typewriter Typewriter is a simple, FOSS, Web-based text editor that aims to provide a simple and intuitive environment for you to write in. Features S

Isla 2 May 24, 2022
Override the rich text editor in Strapi admin with ToastUI Editor.

strapi-plugin-wysiwyg-tui-editor ⚠️ This is a strapi v4 plugin which does not support any earlier version! A Strapi plugin to replace the default rich

Zhuo Chen 12 Dec 23, 2022