@gravity-ui/markdown-editor 15.32.0 → 15.34.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/behavior/Clipboard/clipboard.d.ts +1 -1
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js +30 -26
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/trim-selection.d.ts +1 -0
- package/build/cjs/extensions/behavior/Clipboard/trim-selection.js +55 -0
- package/build/cjs/extensions/behavior/Clipboard/trim-selection.js.map +1 -0
- 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/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/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/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/behavior/Clipboard/clipboard.d.ts +1 -1
- package/build/esm/extensions/behavior/Clipboard/clipboard.js +12 -8
- package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/trim-selection.d.ts +1 -0
- package/build/esm/extensions/behavior/Clipboard/trim-selection.js +51 -0
- package/build/esm/extensions/behavior/Clipboard/trim-selection.js.map +1 -0
- 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/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/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/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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truthy.js","sourceRoot":"../../../src","sources":["utils/truthy.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAI,KAAQ;IAChC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,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/esm/version.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** During build process, the current version will be injected here */
|
|
2
|
-
export const VERSION = typeof '15.
|
|
2
|
+
export const VERSION = typeof '15.34.0' !== 'undefined' ? '15.34.0' : 'unknown';
|
|
3
3
|
//# sourceMappingURL=version.js.map
|
package/build/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.34.0' !== 'undefined' ? '15.34.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,gDAAuC","sourcesContent":["export * from './withCodeBlockActions';\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { ArrowUturnCwLeft as WrappingIcon } from '@gravity-ui/icons';
|
|
4
|
+
import { ActionTooltip, Button, Icon } from '@gravity-ui/uikit';
|
|
5
|
+
import { i18n } from "../../../i18n/viewer/index.js";
|
|
6
|
+
export function CodeTextWrappingToggleButton({ codeElement }) {
|
|
7
|
+
const [hasWrapping, setHasWrapping] = useState(() => Boolean(codeElement.querySelector('pre code')?.classList?.contains('wrap')));
|
|
8
|
+
return (_jsx(ActionTooltip, { title: i18n('code_wrapping'), children: _jsx(Button, { size: "m", view: "flat", selected: hasWrapping, onClick: () => {
|
|
9
|
+
const preCode = codeElement.querySelector('pre code');
|
|
10
|
+
setHasWrapping(Boolean(preCode?.classList?.toggle('wrap')));
|
|
11
|
+
}, children: _jsx(Button.Icon, { children: _jsx(Icon, { data: WrappingIcon }) }) }) }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=TextWrappingButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextWrappingButton.js","sourceRoot":"../../../../../src","sources":["view/hocs/withCodeBlockActions/TextWrappingButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,gBAAgB,IAAI,YAAY,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAC,IAAI,EAAC,sCAAwB;AAMrC,MAAM,UAAU,4BAA4B,CAAC,EAAC,WAAW,EAAoC;IACzF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,GAAG,EAAE,CACzD,OAAO,CAAC,WAAW,CAAC,aAAa,CAAc,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC3F,CAAC;IAEF,OAAO,CACH,KAAC,aAAa,IAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,YACvC,KAAC,MAAM,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,KAAC,MAAM,CAAC,IAAI,cACR,KAAC,IAAI,IAAC,IAAI,EAAE,YAAY,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,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useEffect, useRef, useState, } from 'react';
|
|
3
|
+
import { ClipboardButton, Portal, useForkRef } from '@gravity-ui/uikit';
|
|
4
|
+
import { CodeTextWrappingToggleButton } from "./TextWrappingButton.js";
|
|
5
|
+
import "./styles.css";
|
|
6
|
+
const VIEWER_CODEBLOCK_CN = 'g-md-viewer-code-block';
|
|
7
|
+
const VIEWER_CODEBLOCK_FLOATING_CN = 'g-md-viewer-code-block-floating-container';
|
|
8
|
+
const CODEBLOCK_DEFAULT_SELECTOR = '.yfm-code-floating-container';
|
|
9
|
+
export function withCodeBlockActions({ copyButton = true, lineWrappingButton = false, codeBlockSelector = CODEBLOCK_DEFAULT_SELECTOR, getCodeBlockText = getCodeBlockTextDefault, }) {
|
|
10
|
+
return (Component) => forwardRef(function WithCodeBlockActions(props, ref) {
|
|
11
|
+
const { html } = props;
|
|
12
|
+
const [codeBlockElements, setCodeBlockElements] = useState([]);
|
|
13
|
+
const domRef = useRef(null);
|
|
14
|
+
const componentRef = useForkRef(ref, domRef);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!domRef.current) {
|
|
17
|
+
setCodeBlockElements([]);
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const elements = Array.from(domRef.current.querySelectorAll(codeBlockSelector));
|
|
21
|
+
setCodeBlockElements(elements);
|
|
22
|
+
const destructors = elements.map((element) => {
|
|
23
|
+
element.classList.add(VIEWER_CODEBLOCK_CN);
|
|
24
|
+
const container = element.appendChild(element.ownerDocument.createElement('div'));
|
|
25
|
+
container.classList.add(VIEWER_CODEBLOCK_FLOATING_CN);
|
|
26
|
+
return () => {
|
|
27
|
+
element.classList.remove(VIEWER_CODEBLOCK_CN);
|
|
28
|
+
container.parentNode?.removeChild(container);
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
return () => {
|
|
32
|
+
destructors.forEach((destructor) => destructor());
|
|
33
|
+
};
|
|
34
|
+
}, [html]);
|
|
35
|
+
return (_jsxs(_Fragment, { children: [_jsx(Component, { ...props, ref: componentRef }), codeBlockElements.map((element, idx) => {
|
|
36
|
+
const container = element.querySelector(`.${VIEWER_CODEBLOCK_FLOATING_CN}`);
|
|
37
|
+
if (!container)
|
|
38
|
+
return null;
|
|
39
|
+
const id = element.id;
|
|
40
|
+
const line = element.dataset.line;
|
|
41
|
+
return (_jsxs(Portal, { container: container, children: [lineWrappingButton && (_jsx(CodeTextWrappingToggleButton, { codeElement: element })), copyButton && (_jsx(ClipboardButton, { size: "m", text: () => getCodeBlockText(element) }))] }, id || line || idx));
|
|
42
|
+
})] }));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function getCodeBlockTextDefault(element) {
|
|
46
|
+
const codeElem = element.querySelector('pre code');
|
|
47
|
+
if (!codeElem)
|
|
48
|
+
return '';
|
|
49
|
+
return Array.from(codeElem.childNodes)
|
|
50
|
+
.filter((node) => {
|
|
51
|
+
// Skip line number spans
|
|
52
|
+
if (node instanceof HTMLElement && node.classList.contains('yfm-line-number')) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
})
|
|
57
|
+
.map((node) => node.textContent)
|
|
58
|
+
.join('');
|
|
59
|
+
}
|
|
60
|
+
//# 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/esm/view/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["view/index.ts"],"names":[],"mappings":"AAAA,sCAA6B;AAC7B,iCAAwB;AACxB,iCAAwB","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,sCAA6B;AAC7B,gCAAuB;AACvB,iCAAwB;AACxB,iCAAwB","sourcesContent":["export * from './components';\nexport * from './hocs';\nexport * from './hooks';\nexport * from './types';\n"]}
|
package/build/styles.css
CHANGED
|
@@ -1874,6 +1874,33 @@ body :has(.g-md-resizable_resizing) {
|
|
|
1874
1874
|
--g-popup-border-radius: var(--g-border-radius-l);
|
|
1875
1875
|
border-radius: var(--g-border-radius-l);
|
|
1876
1876
|
}
|
|
1877
|
+
.g-md-viewer-code-block {
|
|
1878
|
+
position: relative;
|
|
1879
|
+
}
|
|
1880
|
+
.g-md-viewer-code-block pre code.wrap {
|
|
1881
|
+
white-space: pre-wrap;
|
|
1882
|
+
}
|
|
1883
|
+
.g-md-viewer-code-block .yfm-code-floating,
|
|
1884
|
+
.g-md-viewer-code-block .yfm-clipboard-button {
|
|
1885
|
+
display: none;
|
|
1886
|
+
}
|
|
1887
|
+
.g-md-viewer-code-block .g-md-viewer-code-block-floating-container {
|
|
1888
|
+
position: absolute;
|
|
1889
|
+
z-index: 1;
|
|
1890
|
+
top: 8px;
|
|
1891
|
+
right: 8px;
|
|
1892
|
+
opacity: 0;
|
|
1893
|
+
transition: opacity 0.2s ease-in-out;
|
|
1894
|
+
}
|
|
1895
|
+
.g-md-viewer-code-block .g-md-viewer-code-block-floating-container,
|
|
1896
|
+
.g-md-viewer-code-block .g-md-viewer-code-block-floating-container > [data-floating-ui-portal] {
|
|
1897
|
+
display: flex;
|
|
1898
|
+
flex-wrap: nowrap;
|
|
1899
|
+
gap: var(--g-spacing-1);
|
|
1900
|
+
}
|
|
1901
|
+
.g-md-viewer-code-block:hover .g-md-viewer-code-block-floating-container {
|
|
1902
|
+
opacity: 1;
|
|
1903
|
+
}
|
|
1877
1904
|
.ProseMirror .pm-h-folding-hidden,
|
|
1878
1905
|
.yfm.ProseMirror .pm-h-folding-hidden {
|
|
1879
1906
|
display: none;
|
|
@@ -2152,13 +2179,26 @@ body :has(.g-md-resizable_resizing) {
|
|
|
2152
2179
|
.g-root_theme_dark .g-md-yfm-html-block_editing .g-text-area__content {
|
|
2153
2180
|
color: var(--g-color-text-primary);
|
|
2154
2181
|
}
|
|
2155
|
-
.
|
|
2156
|
-
display: flex;
|
|
2182
|
+
.g-md-editor.ProseMirror.yfm pre > code {
|
|
2157
2183
|
white-space: pre;
|
|
2158
2184
|
}
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2185
|
+
.g-md-editor.ProseMirror pre > code.wrap {
|
|
2186
|
+
/* stylelint-disable */
|
|
2187
|
+
white-space: pre-wrap;
|
|
2188
|
+
white-space: break-spaces;
|
|
2189
|
+
/* stylelint-enable */
|
|
2190
|
+
}
|
|
2191
|
+
.g-md-editor.ProseMirror pre > code.wrap .yfm-line-number.ProseMirror-widget {
|
|
2192
|
+
position: absolute;
|
|
2193
|
+
left: 16px;
|
|
2194
|
+
padding: 0;
|
|
2195
|
+
}
|
|
2196
|
+
.g-md-editor.ProseMirror pre > code.show-line-numbers {
|
|
2197
|
+
position: relative;
|
|
2198
|
+
display: flex;
|
|
2199
|
+
}
|
|
2200
|
+
.g-md-editor.ProseMirror pre > code .fake-line-number {
|
|
2201
|
+
opacity: 0;
|
|
2162
2202
|
}
|
|
2163
2203
|
.g-md-link-placeholder-widget {
|
|
2164
2204
|
margin: 0 2px;
|
|
@@ -2289,7 +2329,7 @@ body :has(.g-md-resizable_resizing) {
|
|
|
2289
2329
|
height: 28px;
|
|
2290
2330
|
}
|
|
2291
2331
|
.g-md-code-block-toolbar {
|
|
2292
|
-
margin:
|
|
2332
|
+
margin: var(--g-spacing-half);
|
|
2293
2333
|
}
|
|
2294
2334
|
|
|
2295
2335
|
.g-md-code-tooltip-menu {
|
|
@@ -2314,10 +2354,6 @@ body :has(.g-md-resizable_resizing) {
|
|
|
2314
2354
|
.g-md-code-block__select-button {
|
|
2315
2355
|
margin: auto 0;
|
|
2316
2356
|
}
|
|
2317
|
-
|
|
2318
|
-
.g-md-code-block__show-line-numbers {
|
|
2319
|
-
margin: auto 0;
|
|
2320
|
-
}
|
|
2321
2357
|
.table-cell-floating-button.g-button {
|
|
2322
2358
|
height: 28px;
|
|
2323
2359
|
line-height: 28px;
|