@gravity-ui/markdown-editor 15.12.1 → 15.13.1

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.
Files changed (65) hide show
  1. package/build/cjs/core/ExtensionsManager.js +1 -1
  2. package/build/cjs/core/ExtensionsManager.js.map +1 -1
  3. package/build/cjs/core/markdown/MarkdownSerializer.d.ts +1 -0
  4. package/build/cjs/core/markdown/MarkdownSerializer.js +8 -2
  5. package/build/cjs/core/markdown/MarkdownSerializer.js.map +1 -1
  6. package/build/cjs/extensions/behavior/SelectionContext/index.d.ts +6 -0
  7. package/build/cjs/extensions/behavior/SelectionContext/index.js +8 -2
  8. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  9. package/build/cjs/extensions/markdown/Link/PlaceholderWidget/commands.d.ts +1 -1
  10. package/build/cjs/extensions/markdown/Link/PlaceholderWidget/commands.js +7 -0
  11. package/build/cjs/extensions/markdown/Link/PlaceholderWidget/commands.js.map +1 -1
  12. package/build/cjs/extensions/markdown/Link/actions/linkEnhanceActions.js +3 -1
  13. package/build/cjs/extensions/markdown/Link/actions/linkEnhanceActions.js.map +1 -1
  14. package/build/cjs/extensions/yfm/Color/ColorSpecs/index.js +8 -3
  15. package/build/cjs/extensions/yfm/Color/ColorSpecs/index.js.map +1 -1
  16. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -1
  17. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  18. package/build/cjs/extensions/yfm/YfmTabs/views.js +1 -0
  19. package/build/cjs/extensions/yfm/YfmTabs/views.js.map +1 -1
  20. package/build/cjs/markdown-it/color.d.ts +1 -1
  21. package/build/cjs/markdown-it/color.js +2 -2
  22. package/build/cjs/markdown-it/color.js.map +1 -1
  23. package/build/cjs/toolbar/FlexToolbar.js +1 -1
  24. package/build/cjs/toolbar/FlexToolbar.js.map +1 -1
  25. package/build/cjs/toolbar/ToolbarListButton.d.ts +4 -2
  26. package/build/cjs/toolbar/ToolbarListButton.js +3 -3
  27. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  28. package/build/cjs/version.js +1 -1
  29. package/build/cjs/version.js.map +1 -1
  30. package/build/cjs/view/hooks/useFilesGallery/useFilesGallery.d.ts +1 -1
  31. package/build/cjs/view/hooks/useFilesGallery/useFilesGallery.js +41 -38
  32. package/build/cjs/view/hooks/useFilesGallery/useFilesGallery.js.map +1 -1
  33. package/build/esm/core/ExtensionsManager.js +1 -1
  34. package/build/esm/core/ExtensionsManager.js.map +1 -1
  35. package/build/esm/core/markdown/MarkdownSerializer.d.ts +1 -0
  36. package/build/esm/core/markdown/MarkdownSerializer.js +8 -2
  37. package/build/esm/core/markdown/MarkdownSerializer.js.map +1 -1
  38. package/build/esm/extensions/behavior/SelectionContext/index.d.ts +6 -0
  39. package/build/esm/extensions/behavior/SelectionContext/index.js +8 -2
  40. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  41. package/build/esm/extensions/markdown/Link/PlaceholderWidget/commands.d.ts +1 -1
  42. package/build/esm/extensions/markdown/Link/PlaceholderWidget/commands.js +7 -0
  43. package/build/esm/extensions/markdown/Link/PlaceholderWidget/commands.js.map +1 -1
  44. package/build/esm/extensions/markdown/Link/actions/linkEnhanceActions.js +3 -1
  45. package/build/esm/extensions/markdown/Link/actions/linkEnhanceActions.js.map +1 -1
  46. package/build/esm/extensions/yfm/Color/ColorSpecs/index.js +8 -3
  47. package/build/esm/extensions/yfm/Color/ColorSpecs/index.js.map +1 -1
  48. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -1
  49. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  50. package/build/esm/extensions/yfm/YfmTabs/views.js +1 -0
  51. package/build/esm/extensions/yfm/YfmTabs/views.js.map +1 -1
  52. package/build/esm/markdown-it/color.d.ts +1 -1
  53. package/build/esm/markdown-it/color.js +1 -1
  54. package/build/esm/markdown-it/color.js.map +1 -1
  55. package/build/esm/toolbar/FlexToolbar.js +1 -1
  56. package/build/esm/toolbar/FlexToolbar.js.map +1 -1
  57. package/build/esm/toolbar/ToolbarListButton.d.ts +4 -2
  58. package/build/esm/toolbar/ToolbarListButton.js +3 -3
  59. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  60. package/build/esm/version.js +1 -1
  61. package/build/esm/version.js.map +1 -1
  62. package/build/esm/view/hooks/useFilesGallery/useFilesGallery.d.ts +1 -1
  63. package/build/esm/view/hooks/useFilesGallery/useFilesGallery.js +41 -38
  64. package/build/esm/view/hooks/useFilesGallery/useFilesGallery.js.map +1 -1
  65. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"views.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmTabs/views.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport {type EditorState, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findParentNodeOfTypeClosestToPos} from 'prosemirror-utils';\nimport type {EditorView, NodeViewConstructor, ViewMutationRecord} from 'prosemirror-view';\n\nimport {cn} from '../../../classname';\n\nimport {tabType, tabsType} from './const';\nimport {crossSvg, plusSvg} from './icons';\nimport {createTab, removeTab} from './plugins';\nimport {execAfterPaint} from './utils';\n\nimport './index.scss';\n\nconst cnYfmTab = cn('yfm-tab');\n\nconst ignoreMutation =\n (_node: Node, _view: EditorView, _getPos: () => number | undefined) =>\n (mutation: ViewMutationRecord) => {\n if (\n mutation instanceof MutationRecord &&\n mutation.type === 'attributes' &&\n mutation.attributeName\n ) {\n return true;\n }\n\n return false;\n };\n\nconst getTabNodes = (state: EditorState, getPos: () => number | undefined) => {\n const currentTab = findParentNodeOfTypeClosestToPos(\n state.tr.doc.resolve(getPos()! + 1),\n tabType(state.schema),\n );\n const tabsParentNode = findParentNodeOfTypeClosestToPos(\n state.tr.doc.resolve(getPos()!),\n tabsType(state.schema),\n );\n\n return {currentTab, tabsParentNode};\n};\n\nexport const tabView: NodeViewConstructor = (node, view, getPos) => {\n const tabElem = document.createElement('div');\n const wrapperElem = document.createElement('div');\n wrapperElem.setAttribute('class', cnYfmTab('wrapper'));\n\n const viewElem = document.createElement('div');\n viewElem.setAttribute('class', cnYfmTab('view'));\n\n wrapperElem.addEventListener('click', () => {\n // Click on parent node to trigger event listener that selects current tab\n tabElem.click();\n\n {\n /**\n * Hack for empty tabs\n *\n * Problem: when clicking on an empty tab (without text content) it focuses, and selection doesn't move to beginning of tab\n *\n * Temporary fix: manually return focus to pm-view, move text selection to beginning of tab\n */\n\n view.focus();\n\n // tab is empty\n if (node.nodeSize < 3) {\n execAfterPaint(() => {\n const pos = getPos();\n if (pos !== undefined) {\n const {tr} = view.state;\n view.dispatch(\n tr.setSelection(TextSelection.create(tr.doc, pos + 1)).scrollIntoView(),\n );\n }\n });\n }\n }\n });\n\n const removeTabButton = document.createElement('div');\n removeTabButton.setAttribute('class', cnYfmTab('remove-button'));\n removeTabButton.innerHTML = crossSvg;\n removeTabButton.contentEditable = 'false';\n removeTabButton.addEventListener('click', () => {\n const {state, dispatch} = view;\n const {currentTab, tabsParentNode} = getTabNodes(state, getPos);\n\n if (currentTab && tabsParentNode)\n removeTab(currentTab, tabsParentNode)(state, dispatch, view);\n });\n\n const createTabButton = document.createElement('div');\n createTabButton.setAttribute('class', cnYfmTab('create-button'));\n createTabButton.innerHTML = plusSvg;\n createTabButton.contentEditable = 'false';\n createTabButton.addEventListener('click', () => {\n const {state, dispatch} = view;\n const {currentTab, tabsParentNode} = getTabNodes(state, getPos);\n\n if (currentTab && tabsParentNode)\n createTab(currentTab, tabsParentNode)(state, dispatch, view);\n });\n\n for (const attr in node.attrs) {\n if (Object.prototype.hasOwnProperty.call(node.attrs, attr)) {\n tabElem.setAttribute(attr, node.attrs[attr]);\n }\n }\n\n wrapperElem.appendChild(viewElem);\n wrapperElem.appendChild(removeTabButton);\n\n tabElem.appendChild(wrapperElem);\n tabElem.appendChild(createTabButton);\n\n return {\n dom: tabElem,\n contentDOM: viewElem,\n destroy() {\n tabElem.remove();\n },\n // FIX: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n };\n};\n\n// @ts-expect-error\nexport const tabPanelView: NodeViewConstructor = (node, view, getPos) => ({\n // FIXME: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n});\n\n// @ts-expect-error\nexport const vtabView: NodeViewConstructor = (node, view, getPos) => ({\n // FIXME: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n});\n\n// @ts-expect-error\nexport const vtabInputView: NodeViewConstructor = (node, view, getPos) => ({\n // FIXME: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n});\n"]}
1
+ {"version":3,"file":"views.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmTabs/views.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport {type EditorState, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findParentNodeOfTypeClosestToPos} from 'prosemirror-utils';\nimport type {EditorView, NodeViewConstructor, ViewMutationRecord} from 'prosemirror-view';\n\nimport {cn} from '../../../classname';\n\nimport {tabType, tabsType} from './const';\nimport {crossSvg, plusSvg} from './icons';\nimport {createTab, removeTab} from './plugins';\nimport {execAfterPaint} from './utils';\n\nimport './index.scss';\n\nconst cnYfmTab = cn('yfm-tab');\n\nconst ignoreMutation =\n (_node: Node, _view: EditorView, _getPos: () => number | undefined) =>\n (mutation: ViewMutationRecord) => {\n if (\n mutation instanceof MutationRecord &&\n mutation.type === 'attributes' &&\n mutation.attributeName\n ) {\n return true;\n }\n\n return false;\n };\n\nconst getTabNodes = (state: EditorState, getPos: () => number | undefined) => {\n const currentTab = findParentNodeOfTypeClosestToPos(\n state.tr.doc.resolve(getPos()! + 1),\n tabType(state.schema),\n );\n const tabsParentNode = findParentNodeOfTypeClosestToPos(\n state.tr.doc.resolve(getPos()!),\n tabsType(state.schema),\n );\n\n return {currentTab, tabsParentNode};\n};\n\nexport const tabView: NodeViewConstructor = (node, view, getPos) => {\n const tabElem = document.createElement('div');\n const wrapperElem = document.createElement('div');\n wrapperElem.setAttribute('class', cnYfmTab('wrapper'));\n\n const viewElem = document.createElement('div');\n viewElem.setAttribute('class', cnYfmTab('view'));\n\n wrapperElem.addEventListener('click', () => {\n // Click on parent node to trigger event listener that selects current tab\n tabElem.click();\n\n {\n /**\n * Hack for empty tabs\n *\n * Problem: when clicking on an empty tab (without text content) it focuses, and selection doesn't move to beginning of tab\n *\n * Temporary fix: manually return focus to pm-view, move text selection to beginning of tab\n */\n\n view.focus();\n\n // tab is empty\n if (node.nodeSize < 3) {\n execAfterPaint(() => {\n const pos = getPos();\n if (pos !== undefined) {\n const {tr} = view.state;\n view.dispatch(\n tr.setSelection(TextSelection.create(tr.doc, pos + 1)).scrollIntoView(),\n );\n }\n });\n }\n }\n });\n\n const removeTabButton = document.createElement('div');\n removeTabButton.setAttribute('class', cnYfmTab('remove-button'));\n removeTabButton.innerHTML = crossSvg;\n removeTabButton.contentEditable = 'false';\n removeTabButton.addEventListener('click', () => {\n const {state, dispatch} = view;\n const {currentTab, tabsParentNode} = getTabNodes(state, getPos);\n\n if (currentTab && tabsParentNode)\n removeTab(currentTab, tabsParentNode)(state, dispatch, view);\n });\n\n const createTabButton = document.createElement('div');\n createTabButton.setAttribute('class', cnYfmTab('create-button'));\n createTabButton.innerHTML = plusSvg;\n createTabButton.contentEditable = 'false';\n createTabButton.addEventListener('click', () => {\n const {state, dispatch} = view;\n const {currentTab, tabsParentNode} = getTabNodes(state, getPos);\n\n if (currentTab && tabsParentNode)\n createTab(currentTab, tabsParentNode)(state, dispatch, view);\n });\n\n tabElem.draggable = false;\n for (const attr in node.attrs) {\n if (Object.prototype.hasOwnProperty.call(node.attrs, attr)) {\n tabElem.setAttribute(attr, node.attrs[attr]);\n }\n }\n\n wrapperElem.appendChild(viewElem);\n wrapperElem.appendChild(removeTabButton);\n\n tabElem.appendChild(wrapperElem);\n tabElem.appendChild(createTabButton);\n\n return {\n dom: tabElem,\n contentDOM: viewElem,\n destroy() {\n tabElem.remove();\n },\n // FIX: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n };\n};\n\n// @ts-expect-error\nexport const tabPanelView: NodeViewConstructor = (node, view, getPos) => ({\n // FIXME: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n});\n\n// @ts-expect-error\nexport const vtabView: NodeViewConstructor = (node, view, getPos) => ({\n // FIXME: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n});\n\n// @ts-expect-error\nexport const vtabInputView: NodeViewConstructor = (node, view, getPos) => ({\n // FIXME: ignore mutation and don't rerender node when yfm.js switch tab\n ignoreMutation: ignoreMutation(node, view, getPos),\n});\n"]}
@@ -1,2 +1,2 @@
1
- import { colorPlugin } from 'markdown-it-color';
1
+ import { colorPlugin } from '@diplodoc/color-extension';
2
2
  export default colorPlugin;
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const markdown_it_color_1 = require("markdown-it-color");
4
- exports.default = markdown_it_color_1.colorPlugin;
3
+ const color_extension_1 = require("@diplodoc/color-extension");
4
+ exports.default = color_extension_1.colorPlugin;
5
5
  //# sourceMappingURL=color.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"color.js","sourceRoot":"../../../src","sources":["markdown-it/color.ts"],"names":[],"mappings":";;AAAA,yDAA8C;AAE9C,kBAAe,+BAAW,CAAC","sourcesContent":["import {colorPlugin} from 'markdown-it-color';\n\nexport default colorPlugin;\n"]}
1
+ {"version":3,"file":"color.js","sourceRoot":"../../../src","sources":["markdown-it/color.ts"],"names":[],"mappings":";;AAAA,+DAAsD;AAEtD,kBAAe,6BAAW,CAAC","sourcesContent":["import {colorPlugin} from '@diplodoc/color-extension';\n\nexport default colorPlugin;\n"]}
@@ -46,6 +46,6 @@ function FlexToolbar(props) {
46
46
  hiddenActions: filteredHiddenAction,
47
47
  });
48
48
  }, [data, width, hiddenActions]);
49
- return ((0, jsx_runtime_1.jsx)("div", { ref: ref, className: b(null, [className]), children: (0, jsx_runtime_1.jsxs)("div", { className: b('container'), children: [(0, jsx_runtime_1.jsx)(Toolbar_1.Toolbar, { ...props, data: items, className: b('bar') }), dots?.length && ((0, jsx_runtime_1.jsx)(ToolbarListButton_1.ToolbarListButton, { qa: "g-md-toolbar-more-action", data: dots, icon: { data: icons_1.Ellipsis }, title: props.dotsTitle, editor: props.editor, focus: props.focus, onClick: props.onClick, className: b('dots'), alwaysActive: true }))] }) }));
49
+ return ((0, jsx_runtime_1.jsx)("div", { ref: ref, className: b(null, [className]), children: (0, jsx_runtime_1.jsxs)("div", { className: b('container'), children: [(0, jsx_runtime_1.jsx)(Toolbar_1.Toolbar, { ...props, data: items, className: b('bar') }), dots?.length && ((0, jsx_runtime_1.jsx)(ToolbarListButton_1.ToolbarListButton, { qa: "g-md-toolbar-more-action", qaMenu: "g-md-toolbar-more-menu", data: dots, icon: { data: icons_1.Ellipsis }, title: props.dotsTitle, editor: props.editor, focus: props.focus, onClick: props.onClick, className: b('dots'), alwaysActive: true }))] }) }));
50
50
  }
51
51
  //# sourceMappingURL=FlexToolbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FlexToolbar.js","sourceRoot":"../../../src","sources":["toolbar/FlexToolbar.tsx"],"names":[],"mappings":";;AAuBA,kCAwDC;;AA/ED,iCAA8B;AAE9B,6CAA2C;AAC3C,yCAAqC;AAErC,+CAAgC;AAChC,yCAAiC;AACjC,mDAAmD;AAEnD,0CAAqD;AACrD,8DAAsD;AACtD,4CAA6C;AAC7C,sCAA8D;AAE9D,6BAA4B;AAE5B,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,cAAc,CAAC,CAAC;AAO7B,SAAgB,WAAW,CAAI,KAA0B;IACrD,IAAA,qBAAa,EAAC,CAAC,IAAI,EAAE,EAAE;QACnB,eAAM,CAAC,OAAO,CAAC;YACX,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,EAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAC,GAAG,KAAK,CAAC;IAE/C,MAAM,CAAC,GAAG,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,IAAA,sBAAU,GAAkB,CAAC;IACpD,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAW,EAAE,YAAY,EAAE,EAAE;YAC/D,OAAO;gBACH,GAAG,CAAC;gBACJ,GAAG,YAAY;qBACV,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;oBACnB,IAAI,aAAa,CAAC,IAAI,KAAK,uBAAe,CAAC,UAAU,EAAE,CAAC;wBACpD,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC/C,CAAC;oBACD,OAAO,aAAa,CAAC,EAAE,CAAC;gBAC5B,CAAC,CAAC;qBACD,IAAI,EAAE;aACd,CAAC;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,sEAAsE;QACtE,MAAM,oBAAoB,GAAG,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAA,4BAAiB,EAAC;YACrB,IAAI;YACJ,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,oBAAoB;SACtC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAEjC,OAAO,CACH,gCAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,YAC1C,iCAAK,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,aAC1B,uBAAC,iBAAO,OAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAI,EACvD,IAAI,EAAE,MAAM,IAAI,CACb,uBAAC,qCAAiB,IACd,EAAE,EAAC,0BAA0B,EAC7B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,EAAC,IAAI,EAAE,gBAAQ,EAAC,EACtB,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,YAAY,EAAE,IAAI,GACpB,CACL,IACC,GACJ,CACT,CAAC;AACN,CAAC","sourcesContent":["import {useMemo} from 'react';\n\nimport {Ellipsis} from '@gravity-ui/icons';\nimport {useMeasure} from 'react-use';\n\nimport {cn} from '../classname';\nimport {logger} from '../logger';\nimport {useRenderTime} from '../react-utils/hooks';\n\nimport {Toolbar, type ToolbarProps} from './Toolbar';\nimport {ToolbarListButton} from './ToolbarListButton';\nimport {shrinkToolbarData} from './flexible';\nimport {ToolbarDataType, type ToolbarItemData} from './types';\n\nimport './FlexToolbar.scss';\n\nconst b = cn('flex-toolbar');\n\nexport type FlexToolbarProps<E> = ToolbarProps<E> & {\n dotsTitle: string | (() => string);\n hiddenActions?: ToolbarItemData<E>[];\n};\n\nexport function FlexToolbar<E>(props: FlexToolbarProps<E>) {\n useRenderTime((time) => {\n logger.metrics({\n component: 'toolbar',\n event: 'render',\n duration: time,\n });\n });\n\n const {data, className, hiddenActions} = props;\n\n const [ref, {width}] = useMeasure<HTMLDivElement>();\n const {data: items, dots} = useMemo(() => {\n const toolbarButtonIds = data.reduce((a: string[], toolbarGroup) => {\n return [\n ...a,\n ...toolbarGroup\n .map((toolbarButton) => {\n if (toolbarButton.type === ToolbarDataType.ListButton) {\n return toolbarButton.data.map((v) => v.id);\n }\n return toolbarButton.id;\n })\n .flat(),\n ];\n }, []);\n\n // Finding only actions tha are not present in the main toolbar config\n const filteredHiddenAction = hiddenActions?.filter((a) => !toolbarButtonIds.includes(a.id));\n return shrinkToolbarData({\n data,\n availableWidth: width,\n hiddenActions: filteredHiddenAction,\n });\n }, [data, width, hiddenActions]);\n\n return (\n <div ref={ref} className={b(null, [className])}>\n <div className={b('container')}>\n <Toolbar {...props} data={items} className={b('bar')} />\n {dots?.length && (\n <ToolbarListButton\n qa=\"g-md-toolbar-more-action\"\n data={dots}\n icon={{data: Ellipsis}}\n title={props.dotsTitle}\n editor={props.editor}\n focus={props.focus}\n onClick={props.onClick}\n className={b('dots')}\n alwaysActive={true}\n />\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"FlexToolbar.js","sourceRoot":"../../../src","sources":["toolbar/FlexToolbar.tsx"],"names":[],"mappings":";;AAuBA,kCAyDC;;AAhFD,iCAA8B;AAE9B,6CAA2C;AAC3C,yCAAqC;AAErC,+CAAgC;AAChC,yCAAiC;AACjC,mDAAmD;AAEnD,0CAAqD;AACrD,8DAAsD;AACtD,4CAA6C;AAC7C,sCAA8D;AAE9D,6BAA4B;AAE5B,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,cAAc,CAAC,CAAC;AAO7B,SAAgB,WAAW,CAAI,KAA0B;IACrD,IAAA,qBAAa,EAAC,CAAC,IAAI,EAAE,EAAE;QACnB,eAAM,CAAC,OAAO,CAAC;YACX,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,EAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAC,GAAG,KAAK,CAAC;IAE/C,MAAM,CAAC,GAAG,EAAE,EAAC,KAAK,EAAC,CAAC,GAAG,IAAA,sBAAU,GAAkB,CAAC;IACpD,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAW,EAAE,YAAY,EAAE,EAAE;YAC/D,OAAO;gBACH,GAAG,CAAC;gBACJ,GAAG,YAAY;qBACV,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;oBACnB,IAAI,aAAa,CAAC,IAAI,KAAK,uBAAe,CAAC,UAAU,EAAE,CAAC;wBACpD,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC/C,CAAC;oBACD,OAAO,aAAa,CAAC,EAAE,CAAC;gBAC5B,CAAC,CAAC;qBACD,IAAI,EAAE;aACd,CAAC;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,sEAAsE;QACtE,MAAM,oBAAoB,GAAG,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAA,4BAAiB,EAAC;YACrB,IAAI;YACJ,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,oBAAoB;SACtC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAEjC,OAAO,CACH,gCAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,YAC1C,iCAAK,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,aAC1B,uBAAC,iBAAO,OAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAI,EACvD,IAAI,EAAE,MAAM,IAAI,CACb,uBAAC,qCAAiB,IACd,EAAE,EAAC,0BAA0B,EAC7B,MAAM,EAAC,wBAAwB,EAC/B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,EAAC,IAAI,EAAE,gBAAQ,EAAC,EACtB,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,YAAY,EAAE,IAAI,GACpB,CACL,IACC,GACJ,CACT,CAAC;AACN,CAAC","sourcesContent":["import {useMemo} from 'react';\n\nimport {Ellipsis} from '@gravity-ui/icons';\nimport {useMeasure} from 'react-use';\n\nimport {cn} from '../classname';\nimport {logger} from '../logger';\nimport {useRenderTime} from '../react-utils/hooks';\n\nimport {Toolbar, type ToolbarProps} from './Toolbar';\nimport {ToolbarListButton} from './ToolbarListButton';\nimport {shrinkToolbarData} from './flexible';\nimport {ToolbarDataType, type ToolbarItemData} from './types';\n\nimport './FlexToolbar.scss';\n\nconst b = cn('flex-toolbar');\n\nexport type FlexToolbarProps<E> = ToolbarProps<E> & {\n dotsTitle: string | (() => string);\n hiddenActions?: ToolbarItemData<E>[];\n};\n\nexport function FlexToolbar<E>(props: FlexToolbarProps<E>) {\n useRenderTime((time) => {\n logger.metrics({\n component: 'toolbar',\n event: 'render',\n duration: time,\n });\n });\n\n const {data, className, hiddenActions} = props;\n\n const [ref, {width}] = useMeasure<HTMLDivElement>();\n const {data: items, dots} = useMemo(() => {\n const toolbarButtonIds = data.reduce((a: string[], toolbarGroup) => {\n return [\n ...a,\n ...toolbarGroup\n .map((toolbarButton) => {\n if (toolbarButton.type === ToolbarDataType.ListButton) {\n return toolbarButton.data.map((v) => v.id);\n }\n return toolbarButton.id;\n })\n .flat(),\n ];\n }, []);\n\n // Finding only actions tha are not present in the main toolbar config\n const filteredHiddenAction = hiddenActions?.filter((a) => !toolbarButtonIds.includes(a.id));\n return shrinkToolbarData({\n data,\n availableWidth: width,\n hiddenActions: filteredHiddenAction,\n });\n }, [data, width, hiddenActions]);\n\n return (\n <div ref={ref} className={b(null, [className])}>\n <div className={b('container')}>\n <Toolbar {...props} data={items} className={b('bar')} />\n {dots?.length && (\n <ToolbarListButton\n qa=\"g-md-toolbar-more-action\"\n qaMenu=\"g-md-toolbar-more-menu\"\n data={dots}\n icon={{data: Ellipsis}}\n title={props.dotsTitle}\n editor={props.editor}\n focus={props.focus}\n onClick={props.onClick}\n className={b('dots')}\n alwaysActive={true}\n />\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { ToolbarBaseProps, ToolbarListButtonData } from "./types.js";
2
2
  import "./ToolbarListButton.css";
3
3
  export type { ToolbarListButtonData };
4
- export type ToolbarListButtonProps<E> = ToolbarBaseProps<E> & ToolbarListButtonData<E>;
5
- export declare function ToolbarListButton<E>({ className, editor, focus, onClick, icon, title, withArrow, data, alwaysActive, replaceActiveIcon, qa, }: ToolbarListButtonProps<E>): JSX.Element | null;
4
+ export type ToolbarListButtonProps<E> = ToolbarBaseProps<E> & ToolbarListButtonData<E> & {
5
+ qaMenu?: string;
6
+ };
7
+ export declare function ToolbarListButton<E>({ className, editor, focus, onClick, icon, title, withArrow, data, alwaysActive, replaceActiveIcon, qa, qaMenu, }: ToolbarListButtonProps<E>): JSX.Element | null;
@@ -13,7 +13,7 @@ const PreviewTooltip_1 = require("./PreviewTooltip.js");
13
13
  const ToolbarButton_1 = require("./ToolbarButton.js");
14
14
  require("./ToolbarListButton.css");
15
15
  const b = (0, classname_1.cn)('toolbar-list-button');
16
- function ToolbarListButton({ className, editor, focus, onClick, icon, title, withArrow, data, alwaysActive, replaceActiveIcon, qa, }) {
16
+ function ToolbarListButton({ className, editor, focus, onClick, icon, title, withArrow, data, alwaysActive, replaceActiveIcon, qa, qaMenu, }) {
17
17
  const [anchorElement, setAnchorElement] = (0, hooks_1.useElementState)();
18
18
  const [open, , hide, toggleOpen] = (0, hooks_1.useBooleanState)(false);
19
19
  const [popupItem, setPopupItem] = (0, react_1.useState)();
@@ -42,7 +42,7 @@ function ToolbarListButton({ className, editor, focus, onClick, icon, title, wit
42
42
  setPopupItem(undefined);
43
43
  else
44
44
  toggleOpen();
45
- }, children: buttonContent }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, children: (0, jsx_runtime_1.jsx)(uikit_1.Menu, { size: "l", className: b('menu'), children: data
45
+ }, children: buttonContent }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, children: (0, jsx_runtime_1.jsx)(uikit_1.Menu, { size: "l", className: b('menu'), qa: qaMenu, children: data
46
46
  .map((data) => {
47
47
  const { id, title, icon, hotkey, isActive, isEnable, exec, hint, hintWhenDisabled, preview, } = data;
48
48
  const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
@@ -66,7 +66,7 @@ function ToolbarListButton({ className, editor, focus, onClick, icon, title, wit
66
66
  onClick?.(id);
67
67
  }
68
68
  };
69
- return ((0, jsx_runtime_1.jsx)(uikit_1.Popover, { className: b('action-disabled-popover'), content: (0, jsx_runtime_1.jsx)("div", { className: b('action-disabled-tooltip'), children: hintWhenDisabledText }), placement: "left", modal: false, disabled: hideHintWhenDisabled, children: (props, ref) => ((0, jsx_runtime_1.jsx)(PreviewTooltip_1.PreviewTooltip, { preview: preview, children: (0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { ref: ref, active: isActive(editor), disabled: !isEnable(editor), onClick: handleClick, iconStart: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icon.data, size: icon.size ?? 16 }), extraProps: {
69
+ return ((0, jsx_runtime_1.jsx)(uikit_1.Popover, { className: b('action-disabled-popover'), content: (0, jsx_runtime_1.jsx)("div", { className: b('action-disabled-tooltip'), children: hintWhenDisabledText }), placement: "left", modal: false, disabled: hideHintWhenDisabled, qa: "g-md-toolbar-action-disabled-hint", children: (props, ref) => ((0, jsx_runtime_1.jsx)(PreviewTooltip_1.PreviewTooltip, { preview: preview, children: (0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { ref: ref, active: isActive(editor), disabled: !isEnable(editor), onClick: handleClick, iconStart: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icon.data, size: icon.size ?? 16 }), extraProps: {
70
70
  ...props,
71
71
  'aria-label': titleText,
72
72
  }, children: (0, jsx_runtime_1.jsxs)("div", { className: b('item'), children: [titleText, (0, jsx_runtime_1.jsxs)("div", { className: b('extra'), children: [hotkey && (0, jsx_runtime_1.jsx)(uikit_1.Hotkey, { value: hotkey }), hintText && ((0, jsx_runtime_1.jsx)(uikit_1.HelpMark, { className: b('hint'), popoverProps: { modal: false }, children: hintText }))] })] }) }, id) })) }, id));
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> & ToolbarListButtonData<E>;\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup anchorElement={anchorElement} open={popupOpen} onOpenChange={hide}>\n <Menu size=\"l\" className={b('menu')}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\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 const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
1
+ {"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup anchorElement={anchorElement} open={popupOpen} onOpenChange={hide}>\n <Menu size=\"l\" className={b('menu')} qa={qaMenu}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\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 const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa=\"g-md-toolbar-action-disabled-hint\"\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\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.12.1' !== 'undefined' ? '15.12.1' : 'unknown';
5
+ exports.VERSION = typeof '15.13.1' !== 'undefined' ? '15.13.1' : '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.12.1' !== 'undefined' ? '15.12.1' : '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.13.1' !== 'undefined' ? '15.13.1' : 'unknown';\n"]}
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
2
  import type { GalleryItemPropsWithUrl } from "./types.js";
3
3
  export declare function useFilesGallery(customFiles?: GalleryItemPropsWithUrl[]): {
4
- openFilesGallery: (event: React.MouseEvent<HTMLDivElement>) => void;
4
+ openFilesGallery: (event: React.MouseEvent<HTMLDivElement>) => boolean;
5
5
  };
@@ -9,47 +9,50 @@ function useFilesGallery(customFiles) {
9
9
  const { openGallery } = (0, components_1.useGallery)();
10
10
  return {
11
11
  openFilesGallery: React.useCallback((event) => {
12
- if (event.target instanceof HTMLElement) {
13
- let fileLink = '';
14
- if (event.target.tagName === 'IMG' && !event.target.closest('a')) {
15
- fileLink = event.target.getAttribute('src') ?? '';
16
- }
17
- else if (event.target.tagName === 'A') {
18
- fileLink = event.target.getAttribute('href') ?? '';
19
- }
20
- if (!fileLink) {
21
- return;
22
- }
23
- const filesFromContent = [
24
- ...(event.currentTarget?.querySelectorAll('img,a') ?? []),
25
- ].reduce((result, element) => {
26
- const isImage = element.tagName === 'IMG';
27
- const link = isImage
28
- ? element.getAttribute('src')
29
- : element.getAttribute('href');
30
- if (link && !customFiles?.some((item) => item.url === link)) {
31
- const extension = link.match(constants_1.extensionRegex)?.[0] || '';
32
- if (isImage || constants_1.supportedExtensions.includes(extension)) {
33
- const name = (isImage
34
- ? element.getAttribute('alt')
35
- : element.getAttribute('title')) || '';
36
- result.push({
37
- ...(constants_1.supportedVideoExtensions.includes(extension)
38
- ? (0, components_1.getGalleryItemVideo)({ src: link, name: name })
39
- : (0, components_1.getGalleryItemImage)({ src: link, name: name })),
40
- url: link,
41
- });
42
- }
12
+ if (!(event.target instanceof HTMLElement)) {
13
+ return false;
14
+ }
15
+ let fileLink = '';
16
+ if (event.target.tagName === 'IMG' && !event.target.closest('a')) {
17
+ fileLink = event.target.getAttribute('src') ?? '';
18
+ }
19
+ else if (event.target.tagName === 'A') {
20
+ fileLink = event.target.getAttribute('href') ?? '';
21
+ }
22
+ if (!fileLink) {
23
+ return false;
24
+ }
25
+ const filesFromContent = [
26
+ ...(event.currentTarget?.querySelectorAll('img,a') ?? []),
27
+ ].reduce((result, element) => {
28
+ const isImage = element.tagName === 'IMG';
29
+ const link = isImage
30
+ ? element.getAttribute('src')
31
+ : element.getAttribute('href');
32
+ if (link && !customFiles?.some((item) => item.url === link)) {
33
+ const extension = link.match(constants_1.extensionRegex)?.[0] || '';
34
+ if (isImage || constants_1.supportedExtensions.includes(extension)) {
35
+ const name = (isImage
36
+ ? element.getAttribute('alt')
37
+ : element.getAttribute('title')) || '';
38
+ result.push({
39
+ ...(constants_1.supportedVideoExtensions.includes(extension)
40
+ ? (0, components_1.getGalleryItemVideo)({ src: link, name: name })
41
+ : (0, components_1.getGalleryItemImage)({ src: link, name: name })),
42
+ url: link,
43
+ });
43
44
  }
44
- return result;
45
- }, []);
46
- const files = [...(customFiles ?? []), ...filesFromContent];
47
- const initialItemIndex = files.findIndex((item) => item.url === fileLink);
48
- if (initialItemIndex !== -1) {
49
- event.preventDefault();
50
- openGallery(files, initialItemIndex);
51
45
  }
46
+ return result;
47
+ }, []);
48
+ const files = [...(customFiles ?? []), ...filesFromContent];
49
+ const initialItemIndex = files.findIndex((item) => item.url === fileLink);
50
+ if (initialItemIndex !== -1) {
51
+ event.preventDefault();
52
+ openGallery(files, initialItemIndex);
53
+ return true;
52
54
  }
55
+ return false;
53
56
  }, [customFiles, openGallery]),
54
57
  };
55
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useFilesGallery.js","sourceRoot":"../../../../../src","sources":["view/hooks/useFilesGallery/useFilesGallery.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {getGalleryItemImage, getGalleryItemVideo, useGallery} from '@gravity-ui/components';\n\nimport {extensionRegex, supportedExtensions, supportedVideoExtensions} from './constants';\nimport type {GalleryItemPropsWithUrl} from './types';\n\nexport function useFilesGallery(customFiles?: GalleryItemPropsWithUrl[]) {\n const {openGallery} = useGallery();\n\n return {\n openFilesGallery: React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (event.target instanceof HTMLElement) {\n let fileLink = '';\n\n if (event.target.tagName === 'IMG' && !event.target.closest('a')) {\n fileLink = event.target.getAttribute('src') ?? '';\n } else if (event.target.tagName === 'A') {\n fileLink = event.target.getAttribute('href') ?? '';\n }\n\n if (!fileLink) {\n return;\n }\n\n const filesFromContent = [\n ...(event.currentTarget?.querySelectorAll('img,a') ?? []),\n ].reduce<GalleryItemPropsWithUrl[]>((result, element) => {\n const isImage = element.tagName === 'IMG';\n const link = isImage\n ? element.getAttribute('src')\n : element.getAttribute('href');\n\n if (link && !customFiles?.some((item) => item.url === link)) {\n const extension = link.match(extensionRegex)?.[0] || '';\n\n if (isImage || supportedExtensions.includes(extension)) {\n const name =\n (isImage\n ? element.getAttribute('alt')\n : element.getAttribute('title')) || '';\n\n result.push({\n ...(supportedVideoExtensions.includes(extension)\n ? getGalleryItemVideo({src: link, name: name})\n : getGalleryItemImage({src: link, name: name})),\n url: link,\n });\n }\n }\n\n return result;\n }, []);\n\n const files = [...(customFiles ?? []), ...filesFromContent];\n\n const initialItemIndex = files.findIndex((item) => item.url === fileLink);\n\n if (initialItemIndex !== -1) {\n event.preventDefault();\n openGallery(files, initialItemIndex);\n }\n }\n },\n [customFiles, openGallery],\n ),\n };\n}\n"]}
1
+ {"version":3,"file":"useFilesGallery.js","sourceRoot":"../../../../../src","sources":["view/hooks/useFilesGallery/useFilesGallery.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport {getGalleryItemImage, getGalleryItemVideo, useGallery} from '@gravity-ui/components';\n\nimport {extensionRegex, supportedExtensions, supportedVideoExtensions} from './constants';\nimport type {GalleryItemPropsWithUrl} from './types';\n\nexport function useFilesGallery(customFiles?: GalleryItemPropsWithUrl[]) {\n const {openGallery} = useGallery();\n\n return {\n openFilesGallery: React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!(event.target instanceof HTMLElement)) {\n return false;\n }\n\n let fileLink = '';\n\n if (event.target.tagName === 'IMG' && !event.target.closest('a')) {\n fileLink = event.target.getAttribute('src') ?? '';\n } else if (event.target.tagName === 'A') {\n fileLink = event.target.getAttribute('href') ?? '';\n }\n\n if (!fileLink) {\n return false;\n }\n\n const filesFromContent = [\n ...(event.currentTarget?.querySelectorAll('img,a') ?? []),\n ].reduce<GalleryItemPropsWithUrl[]>((result, element) => {\n const isImage = element.tagName === 'IMG';\n const link = isImage\n ? element.getAttribute('src')\n : element.getAttribute('href');\n\n if (link && !customFiles?.some((item) => item.url === link)) {\n const extension = link.match(extensionRegex)?.[0] || '';\n\n if (isImage || supportedExtensions.includes(extension)) {\n const name =\n (isImage\n ? element.getAttribute('alt')\n : element.getAttribute('title')) || '';\n\n result.push({\n ...(supportedVideoExtensions.includes(extension)\n ? getGalleryItemVideo({src: link, name: name})\n : getGalleryItemImage({src: link, name: name})),\n url: link,\n });\n }\n }\n\n return result;\n }, []);\n\n const files = [...(customFiles ?? []), ...filesFromContent];\n\n const initialItemIndex = files.findIndex((item) => item.url === fileLink);\n\n if (initialItemIndex !== -1) {\n event.preventDefault();\n openGallery(files, initialItemIndex);\n return true;\n }\n\n return false;\n },\n [customFiles, openGallery],\n ),\n };\n}\n"]}
@@ -74,7 +74,7 @@ export class ExtensionsManager {
74
74
  this.#spec.nodes().forEach(this.processNode);
75
75
  this.#spec.marks().forEach(this.processMark);
76
76
  }
77
- processNode = (name, { spec, fromMd, toMd: toMd, view }) => {
77
+ processNode = (name, { spec, fromMd, toMd, view }) => {
78
78
  this.#schemaRegistry.addNode(name, spec);
79
79
  this.#parserRegistry.addToken(fromMd.tokenName || name, fromMd.tokenSpec);
80
80
  this.#serializerRegistry.addNode(name, toMd);
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionsManager.js","sourceRoot":"../../../src","sources":["core/ExtensionsManager.ts"],"names":[],"mappings":"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","sourcesContent":["import MarkdownIt, {type PresetName} from 'markdown-it';\nimport type {Schema} from 'prosemirror-model';\nimport type {Plugin} from 'prosemirror-state';\n\nimport {Logger2} from '../logger';\n\nimport {ActionsManager} from './ActionsManager';\nimport {ExtensionBuilder} from './ExtensionBuilder';\nimport {ParserTokensRegistry} from './ParserTokensRegistry';\nimport type {SchemaDynamicModifier} from './SchemaDynamicModifier';\nimport {SchemaSpecRegistry} from './SchemaSpecRegistry';\nimport {SerializerTokensRegistry} from './SerializerTokensRegistry';\nimport type {MarkdownParserDynamicModifier} from './markdown/MarkdownParser';\nimport type {MarkdownSerializerDynamicModifier} from './markdown/MarkdownSerializerDynamicModifier';\nimport type {TransformFn} from './markdown/ProseMirrorTransformer';\nimport type {ActionSpec} from './types/actions';\nimport type {\n Extension,\n ExtensionDeps,\n ExtensionMarkSpec,\n ExtensionNodeSpec,\n ExtensionSpec,\n} from './types/extension';\nimport type {MarkViewConstructor, NodeViewConstructor} from './types/node-views';\n\ntype ExtensionsManagerParams = {\n logger?: Logger2.ILogger;\n extensions: Extension;\n options?: ExtensionsManagerOptions;\n};\n\ntype ExtensionsManagerOptions = {\n mdOpts?: MarkdownIt.Options & {preset?: PresetName};\n linkifyTlds?: string | string[];\n pmTransformers?: TransformFn[];\n dynamicModifiers?: {\n parser?: MarkdownParserDynamicModifier;\n serializer?: MarkdownSerializerDynamicModifier;\n schema?: SchemaDynamicModifier;\n };\n};\n\nexport class ExtensionsManager {\n static process(\n extensions: Extension,\n options: ExtensionsManagerOptions,\n logger?: Logger2.ILogger,\n ) {\n return new this({extensions, options, logger}).build();\n }\n\n #schemaRegistry;\n #parserRegistry;\n #serializerRegistry;\n\n #nodeViewCreators = new Map<string, (deps: ExtensionDeps) => NodeViewConstructor>();\n #markViewCreators = new Map<string, (deps: ExtensionDeps) => MarkViewConstructor>();\n\n #pmTransformers: TransformFn[] = [];\n\n #mdForMarkup: MarkdownIt;\n #mdForText: MarkdownIt;\n #extensions: Extension;\n #builder: ExtensionBuilder;\n\n #spec!: ExtensionSpec;\n #deps!: ExtensionDeps;\n #plugins: Plugin[] = [];\n #actions: Record<string, ActionSpec> = {};\n #nodeViews: Record<string, NodeViewConstructor> = {};\n #markViews: Record<string, MarkViewConstructor> = {};\n #serializerDynamicModifier?: MarkdownSerializerDynamicModifier;\n #parserDynamicModifier?: MarkdownParserDynamicModifier;\n\n constructor({extensions, options = {}, logger = new Logger2()}: ExtensionsManagerParams) {\n this.#schemaRegistry = new SchemaSpecRegistry(undefined, options.dynamicModifiers?.schema);\n this.#parserRegistry = new ParserTokensRegistry({logger});\n this.#serializerRegistry = new SerializerTokensRegistry();\n if (options.dynamicModifiers) {\n this.#parserDynamicModifier = options.dynamicModifiers?.parser;\n this.#serializerDynamicModifier = options.dynamicModifiers?.serializer;\n }\n\n this.#extensions = extensions;\n\n const mdPreset: PresetName = options.mdOpts?.preset ?? 'default';\n this.#mdForMarkup = new MarkdownIt(mdPreset, options.mdOpts ?? {});\n this.#mdForText = new MarkdownIt(mdPreset, options.mdOpts ?? {});\n\n if (options.linkifyTlds) {\n this.#mdForMarkup.linkify.tlds(options.linkifyTlds, true);\n this.#mdForText.linkify.tlds(options.linkifyTlds, true);\n }\n\n if (options.pmTransformers) {\n this.#pmTransformers = options.pmTransformers;\n }\n\n // TODO: add prefilled context\n this.#builder = new ExtensionBuilder(logger);\n }\n\n build() {\n this.processExtensions();\n this.createDeps();\n this.createDerived();\n\n return {\n ...this.#deps,\n actions: this.#deps.actions as ActionsManager,\n rawActions: this.#actions,\n plugins: this.#plugins,\n nodeViews: this.#nodeViews,\n markViews: this.#markViews,\n };\n }\n\n buildDeps() {\n this.processExtensions();\n this.createDeps();\n return this.#deps;\n }\n\n private processExtensions() {\n this.#spec = this.#builder.use(this.#extensions).build();\n this.#mdForMarkup = this.#spec.configureMd(this.#mdForMarkup, 'markup');\n this.#mdForText = this.#spec.configureMd(this.#mdForText, 'text');\n this.#spec.nodes().forEach(this.processNode);\n this.#spec.marks().forEach(this.processMark);\n }\n\n private processNode = (name: string, {spec, fromMd, toMd: toMd, view}: ExtensionNodeSpec) => {\n this.#schemaRegistry.addNode(name, spec);\n\n this.#parserRegistry.addToken(fromMd.tokenName || name, fromMd.tokenSpec);\n this.#serializerRegistry.addNode(name, toMd);\n if (view) {\n this.#nodeViewCreators.set(name, view);\n }\n };\n\n private processMark = (name: string, {spec, fromMd, toMd, view}: ExtensionMarkSpec) => {\n this.#schemaRegistry.addMark(name, spec);\n this.#parserRegistry.addToken(fromMd.tokenName || name, fromMd.tokenSpec);\n this.#serializerRegistry.addMark(name, toMd);\n if (view) {\n this.#markViewCreators.set(name, view);\n }\n };\n\n private createParser(schema: Schema, mdInstance: MarkdownIt) {\n return this.#parserRegistry.createParser(\n schema,\n mdInstance,\n this.#pmTransformers,\n this.#parserDynamicModifier,\n );\n }\n\n private createDeps() {\n const actions = new ActionsManager();\n\n const schema = this.#schemaRegistry.createSchema();\n const markupParser = this.createParser(schema, this.#mdForMarkup);\n const textParser = this.createParser(schema, this.#mdForText);\n const serializer = this.#serializerRegistry.createSerializer(\n this.#serializerDynamicModifier,\n );\n\n this.#deps = {\n schema,\n actions,\n markupParser,\n textParser,\n serializer,\n };\n }\n\n private createDerived() {\n this.#plugins = this.#spec.plugins(this.#deps);\n Object.assign(this.#actions, this.#spec.actions(this.#deps));\n\n for (const [name, view] of this.#nodeViewCreators) {\n this.#nodeViews[name] = view(this.#deps);\n }\n\n for (const [name, view] of this.#markViewCreators) {\n this.#markViews[name] = view(this.#deps);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ExtensionsManager.js","sourceRoot":"../../../src","sources":["core/ExtensionsManager.ts"],"names":[],"mappings":"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","sourcesContent":["import MarkdownIt, {type PresetName} from 'markdown-it';\nimport type {Schema} from 'prosemirror-model';\nimport type {Plugin} from 'prosemirror-state';\n\nimport {Logger2} from '../logger';\n\nimport {ActionsManager} from './ActionsManager';\nimport {ExtensionBuilder} from './ExtensionBuilder';\nimport {ParserTokensRegistry} from './ParserTokensRegistry';\nimport type {SchemaDynamicModifier} from './SchemaDynamicModifier';\nimport {SchemaSpecRegistry} from './SchemaSpecRegistry';\nimport {SerializerTokensRegistry} from './SerializerTokensRegistry';\nimport type {MarkdownParserDynamicModifier} from './markdown/MarkdownParser';\nimport type {MarkdownSerializerDynamicModifier} from './markdown/MarkdownSerializerDynamicModifier';\nimport type {TransformFn} from './markdown/ProseMirrorTransformer';\nimport type {ActionSpec} from './types/actions';\nimport type {\n Extension,\n ExtensionDeps,\n ExtensionMarkSpec,\n ExtensionNodeSpec,\n ExtensionSpec,\n} from './types/extension';\nimport type {MarkViewConstructor, NodeViewConstructor} from './types/node-views';\n\ntype ExtensionsManagerParams = {\n logger?: Logger2.ILogger;\n extensions: Extension;\n options?: ExtensionsManagerOptions;\n};\n\ntype ExtensionsManagerOptions = {\n mdOpts?: MarkdownIt.Options & {preset?: PresetName};\n linkifyTlds?: string | string[];\n pmTransformers?: TransformFn[];\n dynamicModifiers?: {\n parser?: MarkdownParserDynamicModifier;\n serializer?: MarkdownSerializerDynamicModifier;\n schema?: SchemaDynamicModifier;\n };\n};\n\nexport class ExtensionsManager {\n static process(\n extensions: Extension,\n options: ExtensionsManagerOptions,\n logger?: Logger2.ILogger,\n ) {\n return new this({extensions, options, logger}).build();\n }\n\n #schemaRegistry;\n #parserRegistry;\n #serializerRegistry;\n\n #nodeViewCreators = new Map<string, (deps: ExtensionDeps) => NodeViewConstructor>();\n #markViewCreators = new Map<string, (deps: ExtensionDeps) => MarkViewConstructor>();\n\n #pmTransformers: TransformFn[] = [];\n\n #mdForMarkup: MarkdownIt;\n #mdForText: MarkdownIt;\n #extensions: Extension;\n #builder: ExtensionBuilder;\n\n #spec!: ExtensionSpec;\n #deps!: ExtensionDeps;\n #plugins: Plugin[] = [];\n #actions: Record<string, ActionSpec> = {};\n #nodeViews: Record<string, NodeViewConstructor> = {};\n #markViews: Record<string, MarkViewConstructor> = {};\n #serializerDynamicModifier?: MarkdownSerializerDynamicModifier;\n #parserDynamicModifier?: MarkdownParserDynamicModifier;\n\n constructor({extensions, options = {}, logger = new Logger2()}: ExtensionsManagerParams) {\n this.#schemaRegistry = new SchemaSpecRegistry(undefined, options.dynamicModifiers?.schema);\n this.#parserRegistry = new ParserTokensRegistry({logger});\n this.#serializerRegistry = new SerializerTokensRegistry();\n if (options.dynamicModifiers) {\n this.#parserDynamicModifier = options.dynamicModifiers?.parser;\n this.#serializerDynamicModifier = options.dynamicModifiers?.serializer;\n }\n\n this.#extensions = extensions;\n\n const mdPreset: PresetName = options.mdOpts?.preset ?? 'default';\n this.#mdForMarkup = new MarkdownIt(mdPreset, options.mdOpts ?? {});\n this.#mdForText = new MarkdownIt(mdPreset, options.mdOpts ?? {});\n\n if (options.linkifyTlds) {\n this.#mdForMarkup.linkify.tlds(options.linkifyTlds, true);\n this.#mdForText.linkify.tlds(options.linkifyTlds, true);\n }\n\n if (options.pmTransformers) {\n this.#pmTransformers = options.pmTransformers;\n }\n\n // TODO: add prefilled context\n this.#builder = new ExtensionBuilder(logger);\n }\n\n build() {\n this.processExtensions();\n this.createDeps();\n this.createDerived();\n\n return {\n ...this.#deps,\n actions: this.#deps.actions as ActionsManager,\n rawActions: this.#actions,\n plugins: this.#plugins,\n nodeViews: this.#nodeViews,\n markViews: this.#markViews,\n };\n }\n\n buildDeps() {\n this.processExtensions();\n this.createDeps();\n return this.#deps;\n }\n\n private processExtensions() {\n this.#spec = this.#builder.use(this.#extensions).build();\n this.#mdForMarkup = this.#spec.configureMd(this.#mdForMarkup, 'markup');\n this.#mdForText = this.#spec.configureMd(this.#mdForText, 'text');\n this.#spec.nodes().forEach(this.processNode);\n this.#spec.marks().forEach(this.processMark);\n }\n\n private processNode = (name: string, {spec, fromMd, toMd, view}: ExtensionNodeSpec) => {\n this.#schemaRegistry.addNode(name, spec);\n\n this.#parserRegistry.addToken(fromMd.tokenName || name, fromMd.tokenSpec);\n this.#serializerRegistry.addNode(name, toMd);\n if (view) {\n this.#nodeViewCreators.set(name, view);\n }\n };\n\n private processMark = (name: string, {spec, fromMd, toMd, view}: ExtensionMarkSpec) => {\n this.#schemaRegistry.addMark(name, spec);\n this.#parserRegistry.addToken(fromMd.tokenName || name, fromMd.tokenSpec);\n this.#serializerRegistry.addMark(name, toMd);\n if (view) {\n this.#markViewCreators.set(name, view);\n }\n };\n\n private createParser(schema: Schema, mdInstance: MarkdownIt) {\n return this.#parserRegistry.createParser(\n schema,\n mdInstance,\n this.#pmTransformers,\n this.#parserDynamicModifier,\n );\n }\n\n private createDeps() {\n const actions = new ActionsManager();\n\n const schema = this.#schemaRegistry.createSchema();\n const markupParser = this.createParser(schema, this.#mdForMarkup);\n const textParser = this.createParser(schema, this.#mdForText);\n const serializer = this.#serializerRegistry.createSerializer(\n this.#serializerDynamicModifier,\n );\n\n this.#deps = {\n schema,\n actions,\n markupParser,\n textParser,\n serializer,\n };\n }\n\n private createDerived() {\n this.#plugins = this.#spec.plugins(this.#deps);\n Object.assign(this.#actions, this.#spec.actions(this.#deps));\n\n for (const [name, view] of this.#nodeViewCreators) {\n this.#nodeViews[name] = view(this.#deps);\n }\n\n for (const [name, view] of this.#markViewCreators) {\n this.#markViews[name] = view(this.#deps);\n }\n }\n}\n"]}
@@ -40,6 +40,7 @@ export declare class MarkdownSerializerState {
40
40
  noAutoBlank: boolean;
41
41
  isAutolink: boolean | undefined;
42
42
  escapeWhitespace: boolean;
43
+ escapeCharacters?: string[];
43
44
  private readonly nodes;
44
45
  private readonly marks;
45
46
  private readonly options;
@@ -70,6 +70,7 @@ export class MarkdownSerializerState {
70
70
  noAutoBlank;
71
71
  isAutolink;
72
72
  escapeWhitespace;
73
+ escapeCharacters;
73
74
  nodes;
74
75
  marks;
75
76
  options;
@@ -274,8 +275,9 @@ export class MarkdownSerializerState {
274
275
  while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep]))
275
276
  ++keep;
276
277
  // Close the marks that need to be closed
277
- while (keep < active.length)
278
+ while (keep < active.length) {
278
279
  this.text(this.markString(active.pop(), false, parent, index), false);
280
+ }
279
281
  // Output any previously expelled trailing whitespace outside the marks
280
282
  if (leading)
281
283
  this.text(leading);
@@ -328,7 +330,11 @@ export class MarkdownSerializerState {
328
330
  // have special meaning only at the start of the line.
329
331
  esc(str, startOfLine = false) {
330
332
  // eslint-disable-next-line no-useless-escape
331
- const escRegexp = this.options?.commonEscape || /[`\^+*\\\|~\[\]\{\}<>\$_]/g;
333
+ const defaultEsc = /[`\^+*\\\|~\[\]\{\}<>\$_]/g;
334
+ const extraChars = this.escapeCharacters?.length ? this.escapeCharacters.map(c => '\\' + c).join('') : '';
335
+ const escRegexp = this.options?.commonEscape ||
336
+ // Compose the escape regexp from default, options, and extra characters
337
+ new RegExp(defaultEsc.source + (extraChars ? `|[${extraChars}]` : ''), 'g');
332
338
  const startOfLineEscRegexp = this.options?.startOfLineEscape || /^[:#\-*+>]/;
333
339
  str = str.replace(escRegexp, '\\$&');
334
340
  if (startOfLine)