@gravity-ui/markdown-editor 15.22.2 → 15.24.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 (188) 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 +2 -2
  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/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
  59. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js +61 -84
  60. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
  61. package/build/cjs/i18n/search/en.json +5 -2
  62. package/build/cjs/i18n/search/index.d.ts +4 -1
  63. package/build/cjs/i18n/search/ru.json +5 -2
  64. package/build/cjs/markup/codemirror/search-plugin/plugin.d.ts +2 -0
  65. package/build/cjs/markup/codemirror/search-plugin/plugin.js +13 -0
  66. package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
  67. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
  68. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js +9 -0
  69. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
  70. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
  71. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
  72. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
  73. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
  74. package/build/cjs/react-utils/index.d.ts +1 -0
  75. package/build/cjs/react-utils/index.js +1 -0
  76. package/build/cjs/react-utils/index.js.map +1 -1
  77. package/build/cjs/react-utils/useSticky.js +13 -2
  78. package/build/cjs/react-utils/useSticky.js.map +1 -1
  79. package/build/cjs/react-utils/useTargetZIndex.d.ts +1 -0
  80. package/build/cjs/react-utils/useTargetZIndex.js +50 -0
  81. package/build/cjs/react-utils/useTargetZIndex.js.map +1 -0
  82. package/build/cjs/toolbar/ToolbarListButton.js +4 -1
  83. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  84. package/build/cjs/utils/get-target-z-index.d.ts +1 -0
  85. package/build/cjs/utils/get-target-z-index.js +17 -0
  86. package/build/cjs/utils/get-target-z-index.js.map +1 -0
  87. package/build/cjs/utils/inputrules.d.ts +1 -0
  88. package/build/cjs/utils/inputrules.js +8 -3
  89. package/build/cjs/utils/inputrules.js.map +1 -1
  90. package/build/cjs/utils/rulebuilders.js +2 -0
  91. package/build/cjs/utils/rulebuilders.js.map +1 -1
  92. package/build/cjs/version.js +1 -1
  93. package/build/cjs/version.js.map +1 -1
  94. package/build/esm/bundle/ToolbarView.js +2 -1
  95. package/build/esm/bundle/ToolbarView.js.map +1 -1
  96. package/build/esm/bundle/settings/index.d.ts +2 -1
  97. package/build/esm/bundle/settings/index.js +6 -2
  98. package/build/esm/bundle/settings/index.js.map +1 -1
  99. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  100. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  101. package/build/esm/common/layout.d.ts +3 -0
  102. package/build/esm/common/layout.js +4 -0
  103. package/build/esm/common/layout.js.map +1 -0
  104. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  105. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +1 -1
  106. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  107. package/build/esm/extensions/markdown/Table/commands.d.ts +2 -0
  108. package/build/esm/extensions/markdown/Table/commands.js +69 -0
  109. package/build/esm/extensions/markdown/Table/commands.js.map +1 -0
  110. package/build/esm/extensions/markdown/Table/helpers.d.ts +7 -2
  111. package/build/esm/extensions/markdown/Table/helpers.js +9 -3
  112. package/build/esm/extensions/markdown/Table/helpers.js.map +1 -1
  113. package/build/esm/extensions/markdown/Table/index.js +3 -0
  114. package/build/esm/extensions/markdown/Table/index.js.map +1 -1
  115. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +36 -1
  116. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  117. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  118. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  119. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  120. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  121. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  122. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +6 -0
  123. package/build/esm/extensions/yfm/ImgSize/utils.js +22 -0
  124. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  125. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  126. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js +5 -0
  127. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  128. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  129. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js +1 -1
  130. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  131. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  132. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +7 -7
  133. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  134. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  135. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js +5 -5
  136. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  137. package/build/esm/extensions/yfm/YfmCut/const.d.ts +9 -1
  138. package/build/esm/extensions/yfm/YfmCut/const.js +8 -1
  139. package/build/esm/extensions/yfm/YfmCut/const.js.map +1 -1
  140. package/build/esm/extensions/yfm/YfmCut/index.css +0 -3
  141. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  142. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  143. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  144. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  145. package/build/esm/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  146. package/build/esm/extensions/yfm/YfmCut/plugins/active.js +4 -5
  147. package/build/esm/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  148. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  149. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js +6 -7
  150. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  151. package/build/esm/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
  152. package/build/esm/extensions/yfm/YfmTable/commands/backspace.js +60 -83
  153. package/build/esm/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
  154. package/build/esm/i18n/search/en.json +5 -2
  155. package/build/esm/i18n/search/index.d.ts +4 -1
  156. package/build/esm/i18n/search/ru.json +5 -2
  157. package/build/esm/markup/codemirror/search-plugin/plugin.d.ts +2 -0
  158. package/build/esm/markup/codemirror/search-plugin/plugin.js +14 -1
  159. package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
  160. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
  161. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js +4 -0
  162. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
  163. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
  164. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
  165. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
  166. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
  167. package/build/esm/react-utils/index.d.ts +1 -0
  168. package/build/esm/react-utils/index.js +1 -0
  169. package/build/esm/react-utils/index.js.map +1 -1
  170. package/build/esm/react-utils/useSticky.js +13 -2
  171. package/build/esm/react-utils/useSticky.js.map +1 -1
  172. package/build/esm/react-utils/useTargetZIndex.d.ts +1 -0
  173. package/build/esm/react-utils/useTargetZIndex.js +47 -0
  174. package/build/esm/react-utils/useTargetZIndex.js.map +1 -0
  175. package/build/esm/toolbar/ToolbarListButton.js +4 -1
  176. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  177. package/build/esm/utils/get-target-z-index.d.ts +1 -0
  178. package/build/esm/utils/get-target-z-index.js +14 -0
  179. package/build/esm/utils/get-target-z-index.js.map +1 -0
  180. package/build/esm/utils/inputrules.d.ts +1 -0
  181. package/build/esm/utils/inputrules.js +5 -1
  182. package/build/esm/utils/inputrules.js.map +1 -1
  183. package/build/esm/utils/rulebuilders.js +3 -1
  184. package/build/esm/utils/rulebuilders.js.map +1 -1
  185. package/build/esm/version.js +1 -1
  186. package/build/esm/version.js.map +1 -1
  187. package/build/styles.css +7 -8
  188. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SearchPopup.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/SearchPopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useRef, useState} from 'react';\n\nimport type {SearchQuery} from '@codemirror/search';\nimport {ChevronDown, ChevronUp, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n Card,\n Checkbox,\n Icon,\n Popup,\n TextInput,\n type TextInputProps,\n sp,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/search';\nimport {enterKeyHandler} from '../../../../utils/handlers';\n\nimport './SearchPopup.scss';\n\ntype SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;\ntype SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;\n\ninterface SearchCardProps {\n initial: SearchInitial;\n onSearchKeyDown?: (query: string) => void;\n onChange?: (query: string) => void;\n onClose?: (query: string) => void;\n onSearchPrev?: (query: string) => void;\n onSearchNext?: (query: string) => void;\n onConfigChange?: (config: SearchConfig) => void;\n}\n\nconst b = cn('search-card');\n\nconst noop = () => {};\nconst inverse = (val: boolean) => !val;\n\nexport const SearchCard: React.FC<SearchCardProps> = ({\n initial,\n onChange = noop,\n onClose = noop,\n onSearchPrev = noop,\n onSearchNext = noop,\n onConfigChange = noop,\n}) => {\n const [query, setQuery] = useState<string>(initial.search);\n const [isCaseSensitive, setIsCaseSensitive] = useState<boolean>(initial.caseSensitive);\n const [isWholeWord, setIsWholeWord] = useState<boolean>(initial.wholeWord);\n const textInputRef = useRef<HTMLInputElement>(null);\n\n const setInputFocus = () => {\n textInputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setQuery(value);\n onChange(value);\n };\n\n const handleClose = () => {\n setQuery('');\n onClose(query);\n setInputFocus();\n };\n\n const handlePrev = () => {\n onSearchPrev(query);\n setInputFocus();\n };\n\n const handleNext = () => {\n onSearchNext(query);\n setInputFocus();\n };\n\n const handleIsCaseSensitive = () => {\n onConfigChange({\n caseSensitive: !isCaseSensitive,\n wholeWord: isWholeWord,\n });\n setIsCaseSensitive(inverse);\n setInputFocus();\n };\n\n const handleIsWholeWord = () => {\n onConfigChange({\n caseSensitive: isCaseSensitive,\n wholeWord: !isWholeWord,\n });\n setIsWholeWord(inverse);\n setInputFocus();\n };\n\n const handleSearchKeyPress: TextInputProps['onKeyPress'] = enterKeyHandler(handleNext);\n\n return (\n <Card className={b()}>\n <div className={b('header')}>\n <span className={b('title')}> {i18n('title')}</span>\n <Button onClick={handleClose} size=\"s\" view=\"flat\">\n <Icon data={Xmark} size={14} />\n </Button>\n </div>\n <TextInput\n controlRef={textInputRef}\n className={sp({mb: 2})}\n size=\"s\"\n autoFocus\n onKeyPress={handleSearchKeyPress}\n onUpdate={handleInputChange}\n value={query}\n endContent={\n <>\n <Button onClick={handlePrev}>\n <Icon data={ChevronUp} size={12} />\n </Button>\n <Button onClick={handleNext}>\n <Icon data={ChevronDown} size={12} />\n </Button>\n </>\n }\n />\n <Checkbox\n size=\"m\"\n onUpdate={handleIsCaseSensitive}\n checked={isCaseSensitive}\n className={sp({mr: 4})}\n >\n {i18n('label_case-sensitive')}\n </Checkbox>\n <Checkbox size=\"m\" onUpdate={handleIsWholeWord} checked={isWholeWord}>\n {i18n('label_whole-word')}\n </Checkbox>\n </Card>\n );\n};\n\nexport interface SearchPopupProps extends SearchCardProps {\n open: boolean;\n anchor: HTMLElement;\n onClose: () => void;\n}\n\nexport const SearchPopup: React.FC<SearchPopupProps> = ({open, anchor, ...props}) => {\n return (\n <Popup\n open={open}\n anchorElement={anchor}\n placement=\"bottom-end\"\n onOpenChange={(_open, _event, reason) => {\n if (reason === 'escape-key') {\n props.onClose();\n }\n }}\n >\n <SearchCard {...props} />\n </Popup>\n );\n};\n\nSearchPopup.displayName = 'SearchPopup';\n\ninterface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {\n anchor: HTMLElement | null;\n}\n\nexport function renderSearchPopup({anchor, ...props}: SearchPopupWithRefProps) {\n return <>{anchor && <SearchPopup anchor={anchor} {...props} />}</>;\n}\n"]}
1
+ {"version":3,"file":"SearchPopup.js","sourceRoot":"../../../../../../src","sources":["markup/codemirror/search-plugin/view/SearchPopup.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useRef, useState} from 'react';\n\nimport type {SearchQuery} from '@codemirror/search';\nimport {ChevronDown, ChevronUp, Xmark} from '@gravity-ui/icons';\nimport {\n Button,\n Card,\n Checkbox,\n Icon,\n Popup,\n TextInput,\n type TextInputProps,\n sp,\n} from '@gravity-ui/uikit';\n\nimport {cn} from '../../../../classname';\nimport {i18n} from '../../../../i18n/search';\nimport {enterKeyHandler} from '../../../../utils/handlers';\n\nimport {ReplaceAllIcon, ReplaceIcon} from './ReplaceIcons';\n\nimport './SearchPopup.scss';\n\ntype SearchInitial = Pick<SearchQuery, 'search' | 'caseSensitive' | 'wholeWord'>;\ntype SearchConfig = Pick<SearchInitial, 'caseSensitive' | 'wholeWord'>;\n\ninterface SearchCardProps {\n initial: SearchInitial;\n onSearchKeyDown?: (query: string) => void;\n onChange?: (query: string) => void;\n onClose?: (query: string) => void;\n onSearchPrev?: (query: string) => void;\n onSearchNext?: (query: string) => void;\n onReplaceNext?: (query: string, replacement: string) => void;\n onReplaceAll?: (query: string, replacement: string) => void;\n onConfigChange?: (config: SearchConfig) => void;\n}\n\nconst b = cn('search-card');\n\nconst noop = () => {};\nconst inverse = (val: boolean) => !val;\n\nexport const SearchCard: React.FC<SearchCardProps> = ({\n initial,\n onChange = noop,\n onClose = noop,\n onSearchPrev = noop,\n onSearchNext = noop,\n onReplaceNext = noop,\n onReplaceAll = noop,\n onConfigChange = noop,\n}) => {\n const [query, setQuery] = useState<string>(initial.search);\n const [isCaseSensitive, setIsCaseSensitive] = useState<boolean>(initial.caseSensitive);\n const [isWholeWord, setIsWholeWord] = useState<boolean>(initial.wholeWord);\n const [replacement, setReplacement] = useState<string>('');\n const textInputRef = useRef<HTMLInputElement>(null);\n\n const setInputFocus = () => {\n textInputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setQuery(value);\n onChange(value);\n };\n\n const handleClose = () => {\n setQuery('');\n onClose(query);\n setInputFocus();\n };\n\n const handlePrev = () => {\n onSearchPrev(query);\n setInputFocus();\n };\n\n const handleNext = () => {\n onSearchNext(query);\n setInputFocus();\n };\n\n const handleReplace = () => {\n onReplaceNext(query, replacement);\n setInputFocus();\n };\n\n const handleReplaceAll = () => {\n onReplaceAll(query, replacement);\n setInputFocus();\n };\n\n const handleIsCaseSensitive = () => {\n onConfigChange({\n caseSensitive: !isCaseSensitive,\n wholeWord: isWholeWord,\n });\n setIsCaseSensitive(inverse);\n setInputFocus();\n };\n\n const handleIsWholeWord = () => {\n onConfigChange({\n caseSensitive: isCaseSensitive,\n wholeWord: !isWholeWord,\n });\n setIsWholeWord(inverse);\n setInputFocus();\n };\n\n const handleSearchKeyPress: TextInputProps['onKeyPress'] = enterKeyHandler(handleNext);\n\n return (\n <Card className={b()}>\n <div className={b('header')}>\n <span className={b('title')}> {i18n('title')}</span>\n <Button onClick={handleClose} size=\"s\" view=\"flat\">\n <Icon data={Xmark} size={14} />\n </Button>\n </div>\n <TextInput\n controlRef={textInputRef}\n className={sp({mb: 2})}\n size=\"s\"\n autoFocus\n onKeyPress={handleSearchKeyPress}\n onUpdate={handleInputChange}\n value={query}\n endContent={\n <>\n <Button onClick={handlePrev} pin=\"round-brick\">\n <Icon data={ChevronUp} size={12} />\n </Button>\n <Button onClick={handleNext} pin=\"brick-round\">\n <Icon data={ChevronDown} size={12} />\n </Button>\n </>\n }\n />\n <TextInput\n placeholder={i18n('replace_placeholder')}\n className={sp({mb: 2})}\n size=\"s\"\n onUpdate={setReplacement}\n value={replacement}\n endContent={\n <>\n <Button\n size=\"s\"\n onClick={handleReplace}\n pin=\"round-brick\"\n disabled={!query}\n title={i18n('action_replace')}\n >\n <ReplaceIcon width={12} height={12} />\n </Button>\n <Button\n size=\"s\"\n onClick={handleReplaceAll}\n pin=\"brick-round\"\n disabled={!query}\n title={i18n('action_replace_all')}\n >\n <ReplaceAllIcon width={12} height={12} />\n </Button>\n </>\n }\n />\n <Checkbox\n size=\"m\"\n onUpdate={handleIsCaseSensitive}\n checked={isCaseSensitive}\n className={sp({mr: 4})}\n >\n {i18n('label_case-sensitive')}\n </Checkbox>\n <Checkbox size=\"m\" onUpdate={handleIsWholeWord} checked={isWholeWord}>\n {i18n('label_whole-word')}\n </Checkbox>\n </Card>\n );\n};\n\nexport interface SearchPopupProps extends SearchCardProps {\n open: boolean;\n anchor: HTMLElement;\n onClose: () => void;\n}\n\nexport const SearchPopup: React.FC<SearchPopupProps> = ({open, anchor, ...props}) => {\n return (\n <Popup\n open={open}\n anchorElement={anchor}\n placement=\"bottom-end\"\n onOpenChange={(_open, _event, reason) => {\n if (reason === 'escape-key') {\n props.onClose();\n }\n }}\n >\n <SearchCard {...props} />\n </Popup>\n );\n};\n\nSearchPopup.displayName = 'SearchPopup';\n\ninterface SearchPopupWithRefProps extends Omit<SearchPopupProps, 'anchor'> {\n anchor: HTMLElement | null;\n}\n\nexport function renderSearchPopup({anchor, ...props}: SearchPopupWithRefProps) {\n return <>{anchor && <SearchPopup anchor={anchor} {...props} />}</>;\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":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAC,QAAQ,EAAsC,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAmB,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAAC,QAAQ,EAAC,wCAAqC;AACtD,OAAO,EAAC,UAAU,EAAC,qBAAkB;AACrC,OAAO,EAAC,YAAY,EAAC,mBAAuB;AAC5C,mDAAmD;AAEnD,MAAM,UAAU,WAAW,CACvB,KAAkB,EAClB,MAAwB,EACxB,KAAa,EACb,GAAW;IAEX,mDAAmD;IACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,OAAO,EAAC,sBAAsB,EAAE,iBAAiB,EAAC,0BAAuB;AAEzE,SAAS,eAAe,CAAC,KAAa,EAAE,GAAW,EAAE,KAAkB;IACnE,IAAI,KAAK,GAA+C,EAAE,CAAC;IAE3D,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC7C,KAAK,GAAG;YACJ,GAAG,KAAK;YACR,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzB,KAAK,EAAE,GAAG;gBACV,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ;gBACxB,IAAI;aACP,CAAC,CAAC;SACN,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAC/B,6CAA6C;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CACzB,IAAoE,EACpE,QAAkB,EAClB,QAAkD;IAElD,IAAI,MAAM,CAAC;IACX,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACJ,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,IAAI,MAAM,CACf,MAAM,IAAI,GAAG;YACT,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,aAAa,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;YAC1D,MAAM,KAAK,OAAO,CACzB,CAAC;IACN,CAAC;IACD,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtD,qFAAqF;QACrF,IAAK,KAA0B,CAAC,KAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,KAAyB,CAAC;YACrC,IAAI,EAAE,CAAC,KAAM,CAAC,EAAE,CAAC,KAAM,GAAG,CAAC,CAAC,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAC;QACtD,CAAC;QAED,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvD,MAAM,KAAK,GAAG,QAAQ,YAAY,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxE,MAAM,EAAC,EAAE,EAAC,GAAG,KAAK,CAAC;QACnB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAE5C,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,YAAY;iBAC7B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;iBACnD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;YAE7C,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC;gBACrB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;gBACzB,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACrC,CAAC;YACD,SAAS,GAAG,UAAU,CAAC;YACvB,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1C,CAAC;QAED,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC;AAID,MAAM,UAAU,aAAa,CACzB,MAAc,EACd,QAA0F,EAC1F,eAAe,GAAG,CAAC;IAEnB,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtD,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QACzB,MAAM,EAAC,EAAE,EAAC,GAAG,KAAK,CAAC;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACX,EAAE,CAAC,WAAW,CACV,KAAK,GAAG,CAAC,EACT,GAAG,EACH,UAAU,CAAC,QAAQ,CAAC;gBAChB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK;gBACtC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CACnC,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,mBAAmB,CAC/B,MAAc,EACd,QAAyD;IAEzD,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtD,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QACzB,MAAM,EAAC,EAAE,EAAC,GAAG,KAAK,CAAC;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACX,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CACzE,IAAI,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CACzC,CAAC;QACN,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC","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"]}
@@ -4,7 +4,7 @@
4
4
  ///
5
5
  import { InputRule } from 'prosemirror-inputrules';
6
6
  import { canJoin, findWrapping } from 'prosemirror-transform';
7
- import { hasCodeMark } from "./inputrules.js";
7
+ import { hasCodeMark, inDefaultTextblock } from "./inputrules.js";
8
8
  /// Build an input rule for automatically wrapping a textblock when a
9
9
  /// given string is typed. The `regexp` argument is
10
10
  /// directly passed through to the `InputRule` constructor. You'll
@@ -24,6 +24,8 @@ export function wrappingInputRule(regexp, nodeType, getAttrs = null, joinPredica
24
24
  return new InputRule(regexp, (state, match, start, end) => {
25
25
  if (hasCodeMark(state, match, start, end))
26
26
  return null;
27
+ if (!inDefaultTextblock(state, match, start, end))
28
+ return null;
27
29
  const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;
28
30
  const tr = state.tr.delete(start, end);
29
31
  const $start = tr.doc.resolve(start), range = $start.blockRange(), wrapping = range && findWrapping(range, nodeType, attrs);
@@ -1 +1 @@
1
- {"version":3,"file":"rulebuilders.js","sourceRoot":"../../../src","sources":["utils/rulebuilders.ts"],"names":[],"mappings":"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","sourcesContent":["///\n/// Copy of https://github.com/ProseMirror/prosemirror-inputrules/blob/1.4.0/src/rulebuilders.ts\n/// Added a check for the presence of a code mark\n///\n\nimport {InputRule} from 'prosemirror-inputrules';\nimport type {Attrs, Node, NodeType} from 'prosemirror-model';\nimport {canJoin, findWrapping} from 'prosemirror-transform';\n\nimport {hasCodeMark} from './inputrules';\n\n/// Build an input rule for automatically wrapping a textblock when a\n/// given string is typed. The `regexp` argument is\n/// directly passed through to the `InputRule` constructor. You'll\n/// probably want the regexp to start with `^`, so that the pattern can\n/// only occur at the start of a textblock.\n///\n/// `nodeType` is the type of node to wrap in. If it needs attributes,\n/// you can either pass them directly, or pass a function that will\n/// compute them from the regular expression match.\n///\n/// By default, if there's a node with the same type above the newly\n/// wrapped node, the rule will try to [join](#transform.Transform.join) those\n/// two nodes. You can pass a join predicate, which takes a regular\n/// expression match and the node before the wrapped node, and can\n/// return a boolean to indicate whether a join should happen.\nexport function wrappingInputRule(\n regexp: RegExp,\n nodeType: NodeType,\n getAttrs: Attrs | null | ((matches: RegExpMatchArray) => Attrs | null) = null,\n joinPredicate?: (match: RegExpMatchArray, node: Node) => boolean,\n) {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const tr = state.tr.delete(start, end);\n const $start = tr.doc.resolve(start),\n range = $start.blockRange(),\n wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) return null;\n tr.wrap(range!, wrapping);\n const before = tr.doc.resolve(start - 1).nodeBefore;\n if (\n before &&\n before.type == nodeType &&\n canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before))\n )\n tr.join(start - 1);\n return tr;\n });\n}\n\n/// Build an input rule that changes the type of a textblock when the\n/// matched text is typed into it. You'll usually want to start your\n/// regexp with `^` to that it is only matched at the start of a\n/// textblock. The optional `getAttrs` parameter can be used to compute\n/// the new node's attributes, and works the same as in the\n/// `wrappingInputRule` function.\nexport function textblockTypeInputRule(\n regexp: RegExp,\n nodeType: NodeType,\n getAttrs: Attrs | null | ((match: RegExpMatchArray) => Attrs | null) = null,\n) {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const $start = state.doc.resolve(start);\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType))\n return null;\n return state.tr.delete(start, end).setBlockType(start, start, nodeType, attrs);\n });\n}\n"]}
1
+ {"version":3,"file":"rulebuilders.js","sourceRoot":"../../../src","sources":["utils/rulebuilders.ts"],"names":[],"mappings":"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","sourcesContent":["///\n/// Copy of https://github.com/ProseMirror/prosemirror-inputrules/blob/1.4.0/src/rulebuilders.ts\n/// Added a check for the presence of a code mark\n///\n\nimport {InputRule} from 'prosemirror-inputrules';\nimport type {Attrs, Node, NodeType} from 'prosemirror-model';\nimport {canJoin, findWrapping} from 'prosemirror-transform';\n\nimport {hasCodeMark, inDefaultTextblock} from './inputrules';\n\n/// Build an input rule for automatically wrapping a textblock when a\n/// given string is typed. The `regexp` argument is\n/// directly passed through to the `InputRule` constructor. You'll\n/// probably want the regexp to start with `^`, so that the pattern can\n/// only occur at the start of a textblock.\n///\n/// `nodeType` is the type of node to wrap in. If it needs attributes,\n/// you can either pass them directly, or pass a function that will\n/// compute them from the regular expression match.\n///\n/// By default, if there's a node with the same type above the newly\n/// wrapped node, the rule will try to [join](#transform.Transform.join) those\n/// two nodes. You can pass a join predicate, which takes a regular\n/// expression match and the node before the wrapped node, and can\n/// return a boolean to indicate whether a join should happen.\nexport function wrappingInputRule(\n regexp: RegExp,\n nodeType: NodeType,\n getAttrs: Attrs | null | ((matches: RegExpMatchArray) => Attrs | null) = null,\n joinPredicate?: (match: RegExpMatchArray, node: Node) => boolean,\n) {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n if (!inDefaultTextblock(state, match, start, end)) return null;\n\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const tr = state.tr.delete(start, end);\n const $start = tr.doc.resolve(start),\n range = $start.blockRange(),\n wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) return null;\n tr.wrap(range!, wrapping);\n const before = tr.doc.resolve(start - 1).nodeBefore;\n if (\n before &&\n before.type == nodeType &&\n canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before))\n )\n tr.join(start - 1);\n return tr;\n });\n}\n\n/// Build an input rule that changes the type of a textblock when the\n/// matched text is typed into it. You'll usually want to start your\n/// regexp with `^` to that it is only matched at the start of a\n/// textblock. The optional `getAttrs` parameter can be used to compute\n/// the new node's attributes, and works the same as in the\n/// `wrappingInputRule` function.\nexport function textblockTypeInputRule(\n regexp: RegExp,\n nodeType: NodeType,\n getAttrs: Attrs | null | ((match: RegExpMatchArray) => Attrs | null) = null,\n) {\n return new InputRule(regexp, (state, match, start, end) => {\n if (hasCodeMark(state, match, start, end)) return null;\n\n const $start = state.doc.resolve(start);\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType))\n return null;\n return state.tr.delete(start, end).setBlockType(start, start, nodeType, attrs);\n });\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  /** During build process, the current version will be injected here */
2
- export const VERSION = typeof '15.22.2' !== 'undefined' ? '15.22.2' : 'unknown';
2
+ export const VERSION = typeof '15.24.0' !== 'undefined' ? '15.24.0' : 'unknown';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.22.2' !== 'undefined' ? '15.22.2' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.24.0' !== 'undefined' ? '15.24.0' : 'unknown';\n"]}
package/build/styles.css CHANGED
@@ -1199,9 +1199,6 @@ body :has(.g-md-resizable_resizing) {
1199
1199
  .ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
1200
1200
  outline: 0;
1201
1201
  }
1202
- .ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
1203
- transform: translateY(-50%);
1204
- }
1205
1202
  .yfm-editor .yfm-file {
1206
1203
  pointer-events: none;
1207
1204
  }
@@ -1639,17 +1636,18 @@ body :has(.g-md-resizable_resizing) {
1639
1636
  font-size: var(--g-text-body-2-font-size);
1640
1637
  line-height: var(--g-text-body-2-line-height);
1641
1638
  }
1642
- .yfm-cut-title .g-md-yfm-cut-title-inner {
1639
+ .ProseMirror.yfm .yfm-cut-title > .g-md-yfm-cut-title-inner {
1643
1640
  cursor: text;
1644
1641
  }
1645
-
1646
- .yfm-cut-content {
1642
+ .ProseMirror.yfm .yfm-cut-content {
1647
1643
  display: none;
1648
1644
  overflow: hidden;
1649
1645
  transition: height 0.3s ease-in-out;
1650
1646
  }
1651
-
1652
- .open > .yfm-cut-content {
1647
+ .ProseMirror.yfm .yfm-cut.yfm-cut-open > .yfm-cut-title:before {
1648
+ transform: translateY(-50%);
1649
+ }
1650
+ .ProseMirror.yfm .yfm-cut.yfm-cut-open > .yfm-cut-content {
1653
1651
  display: revert;
1654
1652
  }
1655
1653
  .g-md-file-skeleton {
@@ -1668,6 +1666,7 @@ body :has(.g-md-resizable_resizing) {
1668
1666
  margin-right: 8px;
1669
1667
  }
1670
1668
  .g-md-search-card {
1669
+ width: 450px;
1671
1670
  padding: var(--g-spacing-2) var(--g-spacing-2) var(--g-spacing-3) var(--g-spacing-4);
1672
1671
  }
1673
1672
  .g-md-search-card__header {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/markdown-editor",
3
- "version": "15.22.2",
3
+ "version": "15.24.0",
4
4
  "description": "Markdown wysiwyg and markup editor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -318,7 +318,7 @@
318
318
  }
319
319
  },
320
320
  "peerDependencies": {
321
- "@diplodoc/cut-extension": "^0.5.0 || ^0.6.1 || ^0.7.1",
321
+ "@diplodoc/cut-extension": "^0.5.0 || ^0.6.1 || ^0.7.1 || ^1.0.0",
322
322
  "@diplodoc/file-extension": "^0.2.1",
323
323
  "@diplodoc/folding-headings-extension": "^0.1.0",
324
324
  "@diplodoc/html-extension": "^2.3.2",