@gravity-ui/markdown-editor 15.13.2 → 15.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -77,7 +77,8 @@ const removeNote = (state, dispatch, view) => {
77
77
  if (dispatch) {
78
78
  const noteTitleNode = $cursor.parent;
79
79
  const noteNode = $cursor.node(-1);
80
- const content = noteNode.content.replaceChild(0, (0, base_1.pType)(schema).create(null, noteTitleNode.content));
80
+ const noteContentNode = noteNode.lastChild;
81
+ const content = prosemirror_model_1.Fragment.from((0, base_1.pType)(schema).create(null, noteTitleNode.content)).append(noteContentNode.content);
81
82
  const from = $cursor.before(-1);
82
83
  const to = from + noteNode.nodeSize;
83
84
  const tr = state.tr.replaceWith(from, to, content);
@@ -100,16 +101,18 @@ const backToNoteTitle = (state, dispatch, view) => {
100
101
  if (!$cursor)
101
102
  return false;
102
103
  if (!(0, schema_1.isSameNodeType)($cursor.parent, (0, base_1.pType)(schema)) ||
103
- !(0, schema_1.isSameNodeType)($cursor.node(-1), (0, utils_1.noteType)(schema))) {
104
+ !(0, schema_1.isSameNodeType)($cursor.node(-1), (0, utils_1.noteContentType)(schema)) ||
105
+ !(0, schema_1.isSameNodeType)($cursor.node(-2), (0, utils_1.noteType)(schema))) {
104
106
  return false;
105
107
  }
106
- const noteNode = $cursor.node(-1);
107
- if ($cursor.parent !== noteNode.maybeChild(1))
108
+ const noteNode = $cursor.node(-2);
109
+ const noteContentNode = $cursor.node(-1);
110
+ if ($cursor.parent !== noteContentNode.firstChild)
108
111
  return false;
109
112
  if (view?.endOfTextblock('backward', state)) {
110
113
  if (dispatch) {
111
114
  const noteTitleNode = noteNode.firstChild;
112
- dispatch(state.tr.setSelection(prosemirror_state_1.TextSelection.create(state.doc, $cursor.before(-1) + noteTitleNode.nodeSize)));
115
+ dispatch(state.tr.setSelection(prosemirror_state_1.TextSelection.create(state.doc, $cursor.before(-2) + noteTitleNode.nodeSize)));
113
116
  }
114
117
  return true;
115
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmNote/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node} from 'prosemirror-model';\nimport type {Command} from 'prosemirror-state';\nimport {TextSelection} from 'prosemirror-state';\n\nimport {findFirstTextblockChild} from '../../../utils/nodes';\nimport {isSameNodeType} from '../../../utils/schema';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base';\n\nimport {noteContentType, noteTitleType, noteType} from './utils';\n\nexport const exitFromNoteTitle: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n\n const noteNode = $cursor.node(-1);\n const noteContentFirstTextblockChild = findFirstTextblockChild(getNoteContent(noteNode));\n if (!noteContentFirstTextblockChild) return false;\n\n const noteContentPos = $cursor.start(-1) + noteNode.firstChild!.nodeSize;\n const targetPos = noteContentPos + noteContentFirstTextblockChild.offset;\n dispatch?.(state.tr.setSelection(TextSelection.create(state.doc, targetPos)));\n return true;\n};\n\nexport const liftEmptyBlockFromNote: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n\n const {$cursor} = selection;\n // cursor should be inside an empty textblock\n if (!$cursor || $cursor.parent.content.size) return false;\n\n if (\n $cursor.depth > 2 && // depth must be at least 3\n isSameNodeType($cursor.node(-1), noteContentType(schema)) &&\n isSameNodeType($cursor.node(-2), noteType(schema)) &&\n $cursor.node(-1).childCount > 1\n ) {\n // current texblock is last child\n if ($cursor.after() === $cursor.end(-1)) {\n if (dispatch) {\n dispatch(state.tr.lift($cursor.blockRange()!, $cursor.depth - 3).scrollIntoView());\n }\n return true;\n }\n }\n return false;\n};\n\nfunction getNoteContent(noteNode: Node): Fragment {\n const noteChildren: Node[] = [];\n noteNode.forEach((node) => noteChildren.push(node));\n // first child node is note title\n return Fragment.from(noteChildren.slice(1));\n}\n\n/**\n * Deletes the note if the cursor is at the beginning of the title.\n * Note will be replaced with his title converted to paragraph and his content.\n */\nexport const removeNote: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = $cursor.parent;\n const noteNode = $cursor.node(-1);\n const content = noteNode.content.replaceChild(\n 0,\n pType(schema).create(null, noteTitleNode.content),\n );\n const from = $cursor.before(-1);\n const to = from + noteNode.nodeSize;\n const tr = state.tr.replaceWith(from, to, content);\n dispatch(tr.setSelection(TextSelection.create(tr.doc, from + 1)));\n }\n return true;\n }\n return false;\n};\n\n/**\n * If the cursor is at the beginning of the first paragraph in note's content,\n * moves the cursor to the end of the note's title.\n */\nexport const backToNoteTitle: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, pType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n const noteNode = $cursor.node(-1);\n if ($cursor.parent !== noteNode.maybeChild(1)) return false;\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = noteNode.firstChild!;\n dispatch(\n state.tr.setSelection(\n TextSelection.create(state.doc, $cursor.before(-1) + noteTitleNode.nodeSize),\n ),\n );\n }\n return true;\n }\n return false;\n};\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmNote/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node} from 'prosemirror-model';\nimport type {Command} from 'prosemirror-state';\nimport {TextSelection} from 'prosemirror-state';\n\nimport {findFirstTextblockChild} from '../../../utils/nodes';\nimport {isSameNodeType} from '../../../utils/schema';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base';\n\nimport {noteContentType, noteTitleType, noteType} from './utils';\n\nexport const exitFromNoteTitle: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n\n const noteNode = $cursor.node(-1);\n const noteContentFirstTextblockChild = findFirstTextblockChild(getNoteContent(noteNode));\n if (!noteContentFirstTextblockChild) return false;\n\n const noteContentPos = $cursor.start(-1) + noteNode.firstChild!.nodeSize;\n const targetPos = noteContentPos + noteContentFirstTextblockChild.offset;\n dispatch?.(state.tr.setSelection(TextSelection.create(state.doc, targetPos)));\n return true;\n};\n\nexport const liftEmptyBlockFromNote: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n\n const {$cursor} = selection;\n // cursor should be inside an empty textblock\n if (!$cursor || $cursor.parent.content.size) return false;\n\n if (\n $cursor.depth > 2 && // depth must be at least 3\n isSameNodeType($cursor.node(-1), noteContentType(schema)) &&\n isSameNodeType($cursor.node(-2), noteType(schema)) &&\n $cursor.node(-1).childCount > 1\n ) {\n // current texblock is last child\n if ($cursor.after() === $cursor.end(-1)) {\n if (dispatch) {\n dispatch(state.tr.lift($cursor.blockRange()!, $cursor.depth - 3).scrollIntoView());\n }\n return true;\n }\n }\n return false;\n};\n\nfunction getNoteContent(noteNode: Node): Fragment {\n const noteChildren: Node[] = [];\n noteNode.forEach((node) => noteChildren.push(node));\n // first child node is note title\n return Fragment.from(noteChildren.slice(1));\n}\n\n/**\n * Deletes the note if the cursor is at the beginning of the title.\n * Note will be replaced with his title converted to paragraph and his content.\n */\nexport const removeNote: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = $cursor.parent;\n const noteNode = $cursor.node(-1);\n\n const noteContentNode = noteNode.lastChild!;\n const content = Fragment.from(pType(schema).create(null, noteTitleNode.content)).append(\n noteContentNode.content,\n );\n\n const from = $cursor.before(-1);\n const to = from + noteNode.nodeSize;\n const tr = state.tr.replaceWith(from, to, content);\n dispatch(tr.setSelection(TextSelection.create(tr.doc, from + 1)));\n }\n return true;\n }\n return false;\n};\n\n/**\n * If the cursor is at the beginning of the first paragraph in note's content,\n * moves the cursor to the end of the note's title.\n */\nexport const backToNoteTitle: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, pType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteContentType(schema)) ||\n !isSameNodeType($cursor.node(-2), noteType(schema))\n ) {\n return false;\n }\n\n const noteNode = $cursor.node(-2);\n const noteContentNode = $cursor.node(-1);\n if ($cursor.parent !== noteContentNode.firstChild) return false;\n\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = noteNode.firstChild!;\n dispatch(\n state.tr.setSelection(\n TextSelection.create(state.doc, $cursor.before(-2) + noteTitleNode.nodeSize),\n ),\n );\n }\n return true;\n }\n return false;\n};\n"]}
@@ -6,6 +6,7 @@ export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'h
6
6
  active: boolean;
7
7
  enabled: boolean;
8
8
  onClick: () => void;
9
+ id?: string;
9
10
  className?: string;
10
11
  } & (Pick<ToolbarItemData<unknown>, 'icon'> | {
11
12
  children: ReactNode;
@@ -12,7 +12,7 @@ const const_1 = require("./const.js");
12
12
  require("./ToolbarButton.css");
13
13
  const b = (0, classname_1.cn)('toolbar-button');
14
14
  const DEFAULT_ICON_SIZE = 16;
15
- exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, ...props }, ref) {
15
+ exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, id, ...props }, ref) {
16
16
  const disabled = !active && !enabled;
17
17
  const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
18
18
  const hintText = (0, lodash_1.isFunction)(hint) ? hint() : hint;
@@ -26,7 +26,7 @@ exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({
26
26
  (0, uikit_1.setRef)(ref, elem);
27
27
  (0, uikit_1.setRef)(refForPopover, elem);
28
28
  (0, uikit_1.setRef)(refForTooltip, elem);
29
- }, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
29
+ }, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
30
30
  });
31
31
  function ToolbarButton(props) {
32
32
  const { id, editor, focus, isActive, isEnable, exec, onClick } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode});\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, ...props},\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={active ? 'normal' : 'flat'}\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
1
+ {"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n id?: string;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode});\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {\n title,\n hint,\n hotkey,\n hintWhenDisabled,\n active,\n enabled,\n onClick,\n className,\n qa,\n id,\n ...props\n },\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={active ? 'normal' : 'flat'}\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n data-toolbar-item={id}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.13.2' !== 'undefined' ? '15.13.2' : 'unknown';
5
+ exports.VERSION = typeof '15.14.0' !== 'undefined' ? '15.14.0' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.13.2' !== 'undefined' ? '15.13.2' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.14.0' !== 'undefined' ? '15.14.0' : 'unknown';\n"]}
@@ -72,7 +72,8 @@ export const removeNote = (state, dispatch, view) => {
72
72
  if (dispatch) {
73
73
  const noteTitleNode = $cursor.parent;
74
74
  const noteNode = $cursor.node(-1);
75
- const content = noteNode.content.replaceChild(0, pType(schema).create(null, noteTitleNode.content));
75
+ const noteContentNode = noteNode.lastChild;
76
+ const content = Fragment.from(pType(schema).create(null, noteTitleNode.content)).append(noteContentNode.content);
76
77
  const from = $cursor.before(-1);
77
78
  const to = from + noteNode.nodeSize;
78
79
  const tr = state.tr.replaceWith(from, to, content);
@@ -94,16 +95,18 @@ export const backToNoteTitle = (state, dispatch, view) => {
94
95
  if (!$cursor)
95
96
  return false;
96
97
  if (!isSameNodeType($cursor.parent, pType(schema)) ||
97
- !isSameNodeType($cursor.node(-1), noteType(schema))) {
98
+ !isSameNodeType($cursor.node(-1), noteContentType(schema)) ||
99
+ !isSameNodeType($cursor.node(-2), noteType(schema))) {
98
100
  return false;
99
101
  }
100
- const noteNode = $cursor.node(-1);
101
- if ($cursor.parent !== noteNode.maybeChild(1))
102
+ const noteNode = $cursor.node(-2);
103
+ const noteContentNode = $cursor.node(-1);
104
+ if ($cursor.parent !== noteContentNode.firstChild)
102
105
  return false;
103
106
  if (view?.endOfTextblock('backward', state)) {
104
107
  if (dispatch) {
105
108
  const noteTitleNode = noteNode.firstChild;
106
- dispatch(state.tr.setSelection(TextSelection.create(state.doc, $cursor.before(-1) + noteTitleNode.nodeSize)));
109
+ dispatch(state.tr.setSelection(TextSelection.create(state.doc, $cursor.before(-2) + noteTitleNode.nodeSize)));
107
110
  }
108
111
  return true;
109
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmNote/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node} from 'prosemirror-model';\nimport type {Command} from 'prosemirror-state';\nimport {TextSelection} from 'prosemirror-state';\n\nimport {findFirstTextblockChild} from '../../../utils/nodes';\nimport {isSameNodeType} from '../../../utils/schema';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base';\n\nimport {noteContentType, noteTitleType, noteType} from './utils';\n\nexport const exitFromNoteTitle: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n\n const noteNode = $cursor.node(-1);\n const noteContentFirstTextblockChild = findFirstTextblockChild(getNoteContent(noteNode));\n if (!noteContentFirstTextblockChild) return false;\n\n const noteContentPos = $cursor.start(-1) + noteNode.firstChild!.nodeSize;\n const targetPos = noteContentPos + noteContentFirstTextblockChild.offset;\n dispatch?.(state.tr.setSelection(TextSelection.create(state.doc, targetPos)));\n return true;\n};\n\nexport const liftEmptyBlockFromNote: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n\n const {$cursor} = selection;\n // cursor should be inside an empty textblock\n if (!$cursor || $cursor.parent.content.size) return false;\n\n if (\n $cursor.depth > 2 && // depth must be at least 3\n isSameNodeType($cursor.node(-1), noteContentType(schema)) &&\n isSameNodeType($cursor.node(-2), noteType(schema)) &&\n $cursor.node(-1).childCount > 1\n ) {\n // current texblock is last child\n if ($cursor.after() === $cursor.end(-1)) {\n if (dispatch) {\n dispatch(state.tr.lift($cursor.blockRange()!, $cursor.depth - 3).scrollIntoView());\n }\n return true;\n }\n }\n return false;\n};\n\nfunction getNoteContent(noteNode: Node): Fragment {\n const noteChildren: Node[] = [];\n noteNode.forEach((node) => noteChildren.push(node));\n // first child node is note title\n return Fragment.from(noteChildren.slice(1));\n}\n\n/**\n * Deletes the note if the cursor is at the beginning of the title.\n * Note will be replaced with his title converted to paragraph and his content.\n */\nexport const removeNote: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = $cursor.parent;\n const noteNode = $cursor.node(-1);\n const content = noteNode.content.replaceChild(\n 0,\n pType(schema).create(null, noteTitleNode.content),\n );\n const from = $cursor.before(-1);\n const to = from + noteNode.nodeSize;\n const tr = state.tr.replaceWith(from, to, content);\n dispatch(tr.setSelection(TextSelection.create(tr.doc, from + 1)));\n }\n return true;\n }\n return false;\n};\n\n/**\n * If the cursor is at the beginning of the first paragraph in note's content,\n * moves the cursor to the end of the note's title.\n */\nexport const backToNoteTitle: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, pType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n const noteNode = $cursor.node(-1);\n if ($cursor.parent !== noteNode.maybeChild(1)) return false;\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = noteNode.firstChild!;\n dispatch(\n state.tr.setSelection(\n TextSelection.create(state.doc, $cursor.before(-1) + noteTitleNode.nodeSize),\n ),\n );\n }\n return true;\n }\n return false;\n};\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmNote/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node} from 'prosemirror-model';\nimport type {Command} from 'prosemirror-state';\nimport {TextSelection} from 'prosemirror-state';\n\nimport {findFirstTextblockChild} from '../../../utils/nodes';\nimport {isSameNodeType} from '../../../utils/schema';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base';\n\nimport {noteContentType, noteTitleType, noteType} from './utils';\n\nexport const exitFromNoteTitle: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n\n const noteNode = $cursor.node(-1);\n const noteContentFirstTextblockChild = findFirstTextblockChild(getNoteContent(noteNode));\n if (!noteContentFirstTextblockChild) return false;\n\n const noteContentPos = $cursor.start(-1) + noteNode.firstChild!.nodeSize;\n const targetPos = noteContentPos + noteContentFirstTextblockChild.offset;\n dispatch?.(state.tr.setSelection(TextSelection.create(state.doc, targetPos)));\n return true;\n};\n\nexport const liftEmptyBlockFromNote: Command = (state, dispatch) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n\n const {$cursor} = selection;\n // cursor should be inside an empty textblock\n if (!$cursor || $cursor.parent.content.size) return false;\n\n if (\n $cursor.depth > 2 && // depth must be at least 3\n isSameNodeType($cursor.node(-1), noteContentType(schema)) &&\n isSameNodeType($cursor.node(-2), noteType(schema)) &&\n $cursor.node(-1).childCount > 1\n ) {\n // current texblock is last child\n if ($cursor.after() === $cursor.end(-1)) {\n if (dispatch) {\n dispatch(state.tr.lift($cursor.blockRange()!, $cursor.depth - 3).scrollIntoView());\n }\n return true;\n }\n }\n return false;\n};\n\nfunction getNoteContent(noteNode: Node): Fragment {\n const noteChildren: Node[] = [];\n noteNode.forEach((node) => noteChildren.push(node));\n // first child node is note title\n return Fragment.from(noteChildren.slice(1));\n}\n\n/**\n * Deletes the note if the cursor is at the beginning of the title.\n * Note will be replaced with his title converted to paragraph and his content.\n */\nexport const removeNote: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, noteTitleType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteType(schema))\n ) {\n return false;\n }\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = $cursor.parent;\n const noteNode = $cursor.node(-1);\n\n const noteContentNode = noteNode.lastChild!;\n const content = Fragment.from(pType(schema).create(null, noteTitleNode.content)).append(\n noteContentNode.content,\n );\n\n const from = $cursor.before(-1);\n const to = from + noteNode.nodeSize;\n const tr = state.tr.replaceWith(from, to, content);\n dispatch(tr.setSelection(TextSelection.create(tr.doc, from + 1)));\n }\n return true;\n }\n return false;\n};\n\n/**\n * If the cursor is at the beginning of the first paragraph in note's content,\n * moves the cursor to the end of the note's title.\n */\nexport const backToNoteTitle: Command = (state, dispatch, view) => {\n const {selection, schema} = state;\n if (!isTextSelection(selection)) return false;\n const {$cursor} = selection;\n if (!$cursor) return false;\n if (\n !isSameNodeType($cursor.parent, pType(schema)) ||\n !isSameNodeType($cursor.node(-1), noteContentType(schema)) ||\n !isSameNodeType($cursor.node(-2), noteType(schema))\n ) {\n return false;\n }\n\n const noteNode = $cursor.node(-2);\n const noteContentNode = $cursor.node(-1);\n if ($cursor.parent !== noteContentNode.firstChild) return false;\n\n if (view?.endOfTextblock('backward', state)) {\n if (dispatch) {\n const noteTitleNode = noteNode.firstChild!;\n dispatch(\n state.tr.setSelection(\n TextSelection.create(state.doc, $cursor.before(-2) + noteTitleNode.nodeSize),\n ),\n );\n }\n return true;\n }\n return false;\n};\n"]}
@@ -6,6 +6,7 @@ export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'h
6
6
  active: boolean;
7
7
  enabled: boolean;
8
8
  onClick: () => void;
9
+ id?: string;
9
10
  className?: string;
10
11
  } & (Pick<ToolbarItemData<unknown>, 'icon'> | {
11
12
  children: ReactNode;
@@ -8,7 +8,7 @@ import { ToolbarTooltipDelay } from "./const.js";
8
8
  import "./ToolbarButton.css";
9
9
  const b = cn('toolbar-button');
10
10
  const DEFAULT_ICON_SIZE = 16;
11
- export const ToolbarButtonView = forwardRef(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, ...props }, ref) {
11
+ export const ToolbarButtonView = forwardRef(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, id, ...props }, ref) {
12
12
  const disabled = !active && !enabled;
13
13
  const titleText = isFunction(title) ? title() : title;
14
14
  const hintText = isFunction(hint) ? hint() : hint;
@@ -22,7 +22,7 @@ export const ToolbarButtonView = forwardRef(function ToolbarButtonView({ title,
22
22
  setRef(ref, elem);
23
23
  setRef(refForPopover, elem);
24
24
  setRef(refForTooltip, elem);
25
- }, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, children: 'icon' in props ? (_jsx(Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
25
+ }, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? (_jsx(Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
26
26
  });
27
27
  export function ToolbarButton(props) {
28
28
  const { id, editor, focus, isActive, isEnable, exec, onClick } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAiB,UAAU,EAAC,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAChC,OAAO,EAAC,IAAI,EAAC,gCAAuB;AACpC,OAAO,EAAC,UAAU,EAAC,qBAAkB;AAErC,OAAO,EAAC,mBAAmB,EAAC,mBAAgB;AAG5C,6BAA8B;AAE9B,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAc/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CACvC,SAAS,iBAAiB,CACtB,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,KAAK,EAAC,EAC1F,GAAG;IAEH,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC;IACrC,MAAM,SAAS,GAAW,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,MAAM,QAAQ,GAAuB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,MAAM,oBAAoB,GAAG,gBAAgB,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;IACrE,MAAM,oBAAoB,GACtB,OAAO,gBAAgB,KAAK,QAAQ;QAChC,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,OAAO,gBAAgB,KAAK,UAAU;YACtC,CAAC,CAAC,gBAAgB,EAAE;YACpB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAE5C,OAAO,CACH,KAAC,OAAO,IACJ,OAAO,EAAE,cAAK,SAAS,EAAE,CAAC,CAAC,yBAAyB,CAAC,YAAG,oBAAoB,GAAO,EACnF,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,CAAC,QAAQ,CAAC,YAEpB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC,CACnB,KAAC,aAAa,IACV,SAAS,EAAE,mBAAmB,CAAC,IAAI,EACnC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EACrC,WAAW,EAAE,QAAQ,EACrB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,YAEb,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CACpB,KAAC,MAAM,IACH,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,GAAG,EACR,GAAG,EAAE,CAAC,IAAuB,EAAE,EAAE;oBAC7B,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBAClB,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;oBAC5B,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBAChC,CAAC,EACD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAChC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,gBACnB,SAAS,YAEpB,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CACf,KAAC,IAAI,IACD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,iBAAiB,GAC5C,CACL,CAAC,CAAC,CAAC,CACA,KAAK,CAAC,QAAQ,CACjB,GACI,CACZ,GACW,CACnB,GACK,CACb,CAAC;AACN,CAAC,CACJ,CAAC;AAEF,MAAM,UAAU,aAAa,CAAI,KAA4B;IACzD,MAAM,EAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAC,GAAG,KAAK,CAAC;IAErE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,GAAG,EAAE;QACrB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,CAAC,CAAC;QACb,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,KAAC,iBAAiB,OAAK,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAI,CAAC;AACpG,CAAC","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode});\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, ...props},\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={active ? 'normal' : 'flat'}\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
1
+ {"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n id?: string;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode});\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {\n title,\n hint,\n hotkey,\n hintWhenDisabled,\n active,\n enabled,\n onClick,\n className,\n qa,\n id,\n ...props\n },\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={active ? 'normal' : 'flat'}\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n data-toolbar-item={id}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  /** During build process, the current version will be injected here */
2
- export const VERSION = typeof '15.13.2' !== 'undefined' ? '15.13.2' : 'unknown';
2
+ export const VERSION = typeof '15.14.0' !== 'undefined' ? '15.14.0' : 'unknown';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.13.2' !== 'undefined' ? '15.13.2' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.14.0' !== 'undefined' ? '15.14.0' : 'unknown';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/markdown-editor",
3
- "version": "15.13.2",
3
+ "version": "15.14.0",
4
4
  "description": "Markdown wysiwyg and markup editor",
5
5
  "license": "MIT",
6
6
  "repository": {