@gravity-ui/markdown-editor 15.31.0 → 15.33.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/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +95 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -30
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +27 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +5 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +55 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +80 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +9 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js +6 -12
- package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +8 -0
- package/build/cjs/extensions/markdown/CodeBlock/index.js +4 -0
- package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/paste.d.ts +1 -0
- package/build/cjs/extensions/yfm/YfmTable/paste.js +28 -0
- package/build/cjs/extensions/yfm/YfmTable/paste.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js +3 -1
- package/build/cjs/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js.map +1 -1
- package/build/cjs/i18n/codeblock/en.json +1 -0
- package/build/cjs/i18n/codeblock/index.d.ts +2 -1
- package/build/cjs/i18n/codeblock/ru.json +1 -0
- package/build/cjs/i18n/viewer/en.json +3 -0
- package/build/cjs/i18n/viewer/index.d.ts +5 -0
- package/build/cjs/i18n/viewer/index.js +10 -0
- package/build/cjs/i18n/viewer/index.js.map +1 -0
- package/build/cjs/i18n/viewer/ru.json +3 -0
- package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -1
- package/build/cjs/plugins/BaseTooltip/index.js +1 -1
- package/build/cjs/plugins/BaseTooltip/index.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/types.d.ts +1 -0
- package/build/cjs/toolbar/types.js.map +1 -1
- package/build/cjs/types/node-view.d.ts +11 -0
- package/build/cjs/types/node-view.js +3 -0
- package/build/cjs/types/node-view.js.map +1 -0
- package/build/cjs/utils/clipboard.d.ts +1 -0
- package/build/cjs/utils/clipboard.js +7 -0
- package/build/cjs/utils/clipboard.js.map +1 -1
- package/build/cjs/utils/truthy.d.ts +4 -0
- package/build/cjs/utils/truthy.js +11 -0
- package/build/cjs/utils/truthy.js.map +1 -0
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/cjs/view/hocs/index.d.ts +1 -0
- package/build/cjs/view/hocs/index.js +5 -0
- package/build/cjs/view/hocs/index.js.map +1 -0
- package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
- package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js +16 -0
- package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
- package/build/cjs/view/hocs/withCodeBlockActions/index.d.ts +15 -0
- package/build/cjs/view/hocs/withCodeBlockActions/index.js +63 -0
- package/build/cjs/view/hocs/withCodeBlockActions/index.js.map +1 -0
- package/build/cjs/view/hocs/withCodeBlockActions/styles.css +27 -0
- package/build/cjs/view/index.d.ts +1 -0
- package/build/cjs/view/index.js +1 -0
- package/build/cjs/view/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +91 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +57 -33
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +21 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +2 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +51 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +72 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +6 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/handle-paste.js +7 -13
- package/build/esm/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/index.d.ts +8 -0
- package/build/esm/extensions/markdown/CodeBlock/index.js +4 -0
- package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/paste.d.ts +1 -0
- package/build/esm/extensions/yfm/YfmTable/paste.js +28 -1
- package/build/esm/extensions/yfm/YfmTable/paste.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js +4 -2
- package/build/esm/extensions/yfm/YfmTable/plugins/yfmTableTransformPastedPlugin.js.map +1 -1
- package/build/esm/i18n/codeblock/en.json +1 -0
- package/build/esm/i18n/codeblock/index.d.ts +2 -1
- package/build/esm/i18n/codeblock/ru.json +1 -0
- package/build/esm/i18n/viewer/en.json +3 -0
- package/build/esm/i18n/viewer/index.d.ts +5 -0
- package/build/esm/i18n/viewer/index.js +6 -0
- package/build/esm/i18n/viewer/index.js.map +1 -0
- package/build/esm/i18n/viewer/ru.json +3 -0
- package/build/esm/plugins/BaseTooltip/index.d.ts +1 -1
- package/build/esm/plugins/BaseTooltip/index.js +1 -1
- package/build/esm/plugins/BaseTooltip/index.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/types.d.ts +1 -0
- package/build/esm/toolbar/types.js.map +1 -1
- package/build/esm/types/node-view.d.ts +11 -0
- package/build/esm/types/node-view.js +2 -0
- package/build/esm/types/node-view.js.map +1 -0
- package/build/esm/utils/clipboard.d.ts +1 -0
- package/build/esm/utils/clipboard.js +6 -0
- package/build/esm/utils/clipboard.js.map +1 -1
- package/build/esm/utils/truthy.d.ts +4 -0
- package/build/esm/utils/truthy.js +7 -0
- package/build/esm/utils/truthy.js.map +1 -0
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/view/hocs/index.d.ts +1 -0
- package/build/esm/view/hocs/index.js +2 -0
- package/build/esm/view/hocs/index.js.map +1 -0
- package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
- package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js +13 -0
- package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
- package/build/esm/view/hocs/withCodeBlockActions/index.d.ts +15 -0
- package/build/esm/view/hocs/withCodeBlockActions/index.js +60 -0
- package/build/esm/view/hocs/withCodeBlockActions/index.js.map +1 -0
- package/build/esm/view/hocs/withCodeBlockActions/styles.css +27 -0
- package/build/esm/view/index.d.ts +1 -0
- package/build/esm/view/index.js +1 -0
- package/build/esm/view/index.js.map +1 -1
- package/build/styles.css +46 -10
- package/package.json +1 -1
|
@@ -163,7 +163,7 @@ class BaseTooltipPluginView {
|
|
|
163
163
|
return null;
|
|
164
164
|
// hack for popup rerender
|
|
165
165
|
window.dispatchEvent(new CustomEvent('scroll'));
|
|
166
|
-
return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || exports.defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: (0, jsx_runtime_1.jsx)("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb) }) }));
|
|
166
|
+
return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || exports.defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: (0, jsx_runtime_1.jsx)("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb, undefined, undefined, () => this.render()) }) }));
|
|
167
167
|
}
|
|
168
168
|
createRenderItem() {
|
|
169
169
|
return (0, extensions_1.getReactRendererFromState)(this.view.state).createItem(this.idPrefix, () => this.currentNode && !this.manualHidden ? ((0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorLoggerBoundary, { children: this.renderContent(this.currentNode) })) : null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["plugins/BaseTooltip/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {Mark, MarkType, Node, NodeType} from 'prosemirror-model';\nimport {NodeSelection, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos, findParentNodeOfType, findSelectedNodeOfType} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../classname';\nimport {type RendererItem, getReactRendererFromState} from '../../extensions';\nimport {ErrorLoggerBoundary} from '../../react-utils/ErrorBoundary';\n\nimport './index.scss';\n\nexport type BaseTooltipNode = {\n pos: number;\n node: Node;\n dom: HTMLElement | null;\n};\n\nexport type TooltipContentCb = (\n view: EditorView,\n node: BaseTooltipNode,\n onChange?: (attrs: Record<string, string>) => void,\n forceEdit?: boolean,\n onOutsideClick?: () => void,\n) => React.ReactElement | null;\n\nexport interface BaseTooltipPluginOptions {\n idPrefix: string;\n content?: TooltipContentCb;\n nodeType: NodeType | MarkType;\n popupPlacement?: PopupPlacement;\n disableHideOnEscapeKeyDown?: boolean;\n}\n\nexport const BaseTooltipCn = cn('base-tooltip');\nexport const defaultPlacement: PopupPlacement = [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n];\nconst b = BaseTooltipCn;\nexport const baseTooltipContentCn = cn('base-tooltip-content');\n\nexport type TooltipOnChangeCallback = (\n attrs: Record<string, string>,\n options?: {setFocus?: boolean; setSelection?: boolean; hideTooltip?: boolean; marks?: Mark[]},\n) => void;\n\nexport type TooltipContentProps = {\n node: BaseTooltipNode;\n view: EditorView;\n onChange?: TooltipOnChangeCallback;\n toggleEdit?: () => void;\n};\n\nexport class BaseTooltipPluginView implements PluginView {\n protected view: EditorView;\n protected currentNode: BaseTooltipNode | null = null;\n protected readonly content?: TooltipContentCb;\n protected readonly nodeType: NodeType | MarkType;\n protected readonly popupPlacement?: PopupPlacement;\n protected manualHidden = false;\n protected destroyed = false;\n\n protected readonly disableHideOnEscapeKeyDown?: boolean;\n\n protected focusTrackingRafId: number | null = null;\n\n private readonly idPrefix: string;\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, options: BaseTooltipPluginOptions) {\n this.view = view;\n this.idPrefix = options.idPrefix;\n this.content = options.content;\n this.nodeType = options.nodeType;\n this.popupPlacement = options.popupPlacement;\n this.disableHideOnEscapeKeyDown = options.disableHideOnEscapeKeyDown;\n }\n\n update(view: EditorView) {\n this.view = view;\n\n this.updateTooltipView();\n }\n\n destroy() {\n this.destroyed = true;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown = (): boolean => {\n if (this.disableHideOnEscapeKeyDown) return false;\n if (this.currentNode && !this.manualHidden) {\n this.hidePopupManual();\n return true;\n }\n return false;\n };\n\n protected setCurrentNode(node: NodeType) {\n const view = this.view;\n const domAtPos = view.domAtPos.bind(view);\n\n const {selection} = view.state;\n const {$from, $to} = selection;\n\n const parent =\n findSelectedNodeOfType(node)(selection) || findParentNodeOfType(node)(selection);\n\n if (!parent || !$from.node(parent.depth).eq($to.node(parent.depth))) {\n this.currentNode = null;\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n return;\n }\n\n if (\n !this.currentNode ||\n !this.currentNode.node.eq(parent.node) ||\n this.currentNode.pos !== parent.pos\n ) {\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n }\n\n const {pos, node: parentNode} = parent;\n const dom = findDomRefAtPos(pos, domAtPos) as HTMLElement;\n\n this.currentNode = {\n pos,\n node: parentNode,\n dom,\n };\n }\n\n protected changeAttrsCb: TooltipOnChangeCallback = (attrs, options) => {\n if (this.currentNode) {\n let tr = this.view.state.tr.setNodeMarkup(\n this.currentNode.pos,\n undefined,\n {\n ...this.currentNode.node.attrs,\n ...attrs,\n },\n options?.marks || [],\n );\n\n if (options?.setSelection) {\n tr = tr.setSelection(NodeSelection.create(tr.doc, this.currentNode.pos));\n }\n\n this.view.dispatch(tr);\n\n if (options?.setFocus) {\n this.view.focus();\n }\n\n if (options?.hideTooltip) {\n this.hidePopupManual();\n }\n }\n };\n\n protected updateTooltipView() {\n const oldNode = this.currentNode;\n this.setCurrentNode(this.view.state.schema.nodes[this.nodeType.name]);\n\n // Do not rerender if we have the same node in selection\n if (\n oldNode &&\n this.currentNode?.node.eq(oldNode.node) &&\n this.currentNode.pos === oldNode.pos &&\n this.currentNode.dom === oldNode.dom\n )\n return;\n\n this.render();\n }\n\n protected render() {\n if (this.destroyed) return;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n protected onOutsideClick: PopupProps['onOutsideClick'] = () => {\n this.hidePopupManual();\n };\n\n protected popupOpenChangeHandler: PopupProps['onOpenChange'] = (open, event, reason) => {\n if (open) return;\n if (reason === 'focus-out' && (event as FocusEvent).relatedTarget === this.view.dom) return;\n if (this.disableHideOnEscapeKeyDown && reason === 'escape-key') return;\n\n this.hidePopupManual();\n\n requestAnimationFrame(() => {\n if (this.destroyed || this.view.hasFocus()) return;\n this.startTrackingViewFocus();\n });\n };\n\n protected startTrackingViewFocus() {\n this.focusTrackingRafId = requestAnimationFrame(() => {\n if (this.destroyed) return;\n if (this.view.hasFocus()) {\n this.focusTrackingRafId = null;\n this.manualHidden = false;\n this.render();\n return;\n }\n this.startTrackingViewFocus();\n });\n }\n\n protected stopTrackingViewFocus() {\n if (this.focusTrackingRafId !== null) {\n cancelAnimationFrame(this.focusTrackingRafId);\n this.focusTrackingRafId = null;\n }\n }\n\n protected hidePopupManual() {\n this.manualHidden = true;\n this.render();\n }\n\n protected renderContent(currentNode: BaseTooltipNode): React.ReactNode {\n if (!this.content) return null;\n // hack for popup rerender\n window.dispatchEvent(new CustomEvent('scroll'));\n return (\n <Popup\n open\n hasArrow={false}\n anchorElement={currentNode.dom}\n placement={this.popupPlacement || defaultPlacement}\n onOpenChange={this.popupOpenChangeHandler}\n >\n <div className={b()}>\n {this.content(this.view, currentNode, this.changeAttrsCb)}\n </div>\n </Popup>\n );\n }\n\n protected createRenderItem() {\n return getReactRendererFromState(this.view.state)!.createItem(this.idPrefix, () =>\n this.currentNode && !this.manualHidden ? (\n <ErrorLoggerBoundary>{this.renderContent(this.currentNode)}</ErrorLoggerBoundary>\n ) : null,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["plugins/BaseTooltip/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {Mark, MarkType, Node, NodeType} from 'prosemirror-model';\nimport {NodeSelection, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos, findParentNodeOfType, findSelectedNodeOfType} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../classname';\nimport {type RendererItem, getReactRendererFromState} from '../../extensions';\nimport {ErrorLoggerBoundary} from '../../react-utils/ErrorBoundary';\n\nimport './index.scss';\n\nexport type BaseTooltipNode = {\n pos: number;\n node: Node;\n dom: HTMLElement | null;\n};\n\nexport type TooltipContentCb = (\n view: EditorView,\n node: BaseTooltipNode,\n onChange?: (attrs: Record<string, string>) => void,\n forceEdit?: boolean,\n onOutsideClick?: () => void,\n rerender?: () => void,\n) => React.ReactElement | null;\n\nexport interface BaseTooltipPluginOptions {\n idPrefix: string;\n content?: TooltipContentCb;\n nodeType: NodeType | MarkType;\n popupPlacement?: PopupPlacement;\n disableHideOnEscapeKeyDown?: boolean;\n}\n\nexport const BaseTooltipCn = cn('base-tooltip');\nexport const defaultPlacement: PopupPlacement = [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n];\nconst b = BaseTooltipCn;\nexport const baseTooltipContentCn = cn('base-tooltip-content');\n\nexport type TooltipOnChangeCallback = (\n attrs: Record<string, string>,\n options?: {setFocus?: boolean; setSelection?: boolean; hideTooltip?: boolean; marks?: Mark[]},\n) => void;\n\nexport type TooltipContentProps = {\n node: BaseTooltipNode;\n view: EditorView;\n onChange?: TooltipOnChangeCallback;\n toggleEdit?: () => void;\n};\n\nexport class BaseTooltipPluginView implements PluginView {\n protected view: EditorView;\n protected currentNode: BaseTooltipNode | null = null;\n protected readonly content?: TooltipContentCb;\n protected readonly nodeType: NodeType | MarkType;\n protected readonly popupPlacement?: PopupPlacement;\n protected manualHidden = false;\n protected destroyed = false;\n\n protected readonly disableHideOnEscapeKeyDown?: boolean;\n\n protected focusTrackingRafId: number | null = null;\n\n private readonly idPrefix: string;\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, options: BaseTooltipPluginOptions) {\n this.view = view;\n this.idPrefix = options.idPrefix;\n this.content = options.content;\n this.nodeType = options.nodeType;\n this.popupPlacement = options.popupPlacement;\n this.disableHideOnEscapeKeyDown = options.disableHideOnEscapeKeyDown;\n }\n\n update(view: EditorView) {\n this.view = view;\n\n this.updateTooltipView();\n }\n\n destroy() {\n this.destroyed = true;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown = (): boolean => {\n if (this.disableHideOnEscapeKeyDown) return false;\n if (this.currentNode && !this.manualHidden) {\n this.hidePopupManual();\n return true;\n }\n return false;\n };\n\n protected setCurrentNode(node: NodeType) {\n const view = this.view;\n const domAtPos = view.domAtPos.bind(view);\n\n const {selection} = view.state;\n const {$from, $to} = selection;\n\n const parent =\n findSelectedNodeOfType(node)(selection) || findParentNodeOfType(node)(selection);\n\n if (!parent || !$from.node(parent.depth).eq($to.node(parent.depth))) {\n this.currentNode = null;\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n return;\n }\n\n if (\n !this.currentNode ||\n !this.currentNode.node.eq(parent.node) ||\n this.currentNode.pos !== parent.pos\n ) {\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n }\n\n const {pos, node: parentNode} = parent;\n const dom = findDomRefAtPos(pos, domAtPos) as HTMLElement;\n\n this.currentNode = {\n pos,\n node: parentNode,\n dom,\n };\n }\n\n protected changeAttrsCb: TooltipOnChangeCallback = (attrs, options) => {\n if (this.currentNode) {\n let tr = this.view.state.tr.setNodeMarkup(\n this.currentNode.pos,\n undefined,\n {\n ...this.currentNode.node.attrs,\n ...attrs,\n },\n options?.marks || [],\n );\n\n if (options?.setSelection) {\n tr = tr.setSelection(NodeSelection.create(tr.doc, this.currentNode.pos));\n }\n\n this.view.dispatch(tr);\n\n if (options?.setFocus) {\n this.view.focus();\n }\n\n if (options?.hideTooltip) {\n this.hidePopupManual();\n }\n }\n };\n\n protected updateTooltipView() {\n const oldNode = this.currentNode;\n this.setCurrentNode(this.view.state.schema.nodes[this.nodeType.name]);\n\n // Do not rerender if we have the same node in selection\n if (\n oldNode &&\n this.currentNode?.node.eq(oldNode.node) &&\n this.currentNode.pos === oldNode.pos &&\n this.currentNode.dom === oldNode.dom\n )\n return;\n\n this.render();\n }\n\n protected render() {\n if (this.destroyed) return;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n protected onOutsideClick: PopupProps['onOutsideClick'] = () => {\n this.hidePopupManual();\n };\n\n protected popupOpenChangeHandler: PopupProps['onOpenChange'] = (open, event, reason) => {\n if (open) return;\n if (reason === 'focus-out' && (event as FocusEvent).relatedTarget === this.view.dom) return;\n if (this.disableHideOnEscapeKeyDown && reason === 'escape-key') return;\n\n this.hidePopupManual();\n\n requestAnimationFrame(() => {\n if (this.destroyed || this.view.hasFocus()) return;\n this.startTrackingViewFocus();\n });\n };\n\n protected startTrackingViewFocus() {\n this.focusTrackingRafId = requestAnimationFrame(() => {\n if (this.destroyed) return;\n if (this.view.hasFocus()) {\n this.focusTrackingRafId = null;\n this.manualHidden = false;\n this.render();\n return;\n }\n this.startTrackingViewFocus();\n });\n }\n\n protected stopTrackingViewFocus() {\n if (this.focusTrackingRafId !== null) {\n cancelAnimationFrame(this.focusTrackingRafId);\n this.focusTrackingRafId = null;\n }\n }\n\n protected hidePopupManual() {\n this.manualHidden = true;\n this.render();\n }\n\n protected renderContent(currentNode: BaseTooltipNode): React.ReactNode {\n if (!this.content) return null;\n // hack for popup rerender\n window.dispatchEvent(new CustomEvent('scroll'));\n return (\n <Popup\n open\n hasArrow={false}\n anchorElement={currentNode.dom}\n placement={this.popupPlacement || defaultPlacement}\n onOpenChange={this.popupOpenChangeHandler}\n >\n <div className={b()}>\n {this.content(\n this.view,\n currentNode,\n this.changeAttrsCb,\n undefined,\n undefined,\n () => this.render(),\n )}\n </div>\n </Popup>\n );\n }\n\n protected createRenderItem() {\n return getReactRendererFromState(this.view.state)!.createItem(this.idPrefix, () =>\n this.currentNode && !this.manualHidden ? (\n <ErrorLoggerBoundary>{this.renderContent(this.currentNode)}</ErrorLoggerBoundary>\n ) : null,\n );\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { type ReactNode } from 'react';
|
|
|
2
2
|
import type { ToolbarBaseProps, ToolbarItemData } from "./types.js";
|
|
3
3
|
import "./ToolbarButton.css";
|
|
4
4
|
export type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;
|
|
5
|
-
export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'> & {
|
|
5
|
+
export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa' | 'theme'> & {
|
|
6
6
|
active: boolean;
|
|
7
7
|
enabled: boolean;
|
|
8
8
|
onClick: () => void;
|
|
@@ -12,7 +12,7 @@ const const_1 = require("./const.js");
|
|
|
12
12
|
require("./ToolbarButton.css");
|
|
13
13
|
const b = (0, classname_1.cn)('toolbar-button');
|
|
14
14
|
const DEFAULT_ICON_SIZE = 16;
|
|
15
|
-
exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, id, disableTooltip, ...props }, ref) {
|
|
15
|
+
exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, theme = 'normal', hintWhenDisabled, active, enabled, onClick, className, qa, id, disableTooltip, ...props }, ref) {
|
|
16
16
|
const disabled = !active && !enabled;
|
|
17
17
|
const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
|
|
18
18
|
const hintText = (0, lodash_1.isFunction)(hint) ? hint() : hint;
|
|
@@ -26,7 +26,7 @@ exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({
|
|
|
26
26
|
(0, uikit_1.setRef)(ref, elem);
|
|
27
27
|
(0, uikit_1.setRef)(refForPopover, elem);
|
|
28
28
|
(0, uikit_1.setRef)(refForTooltip, elem);
|
|
29
|
-
}, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
|
|
29
|
+
}, selected: active, disabled: disabled, view: theme === 'danger' ? 'flat-danger' : active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
|
|
30
30
|
});
|
|
31
31
|
function ToolbarButton(props) {
|
|
32
32
|
const { id, editor, focus, isActive, isEnable, exec, onClick } = props;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa' | 'theme'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n id?: string;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode}) &\n Pick<ToolbarBaseProps<unknown>, 'disableTooltip'>;\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {\n title,\n hint,\n hotkey,\n theme = 'normal',\n hintWhenDisabled,\n active,\n enabled,\n onClick,\n className,\n qa,\n id,\n disableTooltip,\n ...props\n },\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n disabled={disableTooltip}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={\n theme === 'danger' ? 'flat-danger' : active ? 'normal' : 'flat'\n }\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n data-toolbar-item={id}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["toolbar/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["toolbar/types.ts"],"names":[],"mappings":";;;AAgDA,IAAY,eASX;AATD,WAAY,eAAe;IACvB,4CAAyB,CAAA;IACzB,wCAAqB,CAAA;IACrB,0CAAuB,CAAA;IACvB,kDAAkD;IAClD,uCAAoB,CAAA;IACpB,kDAAkD;IAClD,4CAAyB,CAAA;IACzB,iDAA8B,CAAA;AAClC,CAAC,EATW,eAAe,+BAAf,eAAe,QAS1B","sourcesContent":["import type {HotkeyProps, IconProps, QAProps} from '@gravity-ui/uikit';\n\nimport type {ClassNameProps} from '../classname';\n\nexport type ToolbarBaseProps<E> = ClassNameProps &\n QAProps & {\n editor: E;\n focus(): void;\n onClick?(id: string, attrs?: {[key: string]: any}): void;\n display?: ToolbarDisplay;\n disableTooltip?: boolean;\n disablePreview?: boolean;\n disableHotkey?: boolean;\n };\n\nexport type ToolbarIconData = Pick<IconProps, 'data' | 'size'>;\nexport type ToolbarGroupData<E> = Array<ToolbarGroupItemData<E>>;\nexport type ToolbarData<E> = ToolbarGroupData<E>[];\nexport type ToolbarDisplay = 'shrink' | 'scroll';\n\nexport type ToolbarItemData<E> = QAProps & {\n id: string;\n icon: ToolbarIconData;\n title: string | (() => string);\n hint?: string | (() => string);\n hotkey?: HotkeyProps['value'];\n preview?: React.ReactNode;\n theme?: 'normal' | 'danger';\n /**\n * Alternative IDs that can be used to find this command\n */\n aliases?: string[];\n /**\n * Show hint when _isEnable()_ returns false\n *\n * `false` – don't show hint;\n *\n * `true` – show default hint;\n *\n * `string` or `() => string` – show hint with custom message.\n * @default true\n */\n hintWhenDisabled?: boolean | string | (() => string);\n exec(editor: E): void;\n isActive(editor: E): boolean;\n isEnable(editor: E): boolean;\n};\n\nexport enum ToolbarDataType {\n SingleButton = 's-button',\n ListButton = 'list-b',\n ButtonPopup = 'b-popup',\n /** @deprecated Use ReactComponent type instead */\n ReactNode = 'r-node',\n /** @deprecated Use ReactComponent type instead */\n ReactNodeFn = 'r-node-fn',\n ReactComponent = 'r-component',\n}\n\nexport type ToolbarGroupItemData<E> =\n | ToolbarSingleItemData<E>\n | ToolbarButtonPopupData<E>\n | ToolbarListItemData<E>\n | ToolbarReactNodeData\n | ToolbarReactNodeFnData<E>\n | ToolbarReactComponentData<E>;\n\nexport type ToolbarSingleItemData<E> = ToolbarItemData<E> & {\n id: string;\n type: ToolbarDataType.SingleButton;\n className?: string;\n};\n\nexport type ToolbarListItemData<E> = ToolbarListButtonData<E> & {\n id: string;\n type: ToolbarDataType.ListButton;\n className?: string;\n};\n\nexport type ToolbarReactComponentData<E> = {\n id: string;\n type: ToolbarDataType.ReactComponent;\n width: number;\n className?: string;\n component: React.ComponentType<ToolbarBaseProps<E>>;\n props?: object;\n};\n\nexport type ToolbarButtonPopupData<E> = ToolbarItemData<E> & {\n /** not used, may be an empty function */\n exec: ToolbarItemData<E>['exec'];\n type: ToolbarDataType.ButtonPopup;\n renderPopup: (\n props: ToolbarBaseProps<E> & {hide: () => void; anchorElement: HTMLElement | null},\n ) => React.ReactNode;\n className?: string;\n};\n\nexport type ToolbarListButtonItemData<E> = ToolbarItemData<E> & {\n doNotActivateList?: boolean;\n};\n\nexport type ToolbarListButtonData<E> = {\n icon: ToolbarIconData;\n title: string | (() => string);\n withArrow?: boolean;\n data: ToolbarListButtonItemData<E>[];\n alwaysActive?: boolean;\n hideDisabled?: boolean;\n /** When state changes to active, replace default icon with icon of first active item */\n replaceActiveIcon?: boolean;\n};\n\n/**\n * @deprecated Use ReactComponent type instead\n */\nexport type ToolbarReactNodeData = {\n id: string;\n type: ToolbarDataType.ReactNode;\n width: number;\n content: React.ReactNode;\n};\n\n/**\n * @deprecated Use ReactComponent type instead\n */\nexport type ToolbarReactNodeFnData<E> = {\n id: string;\n type: ToolbarDataType.ReactNodeFn;\n width: number;\n content: (e: E) => React.ReactNode;\n};\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Node } from "../pm/model.js";
|
|
2
|
+
import type { Decoration, DecorationSource, EditorView, NodeView } from "../pm/view.js";
|
|
3
|
+
export type { NodeView, NodeViewConstructor } from "../pm/view.js";
|
|
4
|
+
export type NodeViewProps = {
|
|
5
|
+
node: Node;
|
|
6
|
+
view: EditorView;
|
|
7
|
+
getPos: () => number | undefined;
|
|
8
|
+
decorations: readonly Decoration[];
|
|
9
|
+
innerDecorations: DecorationSource;
|
|
10
|
+
};
|
|
11
|
+
export type NodeViewUpdateFn = NonNullable<NodeView['update']>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-view.js","sourceRoot":"../../../src","sources":["types/node-view.ts"],"names":[],"mappings":"","sourcesContent":["import type {Node} from '#pm/model';\nimport type {Decoration, DecorationSource, EditorView, NodeView} from '#pm/view';\n\nexport type {NodeView, NodeViewConstructor} from '#pm/view';\n\nexport type NodeViewProps = {\n node: Node;\n view: EditorView;\n getPos: () => number | undefined;\n decorations: readonly Decoration[];\n innerDecorations: DecorationSource;\n};\n\nexport type NodeViewUpdateFn = NonNullable<NodeView['update']>;\n"]}
|
|
@@ -12,6 +12,7 @@ export declare function isFilesOnly({ types }: DataTransfer): boolean;
|
|
|
12
12
|
export declare function isFilesFromHtml({ types }: DataTransfer): boolean;
|
|
13
13
|
export declare function isImageFile(file: File): boolean;
|
|
14
14
|
export declare function isVSCode(data: DataTransfer): boolean;
|
|
15
|
+
export declare function isJetBrains(data: DataTransfer): boolean;
|
|
15
16
|
export type VSCodeData = {
|
|
16
17
|
version: number;
|
|
17
18
|
isFromEmptySelection: boolean;
|
|
@@ -5,6 +5,7 @@ exports.isFilesOnly = isFilesOnly;
|
|
|
5
5
|
exports.isFilesFromHtml = isFilesFromHtml;
|
|
6
6
|
exports.isImageFile = isImageFile;
|
|
7
7
|
exports.isVSCode = isVSCode;
|
|
8
|
+
exports.isJetBrains = isJetBrains;
|
|
8
9
|
exports.tryParseVSCodeData = tryParseVSCodeData;
|
|
9
10
|
exports.shouldSkipHtmlConversion = shouldSkipHtmlConversion;
|
|
10
11
|
/** Сontains all data formats known to us */
|
|
@@ -32,6 +33,12 @@ function isImageFile(file) {
|
|
|
32
33
|
function isVSCode(data) {
|
|
33
34
|
return data.types.includes(DataTransferType.VSCodeData);
|
|
34
35
|
}
|
|
36
|
+
function isJetBrains(data) {
|
|
37
|
+
if (!data.types.includes(DataTransferType.Rtf))
|
|
38
|
+
return false;
|
|
39
|
+
const rtf = data.getData(DataTransferType.Rtf);
|
|
40
|
+
return rtf.indexOf('\\fmodern JetBrains') > 0;
|
|
41
|
+
}
|
|
35
42
|
function tryParseVSCodeData(data) {
|
|
36
43
|
try {
|
|
37
44
|
return JSON.parse(data.getData(DataTransferType.VSCodeData));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,0CAMC;AAED,kCAEC;AAED,4BAEC;AAUD,gDAOC;AAKD,4DAoBC;
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"../../../src","sources":["utils/clipboard.ts"],"names":[],"mappings":";;;AAWA,kCAEC;AAED,0CAMC;AAED,kCAEC;AAED,4BAEC;AAED,kCAIC;AAUD,gDAOC;AAKD,4DAoBC;AA7ED,4CAA4C;AAC5C,IAAY,gBAQX;AARD,WAAY,gBAAgB;IACxB,uCAAmB,CAAA;IACnB,sCAAkB,CAAA;IAClB,oCAAgB,CAAA;IAChB,oCAAgB,CAAA;IAChB,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,mCAAe,CAAA;AACnB,CAAC,EARW,gBAAgB,gCAAhB,gBAAgB,QAQ3B;AAED,SAAgB,WAAW,CAAC,EAAC,KAAK,EAAe;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACrE,CAAC;AAED,SAAgB,eAAe,CAAC,EAAC,KAAK,EAAe;IACjD,OAAO,CACH,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACxC,CAAC;AACN,CAAC;AAED,SAAgB,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAkB;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,WAAW,CAAC,IAAkB;IAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAUD,SAAgB,kBAAkB,CAAC,IAAkB;IACjD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,aAA2B;IAChE,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEpE,8CAA8C;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,kCAAkC;IAClC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["/** Сontains all data formats known to us */\nexport enum DataTransferType {\n Text = 'text/plain',\n Html = 'text/html',\n Yfm = 'text/yfm', // self\n Rtf = 'text/rtf', // Safari, WebStorm/Intelij\n UriList = 'text/uri-list',\n VSCodeData = 'vscode-editor-data',\n Files = 'Files',\n}\n\nexport function isFilesOnly({types}: DataTransfer): boolean {\n return types.length === 1 && types[0] === DataTransferType.Files;\n}\n\nexport function isFilesFromHtml({types}: DataTransfer): boolean {\n return (\n types.length === 2 &&\n types.includes(DataTransferType.Files) &&\n types.includes(DataTransferType.Html)\n );\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nexport function isVSCode(data: DataTransfer): boolean {\n return data.types.includes(DataTransferType.VSCodeData);\n}\n\nexport function isJetBrains(data: DataTransfer): boolean {\n if (!data.types.includes(DataTransferType.Rtf)) return false;\n const rtf = data.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\\\fmodern JetBrains') > 0;\n}\n\nexport type VSCodeData = {\n version: number;\n isFromEmptySelection: boolean;\n multicursorText: null | string;\n mode: string;\n [key: string]: unknown;\n};\n\nexport function tryParseVSCodeData(data: DataTransfer): VSCodeData | undefined {\n try {\n return JSON.parse(data.getData(DataTransferType.VSCodeData));\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\n\n/**\n * Checks if HTML conversion should be skipped based on clipboard contents.\n */\nexport function shouldSkipHtmlConversion(clipboardData: DataTransfer): boolean {\n const hasHtml = clipboardData.types.includes(DataTransferType.Html);\n\n // If there's no HTML content, skip conversion\n if (!hasHtml) return true;\n\n // Check for HTML only (text/html)\n if (clipboardData.types.length === 1) return false;\n\n // Check for standard HTML clipboard (text/plain + text/html)\n if (clipboardData.types.length === 2) return false;\n\n // Check for WebStorm/Safari case (includes RTF)\n if (clipboardData.types.length === 3) {\n const rtf = clipboardData.getData(DataTransferType.Rtf);\n return rtf.indexOf('\\fmodern JetBrains') > 0;\n }\n\n // Skip conversion for any other cases\n return true;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTruthy = isTruthy;
|
|
4
|
+
exports.isFalsy = isFalsy;
|
|
5
|
+
function isTruthy(value) {
|
|
6
|
+
return Boolean(value);
|
|
7
|
+
}
|
|
8
|
+
function isFalsy(value) {
|
|
9
|
+
return !value;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=truthy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truthy.js","sourceRoot":"../../../src","sources":["utils/truthy.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,0BAEC;AAND,SAAgB,QAAQ,CAAI,KAAQ;IAChC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,OAAO,CAAI,KAAQ;IAC/B,OAAO,CAAC,KAAK,CAAC;AAClB,CAAC","sourcesContent":["type Falsy = false | 0 | 0n | '' | null | undefined;\n\nexport function isTruthy<T>(value: T): value is Exclude<T, Falsy> {\n return Boolean(value);\n}\n\nexport function isFalsy<T>(value: T): value is Extract<T, Falsy> {\n return !value;\n}\n"]}
|
package/build/cjs/version.js
CHANGED
|
@@ -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.
|
|
5
|
+
exports.VERSION = typeof '15.33.0' !== 'undefined' ? '15.33.0' : 'unknown';
|
|
6
6
|
//# sourceMappingURL=version.js.map
|
package/build/cjs/version.js.map
CHANGED
|
@@ -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.
|
|
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.33.0' !== 'undefined' ? '15.33.0' : 'unknown';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./withCodeBlockActions/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["view/hocs/index.ts"],"names":[],"mappings":";;;AAAA,0EAAuC","sourcesContent":["export * from './withCodeBlockActions';\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodeTextWrappingToggleButton = CodeTextWrappingToggleButton;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const icons_1 = require("@gravity-ui/icons");
|
|
7
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
8
|
+
const viewer_1 = require("../../../i18n/viewer/index.js");
|
|
9
|
+
function CodeTextWrappingToggleButton({ codeElement }) {
|
|
10
|
+
const [hasWrapping, setHasWrapping] = (0, react_1.useState)(() => Boolean(codeElement.querySelector('pre code')?.classList?.contains('wrap')));
|
|
11
|
+
return ((0, jsx_runtime_1.jsx)(uikit_1.ActionTooltip, { title: (0, viewer_1.i18n)('code_wrapping'), children: (0, jsx_runtime_1.jsx)(uikit_1.Button, { size: "m", view: "flat", selected: hasWrapping, onClick: () => {
|
|
12
|
+
const preCode = codeElement.querySelector('pre code');
|
|
13
|
+
setHasWrapping(Boolean(preCode?.classList?.toggle('wrap')));
|
|
14
|
+
}, children: (0, jsx_runtime_1.jsx)(uikit_1.Button.Icon, { children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.ArrowUturnCwLeft }) }) }) }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=TextWrappingButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextWrappingButton.js","sourceRoot":"../../../../../src","sources":["view/hocs/withCodeBlockActions/TextWrappingButton.tsx"],"names":[],"mappings":";;AAWA,oEAsBC;;AAjCD,iCAA+B;AAE/B,6CAAmE;AACnE,6CAA8D;AAE9D,0DAAqC;AAMrC,SAAgB,4BAA4B,CAAC,EAAC,WAAW,EAAoC;IACzF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAU,GAAG,EAAE,CACzD,OAAO,CAAC,WAAW,CAAC,aAAa,CAAc,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC3F,CAAC;IAEF,OAAO,CACH,uBAAC,qBAAa,IAAC,KAAK,EAAE,IAAA,aAAI,EAAC,eAAe,CAAC,YACvC,uBAAC,cAAM,IACH,IAAI,EAAC,GAAG,EACR,IAAI,EAAC,MAAM,EACX,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,GAAG,EAAE;gBACV,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAc,UAAU,CAAC,CAAC;gBACnE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChE,CAAC,YAED,uBAAC,cAAM,CAAC,IAAI,cACR,uBAAC,YAAI,IAAC,IAAI,EAAE,wBAAY,GAAI,GAClB,GACT,GACG,CACnB,CAAC;AACN,CAAC","sourcesContent":["import {useState} from 'react';\n\nimport {ArrowUturnCwLeft as WrappingIcon} from '@gravity-ui/icons';\nimport {ActionTooltip, Button, Icon} from '@gravity-ui/uikit';\n\nimport {i18n} from 'src/i18n/viewer';\n\nexport type CodeTextWrappingToggleButtonProps = {\n codeElement: HTMLElement;\n};\n\nexport function CodeTextWrappingToggleButton({codeElement}: CodeTextWrappingToggleButtonProps) {\n const [hasWrapping, setHasWrapping] = useState<boolean>(() =>\n Boolean(codeElement.querySelector<HTMLElement>('pre code')?.classList?.contains('wrap')),\n );\n\n return (\n <ActionTooltip title={i18n('code_wrapping')}>\n <Button\n size=\"m\"\n view=\"flat\"\n selected={hasWrapping}\n onClick={() => {\n const preCode = codeElement.querySelector<HTMLElement>('pre code');\n setHasWrapping(Boolean(preCode?.classList?.toggle('wrap')));\n }}\n >\n <Button.Icon>\n <Icon data={WrappingIcon} />\n </Button.Icon>\n </Button>\n </ActionTooltip>\n );\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ComponentType, type RefAttributes } from 'react';
|
|
2
|
+
import "./styles.css";
|
|
3
|
+
export type WithCodeBlockActionsOptions = {
|
|
4
|
+
/** @default true */
|
|
5
|
+
copyButton?: boolean;
|
|
6
|
+
/** @default false */
|
|
7
|
+
lineWrappingButton?: boolean;
|
|
8
|
+
/** @default '.yfm-code-floating-container' */
|
|
9
|
+
codeBlockSelector?: string;
|
|
10
|
+
/** Override how text is copied */
|
|
11
|
+
getCodeBlockText?: (element: HTMLElement) => string;
|
|
12
|
+
};
|
|
13
|
+
export declare function withCodeBlockActions({ copyButton, lineWrappingButton, codeBlockSelector, getCodeBlockText, }: WithCodeBlockActionsOptions): <T extends {
|
|
14
|
+
html: string;
|
|
15
|
+
}>(Component: ComponentType<T & RefAttributes<HTMLDivElement>>) => import("react").ForwardRefExoticComponent<import("react").PropsWithoutRef<T> & RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withCodeBlockActions = withCodeBlockActions;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
|
+
const TextWrappingButton_1 = require("./TextWrappingButton.js");
|
|
8
|
+
require("./styles.css");
|
|
9
|
+
const VIEWER_CODEBLOCK_CN = 'g-md-viewer-code-block';
|
|
10
|
+
const VIEWER_CODEBLOCK_FLOATING_CN = 'g-md-viewer-code-block-floating-container';
|
|
11
|
+
const CODEBLOCK_DEFAULT_SELECTOR = '.yfm-code-floating-container';
|
|
12
|
+
function withCodeBlockActions({ copyButton = true, lineWrappingButton = false, codeBlockSelector = CODEBLOCK_DEFAULT_SELECTOR, getCodeBlockText = getCodeBlockTextDefault, }) {
|
|
13
|
+
return (Component) => (0, react_1.forwardRef)(function WithCodeBlockActions(props, ref) {
|
|
14
|
+
const { html } = props;
|
|
15
|
+
const [codeBlockElements, setCodeBlockElements] = (0, react_1.useState)([]);
|
|
16
|
+
const domRef = (0, react_1.useRef)(null);
|
|
17
|
+
const componentRef = (0, uikit_1.useForkRef)(ref, domRef);
|
|
18
|
+
(0, react_1.useEffect)(() => {
|
|
19
|
+
if (!domRef.current) {
|
|
20
|
+
setCodeBlockElements([]);
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const elements = Array.from(domRef.current.querySelectorAll(codeBlockSelector));
|
|
24
|
+
setCodeBlockElements(elements);
|
|
25
|
+
const destructors = elements.map((element) => {
|
|
26
|
+
element.classList.add(VIEWER_CODEBLOCK_CN);
|
|
27
|
+
const container = element.appendChild(element.ownerDocument.createElement('div'));
|
|
28
|
+
container.classList.add(VIEWER_CODEBLOCK_FLOATING_CN);
|
|
29
|
+
return () => {
|
|
30
|
+
element.classList.remove(VIEWER_CODEBLOCK_CN);
|
|
31
|
+
container.parentNode?.removeChild(container);
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
return () => {
|
|
35
|
+
destructors.forEach((destructor) => destructor());
|
|
36
|
+
};
|
|
37
|
+
}, [html]);
|
|
38
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Component, { ...props, ref: componentRef }), codeBlockElements.map((element, idx) => {
|
|
39
|
+
const container = element.querySelector(`.${VIEWER_CODEBLOCK_FLOATING_CN}`);
|
|
40
|
+
if (!container)
|
|
41
|
+
return null;
|
|
42
|
+
const id = element.id;
|
|
43
|
+
const line = element.dataset.line;
|
|
44
|
+
return ((0, jsx_runtime_1.jsxs)(uikit_1.Portal, { container: container, children: [lineWrappingButton && ((0, jsx_runtime_1.jsx)(TextWrappingButton_1.CodeTextWrappingToggleButton, { codeElement: element })), copyButton && ((0, jsx_runtime_1.jsx)(uikit_1.ClipboardButton, { size: "m", text: () => getCodeBlockText(element) }))] }, id || line || idx));
|
|
45
|
+
})] }));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function getCodeBlockTextDefault(element) {
|
|
49
|
+
const codeElem = element.querySelector('pre code');
|
|
50
|
+
if (!codeElem)
|
|
51
|
+
return '';
|
|
52
|
+
return Array.from(codeElem.childNodes)
|
|
53
|
+
.filter((node) => {
|
|
54
|
+
// Skip line number spans
|
|
55
|
+
if (node instanceof HTMLElement && node.classList.contains('yfm-line-number')) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
})
|
|
60
|
+
.map((node) => node.textContent)
|
|
61
|
+
.join('');
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["view/hocs/withCodeBlockActions/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type ComponentType,\n type RefAttributes,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport {ClipboardButton, Portal, useForkRef} from '@gravity-ui/uikit';\n\nimport {CodeTextWrappingToggleButton} from './TextWrappingButton';\n\nimport './styles.scss';\n\nconst VIEWER_CODEBLOCK_CN = 'g-md-viewer-code-block';\nconst VIEWER_CODEBLOCK_FLOATING_CN = 'g-md-viewer-code-block-floating-container';\nconst CODEBLOCK_DEFAULT_SELECTOR = '.yfm-code-floating-container';\n\nexport type WithCodeBlockActionsOptions = {\n /** @default true */\n copyButton?: boolean;\n /** @default false */\n lineWrappingButton?: boolean;\n /** @default '.yfm-code-floating-container' */\n codeBlockSelector?: string;\n /** Override how text is copied */\n getCodeBlockText?: (element: HTMLElement) => string;\n};\n\nexport function withCodeBlockActions({\n copyButton = true,\n lineWrappingButton = false,\n codeBlockSelector = CODEBLOCK_DEFAULT_SELECTOR,\n getCodeBlockText = getCodeBlockTextDefault,\n}: WithCodeBlockActionsOptions) {\n return <T extends {html: string}>(\n Component: ComponentType<T & RefAttributes<HTMLDivElement>>,\n ) =>\n forwardRef<HTMLDivElement, T>(function WithCodeBlockActions(props, ref) {\n const {html} = props;\n const [codeBlockElements, setCodeBlockElements] = useState<HTMLElement[]>([]);\n\n const domRef = useRef<HTMLDivElement>(null);\n const componentRef = useForkRef(ref, domRef);\n\n useEffect(() => {\n if (!domRef.current) {\n setCodeBlockElements([]);\n return undefined;\n }\n\n const elements = Array.from(\n domRef.current.querySelectorAll<HTMLElement>(codeBlockSelector),\n );\n setCodeBlockElements(elements);\n const destructors = elements.map((element) => {\n element.classList.add(VIEWER_CODEBLOCK_CN);\n\n const container = element.appendChild(\n element.ownerDocument.createElement('div'),\n );\n container.classList.add(VIEWER_CODEBLOCK_FLOATING_CN);\n\n return () => {\n element.classList.remove(VIEWER_CODEBLOCK_CN);\n container.parentNode?.removeChild(container);\n };\n });\n\n return () => {\n destructors.forEach((destructor) => destructor());\n };\n }, [html]);\n\n return (\n <>\n <Component {...props} ref={componentRef} />\n {codeBlockElements.map((element, idx) => {\n const container = element.querySelector<HTMLElement>(\n `.${VIEWER_CODEBLOCK_FLOATING_CN}`,\n );\n if (!container) return null;\n\n const id = element.id;\n const line = element.dataset.line;\n\n return (\n <Portal key={id || line || idx} container={container}>\n {lineWrappingButton && (\n <CodeTextWrappingToggleButton codeElement={element} />\n )}\n {copyButton && (\n <ClipboardButton\n size=\"m\"\n text={() => getCodeBlockText(element)}\n />\n )}\n </Portal>\n );\n })}\n </>\n );\n });\n}\n\nfunction getCodeBlockTextDefault(element: HTMLElement) {\n const codeElem = element.querySelector<HTMLElement>('pre code');\n\n if (!codeElem) return '';\n\n return Array.from(codeElem.childNodes)\n .filter((node) => {\n // Skip line number spans\n if (node instanceof HTMLElement && node.classList.contains('yfm-line-number')) {\n return false;\n }\n return true;\n })\n .map((node) => node.textContent)\n .join('');\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
.g-md-viewer-code-block {
|
|
2
|
+
position: relative;
|
|
3
|
+
}
|
|
4
|
+
.g-md-viewer-code-block pre code.wrap {
|
|
5
|
+
white-space: pre-wrap;
|
|
6
|
+
}
|
|
7
|
+
.g-md-viewer-code-block .yfm-code-floating,
|
|
8
|
+
.g-md-viewer-code-block .yfm-clipboard-button {
|
|
9
|
+
display: none;
|
|
10
|
+
}
|
|
11
|
+
.g-md-viewer-code-block .g-md-viewer-code-block-floating-container {
|
|
12
|
+
position: absolute;
|
|
13
|
+
z-index: 1;
|
|
14
|
+
top: 8px;
|
|
15
|
+
right: 8px;
|
|
16
|
+
opacity: 0;
|
|
17
|
+
transition: opacity 0.2s ease-in-out;
|
|
18
|
+
}
|
|
19
|
+
.g-md-viewer-code-block .g-md-viewer-code-block-floating-container,
|
|
20
|
+
.g-md-viewer-code-block .g-md-viewer-code-block-floating-container > [data-floating-ui-portal] {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-wrap: nowrap;
|
|
23
|
+
gap: var(--g-spacing-1);
|
|
24
|
+
}
|
|
25
|
+
.g-md-viewer-code-block:hover .g-md-viewer-code-block-floating-container {
|
|
26
|
+
opacity: 1;
|
|
27
|
+
}
|
package/build/cjs/view/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./components/index.js"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./hocs/index.js"), exports);
|
|
5
6
|
tslib_1.__exportStar(require("./hooks/index.js"), exports);
|
|
6
7
|
tslib_1.__exportStar(require("./types/index.js"), exports);
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["view/index.ts"],"names":[],"mappings":";;;AAAA,gEAA6B;AAC7B,2DAAwB;AACxB,2DAAwB","sourcesContent":["export * from './components';\nexport * from './hooks';\nexport * from './types';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["view/index.ts"],"names":[],"mappings":";;;AAAA,gEAA6B;AAC7B,0DAAuB;AACvB,2DAAwB;AACxB,2DAAwB","sourcesContent":["export * from './components';\nexport * from './hocs';\nexport * from './hooks';\nexport * from './types';\n"]}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
.
|
|
2
|
-
display: flex;
|
|
1
|
+
.g-md-editor.ProseMirror.yfm pre > code {
|
|
3
2
|
white-space: pre;
|
|
4
3
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
.g-md-editor.ProseMirror pre > code.wrap {
|
|
5
|
+
/* stylelint-disable */
|
|
6
|
+
white-space: pre-wrap;
|
|
7
|
+
white-space: break-spaces;
|
|
8
|
+
/* stylelint-enable */
|
|
9
|
+
}
|
|
10
|
+
.g-md-editor.ProseMirror pre > code.wrap .yfm-line-number.ProseMirror-widget {
|
|
11
|
+
position: absolute;
|
|
12
|
+
left: 16px;
|
|
13
|
+
padding: 0;
|
|
14
|
+
}
|
|
15
|
+
.g-md-editor.ProseMirror pre > code.show-line-numbers {
|
|
16
|
+
position: relative;
|
|
17
|
+
display: flex;
|
|
18
|
+
}
|
|
19
|
+
.g-md-editor.ProseMirror pre > code .fake-line-number {
|
|
20
|
+
opacity: 0;
|
|
8
21
|
}
|
|
@@ -4,6 +4,9 @@ import { type LineNumbersOptions } from "../CodeBlockSpecs/index.js";
|
|
|
4
4
|
import "./CodeBlockHighlight.css";
|
|
5
5
|
export type HighlightLangMap = Options['highlightLangs'];
|
|
6
6
|
export type CodeBlockHighlightOptions = {
|
|
7
|
+
lineWrapping?: {
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
};
|
|
7
10
|
lineNumbers?: LineNumbersOptions;
|
|
8
11
|
langs?: HighlightLangMap;
|
|
9
12
|
};
|