@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.
Files changed (150) hide show
  1. package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +1 -1
  2. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +30 -26
  3. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  4. package/build/cjs/extensions/behavior/Clipboard/trim-selection.d.ts +1 -0
  5. package/build/cjs/extensions/behavior/Clipboard/trim-selection.js +55 -0
  6. package/build/cjs/extensions/behavior/Clipboard/trim-selection.js.map +1 -0
  7. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  8. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  9. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  10. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  11. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  12. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +95 -0
  13. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  14. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  15. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  16. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -30
  17. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  18. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  19. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +27 -0
  20. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  21. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  22. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +5 -0
  23. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  24. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  25. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +55 -0
  26. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  27. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  28. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +80 -0
  29. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  30. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  31. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +9 -0
  32. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  33. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  34. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  35. package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +8 -0
  36. package/build/cjs/extensions/markdown/CodeBlock/index.js +4 -0
  37. package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
  38. package/build/cjs/i18n/codeblock/en.json +1 -0
  39. package/build/cjs/i18n/codeblock/index.d.ts +2 -1
  40. package/build/cjs/i18n/codeblock/ru.json +1 -0
  41. package/build/cjs/i18n/viewer/en.json +3 -0
  42. package/build/cjs/i18n/viewer/index.d.ts +5 -0
  43. package/build/cjs/i18n/viewer/index.js +10 -0
  44. package/build/cjs/i18n/viewer/index.js.map +1 -0
  45. package/build/cjs/i18n/viewer/ru.json +3 -0
  46. package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -1
  47. package/build/cjs/plugins/BaseTooltip/index.js +1 -1
  48. package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
  49. package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
  50. package/build/cjs/toolbar/ToolbarButton.js +2 -2
  51. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  52. package/build/cjs/toolbar/types.d.ts +1 -0
  53. package/build/cjs/toolbar/types.js.map +1 -1
  54. package/build/cjs/types/node-view.d.ts +11 -0
  55. package/build/cjs/types/node-view.js +3 -0
  56. package/build/cjs/types/node-view.js.map +1 -0
  57. package/build/cjs/utils/truthy.d.ts +4 -0
  58. package/build/cjs/utils/truthy.js +11 -0
  59. package/build/cjs/utils/truthy.js.map +1 -0
  60. package/build/cjs/version.js +1 -1
  61. package/build/cjs/version.js.map +1 -1
  62. package/build/cjs/view/hocs/index.d.ts +1 -0
  63. package/build/cjs/view/hocs/index.js +5 -0
  64. package/build/cjs/view/hocs/index.js.map +1 -0
  65. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  66. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js +16 -0
  67. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  68. package/build/cjs/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  69. package/build/cjs/view/hocs/withCodeBlockActions/index.js +63 -0
  70. package/build/cjs/view/hocs/withCodeBlockActions/index.js.map +1 -0
  71. package/build/cjs/view/hocs/withCodeBlockActions/styles.css +27 -0
  72. package/build/cjs/view/index.d.ts +1 -0
  73. package/build/cjs/view/index.js +1 -0
  74. package/build/cjs/view/index.js.map +1 -1
  75. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +1 -1
  76. package/build/esm/extensions/behavior/Clipboard/clipboard.js +12 -8
  77. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  78. package/build/esm/extensions/behavior/Clipboard/trim-selection.d.ts +1 -0
  79. package/build/esm/extensions/behavior/Clipboard/trim-selection.js +51 -0
  80. package/build/esm/extensions/behavior/Clipboard/trim-selection.js.map +1 -0
  81. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  82. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  83. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  84. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  85. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  86. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +91 -0
  87. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  88. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  89. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  90. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +57 -33
  91. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  92. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  93. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +21 -0
  94. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  95. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  96. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +2 -0
  97. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  98. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  99. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +51 -0
  100. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  101. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  102. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +72 -0
  103. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  104. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  105. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +6 -0
  106. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  107. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  108. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  109. package/build/esm/extensions/markdown/CodeBlock/index.d.ts +8 -0
  110. package/build/esm/extensions/markdown/CodeBlock/index.js +4 -0
  111. package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
  112. package/build/esm/i18n/codeblock/en.json +1 -0
  113. package/build/esm/i18n/codeblock/index.d.ts +2 -1
  114. package/build/esm/i18n/codeblock/ru.json +1 -0
  115. package/build/esm/i18n/viewer/en.json +3 -0
  116. package/build/esm/i18n/viewer/index.d.ts +5 -0
  117. package/build/esm/i18n/viewer/index.js +6 -0
  118. package/build/esm/i18n/viewer/index.js.map +1 -0
  119. package/build/esm/i18n/viewer/ru.json +3 -0
  120. package/build/esm/plugins/BaseTooltip/index.d.ts +1 -1
  121. package/build/esm/plugins/BaseTooltip/index.js +1 -1
  122. package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
  123. package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
  124. package/build/esm/toolbar/ToolbarButton.js +2 -2
  125. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  126. package/build/esm/toolbar/types.d.ts +1 -0
  127. package/build/esm/toolbar/types.js.map +1 -1
  128. package/build/esm/types/node-view.d.ts +11 -0
  129. package/build/esm/types/node-view.js +2 -0
  130. package/build/esm/types/node-view.js.map +1 -0
  131. package/build/esm/utils/truthy.d.ts +4 -0
  132. package/build/esm/utils/truthy.js +7 -0
  133. package/build/esm/utils/truthy.js.map +1 -0
  134. package/build/esm/version.js +1 -1
  135. package/build/esm/version.js.map +1 -1
  136. package/build/esm/view/hocs/index.d.ts +1 -0
  137. package/build/esm/view/hocs/index.js +2 -0
  138. package/build/esm/view/hocs/index.js.map +1 -0
  139. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  140. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js +13 -0
  141. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  142. package/build/esm/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  143. package/build/esm/view/hocs/withCodeBlockActions/index.js +60 -0
  144. package/build/esm/view/hocs/withCodeBlockActions/index.js.map +1 -0
  145. package/build/esm/view/hocs/withCodeBlockActions/styles.css +27 -0
  146. package/build/esm/view/index.d.ts +1 -0
  147. package/build/esm/view/index.js +1 -0
  148. package/build/esm/view/index.js.map +1 -1
  149. package/build/styles.css +46 -10
  150. package/package.json +1 -1
@@ -0,0 +1,7 @@
1
+ export function isTruthy(value) {
2
+ return Boolean(value);
3
+ }
4
+ export function isFalsy(value) {
5
+ return !value;
6
+ }
7
+ //# sourceMappingURL=truthy.js.map
@@ -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"]}
@@ -1,3 +1,3 @@
1
1
  /** During build process, the current version will be injected here */
2
- export const VERSION = typeof '15.32.0' !== 'undefined' ? '15.32.0' : 'unknown';
2
+ export const VERSION = typeof '15.34.0' !== 'undefined' ? '15.34.0' : 'unknown';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.32.0' !== 'undefined' ? '15.32.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.34.0' !== 'undefined' ? '15.34.0' : 'unknown';\n"]}
@@ -0,0 +1 @@
1
+ export * from "./withCodeBlockActions/index.js";
@@ -0,0 +1,2 @@
1
+ export * from "./withCodeBlockActions/index.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,4 @@
1
+ export type CodeTextWrappingToggleButtonProps = {
2
+ codeElement: HTMLElement;
3
+ };
4
+ export declare function CodeTextWrappingToggleButton({ codeElement }: CodeTextWrappingToggleButtonProps): JSX.Element;
@@ -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
+ }
@@ -1,3 +1,4 @@
1
1
  export * from "./components/index.js";
2
+ export * from "./hocs/index.js";
2
3
  export * from "./hooks/index.js";
3
4
  export * from "./types/index.js";
@@ -1,4 +1,5 @@
1
1
  export * from "./components/index.js";
2
+ export * from "./hocs/index.js";
2
3
  export * from "./hooks/index.js";
3
4
  export * from "./types/index.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -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
- .yfm.ProseMirror .hljs.show-line-numbers {
2156
- display: flex;
2182
+ .g-md-editor.ProseMirror.yfm pre > code {
2157
2183
  white-space: pre;
2158
2184
  }
2159
-
2160
- .yfm.ProseMirror pre > code > .yfm-line-numbers > .yfm-line-number {
2161
- display: block;
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: 2px 8px;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/markdown-editor",
3
- "version": "15.32.0",
3
+ "version": "15.34.0",
4
4
  "description": "Markdown wysiwyg and markup editor",
5
5
  "license": "MIT",
6
6
  "repository": {