@gravity-ui/markdown-editor 15.20.0 → 15.22.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 (114) hide show
  1. package/build/cjs/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
  2. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +11 -9
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  6. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
  7. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  8. package/build/cjs/extensions/additional/Mermaid/index.d.ts +4 -0
  9. package/build/cjs/extensions/additional/Mermaid/index.js +4 -4
  10. package/build/cjs/extensions/additional/Mermaid/index.js.map +1 -1
  11. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +11 -8
  12. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  13. package/build/cjs/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
  14. package/build/cjs/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  15. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
  16. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  17. package/build/cjs/extensions/yfm/YfmConfigs/index.d.ts +5 -1
  18. package/build/cjs/extensions/yfm/YfmConfigs/index.js +7 -1
  19. package/build/cjs/extensions/yfm/YfmConfigs/index.js.map +1 -1
  20. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
  21. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  22. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
  23. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  24. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
  25. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
  26. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
  27. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
  28. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
  29. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
  30. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +177 -0
  31. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
  32. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
  33. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
  34. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +40 -25
  35. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  36. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
  37. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  38. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
  39. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
  40. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
  41. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
  42. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +50 -0
  43. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
  44. package/build/cjs/react-utils/hooks/useAutoSave.d.ts +23 -0
  45. package/build/cjs/react-utils/hooks/useAutoSave.js +59 -0
  46. package/build/cjs/react-utils/hooks/useAutoSave.js.map +1 -0
  47. package/build/cjs/react-utils/hooks.d.ts +1 -1
  48. package/build/cjs/react-utils/hooks.js +3 -1
  49. package/build/cjs/react-utils/hooks.js.map +1 -1
  50. package/build/cjs/version.js +1 -1
  51. package/build/cjs/version.js.map +1 -1
  52. package/build/cjs/view/components/YfmHtml/YfmStaticView.d.ts +13 -0
  53. package/build/cjs/view/components/YfmHtml/YfmStaticView.js +10 -4
  54. package/build/cjs/view/components/YfmHtml/YfmStaticView.js.map +1 -1
  55. package/build/cjs/view/components/YfmHtml/index.d.ts +1 -1
  56. package/build/cjs/view/components/YfmHtml/index.js.map +1 -1
  57. package/build/esm/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
  58. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
  59. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +12 -10
  60. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  61. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  62. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
  63. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  64. package/build/esm/extensions/additional/Mermaid/index.d.ts +4 -0
  65. package/build/esm/extensions/additional/Mermaid/index.js +4 -4
  66. package/build/esm/extensions/additional/Mermaid/index.js.map +1 -1
  67. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +12 -9
  68. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  69. package/build/esm/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
  70. package/build/esm/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  71. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
  72. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  73. package/build/esm/extensions/yfm/YfmConfigs/index.d.ts +5 -1
  74. package/build/esm/extensions/yfm/YfmConfigs/index.js +7 -1
  75. package/build/esm/extensions/yfm/YfmConfigs/index.js.map +1 -1
  76. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
  77. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  78. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
  79. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  80. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
  81. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
  82. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
  83. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
  84. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
  85. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
  86. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +173 -0
  87. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
  88. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
  89. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
  90. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +41 -26
  91. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  92. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
  93. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  94. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
  95. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
  96. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
  97. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
  98. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +46 -0
  99. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
  100. package/build/esm/react-utils/hooks/useAutoSave.d.ts +23 -0
  101. package/build/esm/react-utils/hooks/useAutoSave.js +55 -0
  102. package/build/esm/react-utils/hooks/useAutoSave.js.map +1 -0
  103. package/build/esm/react-utils/hooks.d.ts +1 -1
  104. package/build/esm/react-utils/hooks.js +1 -0
  105. package/build/esm/react-utils/hooks.js.map +1 -1
  106. package/build/esm/version.js +1 -1
  107. package/build/esm/version.js.map +1 -1
  108. package/build/esm/view/components/YfmHtml/YfmStaticView.d.ts +13 -0
  109. package/build/esm/view/components/YfmHtml/YfmStaticView.js +9 -3
  110. package/build/esm/view/components/YfmHtml/YfmStaticView.js.map +1 -1
  111. package/build/esm/view/components/YfmHtml/index.d.ts +1 -1
  112. package/build/esm/view/components/YfmHtml/index.js.map +1 -1
  113. package/build/styles.css +83 -15
  114. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ export interface AutoSaveOptions {
2
+ enabled?: boolean;
3
+ delay?: number;
4
+ }
5
+ export interface UseAutoSaveProps {
6
+ initialValue: string;
7
+ onSave: (value: string, shouldClose?: boolean) => void;
8
+ onClose: () => void;
9
+ autoSave?: AutoSaveOptions;
10
+ }
11
+ export interface UseAutoSaveReturn {
12
+ value: string;
13
+ hasUnsavedChanges: boolean;
14
+ handleChange: (newValue: string) => void;
15
+ handleManualSave: () => void;
16
+ handleClearTimeout: () => void;
17
+ isAutoSaveEnabled: boolean;
18
+ isSaveDisabled: boolean;
19
+ }
20
+ /**
21
+ * autosave functionality for extensions with edit block
22
+ */
23
+ export declare const useAutoSave: ({ autoSave, initialValue, onClose, onSave, }: UseAutoSaveProps) => UseAutoSaveReturn;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAutoSave = void 0;
4
+ const react_1 = require("react");
5
+ const DEFAULT_AUTOSAVE = {
6
+ enabled: true,
7
+ delay: 500,
8
+ };
9
+ /**
10
+ * autosave functionality for extensions with edit block
11
+ */
12
+ const useAutoSave = ({ autoSave, initialValue, onClose, onSave, }) => {
13
+ const { enabled: autoSaveEnabled, delay: autoSaveDelay } = autoSave ?? DEFAULT_AUTOSAVE;
14
+ const isAutoSaveEnabled = Boolean(autoSaveEnabled);
15
+ const [value, setValue] = (0, react_1.useState)(initialValue || '');
16
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, react_1.useState)(false);
17
+ const autoSaveTimeoutRef = (0, react_1.useRef)();
18
+ const handleClearTimeout = () => {
19
+ if (autoSaveTimeoutRef.current) {
20
+ clearTimeout(autoSaveTimeoutRef.current);
21
+ }
22
+ };
23
+ const handleChange = (newValue) => {
24
+ setValue(newValue);
25
+ const hasChanges = newValue !== initialValue;
26
+ setHasUnsavedChanges(hasChanges);
27
+ if (isAutoSaveEnabled && hasChanges) {
28
+ handleClearTimeout();
29
+ const delay = autoSaveDelay ?? DEFAULT_AUTOSAVE.delay;
30
+ autoSaveTimeoutRef.current = setTimeout(() => {
31
+ onSave(newValue);
32
+ setHasUnsavedChanges(false);
33
+ }, delay);
34
+ }
35
+ };
36
+ const handleManualSave = () => {
37
+ handleClearTimeout();
38
+ onSave(value);
39
+ onClose();
40
+ };
41
+ // сleanup timeout on unmount
42
+ (0, react_1.useEffect)(() => {
43
+ return () => {
44
+ handleClearTimeout();
45
+ };
46
+ }, []);
47
+ const isSaveDisabled = isAutoSaveEnabled && !hasUnsavedChanges;
48
+ return {
49
+ value,
50
+ hasUnsavedChanges,
51
+ handleChange,
52
+ handleManualSave,
53
+ handleClearTimeout,
54
+ isAutoSaveEnabled,
55
+ isSaveDisabled,
56
+ };
57
+ };
58
+ exports.useAutoSave = useAutoSave;
59
+ //# sourceMappingURL=useAutoSave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoSave.js","sourceRoot":"../../../../src","sources":["react-utils/hooks/useAutoSave.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAwBlD,MAAM,gBAAgB,GAAG;IACrB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,GAAG;CACb,CAAC;AAEF;;GAEG;AACI,MAAM,WAAW,GAAG,CAAC,EACxB,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,MAAM,GACS,EAAqB,EAAE;IACtC,MAAM,EAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAC,GAAG,QAAQ,IAAI,gBAAgB,CAAC;IACtF,MAAM,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAClE,MAAM,kBAAkB,GAAG,IAAA,cAAM,GAAkB,CAAC;IAEpD,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC5B,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC7B,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,QAAQ,KAAK,YAAY,CAAC;QAC7C,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,iBAAiB,IAAI,UAAU,EAAE,CAAC;YAClC,kBAAkB,EAAE,CAAC;YAErB,MAAM,KAAK,GAAG,aAAa,IAAI,gBAAgB,CAAC,KAAK,CAAC;YACtD,kBAAkB,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACzC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC,EAAE,KAAK,CAAC,CAAC;QACd,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,kBAAkB,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,OAAO,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,6BAA6B;IAC7B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,OAAO,GAAG,EAAE;YACR,kBAAkB,EAAE,CAAC;QACzB,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,iBAAiB,IAAI,CAAC,iBAAiB,CAAC;IAE/D,OAAO;QACH,KAAK;QACL,iBAAiB;QACjB,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,iBAAiB;QACjB,cAAc;KACjB,CAAC;AACN,CAAC,CAAC;AA3DW,QAAA,WAAW,eA2DtB","sourcesContent":["import {useEffect, useRef, useState} from 'react';\n\nexport interface AutoSaveOptions {\n enabled?: boolean;\n delay?: number;\n}\n\nexport interface UseAutoSaveProps {\n initialValue: string;\n onSave: (value: string, shouldClose?: boolean) => void;\n onClose: () => void;\n autoSave?: AutoSaveOptions;\n}\n\nexport interface UseAutoSaveReturn {\n value: string;\n hasUnsavedChanges: boolean;\n handleChange: (newValue: string) => void;\n handleManualSave: () => void;\n handleClearTimeout: () => void;\n isAutoSaveEnabled: boolean;\n isSaveDisabled: boolean;\n}\n\nconst DEFAULT_AUTOSAVE = {\n enabled: true,\n delay: 500,\n};\n\n/**\n * autosave functionality for extensions with edit block\n */\nexport const useAutoSave = ({\n autoSave,\n initialValue,\n onClose,\n onSave,\n}: UseAutoSaveProps): UseAutoSaveReturn => {\n const {enabled: autoSaveEnabled, delay: autoSaveDelay} = autoSave ?? DEFAULT_AUTOSAVE;\n const isAutoSaveEnabled = Boolean(autoSaveEnabled);\n\n const [value, setValue] = useState(initialValue || '');\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const autoSaveTimeoutRef = useRef<NodeJS.Timeout>();\n\n const handleClearTimeout = () => {\n if (autoSaveTimeoutRef.current) {\n clearTimeout(autoSaveTimeoutRef.current);\n }\n };\n\n const handleChange = (newValue: string) => {\n setValue(newValue);\n const hasChanges = newValue !== initialValue;\n setHasUnsavedChanges(hasChanges);\n\n if (isAutoSaveEnabled && hasChanges) {\n handleClearTimeout();\n\n const delay = autoSaveDelay ?? DEFAULT_AUTOSAVE.delay;\n autoSaveTimeoutRef.current = setTimeout(() => {\n onSave(newValue);\n setHasUnsavedChanges(false);\n }, delay);\n }\n };\n\n const handleManualSave = () => {\n handleClearTimeout();\n onSave(value);\n onClose();\n };\n\n // сleanup timeout on unmount\n useEffect(() => {\n return () => {\n handleClearTimeout();\n };\n }, []);\n\n const isSaveDisabled = isAutoSaveEnabled && !hasUnsavedChanges;\n\n return {\n value,\n hasUnsavedChanges,\n handleChange,\n handleManualSave,\n handleClearTimeout,\n isAutoSaveEnabled,\n isSaveDisabled,\n };\n};\n"]}
@@ -7,4 +7,4 @@ export declare const useComponentWillMount: (cb: () => void) => void;
7
7
  export declare const useRenderTime: (cb: (time: number) => void) => void;
8
8
  type AnyFunction = (...args: any[]) => any;
9
9
  export declare function useDebounce<Fn extends AnyFunction>(cb: Fn, wait: number): import("lodash").DebouncedFunc<(...args: Parameters<Fn>) => void>;
10
- export {};
10
+ export { useAutoSave, type AutoSaveOptions, type UseAutoSaveProps, type UseAutoSaveReturn, } from "./hooks/useAutoSave.js";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useRenderTime = exports.useComponentWillMount = exports.useElementState = void 0;
3
+ exports.useAutoSave = exports.useRenderTime = exports.useComponentWillMount = exports.useElementState = void 0;
4
4
  exports.useBooleanState = useBooleanState;
5
5
  exports.useDebounce = useDebounce;
6
6
  const react_1 = require("react");
@@ -43,4 +43,6 @@ function useDebounce(cb, wait) {
43
43
  (0, react_1.useEffect)(() => () => debouncedFn.cancel(), [debouncedFn]);
44
44
  return debouncedFn;
45
45
  }
46
+ var useAutoSave_1 = require("./hooks/useAutoSave.js");
47
+ Object.defineProperty(exports, "useAutoSave", { enumerable: true, get: function () { return useAutoSave_1.useAutoSave; } });
46
48
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"../../../src","sources":["react-utils/hooks.ts"],"names":[],"mappings":";;;AAYA,0CAUC;AAuBD,kCAeC;AA5DD,iCAAwE;AAExE,yCAAmD;AAEnD,yCAAmC;AAE5B,MAAM,eAAe,GAAG,GAA4D,EAAE,CACzF,IAAA,gBAAQ,EAAW,IAAI,CAAC,CAAC;AADhB,QAAA,eAAe,mBACC;AAK7B,SAAgB,eAAe,CAC3B,OAAkC;IAElC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAU,OAAO,CAAC,CAAC;IACrD,OAAO;QACH,KAAK;QACL,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACrC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACtC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;KACjD,CAAC;AACN,CAAC;AAEM,MAAM,qBAAqB,GAAG,CAAC,EAAc,EAAE,EAAE;IACpD,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,SAAS,CAAC,OAAO;QAAE,EAAE,EAAE,CAAC;IAE5B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC9B,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC;AAEK,MAAM,aAAa,GAAG,CAAC,EAA0B,EAAE,EAAE;IACxD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAA,6BAAqB,EAAC,GAAG,EAAE;QACvB,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAGF,SAAgB,WAAW,CAAyB,EAAM,EAAE,IAAY;IACpE,MAAM,QAAQ,GAAG,IAAA,qBAAS,EAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CACD,IAAA,iBAAQ,EAAC,CAAC,GAAG,IAAoB,EAAE,EAAE;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,EAAE,IAAI,CAAC,EACZ,CAAC,QAAQ,EAAE,IAAI,CAAC,CACnB,CAAC;IAEF,6BAA6B;IAC7B,IAAA,iBAAS,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3D,OAAO,WAAW,CAAC;AACvB,CAAC","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nimport {debounce} from '../lodash';\n\nexport const useElementState = <T extends HTMLElement>(): [T | null, React.RefCallback<T>] =>\n useState<T | null>(null);\n\ntype SetTrue = () => void;\ntype SetFalse = () => void;\ntype Toggle = () => void;\nexport function useBooleanState(\n initial: boolean | (() => boolean),\n): [boolean, SetTrue, SetFalse, Toggle] {\n const [value, setValue] = useState<boolean>(initial);\n return [\n value,\n useCallback(() => setValue(true), []),\n useCallback(() => setValue(false), []),\n useCallback(() => setValue((val) => !val), []),\n ];\n}\n\nexport const useComponentWillMount = (cb: () => void) => {\n const willMount = useRef(true);\n\n if (willMount.current) cb();\n\n willMount.current = false;\n};\n\nexport const useRenderTime = (cb: (time: number) => void) => {\n let time = 0;\n\n useComponentWillMount(() => {\n time = Date.now();\n });\n\n useEffectOnce(() => {\n cb(Date.now() - time);\n });\n};\n\ntype AnyFunction = (...args: any[]) => any;\nexport function useDebounce<Fn extends AnyFunction>(cb: Fn, wait: number) {\n const latestCb = useLatest(cb);\n\n const debouncedFn = useMemo(\n () =>\n debounce((...args: Parameters<Fn>) => {\n latestCb.current.apply(null, args);\n }, wait),\n [latestCb, wait],\n );\n\n // cancel function on unmount\n useEffect(() => () => debouncedFn.cancel(), [debouncedFn]);\n\n return debouncedFn;\n}\n"]}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"../../../src","sources":["react-utils/hooks.ts"],"names":[],"mappings":";;;AAYA,0CAUC;AAuBD,kCAeC;AA5DD,iCAAwE;AAExE,yCAAmD;AAEnD,yCAAmC;AAE5B,MAAM,eAAe,GAAG,GAA4D,EAAE,CACzF,IAAA,gBAAQ,EAAW,IAAI,CAAC,CAAC;AADhB,QAAA,eAAe,mBACC;AAK7B,SAAgB,eAAe,CAC3B,OAAkC;IAElC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAU,OAAO,CAAC,CAAC;IACrD,OAAO;QACH,KAAK;QACL,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACrC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACtC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;KACjD,CAAC;AACN,CAAC;AAEM,MAAM,qBAAqB,GAAG,CAAC,EAAc,EAAE,EAAE;IACpD,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,SAAS,CAAC,OAAO;QAAE,EAAE,EAAE,CAAC;IAE5B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC9B,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC;AAEK,MAAM,aAAa,GAAG,CAAC,EAA0B,EAAE,EAAE;IACxD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAA,6BAAqB,EAAC,GAAG,EAAE;QACvB,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAGF,SAAgB,WAAW,CAAyB,EAAM,EAAE,IAAY;IACpE,MAAM,QAAQ,GAAG,IAAA,qBAAS,EAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CACD,IAAA,iBAAQ,EAAC,CAAC,GAAG,IAAoB,EAAE,EAAE;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,EAAE,IAAI,CAAC,EACZ,CAAC,QAAQ,EAAE,IAAI,CAAC,CACnB,CAAC;IAEF,6BAA6B;IAC7B,IAAA,iBAAS,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3D,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,sDAK6B;AAJzB,0GAAA,WAAW,OAAA","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nimport {debounce} from '../lodash';\n\nexport const useElementState = <T extends HTMLElement>(): [T | null, React.RefCallback<T>] =>\n useState<T | null>(null);\n\ntype SetTrue = () => void;\ntype SetFalse = () => void;\ntype Toggle = () => void;\nexport function useBooleanState(\n initial: boolean | (() => boolean),\n): [boolean, SetTrue, SetFalse, Toggle] {\n const [value, setValue] = useState<boolean>(initial);\n return [\n value,\n useCallback(() => setValue(true), []),\n useCallback(() => setValue(false), []),\n useCallback(() => setValue((val) => !val), []),\n ];\n}\n\nexport const useComponentWillMount = (cb: () => void) => {\n const willMount = useRef(true);\n\n if (willMount.current) cb();\n\n willMount.current = false;\n};\n\nexport const useRenderTime = (cb: (time: number) => void) => {\n let time = 0;\n\n useComponentWillMount(() => {\n time = Date.now();\n });\n\n useEffectOnce(() => {\n cb(Date.now() - time);\n });\n};\n\ntype AnyFunction = (...args: any[]) => any;\nexport function useDebounce<Fn extends AnyFunction>(cb: Fn, wait: number) {\n const latestCb = useLatest(cb);\n\n const debouncedFn = useMemo(\n () =>\n debounce((...args: Parameters<Fn>) => {\n latestCb.current.apply(null, args);\n }, wait),\n [latestCb, wait],\n );\n\n // cancel function on unmount\n useEffect(() => () => debouncedFn.cancel(), [debouncedFn]);\n\n return debouncedFn;\n}\n\nexport {\n useAutoSave,\n type AutoSaveOptions,\n type UseAutoSaveProps,\n type UseAutoSaveReturn,\n} from './hooks/useAutoSave';\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.20.0' !== 'undefined' ? '15.20.0' : 'unknown';
5
+ exports.VERSION = typeof '15.22.0' !== 'undefined' ? '15.22.0' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.20.0' !== 'undefined' ? '15.20.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.22.0' !== 'undefined' ? '15.22.0' : 'unknown';\n"]}
@@ -1,12 +1,25 @@
1
1
  import type { QAProps } from '@gravity-ui/uikit';
2
2
  import type { ClassNameProps } from "../../../classname.js";
3
+ export declare const b: import("@bem-react/classname").ClassNameFormatter;
4
+ export type YfmMods = {
5
+ 'links-visited'?: boolean;
6
+ 'no-list-reset'?: boolean;
7
+ 'no-stripe-table'?: boolean;
8
+ [key: string]: string | number | boolean | undefined;
9
+ };
3
10
  export type YfmStaticViewProps = ClassNameProps & QAProps & {
4
11
  html: string;
12
+ mods?: YfmMods;
13
+ /** @deprecated Use prop `mods.['links-visited']` instead */
5
14
  linksVisited?: boolean;
15
+ /** @deprecated Use prop `mods['no-list-reset']` instead */
6
16
  noListReset?: boolean;
7
17
  };
8
18
  export declare const YfmStaticView: import("react").ForwardRefExoticComponent<ClassNameProps & QAProps & {
9
19
  html: string;
20
+ mods?: YfmMods;
21
+ /** @deprecated Use prop `mods.['links-visited']` instead */
10
22
  linksVisited?: boolean;
23
+ /** @deprecated Use prop `mods['no-list-reset']` instead */
11
24
  noListReset?: boolean;
12
25
  } & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.YfmStaticView = void 0;
3
+ exports.YfmStaticView = exports.b = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const classnames_1 = require("@bem-react/classnames");
6
+ const classname_1 = require("@bem-react/classname");
7
+ exports.b = (0, classname_1.cn)('yfm');
7
8
  exports.YfmStaticView = (0, react_1.forwardRef)(function YFMStaticView(props, ref) {
8
- const { html, linksVisited, noListReset, className, qa } = props;
9
- return ((0, jsx_runtime_1.jsx)("div", { ref: ref, dangerouslySetInnerHTML: { __html: html }, className: (0, classnames_1.classnames)('yfm', linksVisited ? 'yfm_links-visited' : undefined, noListReset ? 'yfm_no-list-reset' : undefined, className), "data-qa": qa }));
9
+ const { html, className, qa } = props;
10
+ const mods = { ...props.mods };
11
+ if (props.linksVisited)
12
+ mods['links-visited'] = true;
13
+ if (props.noListReset)
14
+ mods['no-list-reset'] = true;
15
+ return ((0, jsx_runtime_1.jsx)("div", { ref: ref, dangerouslySetInnerHTML: { __html: html }, className: (0, exports.b)(mods, className), "data-qa": qa }));
10
16
  });
11
17
  //# sourceMappingURL=YfmStaticView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"YfmStaticView.js","sourceRoot":"../../../../../src","sources":["view/components/YfmHtml/YfmStaticView.tsx"],"names":[],"mappings":";;;;AAAA,iCAAiC;AAEjC,sDAAiD;AAYpC,QAAA,aAAa,GAAG,IAAA,kBAAU,EACnC,SAAS,aAAa,CAAC,KAAK,EAAE,GAAG;IAC7B,MAAM,EAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAC,GAAG,KAAK,CAAC;IAE/D,OAAO,CACH,gCACI,GAAG,EAAE,GAAG,EACR,uBAAuB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,EACvC,SAAS,EAAE,IAAA,uBAAU,EACjB,KAAK,EACL,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,EAC9C,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,EAC7C,SAAS,CACZ,aACQ,EAAE,GACb,CACL,CAAC;AACN,CAAC,CACJ,CAAC","sourcesContent":["import {forwardRef} from 'react';\n\nimport {classnames} from '@bem-react/classnames';\nimport type {QAProps} from '@gravity-ui/uikit';\n\nimport type {ClassNameProps} from '../../../classname';\n\nexport type YfmStaticViewProps = ClassNameProps &\n QAProps & {\n html: string;\n linksVisited?: boolean;\n noListReset?: boolean;\n };\n\nexport const YfmStaticView = forwardRef<HTMLDivElement, YfmStaticViewProps>(\n function YFMStaticView(props, ref) {\n const {html, linksVisited, noListReset, className, qa} = props;\n\n return (\n <div\n ref={ref}\n dangerouslySetInnerHTML={{__html: html}}\n className={classnames(\n 'yfm',\n linksVisited ? 'yfm_links-visited' : undefined,\n noListReset ? 'yfm_no-list-reset' : undefined,\n className,\n )}\n data-qa={qa}\n />\n );\n },\n);\n"]}
1
+ {"version":3,"file":"YfmStaticView.js","sourceRoot":"../../../../../src","sources":["view/components/YfmHtml/YfmStaticView.tsx"],"names":[],"mappings":";;;;AAAA,iCAAiC;AAEjC,oDAAwC;AAK3B,QAAA,CAAC,GAAG,IAAA,cAAE,EAAC,KAAK,CAAC,CAAC;AAmBd,QAAA,aAAa,GAAG,IAAA,kBAAU,EACnC,SAAS,aAAa,CAAC,KAAK,EAAE,GAAG;IAC7B,MAAM,EAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAC,GAAG,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,EAAC,GAAG,KAAK,CAAC,IAAI,EAAC,CAAC;IAE7B,IAAI,KAAK,CAAC,YAAY;QAAE,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IACrD,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAEpD,OAAO,CACH,gCACI,GAAG,EAAE,GAAG,EACR,uBAAuB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,EACvC,SAAS,EAAE,IAAA,SAAC,EAAC,IAAI,EAAE,SAAS,CAAC,aACpB,EAAE,GACb,CACL,CAAC;AACN,CAAC,CACJ,CAAC","sourcesContent":["import {forwardRef} from 'react';\n\nimport {cn} from '@bem-react/classname';\nimport type {QAProps} from '@gravity-ui/uikit';\n\nimport type {ClassNameProps} from '../../../classname';\n\nexport const b = cn('yfm');\n\nexport type YfmMods = {\n 'links-visited'?: boolean;\n 'no-list-reset'?: boolean;\n 'no-stripe-table'?: boolean;\n [key: string]: string | number | boolean | undefined;\n};\n\nexport type YfmStaticViewProps = ClassNameProps &\n QAProps & {\n html: string;\n mods?: YfmMods;\n /** @deprecated Use prop `mods.['links-visited']` instead */\n linksVisited?: boolean;\n /** @deprecated Use prop `mods['no-list-reset']` instead */\n noListReset?: boolean;\n };\n\nexport const YfmStaticView = forwardRef<HTMLDivElement, YfmStaticViewProps>(\n function YFMStaticView(props, ref) {\n const {html, className, qa} = props;\n const mods = {...props.mods};\n\n if (props.linksVisited) mods['links-visited'] = true;\n if (props.noListReset) mods['no-list-reset'] = true;\n\n return (\n <div\n ref={ref}\n dangerouslySetInnerHTML={{__html: html}}\n className={b(mods, className)}\n data-qa={qa}\n />\n );\n },\n);\n"]}
@@ -1,2 +1,2 @@
1
- export type { YfmStaticViewProps } from "./YfmStaticView.js";
1
+ export type { YfmMods, YfmStaticViewProps } from "./YfmStaticView.js";
2
2
  export { YfmStaticView } from "./YfmStaticView.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["view/components/YfmHtml/index.ts"],"names":[],"mappings":";;;AACA,oDAA8C;AAAtC,8GAAA,aAAa,OAAA","sourcesContent":["export type {YfmStaticViewProps} from './YfmStaticView';\nexport {YfmStaticView} from './YfmStaticView';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["view/components/YfmHtml/index.ts"],"names":[],"mappings":";;;AACA,oDAA8C;AAAtC,8GAAA,aAAa,OAAA","sourcesContent":["export type {YfmMods, YfmStaticViewProps} from './YfmStaticView';\nexport {YfmStaticView} from './YfmStaticView';\n"]}
@@ -1,15 +1,17 @@
1
- .pm-h-folding-hidden {
1
+ .ProseMirror .pm-h-folding-hidden,
2
+ .yfm.ProseMirror .pm-h-folding-hidden {
2
3
  display: none;
3
4
  }
4
-
5
- .pm-h-folding-content {
5
+ .ProseMirror .pm-h-folding-content,
6
+ .yfm.ProseMirror .pm-h-folding-content {
6
7
  padding-left: 28px;
7
8
  }
8
-
9
- .pm-h-folding-separator {
9
+ .ProseMirror .pm-h-folding-separator,
10
+ .yfm.ProseMirror .pm-h-folding-separator {
10
11
  position: relative;
11
12
  }
12
- .pm-h-folding-separator::before {
13
+ .ProseMirror .pm-h-folding-separator::before,
14
+ .yfm.ProseMirror .pm-h-folding-separator::before {
13
15
  position: absolute;
14
16
  z-index: 1;
15
17
  bottom: -4px;
@@ -22,7 +24,8 @@
22
24
  mask-size: 12px;
23
25
  transform: translateY(80%);
24
26
  }
25
- .pm-h-folding-separator::after {
27
+ .ProseMirror .pm-h-folding-separator::after,
28
+ .yfm.ProseMirror .pm-h-folding-separator::after {
26
29
  position: absolute;
27
30
  z-index: 1;
28
31
  bottom: -8px;
@@ -32,8 +35,8 @@
32
35
  content: "";
33
36
  border-top: 1px dashed var(--g-color-line-generic);
34
37
  }
35
-
36
- .pm-h-folding-label::after {
38
+ .ProseMirror .pm-h-folding-label::after,
39
+ .yfm.ProseMirror .pm-h-folding-label::after {
37
40
  position: absolute;
38
41
  z-index: 1;
39
42
  right: 2px;
@@ -2,6 +2,7 @@ import type { Mermaid } from 'mermaid' with { 'resolution-mode': 'import' };
2
2
  import type { Node } from 'prosemirror-model';
3
3
  import type { EditorView } from 'prosemirror-view';
4
4
  import { MermaidConsts } from "../MermaidSpecs/const.js";
5
+ import type { MermaidOptions } from "../index.js";
5
6
  export declare const cnMermaid: import("@bem-react/classname").ClassNameFormatter;
6
7
  export declare const STOP_EVENT_CLASSNAME = "prosemirror-stop-event";
7
8
  import "./Mermaid.css";
@@ -13,4 +14,5 @@ export declare const MermaidView: React.FC<{
13
14
  getMermaidInstance: () => Mermaid;
14
15
  node: Node;
15
16
  getPos: () => number | undefined;
17
+ options: MermaidOptions;
16
18
  }>;
@@ -7,7 +7,7 @@ import { useSharedEditingState } from "../../../../react-utils/useSharedEditingS
7
7
  import { cn } from "../../../../classname.js";
8
8
  import { TextAreaFixed as TextArea } from "../../../../forms/TextInput.js";
9
9
  import { i18n } from "../../../../i18n/common/index.js";
10
- import { useBooleanState, useElementState } from "../../../../react-utils/index.js";
10
+ import { useAutoSave, useBooleanState, useElementState } from "../../../../react-utils/index.js";
11
11
  import { removeNode } from "../../../../utils/index.js";
12
12
  import { MermaidConsts } from "../MermaidSpecs/const.js";
13
13
  export const cnMermaid = cn('Mermaid');
@@ -39,15 +39,18 @@ const MermaidPreview = ({ mermaidInstance, text = '', }) => {
39
39
  }
40
40
  return (_jsx("div", { className: b('Preview'), children: svg ? _jsx("div", { className: "mermaid", dangerouslySetInnerHTML: { __html: svg } }) : _jsx(Loader, {}) }));
41
41
  };
42
- const DiagramEditMode = ({ initialText, onSave, onCancel, mermaidInstance }) => {
43
- const [text, setText] = useState(initialText || '');
44
- return (_jsxs("div", { className: b(), children: [_jsx(MermaidPreview, { mermaidInstance: mermaidInstance, text: text }), _jsxs("div", { className: b('Editor'), children: [_jsx("div", { children: _jsx(TextArea, { controlProps: {
42
+ const DiagramEditMode = ({ initialText, onSave, onCancel, mermaidInstance, options: { autoSave } }) => {
43
+ const { value, handleChange, handleManualSave, isSaveDisabled } = useAutoSave({
44
+ initialValue: initialText || '',
45
+ onSave,
46
+ onClose: onCancel,
47
+ autoSave,
48
+ });
49
+ return (_jsxs("div", { className: b(), children: [_jsx(MermaidPreview, { mermaidInstance: mermaidInstance, text: value }), _jsxs("div", { className: b('Editor'), children: [_jsx("div", { children: _jsx(TextArea, { controlProps: {
45
50
  className: STOP_EVENT_CLASSNAME,
46
- }, value: text, onUpdate: (v) => {
47
- setText(v);
48
- }, autoFocus: true }) }), _jsx("div", { className: b('Controls'), children: _jsxs("div", { children: [_jsx(Button, { onClick: onCancel, view: 'flat', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('cancel') }) }), _jsx(Button, { onClick: () => onSave(text), view: 'action', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('save') }) })] }) })] })] }));
51
+ }, value: value, onUpdate: handleChange, autoFocus: true }) }), _jsx("div", { className: b('Controls'), children: _jsxs("div", { children: [_jsx(Button, { onClick: onCancel, view: 'flat', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('cancel') }) }), _jsx(Button, { onClick: handleManualSave, view: 'action', disabled: isSaveDisabled, children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('save') }) })] }) })] })] }));
49
52
  };
50
- export const MermaidView = ({ onChange, node, getPos, view, getMermaidInstance }) => {
53
+ export const MermaidView = ({ onChange, node, getPos, view, getMermaidInstance, options }) => {
51
54
  const enitityId = node.attrs[MermaidConsts.NodeAttrs.EntityId];
52
55
  const entityKey = useMemo(() => SharedStateKey.define({ name: enitityId }), [enitityId]);
53
56
  const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);
@@ -68,8 +71,7 @@ export const MermaidView = ({ onChange, node, getPos, view, getMermaidInstance }
68
71
  if (editing) {
69
72
  return (_jsx(DiagramEditMode, { initialText: node.attrs[MermaidConsts.NodeAttrs.content], mermaidInstance: mermaidInstance, onCancel: unsetEditing, onSave: (v) => {
70
73
  onChange({ [MermaidConsts.NodeAttrs.content]: v });
71
- unsetEditing();
72
- } }));
74
+ }, options: options }));
73
75
  }
74
76
  return (_jsxs("div", { className: b(), onDoubleClick: setEditing, children: [_jsx(MermaidPreview, { mermaidInstance: mermaidInstance, text: node.attrs[MermaidConsts.NodeAttrs.content] }), _jsxs("div", { children: [_jsx(Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: 's', className: STOP_EVENT_CLASSNAME, children: _jsx(Icon, { data: DotsIcon, className: STOP_EVENT_CLASSNAME }) }), _jsx(Popup, { open: menuOpen, anchorElement: anchorElement, onOpenChange: closeMenu, placement: "bottom-end", children: _jsxs(Menu, { children: [_jsx(Menu.Item, { onClick: () => {
75
77
  setEditing();
@@ -1 +1 @@
1
- {"version":3,"file":"MermaidView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/MermaidView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useState} from 'react';\n\nimport {Ellipsis as DotsIcon} from '@gravity-ui/icons';\nimport {Button, Icon, Loader, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../react-utils';\nimport {removeNode} from '../../../../utils';\nimport {MermaidConsts} from '../MermaidSpecs/const';\nimport type {MermaidEntitySharedState} from '../types';\n\nexport const cnMermaid = cn('Mermaid');\n\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nimport './Mermaid.scss';\n\nconst b = cnMermaid;\n\nconst MermaidPreview: React.FC<{mermaidInstance: Mermaid | null; text: string}> = ({\n mermaidInstance,\n text = '',\n}) => {\n const [svg, setSvg] = useState<string>();\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const p = async () => {\n if (mermaidInstance) {\n try {\n // Validates syntax and throws error if text is invalid\n await mermaidInstance.parse(text);\n\n const {svg: S} = await mermaidInstance.render(`mermaid-${Date.now()}`, text);\n\n setSvg(S);\n setError(null);\n } catch (e) {\n setError((e as Error).message);\n }\n }\n };\n\n p();\n }, [mermaidInstance, text]);\n\n if (error) {\n return <div className={b('Error')}>{error && <div>{error}</div>}</div>;\n }\n\n return (\n <div className={b('Preview')}>\n {svg ? <div className=\"mermaid\" dangerouslySetInnerHTML={{__html: svg}} /> : <Loader />}\n </div>\n );\n};\n\nconst DiagramEditMode: React.FC<{\n initialText: string;\n mermaidInstance: Mermaid | null;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel, mermaidInstance}) => {\n const [text, setText] = useState(initialText || '');\n\n return (\n <div className={b()}>\n <MermaidPreview mermaidInstance={mermaidInstance} text={text} />\n <div className={b('Editor')}>\n <div>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n </div>\n <div className={b('Controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const MermaidView: React.FC<{\n view: EditorView;\n onChange: (attrs: {[MermaidConsts.NodeAttrs.content]: string}) => void;\n getMermaidInstance: () => Mermaid;\n node: Node;\n getPos: () => number | undefined;\n}> = ({onChange, node, getPos, view, getMermaidInstance}) => {\n const enitityId: string = node.attrs[MermaidConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<MermaidEntitySharedState>({name: enitityId}),\n [enitityId],\n );\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, , closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n const [mermaidInstance, setMermaidInstance] = useState<Mermaid | null>(null);\n useEffect(() => {\n const waitForMermaid = () =>\n setTimeout(() => {\n const instance = getMermaidInstance();\n if (instance) {\n setMermaidInstance(instance);\n\n return;\n }\n\n waitForMermaid();\n }, 100);\n\n waitForMermaid();\n }, []);\n\n if (editing) {\n return (\n <DiagramEditMode\n initialText={node.attrs[MermaidConsts.NodeAttrs.content]}\n mermaidInstance={mermaidInstance}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[MermaidConsts.NodeAttrs.content]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <MermaidPreview\n mermaidInstance={mermaidInstance}\n text={node.attrs[MermaidConsts.NodeAttrs.content]}\n />\n <div>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size={'s'}\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n open={menuOpen}\n anchorElement={anchorElement}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MermaidView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/MermaidView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useState} from 'react';\n\nimport {Ellipsis as DotsIcon} from '@gravity-ui/icons';\nimport {Button, Icon, Loader, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useAutoSave, useBooleanState, useElementState} from '../../../../react-utils';\nimport {removeNode} from '../../../../utils';\nimport {MermaidConsts} from '../MermaidSpecs/const';\nimport type {MermaidOptions} from '../index';\nimport type {MermaidEntitySharedState} from '../types';\n\nexport const cnMermaid = cn('Mermaid');\n\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nimport './Mermaid.scss';\n\nconst b = cnMermaid;\n\nconst MermaidPreview: React.FC<{mermaidInstance: Mermaid | null; text: string}> = ({\n mermaidInstance,\n text = '',\n}) => {\n const [svg, setSvg] = useState<string>();\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const p = async () => {\n if (mermaidInstance) {\n try {\n // Validates syntax and throws error if text is invalid\n await mermaidInstance.parse(text);\n\n const {svg: S} = await mermaidInstance.render(`mermaid-${Date.now()}`, text);\n\n setSvg(S);\n setError(null);\n } catch (e) {\n setError((e as Error).message);\n }\n }\n };\n\n p();\n }, [mermaidInstance, text]);\n\n if (error) {\n return <div className={b('Error')}>{error && <div>{error}</div>}</div>;\n }\n\n return (\n <div className={b('Preview')}>\n {svg ? <div className=\"mermaid\" dangerouslySetInnerHTML={{__html: svg}} /> : <Loader />}\n </div>\n );\n};\n\nconst DiagramEditMode: React.FC<{\n initialText: string;\n mermaidInstance: Mermaid | null;\n onSave: (v: string) => void;\n onCancel: () => void;\n options: MermaidOptions;\n}> = ({initialText, onSave, onCancel, mermaidInstance, options: {autoSave}}) => {\n const {value, handleChange, handleManualSave, isSaveDisabled} = useAutoSave({\n initialValue: initialText || '',\n onSave,\n onClose: onCancel,\n autoSave,\n });\n\n return (\n <div className={b()}>\n <MermaidPreview mermaidInstance={mermaidInstance} text={value} />\n <div className={b('Editor')}>\n <div>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={value}\n onUpdate={handleChange}\n autoFocus\n />\n </div>\n <div className={b('Controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button\n onClick={handleManualSave}\n view={'action'}\n disabled={isSaveDisabled}\n >\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const MermaidView: React.FC<{\n view: EditorView;\n onChange: (attrs: {[MermaidConsts.NodeAttrs.content]: string}) => void;\n getMermaidInstance: () => Mermaid;\n node: Node;\n getPos: () => number | undefined;\n options: MermaidOptions;\n}> = ({onChange, node, getPos, view, getMermaidInstance, options}) => {\n const enitityId: string = node.attrs[MermaidConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<MermaidEntitySharedState>({name: enitityId}),\n [enitityId],\n );\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, , closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n const [mermaidInstance, setMermaidInstance] = useState<Mermaid | null>(null);\n useEffect(() => {\n const waitForMermaid = () =>\n setTimeout(() => {\n const instance = getMermaidInstance();\n if (instance) {\n setMermaidInstance(instance);\n\n return;\n }\n\n waitForMermaid();\n }, 100);\n\n waitForMermaid();\n }, []);\n\n if (editing) {\n return (\n <DiagramEditMode\n initialText={node.attrs[MermaidConsts.NodeAttrs.content]}\n mermaidInstance={mermaidInstance}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[MermaidConsts.NodeAttrs.content]: v});\n }}\n options={options}\n />\n );\n }\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <MermaidPreview\n mermaidInstance={mermaidInstance}\n text={node.attrs[MermaidConsts.NodeAttrs.content]}\n />\n <div>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size={'s'}\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n open={menuOpen}\n anchorElement={anchorElement}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
@@ -8,6 +8,7 @@ export declare class WMermaidNodeView implements NodeView {
8
8
  private readonly getPos;
9
9
  private readonly renderItem;
10
10
  private readonly loadRuntimeScript;
11
+ private readonly options;
11
12
  constructor(node: Node, view: EditorView, getPos: () => number | undefined, opts: MermaidOptions);
12
13
  initializeMermaid(): void;
13
14
  update(node: Node): boolean;
@@ -12,6 +12,7 @@ export class WMermaidNodeView {
12
12
  getPos;
13
13
  renderItem;
14
14
  loadRuntimeScript;
15
+ options;
15
16
  constructor(node, view, getPos, opts) {
16
17
  const { loadRuntimeScript } = opts;
17
18
  this.node = node;
@@ -21,6 +22,7 @@ export class WMermaidNodeView {
21
22
  this.view = view;
22
23
  this.getPos = getPos;
23
24
  this.loadRuntimeScript = loadRuntimeScript;
25
+ this.options = opts;
24
26
  this.initializeMermaid();
25
27
  this.renderItem = getReactRendererFromState(view.state).createItem('mermaid-view', this.renderMermaid.bind(this));
26
28
  this.validateEntityId();
@@ -72,7 +74,7 @@ export class WMermaidNodeView {
72
74
  }
73
75
  getMermaidInstance = () => mermaidInstance;
74
76
  renderMermaid() {
75
- return (_jsx(Portal, { container: this.dom, children: _jsx(MermaidView, { view: this.view, onChange: this.onChange.bind(this), node: this.node, getMermaidInstance: this.getMermaidInstance, getPos: this.getPos }) }));
77
+ return (_jsx(Portal, { container: this.dom, children: _jsx(MermaidView, { view: this.view, onChange: this.onChange.bind(this), node: this.node, getMermaidInstance: this.getMermaidInstance, getPos: this.getPos, options: this.options }) }));
76
78
  }
77
79
  }
78
80
  //# sourceMappingURL=NodeView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport {getReactRendererFromState} from 'src/extensions/behavior/ReactRenderer';\nimport {generateEntityId, isInvalidEntityId} from 'src/utils/entity-id';\n\nimport type {MermaidOptions} from '..';\nimport {MermaidConsts, defaultMermaidEntityId} from '../MermaidSpecs/const';\n\nimport {MermaidView, STOP_EVENT_CLASSNAME} from './MermaidView';\n\nlet mermaidInstance: Mermaid;\n\nexport class WMermaidNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly renderItem;\n private readonly loadRuntimeScript: () => void;\n\n constructor(\n node: Node,\n view: EditorView,\n getPos: () => number | undefined,\n opts: MermaidOptions,\n ) {\n const {loadRuntimeScript} = opts;\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('mermaid-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.loadRuntimeScript = loadRuntimeScript;\n this.initializeMermaid();\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'mermaid-view',\n this.renderMermaid.bind(this),\n );\n\n this.validateEntityId();\n }\n\n initializeMermaid() {\n // https://github.com/diplodoc-platform/mermaid-extension/tree/master#prepared-mermaid-runtime\n window.mermaidJsonp = window.mermaidJsonp || [];\n window.mermaidJsonp.push((mermaid: Mermaid) => {\n mermaidInstance = mermaid;\n });\n\n this.loadRuntimeScript();\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private validateEntityId() {\n if (\n isInvalidEntityId({\n node: this.node,\n doc: this.view.state.doc,\n defaultId: defaultMermaidEntityId,\n })\n ) {\n const newId = generateEntityId(MermaidConsts.NodeName);\n this.view.dispatch(\n this.view.state.tr.setNodeAttribute(\n this.getPos()!,\n MermaidConsts.NodeAttrs.EntityId,\n newId,\n ),\n );\n }\n }\n\n private onChange(attrs: {[MermaidConsts.NodeAttrs.content]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private getMermaidInstance = () => mermaidInstance;\n\n private renderMermaid() {\n return (\n <Portal container={this.dom}>\n <MermaidView\n view={this.view}\n onChange={this.onChange.bind(this)}\n node={this.node}\n getMermaidInstance={this.getMermaidInstance}\n getPos={this.getPos}\n />\n </Portal>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport {getReactRendererFromState} from 'src/extensions/behavior/ReactRenderer';\nimport {generateEntityId, isInvalidEntityId} from 'src/utils/entity-id';\n\nimport type {MermaidOptions} from '..';\nimport {MermaidConsts, defaultMermaidEntityId} from '../MermaidSpecs/const';\n\nimport {MermaidView, STOP_EVENT_CLASSNAME} from './MermaidView';\n\nlet mermaidInstance: Mermaid;\n\nexport class WMermaidNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly renderItem;\n private readonly loadRuntimeScript: () => void;\n private readonly options: MermaidOptions;\n\n constructor(\n node: Node,\n view: EditorView,\n getPos: () => number | undefined,\n opts: MermaidOptions,\n ) {\n const {loadRuntimeScript} = opts;\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('mermaid-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.loadRuntimeScript = loadRuntimeScript;\n this.options = opts;\n this.initializeMermaid();\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'mermaid-view',\n this.renderMermaid.bind(this),\n );\n\n this.validateEntityId();\n }\n\n initializeMermaid() {\n // https://github.com/diplodoc-platform/mermaid-extension/tree/master#prepared-mermaid-runtime\n window.mermaidJsonp = window.mermaidJsonp || [];\n window.mermaidJsonp.push((mermaid: Mermaid) => {\n mermaidInstance = mermaid;\n });\n\n this.loadRuntimeScript();\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private validateEntityId() {\n if (\n isInvalidEntityId({\n node: this.node,\n doc: this.view.state.doc,\n defaultId: defaultMermaidEntityId,\n })\n ) {\n const newId = generateEntityId(MermaidConsts.NodeName);\n this.view.dispatch(\n this.view.state.tr.setNodeAttribute(\n this.getPos()!,\n MermaidConsts.NodeAttrs.EntityId,\n newId,\n ),\n );\n }\n }\n\n private onChange(attrs: {[MermaidConsts.NodeAttrs.content]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private getMermaidInstance = () => mermaidInstance;\n\n private renderMermaid() {\n return (\n <Portal container={this.dom}>\n <MermaidView\n view={this.view}\n onChange={this.onChange.bind(this)}\n node={this.node}\n getMermaidInstance={this.getMermaidInstance}\n getPos={this.getPos}\n options={this.options}\n />\n </Portal>\n );\n }\n}\n"]}
@@ -2,6 +2,10 @@ import type { Action, ExtensionAuto } from "../../../core/index.js";
2
2
  import { MermaidAction } from "./MermaidSpecs/const.js";
3
3
  export type MermaidOptions = {
4
4
  loadRuntimeScript: () => void;
5
+ autoSave?: {
6
+ enabled: boolean;
7
+ delay?: number;
8
+ };
5
9
  };
6
10
  export declare const Mermaid: ExtensionAuto<MermaidOptions>;
7
11
  declare global {
@@ -2,13 +2,13 @@ import { WMermaidNodeView } from "./MermaidNodeView/index.js";
2
2
  import { MermaidSpecs } from "./MermaidSpecs/index.js";
3
3
  import { MermaidAction } from "./MermaidSpecs/const.js";
4
4
  import { addMermaid } from "./actions.js";
5
- export const Mermaid = (builder, { loadRuntimeScript }) => {
5
+ export const Mermaid = (builder, options) => {
6
6
  builder.use(MermaidSpecs, {
7
- nodeView: MermaidNodeViewFactory({ loadRuntimeScript }),
7
+ nodeView: MermaidNodeViewFactory(options),
8
8
  });
9
9
  builder.addAction(MermaidAction, () => addMermaid);
10
10
  };
11
- const MermaidNodeViewFactory = ({ loadRuntimeScript }) => () => (node, view, getPos) => {
12
- return new WMermaidNodeView(node, view, getPos, { loadRuntimeScript });
11
+ const MermaidNodeViewFactory = (options) => () => (node, view, getPos) => {
12
+ return new WMermaidNodeView(node, view, getPos, options);
13
13
  };
14
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,mCAA0B;AACnD,OAAO,EAAC,YAAY,EAAC,gCAAuB;AAC5C,OAAO,EAAC,aAAa,EAAC,gCAA6B;AACnD,OAAO,EAAC,UAAU,EAAC,qBAAkB;AAIrC,MAAM,CAAC,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,EAAC,iBAAiB,EAAC,EAAE,EAAE;IACnF,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;QACtB,QAAQ,EAAE,sBAAsB,CAAC,EAAC,iBAAiB,EAAC,CAAC;KACxD,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAGxB,CAAC,EAAC,iBAAiB,EAAC,EAAE,EAAE,CACxB,GAAG,EAAE,CACL,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IACnB,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAC,iBAAiB,EAAC,CAAC,CAAC;AACzE,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto, ExtensionDeps, NodeViewConstructor} from '../../../core';\n\nimport {WMermaidNodeView} from './MermaidNodeView';\nimport {MermaidSpecs} from './MermaidSpecs';\nimport {MermaidAction} from './MermaidSpecs/const';\nimport {addMermaid} from './actions';\n\nexport type MermaidOptions = {loadRuntimeScript: () => void};\n\nexport const Mermaid: ExtensionAuto<MermaidOptions> = (builder, {loadRuntimeScript}) => {\n builder.use(MermaidSpecs, {\n nodeView: MermaidNodeViewFactory({loadRuntimeScript}),\n });\n\n builder.addAction(MermaidAction, () => addMermaid);\n};\n\nconst MermaidNodeViewFactory: (\n opts: MermaidOptions,\n) => (deps: ExtensionDeps) => NodeViewConstructor =\n ({loadRuntimeScript}) =>\n () =>\n (node, view, getPos) => {\n return new WMermaidNodeView(node, view, getPos, {loadRuntimeScript});\n };\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [MermaidAction]: Action;\n }\n }\n interface Window {\n mermaidJsonp: Function[];\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,gBAAgB,EAAC,mCAA0B;AACnD,OAAO,EAAC,YAAY,EAAC,gCAAuB;AAC5C,OAAO,EAAC,aAAa,EAAC,gCAA6B;AACnD,OAAO,EAAC,UAAU,EAAC,qBAAkB;AAUrC,MAAM,CAAC,MAAM,OAAO,GAAkC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IACvE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;QACtB,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC;KAC5C,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAEwB,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC1F,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto, ExtensionDeps, NodeViewConstructor} from '../../../core';\n\nimport {WMermaidNodeView} from './MermaidNodeView';\nimport {MermaidSpecs} from './MermaidSpecs';\nimport {MermaidAction} from './MermaidSpecs/const';\nimport {addMermaid} from './actions';\n\nexport type MermaidOptions = {\n loadRuntimeScript: () => void;\n autoSave?: {\n enabled: boolean;\n delay?: number;\n };\n};\n\nexport const Mermaid: ExtensionAuto<MermaidOptions> = (builder, options) => {\n builder.use(MermaidSpecs, {\n nodeView: MermaidNodeViewFactory(options),\n });\n\n builder.addAction(MermaidAction, () => addMermaid);\n};\n\nconst MermaidNodeViewFactory: (\n opts: MermaidOptions,\n) => (deps: ExtensionDeps) => NodeViewConstructor = (options) => () => (node, view, getPos) => {\n return new WMermaidNodeView(node, view, getPos, options);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [MermaidAction]: Action;\n }\n }\n interface Window {\n mermaidJsonp: Function[];\n }\n}\n"]}
@@ -8,7 +8,7 @@ import { SharedStateKey } from "../../../behavior/SharedState/index.js";
8
8
  import { TextAreaFixed as TextArea } from "../../../../forms/TextInput.js";
9
9
  import { i18n } from "../../../../i18n/common/index.js";
10
10
  import { debounce } from "../../../../lodash.js";
11
- import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
11
+ import { useAutoSave, useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
12
12
  import { useSharedEditingState } from "../../../../react-utils/useSharedEditingState.js";
13
13
  import { removeNode } from "../../../../utils/remove-node.js";
14
14
  import { YfmHtmlBlockConsts } from "../YfmHtmlBlockSpecs/const.js";
@@ -135,15 +135,19 @@ const YfmHtmlBlockPreview = ({ html, onClick, config }) => {
135
135
  height,
136
136
  }, ref: ref, title: generateID(), frameBorder: 0, className: b('content'), srcDoc: html }));
137
137
  };
138
- const CodeEditMode = ({ initialText, onSave, onCancel }) => {
139
- const [text, setText] = useState(initialText || '\n');
138
+ const CodeEditMode = ({ initialText, onSave, onCancel, options: { autoSave } }) => {
139
+ const { value, handleChange, handleManualSave, isSaveDisabled } = useAutoSave({
140
+ initialValue: initialText || '\n',
141
+ onSave,
142
+ onClose: onCancel,
143
+ autoSave,
144
+ });
140
145
  return (_jsx("div", { className: b({ editing: true }), children: _jsxs("div", { className: b('editor'), children: [_jsx(TextArea, { controlProps: {
141
146
  className: STOP_EVENT_CLASSNAME,
142
- }, value: text, onUpdate: (v) => {
143
- setText(v);
144
- }, autoFocus: true }), _jsx("div", { className: b('controls'), children: _jsxs("div", { children: [_jsx(Button, { onClick: onCancel, view: 'flat', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('cancel') }) }), _jsx(Button, { onClick: () => onSave(text), view: 'action', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('save') }) })] }) })] }) }));
147
+ }, value: value, onUpdate: handleChange, autoFocus: true }), _jsx("div", { className: b('controls'), children: _jsxs("div", { children: [_jsx(Button, { onClick: onCancel, view: 'flat', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('cancel') }) }), _jsx(Button, { onClick: handleManualSave, view: 'action', disabled: isSaveDisabled, children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('save') }) })] }) })] }) }));
145
148
  };
146
- export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = '' }, }) => {
149
+ export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options }) => {
150
+ const { useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = '' } = options;
147
151
  const entityId = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];
148
152
  const entityKey = useMemo(() => SharedStateKey.define({ name: entityId }), [entityId]);
149
153
  const config = useConfig?.();
@@ -153,8 +157,7 @@ export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useC
153
157
  if (editing) {
154
158
  return (_jsx(CodeEditMode, { initialText: node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc], onCancel: unsetEditing, onSave: (v) => {
155
159
  onChange({ [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v });
156
- unsetEditing();
157
- } }));
160
+ }, options: options }));
158
161
  }
159
162
  let additional = baseTarget ? `<base target="${baseTarget}">` : '';
160
163
  if (styles) {