Demo of React-Quill, a React wrapper around the Quill rich text editor.
See also: https://github.com/zenoamaro/react-quill https://github.com/quilljs/quill
| <div class="app"> | |
| </div> | 
Demo of React-Quill, a React wrapper around the Quill rich text editor.
See also: https://github.com/zenoamaro/react-quill https://github.com/quilljs/quill
Demo of React-Quill, a React wrapper around the Quill rich text editor.
See also: https://github.com/zenoamaro/react-quill https://github.com/quilljs/quill
A Pen by Alex Krolick on CodePen.
| /** | |
| * Inline Em Tag from Quill Docs: | |
| */ | |
| let Inline = ReactQuill.Quill.import('blots/inline'); | |
| class EmphBlot extends Inline { | |
| static create(value) { | |
| let node = super.create(); | |
| node.setAttribute('style', 'font-size:150%; color: purple'); | |
| node.setAttribute('src', value.url); | |
| return node; | |
| } | |
| static value(node) { | |
| return { | |
| alt: node.getAttribute('alt'), | |
| url: node.getAttribute('src') | |
| }; | |
| } | |
| } | |
| EmphBlot.blotName = 'em'; | |
| EmphBlot.tagName = 'em'; | |
| EmphBlot.className = 'custom-em'; | |
| ReactQuill.Quill.register('formats/em', EmphBlot); | |
| /** | |
| * Example HR tag from: | |
| * https://stackoverflow.com/questions/37525867/ | |
| */ | |
| var Embed = ReactQuill.Quill.import('blots/block/embed'); | |
| class Hr extends Embed { | |
| static create(value) { | |
| let node = super.create(value); | |
| return node; | |
| } | |
| } | |
| Hr.blotName = 'hr'; | |
| Hr.tagName = 'hr'; | |
| ReactQuill.Quill.register({ | |
| 'formats/hr': Hr | |
| }); | |
| class Editor extends React.Component { | |
| constructor (props) { | |
| super(props) | |
| this.state = { editorHtml: '' } | |
| this.quillRef = null; | |
| this.reactQuillRef = null; | |
| this.handleChange = this.handleChange.bind(this) | |
| this.handleClickEmbed = this.handleClickEmbed.bind(this) | |
| this.handleClickFormat = this.handleClickFormat.bind(this) | |
| this.registerFormats = this.registerFormats.bind(this) | |
| } | |
| componentDidMount () { | |
| this.registerFormats() | |
| this.setState({ | |
| editorHtml: '' // trigger update | |
| }) | |
| } | |
| componentDidUpdate () { | |
| this.registerFormats() | |
| } | |
| registerFormats () { | |
| // Ensure React-Quill references is available: | |
| if (typeof this.reactQuillRef.getEditor !== 'function') return; | |
| // Skip if Quill reference is defined: | |
| if (this.quillRef != null) return; | |
| console.log('Registering formats...', this.reactQuillRef) | |
| const quillRef = this.reactQuillRef.getEditor() // could still be null | |
| if (quillRef != null) { | |
| this.quillRef = quillRef; | |
| console.log(Quill.imports) | |
| } | |
| } | |
| handleClickFormat () { | |
| var range = this.quillRef.getSelection(); | |
| if (range) { | |
| this.quillRef.format('em', true); | |
| } | |
| } | |
| handleClickEmbed () { | |
| var range = this.quillRef.getSelection(); | |
| if (range) { | |
| this.quillRef.insertEmbed(range.index,"hr","null") | |
| } | |
| } | |
| handleChange (html) { | |
| this.setState({ editorHtml: html }); | |
| } | |
| render () { | |
| return ( | |
| <div> | |
| <ReactQuill | |
| ref={(el) => { this.reactQuillRef = el }} | |
| theme={'snow'} | |
| onChange={this.handleChange} | |
| modules={{'toolbar': []}} | |
| formats={['formats/em','formats/hr', 'em', 'hr']} | |
| placeholder={this.props.placeholder} /> | |
| <button onClick={this.handleClickFormat}>Apply Emphasis Format</button> | |
| <button onClick={this.handleClickEmbed}>Insert Hr Format</button> | |
| </div> | |
| ) | |
| } | |
| } | |
| Editor.propTypes = { | |
| placeholder: React.PropTypes.string, | |
| } | |
| ReactDOM.render( | |
| <Editor placeholder={'No standard formats are enabled...'}/>, | |
| document.querySelector('.app') | |
| ) | 
| <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.min.js"></script> | |
| <script src="https://unpkg.com/react-quill@latest/dist/react-quill.min.js"></script> | |
| <script src="https://unpkg.com/prop-types/prop-types.js"></script> | 
| body { | |
| background: #f3f1f2; | |
| } | |
| .app { | |
| margin: 1rem auto; | |
| max-width: 40rem; | |
| } | |
| .app .ql-container { | |
| min-height: 10em; | |
| border-bottom-left-radius: 0.5em; | |
| border-bottom-right-radius: 0.5em; | |
| background: #fefcfc; | |
| } | |
| .app .ql-toolbar { | |
| background: #eaecec; | |
| border-top-left-radius: 0.5em; | |
| border-top-right-radius: 0.5em; | |
| } | |
| .custom-em { | |
| text-decoration: underline turquoise; | |
| } | |
| .custom-em::before { | |
| content: '๐' | |
| } | |
| .custom-em::after { | |
| content: '๐' | |
| } | 
| <link href="https://unpkg.com/[email protected]/dist/quill.snow.css" rel="stylesheet" /> |