1.1.0 (2026-10-19)
Features
- add shared wire protocol, boot config and core contracts (f12d132), closes #318 #343 #322 #227 #3305
- add the custom keyboard state machine and drivers (b4f40bc)
- add the exampleoldarch app and the web E2E workspace (54a932d), closes #318 #205
- add the native EditorController (10ca920), closes #343 #322 #227 #299 #318 #69 #346
- add the process-wide keyboard store behind useKeyboard (cfdbe93)
- add the TenTapKeyboard Android module in Java (70e03bc), closes #50 #350
- back useEditorBridge with the EditorController (5e347c1), closes #51 #206
- confirm keyboard state with the native module and re-show the IME on Android (805afe8)
- example-expo: add the Expo SDK 57 example app (a043d05)
- example-expo: give the example app a themed look with light and dark mode (9f2239a)
- example: add the RN 0.81 example app (274e2f9)
- export the custom keyboard and 1.1 additions from the root entry (5a54bdd)
- ios: add the TenTapKeyboard native module and modernise the podspec (46bab45), closes #302 #285
- rebuild RichText on the editor controller (1e63234), closes #343 #322 #342 #205 #323 #308 #336 #299 #321
- restore CustomKeyboard, ColorKeyboard and the keyboard API (5071991), closes #51 #285 #302 #50
- restore the color keyboard theme (c972aab), closes #285 #239
- route core bridge commands through BridgeContext (d7bd741), closes #309 #62 #338 #327 #339
- toolbar: export HEADING_ITEMS and ToolbarContext, generate heading items (99e1f3e), closes #295 #296
- toolbar: label the toolbar buttons for accessibility (aba1e14)
- web: add the web runtime (c930acb), closes #343 #322 #227 react-native-webview#3305 #318 #339
- web: rebuild useTenTap on the runtime (24be9f6), closes #343 #322 #309 #327 #289 #323 #336 #342 #309
Bug Fixes
- add a protocol to links typed without one (efc9e7f), closes #255
- android: give the editor its focus back after a collapsed layout (9ec869e)
- android: give the editor its focus back when a key would move it (1550357)
- android: keep a bottom-anchored editor still while keyboards swap (7270cfa)
- android: keep a custom keyboard open through a rotation (cc62e98)
- android: keep the editor still when the system keyboard replaces a custom one (3f0031c)
- android: keep the keyboard up after inserting a link (2d52cb4)
- android: keep the loading WebView laid out so its accessibility nodes get bounds (bdf2c5d)
- android: keep the toolbar and keyboard area steady while keyboards swap (ded07f7)
- android: read newArchEnabled from the library project so React Native 0.82+ builds codegen (94df839)
- android: refocus the autofocus input when it kept focus without the IME (101f15e)
- android: report an IME that opens before its insets have a height (5475c94)
- android: show the IME again when autofocus could not bring it up (2b3226f)
- android: show the keyboard when the editor is focused and it stays down (dc7efea)
- android: stop scripting a WebView whose renderer is gone (bea6a67)
- blur before dropping the latch when dismissing an unfocused open (f448e58)
- content: ignore fetched content that predates a later setContent (a458800)
- content: keep useEditorContent current with legacy bundles (dceab95)
- core: parse inline-only HTML in setContent with preserveWhitespace full (17176d4)
- core: separate selected blocks with one newline inside lists and quotes (e55529e)
- deps: install @tiptap/react, react-dom and the other 1.0 dependencies again (9f189b8)
- deps: make @tiptap/react an optional peer dependency (53b9b67)
- deps: restore the 1.0.1 react-dom range (f69d73a)
- drop scripts sent to a disposed controller without warning (80eb2b3)
- dynamic-height: detect a clamp at a height native already reached (82f5e96)
- dynamic-height: do not replay an older page's switch onto a new page (1ce28b1)
- dynamic-height: inject the corrected stylesheet into custom bundles built against 1.0 (b7a240c)
- dynamic-height: keep the document of a 1.0 bundle when dynamicHeight changes (ceb222f)
- dynamic-height: keep the editor visible inside a capped parent (479c8a3)
- dynamic-height: pad by scrollBottomOffset in dynamic-height mode (9a51dae)
- dynamic-height: reset flex so a capped editor lays out on Fabric (9d9243f)
- dynamic-height: switch dynamicHeight without reloading the WebView (88a1f16)
- editor: add the array methods older Android WebViews lack (e794315)
- editor: boot the default editor through the web runtime (f9ecda0), closes #336 #342
- editor: keep the first block's margin inside the editor (8d0f1dd)
- editor: keep the selection through a collapsed layout (9bb7130)
- editor: leave empty unset until the page reports its first state, as 1.0 did (4e13ec1)
- editor: let 1.0 code assign editor option and state fields (6eca826)
- editor: let useScrollToCaret follow a capped dynamic-height editor (689a097)
- editor: re-render RichText and Toolbar under memoized parents when options change (00613cc)
- editor: set EditorHelper.editorLastInstance while the editor renders (9c44a0e)
- example-expo: keep the toolbar and custom keyboard above the keyboard (cba9d85)
- example: give the modal keyboard example its own safe area provider (d7534e3)
- example: keep keyboard screens clear of the landscape sensor housing (cb78b8f)
- example: keep the overlay keyboard example toolbar at its own height (19cc80b)
- example: leave the caret room on the Dynamic height and NavigationHeader screens (a175109)
- example: leave the editor room in short landscape windows (22200e4)
- example: let editor taps through the compose toolbar's keyboard padding (246476a)
- example: pin react-dom to the example's React for the Advanced web bundle (e427881)
- example: report words and characters under the right CounterBridge keys (2244e8c)
- hooks: let useBridgeState follow subscription states like 1.0 (80e3748)
- import the selection highlight extension from @tiptap/core (06eec77), closes #67
- ios: keep recovering an editor whose renderers keep crashing (2ebb75d)
- keep hard breaks in getSelectedText (7c5239a), closes #338
- keep the caret below an image inserted at the end (cfcc42f), closes #273 #291
- keep the keyboard module importable on react-native-web (1d49c5b)
- keep the new workspaces out of the library declaration build (6318d45)
- keep the web editor ready across react-native-web-webview renders (ccf0881)
- keyboard: apply 'stable' mode on the next open when the window lacked focus (f94a7af)
- keyboard: bring the system keyboard back when suppression verification fails (e68990f)
- keyboard: count a 'stable' host once across a StrictMode re-attach (519b029)
- keyboard: cover the navigation bar on edge-to-edge Android (06e812e)
- keyboard: fall back for one open when the editor was not focused yet (87aa6ee)
- keyboard: give a keyboard without a height the system height when switching to it (407ae97)
- keyboard: give an event-only suppression check time for a slow IME hide (8b351ea)
- keyboard: keep Android's stable window mode until the last host detaches (8587352)
- keyboard: keep the overlay keyboard inside its host view (339242e)
- keyboard: keep the toolbar on the keyboard and the caret above the toolbar (2d3f664)
- keyboard: keep the toolbar on the keyboard on edge-to-edge Android (39ec161)
- keyboard: let a bare CustomKeyboardExtension hold ColorKeyboard again (44df459)
- keyboard: let ColorKeyboard buttons shrink on narrow screens (b09f74a)
- keyboard: place an overlay keyboard in window coordinates after a rotation (56b9ca5)
- keyboard: place the toolbar on the keyboard from measured geometry (66cccab)
- keyboard: prefix custom keyboard warnings with [TenTap] like the rest of the library (3c0b0f1)
- keyboard: read the Android status bar height from the window insets (c58faf4)
- keyboard: read the navigation bar inset again on every open (98e2012)
- keyboard: release only the iOS suppression a host made itself (aba4a23)
- keyboard: reset the bottom insets when scrollBottomOffset is unset (2df7c00)
- keyboard: reset the system keyboard state when listening resumes (f491ae7)
- keyboard: resize an open custom keyboard when the window rotates (09361ad)
- keyboard: retry the native driver after one focus failure with the editor focused (81a6a6d)
- keyboard: skip the fallback suppression after the transition ended (fe95088)
- let RichText accept spread copies of the editor (b295a6c)
- let RN 0.74-0.76 autolinking detect the Android package (af6e7de)
- link: honor an explicit http defaultProtocol (2e75b40)
- link: keep TipTap's autolink protocol and record a configured one (b881cdd)
- link: turn a bare email address into a mailto link (2441fcf)
- load every bridge's type augmentation with EditorBridge (#290) (e0b13af)
- make setPlaceholder update the placeholder on tiptap 3 (11742a7)
- native: do not replay commands after a late 1.1 handshake (648e3e4)
- native: hold capability-gated RPCs until the bundle is known (95ab636)
- native: keep a ready page when the WebView ref detaches and comes back (d17dcea)
- native: keep RPC timeouts running after the editor unmounts (21a6d44)
- native: replay content after a reload without firing onChange (860eca0)
- native: resolve deprecated asyncMessages requests from core replies (ccf6bcb)
- package: declare the React Native 0.74 floor as a peer range (5f30e5f)
- package: drop react-dom from runtime dependencies (992f30d), closes #315
- package: emit only declarations into lib-web/typescript (20d5fc7)
- package: keep the react-native peer dependency at * (2edf594)
- package: leave the editor build input and empty .d.js files out of the tarball (0763f4a)
- package: publish the Node 18 engines range again (3eb149e)
- queue CoreBridge injectJS until the editor is ready (87ddbf6)
- replay the outbox when the handshake arrives after the ready fallback (1b5729b)
- resolve the advanced example's web editor build against local lib-web (93059d7), closes #334
- restore inputmode on the previously suppressed WebView when another is suppressed (77194d7)
- RichText: replace a recovered WebView again when it never becomes ready (c6b56cb)
- RichText: restore the latest edits after a renderer crash (2164add)
- route WebView messages and load events to the editor controller (db046ef)
- skip autofocus and editable commands when CoreBridge is absent (c29637a)
- start injected stylesheet and boot scripts with a semicolon (dfc006a)
- theme: type the resolved themes with a colorKeyboard (5ef9de5)
- toolbar: apply an Android link to the selection held when the link bar opened (37eac2c)
- toolbar: close the link bar when the keyboard is dismissed and honor hidden (ef44c9d)
- toolbar: link the range selected while the Android link bar is open (51dba01)
- toolbar: remount per context, add headingItems and keep the link bar open (b13a2d6), closes #298 #295 #252 #239 #173
- track applied keyboard insets per editor controller (bf7fdbf)
- types: accept 1.0-style configureTiptapExtensionsOnRunTime overrides (ea95b8e)
- types: declare editorHtml in the root entry (7143f6b)
- types: keep React Native codegen types out of the root declarations (ceee75b)
- web: apply the dynamic-height stylesheet without !important so app CSS can size the editor (7c4b186)
- web: count the first and last block margins in the dynamic height (e9c38b9)
- web: keep a custom keyboard open when the editor blurs (29533a6)
- web: keep another editor's messages out of a custom onMessage (d86d990)
- web: keep stored marks off a composition the Android keyboard starts on its own (e92e9b4)
- web: keep suppressing scroll for the first new line after a pause (6247348), closes #236 #244
- web: keep the caret visible when the keyboard grows (3aa5afd)
- web: keep the editor's text in place when a keyboard closes (c556660)
- web: keep the toolbar in its row and the editor focused (cd84ecc)
- web: publish focus only when the document focus actually changes (368400b)
- web: run web-only bridges that have no TipTap extension (48c668d)
- web: skip the react-native-webview version lookup on web (b876103)
- web: stop touching the DOM when focusListener is imported (887142a)
- whitelist HistoryBridge under its 0.7.x name for legacy bundles (c92a1f0)