@gravity-ui/markdown-editor 15.16.2 → 15.18.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.
- package/build/cjs/bundle/Editor.d.ts +1 -1
- package/build/cjs/bundle/Editor.js +6 -1
- package/build/cjs/bundle/Editor.js.map +1 -1
- package/build/cjs/bundle/MarkdownEditorView.js +3 -1
- package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
- package/build/cjs/bundle/MarkupEditorView.d.ts +2 -1
- package/build/cjs/bundle/MarkupEditorView.js +2 -2
- package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
- package/build/cjs/bundle/ToolbarView.d.ts +3 -2
- package/build/cjs/bundle/ToolbarView.js +3 -2
- package/build/cjs/bundle/ToolbarView.js.map +1 -1
- package/build/cjs/bundle/WysiwygEditorView.d.ts +2 -1
- package/build/cjs/bundle/WysiwygEditorView.js +2 -2
- package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
- package/build/cjs/bundle/config/w-heading-config.js +6 -0
- package/build/cjs/bundle/config/w-heading-config.js.map +1 -1
- package/build/cjs/bundle/settings/index.d.ts +1 -0
- package/build/cjs/bundle/settings/index.js +3 -3
- package/build/cjs/bundle/settings/index.js.map +1 -1
- package/build/cjs/bundle/types.d.ts +2 -0
- package/build/cjs/bundle/types.js.map +1 -1
- package/build/cjs/bundle/useMarkdownEditor.js +2 -1
- package/build/cjs/bundle/useMarkdownEditor.js.map +1 -1
- package/build/cjs/bundle/wysiwyg-preset.d.ts +1 -0
- package/build/cjs/bundle/wysiwyg-preset.js +1 -1
- package/build/cjs/bundle/wysiwyg-preset.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/code.js +8 -3
- package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
- package/build/cjs/extensions/behavior/CommandMenu/handler.d.ts +2 -1
- package/build/cjs/extensions/behavior/CommandMenu/handler.js +10 -2
- package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/cjs/extensions/behavior/Resizable/Resizable.d.ts +2 -1
- package/build/cjs/extensions/behavior/Resizable/Resizable.js.map +1 -1
- package/build/cjs/extensions/behavior/index.d.ts +1 -0
- package/build/cjs/extensions/behavior/index.js +6 -4
- package/build/cjs/extensions/behavior/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +13 -11
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/handle-paste.d.ts +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js +21 -5
- package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
- package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +23 -39
- package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
- package/build/cjs/i18n/placeholder/en.json +1 -0
- package/build/cjs/i18n/placeholder/index.d.ts +2 -1
- package/build/cjs/i18n/placeholder/ru.json +1 -0
- package/build/cjs/toolbar/FlexToolbar.js +9 -3
- package/build/cjs/toolbar/FlexToolbar.js.map +1 -1
- package/build/cjs/toolbar/PreviewTooltip.d.ts +1 -0
- package/build/cjs/toolbar/PreviewTooltip.js +3 -3
- package/build/cjs/toolbar/PreviewTooltip.js.map +1 -1
- package/build/cjs/toolbar/Toolbar.css +3 -0
- package/build/cjs/toolbar/Toolbar.d.ts +1 -1
- package/build/cjs/toolbar/Toolbar.js +3 -3
- package/build/cjs/toolbar/Toolbar.js.map +1 -1
- package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
- package/build/cjs/toolbar/ToolbarButton.js +2 -2
- package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
- package/build/cjs/toolbar/ToolbarGroup.d.ts +1 -1
- package/build/cjs/toolbar/ToolbarGroup.js +4 -4
- package/build/cjs/toolbar/ToolbarGroup.js.map +1 -1
- package/build/cjs/toolbar/ToolbarListButton.d.ts +1 -1
- package/build/cjs/toolbar/ToolbarListButton.js +4 -4
- package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
- package/build/cjs/toolbar/types.d.ts +9 -0
- package/build/cjs/toolbar/types.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/Editor.d.ts +1 -1
- package/build/esm/bundle/Editor.js +6 -1
- package/build/esm/bundle/Editor.js.map +1 -1
- package/build/esm/bundle/MarkdownEditorView.js +3 -1
- package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
- package/build/esm/bundle/MarkupEditorView.d.ts +2 -1
- package/build/esm/bundle/MarkupEditorView.js +2 -2
- package/build/esm/bundle/MarkupEditorView.js.map +1 -1
- package/build/esm/bundle/ToolbarView.d.ts +3 -2
- package/build/esm/bundle/ToolbarView.js +3 -2
- package/build/esm/bundle/ToolbarView.js.map +1 -1
- package/build/esm/bundle/WysiwygEditorView.d.ts +2 -1
- package/build/esm/bundle/WysiwygEditorView.js +2 -2
- package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
- package/build/esm/bundle/config/w-heading-config.js +6 -0
- package/build/esm/bundle/config/w-heading-config.js.map +1 -1
- package/build/esm/bundle/settings/index.d.ts +1 -0
- package/build/esm/bundle/settings/index.js +3 -3
- package/build/esm/bundle/settings/index.js.map +1 -1
- package/build/esm/bundle/types.d.ts +2 -0
- package/build/esm/bundle/types.js.map +1 -1
- package/build/esm/bundle/useMarkdownEditor.js +2 -1
- package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
- package/build/esm/bundle/wysiwyg-preset.d.ts +1 -0
- package/build/esm/bundle/wysiwyg-preset.js +1 -1
- package/build/esm/bundle/wysiwyg-preset.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/code.js +8 -3
- package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
- package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +2 -1
- package/build/esm/extensions/behavior/CommandMenu/handler.js +10 -3
- package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/esm/extensions/behavior/Resizable/Resizable.d.ts +2 -1
- package/build/esm/extensions/behavior/Resizable/Resizable.js.map +1 -1
- package/build/esm/extensions/behavior/index.d.ts +1 -0
- package/build/esm/extensions/behavior/index.js +6 -4
- package/build/esm/extensions/behavior/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +13 -11
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/handle-paste.d.ts +1 -1
- package/build/esm/extensions/markdown/CodeBlock/handle-paste.js +20 -5
- package/build/esm/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
- package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +23 -39
- package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
- package/build/esm/i18n/placeholder/en.json +1 -0
- package/build/esm/i18n/placeholder/index.d.ts +2 -1
- package/build/esm/i18n/placeholder/ru.json +1 -0
- package/build/esm/toolbar/FlexToolbar.js +9 -3
- package/build/esm/toolbar/FlexToolbar.js.map +1 -1
- package/build/esm/toolbar/PreviewTooltip.d.ts +1 -0
- package/build/esm/toolbar/PreviewTooltip.js +3 -3
- package/build/esm/toolbar/PreviewTooltip.js.map +1 -1
- package/build/esm/toolbar/Toolbar.css +3 -0
- package/build/esm/toolbar/Toolbar.d.ts +1 -1
- package/build/esm/toolbar/Toolbar.js +3 -3
- package/build/esm/toolbar/Toolbar.js.map +1 -1
- package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
- package/build/esm/toolbar/ToolbarButton.js +2 -2
- package/build/esm/toolbar/ToolbarButton.js.map +1 -1
- package/build/esm/toolbar/ToolbarGroup.d.ts +1 -1
- package/build/esm/toolbar/ToolbarGroup.js +4 -4
- package/build/esm/toolbar/ToolbarGroup.js.map +1 -1
- package/build/esm/toolbar/ToolbarListButton.d.ts +1 -1
- package/build/esm/toolbar/ToolbarListButton.js +4 -4
- package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
- package/build/esm/toolbar/types.d.ts +9 -0
- package/build/esm/toolbar/types.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +3 -0
- package/package.json +2 -2
|
@@ -32,10 +32,12 @@ export const BehaviorPreset = (builder, opts) => {
|
|
|
32
32
|
.use(History, opts.history ?? {})
|
|
33
33
|
.use(Clipboard, opts.clipboard ?? {})
|
|
34
34
|
.use(ReactRendererExtension, opts.reactRenderer)
|
|
35
|
-
.use(WidgetDecoration)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
.use(WidgetDecoration);
|
|
36
|
+
if (!opts.mobile) {
|
|
37
|
+
builder.use(SelectionContext, opts.selectionContext ?? {});
|
|
38
|
+
if (opts.commandMenu)
|
|
39
|
+
builder.use(CommandMenu, opts.commandMenu);
|
|
40
|
+
}
|
|
39
41
|
builder.use(FilePaste);
|
|
40
42
|
builder.use(ClicksOnEdges);
|
|
41
43
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,iCAAwB;AAC9C,OAAO,EAAC,SAAS,EAAwB,6BAAoB;AAC7D,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,MAAM,EAAqB,0BAAiB;AACpD,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,OAAO,EAAsB,2BAAkB;AACvD,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAqB,sBAAsB,EAAC,iCAAwB;AAC3E,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,gBAAgB,EAA+B,oCAA2B;AAClF,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAC,gBAAgB,EAAC,oCAA2B;AAEpD,wCAA+B;AAC/B,yCAAgC;AAChC,qCAA4B;AAC5B,uCAA8B;AAC9B,kCAAyB;AACzB,qCAA4B;AAC5B,mCAA0B;AAC1B,uCAA8B;AAC9B,yCAAgC;AAChC,qCAA4B;AAC5B,4CAAmC;AACnC,uCAA8B;AAC9B,4CAAmC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,iCAAwB;AAC9C,OAAO,EAAC,SAAS,EAAwB,6BAAoB;AAC7D,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,MAAM,EAAqB,0BAAiB;AACpD,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,OAAO,EAAsB,2BAAkB;AACvD,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAqB,sBAAsB,EAAC,iCAAwB;AAC3E,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,gBAAgB,EAA+B,oCAA2B;AAClF,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAC,gBAAgB,EAAC,oCAA2B;AAEpD,wCAA+B;AAC/B,yCAAgC;AAChC,qCAA4B;AAC5B,uCAA8B;AAC9B,kCAAyB;AACzB,qCAA4B;AAC5B,mCAA0B;AAC1B,uCAA8B;AAC9B,yCAAgC;AAChC,qCAA4B;AAC5B,4CAAmC;AACnC,uCAA8B;AAC9B,4CAAmC;AAcnC,MAAM,CAAC,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC/B,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../core';\nimport type {PlaceholderOptions} from '../../utils/placeholder';\n\nimport {ClicksOnEdges} from './ClicksOnEdges';\nimport {Clipboard, type ClipboardOptions} from './Clipboard';\nimport {CommandMenu, type CommandMenuOptions} from './CommandMenu';\nimport {Cursor, type CursorOptions} from './Cursor';\nimport {FilePaste} from './FilePaste';\nimport {History, type HistoryOptions} from './History';\nimport {Placeholder} from './Placeholder';\nimport {type ReactRenderer, ReactRendererExtension} from './ReactRenderer';\nimport {Selection} from './Selection';\nimport {SelectionContext, type SelectionContextOptions} from './SelectionContext';\nimport {SharedState} from './SharedState';\nimport {WidgetDecoration} from './WidgetDecoration';\n\nexport * from './Autocomplete';\nexport * from './ClicksOnEdges';\nexport * from './Clipboard';\nexport * from './CommandMenu';\nexport * from './Cursor';\nexport * from './FilePaste';\nexport * from './History';\nexport * from './Placeholder';\nexport * from './ReactRenderer';\nexport * from './Selection';\nexport * from './SelectionContext';\nexport * from './SharedState';\nexport * from './WidgetDecoration';\n\nexport type BehaviorPresetOptions = {\n cursor?: CursorOptions;\n history?: HistoryOptions;\n clipboard?: ClipboardOptions;\n placeholder?: PlaceholderOptions;\n reactRenderer: ReactRenderer;\n selectionContext?: SelectionContextOptions;\n\n commandMenu?: CommandMenuOptions;\n mobile?: boolean;\n};\n\nexport const BehaviorPreset: ExtensionAuto<BehaviorPresetOptions> = (builder, opts) => {\n builder\n .use(Selection)\n .use(SharedState)\n .use(Placeholder, opts.placeholder ?? {})\n .use(Cursor, opts.cursor ?? {})\n .use(History, opts.history ?? {})\n .use(Clipboard, opts.clipboard ?? {})\n .use(ReactRendererExtension, opts.reactRenderer)\n .use(WidgetDecoration);\n\n if (!opts.mobile) {\n builder.use(SelectionContext, opts.selectionContext ?? {});\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n }\n\n builder.use(FilePaste);\n builder.use(ClicksOnEdges);\n};\n"]}
|
|
@@ -37,17 +37,19 @@ export const CodeBlockHighlight = (builder, opts) => {
|
|
|
37
37
|
key,
|
|
38
38
|
state: {
|
|
39
39
|
init: (_, state) => {
|
|
40
|
-
loadModules().then(() => {
|
|
41
|
-
modulesLoaded =
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
loadModules().then((loaded) => {
|
|
41
|
+
modulesLoaded = loaded;
|
|
42
|
+
if (modulesLoaded) {
|
|
43
|
+
for (const lang of Object.keys(langs)) {
|
|
44
|
+
const defs = langs[lang](hljs);
|
|
45
|
+
selectItems.push({
|
|
46
|
+
value: lang,
|
|
47
|
+
content: defs.name || capitalize(lang),
|
|
48
|
+
});
|
|
49
|
+
if (defs.aliases) {
|
|
50
|
+
for (const alias of defs.aliases) {
|
|
51
|
+
mapping[alias] = lang;
|
|
52
|
+
}
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
55
|
}
|
package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlockHighlight.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Options} from '@diplodoc/transform';\n// importing only type, because lowlight and highlight.js is optional deps\nimport type HLJS from 'highlight.js/lib/core';\nimport type {createLowlight} from 'lowlight' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport {Plugin, PluginKey} from 'prosemirror-state';\nimport type {Step} from 'prosemirror-transform';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByType} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {capitalize} from '../../../../lodash';\nimport {globalLogger} from '../../../../logger';\nimport {CodeBlockNodeAttr, codeBlockNodeName, codeBlockType} from '../CodeBlockSpecs';\n\nimport {codeLangSelectTooltipViewCreator} from './TooltipPlugin';\n\nexport type HighlightLangMap = Options['highlightLangs'];\n\ntype Lowlight = ReturnType<typeof createLowlight>;\ntype Root = ReturnType<Lowlight['highlight']>;\n\ntype LangSelectItem = {\n value: string;\n content: string;\n};\n\nconst key = new PluginKey<DecorationSet>('code_block_highlight');\n\nexport type CodeBlockHighlightOptions = {\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions> = (builder, opts) => {\n let langs: NonNullable<HighlightLangMap>;\n let lowlight: Lowlight;\n let hljs: typeof HLJS;\n\n const loadModules = async () => {\n try {\n hljs = (await import('highlight.js/lib/core')).default;\n const low = await import('lowlight');\n\n const all: HighlightLangMap = low.all;\n const create: typeof createLowlight = low.createLowlight;\n langs = {...all, ...opts.langs};\n lowlight = create(langs);\n return true;\n } catch (e) {\n globalLogger.info('Skip code_block highlighting');\n builder.logger.log('Skip code_block highlighting');\n return false;\n }\n };\n\n builder.addPlugin(() => {\n let modulesLoaded = false;\n\n const selectItems: LangSelectItem[] = [];\n const mapping: Record<string, string> = {};\n\n // TODO: add TAB key handler\n // TODO: Remove constant selection of block\n return new Plugin<DecorationSet>({\n key,\n state: {\n init: (_, state) => {\n loadModules().then(() => {\n modulesLoaded = true;\n\n for (const lang of Object.keys(langs)) {\n const defs = langs[lang](hljs);\n selectItems.push({\n value: lang,\n content: defs.name || capitalize(lang),\n });\n if (defs.aliases) {\n for (const alias of defs.aliases) {\n mapping[alias] = lang;\n }\n }\n }\n });\n return getDecorations(state.doc);\n },\n apply: (tr, decos, oldState, newState) => {\n if (!modulesLoaded) {\n return DecorationSet.empty;\n }\n\n if (tr.docChanged) {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n // Apply decorations if:\n if (\n oldNodeName === codeBlockNodeName ||\n newNodeName === codeBlockNodeName\n ) {\n // selection includes codeblock node,\n return getDecorations(tr.doc);\n } else {\n const oldNodes = findChildrenByType(\n oldState.doc,\n codeBlockType(oldState.schema),\n );\n const newNodes = findChildrenByType(\n newState.doc,\n codeBlockType(newState.schema),\n );\n if (\n // OR transaction adds/removes codeblock nodes,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n tr.steps.some((step) => {\n return (\n stepHasFromTo(step) &&\n oldNodes.some(\n (node: {node: Node; pos: number}) =>\n node.pos >= step.from &&\n node.pos + node.node.nodeSize <= step.to,\n )\n );\n })\n ) {\n return getDecorations(tr.doc);\n }\n }\n }\n return decos.map(tr.mapping, tr.doc);\n },\n },\n view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),\n props: {\n decorations: (state) => {\n return key.getState(state);\n },\n nodeViews: {\n [codeBlockNodeName]: (node) => {\n let prevLang = node.attrs[CodeBlockNodeAttr.Lang];\n\n const dom = document.createElement('pre');\n\n const contentDOM = document.createElement('code');\n contentDOM.classList.add('hljs');\n\n if (prevLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);\n contentDOM.classList.add(prevLang);\n }\n\n dom.append(contentDOM);\n\n return {\n dom,\n contentDOM,\n update(newNode) {\n if (node.type !== newNode.type) return false;\n\n const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];\n if (prevLang !== newLang) {\n contentDOM.className = 'hljs';\n if (newLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, newLang);\n contentDOM.classList.add(newLang);\n } else {\n dom.removeAttribute(CodeBlockNodeAttr.Lang);\n }\n prevLang = newLang;\n }\n\n return true;\n },\n };\n },\n },\n },\n });\n });\n\n function getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n if (!lowlight) {\n return DecorationSet.empty;\n }\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n let from = pos + 1;\n let nodes: Root['children'];\n\n const lang: string | undefined = node.attrs[CodeBlockNodeAttr.Lang];\n if (lang && lowlight.registered(lang)) {\n nodes = lowlight.highlight(lang, node.textContent).children;\n } else {\n continue;\n }\n\n for (const {text, classes} of parseNodes(nodes)) {\n const to = from + text.length;\n if (classes.length) {\n decos.push(\n Decoration.inline(from, to, {\n class: classes.join(' '),\n }),\n );\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decos);\n }\n};\n\nfunction parseNodes(\n nodes: Root['children'],\n className: readonly string[] = [],\n): {text: string; classes: readonly string[]}[] {\n return nodes\n .map((node) => {\n let classes = className;\n if (node.type === 'element') {\n classes = classes.concat((node.properties.className as string[]) ?? []);\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.type === 'comment' || node.type === 'text' ? node.value : '',\n classes,\n };\n })\n .flat();\n}\n\nfunction stepHasFromTo(step: Step): step is Step & {from: number; to: number} {\n // @ts-expect-error\n return typeof step.from === 'number' && typeof step.to === 'number';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CodeBlockHighlight.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Options} from '@diplodoc/transform';\n// importing only type, because lowlight and highlight.js is optional deps\nimport type HLJS from 'highlight.js/lib/core';\nimport type {createLowlight} from 'lowlight' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport {Plugin, PluginKey} from 'prosemirror-state';\nimport type {Step} from 'prosemirror-transform';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByType} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {capitalize} from '../../../../lodash';\nimport {globalLogger} from '../../../../logger';\nimport {CodeBlockNodeAttr, codeBlockNodeName, codeBlockType} from '../CodeBlockSpecs';\n\nimport {codeLangSelectTooltipViewCreator} from './TooltipPlugin';\n\nexport type HighlightLangMap = Options['highlightLangs'];\n\ntype Lowlight = ReturnType<typeof createLowlight>;\ntype Root = ReturnType<Lowlight['highlight']>;\n\ntype LangSelectItem = {\n value: string;\n content: string;\n};\n\nconst key = new PluginKey<DecorationSet>('code_block_highlight');\n\nexport type CodeBlockHighlightOptions = {\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions> = (builder, opts) => {\n let langs: NonNullable<HighlightLangMap>;\n let lowlight: Lowlight;\n let hljs: typeof HLJS;\n\n const loadModules = async () => {\n try {\n hljs = (await import('highlight.js/lib/core')).default;\n const low = await import('lowlight');\n\n const all: HighlightLangMap = low.all;\n const create: typeof createLowlight = low.createLowlight;\n langs = {...all, ...opts.langs};\n lowlight = create(langs);\n return true;\n } catch (e) {\n globalLogger.info('Skip code_block highlighting');\n builder.logger.log('Skip code_block highlighting');\n return false;\n }\n };\n\n builder.addPlugin(() => {\n let modulesLoaded = false;\n\n const selectItems: LangSelectItem[] = [];\n const mapping: Record<string, string> = {};\n\n // TODO: add TAB key handler\n // TODO: Remove constant selection of block\n return new Plugin<DecorationSet>({\n key,\n state: {\n init: (_, state) => {\n loadModules().then((loaded) => {\n modulesLoaded = loaded;\n\n if (modulesLoaded) {\n for (const lang of Object.keys(langs)) {\n const defs = langs[lang](hljs);\n selectItems.push({\n value: lang,\n content: defs.name || capitalize(lang),\n });\n if (defs.aliases) {\n for (const alias of defs.aliases) {\n mapping[alias] = lang;\n }\n }\n }\n }\n });\n return getDecorations(state.doc);\n },\n apply: (tr, decos, oldState, newState) => {\n if (!modulesLoaded) {\n return DecorationSet.empty;\n }\n\n if (tr.docChanged) {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n // Apply decorations if:\n if (\n oldNodeName === codeBlockNodeName ||\n newNodeName === codeBlockNodeName\n ) {\n // selection includes codeblock node,\n return getDecorations(tr.doc);\n } else {\n const oldNodes = findChildrenByType(\n oldState.doc,\n codeBlockType(oldState.schema),\n );\n const newNodes = findChildrenByType(\n newState.doc,\n codeBlockType(newState.schema),\n );\n if (\n // OR transaction adds/removes codeblock nodes,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n tr.steps.some((step) => {\n return (\n stepHasFromTo(step) &&\n oldNodes.some(\n (node: {node: Node; pos: number}) =>\n node.pos >= step.from &&\n node.pos + node.node.nodeSize <= step.to,\n )\n );\n })\n ) {\n return getDecorations(tr.doc);\n }\n }\n }\n return decos.map(tr.mapping, tr.doc);\n },\n },\n view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),\n props: {\n decorations: (state) => {\n return key.getState(state);\n },\n nodeViews: {\n [codeBlockNodeName]: (node) => {\n let prevLang = node.attrs[CodeBlockNodeAttr.Lang];\n\n const dom = document.createElement('pre');\n\n const contentDOM = document.createElement('code');\n contentDOM.classList.add('hljs');\n\n if (prevLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);\n contentDOM.classList.add(prevLang);\n }\n\n dom.append(contentDOM);\n\n return {\n dom,\n contentDOM,\n update(newNode) {\n if (node.type !== newNode.type) return false;\n\n const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];\n if (prevLang !== newLang) {\n contentDOM.className = 'hljs';\n if (newLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, newLang);\n contentDOM.classList.add(newLang);\n } else {\n dom.removeAttribute(CodeBlockNodeAttr.Lang);\n }\n prevLang = newLang;\n }\n\n return true;\n },\n };\n },\n },\n },\n });\n });\n\n function getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n if (!lowlight) {\n return DecorationSet.empty;\n }\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n let from = pos + 1;\n let nodes: Root['children'];\n\n const lang: string | undefined = node.attrs[CodeBlockNodeAttr.Lang];\n if (lang && lowlight.registered(lang)) {\n nodes = lowlight.highlight(lang, node.textContent).children;\n } else {\n continue;\n }\n\n for (const {text, classes} of parseNodes(nodes)) {\n const to = from + text.length;\n if (classes.length) {\n decos.push(\n Decoration.inline(from, to, {\n class: classes.join(' '),\n }),\n );\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decos);\n }\n};\n\nfunction parseNodes(\n nodes: Root['children'],\n className: readonly string[] = [],\n): {text: string; classes: readonly string[]}[] {\n return nodes\n .map((node) => {\n let classes = className;\n if (node.type === 'element') {\n classes = classes.concat((node.properties.className as string[]) ?? []);\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.type === 'comment' || node.type === 'text' ? node.value : '',\n classes,\n };\n })\n .flat();\n}\n\nfunction stepHasFromTo(step: Step): step is Step & {from: number; to: number} {\n // @ts-expect-error\n return typeof step.from === 'number' && typeof step.to === 'number';\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { EditorProps } from
|
|
1
|
+
import type { EditorProps } from "../../../pm/view.js";
|
|
2
2
|
export declare const handlePaste: NonNullable<EditorProps['handlePaste']>;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import dd from 'ts-dedent';
|
|
2
|
+
import { getLoggerFromState } from "../../../core/index.js";
|
|
3
|
+
import { Fragment } from "../../../pm/model.js";
|
|
1
4
|
import { DataTransferType, isVSCode, tryParseVSCodeData } from "../../../utils/clipboard.js";
|
|
2
5
|
import { CodeBlockNodeAttr } from "./CodeBlockSpecs/index.js";
|
|
3
6
|
import { codeBlockType } from "./const.js";
|
|
@@ -7,10 +10,22 @@ export const handlePaste = (view, e) => {
|
|
|
7
10
|
const code = getCodeData(e.clipboardData);
|
|
8
11
|
if (!code)
|
|
9
12
|
return false;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
getLoggerFromState(view.state).event({
|
|
14
|
+
domEvent: 'paste',
|
|
15
|
+
event: 'paste-from-code-editor',
|
|
16
|
+
editor: code.editor,
|
|
17
|
+
editorMode: code.mode,
|
|
18
|
+
empty: !code.value,
|
|
19
|
+
dataTypes: e.clipboardData.types,
|
|
20
|
+
});
|
|
21
|
+
const { tr, schema } = view.state;
|
|
22
|
+
if (code.value) {
|
|
23
|
+
const codeBlockNode = codeBlockType(schema).create({ [CodeBlockNodeAttr.Lang]: code.mode }, schema.text(code.value));
|
|
24
|
+
tr.replaceSelectionWith(codeBlockNode);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
tr.replaceWith(tr.selection.from, tr.selection.to, Fragment.empty);
|
|
28
|
+
}
|
|
14
29
|
view.dispatch(tr.scrollIntoView());
|
|
15
30
|
return true;
|
|
16
31
|
};
|
|
@@ -24,7 +39,7 @@ function getCodeData(data) {
|
|
|
24
39
|
}
|
|
25
40
|
else
|
|
26
41
|
return null;
|
|
27
|
-
return { editor, mode, value: data.getData(DataTransferType.Text) };
|
|
42
|
+
return { editor, mode, value: dd(data.getData(DataTransferType.Text)) };
|
|
28
43
|
}
|
|
29
44
|
return null;
|
|
30
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-paste.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/handle-paste.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handle-paste.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/handle-paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3B,OAAO,EAAC,kBAAkB,EAAC,+BAAc;AACzC,OAAO,EAAC,QAAQ,EAAC,6BAAkB;AAEnC,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAC,oCAA4B;AAEnF,OAAO,EAAC,iBAAiB,EAAC,kCAAyB;AACnD,OAAO,EAAC,aAAa,EAAC,mBAAgB;AAEtC,MAAM,CAAC,MAAM,WAAW,GAA4C,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;IAC5E,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACvF,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QACjC,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,wBAAwB;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,IAAI;QACrB,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK;QAClB,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK;KACnC,CAAC,CAAC;IAEH,MAAM,EAAC,EAAE,EAAE,MAAM,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAC9C,EAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAC,EACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAC1B,CAAC;QACF,EAAE,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACJ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,SAAS,WAAW,CAAC,IAAkB;IACnC,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,MAAM,GAAG,SAAS,CAAC;QACvB,IAAI,IAAwB,CAAC;QAE7B,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,MAAM,GAAG,QAAQ,CAAC;YAClB,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;QAC1C,CAAC;;YAAM,OAAO,IAAI,CAAC;QAEnB,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import dd from 'ts-dedent';\n\nimport {getLoggerFromState} from '#core';\nimport {Fragment} from '#pm/model';\nimport type {EditorProps} from '#pm/view';\nimport {DataTransferType, isVSCode, tryParseVSCodeData} from 'src/utils/clipboard';\n\nimport {CodeBlockNodeAttr} from './CodeBlockSpecs';\nimport {codeBlockType} from './const';\n\nexport const handlePaste: NonNullable<EditorProps['handlePaste']> = (view, e) => {\n if (!e.clipboardData || view.state.selection.$from.parent.type.spec.code) return false;\n const code = getCodeData(e.clipboardData);\n if (!code) return false;\n\n getLoggerFromState(view.state).event({\n domEvent: 'paste',\n event: 'paste-from-code-editor',\n editor: code.editor,\n editorMode: code.mode,\n empty: !code.value,\n dataTypes: e.clipboardData.types,\n });\n\n const {tr, schema} = view.state;\n if (code.value) {\n const codeBlockNode = codeBlockType(schema).create(\n {[CodeBlockNodeAttr.Lang]: code.mode},\n schema.text(code.value),\n );\n tr.replaceSelectionWith(codeBlockNode);\n } else {\n tr.replaceWith(tr.selection.from, tr.selection.to, Fragment.empty);\n }\n view.dispatch(tr.scrollIntoView());\n return true;\n};\n\nfunction getCodeData(data: DataTransfer): null | {editor: string; mode?: string; value: string} {\n if (data.getData(DataTransferType.Text)) {\n let editor = 'unknown';\n let mode: string | undefined;\n\n if (isVSCode(data)) {\n editor = 'vscode';\n mode = tryParseVSCodeData(data)?.mode;\n } else return null;\n\n return {editor, mode, value: dd(data.getData(DataTransferType.Text))};\n }\n return null;\n}\n"]}
|
|
@@ -66,57 +66,42 @@ export const linkTooltipPlugin = (deps) => {
|
|
|
66
66
|
class SelectionTooltip {
|
|
67
67
|
normalizeUrl;
|
|
68
68
|
view;
|
|
69
|
+
show;
|
|
69
70
|
textNode;
|
|
70
71
|
textNodeRef;
|
|
71
|
-
isTooltipOpen = false;
|
|
72
72
|
manualHidden = false;
|
|
73
73
|
renderItem;
|
|
74
|
-
selectionTooltipProps = { show: false };
|
|
75
74
|
constructor(view, deps) {
|
|
76
75
|
this.normalizeUrl = normalizeUrlFactory(deps);
|
|
77
76
|
this.view = view;
|
|
78
|
-
this.
|
|
77
|
+
this.show = false;
|
|
78
|
+
this.update(view);
|
|
79
79
|
}
|
|
80
|
-
update(view
|
|
80
|
+
update(view) {
|
|
81
81
|
if (!view.dom.parentNode) {
|
|
82
82
|
this.hideTooltip();
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
const { state } = view;
|
|
86
|
-
|
|
87
|
-
return;
|
|
88
|
-
this.textNode = getTextNode(view.state);
|
|
86
|
+
this.textNode = getTextNode(state);
|
|
89
87
|
const prevRef = this.textNodeRef;
|
|
90
|
-
this.
|
|
91
|
-
if (!this.textNode || !this.textNodeRef) {
|
|
92
|
-
this.hideTooltip();
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
88
|
+
this.textNodeRef = this.view.dom.getElementsByClassName(className)[0];
|
|
95
89
|
if (prevRef !== this.textNodeRef) {
|
|
96
90
|
this.manualHidden = false;
|
|
97
91
|
}
|
|
98
|
-
if (this.manualHidden) {
|
|
92
|
+
if (this.manualHidden || !this.textNode || !this.textNodeRef) {
|
|
99
93
|
this.hideTooltip();
|
|
94
|
+
return;
|
|
100
95
|
}
|
|
101
|
-
|
|
102
|
-
this.renderTooltip({
|
|
103
|
-
show: true,
|
|
104
|
-
domElem: this.textNodeRef,
|
|
105
|
-
onCancel: () => this.cancelPopup(),
|
|
106
|
-
attrs: this.getMarkAttrs(),
|
|
107
|
-
onChange: this.changeAttrs.bind(this),
|
|
108
|
-
onOpenChange: this.onOpenChange,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
96
|
+
this.showTooltip();
|
|
111
97
|
}
|
|
112
98
|
destroy() {
|
|
113
|
-
this.
|
|
114
|
-
this.selectionTooltipProps = { show: false };
|
|
99
|
+
this.show = false;
|
|
115
100
|
this.renderItem?.remove();
|
|
116
101
|
this.renderItem = undefined;
|
|
117
102
|
}
|
|
118
103
|
onEscapeDown() {
|
|
119
|
-
if (this.
|
|
104
|
+
if (this.show) {
|
|
120
105
|
this.removePlaceholderLink(this.textNode);
|
|
121
106
|
this.manualHidden = true;
|
|
122
107
|
this.hideTooltip();
|
|
@@ -124,24 +109,23 @@ class SelectionTooltip {
|
|
|
124
109
|
}
|
|
125
110
|
return false;
|
|
126
111
|
}
|
|
127
|
-
updateTextNodeRef() {
|
|
128
|
-
const decoElem = this.view.dom.getElementsByClassName(className)[0];
|
|
129
|
-
this.textNodeRef = decoElem;
|
|
130
|
-
}
|
|
131
112
|
getMarkAttrs() {
|
|
132
113
|
const { textNode } = this;
|
|
133
114
|
const linkMark = textNode && findMark(textNode.node, linkType(this.view.state.schema));
|
|
134
115
|
return linkMark?.attrs;
|
|
135
116
|
}
|
|
136
|
-
|
|
137
|
-
this.renderTooltip({ show: false });
|
|
138
|
-
}
|
|
139
|
-
renderTooltip(props) {
|
|
140
|
-
this.isTooltipOpen = props.show;
|
|
141
|
-
this.selectionTooltipProps = props;
|
|
117
|
+
renderTooltip() {
|
|
142
118
|
this.renderItem = this.renderItem ?? this.createRenderItem();
|
|
143
119
|
this.renderItem.rerender();
|
|
144
120
|
}
|
|
121
|
+
hideTooltip() {
|
|
122
|
+
this.show = false;
|
|
123
|
+
this.renderTooltip();
|
|
124
|
+
}
|
|
125
|
+
showTooltip() {
|
|
126
|
+
this.show = true;
|
|
127
|
+
this.renderTooltip();
|
|
128
|
+
}
|
|
145
129
|
onOpenChange = (open, _e, reason) => {
|
|
146
130
|
if (open)
|
|
147
131
|
return;
|
|
@@ -149,10 +133,10 @@ class SelectionTooltip {
|
|
|
149
133
|
this.cancelPopup();
|
|
150
134
|
}
|
|
151
135
|
else {
|
|
152
|
-
this.
|
|
136
|
+
this.onOutsideClick();
|
|
153
137
|
}
|
|
154
138
|
};
|
|
155
|
-
|
|
139
|
+
onOutsideClick = () => {
|
|
156
140
|
this.removePlaceholderLink(this.textNode);
|
|
157
141
|
this.hideTooltip();
|
|
158
142
|
this.manualHidden = true;
|
|
@@ -193,7 +177,7 @@ class SelectionTooltip {
|
|
|
193
177
|
}
|
|
194
178
|
}
|
|
195
179
|
createRenderItem() {
|
|
196
|
-
return getReactRendererFromState(this.view.state).createItem('link-tooltip', () => (_jsx(ErrorLoggerBoundary, { children: _jsx(SelectionTooltipView, {
|
|
180
|
+
return getReactRendererFromState(this.view.state).createItem('link-tooltip', () => (_jsx(ErrorLoggerBoundary, { children: _jsx(SelectionTooltipView, { show: this.show, domElem: this.textNodeRef, onCancel: this.cancelPopup.bind(this), attrs: this.getMarkAttrs(), onChange: this.changeAttrs.bind(this), onOpenChange: this.onOpenChange }) })));
|
|
197
181
|
}
|
|
198
182
|
}
|
|
199
183
|
const SelectionTooltipView = (props) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/Link/plugins/LinkTooltipPlugin/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {type EditorState, Plugin, type PluginView, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByMark, findParentNode} from 'prosemirror-utils';\nimport {Decoration, DecorationSet, type EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../../core';\nimport {ErrorLoggerBoundary} from '../../../../../react-utils/ErrorBoundary';\nimport {findMark, isMarkActive} from '../../../../../utils/marks';\nimport {type RendererItem, getReactRendererFromState} from '../../../../behavior/ReactRenderer';\nimport {LinkAttr, linkType, normalizeUrlFactory} from '../../../index';\n\nimport {LinkForm} from './TooltipView';\n\nconst className = 'pm-link-focus-deco';\nconst placement: PopupPlacement = ['bottom-start', 'bottom-end', 'top-start', 'top-end'];\n\nfunction getTextNode(state: EditorState) {\n if (\n !(state.selection instanceof TextSelection) ||\n !state.selection.empty ||\n !isMarkActive(state, linkType(state.schema))\n )\n return null;\n\n const parent = findParentNode(Boolean)(state.selection);\n\n if (!parent) {\n return null;\n }\n\n const textNodes = findChildrenByMark(parent?.node, linkType(state.schema));\n\n const textNode = textNodes.find((n: {node: Node; pos: number}) => {\n const start = n.pos + parent.pos;\n const end = start + n.node.nodeSize;\n return start <= state.selection.from && end >= state.selection.from;\n })!;\n\n if (!textNode) return null;\n\n const absolutePos = textNode.pos + parent.pos + 1;\n\n return {\n ...textNode,\n absolutePos,\n parent,\n from: absolutePos,\n to: absolutePos + textNode.node.nodeSize,\n };\n}\n\nexport const linkTooltipPlugin = (deps: ExtensionDeps) => {\n let viewTooltip: SelectionTooltip | null = null;\n return new Plugin({\n view(view) {\n viewTooltip = new SelectionTooltip(view, deps);\n return viewTooltip;\n },\n props: {\n handleKeyDown: keydownHandler({\n Escape: () => viewTooltip?.onEscapeDown() ?? false,\n }),\n decorations(state) {\n const textNode = getTextNode(state);\n if (!textNode) return DecorationSet.empty;\n\n const {from, to} = textNode;\n return DecorationSet.create(state.doc, [\n Decoration.inline(from, to, {\n class: `pm-node-selected ${className}`,\n }),\n ]);\n },\n },\n });\n};\n\nclass SelectionTooltip implements PluginView {\n private normalizeUrl;\n\n private view: EditorView;\n\n private textNode?: ReturnType<typeof getTextNode>;\n private textNodeRef: HTMLElement | undefined;\n\n private isTooltipOpen = false;\n private manualHidden = false;\n\n private renderItem?: RendererItem;\n private selectionTooltipProps: SelectionTooltipViewBaseProps = {show: false};\n\n constructor(view: EditorView, deps: ExtensionDeps) {\n this.normalizeUrl = normalizeUrlFactory(deps);\n\n this.view = view;\n\n this.update(view, null);\n }\n\n update(view: EditorView, prevState?: EditorState | null) {\n if (!view.dom.parentNode) {\n this.hideTooltip();\n return;\n }\n\n const {state} = view;\n\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n this.textNode = getTextNode(view.state);\n\n const prevRef = this.textNodeRef;\n this.updateTextNodeRef();\n\n if (!this.textNode || !this.textNodeRef) {\n this.hideTooltip();\n return;\n }\n\n if (prevRef !== this.textNodeRef) {\n this.manualHidden = false;\n }\n\n if (this.manualHidden) {\n this.hideTooltip();\n } else {\n this.renderTooltip({\n show: true,\n domElem: this.textNodeRef,\n onCancel: () => this.cancelPopup(),\n attrs: this.getMarkAttrs(),\n onChange: this.changeAttrs.bind(this),\n onOpenChange: this.onOpenChange,\n });\n }\n }\n\n destroy() {\n this.isTooltipOpen = false;\n this.selectionTooltipProps = {show: false};\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown(): boolean {\n if (this.isTooltipOpen) {\n this.removePlaceholderLink(this.textNode);\n this.manualHidden = true;\n this.hideTooltip();\n return true;\n }\n\n return false;\n }\n\n private updateTextNodeRef() {\n const decoElem = this.view.dom.getElementsByClassName(className)[0];\n this.textNodeRef = decoElem as HTMLElement | undefined;\n }\n\n private getMarkAttrs() {\n const {textNode} = this;\n const linkMark = textNode && findMark(textNode.node, linkType(this.view.state.schema));\n return linkMark?.attrs;\n }\n\n private hideTooltip() {\n this.renderTooltip({show: false});\n }\n\n private renderTooltip(props: SelectionTooltipViewBaseProps) {\n this.isTooltipOpen = props.show;\n this.selectionTooltipProps = props;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n private onOpenChange: NonNullable<PopupProps['onOpenChange']> = (open, _e, reason) => {\n if (open) return;\n if (reason === 'escape-key') {\n this.cancelPopup();\n } else {\n this.onOutisdeClick();\n }\n };\n\n private onOutisdeClick = () => {\n this.removePlaceholderLink(this.textNode);\n this.hideTooltip();\n this.manualHidden = true;\n };\n\n private cancelPopup() {\n this.removePlaceholderLink(this.textNode, {returnSelection: true});\n this.manualHidden = true;\n this.hideTooltip();\n this.view.focus();\n }\n\n private removePlaceholderLink(\n textNode?: ReturnType<typeof getTextNode>,\n opts?: {returnSelection?: boolean},\n ) {\n if (textNode) {\n const {view} = this;\n const {state} = view;\n const attrs = findMark(textNode.node, linkType(state.schema))?.attrs;\n if (attrs?.[LinkAttr.IsPlaceholder]) {\n const {from, to} = textNode;\n let tr = state.tr.removeMark(from, to, linkType(state.schema));\n if (opts?.returnSelection) {\n tr = tr.setSelection(TextSelection.create(tr.doc, from, to));\n }\n view.dispatch(tr);\n }\n }\n }\n\n private changeAttrs({href}: {href: string}) {\n const {view, textNode} = this;\n if (!textNode) return;\n\n const normalizeResult = this.normalizeUrl(href);\n if (normalizeResult) {\n const {url} = normalizeResult;\n const {from, to} = textNode;\n\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(to)));\n tr.addMark(from, to, linkType(view.state.schema).create({href: url}));\n view.dispatch(tr);\n }\n }\n\n private createRenderItem() {\n return getReactRendererFromState(this.view.state).createItem('link-tooltip', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltipView {...this.selectionTooltipProps} />\n </ErrorLoggerBoundary>\n ));\n }\n}\ntype SelectionTooltipViewBaseProps<T = boolean> = T extends false\n ? {\n show: T;\n }\n : {\n show: T;\n domElem: HTMLElement;\n onCancel: () => void;\n onChange: (opts: {href: string}) => void;\n attrs?: {[LinkAttr.Href]?: string; [LinkAttr.IsPlaceholder]?: boolean};\n } & Pick<PopupProps, 'onOpenChange'>;\n\ntype SelectionTooltipViewProps = SelectionTooltipViewBaseProps;\n\nconst SelectionTooltipView: React.FC<SelectionTooltipViewProps> = (props) => {\n const {show} = props;\n\n if (!show) return null;\n\n const {domElem, onChange, onCancel, onOpenChange, attrs = {}} = props;\n const href = attrs[LinkAttr.Href];\n const autoFocus = attrs[LinkAttr.IsPlaceholder];\n\n return (\n <Popup\n open\n key={href}\n anchorElement={domElem}\n placement={placement}\n onOpenChange={onOpenChange}\n >\n <LinkForm\n href={href ?? ''}\n autoFocus={autoFocus}\n onChange={onChange}\n onCancel={onCancel}\n />\n </Popup>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/Link/plugins/LinkTooltipPlugin/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAuC,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAmB,MAAM,EAAmB,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAC3F,oCAAoC;AACpC,OAAO,EAAC,kBAAkB,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAC,UAAU,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAG5E,OAAO,EAAC,mBAAmB,EAAC,oDAAiD;AAC7E,OAAO,EAAC,QAAQ,EAAE,YAAY,EAAC,sCAAmC;AAClE,OAAO,EAAoB,yBAAyB,EAAC,oDAA2C;AAChG,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAC,0BAAuB;AAEvE,OAAO,EAAC,QAAQ,EAAC,yBAAsB;AAEvC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AACvC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAEzF,SAAS,WAAW,CAAC,KAAkB;IACnC,IACI,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,aAAa,CAAC;QAC3C,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK;QACtB,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC;IAEhB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3E,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,OAAO,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;IACxE,CAAC,CAAE,CAAC;IAEJ,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAElD,OAAO;QACH,GAAG,QAAQ;QACX,WAAW;QACX,MAAM;QACN,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ;KAC3C,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAmB,EAAE,EAAE;IACrD,IAAI,WAAW,GAA4B,IAAI,CAAC;IAChD,OAAO,IAAI,MAAM,CAAC;QACd,IAAI,CAAC,IAAI;YACL,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/C,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,KAAK,EAAE;YACH,aAAa,EAAE,cAAc,CAAC;gBAC1B,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,KAAK;aACrD,CAAC;YACF,WAAW,CAAC,KAAK;gBACb,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,CAAC,QAAQ;oBAAE,OAAO,aAAa,CAAC,KAAK,CAAC;gBAE1C,MAAM,EAAC,IAAI,EAAE,EAAE,EAAC,GAAG,QAAQ,CAAC;gBAC5B,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBACnC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;wBACxB,KAAK,EAAE,oBAAoB,SAAS,EAAE;qBACzC,CAAC;iBACL,CAAC,CAAC;YACP,CAAC;SACJ;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,gBAAgB;IACV,YAAY,CAAC;IAEb,IAAI,CAAa;IACjB,IAAI,CAAU;IAEd,QAAQ,CAAkC;IAC1C,WAAW,CAA0B;IAErC,YAAY,GAAG,KAAK,CAAC;IAErB,UAAU,CAAgB;IAElC,YAAY,IAAgB,EAAE,IAAmB;QAC7C,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAElB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAErD,CAAC;QAEhB,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAED,YAAY;QACR,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,YAAY;QAChB,MAAM,EAAC,QAAQ,EAAC,GAAG,IAAI,CAAC;QACxB,MAAM,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACvF,OAAO,QAAQ,EAAE,KAAK,CAAC;IAC3B,CAAC;IAEO,aAAa;QACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEO,YAAY,GAA4C,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;QACjF,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC,CAAC;IAEM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC,CAAC;IAEM,WAAW;QACf,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAC,eAAe,EAAE,IAAI,EAAC,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAEO,qBAAqB,CACzB,QAAyC,EACzC,IAAkC;QAElC,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;YACpB,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;YACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC;YACrE,IAAI,KAAK,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClC,MAAM,EAAC,IAAI,EAAE,EAAE,EAAC,GAAG,QAAQ,CAAC;gBAC5B,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/D,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC;oBACxB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjE,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,EAAC,IAAI,EAAiB;QACtC,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,EAAC,GAAG,EAAC,GAAG,eAAe,CAAC;YAC9B,MAAM,EAAC,IAAI,EAAE,EAAE,EAAC,GAAG,QAAQ,CAAC;YAE5B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACL,CAAC;IAEO,gBAAgB;QACpB,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAC/E,KAAC,mBAAmB,cAChB,KAAC,oBAAoB,IACjB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,OAAO,EAAE,IAAI,CAAC,WAA0B,EACxC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACrC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,EAC1B,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACrC,YAAY,EAAE,IAAI,CAAC,YAAY,GACjC,GACgB,CACzB,CAAC,CAAC;IACP,CAAC;CACJ;AAeD,MAAM,oBAAoB,GAAwC,CAAC,KAAK,EAAE,EAAE;IACxE,MAAM,EAAC,IAAI,EAAC,GAAG,KAAK,CAAC;IAErB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,EAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,GAAG,EAAE,EAAC,GAAG,KAAK,CAAC;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEhD,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QAEJ,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,YAE1B,KAAC,QAAQ,IACL,IAAI,EAAE,IAAI,IAAI,EAAE,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,GACpB,IAVG,IAAI,CAWL,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {type EditorState, Plugin, type PluginView, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByMark, findParentNode} from 'prosemirror-utils';\nimport {Decoration, DecorationSet, type EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../../core';\nimport {ErrorLoggerBoundary} from '../../../../../react-utils/ErrorBoundary';\nimport {findMark, isMarkActive} from '../../../../../utils/marks';\nimport {type RendererItem, getReactRendererFromState} from '../../../../behavior/ReactRenderer';\nimport {LinkAttr, linkType, normalizeUrlFactory} from '../../../index';\n\nimport {LinkForm} from './TooltipView';\n\nconst className = 'pm-link-focus-deco';\nconst placement: PopupPlacement = ['bottom-start', 'bottom-end', 'top-start', 'top-end'];\n\nfunction getTextNode(state: EditorState) {\n if (\n !(state.selection instanceof TextSelection) ||\n !state.selection.empty ||\n !isMarkActive(state, linkType(state.schema))\n )\n return null;\n\n const parent = findParentNode(Boolean)(state.selection);\n\n if (!parent) {\n return null;\n }\n\n const textNodes = findChildrenByMark(parent?.node, linkType(state.schema));\n\n const textNode = textNodes.find((n: {node: Node; pos: number}) => {\n const start = n.pos + parent.pos;\n const end = start + n.node.nodeSize;\n return start <= state.selection.from && end >= state.selection.from;\n })!;\n\n if (!textNode) return null;\n\n const absolutePos = textNode.pos + parent.pos + 1;\n\n return {\n ...textNode,\n absolutePos,\n parent,\n from: absolutePos,\n to: absolutePos + textNode.node.nodeSize,\n };\n}\n\nexport const linkTooltipPlugin = (deps: ExtensionDeps) => {\n let viewTooltip: SelectionTooltip | null = null;\n return new Plugin({\n view(view) {\n viewTooltip = new SelectionTooltip(view, deps);\n return viewTooltip;\n },\n props: {\n handleKeyDown: keydownHandler({\n Escape: () => viewTooltip?.onEscapeDown() ?? false,\n }),\n decorations(state) {\n const textNode = getTextNode(state);\n if (!textNode) return DecorationSet.empty;\n\n const {from, to} = textNode;\n return DecorationSet.create(state.doc, [\n Decoration.inline(from, to, {\n class: `pm-node-selected ${className}`,\n }),\n ]);\n },\n },\n });\n};\n\nclass SelectionTooltip implements PluginView {\n private normalizeUrl;\n\n private view: EditorView;\n private show: boolean;\n\n private textNode?: ReturnType<typeof getTextNode>;\n private textNodeRef: HTMLElement | undefined;\n\n private manualHidden = false;\n\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, deps: ExtensionDeps) {\n this.normalizeUrl = normalizeUrlFactory(deps);\n\n this.view = view;\n this.show = false;\n\n this.update(view);\n }\n\n update(view: EditorView) {\n if (!view.dom.parentNode) {\n this.hideTooltip();\n return;\n }\n\n const {state} = view;\n\n this.textNode = getTextNode(state);\n\n const prevRef = this.textNodeRef;\n this.textNodeRef = this.view.dom.getElementsByClassName(className)[0] as\n | HTMLElement\n | undefined;\n\n if (prevRef !== this.textNodeRef) {\n this.manualHidden = false;\n }\n\n if (this.manualHidden || !this.textNode || !this.textNodeRef) {\n this.hideTooltip();\n return;\n }\n\n this.showTooltip();\n }\n\n destroy() {\n this.show = false;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown(): boolean {\n if (this.show) {\n this.removePlaceholderLink(this.textNode);\n this.manualHidden = true;\n this.hideTooltip();\n return true;\n }\n\n return false;\n }\n\n private getMarkAttrs() {\n const {textNode} = this;\n const linkMark = textNode && findMark(textNode.node, linkType(this.view.state.schema));\n return linkMark?.attrs;\n }\n\n private renderTooltip() {\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n private hideTooltip() {\n this.show = false;\n this.renderTooltip();\n }\n\n private showTooltip() {\n this.show = true;\n this.renderTooltip();\n }\n\n private onOpenChange: NonNullable<PopupProps['onOpenChange']> = (open, _e, reason) => {\n if (open) return;\n if (reason === 'escape-key') {\n this.cancelPopup();\n } else {\n this.onOutsideClick();\n }\n };\n\n private onOutsideClick = () => {\n this.removePlaceholderLink(this.textNode);\n this.hideTooltip();\n this.manualHidden = true;\n };\n\n private cancelPopup() {\n this.removePlaceholderLink(this.textNode, {returnSelection: true});\n this.manualHidden = true;\n this.hideTooltip();\n this.view.focus();\n }\n\n private removePlaceholderLink(\n textNode?: ReturnType<typeof getTextNode>,\n opts?: {returnSelection?: boolean},\n ) {\n if (textNode) {\n const {view} = this;\n const {state} = view;\n const attrs = findMark(textNode.node, linkType(state.schema))?.attrs;\n if (attrs?.[LinkAttr.IsPlaceholder]) {\n const {from, to} = textNode;\n let tr = state.tr.removeMark(from, to, linkType(state.schema));\n if (opts?.returnSelection) {\n tr = tr.setSelection(TextSelection.create(tr.doc, from, to));\n }\n view.dispatch(tr);\n }\n }\n }\n\n private changeAttrs({href}: {href: string}) {\n const {view, textNode} = this;\n if (!textNode) return;\n\n const normalizeResult = this.normalizeUrl(href);\n if (normalizeResult) {\n const {url} = normalizeResult;\n const {from, to} = textNode;\n\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(to)));\n tr.addMark(from, to, linkType(view.state.schema).create({href: url}));\n view.dispatch(tr);\n }\n }\n\n private createRenderItem() {\n return getReactRendererFromState(this.view.state).createItem('link-tooltip', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltipView\n show={this.show}\n domElem={this.textNodeRef as HTMLElement}\n onCancel={this.cancelPopup.bind(this)}\n attrs={this.getMarkAttrs()}\n onChange={this.changeAttrs.bind(this)}\n onOpenChange={this.onOpenChange}\n />\n </ErrorLoggerBoundary>\n ));\n }\n}\ntype SelectionTooltipViewBaseProps<T = boolean> = T extends false\n ? {\n show: T;\n }\n : {\n show: T;\n domElem: HTMLElement;\n onCancel: () => void;\n onChange: (opts: {href: string}) => void;\n attrs?: {[LinkAttr.Href]?: string; [LinkAttr.IsPlaceholder]?: boolean};\n } & Pick<PopupProps, 'onOpenChange'>;\n\ntype SelectionTooltipViewProps = SelectionTooltipViewBaseProps;\n\nconst SelectionTooltipView: React.FC<SelectionTooltipViewProps> = (props) => {\n const {show} = props;\n\n if (!show) return null;\n\n const {domElem, onChange, onCancel, onOpenChange, attrs = {}} = props;\n const href = attrs[LinkAttr.Href];\n const autoFocus = attrs[LinkAttr.IsPlaceholder];\n\n return (\n <Popup\n open\n key={href}\n anchorElement={domElem}\n placement={placement}\n onOpenChange={onOpenChange}\n >\n <LinkForm\n href={href ?? ''}\n autoFocus={autoFocus}\n onChange={onChange}\n onCancel={onCancel}\n />\n </Popup>\n );\n};\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export declare const i18n: <G extends "block" | "checkbox" | "heading" | "codeblock" | "doc_empty" | "deflist_term" | "deflist_desc" | "cut_title" | "cut_content" | "note_title" | "note_content" | "layout_cell" | "table_cell" | "select_filter", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
1
|
+
export declare const i18n: <G extends "block" | "checkbox" | "heading" | "codeblock" | "doc_empty" | "doc_empty_mobile" | "deflist_term" | "deflist_desc" | "cut_title" | "cut_content" | "note_title" | "note_content" | "layout_cell" | "table_cell" | "select_filter", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
2
2
|
[key: string]: any;
|
|
3
3
|
}) => S extends G ? {
|
|
4
4
|
doc_empty: string;
|
|
5
|
+
doc_empty_mobile: string;
|
|
5
6
|
checkbox: string;
|
|
6
7
|
codeblock: string;
|
|
7
8
|
deflist_term: string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"doc_empty": "Начните писать текст или введите \"/\", чтобы открыть список команд",
|
|
3
|
+
"doc_empty_mobile": "Начните писать текст",
|
|
3
4
|
"checkbox": "Добавьте описание задачи или пункт проверки",
|
|
4
5
|
"codeblock": "Добавьте в блок код или текст",
|
|
5
6
|
"deflist_term": "Термин",
|
|
@@ -19,7 +19,7 @@ export function FlexToolbar(props) {
|
|
|
19
19
|
duration: time,
|
|
20
20
|
});
|
|
21
21
|
});
|
|
22
|
-
const { data, className, hiddenActions } = props;
|
|
22
|
+
const { data, className, hiddenActions, disableTooltip, disablePreview, disableHotkey, display = 'shrink', } = props;
|
|
23
23
|
const [ref, { width }] = useMeasure();
|
|
24
24
|
const { data: items, dots } = useMemo(() => {
|
|
25
25
|
const toolbarButtonIds = data.reduce((a, toolbarGroup) => {
|
|
@@ -37,12 +37,18 @@ export function FlexToolbar(props) {
|
|
|
37
37
|
}, []);
|
|
38
38
|
// Finding only actions tha are not present in the main toolbar config
|
|
39
39
|
const filteredHiddenAction = hiddenActions?.filter((a) => !toolbarButtonIds.includes(a.id));
|
|
40
|
+
if (display === 'scroll') {
|
|
41
|
+
return {
|
|
42
|
+
data,
|
|
43
|
+
dots: filteredHiddenAction?.length ? filteredHiddenAction : undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
40
46
|
return shrinkToolbarData({
|
|
41
47
|
data,
|
|
42
48
|
availableWidth: width,
|
|
43
49
|
hiddenActions: filteredHiddenAction,
|
|
44
50
|
});
|
|
45
|
-
}, [data,
|
|
46
|
-
return (_jsx("div", { ref: ref, className: b(null, [className]), children: _jsxs("div", { className: b('container'), children: [_jsx(Toolbar, { ...props, data: items, className: b('bar') }), dots?.length && (_jsx(ToolbarListButton, { qa: "g-md-toolbar-more-action", qaMenu: "g-md-toolbar-additional", data: dots, icon: { data: Ellipsis }, title: props.dotsTitle, editor: props.editor, focus: props.focus, onClick: props.onClick, className: b('dots'), alwaysActive: true }))] }) }));
|
|
51
|
+
}, [data, display, hiddenActions, width]);
|
|
52
|
+
return (_jsx("div", { ref: ref, className: b(null, [className]), children: _jsxs("div", { className: b('container'), children: [_jsx(Toolbar, { ...props, data: items, className: b('bar') }), dots?.length && (_jsx(ToolbarListButton, { qa: "g-md-toolbar-more-action", qaMenu: "g-md-toolbar-additional", data: dots, icon: { data: Ellipsis }, title: props.dotsTitle, editor: props.editor, focus: props.focus, onClick: props.onClick, className: b('dots'), alwaysActive: true, disableTooltip: disableTooltip, disableHotkey: disablePreview, disablePreview: disableHotkey }))] }) }));
|
|
47
53
|
}
|
|
48
54
|
//# sourceMappingURL=FlexToolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlexToolbar.js","sourceRoot":"../../../src","sources":["toolbar/FlexToolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAErC,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAChC,OAAO,EAAC,MAAM,EAAC,qBAAkB;AACjC,OAAO,EAAC,aAAa,EAAC,gCAA6B;AAEnD,OAAO,EAAC,OAAO,EAAoB,qBAAkB;AACrD,OAAO,EAAC,iBAAiB,EAAC,+BAA4B;AACtD,OAAO,EAAC,iBAAiB,EAAC,sBAAmB;AAC7C,OAAO,EAAC,eAAe,EAAuB,mBAAgB;AAE9D,2BAA4B;AAE5B,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC;AAO7B,MAAM,UAAU,WAAW,CAAI,KAA0B;IACrD,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,MAAM,CAAC,OAAO,CAAC;YACX,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,
|
|
1
|
+
{"version":3,"file":"FlexToolbar.js","sourceRoot":"../../../src","sources":["toolbar/FlexToolbar.tsx"],"names":[],"mappings":"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","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 {\n data,\n className,\n hiddenActions,\n disableTooltip,\n disablePreview,\n disableHotkey,\n display = 'shrink',\n } = 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\n if (display === 'scroll') {\n return {\n data,\n dots: filteredHiddenAction?.length ? filteredHiddenAction : undefined,\n };\n }\n\n return shrinkToolbarData({\n data,\n availableWidth: width,\n hiddenActions: filteredHiddenAction,\n });\n }, [data, display, hiddenActions, width]);\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-additional\"\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 disableTooltip={disableTooltip}\n disableHotkey={disablePreview}\n disablePreview={disableHotkey}\n />\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -4,9 +4,9 @@ import { cn } from "../classname.js";
|
|
|
4
4
|
import { ToolbarTooltipDelay } from "./const.js";
|
|
5
5
|
import "./PreviewTooltip.css";
|
|
6
6
|
const b = cn('preview-tooltip');
|
|
7
|
-
export const PreviewTooltip = ({ preview, children }) => {
|
|
8
|
-
if (!preview)
|
|
7
|
+
export const PreviewTooltip = ({ preview, children, disabled }) => {
|
|
8
|
+
if (!preview || disabled)
|
|
9
9
|
return children;
|
|
10
|
-
return (_jsx(Tooltip, { placement: ['right', 'left'], className: b(),
|
|
10
|
+
return (_jsx(Tooltip, { placement: ['right', 'left'], className: b(), openDelay: ToolbarTooltipDelay.Open, closeDelay: ToolbarTooltipDelay.Close, content: _jsx("div", { className: b('content'), children: preview }), children: children }));
|
|
11
11
|
};
|
|
12
12
|
//# sourceMappingURL=PreviewTooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewTooltip.js","sourceRoot":"../../../src","sources":["toolbar/PreviewTooltip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAEhC,OAAO,EAAC,mBAAmB,EAAC,mBAAgB;AAE5C,8BAA+B;AAE/B,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"PreviewTooltip.js","sourceRoot":"../../../src","sources":["toolbar/PreviewTooltip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAEhC,OAAO,EAAC,mBAAmB,EAAC,mBAAgB;AAE5C,8BAA+B;AAE/B,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAQhC,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC3F,IAAI,CAAC,OAAO,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE1C,OAAO,CACH,KAAC,OAAO,IACJ,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAC5B,SAAS,EAAE,CAAC,EAAE,EACd,SAAS,EAAE,mBAAmB,CAAC,IAAI,EACnC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EACrC,OAAO,EAAE,cAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YAAG,OAAO,GAAO,YAErD,QAAQ,GACH,CACb,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {Tooltip} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\n\nimport {ToolbarTooltipDelay} from './const';\n\nimport './PreviewTooltip.scss';\n\nconst b = cn('preview-tooltip');\n\ntype PreviewTooltipProps = {\n preview?: React.ReactNode;\n children: React.ReactElement;\n disabled?: boolean;\n};\n\nexport const PreviewTooltip: React.FC<PreviewTooltipProps> = ({preview, children, disabled}) => {\n if (!preview || disabled) return children;\n\n return (\n <Tooltip\n placement={['right', 'left']}\n className={b()}\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n content={<div className={b('content')}>{preview}</div>}\n >\n {children}\n </Tooltip>\n );\n};\n"]}
|
|
@@ -4,4 +4,4 @@ export type { ToolbarData };
|
|
|
4
4
|
export type ToolbarProps<E> = ToolbarBaseProps<E> & {
|
|
5
5
|
data: ToolbarData<E>;
|
|
6
6
|
};
|
|
7
|
-
export declare function Toolbar<E>({ editor, data, className, focus, onClick, qa }: ToolbarProps<E>): JSX.Element;
|
|
7
|
+
export declare function Toolbar<E>({ editor, data, className, focus, onClick, display, qa, disableHotkey, disablePreview, disableTooltip, }: ToolbarProps<E>): JSX.Element;
|
|
@@ -4,10 +4,10 @@ import { cn } from "../classname.js";
|
|
|
4
4
|
import { ToolbarButtonGroup } from "./ToolbarGroup.js";
|
|
5
5
|
import "./Toolbar.css";
|
|
6
6
|
const b = cn('toolbar');
|
|
7
|
-
export function Toolbar({ editor, data, className, focus, onClick, qa }) {
|
|
8
|
-
return (_jsx("div", { className: b(
|
|
7
|
+
export function Toolbar({ editor, data, className, focus, onClick, display, qa, disableHotkey, disablePreview, disableTooltip, }) {
|
|
8
|
+
return (_jsx("div", { className: b({ display }, [className]), "data-qa": qa, children: data.map((group, index) => {
|
|
9
9
|
const isLastGroup = index === data.length - 1;
|
|
10
|
-
return (_jsxs(Fragment, { children: [_jsx(ToolbarButtonGroup, { data: group, editor: editor, focus: focus, onClick: onClick, className: b('group') }), isLastGroup || _jsx("div", { className: b('group-separator') })] }, index));
|
|
10
|
+
return (_jsxs(Fragment, { children: [_jsx(ToolbarButtonGroup, { data: group, editor: editor, focus: focus, onClick: onClick, className: b('group'), disableHotkey: disableHotkey, disablePreview: disablePreview, disableTooltip: disableTooltip }), isLastGroup || _jsx("div", { className: b('group-separator') })] }, index));
|
|
11
11
|
}) }));
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sourceRoot":"../../../src","sources":["toolbar/Toolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAEhC,OAAO,EAAC,kBAAkB,EAAC,0BAAuB;AAGlD,uBAAwB;AAExB,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAQxB,MAAM,UAAU,OAAO,CAAI,
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"../../../src","sources":["toolbar/Toolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,EAAE,EAAC,wBAAqB;AAEhC,OAAO,EAAC,kBAAkB,EAAC,0BAAuB;AAGlD,uBAAwB;AAExB,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAQxB,MAAM,UAAU,OAAO,CAAI,EACvB,MAAM,EACN,IAAI,EACJ,SAAS,EACT,KAAK,EACL,OAAO,EACP,OAAO,EACP,EAAE,EACF,aAAa,EACb,cAAc,EACd,cAAc,GACA;IACd,OAAO,CACH,cAAK,SAAS,EAAE,CAAC,CAAC,EAAC,OAAO,EAAC,EAAE,CAAC,SAAS,CAAC,CAAC,aAAW,EAAE,YACjD,IAAI,CAAC,GAAG,CAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,WAAW,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAE9C,OAAO,CACH,MAAC,QAAQ,eACL,KAAC,kBAAkB,IACf,IAAI,EAAE,KAAK,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,EACrB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAChC,EACD,WAAW,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAI,KAX7C,KAAK,CAYT,CACd,CAAC;QACN,CAAC,CAAC,GACA,CACT,CAAC;AACN,CAAC","sourcesContent":["import {Fragment} from 'react';\n\nimport {cn} from '../classname';\n\nimport {ToolbarButtonGroup} from './ToolbarGroup';\nimport type {ToolbarBaseProps, ToolbarData} from './types';\n\nimport './Toolbar.scss';\n\nconst b = cn('toolbar');\n\nexport type {ToolbarData};\n\nexport type ToolbarProps<E> = ToolbarBaseProps<E> & {\n data: ToolbarData<E>;\n};\n\nexport function Toolbar<E>({\n editor,\n data,\n className,\n focus,\n onClick,\n display,\n qa,\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarProps<E>) {\n return (\n <div className={b({display}, [className])} data-qa={qa}>\n {data.map<React.ReactNode>((group, index) => {\n const isLastGroup = index === data.length - 1;\n\n return (\n <Fragment key={index}>\n <ToolbarButtonGroup\n data={group}\n editor={editor}\n focus={focus}\n onClick={onClick}\n className={b('group')}\n disableHotkey={disableHotkey}\n disablePreview={disablePreview}\n disableTooltip={disableTooltip}\n />\n {isLastGroup || <div className={b('group-separator')} />}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"]}
|
|
@@ -10,6 +10,6 @@ export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'h
|
|
|
10
10
|
className?: string;
|
|
11
11
|
} & (Pick<ToolbarItemData<unknown>, 'icon'> | {
|
|
12
12
|
children: ReactNode;
|
|
13
|
-
})
|
|
13
|
+
}) & Pick<ToolbarBaseProps<unknown>, 'disableTooltip'>;
|
|
14
14
|
export declare const ToolbarButtonView: import("react").ForwardRefExoticComponent<ToolbarButtonViewProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
15
15
|
export declare function ToolbarButton<E>(props: ToolbarButtonProps<E>): JSX.Element;
|