@apollohg/react-native-rich-text-editor 2.0.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 (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,367 @@
1
+ import { validateAttributeSpec } from './attributeValidation';
2
+ import {
3
+ ATOM_HTML_DENIED_ATTRS,
4
+ ATOM_HTML_DENIED_TAGS,
5
+ ATOM_HTML_IDENTIFIER,
6
+ RESERVED_WIRE_NODE_TYPES,
7
+ } from './atomPolicy';
8
+ import {
9
+ type NodeSpec,
10
+ type AttrSpec,
11
+ type NodeJSONProjection,
12
+ type NodeHtmlRules,
13
+ type SchemaDefinition,
14
+ type MarkSpec,
15
+ ALLOWED_MARK_HTML_TAGS,
16
+ } from './schemaDefinition';
17
+ import { NativeEditorBoundaryError } from './NativeEditorBoundaryError';
18
+
19
+ export function schemaBoundaryError(limit: number, actual: number): NativeEditorBoundaryError {
20
+ return new NativeEditorBoundaryError(
21
+ 'SCHEMA_INVALID',
22
+ `schema work exceeds configured limit ${limit}`,
23
+ limit,
24
+ actual
25
+ );
26
+ }
27
+
28
+ /** Mirror native's invalid-schema fallback before constructing an empty doc. */
29
+ export function utf8ByteLengthUpTo(value: string, maximum: number): number {
30
+ let bytes = 0;
31
+ for (const char of value) {
32
+ const codePoint = char.codePointAt(0) ?? 0;
33
+ bytes += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;
34
+ if (bytes > maximum) return bytes;
35
+ }
36
+ return bytes;
37
+ }
38
+
39
+ export function forEachGroupToken(
40
+ group: string,
41
+ visit: (token: string) => void,
42
+ consumeCharacter?: () => boolean,
43
+ consumeToken?: () => boolean
44
+ ): boolean {
45
+ let tokenStart = -1;
46
+ for (let index = 0; index <= group.length; index += 1) {
47
+ if (index < group.length && consumeCharacter && !consumeCharacter()) return false;
48
+ const isBoundary = index === group.length || /\s/.test(group[index]);
49
+ if (!isBoundary && tokenStart < 0) tokenStart = index;
50
+ if (isBoundary && tokenStart >= 0) {
51
+ if (consumeToken && !consumeToken()) return false;
52
+ visit(group.slice(tokenStart, index));
53
+ tokenStart = -1;
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+
59
+ export interface SchemaWorkBudget {
60
+ readonly limit: number;
61
+ work: number;
62
+ exhausted: boolean;
63
+ }
64
+
65
+ export interface AdmittedSchemaCollections {
66
+ readonly groupsByNode: ReadonlyMap<NodeSpec, readonly string[]>;
67
+ readonly attrsByNode: ReadonlyMap<NodeSpec, ReadonlyArray<[string, AttrSpec]>>;
68
+ }
69
+
70
+ export function consumeSchemaWork(budget: SchemaWorkBudget): boolean {
71
+ return consumeSchemaWorkAmount(budget, 1);
72
+ }
73
+
74
+ export function consumeSchemaWorkAmount(budget: SchemaWorkBudget, amount: number): boolean {
75
+ if (amount > budget.limit - budget.work) {
76
+ budget.exhausted = true;
77
+ return false;
78
+ }
79
+ budget.work += amount;
80
+ return true;
81
+ }
82
+
83
+ export function consumeSchemaStringWork(budget: SchemaWorkBudget, value: string): boolean {
84
+ return consumeSchemaWorkAmount(budget, utf8ByteLengthUpTo(value, budget.limit) + 1);
85
+ }
86
+
87
+ export function collectOwnAttrs(
88
+ value: unknown,
89
+ budget: SchemaWorkBudget
90
+ ): Array<[string, AttrSpec]> | null {
91
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) return [];
92
+ const attrs: Array<[string, AttrSpec]> = [];
93
+ for (const name in value) {
94
+ if (!Object.prototype.hasOwnProperty.call(value, name)) continue;
95
+ if (!consumeSchemaWork(budget)) return attrs;
96
+ attrs.push([name, (value as Record<string, AttrSpec>)[name]]);
97
+ }
98
+ return attrs;
99
+ }
100
+
101
+ export function isSafeHtmlTag(tag: string): boolean {
102
+ if (tag.length === 0 || tag[0] < 'a' || tag[0] > 'z') return false;
103
+ for (let index = 1; index < tag.length; index += 1) {
104
+ const char = tag[index];
105
+ if (!((char >= 'a' && char <= 'z') || (char >= '0' && char <= '9') || char === '-')) {
106
+ return false;
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+
112
+ export function isSafeHtmlAttr(name: string): boolean {
113
+ if (name.length === 0) return false;
114
+ const isAlpha = (char: string): boolean =>
115
+ (char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z');
116
+ if (!(isAlpha(name[0]) || name[0] === '_' || name[0] === ':')) return false;
117
+ for (let index = 1; index < name.length; index += 1) {
118
+ const char = name[index];
119
+ if (
120
+ !(
121
+ isAlpha(char) ||
122
+ (char >= '0' && char <= '9') ||
123
+ char === '_' ||
124
+ char === ':' ||
125
+ char === '.' ||
126
+ char === '-'
127
+ )
128
+ ) {
129
+ return false;
130
+ }
131
+ }
132
+ return true;
133
+ }
134
+
135
+ export function normalizeAttrs(value: unknown): Record<string, AttrSpec> {
136
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) return {};
137
+ return Object.fromEntries(
138
+ Object.entries(value).map(([name, rawSpec]) => {
139
+ if (rawSpec == null || typeof rawSpec !== 'object' || Array.isArray(rawSpec)) {
140
+ return [name, {}];
141
+ }
142
+ validateAttributeSpec(rawSpec as AttrSpec, name);
143
+ return [
144
+ name,
145
+ Object.fromEntries(
146
+ Object.entries(rawSpec).filter(([, entry]) => entry !== undefined)
147
+ ),
148
+ ];
149
+ })
150
+ );
151
+ }
152
+
153
+ export function normalizeNodeJSONProjection(value: unknown): NodeJSONProjection | null | undefined {
154
+ if (value === undefined) return undefined;
155
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) return null;
156
+ const raw = value as Record<string, unknown>;
157
+ if (typeof raw.type !== 'string' || raw.type.length === 0) return null;
158
+ if (raw.attrs === undefined) return { type: raw.type };
159
+ if (raw.attrs == null || typeof raw.attrs !== 'object' || Array.isArray(raw.attrs)) return null;
160
+ const attrs: Record<string, unknown> = {};
161
+ for (const [name, attrValue] of Object.entries(raw.attrs)) {
162
+ if (!isSafeHtmlAttr(name)) return null;
163
+ if (
164
+ attrValue !== null &&
165
+ typeof attrValue !== 'string' &&
166
+ typeof attrValue !== 'boolean' &&
167
+ !(typeof attrValue === 'number' && Number.isFinite(attrValue))
168
+ ) {
169
+ return null;
170
+ }
171
+ attrs[name] = attrValue;
172
+ }
173
+ return Object.keys(attrs).length === 0 ? { type: raw.type } : { type: raw.type, attrs };
174
+ }
175
+
176
+ export function isSafeAtomHtmlTag(tag: string): boolean {
177
+ return ATOM_HTML_IDENTIFIER.test(tag) && !ATOM_HTML_DENIED_TAGS.has(tag);
178
+ }
179
+
180
+ export function isSafeAtomHtmlAttr(name: string): boolean {
181
+ return (
182
+ ATOM_HTML_IDENTIFIER.test(name) &&
183
+ !name.startsWith('on') &&
184
+ !ATOM_HTML_DENIED_ATTRS.has(name)
185
+ );
186
+ }
187
+
188
+ export function normalizeNodeHtmlRules(value: unknown): NodeHtmlRules | null | undefined {
189
+ if (value === undefined) return undefined;
190
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) return null;
191
+ const raw = value as Record<string, unknown>;
192
+ if (
193
+ Object.keys(raw).some(
194
+ (key) => key !== 'tag' && key !== 'staticAttrs' && key !== 'attrMap'
195
+ ) ||
196
+ typeof raw.tag !== 'string' ||
197
+ !isSafeAtomHtmlTag(raw.tag)
198
+ ) {
199
+ return null;
200
+ }
201
+ const normalizeMap = (
202
+ candidate: unknown,
203
+ validateName: (name: string) => boolean
204
+ ): Record<string, string> | null | undefined => {
205
+ if (candidate === undefined) return undefined;
206
+ if (candidate == null || typeof candidate !== 'object' || Array.isArray(candidate)) {
207
+ return null;
208
+ }
209
+ const normalized: Record<string, string> = {};
210
+ for (const [name, mapped] of Object.entries(candidate)) {
211
+ if (!validateName(name) || typeof mapped !== 'string') return null;
212
+ normalized[name] = mapped;
213
+ }
214
+ return normalized;
215
+ };
216
+ const staticAttrs = normalizeMap(raw.staticAttrs, isSafeAtomHtmlAttr);
217
+ const attrMap = normalizeMap(raw.attrMap, isSafeHtmlAttr);
218
+ if (
219
+ staticAttrs === null ||
220
+ attrMap === null ||
221
+ (attrMap != null && Object.values(attrMap).some((name) => !isSafeAtomHtmlAttr(name)))
222
+ ) {
223
+ return null;
224
+ }
225
+ return {
226
+ tag: raw.tag,
227
+ ...(staticAttrs == null ? {} : { staticAttrs }),
228
+ ...(attrMap == null ? {} : { attrMap }),
229
+ };
230
+ }
231
+
232
+ export function projectionAttrsOverlap(
233
+ left: Record<string, unknown>,
234
+ right: Record<string, unknown>
235
+ ): boolean {
236
+ return Object.entries(left).every(
237
+ ([name, value]) =>
238
+ !Object.prototype.hasOwnProperty.call(right, name) || right[name] === value
239
+ );
240
+ }
241
+
242
+ export function legacyHeadingProjectionName(projection: NodeJSONProjection): string | undefined {
243
+ if (projection.type !== 'heading') return undefined;
244
+ const value = projection.attrs?.level;
245
+ let level: number | undefined;
246
+ if (typeof value === 'number' && Number.isInteger(value)) {
247
+ level = value;
248
+ } else if (typeof value === 'string' && value.length <= 3 && /^\+?\d+$/.test(value)) {
249
+ level = Number(value);
250
+ }
251
+ return level != null && level >= 1 && level <= 6 ? `h${level}` : undefined;
252
+ }
253
+
254
+ export function normalizeSchemaDefinition(
255
+ schema: SchemaDefinition,
256
+ budget?: SchemaWorkBudget
257
+ ): SchemaDefinition | null {
258
+ const normalizeRole = (role: unknown): string => {
259
+ switch (role) {
260
+ case 'doc':
261
+ case 'textBlock':
262
+ case 'list':
263
+ case 'listItem':
264
+ case 'text':
265
+ case 'hardBreak':
266
+ case 'inline':
267
+ return role;
268
+ default:
269
+ return 'block';
270
+ }
271
+ };
272
+ const nodes: NodeSpec[] = [];
273
+ for (let nodeIndex = 0; nodeIndex < schema.nodes.length; nodeIndex += 1) {
274
+ const rawNode = schema.nodes[nodeIndex];
275
+ if (rawNode == null || typeof rawNode !== 'object' || typeof rawNode.name !== 'string') {
276
+ return null;
277
+ }
278
+ const raw = rawNode as unknown as Record<string, unknown>;
279
+ const htmlTag = typeof raw.htmlTag === 'string' ? raw.htmlTag : undefined;
280
+ const html = normalizeNodeHtmlRules(raw.html);
281
+ const attrs = normalizeAttrs(raw.attrs);
282
+ const json = normalizeNodeJSONProjection(raw.json);
283
+ if (
284
+ (htmlTag != null && !isSafeHtmlTag(htmlTag)) ||
285
+ html === null ||
286
+ json === null ||
287
+ Object.keys(attrs).some((name) => !isSafeHtmlAttr(name))
288
+ ) {
289
+ return null;
290
+ }
291
+ nodes.push({
292
+ name: rawNode.name,
293
+ content: typeof raw.content === 'string' ? raw.content : '',
294
+ ...(typeof raw.group === 'string' ? { group: raw.group } : {}),
295
+ ...(Object.keys(attrs).length > 0 ? { attrs } : {}),
296
+ role: normalizeRole(raw.role),
297
+ ...(htmlTag == null ? {} : { htmlTag }),
298
+ ...(html == null ? {} : { html }),
299
+ ...(json == null ? {} : { json }),
300
+ isVoid: typeof raw.isVoid === 'boolean' ? raw.isVoid : false,
301
+ ...(typeof raw.deletableOnBackspace === 'boolean'
302
+ ? { deletableOnBackspace: raw.deletableOnBackspace }
303
+ : {}),
304
+ ...(typeof raw.allowUndeclaredAttrs === 'boolean'
305
+ ? { allowUndeclaredAttrs: raw.allowUndeclaredAttrs }
306
+ : {}),
307
+ });
308
+ }
309
+ const nativeNodeNames = new Set(nodes.map((node) => node.name));
310
+ const projectedNodes = nodes.filter((node) => node.json != null);
311
+ for (let index = 0; index < projectedNodes.length; index += 1) {
312
+ const node = projectedNodes[index];
313
+ const projection = node.json as NodeJSONProjection;
314
+ const legacyHeadingName = legacyHeadingProjectionName(projection);
315
+ if (
316
+ nativeNodeNames.has(projection.type) ||
317
+ RESERVED_WIRE_NODE_TYPES.has(projection.type) ||
318
+ (legacyHeadingName != null &&
319
+ legacyHeadingName !== node.name &&
320
+ nativeNodeNames.has(legacyHeadingName)) ||
321
+ Object.keys(projection.attrs ?? {}).some((name) =>
322
+ Object.prototype.hasOwnProperty.call(node.attrs ?? {}, name)
323
+ )
324
+ ) {
325
+ return null;
326
+ }
327
+ for (let previousIndex = 0; previousIndex < index; previousIndex += 1) {
328
+ if (budget != null && !consumeSchemaWork(budget)) {
329
+ throw schemaBoundaryError(budget.limit, budget.limit + 1);
330
+ }
331
+ const previous = projectedNodes[previousIndex];
332
+ if (
333
+ previous.json?.type === projection.type &&
334
+ projectionAttrsOverlap(projection.attrs ?? {}, previous.json.attrs ?? {})
335
+ ) {
336
+ return null;
337
+ }
338
+ }
339
+ }
340
+
341
+ const marks: MarkSpec[] = [];
342
+ for (let markIndex = 0; markIndex < schema.marks.length; markIndex += 1) {
343
+ const rawMark = schema.marks[markIndex];
344
+ if (rawMark == null || typeof rawMark !== 'object' || typeof rawMark.name !== 'string') {
345
+ return null;
346
+ }
347
+ const raw = rawMark as unknown as Record<string, unknown>;
348
+ const htmlTag = typeof raw.htmlTag === 'string' ? raw.htmlTag.toLowerCase() : undefined;
349
+ const attrs = normalizeAttrs(raw.attrs);
350
+ if (
351
+ (htmlTag != null && !ALLOWED_MARK_HTML_TAGS.has(htmlTag)) ||
352
+ Object.keys(attrs).some((name) => !isSafeHtmlAttr(name))
353
+ ) {
354
+ return null;
355
+ }
356
+ marks.push({
357
+ name: rawMark.name,
358
+ ...(Object.keys(attrs).length > 0 ? { attrs } : {}),
359
+ ...(typeof raw.excludes === 'string' ? { excludes: raw.excludes } : {}),
360
+ ...(htmlTag == null ? {} : { htmlTag: htmlTag as MarkSpec['htmlTag'] }),
361
+ ...(typeof raw.allowUndeclaredAttrs === 'boolean'
362
+ ? { allowUndeclaredAttrs: raw.allowUndeclaredAttrs }
363
+ : {}),
364
+ });
365
+ }
366
+ return { nodes, marks };
367
+ }
@@ -0,0 +1,250 @@
1
+ import type { DocumentJSON } from './NativeEditorBridge';
2
+ import { type EditorResourceLimits } from './ResourceLimits';
3
+ import {
4
+ type SchemaDefinition,
5
+ type SchemaNodeSpec,
6
+ type NodeSpec,
7
+ defineSchema,
8
+ type SchemaSpec,
9
+ } from './schemaDefinition';
10
+
11
+ /** Attributes of the built-in image node. */
12
+ export interface ImageNodeAttributes {
13
+ /** Image source: an `https:` URL, or a `data:` URL when base64 images are allowed. */
14
+ src: string;
15
+ alt?: string | null;
16
+ title?: string | null;
17
+ /** Intrinsic width in layout units. Null lets the renderer choose. */
18
+ width?: number | null;
19
+ /** Intrinsic height in layout units. Null lets the renderer choose. */
20
+ height?: number | null;
21
+ }
22
+
23
+ /** A schema together with the facts derived from it. See {@link resolveDocumentDescriptor}. */
24
+ export interface ResolvedDocumentSchema {
25
+ /** The schema itself, defaulted to {@link defaultSchema} when none was supplied. */
26
+ schema: SchemaDefinition;
27
+ /** Name of the node with `role: 'doc'` — the `type` of a document's root. */
28
+ documentNodeName: string;
29
+ /** The smallest document this schema admits. Used by `clearContent()`. */
30
+ emptyDocument: DocumentJSON;
31
+ }
32
+
33
+ export type DocumentDescriptorLimits = Pick<
34
+ EditorResourceLimits,
35
+ 'maxSchemaNodes' | 'maxSchemaExpressionBytes' | 'maxDocumentNodes' | 'maxDocumentDepth'
36
+ >;
37
+
38
+ /** Node name the built-in image node is stored under. */
39
+ export const IMAGE_NODE_NAME = 'image';
40
+
41
+ export const HEADING_LEVELS = [1, 2, 3, 4, 5, 6] as const;
42
+
43
+ /**
44
+ * The built-in image node spec: a void block node carrying
45
+ * {@link ImageNodeAttributes}. Add it through {@link withImagesSchema}.
46
+ *
47
+ * @param name Node name to declare it under. Defaults to {@link IMAGE_NODE_NAME}.
48
+ */
49
+ export function imageSchemaNodeSpec(): SchemaNodeSpec {
50
+ return {
51
+ group: 'block',
52
+ attrs: {
53
+ src: {},
54
+ alt: { default: null },
55
+ title: { default: null },
56
+ width: { default: null },
57
+ height: { default: null },
58
+ },
59
+ role: 'block',
60
+ parseDOM: [{ tag: 'img' }],
61
+ toDOM: ['img'],
62
+ isVoid: true,
63
+ deletableOnBackspace: false,
64
+ };
65
+ }
66
+
67
+ export function imageNodeSpec(name: string = IMAGE_NODE_NAME): NodeSpec {
68
+ return defineSchema({ nodes: { [name]: imageSchemaNodeSpec() } }).nodes[0]!;
69
+ }
70
+
71
+ /**
72
+ * Return `schema` with the image node added, or `schema` unchanged when it
73
+ * already declares one. {@link tiptapCompatibleSchema} already includes it.
74
+ */
75
+ export function withImagesSchema(schema: SchemaDefinition): SchemaDefinition {
76
+ const hasImageNode = schema.nodes.some((node) => node.name === IMAGE_NODE_NAME);
77
+ if (hasImageNode) {
78
+ return schema;
79
+ }
80
+
81
+ return {
82
+ ...schema,
83
+ nodes: [...schema.nodes, imageNodeSpec()],
84
+ };
85
+ }
86
+
87
+ /**
88
+ * Wrap inline or block nodes in a document root, producing a fragment ready
89
+ * for `insertContentJson`.
90
+ *
91
+ * @param descriptor Document node name to wrap in. Defaults to `doc`; pass a
92
+ * {@link ResolvedDocumentSchema} when the schema names its root differently.
93
+ */
94
+ export function buildDocumentFragmentJson(
95
+ content: DocumentJSON[],
96
+ descriptor: Pick<ResolvedDocumentSchema, 'documentNodeName'> = {
97
+ documentNodeName: 'doc',
98
+ }
99
+ ): DocumentJSON {
100
+ return { type: descriptor.documentNodeName, content };
101
+ }
102
+
103
+ /**
104
+ * Build a document fragment holding one image node, ready for
105
+ * `insertContentJson`. `RichTextEditorRef.insertImage` does this for
106
+ * you; use this when assembling a larger insertion by hand.
107
+ */
108
+ export function buildImageFragmentJson(
109
+ attrs: ImageNodeAttributes,
110
+ descriptor?: Pick<ResolvedDocumentSchema, 'documentNodeName'>
111
+ ): DocumentJSON {
112
+ return buildDocumentFragmentJson(
113
+ [
114
+ {
115
+ type: IMAGE_NODE_NAME,
116
+ attrs,
117
+ },
118
+ ],
119
+ descriptor
120
+ );
121
+ }
122
+
123
+ /**
124
+ * Keyed authoring definition for the Tiptap-compatible camelCase schema.
125
+ */
126
+ export const tiptapCompatibleSchemaSpec: SchemaSpec = {
127
+ nodes: {
128
+ doc: { content: 'block+', role: 'doc' },
129
+ paragraph: {
130
+ content: 'inline*',
131
+ group: 'block',
132
+ role: 'textBlock',
133
+ parseDOM: [{ tag: 'p' }],
134
+ toDOM: ['p', 0],
135
+ },
136
+ heading: {
137
+ content: 'inline*',
138
+ group: 'block',
139
+ role: 'heading',
140
+ attrs: { level: { default: 1 } },
141
+ parseDOM: HEADING_LEVELS.map((level) => ({
142
+ tag: `h${level}`,
143
+ attrs: { level },
144
+ })),
145
+ toDOM: {
146
+ switchOn: 'level',
147
+ cases: Object.fromEntries(
148
+ HEADING_LEVELS.map((level) => [level, [`h${level}`, 0] as const])
149
+ ),
150
+ },
151
+ },
152
+ blockquote: {
153
+ content: 'block+',
154
+ group: 'block',
155
+ role: 'block',
156
+ parseDOM: [{ tag: 'blockquote' }],
157
+ toDOM: ['blockquote', 0],
158
+ },
159
+ codeBlock: {
160
+ attrs: { language: { default: null } },
161
+ content: 'text*',
162
+ group: 'block',
163
+ role: 'textBlock',
164
+ parseDOM: [{ tag: 'pre' }],
165
+ toDOM: ['pre', 0],
166
+ },
167
+ bulletList: {
168
+ content: 'listItem+',
169
+ group: 'block',
170
+ role: 'list',
171
+ parseDOM: [{ tag: 'ul' }],
172
+ toDOM: ['ul', 0],
173
+ },
174
+ orderedList: {
175
+ content: 'listItem+',
176
+ group: 'block',
177
+ attrs: { start: { default: 1 } },
178
+ role: 'list',
179
+ parseDOM: [{ tag: 'ol' }],
180
+ toDOM: ['ol', 0],
181
+ },
182
+ listItem: {
183
+ content: 'paragraph block*',
184
+ role: 'listItem',
185
+ parseDOM: [{ tag: 'li' }],
186
+ toDOM: ['li', 0],
187
+ },
188
+ hardBreak: {
189
+ group: 'inline',
190
+ role: 'hardBreak',
191
+ parseDOM: [{ tag: 'br' }],
192
+ toDOM: ['br'],
193
+ isVoid: true,
194
+ },
195
+ horizontalRule: {
196
+ group: 'block',
197
+ role: 'block',
198
+ parseDOM: [{ tag: 'hr' }],
199
+ toDOM: ['hr'],
200
+ isVoid: true,
201
+ },
202
+ [IMAGE_NODE_NAME]: imageSchemaNodeSpec(),
203
+ text: { group: 'inline', role: 'text' },
204
+ },
205
+ marks: {
206
+ bold: { parseDOM: [{ tag: 'strong' }], toDOM: ['strong', 0] },
207
+ italic: { parseDOM: [{ tag: 'em' }], toDOM: ['em', 0] },
208
+ underline: { parseDOM: [{ tag: 'u' }], toDOM: ['u', 0] },
209
+ strike: { parseDOM: [{ tag: 's' }], toDOM: ['s', 0] },
210
+ code: { parseDOM: [{ tag: 'code' }], toDOM: ['code', 0] },
211
+ link: { attrs: { href: {} }, parseDOM: [{ tag: 'a' }], toDOM: ['a', 0] },
212
+ },
213
+ };
214
+
215
+ /** Tiptap-compatible serializable schema using camelCase node names. */
216
+ export const tiptapCompatibleSchema: SchemaDefinition = defineSchema(tiptapCompatibleSchemaSpec);
217
+
218
+ /** Keyed authoring definition using ProseMirror names, including upstream `codeBlock`. */
219
+ export const prosemirrorSchemaSpec: SchemaSpec = {
220
+ nodes: {
221
+ doc: tiptapCompatibleSchemaSpec.nodes.doc,
222
+ paragraph: tiptapCompatibleSchemaSpec.nodes.paragraph,
223
+ heading: tiptapCompatibleSchemaSpec.nodes.heading,
224
+ blockquote: tiptapCompatibleSchemaSpec.nodes.blockquote,
225
+ codeBlock: tiptapCompatibleSchemaSpec.nodes.codeBlock,
226
+ bullet_list: {
227
+ ...tiptapCompatibleSchemaSpec.nodes.bulletList,
228
+ content: 'list_item+',
229
+ },
230
+ ordered_list: {
231
+ ...tiptapCompatibleSchemaSpec.nodes.orderedList,
232
+ content: 'list_item+',
233
+ },
234
+ list_item: tiptapCompatibleSchemaSpec.nodes.listItem,
235
+ hard_break: tiptapCompatibleSchemaSpec.nodes.hardBreak,
236
+ horizontal_rule: tiptapCompatibleSchemaSpec.nodes.horizontalRule,
237
+ [IMAGE_NODE_NAME]: tiptapCompatibleSchemaSpec.nodes[IMAGE_NODE_NAME],
238
+ text: tiptapCompatibleSchemaSpec.nodes.text,
239
+ },
240
+ marks: tiptapCompatibleSchemaSpec.marks,
241
+ };
242
+
243
+ /** ProseMirror-compatible serializable schema, including upstream `codeBlock`. */
244
+ export const prosemirrorSchema: SchemaDefinition = defineSchema(prosemirrorSchemaSpec);
245
+
246
+ /** Keyed authoring definition used when callers do not provide a schema. */
247
+ export const defaultSchemaSpec: SchemaSpec = prosemirrorSchemaSpec;
248
+
249
+ /** Schema used when callers do not provide one. */
250
+ export const defaultSchema: SchemaDefinition = prosemirrorSchema;