@gravity-ui/markdown-editor 15.23.0 → 15.24.1

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 (156) hide show
  1. package/build/cjs/bundle/ToolbarView.js +2 -1
  2. package/build/cjs/bundle/ToolbarView.js.map +1 -1
  3. package/build/cjs/bundle/settings/index.d.ts +2 -1
  4. package/build/cjs/bundle/settings/index.js +6 -2
  5. package/build/cjs/bundle/settings/index.js.map +1 -1
  6. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  7. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  8. package/build/cjs/common/layout.d.ts +3 -0
  9. package/build/cjs/common/layout.js +7 -0
  10. package/build/cjs/common/layout.js.map +1 -0
  11. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  12. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +11 -3
  13. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  14. package/build/cjs/extensions/markdown/Table/commands.d.ts +2 -0
  15. package/build/cjs/extensions/markdown/Table/commands.js +73 -0
  16. package/build/cjs/extensions/markdown/Table/commands.js.map +1 -0
  17. package/build/cjs/extensions/markdown/Table/helpers.d.ts +7 -2
  18. package/build/cjs/extensions/markdown/Table/helpers.js +22 -9
  19. package/build/cjs/extensions/markdown/Table/helpers.js.map +1 -1
  20. package/build/cjs/extensions/markdown/Table/index.js +3 -0
  21. package/build/cjs/extensions/markdown/Table/index.js.map +1 -1
  22. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +35 -0
  23. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  24. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  25. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  26. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  27. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  28. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  29. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +6 -0
  30. package/build/cjs/extensions/yfm/ImgSize/utils.js +25 -0
  31. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  32. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  33. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js +6 -1
  34. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  35. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  36. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js +2 -1
  37. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  38. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  39. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +6 -6
  40. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  41. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  42. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js +6 -6
  43. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  44. package/build/cjs/extensions/yfm/YfmCut/const.d.ts +9 -1
  45. package/build/cjs/extensions/yfm/YfmCut/const.js +13 -6
  46. package/build/cjs/extensions/yfm/YfmCut/const.js.map +1 -1
  47. package/build/cjs/extensions/yfm/YfmCut/index.css +0 -3
  48. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  49. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  50. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  51. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  52. package/build/cjs/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  53. package/build/cjs/extensions/yfm/YfmCut/plugins/active.js +6 -7
  54. package/build/cjs/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  55. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  56. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js +8 -9
  57. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  58. package/build/cjs/react-utils/index.d.ts +1 -0
  59. package/build/cjs/react-utils/index.js +1 -0
  60. package/build/cjs/react-utils/index.js.map +1 -1
  61. package/build/cjs/react-utils/useSticky.js +13 -2
  62. package/build/cjs/react-utils/useSticky.js.map +1 -1
  63. package/build/cjs/react-utils/useTargetZIndex.d.ts +1 -0
  64. package/build/cjs/react-utils/useTargetZIndex.js +50 -0
  65. package/build/cjs/react-utils/useTargetZIndex.js.map +1 -0
  66. package/build/cjs/toolbar/ToolbarListButton.js +4 -1
  67. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  68. package/build/cjs/utils/get-target-z-index.d.ts +1 -0
  69. package/build/cjs/utils/get-target-z-index.js +17 -0
  70. package/build/cjs/utils/get-target-z-index.js.map +1 -0
  71. package/build/cjs/utils/inputrules.d.ts +1 -0
  72. package/build/cjs/utils/inputrules.js +8 -3
  73. package/build/cjs/utils/inputrules.js.map +1 -1
  74. package/build/cjs/utils/rulebuilders.js +2 -0
  75. package/build/cjs/utils/rulebuilders.js.map +1 -1
  76. package/build/cjs/version.js +1 -1
  77. package/build/cjs/version.js.map +1 -1
  78. package/build/esm/bundle/ToolbarView.js +2 -1
  79. package/build/esm/bundle/ToolbarView.js.map +1 -1
  80. package/build/esm/bundle/settings/index.d.ts +2 -1
  81. package/build/esm/bundle/settings/index.js +6 -2
  82. package/build/esm/bundle/settings/index.js.map +1 -1
  83. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  84. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  85. package/build/esm/common/layout.d.ts +3 -0
  86. package/build/esm/common/layout.js +4 -0
  87. package/build/esm/common/layout.js.map +1 -0
  88. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  89. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +10 -2
  90. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  91. package/build/esm/extensions/markdown/Table/commands.d.ts +2 -0
  92. package/build/esm/extensions/markdown/Table/commands.js +69 -0
  93. package/build/esm/extensions/markdown/Table/commands.js.map +1 -0
  94. package/build/esm/extensions/markdown/Table/helpers.d.ts +7 -2
  95. package/build/esm/extensions/markdown/Table/helpers.js +9 -3
  96. package/build/esm/extensions/markdown/Table/helpers.js.map +1 -1
  97. package/build/esm/extensions/markdown/Table/index.js +3 -0
  98. package/build/esm/extensions/markdown/Table/index.js.map +1 -1
  99. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +36 -1
  100. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  101. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  102. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  103. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  104. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  105. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  106. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +6 -0
  107. package/build/esm/extensions/yfm/ImgSize/utils.js +22 -0
  108. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  109. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  110. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js +5 -0
  111. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  112. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  113. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js +1 -1
  114. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  115. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  116. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +7 -7
  117. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  118. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  119. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js +5 -5
  120. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  121. package/build/esm/extensions/yfm/YfmCut/const.d.ts +9 -1
  122. package/build/esm/extensions/yfm/YfmCut/const.js +8 -1
  123. package/build/esm/extensions/yfm/YfmCut/const.js.map +1 -1
  124. package/build/esm/extensions/yfm/YfmCut/index.css +0 -3
  125. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  126. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  127. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  128. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  129. package/build/esm/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  130. package/build/esm/extensions/yfm/YfmCut/plugins/active.js +4 -5
  131. package/build/esm/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  132. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  133. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js +6 -7
  134. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  135. package/build/esm/react-utils/index.d.ts +1 -0
  136. package/build/esm/react-utils/index.js +1 -0
  137. package/build/esm/react-utils/index.js.map +1 -1
  138. package/build/esm/react-utils/useSticky.js +13 -2
  139. package/build/esm/react-utils/useSticky.js.map +1 -1
  140. package/build/esm/react-utils/useTargetZIndex.d.ts +1 -0
  141. package/build/esm/react-utils/useTargetZIndex.js +47 -0
  142. package/build/esm/react-utils/useTargetZIndex.js.map +1 -0
  143. package/build/esm/toolbar/ToolbarListButton.js +4 -1
  144. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  145. package/build/esm/utils/get-target-z-index.d.ts +1 -0
  146. package/build/esm/utils/get-target-z-index.js +14 -0
  147. package/build/esm/utils/get-target-z-index.js.map +1 -0
  148. package/build/esm/utils/inputrules.d.ts +1 -0
  149. package/build/esm/utils/inputrules.js +5 -1
  150. package/build/esm/utils/inputrules.js.map +1 -1
  151. package/build/esm/utils/rulebuilders.js +3 -1
  152. package/build/esm/utils/rulebuilders.js.map +1 -1
  153. package/build/esm/version.js +1 -1
  154. package/build/esm/version.js.map +1 -1
  155. package/build/styles.css +6 -8
  156. package/package.json +2 -2
@@ -10,7 +10,4 @@
10
10
  }
11
11
  .ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
12
12
  outline: 0;
13
- }
14
- .ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
15
- transform: translateY(-50%);
16
13
  }
@@ -1,13 +1,14 @@
1
- .yfm-cut-title .g-md-yfm-cut-title-inner {
1
+ .ProseMirror.yfm .yfm-cut-title > .g-md-yfm-cut-title-inner {
2
2
  cursor: text;
3
3
  }
4
-
5
- .yfm-cut-content {
4
+ .ProseMirror.yfm .yfm-cut-content {
6
5
  display: none;
7
6
  overflow: hidden;
8
7
  transition: height 0.3s ease-in-out;
9
8
  }
10
-
11
- .open > .yfm-cut-content {
9
+ .ProseMirror.yfm .yfm-cut.yfm-cut-open > .yfm-cut-title:before {
10
+ transform: translateY(-50%);
11
+ }
12
+ .ProseMirror.yfm .yfm-cut.yfm-cut-open > .yfm-cut-content {
12
13
  display: revert;
13
14
  }
@@ -1,5 +1,5 @@
1
- import type { Node } from 'prosemirror-model';
2
- import type { NodeView } from 'prosemirror-view';
1
+ import type { Node } from "../../../../pm/model.js";
2
+ import type { NodeView } from "../../../../pm/view.js";
3
3
  import "./yfm-cut-title.css";
4
4
  export declare class YfmCutTitleNodeView implements NodeView {
5
5
  readonly dom: HTMLElement;
@@ -7,4 +7,7 @@ export declare class YfmCutTitleNodeView implements NodeView {
7
7
  private node;
8
8
  constructor(node: Node);
9
9
  update(node: Node): boolean;
10
+ destroy(): void;
11
+ private _onTitleClick;
12
+ private _onTitleInnerClick;
10
13
  }
@@ -1,3 +1,4 @@
1
+ import { YfmCutClassName } from "../const.js";
1
2
  import "./yfm-cut-title.css";
2
3
  export class YfmCutTitleNodeView {
3
4
  dom;
@@ -6,15 +7,11 @@ export class YfmCutTitleNodeView {
6
7
  constructor(node) {
7
8
  this.node = node;
8
9
  this.dom = document.createElement('div');
9
- this.dom.classList.add('yfm-cut-title');
10
- this.dom.replaceChildren((this.contentDOM = document.createElement('div')));
11
- this.contentDOM.classList.add('g-md-yfm-cut-title-inner');
12
- this.contentDOM.addEventListener('click', (e) => {
13
- // ignore clicking on the title content
14
- // you can open/close yfm-cut by clicking on the arrow icon
15
- e.stopPropagation();
16
- e.preventDefault();
17
- });
10
+ this.dom.classList.add(YfmCutClassName.Title);
11
+ this.dom.addEventListener('click', this._onTitleClick);
12
+ this.contentDOM = this.dom.appendChild(document.createElement('div'));
13
+ this.contentDOM.classList.add(YfmCutClassName.TitleInner);
14
+ this.contentDOM.addEventListener('click', this._onTitleInnerClick);
18
15
  }
19
16
  update(node) {
20
17
  if (this.node.type !== node.type)
@@ -22,5 +19,25 @@ export class YfmCutTitleNodeView {
22
19
  this.node = node;
23
20
  return true;
24
21
  }
22
+ destroy() {
23
+ this.dom.removeEventListener('click', this._onTitleClick);
24
+ this.contentDOM.removeEventListener('click', this._onTitleInnerClick);
25
+ }
26
+ _onTitleClick = (e) => {
27
+ const { currentTarget } = e;
28
+ if (currentTarget instanceof HTMLElement) {
29
+ const parent = currentTarget.parentElement;
30
+ if (parent?.classList.contains(YfmCutClassName.Cut)) {
31
+ // TODO: toggle open classname via prosemirror decoration
32
+ parent.classList.toggle(YfmCutClassName.Open);
33
+ }
34
+ }
35
+ };
36
+ _onTitleInnerClick = (e) => {
37
+ // ignore clicking on the title content
38
+ // you can open/close yfm-cut by clicking on the arrow icon
39
+ e.stopPropagation();
40
+ e.preventDefault();
41
+ };
25
42
  }
26
43
  //# sourceMappingURL=yfm-cut-title.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yfm-cut-title.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts"],"names":[],"mappings":"AAGA,6BAA8B;AAE9B,MAAM,OAAO,mBAAmB;IACnB,GAAG,CAAc;IACjB,UAAU,CAAc;IAEzB,IAAI,CAAO;IAEnB,YAAY,IAAU;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5C,uCAAuC;YACvC,2DAA2D;YAC3D,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {NodeView} from 'prosemirror-view';\n\nimport './yfm-cut-title.scss';\n\nexport class YfmCutTitleNodeView implements NodeView {\n readonly dom: HTMLElement;\n readonly contentDOM: HTMLElement;\n\n private node: Node;\n\n constructor(node: Node) {\n this.node = node;\n\n this.dom = document.createElement('div');\n this.dom.classList.add('yfm-cut-title');\n this.dom.replaceChildren((this.contentDOM = document.createElement('div')));\n this.contentDOM.classList.add('g-md-yfm-cut-title-inner');\n this.contentDOM.addEventListener('click', (e) => {\n // ignore clicking on the title content\n // you can open/close yfm-cut by clicking on the arrow icon\n e.stopPropagation();\n e.preventDefault();\n });\n }\n\n update(node: Node): boolean {\n if (this.node.type !== node.type) return false;\n this.node = node;\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"yfm-cut-title.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,eAAe,EAAC,oBAAiB;AAEzC,6BAA8B;AAE9B,MAAM,OAAO,mBAAmB;IACnB,GAAG,CAAc;IACjB,UAAU,CAAc;IAEzB,IAAI,CAAO;IAEnB,YAAY,IAAU;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1E,CAAC;IAEO,aAAa,GAAG,CAAC,CAAa,EAAE,EAAE;QACtC,MAAM,EAAC,aAAa,EAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,aAAa,YAAY,WAAW,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC;YAC3C,IAAI,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClD,yDAAyD;gBACzD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEM,kBAAkB,GAAG,CAAC,CAAa,EAAE,EAAE;QAC3C,uCAAuC;QACvC,2DAA2D;QAC3D,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC,CAAC;CACL","sourcesContent":["import type {Node} from '#pm/model';\nimport type {NodeView} from '#pm/view';\n\nimport {YfmCutClassName} from '../const';\n\nimport './yfm-cut-title.scss';\n\nexport class YfmCutTitleNodeView implements NodeView {\n readonly dom: HTMLElement;\n readonly contentDOM: HTMLElement;\n\n private node: Node;\n\n constructor(node: Node) {\n this.node = node;\n\n this.dom = document.createElement('div');\n this.dom.classList.add(YfmCutClassName.Title);\n this.dom.addEventListener('click', this._onTitleClick);\n\n this.contentDOM = this.dom.appendChild(document.createElement('div'));\n this.contentDOM.classList.add(YfmCutClassName.TitleInner);\n this.contentDOM.addEventListener('click', this._onTitleInnerClick);\n }\n\n update(node: Node): boolean {\n if (this.node.type !== node.type) return false;\n this.node = node;\n return true;\n }\n\n destroy() {\n this.dom.removeEventListener('click', this._onTitleClick);\n this.contentDOM.removeEventListener('click', this._onTitleInnerClick);\n }\n\n private _onTitleClick = (e: MouseEvent) => {\n const {currentTarget} = e;\n if (currentTarget instanceof HTMLElement) {\n const parent = currentTarget.parentElement;\n if (parent?.classList.contains(YfmCutClassName.Cut)) {\n // TODO: toggle open classname via prosemirror decoration\n parent.classList.toggle(YfmCutClassName.Open);\n }\n }\n };\n\n private _onTitleInnerClick = (e: MouseEvent) => {\n // ignore clicking on the title content\n // you can open/close yfm-cut by clicking on the arrow icon\n e.stopPropagation();\n e.preventDefault();\n };\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { Plugin } from 'prosemirror-state';
1
+ import { Plugin } from "../../../../pm/state.js";
2
2
  export declare const cutActivePlugin: () => Plugin<any>;
@@ -1,8 +1,7 @@
1
- import { Plugin } from 'prosemirror-state';
2
- import { Decoration, DecorationSet } from 'prosemirror-view';
1
+ import { Plugin } from "../../../../pm/state.js";
2
+ import { Decoration, DecorationSet } from "../../../../pm/view.js";
3
3
  import { isNodeSelection, isTextSelection } from "../../../../utils/selection.js";
4
- import { cutType } from "../const.js";
5
- const YFM_CUT_ACTIVE_CLASSNAME = 'yfm-cut-active';
4
+ import { YfmCutClassName, cutType } from "../const.js";
6
5
  export const cutActivePlugin = () => {
7
6
  return new Plugin({
8
7
  props: {
@@ -12,7 +11,7 @@ export const cutActivePlugin = () => {
12
11
  const yfmCutType = cutType(state.schema);
13
12
  const createDeco = ({ pos, node }) => {
14
13
  decos.push(Decoration.node(pos, pos + node.nodeSize, {
15
- class: YFM_CUT_ACTIVE_CLASSNAME,
14
+ class: YfmCutClassName.Active,
16
15
  }));
17
16
  };
18
17
  if (isNodeSelection(sel)) {
@@ -1 +1 @@
1
- {"version":3,"file":"active.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/active.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeType, ResolvedPos} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport type {NodeWithPos} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport {isNodeSelection, isTextSelection} from '../../../../utils/selection';\nimport {cutType} from '../const';\n\nconst YFM_CUT_ACTIVE_CLASSNAME = 'yfm-cut-active';\n\nexport const cutActivePlugin = () => {\n return new Plugin({\n props: {\n decorations(state) {\n const decos: Decoration[] = [];\n const sel = state.selection;\n const yfmCutType = cutType(state.schema);\n\n const createDeco = ({pos, node}: NodeWithPos) => {\n decos.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: YFM_CUT_ACTIVE_CLASSNAME,\n }),\n );\n };\n\n if (isNodeSelection(sel)) {\n if (sel.node.type === yfmCutType) createDeco({pos: sel.from, node: sel.node});\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n } else if (isTextSelection(sel)) {\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n if (!sel.$from.sameParent(sel.$to)) {\n findParentNodesOfType(yfmCutType, sel.$to).forEach(createDeco);\n state.doc.nodesBetween(sel.from, sel.to, (node, pos) => {\n if (node.type === yfmCutType) createDeco({pos, node});\n if (node.isTextblock) return false;\n return true;\n });\n }\n } else {\n // some other selection\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n }\n\n return decos.length ? DecorationSet.create(state.doc, decos) : DecorationSet.empty;\n },\n },\n });\n};\n\nfunction findParentNodesOfType(\n type: NodeType,\n $pos: ResolvedPos,\n): (NodeWithPos & {depth: number})[] {\n let {depth} = $pos;\n const nodes: (NodeWithPos & {depth: number})[] = [];\n\n while (depth >= 0) {\n const node = $pos.node(depth);\n if (node.type === type) nodes.push({depth, node, pos: $pos.before(depth)});\n depth--;\n }\n\n return nodes;\n}\n"]}
1
+ {"version":3,"file":"active.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/active.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeType, ResolvedPos} from '#pm/model';\nimport {Plugin} from '#pm/state';\nimport type {NodeWithPos} from '#pm/utils';\nimport {Decoration, DecorationSet} from '#pm/view';\nimport {isNodeSelection, isTextSelection} from 'src/utils/selection';\n\nimport {YfmCutClassName, cutType} from '../const';\n\nexport const cutActivePlugin = () => {\n return new Plugin({\n props: {\n decorations(state) {\n const decos: Decoration[] = [];\n const sel = state.selection;\n const yfmCutType = cutType(state.schema);\n\n const createDeco = ({pos, node}: NodeWithPos) => {\n decos.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: YfmCutClassName.Active,\n }),\n );\n };\n\n if (isNodeSelection(sel)) {\n if (sel.node.type === yfmCutType) createDeco({pos: sel.from, node: sel.node});\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n } else if (isTextSelection(sel)) {\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n if (!sel.$from.sameParent(sel.$to)) {\n findParentNodesOfType(yfmCutType, sel.$to).forEach(createDeco);\n state.doc.nodesBetween(sel.from, sel.to, (node, pos) => {\n if (node.type === yfmCutType) createDeco({pos, node});\n if (node.isTextblock) return false;\n return true;\n });\n }\n } else {\n // some other selection\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n }\n\n return decos.length ? DecorationSet.create(state.doc, decos) : DecorationSet.empty;\n },\n },\n });\n};\n\nfunction findParentNodesOfType(\n type: NodeType,\n $pos: ResolvedPos,\n): (NodeWithPos & {depth: number})[] {\n let {depth} = $pos;\n const nodes: (NodeWithPos & {depth: number})[] = [];\n\n while (depth >= 0) {\n const node = $pos.node(depth);\n if (node.type === type) nodes.push({depth, node, pos: $pos.before(depth)});\n depth--;\n }\n\n return nodes;\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { Plugin } from 'prosemirror-state';
1
+ import { Plugin } from "../../../../pm/state.js";
2
2
  export declare const cutAutoOpenPlugin: () => Plugin<any>;
@@ -1,9 +1,8 @@
1
- import { Plugin, PluginKey } from 'prosemirror-state';
2
- // @ts-ignore // TODO: fix cjs build
3
- import { findDomRefAtPos } from 'prosemirror-utils';
1
+ import { Plugin, PluginKey } from "../../../../pm/state.js";
2
+ import { findDomRefAtPos } from "../../../../pm/utils.js";
4
3
  import { throttle } from "../../../../lodash.js";
5
4
  import { isTextSelection } from "../../../../utils/selection.js";
6
- import { cutContentType, cutType } from "../const.js";
5
+ import { YfmCutClassName, cutContentType, cutType } from "../const.js";
7
6
  const key = new PluginKey('yfm-cut-auto-open');
8
7
  export const cutAutoOpenPlugin = () => {
9
8
  return new Plugin({
@@ -38,7 +37,7 @@ function openParentYfmCuts($pos, domAtPos) {
38
37
  if ($pos.node(depth).type === cutContentType(schema)) {
39
38
  if ($pos.node(depth - 1).type === cutType(schema)) {
40
39
  const { node: cutDomNode } = domAtPos($pos.start(depth - 1), 0);
41
- cutDomNode.classList.add('open');
40
+ cutDomNode.classList.add(YfmCutClassName.Open);
42
41
  depth--;
43
42
  }
44
43
  }
@@ -46,7 +45,7 @@ function openParentYfmCuts($pos, domAtPos) {
46
45
  }
47
46
  }
48
47
  class CutAutoOpenOnDragOver {
49
- static YFM_CUT_SELECTOR = '.yfm-cut:not(.open)';
48
+ static YFM_CUT_SELECTOR = `.${YfmCutClassName.Cut}:not(.${YfmCutClassName.Open})`;
50
49
  static OPEN_TIMEOUT = 500; //ms
51
50
  static THROTTLE_WAIT = 50; //ms
52
51
  _cutElem = null;
@@ -92,7 +91,7 @@ class CutAutoOpenOnDragOver {
92
91
  }
93
92
  _openCut() {
94
93
  if (this._editorView.dragging) {
95
- this._cutElem?.classList.add('open');
94
+ this._cutElem?.classList.add(YfmCutClassName.Open);
96
95
  }
97
96
  this._clear();
98
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auto-open.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/auto-open.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedPos} from 'prosemirror-model';\nimport {Plugin, PluginKey, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {throttle} from '../../../../lodash';\nimport {isTextSelection} from '../../../../utils/selection';\nimport {cutContentType, cutType} from '../const';\n\nconst key = new PluginKey('yfm-cut-auto-open');\n\nexport const cutAutoOpenPlugin = () => {\n return new Plugin({\n key,\n view(view) {\n update(view);\n const dragHandler = new CutAutoOpenOnDragOver(view);\n return {\n update: (view) => update(view),\n destroy: () => dragHandler.destroy(),\n };\n },\n });\n};\n\nfunction update(view: EditorView) {\n const sel = view.state.selection;\n const domAtPos = view.domAtPos.bind(view);\n if (isTextSelection(sel)) {\n if (sel.$cursor) {\n openParentYfmCuts(sel.$cursor, domAtPos);\n } else {\n openParentYfmCuts(sel.$head, domAtPos);\n openParentYfmCuts(sel.$anchor, domAtPos);\n }\n }\n}\n\nfunction openParentYfmCuts($pos: ResolvedPos, domAtPos: EditorView['domAtPos']): void {\n let {depth} = $pos;\n const {schema} = $pos.parent.type;\n while (depth > 0) {\n if ($pos.node(depth).type === cutContentType(schema)) {\n if ($pos.node(depth - 1).type === cutType(schema)) {\n const {node: cutDomNode} = domAtPos($pos.start(depth - 1), 0);\n (cutDomNode as Element).classList.add('open');\n depth--;\n }\n }\n depth--;\n }\n}\n\nclass CutAutoOpenOnDragOver implements PluginView {\n private static readonly YFM_CUT_SELECTOR = '.yfm-cut:not(.open)';\n private static readonly OPEN_TIMEOUT = 500; //ms\n private static readonly THROTTLE_WAIT = 50; //ms\n\n private _cutElem: HTMLElement | null = null;\n private _editorView: EditorView;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n private readonly _docListener;\n\n constructor(view: EditorView) {\n this._editorView = view;\n this._docListener = throttle(\n this._onDocEvent.bind(this),\n CutAutoOpenOnDragOver.THROTTLE_WAIT,\n );\n document.addEventListener('mousemove', this._docListener);\n document.addEventListener('dragover', this._docListener);\n }\n\n destroy(): void {\n this._clear();\n this._docListener.cancel();\n document.removeEventListener('mousemove', this._docListener);\n document.removeEventListener('dragover', this._docListener);\n }\n\n private _onDocEvent(event: MouseEvent) {\n const view = this._editorView;\n if (!view.dragging) return;\n const pos = view.posAtCoords({left: event.clientX, top: event.clientY});\n if (!pos) return;\n const elem = findDomRefAtPos(pos.pos, view.domAtPos.bind(view)) as HTMLElement;\n const cutElem = elem.closest(CutAutoOpenOnDragOver.YFM_CUT_SELECTOR);\n if (cutElem === this._cutElem) return;\n this._clear();\n if (cutElem) this._setCutElem(cutElem as HTMLElement);\n }\n\n private _clear() {\n if (this._timeout !== null) clearTimeout(this._timeout);\n this._timeout = null;\n this._cutElem = null;\n }\n\n private _setCutElem(elem: HTMLElement) {\n this._cutElem = elem;\n this._timeout = setTimeout(this._openCut.bind(this), CutAutoOpenOnDragOver.OPEN_TIMEOUT);\n }\n\n private _openCut() {\n if (this._editorView.dragging) {\n this._cutElem?.classList.add('open');\n }\n this._clear();\n }\n}\n"]}
1
+ {"version":3,"file":"auto-open.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/auto-open.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedPos} from '#pm/model';\nimport {Plugin, PluginKey, type PluginView} from '#pm/state';\nimport {findDomRefAtPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {throttle} from 'src/lodash';\nimport {isTextSelection} from 'src/utils/selection';\n\nimport {YfmCutClassName, cutContentType, cutType} from '../const';\n\nconst key = new PluginKey('yfm-cut-auto-open');\n\nexport const cutAutoOpenPlugin = () => {\n return new Plugin({\n key,\n view(view) {\n update(view);\n const dragHandler = new CutAutoOpenOnDragOver(view);\n return {\n update: (view) => update(view),\n destroy: () => dragHandler.destroy(),\n };\n },\n });\n};\n\nfunction update(view: EditorView) {\n const sel = view.state.selection;\n const domAtPos = view.domAtPos.bind(view);\n if (isTextSelection(sel)) {\n if (sel.$cursor) {\n openParentYfmCuts(sel.$cursor, domAtPos);\n } else {\n openParentYfmCuts(sel.$head, domAtPos);\n openParentYfmCuts(sel.$anchor, domAtPos);\n }\n }\n}\n\nfunction openParentYfmCuts($pos: ResolvedPos, domAtPos: EditorView['domAtPos']): void {\n let {depth} = $pos;\n const {schema} = $pos.parent.type;\n while (depth > 0) {\n if ($pos.node(depth).type === cutContentType(schema)) {\n if ($pos.node(depth - 1).type === cutType(schema)) {\n const {node: cutDomNode} = domAtPos($pos.start(depth - 1), 0);\n (cutDomNode as Element).classList.add(YfmCutClassName.Open);\n depth--;\n }\n }\n depth--;\n }\n}\n\nclass CutAutoOpenOnDragOver implements PluginView {\n private static readonly YFM_CUT_SELECTOR =\n `.${YfmCutClassName.Cut}:not(.${YfmCutClassName.Open})` as const;\n private static readonly OPEN_TIMEOUT = 500; //ms\n private static readonly THROTTLE_WAIT = 50; //ms\n\n private _cutElem: HTMLElement | null = null;\n private _editorView: EditorView;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n private readonly _docListener;\n\n constructor(view: EditorView) {\n this._editorView = view;\n this._docListener = throttle(\n this._onDocEvent.bind(this),\n CutAutoOpenOnDragOver.THROTTLE_WAIT,\n );\n document.addEventListener('mousemove', this._docListener);\n document.addEventListener('dragover', this._docListener);\n }\n\n destroy(): void {\n this._clear();\n this._docListener.cancel();\n document.removeEventListener('mousemove', this._docListener);\n document.removeEventListener('dragover', this._docListener);\n }\n\n private _onDocEvent(event: MouseEvent) {\n const view = this._editorView;\n if (!view.dragging) return;\n const pos = view.posAtCoords({left: event.clientX, top: event.clientY});\n if (!pos) return;\n const elem = findDomRefAtPos(pos.pos, view.domAtPos.bind(view)) as HTMLElement;\n const cutElem = elem.closest(CutAutoOpenOnDragOver.YFM_CUT_SELECTOR);\n if (cutElem === this._cutElem) return;\n this._clear();\n if (cutElem) this._setCutElem(cutElem as HTMLElement);\n }\n\n private _clear() {\n if (this._timeout !== null) clearTimeout(this._timeout);\n this._timeout = null;\n this._cutElem = null;\n }\n\n private _setCutElem(elem: HTMLElement) {\n this._cutElem = elem;\n this._timeout = setTimeout(this._openCut.bind(this), CutAutoOpenOnDragOver.OPEN_TIMEOUT);\n }\n\n private _openCut() {\n if (this._editorView.dragging) {\n this._cutElem?.classList.add(YfmCutClassName.Open);\n }\n this._clear();\n }\n}\n"]}
@@ -5,3 +5,4 @@ export * from "./useNodeEditing.js";
5
5
  export * from "./useNodeHovered.js";
6
6
  export * from "./useSharedEditingState.js";
7
7
  export * from "./useSticky.js";
8
+ export * from "./useTargetZIndex.js";
@@ -5,4 +5,5 @@ export * from "./useNodeEditing.js";
5
5
  export * from "./useNodeHovered.js";
6
6
  export * from "./useSharedEditingState.js";
7
7
  export * from "./useSticky.js";
8
+ export * from "./useTargetZIndex.js";
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["react-utils/index.ts"],"names":[],"mappings":"AAAA,mCAAgC;AAChC,2BAAwB;AACxB,qCAAkC;AAClC,oCAAiC;AACjC,oCAAiC;AACjC,2CAAwC;AACxC,+BAA4B","sourcesContent":["export * from './ErrorBoundary';\nexport * from './hooks';\nexport * from './react-node-view';\nexport * from './useNodeEditing';\nexport * from './useNodeHovered';\nexport * from './useSharedEditingState';\nexport * from './useSticky';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["react-utils/index.ts"],"names":[],"mappings":"AAAA,mCAAgC;AAChC,2BAAwB;AACxB,qCAAkC;AAClC,oCAAiC;AACjC,oCAAiC;AACjC,2CAAwC;AACxC,+BAA4B;AAC5B,qCAAkC","sourcesContent":["export * from './ErrorBoundary';\nexport * from './hooks';\nexport * from './react-node-view';\nexport * from './useNodeEditing';\nexport * from './useNodeHovered';\nexport * from './useSharedEditingState';\nexport * from './useSticky';\nexport * from './useTargetZIndex';\n"]}
@@ -14,16 +14,27 @@ export function useSticky(elemRef) {
14
14
  const [sticky, setSticky] = useState(false);
15
15
  const stickyRef = useLatest(sticky);
16
16
  useEffectOnce(() => {
17
+ let rafId = null;
17
18
  observe();
18
19
  for (const eventName of events) {
19
- window.addEventListener(eventName, observe, true);
20
+ window.addEventListener(eventName, scheduleObserve, true);
20
21
  }
21
22
  return () => {
23
+ if (rafId !== null) {
24
+ cancelAnimationFrame(rafId);
25
+ }
22
26
  for (const eventName of events) {
23
- window.removeEventListener(eventName, observe, true);
27
+ window.removeEventListener(eventName, scheduleObserve, true);
24
28
  }
25
29
  };
30
+ function scheduleObserve() {
31
+ if (rafId !== null) {
32
+ cancelAnimationFrame(rafId);
33
+ }
34
+ rafId = requestAnimationFrame(observe);
35
+ }
26
36
  function observe() {
37
+ rafId = null;
27
38
  if (!elemRef.current)
28
39
  return;
29
40
  const refPageOffset = elemRef.current.getBoundingClientRect().top;
@@ -1 +1 @@
1
- {"version":3,"file":"useSticky.js","sourceRoot":"../../../src","sources":["react-utils/useSticky.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,aAAa,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;AAEnD,MAAM,MAAM,GAAsC,IAAI,GAAG,CAAuB;IAC5E,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,UAAU;IACV,UAAU;IACV,MAAM;IACN,mBAAmB;CACtB,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS,CAAwB,OAA2B;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,aAAa,CAAC,GAAG,EAAE;QACf,OAAO,EAAE,CAAC;QAEV,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC7B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,GAAG,EAAE;YACR,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC7B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACzD,CAAC;QACL,CAAC,CAAC;QAEF,SAAS,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO;YAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;YAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,aAAa,IAAI,YAAY,CAAC;YAEnD,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;iBACnD,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import {useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nconst events: ReadonlySet<keyof WindowEventMap> = new Set<keyof WindowEventMap>([\n 'resize',\n 'scroll',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'pageshow',\n 'load',\n 'orientationchange',\n]);\n\nexport function useSticky<T extends HTMLElement>(elemRef: React.RefObject<T>) {\n const [sticky, setSticky] = useState(false);\n const stickyRef = useLatest(sticky);\n\n useEffectOnce(() => {\n observe();\n\n for (const eventName of events) {\n window.addEventListener(eventName, observe, true);\n }\n\n return () => {\n for (const eventName of events) {\n window.removeEventListener(eventName, observe, true);\n }\n };\n\n function observe() {\n if (!elemRef.current) return;\n const refPageOffset = elemRef.current.getBoundingClientRect().top;\n const stickyOffset = parseInt(getComputedStyle(elemRef.current).top, 10);\n const stickyActive = refPageOffset <= stickyOffset;\n\n if (stickyActive && !stickyRef.current) setSticky(true);\n else if (!stickyActive && stickyRef.current) setSticky(false);\n }\n });\n\n return sticky;\n}\n"]}
1
+ {"version":3,"file":"useSticky.js","sourceRoot":"../../../src","sources":["react-utils/useSticky.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,aAAa,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;AAEnD,MAAM,MAAM,GAAsC,IAAI,GAAG,CAAuB;IAC5E,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,UAAU;IACV,UAAU;IACV,MAAM;IACN,mBAAmB;CACtB,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS,CAAwB,OAA2B;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,aAAa,CAAC,GAAG,EAAE;QACf,IAAI,KAAK,GAAkB,IAAI,CAAC;QAEhC,OAAO,EAAE,CAAC;QAEV,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC7B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,GAAG,EAAE;YACR,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC7B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;YACjE,CAAC;QACL,CAAC,CAAC;QAEF,SAAS,eAAe;YACpB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,SAAS,OAAO;YACZ,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO;YAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;YAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,aAAa,IAAI,YAAY,CAAC;YAEnD,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;iBACnD,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import {useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nconst events: ReadonlySet<keyof WindowEventMap> = new Set<keyof WindowEventMap>([\n 'resize',\n 'scroll',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'pageshow',\n 'load',\n 'orientationchange',\n]);\n\nexport function useSticky<T extends HTMLElement>(elemRef: React.RefObject<T>) {\n const [sticky, setSticky] = useState(false);\n const stickyRef = useLatest(sticky);\n\n useEffectOnce(() => {\n let rafId: number | null = null;\n\n observe();\n\n for (const eventName of events) {\n window.addEventListener(eventName, scheduleObserve, true);\n }\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n for (const eventName of events) {\n window.removeEventListener(eventName, scheduleObserve, true);\n }\n };\n\n function scheduleObserve() {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(observe);\n }\n\n function observe() {\n rafId = null;\n if (!elemRef.current) return;\n const refPageOffset = elemRef.current.getBoundingClientRect().top;\n const stickyOffset = parseInt(getComputedStyle(elemRef.current).top, 10);\n const stickyActive = refPageOffset <= stickyOffset;\n\n if (stickyActive && !stickyRef.current) setSticky(true);\n else if (!stickyActive && stickyRef.current) setSticky(false);\n }\n });\n\n return sticky;\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function useTargetZIndex(dataLayoutSelector: string, offset?: number): number | undefined;
@@ -0,0 +1,47 @@
1
+ import { useState } from 'react';
2
+ import { useEffectOnce, useLatest } from 'react-use';
3
+ import { getTargetZIndex } from "../utils/get-target-z-index.js";
4
+ const events = new Set([
5
+ 'resize',
6
+ 'scroll',
7
+ 'touchstart',
8
+ 'touchmove',
9
+ 'touchend',
10
+ 'pageshow',
11
+ 'load',
12
+ 'orientationchange',
13
+ ]);
14
+ export function useTargetZIndex(dataLayoutSelector, offset = 10) {
15
+ const [zIndex, setZIndex] = useState(() => getTargetZIndex(dataLayoutSelector, offset));
16
+ const zIndexRef = useLatest(zIndex);
17
+ useEffectOnce(() => {
18
+ let rafId = null;
19
+ recalculate();
20
+ for (const eventName of events) {
21
+ window.addEventListener(eventName, scheduleRecalculate, true);
22
+ }
23
+ return () => {
24
+ if (rafId !== null) {
25
+ cancelAnimationFrame(rafId);
26
+ }
27
+ for (const eventName of events) {
28
+ window.removeEventListener(eventName, scheduleRecalculate, true);
29
+ }
30
+ };
31
+ function scheduleRecalculate() {
32
+ if (rafId !== null) {
33
+ cancelAnimationFrame(rafId);
34
+ }
35
+ rafId = requestAnimationFrame(recalculate);
36
+ }
37
+ function recalculate() {
38
+ rafId = null;
39
+ const newZIndex = getTargetZIndex(dataLayoutSelector, offset);
40
+ if (newZIndex !== zIndexRef.current) {
41
+ setZIndex(newZIndex);
42
+ }
43
+ }
44
+ });
45
+ return zIndex;
46
+ }
47
+ //# sourceMappingURL=useTargetZIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTargetZIndex.js","sourceRoot":"../../../src","sources":["react-utils/useTargetZIndex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,aAAa,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,uCAAoC;AAE5D,MAAM,MAAM,GAAsC,IAAI,GAAG,CAAuB;IAC5E,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,UAAU;IACV,UAAU;IACV,MAAM;IACN,mBAAmB;CACtB,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,kBAA0B,EAAE,MAAM,GAAG,EAAE;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAqB,GAAG,EAAE,CAC1D,eAAe,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAC9C,CAAC;IACF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,aAAa,CAAC,GAAG,EAAE;QACf,IAAI,KAAK,GAAkB,IAAI,CAAC;QAEhC,WAAW,EAAE,CAAC;QAEd,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC7B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,GAAG,EAAE;YACR,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC7B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;YACrE,CAAC;QACL,CAAC,CAAC;QAEF,SAAS,mBAAmB;YACxB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC;QAED,SAAS,WAAW;YAChB,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,SAAS,GAAG,eAAe,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;YAC9D,IAAI,SAAS,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAClC,SAAS,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import {useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nimport {getTargetZIndex} from '../utils/get-target-z-index';\n\nconst events: ReadonlySet<keyof WindowEventMap> = new Set<keyof WindowEventMap>([\n 'resize',\n 'scroll',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'pageshow',\n 'load',\n 'orientationchange',\n]);\n\nexport function useTargetZIndex(dataLayoutSelector: string, offset = 10): number | undefined {\n const [zIndex, setZIndex] = useState<number | undefined>(() =>\n getTargetZIndex(dataLayoutSelector, offset),\n );\n const zIndexRef = useLatest(zIndex);\n\n useEffectOnce(() => {\n let rafId: number | null = null;\n\n recalculate();\n\n for (const eventName of events) {\n window.addEventListener(eventName, scheduleRecalculate, true);\n }\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n for (const eventName of events) {\n window.removeEventListener(eventName, scheduleRecalculate, true);\n }\n };\n\n function scheduleRecalculate() {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(recalculate);\n }\n\n function recalculate() {\n rafId = null;\n const newZIndex = getTargetZIndex(dataLayoutSelector, offset);\n if (newZIndex !== zIndexRef.current) {\n setZIndex(newZIndex);\n }\n }\n });\n\n return zIndex;\n}\n"]}
@@ -2,9 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { Fragment, useEffect, useState } from 'react';
3
3
  import { ChevronDown } from '@gravity-ui/icons';
4
4
  import { HelpMark, Hotkey, Icon, Menu, Popover, Popup } from '@gravity-ui/uikit';
5
+ import { LAYOUT } from "../common/layout.js";
5
6
  import { cn } from "../classname.js";
6
7
  import { i18n } from "../i18n/common/index.js";
7
8
  import { isFunction } from "../lodash.js";
9
+ import { useTargetZIndex } from "../react-utils/index.js";
8
10
  import { useBooleanState, useElementState } from "../react-utils/hooks.js";
9
11
  import { PreviewTooltip } from "./PreviewTooltip.js";
10
12
  import { ToolbarButtonView } from "./ToolbarButton.js";
@@ -14,6 +16,7 @@ export function ToolbarListButton({ className, editor, focus, onClick, icon, tit
14
16
  const [anchorElement, setAnchorElement] = useElementState();
15
17
  const [open, , hide, toggleOpen] = useBooleanState(false);
16
18
  const [popupItem, setPopupItem] = useState();
19
+ const zIndex = useTargetZIndex(LAYOUT.STICKY_TOOLBAR);
17
20
  const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));
18
21
  const popupOpen = everyDisabled ? false : open;
19
22
  const shouldForceHide = open && !popupOpen;
@@ -40,7 +43,7 @@ export function ToolbarListButton({ className, editor, focus, onClick, icon, tit
40
43
  setPopupItem(undefined);
41
44
  else
42
45
  toggleOpen();
43
- }, disableTooltip: disableTooltip || popupOpen, children: buttonContent }), _jsx(Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, children: _jsx(Menu, { size: "l", className: b('menu'), qa: qaMenu, "data-toolbar-menu-for": titleText, children: data
46
+ }, disableTooltip: disableTooltip || popupOpen, children: buttonContent }), _jsx(Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, zIndex: typeof zIndex === 'number' ? zIndex : undefined, children: _jsx(Menu, { size: "l", className: b('menu'), qa: qaMenu, "data-toolbar-menu-for": titleText, children: data
44
47
  .map((data) => {
45
48
  const { id, title, icon, hotkey, isActive, isEnable, exec, hint, hintWhenDisabled, preview, } = data;
46
49
  const titleText = isFunction(title) ? title() : title;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n qaActionDisabledPopover?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n qaActionDisabledPopover = 'g-md-toolbar-action-disabled-hint',\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n const titleText: string = isFunction(title) ? title() : title;\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n disableTooltip={disableTooltip || popupOpen}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup anchorElement={anchorElement} open={popupOpen} onOpenChange={hide}>\n <Menu size=\"l\" className={b('menu')} qa={qaMenu} data-toolbar-menu-for={titleText}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa={qaActionDisabledPopover}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview} disabled={disablePreview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n {!disableHotkey && (\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n )}\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
1
+ {"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {LAYOUT} from 'src/common/layout';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useTargetZIndex} from '../react-utils';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n qaActionDisabledPopover?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n qaActionDisabledPopover = 'g-md-toolbar-action-disabled-hint',\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n const zIndex = useTargetZIndex(LAYOUT.STICKY_TOOLBAR);\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n const titleText: string = isFunction(title) ? title() : title;\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n disableTooltip={disableTooltip || popupOpen}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup\n anchorElement={anchorElement}\n open={popupOpen}\n onOpenChange={hide}\n zIndex={typeof zIndex === 'number' ? zIndex : undefined}\n >\n <Menu size=\"l\" className={b('menu')} qa={qaMenu} data-toolbar-menu-for={titleText}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa={qaActionDisabledPopover}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview} disabled={disablePreview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n {!disableHotkey && (\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n )}\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function getTargetZIndex(dataLayoutSelector: string, offset?: number): number | undefined;
@@ -0,0 +1,14 @@
1
+ const DEFAULT_OFFSET = 10;
2
+ export function getTargetZIndex(dataLayoutSelector, offset = DEFAULT_OFFSET) {
3
+ const targetLayerElement = document.querySelector(`[data-layout="${dataLayoutSelector}"]`);
4
+ if (!targetLayerElement) {
5
+ return undefined;
6
+ }
7
+ const computedStyle = window.getComputedStyle(targetLayerElement);
8
+ const targetZIndex = parseInt(computedStyle.zIndex, 10);
9
+ if (!Number.isFinite(targetZIndex) || targetZIndex <= 0) {
10
+ return undefined;
11
+ }
12
+ return targetZIndex + offset;
13
+ }
14
+ //# sourceMappingURL=get-target-z-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-target-z-index.js","sourceRoot":"../../../src","sources":["utils/get-target-z-index.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,UAAU,eAAe,CAC3B,kBAA0B,EAC1B,MAAM,GAAG,cAAc;IAEvB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,kBAAkB,IAAI,CAAC,CAAC;IAE3F,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,YAAY,GAAG,MAAM,CAAC;AACjC,CAAC","sourcesContent":["const DEFAULT_OFFSET = 10;\n\nexport function getTargetZIndex(\n dataLayoutSelector: string,\n offset = DEFAULT_OFFSET,\n): number | undefined {\n const targetLayerElement = document.querySelector(`[data-layout=\"${dataLayoutSelector}\"]`);\n\n if (!targetLayerElement) {\n return undefined;\n }\n\n const computedStyle = window.getComputedStyle(targetLayerElement);\n const targetZIndex = parseInt(computedStyle.zIndex, 10);\n\n if (!Number.isFinite(targetZIndex) || targetZIndex <= 0) {\n return undefined;\n }\n\n return targetZIndex + offset;\n}\n"]}
@@ -2,6 +2,7 @@ import { InputRule } from 'prosemirror-inputrules';
2
2
  import { Fragment, type MarkType, type Node } from 'prosemirror-model';
3
3
  import { type EditorState } from 'prosemirror-state';
4
4
  export declare function hasCodeMark(state: EditorState, _match: RegExpMatchArray, start: number, end: number): boolean;
5
+ export declare function inDefaultTextblock(state: EditorState, _match: RegExpMatchArray, start: number, _end: number): boolean;
5
6
  export { textblockTypeInputRule, wrappingInputRule } from "./rulebuilders.js";
6
7
  export declare function markInputRule(rule: RegExp | {
7
8
  open: string;
@@ -1,10 +1,11 @@
1
1
  import { InputRule } from 'prosemirror-inputrules';
2
2
  import { Fragment } from 'prosemirror-model';
3
3
  import { TextSelection } from 'prosemirror-state';
4
+ // TODO: remove explicit import from base and code extensions
5
+ import { pType } from "../extensions/base/specs.js";
4
6
  import { codeType } from "../extensions/markdown/specs.js";
5
7
  import { isFunction } from "../lodash.js";
6
8
  import { isMarkActive } from "./marks.js";
7
- // TODO: remove explicit import from code extension
8
9
  export function hasCodeMark(state, _match, start, end) {
9
10
  // TODO: remove explicit import from code extension
10
11
  const codeMarkType = codeType(state.schema);
@@ -14,6 +15,9 @@ export function hasCodeMark(state, _match, start, end) {
14
15
  return true;
15
16
  return false;
16
17
  }
18
+ export function inDefaultTextblock(state, _match, start, _end) {
19
+ return state.doc.resolve(start).parent.type === pType(state.schema);
20
+ }
17
21
  export { textblockTypeInputRule, wrappingInputRule } from "./rulebuilders.js";
18
22
  function getMarksBetween(start, end, state) {
19
23
  let marks = [];
@@ -1 +1 @@
1
- {"version":3,"file":"inputrules.js","sourceRoot":"../../../src","sources":["utils/inputrules.ts"],"names":[],"mappings":"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","sourcesContent":["import {InputRule} from 'prosemirror-inputrules';\nimport {Fragment, type Mark, type MarkType, type Node} from 'prosemirror-model';\nimport {type EditorState, TextSelection} from 'prosemirror-state';\n\nimport {codeType} from '../extensions/markdown/specs';\nimport {isFunction} from '../lodash';\nimport {isMarkActive} from '../utils/marks';\n// TODO: remove explicit import from code extension\n\nexport function hasCodeMark(\n state: EditorState,\n _match: RegExpMatchArray,\n start: number,\n end: number,\n): boolean {\n // TODO: remove explicit import from code extension\n const codeMarkType = codeType(state.schema);\n if (isMarkActive(state, codeMarkType)) return true;\n if (state.doc.rangeHasMark(start, end, codeMarkType)) return true;\n return false;\n}\n\nexport {textblockTypeInputRule, wrappingInputRule} from './rulebuilders';\n\nfunction getMarksBetween(start: number, end: number, state: EditorState) {\n let marks: {start: number; end: number; mark: Mark}[] = [];\n\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [\n ...marks,\n ...node.marks.map((mark) => ({\n start: pos,\n end: pos + node.nodeSize,\n mark,\n })),\n ];\n });\n\n return marks;\n}\n\nfunction escapeRegex(string: string) {\n // eslint-disable-next-line no-useless-escape\n return string.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\n// TODO: link has a custom input rule handler, think about generalizing\nexport function markInputRule(\n rule: RegExp | {open: string; close: string; ignoreBetween?: string},\n markType: MarkType,\n getAttrs?: (match: any) => Record<string, unknown>,\n): InputRule {\n let regexp;\n if (rule instanceof RegExp) {\n regexp = rule;\n } else {\n const open = escapeRegex(rule.open);\n const close = escapeRegex(rule.close);\n const ignoreBetween = escapeRegex(rule.ignoreBetween || '');\n regexp = new RegExp(\n `(?:${open})` +\n (ignoreBetween ? `([^\\\\s${ignoreBetween}]+)` : `([\\\\S]+)`) +\n `(?:${close})\\\\s$`,\n );\n }\n return new InputRule(regexp, (state, match, start, end) => {\n // handle the rule only if is start of line or there is a space before \"open\" symbols\n if ((match as RegExpMatchArray).index! > 0) {\n const re = match as RegExpMatchArray;\n if (re.input![re.index! - 1] !== ' ') return null;\n }\n\n if (hasCodeMark(state, match, start, end)) return null;\n\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {tr} = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n\n const marksBetween = getMarksBetween(start, end, state);\n const excludedMarks = marksBetween\n .filter((item) => item.mark.type.excludes(markType))\n .filter((item) => item.end > matchStart);\n\n if (excludedMarks.length) {\n return null;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\ntype NodeInputRuleReplaceFragment = Node | Fragment | readonly Node[] | null | undefined;\n\nexport function nodeInputRule(\n regexp: RegExp,\n fragment: NodeInputRuleReplaceFragment | ((match: string) => NodeInputRuleReplaceFragment),\n selectionOffset = 0,\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const [matchStr] = match;\n const {tr} = state;\n\n if (matchStr) {\n tr.replaceWith(\n start - 1,\n end,\n isFunction(fragment)\n ? fragment(matchStr) ?? Fragment.empty\n : fragment ?? Fragment.empty,\n ).setSelection(new TextSelection(tr.doc.resolve(start + selectionOffset)));\n }\n\n return tr;\n });\n}\n\nexport function inlineNodeInputRule(\n regexp: RegExp,\n fragment: (match: string) => NodeInputRuleReplaceFragment,\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const [matchStr] = match;\n const {tr} = state;\n\n if (matchStr) {\n tr.replaceWith(start, end, fragment(matchStr) ?? Fragment.empty).setSelection(\n new TextSelection(tr.doc.resolve(end)),\n );\n }\n\n return tr;\n });\n}\n"]}
1
+ {"version":3,"file":"inputrules.js","sourceRoot":"../../../src","sources":["utils/inputrules.ts"],"names":[],"mappings":"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","sourcesContent":["import {InputRule} from 'prosemirror-inputrules';\nimport {Fragment, type Mark, type MarkType, type Node} from 'prosemirror-model';\nimport {type EditorState, TextSelection} from 'prosemirror-state';\n\n// TODO: remove explicit import from base and code extensions\nimport {pType} from 'src/extensions/base/specs';\nimport {codeType} from 'src/extensions/markdown/specs';\nimport {isFunction} from 'src/lodash';\nimport {isMarkActive} from 'src/utils/marks';\n\nexport function hasCodeMark(\n state: EditorState,\n _match: RegExpMatchArray,\n start: number,\n end: number,\n): boolean {\n // TODO: remove explicit import from code extension\n const codeMarkType = codeType(state.schema);\n if (isMarkActive(state, codeMarkType)) return true;\n if (state.doc.rangeHasMark(start, end, codeMarkType)) return true;\n return false;\n}\n\nexport function inDefaultTextblock(\n state: EditorState,\n _match: RegExpMatchArray,\n start: number,\n _end: number,\n): boolean {\n return state.doc.resolve(start).parent.type === pType(state.schema);\n}\n\nexport {textblockTypeInputRule, wrappingInputRule} from './rulebuilders';\n\nfunction getMarksBetween(start: number, end: number, state: EditorState) {\n let marks: {start: number; end: number; mark: Mark}[] = [];\n\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [\n ...marks,\n ...node.marks.map((mark) => ({\n start: pos,\n end: pos + node.nodeSize,\n mark,\n })),\n ];\n });\n\n return marks;\n}\n\nfunction escapeRegex(string: string) {\n // eslint-disable-next-line no-useless-escape\n return string.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\n// TODO: link has a custom input rule handler, think about generalizing\nexport function markInputRule(\n rule: RegExp | {open: string; close: string; ignoreBetween?: string},\n markType: MarkType,\n getAttrs?: (match: any) => Record<string, unknown>,\n): InputRule {\n let regexp;\n if (rule instanceof RegExp) {\n regexp = rule;\n } else {\n const open = escapeRegex(rule.open);\n const close = escapeRegex(rule.close);\n const ignoreBetween = escapeRegex(rule.ignoreBetween || '');\n regexp = new RegExp(\n `(?:${open})` +\n (ignoreBetween ? `([^\\\\s${ignoreBetween}]+)` : `([\\\\S]+)`) +\n `(?:${close})\\\\s$`,\n );\n }\n return new InputRule(regexp, (state, match, start, end) => {\n // handle the rule only if is start of line or there is a space before \"open\" symbols\n if ((match as RegExpMatchArray).index! > 0) {\n const re = match as RegExpMatchArray;\n if (re.input![re.index! - 1] !== ' ') return null;\n }\n\n if (hasCodeMark(state, match, start, end)) return null;\n\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {tr} = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n\n const marksBetween = getMarksBetween(start, end, state);\n const excludedMarks = marksBetween\n .filter((item) => item.mark.type.excludes(markType))\n .filter((item) => item.end > matchStart);\n\n if (excludedMarks.length) {\n return null;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\ntype NodeInputRuleReplaceFragment = Node | Fragment | readonly Node[] | null | undefined;\n\nexport function nodeInputRule(\n regexp: RegExp,\n fragment: NodeInputRuleReplaceFragment | ((match: string) => NodeInputRuleReplaceFragment),\n selectionOffset = 0,\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const [matchStr] = match;\n const {tr} = state;\n\n if (matchStr) {\n tr.replaceWith(\n start - 1,\n end,\n isFunction(fragment)\n ? fragment(matchStr) ?? Fragment.empty\n : fragment ?? Fragment.empty,\n ).setSelection(new TextSelection(tr.doc.resolve(start + selectionOffset)));\n }\n\n return tr;\n });\n}\n\nexport function inlineNodeInputRule(\n regexp: RegExp,\n fragment: (match: string) => NodeInputRuleReplaceFragment,\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const [matchStr] = match;\n const {tr} = state;\n\n if (matchStr) {\n tr.replaceWith(start, end, fragment(matchStr) ?? Fragment.empty).setSelection(\n new TextSelection(tr.doc.resolve(end)),\n );\n }\n\n return tr;\n });\n}\n"]}