A React framework for building text editors.

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
Demo app for refine.dev integration, a react-based framework for rapid building of internal tools.

Demo app for refine.dev integration, a react-based framework for rapid building of internal tools.

Permify 7 Apr 28, 2022
Mobile App Framework powered by React

TouchstoneJS Mobile App Framework powered by React. See the demo at touchstonejs.io. Follow @touchstonejs on Twitter for updates. See the touchstone-s

TouchstoneJS 3.3k Jan 5, 2023
Maple.js is a React webcomponents based framework mixing ES6 with Custom Elements, HTML Imports and Shadow DOM. It has in-built support for SASS and JSX, including a Gulp task for vulcanizing your project.

Heroku: http://maple-app.herokuapp.com/ npm: npm install maple.js Bower: bower install maple.js Maple is a seamless module that allows you to organise

Adam Timberlake 430 Dec 23, 2022
👻 Zero-configuration framework-agnostic static prerendering for SPAs

react-snap Pre-renders a web app into static HTML. Uses Headless Chrome to crawl all available links starting from the root. Heavily inspired by prep

null 4.8k Jan 7, 2023
React, React Native and Vue UI components for building data-driven apps with Elasticsearch

Reactive Search UI components library for Elasticsearch: Available for React, Vue and React Native Read how to build an e-commerce search UI a.) with

appbase.io 4.7k Jan 4, 2023
React library for ux4iot for easily building IoT web applications

React library for ux4iot for easily building IoT web applications

Device Insight 15 Oct 31, 2022
⚡️ Lightning-fast search for React and React Native applications, by Algolia.

React InstantSearch is a library for building blazing fast search-as-you-type search UIs with Algolia. React InstantSearch is a React library that let

Algolia 2k Dec 27, 2022
React ESI: Blazing-fast Server-Side Rendering for React and Next.js

React ESI: Blazing-fast Server-Side Rendering for React and Next.js React ESI is a super powerful cache library for vanilla React and Next.js applicat

Kévin Dunglas 633 Jan 5, 2023
react-pdf-highlighter is a React library that provides annotation experience for PDF documents on web.

☕️ Buy me a coffee react-pdf-highlighter react-pdf-highlighter is a React library that provides annotation experience for PDF documents on web. It is

Vladyslav 9 Dec 2, 2022
React-cursor-chat - A react component for cursor chat

@yomo/react-cursor-chat ?? Introduction A react component for cursor chat Press

YoMo 84 Nov 17, 2022
A minimum and lightweight external store for React and React Native application

Reactive store - a minimum and lightweight external store for React and React Native application Table of contents Features Installation Usage 3.1 Cre

Hòa Võ 7 Nov 21, 2022
Automatically AJAXify plain HTML with the power of React. It's magic!

React-Magic and HTMLtoJSX React-Magic is an experimental library that uses the power of Facebook's React library to inject AJAX-loading goodness into

React Community 921 Dec 16, 2022
A set of React components implementing Google's Material Design specification with the power of CSS Modules

React Toolbox is a set of React components that implement Google's Material Design specification. It's powered by CSS Modules and harmoniously integra

React Toolbox 8.7k Dec 30, 2022
CSS media queries in react - for responsive design, and more.

react-responsive Information Package react-responsive Description Media queries in react for responsive design Browser Version >= IE6* Demo The best s

contra 6.5k Dec 30, 2022
Immutable state for React.js

react-cursor Immutable state for React.js react-cursor hello-world in a fiddle What is react-cursor Cursors are a tool for working with recursive or d

Dustin Getz 1k Dec 12, 2022
Centrally manage state for React applications with CSP

State Trooper Install npm npm install state-trooper Yarn yarn add state-trooper Example Usage Call StateTrooper.patrolRunLoop in your route handler/ma

Swipely 15 May 14, 2022
A performant, scalable and pluggable approach to instrumenting your React application.

react-i13n react-i13n provides a performant, scalable and pluggable approach to instrumenting your React application. Typically, you have to manually

Yahoo 369 Dec 25, 2022
svg react icons of popular icon packs

React Icons Include popular icons in your React projects easily with react-icons, which utilizes ES6 imports that allows you to include only the icons

null 9k Jan 5, 2023
Plain functions for a more functional Deku approach to creating stateless React components, with functional goodies such as compose, memoize, etc... for free.

"Keo" is the Vietnamese translation for glue. Plain functions for a more functional Deku approach to creating stateless React components, with functio

Adam Timberlake 225 Sep 24, 2022