@manuscripts/body-editor 3.12.67 → 3.13.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 (289) hide show
  1. package/dist/cjs/components/toolbar/type-selector/styles.js +2 -1
  2. package/dist/cjs/versions.js +1 -1
  3. package/dist/es/components/toolbar/type-selector/styles.js +2 -1
  4. package/dist/es/versions.js +1 -1
  5. package/dist/types/components/toolbar/type-selector/styles.d.ts +2 -2
  6. package/dist/types/lib/footnotes.d.ts +4 -2
  7. package/dist/types/lib/utils.d.ts +5 -4
  8. package/dist/types/versions.d.ts +1 -1
  9. package/package.json +37 -36
  10. package/{dist/es/lib/statistics.js → src/__mocks__/styleMock.ts} +2 -14
  11. package/src/assets.ts +20 -0
  12. package/src/classes/collabProvider.ts +38 -0
  13. package/src/clipboard.ts +54 -0
  14. package/src/commands.ts +2109 -0
  15. package/src/components/ChangeHandlingForm.tsx +54 -0
  16. package/src/components/LanguageDropdown/index.tsx +343 -0
  17. package/src/components/affiliations/AffiliationForm.tsx +238 -0
  18. package/src/components/affiliations/AffiliationItem.tsx +151 -0
  19. package/src/components/affiliations/AffiliationList.tsx +71 -0
  20. package/src/components/affiliations/AffiliationsModal.tsx +676 -0
  21. package/src/components/affiliations/AffiliationsPanel.tsx +76 -0
  22. package/src/components/affiliations/CreateAffiliationModal.tsx +135 -0
  23. package/src/components/authors/AuthorDetailsForm.tsx +438 -0
  24. package/src/components/authors/AuthorList.tsx +81 -0
  25. package/src/components/authors/AuthorsModal.tsx +642 -0
  26. package/src/components/authors/AuthorsPanel.tsx +69 -0
  27. package/src/components/authors/CreateAuthorModal.tsx +172 -0
  28. package/src/components/authors/CreditDrawer.tsx +71 -0
  29. package/src/components/authors/DraggableAuthor.tsx +228 -0
  30. package/src/components/authors/useManageAffiliations.tsx +77 -0
  31. package/src/components/authors/useManageCredit.tsx +63 -0
  32. package/src/components/authors-affiliations/AuthorsAndAffiliationsModals.tsx +170 -0
  33. package/src/components/authors-affiliations/GenericPanel.tsx +164 -0
  34. package/src/components/authors-affiliations/ModalTabs.tsx +100 -0
  35. package/src/components/awards/AwardForm.tsx +338 -0
  36. package/src/components/awards/AwardModal.tsx +120 -0
  37. package/src/components/awards/DeleteAwardDiaolog.tsx +52 -0
  38. package/src/components/dialog/ConfirmationDialog.tsx +131 -0
  39. package/src/components/form/CreateModalStyles.tsx +37 -0
  40. package/src/components/form/FormFooter.tsx +54 -0
  41. package/src/components/form/FormPlaceholder.tsx +71 -0
  42. package/src/components/form/ModalFormActions.tsx +88 -0
  43. package/src/components/form/UnsavedLabel.tsx +49 -0
  44. package/src/components/hooks/use-debounce.ts +56 -0
  45. package/src/components/hooks/useAffiliationShowsErrorIndicator.ts +51 -0
  46. package/src/components/hooks/useAuthorShowsErrorIndicator.ts +73 -0
  47. package/src/components/keyboard-shortcuts-modal/FormattedShortcut.tsx +56 -0
  48. package/src/components/keyboard-shortcuts-modal/KeyboardShortcutsModal.tsx +283 -0
  49. package/src/components/keyboard-shortcuts-modal/keyboard-shortcuts.ts +304 -0
  50. package/src/components/keywords/AddKeywordInline.tsx +284 -0
  51. package/src/components/keywords/DeleteKeywordDialog.tsx +52 -0
  52. package/src/components/modal-drawer/GenericDrawer.tsx +65 -0
  53. package/src/components/modal-drawer/GenericDrawerGroup.tsx +125 -0
  54. package/src/components/outline/DraggableTree.tsx +438 -0
  55. package/src/components/outline/ManuscriptOutline.tsx +127 -0
  56. package/src/components/outline/Outline.tsx +141 -0
  57. package/src/components/references/BibliographyItemSource.ts +80 -0
  58. package/src/components/references/CitationEditor.tsx +301 -0
  59. package/src/components/references/CitationViewer.tsx +62 -0
  60. package/src/components/references/ImportBibliographyForm.tsx +232 -0
  61. package/src/components/references/ImportBibliographyModal.tsx +159 -0
  62. package/src/components/references/ReferenceForm/PersonDropDown.tsx +93 -0
  63. package/src/components/references/ReferenceForm/ReferenceForm.tsx +701 -0
  64. package/src/components/references/ReferenceForm/config.ts +133 -0
  65. package/src/components/references/ReferenceForm/styled-components.ts +156 -0
  66. package/src/components/references/ReferenceLine.tsx +43 -0
  67. package/src/components/references/ReferenceSearch.tsx +163 -0
  68. package/src/components/references/ReferenceSearchResults.tsx +113 -0
  69. package/src/components/references/ReferenceSearchResultsPlaceholder.tsx +71 -0
  70. package/src/components/references/ReferenceSearchSection.tsx +124 -0
  71. package/src/components/references/ReferencesEditor.tsx +61 -0
  72. package/src/components/references/ReferencesModal.tsx +352 -0
  73. package/src/components/references/SearchInput.tsx +98 -0
  74. package/src/components/toolbar/InsertEmbedDialog.tsx +222 -0
  75. package/src/components/toolbar/InsertTableDialog.tsx +208 -0
  76. package/src/components/toolbar/ListMenuItem.tsx +203 -0
  77. package/src/components/toolbar/helpers.ts +547 -0
  78. package/src/components/toolbar/type-selector/OptionComponent.tsx +89 -0
  79. package/src/components/toolbar/type-selector/TypeSelector.tsx +157 -0
  80. package/src/components/toolbar/type-selector/styles.ts +79 -0
  81. package/src/components/views/CrossReferenceItems.tsx +199 -0
  82. package/src/components/views/DeleteEmbedDialog.tsx +83 -0
  83. package/src/components/views/DeleteFootnoteDialog.tsx +54 -0
  84. package/src/components/views/FigureDropdown.tsx +423 -0
  85. package/src/components/views/FootnotesSelector.tsx +255 -0
  86. package/src/components/views/InsertSpecialCharacter.tsx +245 -0
  87. package/src/components/views/LinkForm.tsx +220 -0
  88. package/src/components/views/TableCellContextMenu.tsx +241 -0
  89. package/src/configs/ManuscriptsEditor.ts +140 -0
  90. package/src/configs/editor-plugins.ts +119 -0
  91. package/src/configs/editor-views.ts +139 -0
  92. package/src/icons.ts +62 -0
  93. package/src/index.ts +65 -0
  94. package/src/keys/highlight.ts +65 -0
  95. package/src/keys/index.ts +33 -0
  96. package/src/keys/keyword.ts +69 -0
  97. package/src/keys/list.ts +156 -0
  98. package/src/keys/misc.ts +112 -0
  99. package/src/keys/title.ts +221 -0
  100. package/src/lib/__tests__/__fixtures__/doc.json +388 -0
  101. package/src/lib/__tests__/__snapshots__/paste.test.ts.snap +24 -0
  102. package/src/lib/__tests__/authors.test.ts +202 -0
  103. package/src/lib/__tests__/helpers.test.ts +46 -0
  104. package/src/lib/__tests__/paste.test.ts +57 -0
  105. package/src/lib/__tests__/plugins.test.ts +176 -0
  106. package/src/lib/__tests__/url.test.ts +31 -0
  107. package/src/lib/array-reducer.ts +68 -0
  108. package/src/lib/authors-and-affiliations.ts +81 -0
  109. package/src/lib/authors.ts +67 -0
  110. package/src/lib/capabilities.ts +55 -0
  111. package/src/lib/codemirror.ts +37 -0
  112. package/src/lib/comments.ts +123 -0
  113. package/src/lib/context-menu.ts +745 -0
  114. package/src/lib/copy.ts +30 -0
  115. package/src/lib/crossref.ts +90 -0
  116. package/src/lib/dnd.ts +29 -0
  117. package/src/lib/doc.ts +167 -0
  118. package/src/lib/dompurify.ts +28 -0
  119. package/src/lib/files.ts +180 -0
  120. package/src/lib/footnotes.ts +83 -0
  121. package/src/lib/get-media-type.ts +105 -0
  122. package/src/lib/helpers.ts +199 -0
  123. package/src/lib/hierarchy.ts +117 -0
  124. package/src/lib/languages.ts +37 -0
  125. package/src/lib/lists.ts +56 -0
  126. package/src/lib/math.ts +111 -0
  127. package/src/lib/media.ts +334 -0
  128. package/src/lib/navigation-utils.ts +235 -0
  129. package/src/lib/normalize.ts +70 -0
  130. package/src/lib/paste.ts +304 -0
  131. package/src/lib/placeholder.ts +32 -0
  132. package/src/lib/platform.ts +18 -0
  133. package/src/lib/plugins.ts +22 -0
  134. package/src/lib/popper.ts +180 -0
  135. package/src/lib/position-menu.ts +184 -0
  136. package/src/lib/references.ts +94 -0
  137. package/src/lib/template.ts +29 -0
  138. package/src/lib/track-changes-utils.ts +34 -0
  139. package/{dist/types/lib/statistics.d.ts → src/lib/url.ts} +11 -8
  140. package/src/lib/use-do-with-debounce.ts +39 -0
  141. package/src/lib/utils.ts +323 -0
  142. package/src/lib/view.ts +100 -0
  143. package/src/menus.tsx +684 -0
  144. package/src/node-type-icons.tsx +83 -0
  145. package/src/plugins/__tests__/__fixtures__/deleted-footnote.json +140 -0
  146. package/src/plugins/__tests__/__fixtures__/inserted-footnote.json +153 -0
  147. package/src/plugins/__tests__/footnotes.test.ts +67 -0
  148. package/src/plugins/accessibility_element.ts +219 -0
  149. package/src/plugins/add-subtitle.ts +102 -0
  150. package/src/plugins/affiliations.ts +136 -0
  151. package/src/plugins/alt-titles.ts +219 -0
  152. package/src/plugins/bibliography.ts +235 -0
  153. package/src/plugins/comments.ts +328 -0
  154. package/src/plugins/cross-references.ts +70 -0
  155. package/src/plugins/detect-inconsistency/detect-inconsistency-utils.ts +102 -0
  156. package/src/plugins/detect-inconsistency/index.ts +55 -0
  157. package/src/plugins/detect-inconsistency/validators.ts +283 -0
  158. package/src/plugins/doi.ts +66 -0
  159. package/src/plugins/editor-props.ts +39 -0
  160. package/src/plugins/elements.ts +60 -0
  161. package/src/plugins/footnotes.ts +298 -0
  162. package/src/plugins/link.ts +53 -0
  163. package/src/plugins/lock-body.ts +136 -0
  164. package/src/plugins/move-node.ts +55 -0
  165. package/src/plugins/objects.ts +125 -0
  166. package/src/plugins/paragraphs.ts +90 -0
  167. package/src/plugins/persist.ts +64 -0
  168. package/src/plugins/persistent-cursor.ts +66 -0
  169. package/src/plugins/placeholder.ts +219 -0
  170. package/src/plugins/prevent-empty.ts +50 -0
  171. package/src/plugins/search-replace/index.ts +157 -0
  172. package/src/plugins/search-replace/lib.ts +95 -0
  173. package/src/plugins/section_category.ts +212 -0
  174. package/src/plugins/section_title/autocompletion.ts +87 -0
  175. package/src/plugins/section_title/index.ts +105 -0
  176. package/src/plugins/selected-suggestion.ts +243 -0
  177. package/src/plugins/tables-cursor-fix.ts +143 -0
  178. package/src/plugins/translations.ts +263 -0
  179. package/src/rules.ts +60 -0
  180. package/src/selection.ts +112 -0
  181. package/src/testing/default-capabilities.ts +48 -0
  182. package/src/testing/default-editor-data.ts +73 -0
  183. package/src/testing/empty-editor-doc.json +62 -0
  184. package/src/testing/polyfill-dom.ts +43 -0
  185. package/src/testing/section-categories.json +161 -0
  186. package/src/testing/setup-editor.ts +55 -0
  187. package/src/tests.ts +42 -0
  188. package/src/toolbar.tsx +259 -0
  189. package/src/types/@citation-js/core.d.ts +16 -0
  190. package/src/types/@citation-js/index.d.ts +16 -0
  191. package/src/types/@citation-js/plugin-bibtex.d.ts +16 -0
  192. package/src/types/@citation-js/plugin-csl.d.ts +16 -0
  193. package/src/types/@citation-js/plugin-doi.d.ts +16 -0
  194. package/src/types/@citation-js/plugin-enw.d.ts +16 -0
  195. package/src/types/@citation-js/plugin-pubmed.d.ts +16 -0
  196. package/src/types/@citation-js/plugin-ris.d.ts +16 -0
  197. package/src/types/citeproc.d.ts +124 -0
  198. package/src/types/css.d.ts +16 -0
  199. package/src/types/json.d.ts +17 -0
  200. package/src/types/prosemirror-dev-tools.d.ts +16 -0
  201. package/src/types/prosemirror-dropcursor.d.ts +16 -0
  202. package/src/types/styled-components.d.ts +23 -0
  203. package/src/types.ts +49 -0
  204. package/src/useEditor.ts +244 -0
  205. package/src/versions.ts +3 -0
  206. package/src/views/ReactSubView.tsx +145 -0
  207. package/src/views/abstracts.ts +46 -0
  208. package/src/views/accessibility_element.ts +86 -0
  209. package/src/views/affiliations.ts +254 -0
  210. package/src/views/alt_title.ts +85 -0
  211. package/src/views/alt_titles_section.ts +97 -0
  212. package/src/views/attachment.ts +160 -0
  213. package/src/views/attachments.ts +72 -0
  214. package/src/views/author_notes.ts +96 -0
  215. package/src/views/award.ts +194 -0
  216. package/src/views/awards.ts +59 -0
  217. package/src/views/base_node_view.ts +85 -0
  218. package/src/views/bibliography_element.ts +313 -0
  219. package/src/views/block_view.ts +100 -0
  220. package/src/views/blockquote_element.ts +26 -0
  221. package/src/views/blockquote_element_editable.ts +24 -0
  222. package/src/views/box_element.ts +33 -0
  223. package/src/views/caption.ts +37 -0
  224. package/src/views/caption_title.ts +33 -0
  225. package/src/views/citation.ts +67 -0
  226. package/src/views/citation_editable.ts +312 -0
  227. package/src/views/contributors.ts +341 -0
  228. package/src/views/creators.ts +82 -0
  229. package/src/views/cross_reference.ts +74 -0
  230. package/src/views/cross_reference_editable.ts +113 -0
  231. package/src/views/editable_block.ts +141 -0
  232. package/src/views/embed.ts +345 -0
  233. package/src/views/empty.ts +26 -0
  234. package/src/views/equation.ts +47 -0
  235. package/src/views/equation_editable.ts +84 -0
  236. package/src/views/equation_element.ts +29 -0
  237. package/src/views/equation_element_editable.ts +21 -0
  238. package/src/views/figure.ts +84 -0
  239. package/src/views/figure_editable.ts +361 -0
  240. package/src/views/figure_element.ts +197 -0
  241. package/src/views/figure_element_editable.ts +21 -0
  242. package/src/views/footnote.ts +236 -0
  243. package/src/views/footnotes_element.ts +54 -0
  244. package/src/views/general_table_footnote.ts +140 -0
  245. package/src/views/hero_image.ts +76 -0
  246. package/src/views/hero_image_editable.ts +21 -0
  247. package/src/views/image_element.ts +373 -0
  248. package/src/views/image_element_editable.ts +21 -0
  249. package/src/views/inline_equation.ts +47 -0
  250. package/src/views/inline_equation_editable.ts +70 -0
  251. package/src/views/inline_footnote.ts +264 -0
  252. package/src/views/inline_footnote_editable.ts +20 -0
  253. package/src/views/keyword.ts +127 -0
  254. package/src/views/keyword_group.ts +109 -0
  255. package/src/views/link.ts +27 -0
  256. package/src/views/link_editable.ts +169 -0
  257. package/src/views/list.ts +46 -0
  258. package/src/views/list_item.ts +26 -0
  259. package/src/views/paragraph.ts +26 -0
  260. package/src/views/paragraph_editable.ts +21 -0
  261. package/src/views/placeholder.ts +35 -0
  262. package/src/views/placeholder_element.ts +38 -0
  263. package/src/views/placeholder_element_editable.ts +21 -0
  264. package/src/views/pullquote_element.ts +106 -0
  265. package/src/views/pullquote_element_editable.ts +24 -0
  266. package/src/views/quote_image_editable.ts +84 -0
  267. package/src/views/section.ts +64 -0
  268. package/src/views/section_label.ts +20 -0
  269. package/src/views/section_title.ts +87 -0
  270. package/src/views/section_title_editable.ts +21 -0
  271. package/src/views/subtitle.ts +42 -0
  272. package/src/views/subtitle_editable.ts +20 -0
  273. package/src/views/subtitles.ts +34 -0
  274. package/src/views/subtitles_editable.ts +21 -0
  275. package/src/views/supplement.ts +236 -0
  276. package/src/views/supplement_editable.ts +20 -0
  277. package/src/views/supplements.ts +65 -0
  278. package/src/views/supplements_editable.ts +21 -0
  279. package/src/views/table_cell.ts +150 -0
  280. package/src/views/table_element.ts +33 -0
  281. package/src/views/table_element_editable.ts +21 -0
  282. package/src/views/table_element_footer.ts +41 -0
  283. package/src/views/title.ts +46 -0
  284. package/src/views/title_editable.ts +20 -0
  285. package/src/views/trans_graphical_abstract.ts +55 -0
  286. package/src/views/trans_graphical_abstract_editable.ts +21 -0
  287. package/src/views/translated_abstract.ts +53 -0
  288. package/src/views/translated_abstract_editable.ts +21 -0
  289. package/dist/cjs/lib/statistics.js +0 -38
@@ -0,0 +1,283 @@
1
+ /*!
2
+ * © 2025 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import {
17
+ ButtonGroup,
18
+ CloseButton,
19
+ InspectorTabPanel,
20
+ InspectorTabPanels,
21
+ InspectorTabs,
22
+ ModalBody,
23
+ ModalContainer,
24
+ ModalHeader,
25
+ ModalSidebar,
26
+ ModalSidebarHeader,
27
+ ModalSidebarTitle,
28
+ PrimaryButton,
29
+ SidebarContent,
30
+ StyledModal,
31
+ useFocusCycle,
32
+ } from '@manuscripts/style-guide'
33
+ import { EditorView } from 'prosemirror-view'
34
+ import React, { useRef, useState } from 'react'
35
+ import styled, { ThemeProvider } from 'styled-components'
36
+
37
+ import type { EditorProps } from '../../configs/ManuscriptsEditor'
38
+ import { isMac } from '../../lib/platform'
39
+ import { getEditorProps } from '../../plugins/editor-props'
40
+ import { createSubViewAsync } from '../../views/ReactSubView'
41
+ import { ModalTabs } from '../authors-affiliations/ModalTabs'
42
+ import { formattedShortCut } from './FormattedShortcut'
43
+ import { EDITOR_KEYBOARD_SHORTCUT_TABS } from './keyboard-shortcuts'
44
+
45
+ const TAB_LABELS = EDITOR_KEYBOARD_SHORTCUT_TABS.map((t) => t.label)
46
+ const KEYBOARD_SHORTCUTS_MODAL_TITLE_ID = 'keyboard-shortcuts-modal-title'
47
+ export const KEYBOARD_SHORTCUTS_MODAL_ID = 'keyboard-shortcuts-modal'
48
+
49
+ export type KeyboardShortcutsModalProps = {
50
+ editorProps: EditorProps
51
+ isOpen: boolean
52
+ onClose: () => void
53
+ }
54
+
55
+ export const KeyboardShortcutsModal: React.FC<KeyboardShortcutsModalProps> = ({
56
+ editorProps,
57
+ isOpen,
58
+ onClose,
59
+ }) => {
60
+ const [tabIndex, setTabIndex] = useState(0)
61
+ const containerRef = useRef<HTMLDivElement>(null)
62
+
63
+ useFocusCycle(containerRef, isOpen)
64
+
65
+ return (
66
+ <ThemeProvider theme={editorProps.theme}>
67
+ <StyledModal
68
+ isOpen={isOpen}
69
+ onRequestClose={onClose}
70
+ shouldCloseOnOverlayClick={true}
71
+ ariaLabelledby={KEYBOARD_SHORTCUTS_MODAL_TITLE_ID}
72
+ id={KEYBOARD_SHORTCUTS_MODAL_ID}
73
+ >
74
+ <ModalContainer ref={containerRef}>
75
+ <ModalHeader>
76
+ <CloseButton onClick={onClose} data-cy="modal-close-button" />
77
+ </ModalHeader>
78
+ <StyledModalBody>
79
+ <StyledModalSidebar>
80
+ <StyledModalSidebarHeader>
81
+ <StyledModalSidebarTitle
82
+ as="h2"
83
+ id={KEYBOARD_SHORTCUTS_MODAL_TITLE_ID}
84
+ >
85
+ Keyboard shortcuts
86
+ </StyledModalSidebarTitle>
87
+ </StyledModalSidebarHeader>
88
+ <StyledSidebarContent>
89
+ <ShortcutTabs
90
+ selectedIndex={tabIndex}
91
+ onChange={setTabIndex}
92
+ >
93
+ <ModalTabsWrapper>
94
+ <ModalTabs tabLabels={TAB_LABELS} />
95
+ </ModalTabsWrapper>
96
+
97
+ <InspectorTabPanels>
98
+ {EDITOR_KEYBOARD_SHORTCUT_TABS.map((tab) => (
99
+ <ShortcutTabPanel key={tab.id}>
100
+ {tab.sections.map((section, sectionIndex) => (
101
+ <Section key={`${tab.id}:${sectionIndex}`}>
102
+ <SectionTitle>{section.title}</SectionTitle>
103
+ <ShortcutTable>
104
+ {section.rows.map((row, rowIndex) => (
105
+ <ShortcutRow
106
+ key={`${tab.id}-${sectionIndex}-${rowIndex}`}
107
+ >
108
+ <ShortcutLabel>{row.label}</ShortcutLabel>
109
+ <ShortcutKeys>
110
+ {formattedShortCut(
111
+ isMac ? row.shortcut.mac : row.shortcut.pc
112
+ )}
113
+ </ShortcutKeys>
114
+ </ShortcutRow>
115
+ ))}
116
+ </ShortcutTable>
117
+ </Section>
118
+ ))}
119
+ </ShortcutTabPanel>
120
+ ))}
121
+ </InspectorTabPanels>
122
+ </ShortcutTabs>
123
+ </StyledSidebarContent>
124
+ <ButtonsContainer>
125
+ <PrimaryButton onClick={onClose}>Close</PrimaryButton>
126
+ </ButtonsContainer>
127
+ </StyledModalSidebar>
128
+ </StyledModalBody>
129
+ </ModalContainer>
130
+ </StyledModal>
131
+ </ThemeProvider>
132
+ )
133
+ }
134
+
135
+ const ShortcutTabs = styled(InspectorTabs)`
136
+ display: flex;
137
+ flex-direction: column;
138
+ min-height: 0;
139
+ `
140
+
141
+ const ModalTabsWrapper = styled('div')`
142
+ margin: 0 ${(props) => props.theme.grid.unit * 8}px ${(props) => props.theme.grid.unit * 3}px;
143
+ `
144
+
145
+ const ShortcutTabPanel = styled(InspectorTabPanel).attrs({
146
+ tabIndex: -1,
147
+ unmount: false,
148
+ })`
149
+ margin-top: ${(props) => props.theme.grid.unit * 3}px;
150
+ overflow-y: auto;
151
+ flex: 1;
152
+ min-height: 0;
153
+ `
154
+
155
+ const StyledModalSidebar = styled(ModalSidebar)`
156
+ position: relative;
157
+ background: white;
158
+ max-width: none;
159
+ width: min(664px, 90vw);
160
+ display: flex;
161
+ flex-direction: column;
162
+ padding: 0;
163
+ `
164
+
165
+ const StyledModalSidebarHeader = styled(ModalSidebarHeader)`
166
+ margin: 0 ${(props) => props.theme.grid.unit * 8}px;
167
+ padding: 0;
168
+ `
169
+
170
+ const StyledModalSidebarTitle = styled(ModalSidebarTitle)`
171
+ margin: ${(props) => props.theme.grid.unit * 6}px 0;
172
+ padding: 0;
173
+ `
174
+
175
+ const StyledModalBody = styled(ModalBody)`
176
+ flex: 1;
177
+ min-height: 0;
178
+ display: flex;
179
+ flex-direction: column;
180
+ `
181
+
182
+ const StyledSidebarContent = styled(SidebarContent)`
183
+ display: flex;
184
+ flex-direction: column;
185
+ overflow: hidden;
186
+ flex: 1;
187
+ min-height: 0;
188
+ gap: ${(props) => props.theme.grid.unit * 2}px;
189
+ padding: 0;
190
+ `
191
+
192
+ const Section = styled.section`
193
+ margin: 0 0 ${(props) => props.theme.grid.unit * 4}px;
194
+
195
+ &:last-child {
196
+ margin-bottom: 0;
197
+ }
198
+ `
199
+
200
+ const SectionTitle = styled.h3`
201
+ margin: 0 ${(props) => props.theme.grid.unit * 8}px ${(props) => props.theme.grid.unit * 2}px;
202
+ font-size: ${(props) => props.theme.font.size.large};
203
+ font-weight: ${(props) => props.theme.font.weight.normal};
204
+ line-height: ${(props) => props.theme.font.lineHeight.large};
205
+ color: ${(props) => props.theme.colors.text.greyMuted};
206
+ `
207
+
208
+ const ShortcutTable = styled.div`
209
+ border-collapse: collapse;
210
+ font-size: ${(props) => props.theme.font.size.normal};
211
+ margin: 0 ${(props) => props.theme.grid.unit * 8}px;
212
+ `
213
+ const ShortcutRow = styled.div`
214
+ display: flex;
215
+ justify-content: space-between;
216
+ align-items: center;
217
+ padding: ${({ theme }) => theme.grid.unit * 1.5}px 0;
218
+ `
219
+ const ShortcutLabel = styled.div`
220
+ padding: ${(props) => props.theme.grid.unit * 1.5}px
221
+ ${(props) => props.theme.grid.unit * 2}px
222
+ ${(props) => props.theme.grid.unit * 1.5}px 0;
223
+ vertical-align: top;
224
+ color: ${(props) => props.theme.colors.text.secondary};
225
+ `
226
+
227
+ const ShortcutKeys = styled.div`
228
+ padding: ${(props) => props.theme.grid.unit * 1.5}px 0;
229
+ vertical-align: top;
230
+ text-align: right;
231
+ white-space: nowrap;
232
+ font-variant-numeric: tabular-nums;
233
+ `
234
+
235
+ const ButtonsContainer = styled(ButtonGroup)`
236
+ padding: ${(props) => props.theme.grid.unit * 4}px 0;
237
+ margin: 0 ${(props) => props.theme.grid.unit * 8}px;
238
+ flex-shrink: 0;
239
+ `
240
+
241
+ let dialog: HTMLDivElement | null = null
242
+
243
+ export async function openKeyboardShortcuts(view?: EditorView): Promise<void> {
244
+ if (!view || dialog) {
245
+ return
246
+ }
247
+
248
+ const { state } = view
249
+ const editorProps = getEditorProps(state)
250
+
251
+ const cleanup = () => {
252
+ if (dialog) {
253
+ dialog.remove()
254
+ dialog = null
255
+ }
256
+ // modals are rendered outside tools-panel (dialog) because of react-modal,
257
+ // so we need to remove them manually
258
+ //@TODO The implementation in the body editor is incorrect and needs to be fixed.
259
+ const modal = document.getElementById(KEYBOARD_SHORTCUTS_MODAL_ID)
260
+ if (modal) {
261
+ modal.remove()
262
+ }
263
+ // Restore editor focus at the existing selection after the dialog is torn down.
264
+ requestAnimationFrame(() => {
265
+ view.focus()
266
+ })
267
+ }
268
+
269
+ dialog = await createSubViewAsync(
270
+ editorProps,
271
+ KeyboardShortcutsModal,
272
+ {
273
+ editorProps,
274
+ isOpen: true,
275
+ onClose: cleanup,
276
+ },
277
+ state.doc,
278
+ () => -1,
279
+ view
280
+ )
281
+
282
+ document.body.appendChild(dialog)
283
+ }
@@ -0,0 +1,304 @@
1
+ /*!
2
+ * © 2025 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ type EditorShortcutRow = {
18
+ label: string
19
+ shortcut: { mac: string; pc: string }
20
+ }
21
+
22
+ type EditorShortcutSection = {
23
+ title: string
24
+ rows: EditorShortcutRow[]
25
+ }
26
+
27
+ type EditorShortcutTab = {
28
+ id: string
29
+ label: string
30
+ sections: EditorShortcutSection[]
31
+ }
32
+
33
+ export const EDITOR_KEYBOARD_SHORTCUT_TABS: EditorShortcutTab[] = [
34
+ {
35
+ id: 'text-editing',
36
+ label: 'Text editing',
37
+ sections: [
38
+ {
39
+ title: 'Formatting',
40
+ rows: [
41
+ {
42
+ label: 'Bold',
43
+ shortcut: { mac: 'CommandOrControl+B', pc: 'CommandOrControl+B' },
44
+ },
45
+ {
46
+ label: 'Italic',
47
+ shortcut: { mac: 'CommandOrControl+I', pc: 'CommandOrControl+I' },
48
+ },
49
+ {
50
+ label: 'Underline',
51
+ shortcut: { mac: 'CommandOrControl+U', pc: 'CommandOrControl+U' },
52
+ },
53
+ {
54
+ label: 'Strikethrough',
55
+ shortcut: {
56
+ mac: 'CommandOrControl+Shift+X',
57
+ pc: 'CommandOrControl+Shift+X',
58
+ },
59
+ },
60
+ {
61
+ label: 'Superscript',
62
+ shortcut: {
63
+ mac: 'Option+CommandOrControl+=',
64
+ pc: 'CommandOrControl+Option+=',
65
+ },
66
+ },
67
+ {
68
+ label: 'Subscript',
69
+ shortcut: {
70
+ mac: 'Option+CommandOrControl+-',
71
+ pc: 'CommandOrControl+Option+-',
72
+ },
73
+ },
74
+ ],
75
+ },
76
+ {
77
+ title: 'General',
78
+ rows: [
79
+ {
80
+ label: 'Select all',
81
+ shortcut: { mac: 'CommandOrControl+A', pc: 'CommandOrControl+A' },
82
+ },
83
+ {
84
+ label: 'Undo',
85
+ shortcut: { mac: 'CommandOrControl+Z', pc: 'CommandOrControl+Z' },
86
+ },
87
+ {
88
+ label: 'Redo',
89
+ shortcut: {
90
+ mac: 'Shift+CommandOrControl+Z',
91
+ pc: 'CommandOrControl+Y',
92
+ },
93
+ },
94
+ {
95
+ label: 'Activate search',
96
+ shortcut: {
97
+ mac: 'CommandOrControl+F',
98
+ pc: 'CommandOrControl+F',
99
+ },
100
+ },
101
+ {
102
+ label: 'Activate search/replace',
103
+ shortcut: {
104
+ mac: 'CommandOrControl+Shift+H',
105
+ pc: 'CommandOrControl+Shift+H',
106
+ },
107
+ },
108
+ ],
109
+ },
110
+ {
111
+ title: 'Enter',
112
+ rows: [
113
+ {
114
+ label: 'Insert line break',
115
+ shortcut: { mac: 'Shift+Enter', pc: 'Shift+Enter' },
116
+ },
117
+ {
118
+ label: 'Insert section',
119
+ shortcut: {
120
+ mac: 'CommandOrControl+Enter',
121
+ pc: 'CommandOrControl+Enter',
122
+ },
123
+ },
124
+ {
125
+ label: 'Insert sub section',
126
+ shortcut: {
127
+ mac: 'Shift+CommandOrControl+Enter',
128
+ pc: 'Shift+CommandOrControl+Enter',
129
+ },
130
+ },
131
+ ],
132
+ },
133
+ {
134
+ title: 'Lists',
135
+ rows: [
136
+ {
137
+ label: 'New list item',
138
+ shortcut: { mac: 'Enter', pc: 'Enter' },
139
+ },
140
+ {
141
+ label: 'Indent list item',
142
+ shortcut: { mac: 'CommandOrControl+]', pc: 'CommandOrControl+]' },
143
+ },
144
+ {
145
+ label: 'Outdent list item',
146
+ shortcut: { mac: 'CommandOrControl+[', pc: 'CommandOrControl+[' },
147
+ },
148
+ {
149
+ label: 'Ordered list',
150
+ shortcut: {
151
+ mac: 'CommandOrControl+Option+O',
152
+ pc: 'CommandOrControl+Option+O',
153
+ },
154
+ },
155
+ {
156
+ label: 'Bullet list',
157
+ shortcut: {
158
+ mac: 'CommandOrControl+Option+K',
159
+ pc: 'CommandOrControl+Option+K',
160
+ },
161
+ },
162
+ ],
163
+ },
164
+ ],
165
+ },
166
+ {
167
+ id: 'insert-elements',
168
+ label: 'Insert elements',
169
+ sections: [
170
+ {
171
+ title: 'Insert',
172
+ rows: [
173
+ {
174
+ label: 'Insert figure',
175
+ shortcut: {
176
+ mac: 'CommandOrControl + Option + P',
177
+ pc: 'CommandOrControl + Option + P',
178
+ },
179
+ },
180
+ {
181
+ label: 'Insert table',
182
+ shortcut: {
183
+ mac: 'CommandOrControl + Option + T',
184
+ pc: 'CommandOrControl + Option + T',
185
+ },
186
+ },
187
+ // not clear what this is for
188
+ // {
189
+ // label: 'Insert listing',
190
+ // shortcut: {
191
+ // mac: 'CommandOrControl + Option + L',
192
+ // pc: 'CommandOrControl + Option + L',
193
+ // },
194
+ // },
195
+ {
196
+ label: 'Insert equation block',
197
+ shortcut: {
198
+ mac: 'CommandOrControl + Option + E',
199
+ pc: 'CommandOrControl + Option + E',
200
+ },
201
+ },
202
+ {
203
+ label: 'Insert box',
204
+ shortcut: {
205
+ mac: 'CommandOrControl + Option + B',
206
+ pc: 'CommandOrControl + Option + B',
207
+ },
208
+ },
209
+ {
210
+ label: 'Insert link',
211
+ shortcut: {
212
+ mac: 'CommandOrControl + Option + H',
213
+ pc: 'CommandOrControl + Option + H',
214
+ },
215
+ },
216
+ {
217
+ label: 'Insert footnote',
218
+ shortcut: {
219
+ mac: 'CommandOrControl + Option + F',
220
+ pc: 'CommandOrControl + Option + F',
221
+ },
222
+ },
223
+ {
224
+ label: 'Insert citation',
225
+ shortcut: {
226
+ mac: 'CommandOrControl + Option + C',
227
+ pc: 'CommandOrControl + Option + C',
228
+ },
229
+ },
230
+ {
231
+ label: 'Insert cross-reference',
232
+ shortcut: {
233
+ mac: 'CommandOrControl + Option + R',
234
+ pc: 'CommandOrControl + Option + R',
235
+ },
236
+ },
237
+ {
238
+ label: 'Insert Inline equation',
239
+ shortcut: {
240
+ mac: 'Shift + CommandOrControl + Option + E',
241
+ pc: 'Shift + CommandOrControl + E',
242
+ },
243
+ },
244
+ ],
245
+ },
246
+ ],
247
+ },
248
+ {
249
+ id: 'navigation',
250
+ label: 'Navigation',
251
+ sections: [
252
+ {
253
+ title: 'Navigation',
254
+ rows: [
255
+ {
256
+ label: 'Next table cell / focus nearest element',
257
+ shortcut: { mac: 'Tab', pc: 'Tab' },
258
+ },
259
+ {
260
+ label: 'Previous table cell / focus nearest element back',
261
+ shortcut: { mac: 'Shift + Tab', pc: 'Shift + Tab' },
262
+ },
263
+ {
264
+ label: 'Exit editor to container',
265
+ shortcut: { mac: 'Escape', pc: 'Escape' },
266
+ },
267
+ ],
268
+ },
269
+ // {
270
+ // title: 'Others',
271
+ // rows: [
272
+ // {
273
+ // label: 'Move block up (joinUp) - join with sibling above it',
274
+ // shortcut: {
275
+ // mac: 'Option+ArrowUp',
276
+ // pc: 'Option+ArrowUp',
277
+ // },
278
+ // },
279
+ // {
280
+ // label: 'Move block down (joinDown) - join with sibling after it',
281
+ // shortcut: {
282
+ // mac: 'Option+ArrowDown',
283
+ // pc: 'Option+ArrowDown',
284
+ // },
285
+ // },
286
+ // {
287
+ // label: "Lift block out of it's parent",
288
+ // shortcut: {
289
+ // mac: 'CommandOrControl+[ ',
290
+ // pc: 'CommandOrControl+Option+K',
291
+ // },
292
+ // },
293
+ // {
294
+ // label: 'Wrap in Blockquote',
295
+ // shortcut: {
296
+ // mac: 'CommandOrControl+>',
297
+ // pc: 'CommandOrControl+>',
298
+ // },
299
+ // },
300
+ // ],
301
+ // },
302
+ ],
303
+ },
304
+ ]