UNPKG

@draft-js-plugins/buttons

Version:
472 lines (440 loc) 18 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var clsx = require('clsx'); var draftJs = require('draft-js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var clsx__default = /*#__PURE__*/_interopDefaultLegacy(clsx); function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function createBlockAlignmentButton(_ref) { var alignment = _ref.alignment, children = _ref.children; return function BlockAlignmentButton(props) { var activate = function activate(event) { event.preventDefault(); props.setAlignment({ alignment: alignment }); }; var preventBubblingUp = function preventBubblingUp(event) { event.preventDefault(); }; var isActive = function isActive() { return props.alignment === alignment; }; var theme = props.theme, _props$buttonProps = props.buttonProps, buttonProps = _props$buttonProps === void 0 ? {} : _props$buttonProps; var className = isActive() ? clsx__default["default"](theme.button, theme.active) : theme.button; return /*#__PURE__*/React__default["default"].createElement("div", { className: theme.buttonWrapper, onMouseDown: preventBubblingUp }, /*#__PURE__*/React__default["default"].createElement("button", _extends({ children: children }, buttonProps, { className: className, onClick: activate, type: "button", role: "button", "aria-label": "block align text " + alignment }))); }; } var AlignBlockCenterButton = createBlockAlignmentButton({ alignment: 'center', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M3,21 L21,21 L21,19 L3,19 L3,21 Z M3,3 L3,5 L21,5 L21,3 L3,3 Z M5,7 L5,17 L19,17 L19,7 L5,7 Z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var AlignBlockDefaultButton = createBlockAlignmentButton({ alignment: 'default', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M3,21 L21,21 L21,19 L3,19 L3,21 Z M3,3 L3,5 L21,5 L21,3 L3,3 Z M3,7 L3,17 L17,17 L17,7 L3,7 Z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var AlignBlockLeftButton = createBlockAlignmentButton({ alignment: 'left', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M21,15 L15,15 L15,17 L21,17 L21,15 Z M21,7 L15,7 L15,9 L21,9 L21,7 Z M15,13 L21,13 L21,11 L15,11 L15,13 Z M3,21 L21,21 L21,19 L3,19 L3,21 Z M3,3 L3,5 L21,5 L21,3 L3,3 Z M3,7 L3,17 L13,17 L13,7 L3,7 Z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var AlignBlockRightButton = createBlockAlignmentButton({ alignment: 'right', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M9,15 L3,15 L3,17 L9,17 L9,15 Z M9,7 L3,7 L3,9 L9,9 L9,7 Z M3,13 L9,13 L9,11 L3,11 L3,13 Z M3,21 L21,21 L21,19 L3,19 L3,21 Z M3,3 L3,5 L21,5 L21,3 L3,3 Z M11,7 L11,17 L21,17 L21,7 L11,7 Z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); function createTextAlignmentButton(_ref) { var alignment = _ref.alignment, children = _ref.children; return function InlineStyleButton(props) { var toggleStyle = function toggleStyle(event) { if (!props.getEditorState) return; event.preventDefault(); var alignmentStyles = ['left', 'center', 'right']; var removeStyles = alignmentStyles.filter(function (style) { return style !== alignment; }); var currentEditorState = props.getEditorState(); var currentContent = props.getEditorState().getCurrentContent(); var selection = props.getEditorState().getSelection(); var focusBlock = currentContent.getBlockForKey(selection.getFocusKey()); var anchorBlock = currentContent.getBlockForKey(selection.getAnchorKey()); var selectionIsBackward = selection.getIsBackward(); var changes = { anchorOffset: 0, focusOffset: focusBlock.getLength() }; if (selectionIsBackward) { changes = { focusOffset: 0, anchorOffset: anchorBlock.getLength() }; } var selectWholeBlocks = selection.merge(changes); var modifiedContent = draftJs.Modifier.applyInlineStyle(currentContent, selectWholeBlocks, alignment); var finalContent = removeStyles.reduce(function (content, style) { return draftJs.Modifier.removeInlineStyle(content, selectWholeBlocks, style); }, modifiedContent); var nextEditorState = draftJs.EditorState.push(currentEditorState, finalContent, 'change-inline-style'); props.setEditorState(nextEditorState); }; var preventBubblingUp = function preventBubblingUp(event) { event.preventDefault(); }; var styleIsActive = function styleIsActive() { return props.getEditorState && props.getEditorState().getCurrentInlineStyle().has(alignment); }; var theme = props.theme, _props$buttonProps = props.buttonProps, buttonProps = _props$buttonProps === void 0 ? {} : _props$buttonProps; var className = styleIsActive() ? clsx__default["default"](theme.button, theme.active) : theme.button; return /*#__PURE__*/React__default["default"].createElement("div", { className: theme.buttonWrapper, onMouseDown: preventBubblingUp }, /*#__PURE__*/React__default["default"].createElement("button", _extends({ children: children }, buttonProps, { className: className, onClick: toggleStyle, type: "button", role: "button", "aria-label": "text align " + alignment }))); }; } var AlignTextCenterButton = createTextAlignmentButton({ alignment: 'center', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var AlignTextLeftButton = createTextAlignmentButton({ alignment: 'left', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var AlignTextRightButton = createTextAlignmentButton({ alignment: 'right', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); function createBlockStyleButton(_ref) { var blockType = _ref.blockType, children = _ref.children; return function BlockStyleButton(props) { var toggleStyle = function toggleStyle(event) { event.preventDefault(); props.setEditorState(draftJs.RichUtils.toggleBlockType(props.getEditorState(), blockType)); }; var preventBubblingUp = function preventBubblingUp(event) { event.preventDefault(); }; var blockTypeIsActive = function blockTypeIsActive() { // if the button is rendered before the editor if (!props.getEditorState) { return false; } var editorState = props.getEditorState(); var type = editorState.getCurrentContent().getBlockForKey(editorState.getSelection().getStartKey()).getType(); return type === blockType; }; var theme = props.theme, _props$buttonProps = props.buttonProps, buttonProps = _props$buttonProps === void 0 ? {} : _props$buttonProps; var className = blockTypeIsActive() ? clsx__default["default"](theme.button, theme.active) : theme.button; return /*#__PURE__*/React__default["default"].createElement("div", { className: theme.buttonWrapper, onMouseDown: preventBubblingUp }, /*#__PURE__*/React__default["default"].createElement("button", _extends({ children: children }, buttonProps, { className: className, onClick: toggleStyle, type: "button", role: "button", "aria-label": "create " + blockType }))); }; } var BlockquoteButton = createBlockStyleButton({ blockType: 'blockquote', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); function createInlineStyleButton(_ref) { var style = _ref.style, children = _ref.children; return function InlineStyleButton(props) { var toggleStyle = function toggleStyle(event) { event.preventDefault(); props.setEditorState(draftJs.RichUtils.toggleInlineStyle(props.getEditorState(), style)); }; var preventBubblingUp = function preventBubblingUp(event) { event.preventDefault(); }; // we check if this.props.getEditorstate is undefined first in case the button is rendered before the editor var styleIsActive = function styleIsActive() { return props.getEditorState && props.getEditorState().getCurrentInlineStyle().has(style); }; var theme = props.theme, _props$buttonProps = props.buttonProps, buttonProps = _props$buttonProps === void 0 ? {} : _props$buttonProps; var className = styleIsActive() ? clsx__default["default"](theme.button, theme.active) : theme.button; return /*#__PURE__*/React__default["default"].createElement("div", { className: theme.buttonWrapper, onMouseDown: preventBubblingUp }, /*#__PURE__*/React__default["default"].createElement("button", _extends({ children: children }, buttonProps, { className: className, onClick: toggleStyle, type: "button", role: "button", "aria-label": style + " text" }))); }; } var BoldButton = createInlineStyleButton({ style: 'BOLD', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var CodeBlockButton = createBlockStyleButton({ blockType: 'code-block', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0V0z", fill: "none" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z" })) }); var CodeButton = createInlineStyleButton({ style: 'CODE', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0V0z", fill: "none" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z" })) }); var HeadlineOneButton = createBlockStyleButton({ blockType: 'header-one', children: 'H1' }); var HeadlineThreeButton = createBlockStyleButton({ blockType: 'header-three', children: 'H3' }); var HeadlineTwoButton = createBlockStyleButton({ blockType: 'header-two', children: 'H2' }); var ItalicButton = createInlineStyleButton({ style: 'ITALIC', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z" })) }); var OrderedListButton = createBlockStyleButton({ blockType: 'ordered-list-item', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" })) }); var SubButton = createInlineStyleButton({ style: 'SUBSCRIPT', children: /*#__PURE__*/React__default["default"].createElement("div", null, "x", /*#__PURE__*/React__default["default"].createElement("sub", null, "2")) }); var SupButton = createInlineStyleButton({ style: 'SUPERSCRIPT', children: /*#__PURE__*/React__default["default"].createElement("div", null, "x", /*#__PURE__*/React__default["default"].createElement("sup", null, "2")) }); var UnderlineButton = createInlineStyleButton({ style: 'UNDERLINE', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z" })) }); var UnorderedListButton = createBlockStyleButton({ blockType: 'unordered-list-item', children: /*#__PURE__*/React__default["default"].createElement("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z" }), /*#__PURE__*/React__default["default"].createElement("path", { d: "M0 0h24v24H0V0z", fill: "none" })) }); exports.AlignBlockCenterButton = AlignBlockCenterButton; exports.AlignBlockDefaultButton = AlignBlockDefaultButton; exports.AlignBlockLeftButton = AlignBlockLeftButton; exports.AlignBlockRightButton = AlignBlockRightButton; exports.AlignTextCenterButton = AlignTextCenterButton; exports.AlignTextLeftButton = AlignTextLeftButton; exports.AlignTextRightButton = AlignTextRightButton; exports.BlockquoteButton = BlockquoteButton; exports.BoldButton = BoldButton; exports.CodeBlockButton = CodeBlockButton; exports.CodeButton = CodeButton; exports.HeadlineOneButton = HeadlineOneButton; exports.HeadlineThreeButton = HeadlineThreeButton; exports.HeadlineTwoButton = HeadlineTwoButton; exports.ItalicButton = ItalicButton; exports.OrderedListButton = OrderedListButton; exports.SubButton = SubButton; exports.SupButton = SupButton; exports.UnderlineButton = UnderlineButton; exports.UnorderedListButton = UnorderedListButton; exports.createBlockAlignmentButton = createBlockAlignmentButton; exports.createBlockStyleButton = createBlockStyleButton; exports.createInlineStyleButton = createInlineStyleButton; exports.createTextAlignmentButton = createTextAlignmentButton;